<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3A%D0%A0%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B</id>
	<title>Модуль:Родственные проекты - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3A%D0%A0%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%A0%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B&amp;action=history"/>
	<updated>2026-05-06T00:26:58Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%A0%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B&amp;diff=7534&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «local p = {};  -- Configuration data local config = require( 'Module:Родственные_проекты/config' );  -- Modules  local getArgs = require( 'Modul...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%A0%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B&amp;diff=7534&amp;oldid=prev"/>
		<updated>2022-03-20T15:13:36Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local p = {};  -- Configuration data local config = require( &amp;#039;Module:Родственные_проекты/config&amp;#039; );  -- Modules  local getArgs = require( &amp;#039;Modul...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {};&lt;br /&gt;
&lt;br /&gt;
-- Configuration data&lt;br /&gt;
local config = require( 'Module:Родственные_проекты/config' );&lt;br /&gt;
&lt;br /&gt;
-- Modules &lt;br /&gt;
local getArgs = require( 'Module:Arguments' ).getArgs;&lt;br /&gt;
local errorMsg = require( 'Module:Error' ).error;&lt;br /&gt;
local yesno = require( 'Module:Yesno' );&lt;br /&gt;
&lt;br /&gt;
-- Variables&lt;br /&gt;
local modules = {};&lt;br /&gt;
&lt;br /&gt;
-- Helpers&lt;br /&gt;
local function formatProject( frame, item )&lt;br /&gt;
	local out = '';&lt;br /&gt;
	local context = frame;&lt;br /&gt;
&lt;br /&gt;
	if item['module'] ~= nil and item['function'] ~= nil then&lt;br /&gt;
		if modules[item['module']] == nil then&lt;br /&gt;
			modules[item['module']] = require( 'Module:' .. item['module'] );&lt;br /&gt;
		end&lt;br /&gt;
		if item['args'] ~= nil then&lt;br /&gt;
			context.args = item['args'];&lt;br /&gt;
		end&lt;br /&gt;
		item.wikiValue = modules[item['module']][item['function']]( context );&lt;br /&gt;
		-- add wiki prefix&lt;br /&gt;
		if item.wikiValue ~= nil and item.wikiValue ~= '' and item.wikiPrefix ~= nil and item.wikiPrefix ~= '' then&lt;br /&gt;
			item.wikiValue = item.wikiPrefix.. ':' .. item.wikiValue;&lt;br /&gt;
		end&lt;br /&gt;
		-- override value if local value does not exist&lt;br /&gt;
		if item.value == nil or item.value == '' then&lt;br /&gt;
			item.value = item.wikiValue;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if item.value ~= nil and item.value ~= '' then&lt;br /&gt;
		-- replace variables&lt;br /&gt;
		if item.title ~= nil and item.title ~= '' then&lt;br /&gt;
			item.title = string.gsub( item.title, '%$1', item.value );&lt;br /&gt;
		end&lt;br /&gt;
		-- format prefix&lt;br /&gt;
		if string.find( item.value, '^' .. item.prefix .. ':' ) ~= nil then&lt;br /&gt;
			item.prefixFormatted = '';&lt;br /&gt;
		else&lt;br /&gt;
			item.prefixFormatted = item.prefix .. ':';&lt;br /&gt;
		end&lt;br /&gt;
		-- format image&lt;br /&gt;
		if item.imageTemplate ~= nil and item.imageTemplate ~= '' then&lt;br /&gt;
			item.imageFormatted = frame:expandTemplate{ title = item.imageTemplate, args = { item.value, size = config.params.itemImageSize } };&lt;br /&gt;
		elseif item.image ~= nil and item.image ~= '' then&lt;br /&gt;
			item.imageFormatted = '[[File:' .. item.image .. '|link=|alt=|' .. config.params.itemImageSize .. 'px]]';&lt;br /&gt;
		end&lt;br /&gt;
		-- format wikilink&lt;br /&gt;
		out = out .. '[[' .. item.prefixFormatted .. item.value .. '|' .. item.title .. ']]';&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParamsList( frame, args, list )&lt;br /&gt;
	local result = {};&lt;br /&gt;
	&lt;br /&gt;
	for i, item in ipairs( list ) do&lt;br /&gt;
		local value = args[item.id];&lt;br /&gt;
		if value == nil or value ~= '-' then&lt;br /&gt;
			item.localValue = value;&lt;br /&gt;
			item.value = value;&lt;br /&gt;
			item.formatted = formatProject( frame, item );&lt;br /&gt;
			if item.formatted ~= '' then&lt;br /&gt;
				table.insert( result, item );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Renders&lt;br /&gt;
local function renderProjects( frame, list )&lt;br /&gt;
	local res = mw.html.create();&lt;br /&gt;
	&lt;br /&gt;
	for i, item in ipairs( list ) do&lt;br /&gt;
		-- wrapper&lt;br /&gt;
		local li = res:tag( 'li' )&lt;br /&gt;
			:addClass( config.params.tsClass .. '-item' );&lt;br /&gt;
		-- class&lt;br /&gt;
		local class = '';&lt;br /&gt;
		if item.name == 'project' or item.name == 'portal' then&lt;br /&gt;
			class = item.name .. '-box';&lt;br /&gt;
		else&lt;br /&gt;
			class = item.name .. '-ref';&lt;br /&gt;
		end&lt;br /&gt;
		-- image&lt;br /&gt;
		if item.imageFormatted ~= nil and item.imageFormatted ~= '' then&lt;br /&gt;
			li:tag( 'span' )&lt;br /&gt;
				:addClass( config.params.tsClass .. '-image' )&lt;br /&gt;
				:wikitext( item.imageFormatted );&lt;br /&gt;
		end&lt;br /&gt;
		-- formatted value&lt;br /&gt;
		li:tag( 'span' )&lt;br /&gt;
			:addClass( config.params.tsClass .. '-label' )&lt;br /&gt;
			:addClass( class )&lt;br /&gt;
			:wikitext( item.formatted );&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return res;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render( frame, title, interprojects, otherprojects )&lt;br /&gt;
	local templateStyles = frame:extensionTag{ name = 'templatestyles', args = { src = config.params.templateStyles } };&lt;br /&gt;
	local interprojectsFormatted = renderProjects( frame, interprojects );&lt;br /&gt;
	local otherprojectsFormatted = renderProjects( frame, otherprojects );&lt;br /&gt;
	-- wrapper&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
		:wikitext( templateStyles );&lt;br /&gt;
	local body = res:tag( 'div' )&lt;br /&gt;
		:addClass( config.params.tsClass )&lt;br /&gt;
		:addClass( config.params.bodyClass )&lt;br /&gt;
		:attr( 'role', 'navigation' );&lt;br /&gt;
	-- render title&lt;br /&gt;
	if table.getn( interprojects ) &amp;gt; 1  and ( title == nil or title == '' ) then&lt;br /&gt;
		title = config.title['default'];&lt;br /&gt;
	end&lt;br /&gt;
	if title ~= nil and title ~= '' then&lt;br /&gt;
		body:attr( 'aria-labelledby', mw.uri.anchorEncode( title ) );&lt;br /&gt;
		body:tag( 'div' )&lt;br /&gt;
			:addClass( config.params.tsClass .. '-header' )&lt;br /&gt;
			:attr( 'id', mw.uri.anchorEncode( title ) )&lt;br /&gt;
			:wikitext( &amp;quot;'''&amp;quot; .. title .. &amp;quot;'''&amp;quot; );&lt;br /&gt;
	else&lt;br /&gt;
		body:attr( 'aria-label', config.title['default'] );&lt;br /&gt;
	end&lt;br /&gt;
	-- render inter projects&lt;br /&gt;
	if table.getn( interprojects ) &amp;gt; 0 then&lt;br /&gt;
		body:tag( 'ul' )&lt;br /&gt;
			:node( interprojectsFormatted );&lt;br /&gt;
	end&lt;br /&gt;
	-- render separator&lt;br /&gt;
	if table.getn( interprojects ) &amp;gt; 0 and table.getn( otherprojects ) &amp;gt; 0 then&lt;br /&gt;
		body:tag( 'hr' );&lt;br /&gt;
	end&lt;br /&gt;
	-- render other projects&lt;br /&gt;
	if table.getn( otherprojects ) &amp;gt; 0 then&lt;br /&gt;
		body:tag( 'ul' )&lt;br /&gt;
			:node( otherprojectsFormatted );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return res;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Categories&lt;br /&gt;
local function formatCategory( value )&lt;br /&gt;
	return '[[Category:' .. value .. ']]';&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatCategories( frame, list )&lt;br /&gt;
	local categories = {};&lt;br /&gt;
	&lt;br /&gt;
	for i, item in ipairs( list ) do&lt;br /&gt;
		local categoryItem = config.categories[ item.name ];&lt;br /&gt;
		if categoryItem ~= nil then&lt;br /&gt;
			if categoryItem['local'] ~= nil and item.localValue ~= nil and item.localValue ~= '' then&lt;br /&gt;
				local category = formatCategory( categoryItem['local'] )&lt;br /&gt;
				table.insert( categories, category );&lt;br /&gt;
			elseif categoryItem['default'] ~= nil then&lt;br /&gt;
				local category = formatCategory( categoryItem['default'] )&lt;br /&gt;
				table.insert( categories, category );&lt;br /&gt;
			end&lt;br /&gt;
			-- when local value is equal to wikidata&lt;br /&gt;
			if categoryItem['equal'] ~= nil &lt;br /&gt;
				and item.localValue ~= nil and item.localValue ~= '' &lt;br /&gt;
				and item.wikiValue ~= nil and item.wikiValue ~= ''&lt;br /&gt;
				and item.localValue == item.wikiValue&lt;br /&gt;
			then&lt;br /&gt;
				local category = formatCategory( categoryItem['equal'] )&lt;br /&gt;
				table.insert( categories, category );&lt;br /&gt;
			end&lt;br /&gt;
			-- when local value is not equal to wikidata&lt;br /&gt;
			if categoryItem['not-equal'] ~= nil &lt;br /&gt;
				and item.localValue ~= nil and item.localValue ~= '' &lt;br /&gt;
				and item.wikiValue ~= nil and item.wikiValue ~= ''&lt;br /&gt;
				and item.localValue ~= item.wikiValue&lt;br /&gt;
			then&lt;br /&gt;
				local category = formatCategory( categoryItem['not-equal'] )&lt;br /&gt;
				table.insert( categories, category );&lt;br /&gt;
			end&lt;br /&gt;
			-- category for non existing pages&lt;br /&gt;
			if categoryItem['not-exists'] ~= nil then&lt;br /&gt;
				local page = mw.title.new( item.value, item.prefix );&lt;br /&gt;
				if not page.exists then&lt;br /&gt;
					local category = formatCategory( categoryItem['not-exists'] )&lt;br /&gt;
					table.insert( categories, category );&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat( categories );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCategories( frame, interprojects, otherprojects )&lt;br /&gt;
	-- wrapper&lt;br /&gt;
	local res = mw.html.create();&lt;br /&gt;
	-- format iterprojects categories&lt;br /&gt;
	local interprojectsCategories = formatCategories( frame, interprojects );&lt;br /&gt;
	res:wikitext( interprojectsCategories );&lt;br /&gt;
	-- format otherprojects categories&lt;br /&gt;
	local otherprojectsCategories = formatCategories( frame, otherprojects );&lt;br /&gt;
	res:wikitext( otherprojectsCategories );&lt;br /&gt;
	-- service categories&lt;br /&gt;
	if next( interprojects ) == nil and next( otherprojects ) == nil then&lt;br /&gt;
		local category = formatCategory( config.categories['empty'] );&lt;br /&gt;
		res:wikitext( category );&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return res;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Preview&lt;br /&gt;
local function renderPreview( frame )&lt;br /&gt;
	local res = mw.html.create();&lt;br /&gt;
	if config.preview ~= nil and config.preview['empty'] ~= nil and config.preview['empty'] ~= '' then&lt;br /&gt;
		local message = errorMsg( {&lt;br /&gt;
			tag = 'p',&lt;br /&gt;
			message = config.preview['empty']&lt;br /&gt;
		} );&lt;br /&gt;
		res:wikitext( message );&lt;br /&gt;
	end&lt;br /&gt;
	return res;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
-- Main&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
	local args = getArgs( frame, { wrappers = config.params.wrappers } );&lt;br /&gt;
	local nocat = yesno( args['nocat'] );&lt;br /&gt;
	-- title parameter&lt;br /&gt;
	local title = '';&lt;br /&gt;
	for i, item in ipairs( config.title.id ) do&lt;br /&gt;
		if args[item] ~= nil and args[item] ~= '' then&lt;br /&gt;
			title = args[item];&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if title ~= nil and title ~= '' then&lt;br /&gt;
		title = title .. ':'&lt;br /&gt;
	end&lt;br /&gt;
	-- get parameters list&lt;br /&gt;
	local interprojects = getParamsList( frame, args, config['interprojects'] );&lt;br /&gt;
	local otherprojects = getParamsList( frame, args, config['otherprojects'] );&lt;br /&gt;
	-- wrapper&lt;br /&gt;
	local res = mw.html.create();&lt;br /&gt;
	-- render body&lt;br /&gt;
	if next( interprojects ) ~= nil or next( otherprojects ) ~= nil then&lt;br /&gt;
		local body = render( frame, title, interprojects, otherprojects );&lt;br /&gt;
		res:node( body );&lt;br /&gt;
	elseif config.params.showPreview and frame:preprocess( '{{REVISIONID}}' ) == '' then&lt;br /&gt;
		local preview = renderPreview( frame );&lt;br /&gt;
		res:node( preview );&lt;br /&gt;
	end&lt;br /&gt;
	-- render category list&lt;br /&gt;
	if not nocat then&lt;br /&gt;
		local pageTitle = mw.title.getCurrentTitle();&lt;br /&gt;
		if pageTitle.namespace == 0 then&lt;br /&gt;
			local categories = renderCategories( frame, interprojects, otherprojects );&lt;br /&gt;
			res:node( categories );&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( res );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>