<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://source.islamical.org/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ARunning_header</id>
	<title>پودمان:Running header - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://source.islamical.org/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ARunning_header"/>
	<link rel="alternate" type="text/html" href="https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Running_header&amp;action=history"/>
	<updated>2026-11-10T00:10:56Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Running_header&amp;diff=257&amp;oldid=prev</id>
		<title>Shahroudi: صفحه‌ای تازه حاوی «--[=[ 	Implements الگو:سرصفحهٔ مستمر  	RTL localization of Module:RunningHeader (English Wikisource) for 	Persian Wikisource.  	Supported named parameters (Persian and English both work): 		راست  / right              -&gt; cell shown on the right side of the header 		وسط، میان / center, centre -&gt; single middle cell (classic 3-cell layout) 		راست-میان, چپ-میان         -&gt; the two inner cells of...» ایجاد کرد</title>
		<link rel="alternate" type="text/html" href="https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Running_header&amp;diff=257&amp;oldid=prev"/>
		<updated>2026-11-05T07:11:28Z</updated>

		<summary type="html">&lt;p&gt;صفحه‌ای تازه حاوی «--[=[ 	Implements &lt;a href=&quot;/index.php?title=%D8%A7%D9%84%DA%AF%D9%88:%D8%B3%D8%B1%D8%B5%D9%81%D8%AD%D9%87%D9%94_%D9%85%D8%B3%D8%AA%D9%85%D8%B1&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;الگو:سرصفحهٔ مستمر (صفحه وجود ندارد)&quot;&gt;الگو:سرصفحهٔ مستمر&lt;/a&gt;  	RTL localization of Module:RunningHeader (English Wikisource) for 	Persian Wikisource.  	Supported named parameters (Persian and English both work): 		راست  / right              -&amp;gt; cell shown on the right side of the header 		وسط، میان / center, centre -&amp;gt; single middle cell (classic 3-cell layout) 		راست-میان, چپ-میان         -&amp;gt; the two inner cells of...» ایجاد کرد&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
	Implements [[الگو:سرصفحهٔ مستمر]]&lt;br /&gt;
&lt;br /&gt;
	RTL localization of Module:RunningHeader (English Wikisource) for&lt;br /&gt;
	Persian Wikisource.&lt;br /&gt;
&lt;br /&gt;
	Supported named parameters (Persian and English both work):&lt;br /&gt;
		راست  / right              -&amp;gt; cell shown on the right side of the header&lt;br /&gt;
		وسط، میان / center, centre -&amp;gt; single middle cell (classic 3-cell layout)&lt;br /&gt;
		راست-میان, چپ-میان         -&amp;gt; the two inner cells of a 4-cell layout,&lt;br /&gt;
		                              used instead of وسط/میان (see&lt;br /&gt;
		                              get_alias_groups below)&lt;br /&gt;
		چپ   / left                -&amp;gt; cell shown on the left side of the header&lt;br /&gt;
		کلاس / class               -&amp;gt; extra CSS class for the whole header&lt;br /&gt;
&lt;br /&gt;
	About the RTL layout: cells are still built into the DOM in the same&lt;br /&gt;
	order as the English version (cell 1 is still built first). It&amp;#039;s the&lt;br /&gt;
	accompanying CSS (direction:rtl on .wst-rh) that makes the browser lay&lt;br /&gt;
	them out right to left. So cell 1 ends up on the right and the last&lt;br /&gt;
	cell ends up on the left -- and left=... always puts content on the&lt;br /&gt;
	visual left, right=... always on the visual right, whether you write&lt;br /&gt;
	the Persian or the English name.&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Returns the alias-group table to use for this call. راست/right (position 1)&lt;br /&gt;
-- and چپ/left (the last position) are always accepted. The middle is either&lt;br /&gt;
-- a single cell (وسط/میان -- the classic 3-cell layout) or two cells&lt;br /&gt;
-- (راست-میان + چپ-میان -- a 4-cell layout), whichever the caller actually&lt;br /&gt;
-- used; giving راست-میان or چپ-میان switches on the 4-cell scheme.&lt;br /&gt;
-- Note: since راست/وسط/میان/چپ etc. aren&amp;#039;t ASCII identifiers, they&amp;#039;re always&lt;br /&gt;
-- accessed with brackets (args[&amp;#039;راست&amp;#039;]) rather than dot notation&lt;br /&gt;
-- (args.راست) -- dot notation isn&amp;#039;t reliable for these keys in Lua/Scribunto.&lt;br /&gt;
local function get_alias_groups(args)&lt;br /&gt;
	if args[&amp;#039;راست-میان&amp;#039;] or args[&amp;#039;چپ-میان&amp;#039;] then&lt;br /&gt;
		return {&lt;br /&gt;
			{pos = 1, names = {&amp;#039;راست&amp;#039;, &amp;#039;right&amp;#039;}},&lt;br /&gt;
			{pos = 2, names = {&amp;#039;راست-میان&amp;#039;, &amp;#039;وسط&amp;#039;, &amp;#039;میان&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;centre&amp;#039;}},&lt;br /&gt;
			{pos = 3, names = {&amp;#039;چپ-میان&amp;#039;}},&lt;br /&gt;
			{pos = 4, names = {&amp;#039;چپ&amp;#039;, &amp;#039;left&amp;#039;}},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return {&lt;br /&gt;
		{pos = 1, names = {&amp;#039;راست&amp;#039;, &amp;#039;right&amp;#039;}},&lt;br /&gt;
		{pos = 2, names = {&amp;#039;وسط&amp;#039;, &amp;#039;میان&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;centre&amp;#039;}},&lt;br /&gt;
		{pos = 3, names = {&amp;#039;چپ&amp;#039;, &amp;#039;left&amp;#039;}},&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._running_header(args)&lt;br /&gt;
	-- holds tracking categories&lt;br /&gt;
	local tracking_cats = {}&lt;br /&gt;
&lt;br /&gt;
	-- was at least one named parameter (Persian or English) used?&lt;br /&gt;
	local used_named_alias = false&lt;br /&gt;
	-- was more than one source (positional and/or named aliases) given for the same position?&lt;br /&gt;
	local has_duplicate = false&lt;br /&gt;
&lt;br /&gt;
	local alias_groups = get_alias_groups(args)&lt;br /&gt;
&lt;br /&gt;
	for _, group in ipairs(alias_groups) do&lt;br /&gt;
		local resolved = nil&lt;br /&gt;
		local sources_defined = 0&lt;br /&gt;
&lt;br /&gt;
		if args[group.pos] then&lt;br /&gt;
			sources_defined = sources_defined + 1&lt;br /&gt;
			resolved = args[group.pos]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for _, name in ipairs(group.names) do&lt;br /&gt;
			if args[name] then&lt;br /&gt;
				sources_defined = sources_defined + 1&lt;br /&gt;
				used_named_alias = true&lt;br /&gt;
				resolved = resolved or args[name]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if sources_defined &amp;gt; 1 then&lt;br /&gt;
			has_duplicate = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		args[group.pos] = resolved&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if used_named_alias then&lt;br /&gt;
		-- this is fine but it&amp;#039;s worth keeping track of&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با نام پارامترهای صریح&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if has_duplicate then&lt;br /&gt;
		-- this is a real problem worth flagging&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;صفحه‌های دارای آرگومان تکراری در فراخوانی الگو&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- alias for the class parameter&lt;br /&gt;
	args.class = args.class or args[&amp;#039;کلاس&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
	if used_named_alias then&lt;br /&gt;
		-- using a named alias at all (even just one) commits to this&lt;br /&gt;
		-- scheme&amp;#039;s full cell count -- so the sibling positions the caller&lt;br /&gt;
		-- never mentioned are blank, not &amp;quot;undefined&amp;quot;. Without this,&lt;br /&gt;
		-- {{...|میان=X}} alone would look like a 2-cell header missing&lt;br /&gt;
		-- its first cell, instead of a 3-cell header with two blank sides.&lt;br /&gt;
		local last_pos = alias_groups[#alias_groups].pos&lt;br /&gt;
		for i = 1, last_pos do&lt;br /&gt;
			if args[i] == nil then&lt;br /&gt;
				args[i] = &amp;#039;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get number of cells (largest-numbered parameter)&lt;br /&gt;
	-- can&amp;#039;t use #args because that doesn&amp;#039;t work consistently on tables that aren&amp;#039;t sequences&lt;br /&gt;
	-- table.maxn also seems not to work&lt;br /&gt;
	local cell_count = 0&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local i = tonumber(k)&lt;br /&gt;
		if i and i &amp;gt; cell_count then&lt;br /&gt;
			cell_count = i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- track headers which don&amp;#039;t set the contents of every cell&lt;br /&gt;
	local undefined_entries = false&lt;br /&gt;
&lt;br /&gt;
	-- track how many cells have content&lt;br /&gt;
	local content_entries = 0&lt;br /&gt;
&lt;br /&gt;
	for i = 1, cell_count do&lt;br /&gt;
		if not args[i] then&lt;br /&gt;
			undefined_entries = true&lt;br /&gt;
		elseif args[i] and args[i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			content_entries = content_entries + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if undefined_entries then&lt;br /&gt;
		-- track headers with undefined entries (fine but worth keeping track of)&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با ورودی‌های تعریف‌نشده&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if content_entries == 1 then&lt;br /&gt;
		-- track headers with only one non-blank entry&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با تنها یک ورودی دارای محتوا&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if cell_count == 0 or content_entries == 0 then&lt;br /&gt;
		-- track headers with no entries (pointless)&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر خالی&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	elseif cell_count == 1 then&lt;br /&gt;
		-- track 1-cell headers (fine but worth keeping track of)&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با یک ورودی&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	elseif cell_count == 2 then&lt;br /&gt;
		-- track 2-cell headers (fine but worth keeping track of)&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با دو ورودی&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	elseif cell_count &amp;gt; 4 then&lt;br /&gt;
		-- track headers with more than 4 cells (fine but worth keeping track of)&lt;br /&gt;
		table.insert(tracking_cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;سرصفحه‌های مستمر با بیش از چهار ورودی&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- TEMPORARY FOR MIGRATION: enforce 3-cell minimum&lt;br /&gt;
	cell_count = math.max(cell_count, 3)&lt;br /&gt;
&lt;br /&gt;
	-- assemble header&lt;br /&gt;
	local base_class = &amp;#039;wst-rh&amp;#039;&lt;br /&gt;
	local header_class = table.concat({&lt;br /&gt;
		base_class,&lt;br /&gt;
		base_class .. &amp;#039;-&amp;#039; .. cell_count,&lt;br /&gt;
		args.class or (base_class .. &amp;#039;-default&amp;#039;)&lt;br /&gt;
	}, &amp;#039; &amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local header_div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:addClass(header_class)&lt;br /&gt;
		:attr(&amp;#039;dir&amp;#039;, &amp;#039;rtl&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- cell classes&lt;br /&gt;
	local cell_class = base_class .. &amp;#039;-cell&amp;#039;&lt;br /&gt;
	local extra_cell_classes = {&lt;br /&gt;
		[3] = {&amp;#039;wst-rh-right&amp;#039;, &amp;#039;wst-rh-center&amp;#039;, &amp;#039;wst-rh-left&amp;#039;},&lt;br /&gt;
		[4] = {&amp;#039;wst-rh-right&amp;#039;, &amp;#039;wst-rh-right-middle&amp;#039;, &amp;#039;wst-rh-left-middle&amp;#039;, &amp;#039;wst-rh-left&amp;#039;},&lt;br /&gt;
	}&lt;br /&gt;
	extra_cell_classes = extra_cell_classes[cell_count] or {}&lt;br /&gt;
&lt;br /&gt;
	for i = 1, cell_count do&lt;br /&gt;
		local cell = header_div:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(cell_class)&lt;br /&gt;
			:wikitext(args[i] or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		if extra_cell_classes[i] then&lt;br /&gt;
			cell:addClass(extra_cell_classes[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(header_div) .. table.concat(tracking_cats)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.running_header(frame)&lt;br /&gt;
	local args = getArgs(frame, {trim = true, removeBlanks = false})&lt;br /&gt;
	return p._running_header(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Shahroudi</name></author>
	</entry>
</feed>