<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://www.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3AIranByProvinceCatNav</id>
	<title>پودمان:IranByProvinceCatNav - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://www.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3AIranByProvinceCatNav"/>
	<link rel="alternate" type="text/html" href="https://www.islamical.org/w/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:IranByProvinceCatNav&amp;action=history"/>
	<updated>2026-06-06T22:20:56Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://www.islamical.org/w/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:IranByProvinceCatNav&amp;diff=25127&amp;oldid=prev</id>
		<title>Aboammar: ساخت الگو</title>
		<link rel="alternate" type="text/html" href="https://www.islamical.org/w/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:IranByProvinceCatNav&amp;diff=25127&amp;oldid=prev"/>
		<updated>2023-03-21T16:01:39Z</updated>

		<summary type="html">&lt;p&gt;ساخت الگو&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fa&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;→ نسخهٔ قدیمی‌تر&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;نسخهٔ ‏۲۱ مارس ۲۰۲۳، ساعت ۱۶:۰۱&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fa&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(بدون تفاوت)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Aboammar</name></author>
	</entry>
	<entry>
		<id>https://www.islamical.org/w/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:IranByProvinceCatNav&amp;diff=55024&amp;oldid=prev</id>
		<title>imported&gt;Jeeputer در ‏۳ اوت ۲۰۲۱، ساعت ۰۳:۵۴</title>
		<link rel="alternate" type="text/html" href="https://www.islamical.org/w/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:IranByProvinceCatNav&amp;diff=55024&amp;oldid=prev"/>
		<updated>2021-08-03T03:54:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
	v01.18: fix handling of definite article (e.g. for &amp;#039;the Northwest Territories&amp;#039;) &lt;br /&gt;
&lt;br /&gt;
 each title consists of 3 parts&lt;br /&gt;
    * prefix&lt;br /&gt;
    * province name&lt;br /&gt;
    * suffix&lt;br /&gt;
 e.g. &amp;quot;فلان در تهران&amp;quot;&lt;br /&gt;
    * prefix = &amp;quot;فلان در &amp;quot;&lt;br /&gt;
    * province name = &amp;quot;تهران&amp;quot;&lt;br /&gt;
    * suffix = &amp;quot;&amp;quot;&lt;br /&gt;
 e.g. &amp;quot;تهران در دهه ۱۳۹۰&amp;quot;&lt;br /&gt;
    * prefix = &amp;quot;&amp;quot;&lt;br /&gt;
    * province name = &amp;quot;تهران&amp;quot;&lt;br /&gt;
    * suffix = &amp;quot;در دهه ۱۳۹۰&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- config&lt;br /&gt;
local textSize = &amp;#039;90%&amp;#039;&lt;br /&gt;
local tableClass=&amp;quot;toc&amp;quot;&lt;br /&gt;
local evenRowStyle = &amp;quot;vertical-align:top; background-color:#f3f3f3;&amp;quot;&lt;br /&gt;
local oddRowStyle = &amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
local labelStyle = &amp;quot;text-align:left; font-weight: bold; padding: 0.25em 0.5em 0.25em 0.5em;&amp;quot;&lt;br /&gt;
local listStyle = &amp;quot;text-align:right; font-weight: normal; padding: 0.25em 0.5em 0.25em 0.5em;&amp;quot;&lt;br /&gt;
local greyLinkColor = &amp;quot;#888&amp;quot;&lt;br /&gt;
--[[ Note that the table styles are designed to ensure that the navbox is as wide as possible, while still leaving&lt;br /&gt;
     enough enough space on the right for portal boxes, commons links, and GeoGroup templates.&lt;br /&gt;
     A lot of fiddling was needed to make it work, so please test any chnages very carfully in the sandbox.&lt;br /&gt;
]]&lt;br /&gt;
local tableFallbackMaxWidth=&amp;quot;auto&amp;quot;&lt;br /&gt;
local tableMaxWidth=&amp;quot;calc(100% - 25em)&amp;quot; -- Template:GeoGroup has width: 23em&amp;lt;&lt;br /&gt;
-- local tableStyle=&amp;quot;margin-left:0; margin-right:auto; clear:left !important; margin-top:0 !important; float:left; width:auto;&amp;quot;&lt;br /&gt;
local tableStyle=&amp;quot;margin-right:0; margin-left:auto; clear:right !important; margin-top:0 !important; width:auto;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Templates which are allowed to call this module&lt;br /&gt;
local callingTemplates = {&lt;br /&gt;
	&amp;#039;الگو:IranByProvinceCatNav&amp;#039;,&lt;br /&gt;
	&amp;#039;الگو:ناوبری رده استان‌های ایران&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- globals for this module&lt;br /&gt;
local debugging = false&lt;br /&gt;
local debugmsg = &amp;quot;&amp;quot;&lt;br /&gt;
local tableRowNum = 0&lt;br /&gt;
local title_prefix = &amp;quot;&amp;quot;&lt;br /&gt;
local title_suffix = &amp;quot;&amp;quot;&lt;br /&gt;
local title_prefix&lt;br /&gt;
local title_suffix&lt;br /&gt;
local thisPageProvince&lt;br /&gt;
local greyLinkCount = 0&lt;br /&gt;
local blueLinkCount = 0&lt;br /&gt;
local parentname = &amp;quot;&amp;quot;&lt;br /&gt;
local templateName&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Plain text list of provinces and territories&lt;br /&gt;
	* Each entry exactly as it appears in running text in category titles, with any prefix (e.g. &amp;quot;the&amp;quot;)&lt;br /&gt;
	* Be sure to avoid hidden characters and duplicate spaces.  They break the pattern-matching on which this module relies&lt;br /&gt;
]]&lt;br /&gt;
local IranProvinces = {&lt;br /&gt;
	&amp;#039;استان آذربایجان شرقی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان آذربایجان غربی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان اردبیل&amp;#039;,&lt;br /&gt;
	&amp;#039;استان اصفهان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان البرز&amp;#039;,&lt;br /&gt;
	&amp;#039;استان ایلام&amp;#039;,&lt;br /&gt;
	&amp;#039;استان بوشهر&amp;#039;,&lt;br /&gt;
	&amp;#039;استان تهران&amp;#039;,&lt;br /&gt;
	&amp;#039;استان چهارمحال و بختیاری&amp;#039;,&lt;br /&gt;
	&amp;#039;استان خراسان جنوبی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان خراسان رضوی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان خراسان شمالی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان خوزستان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان زنجان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان سمنان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان سیستان و بلوچستان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان فارس&amp;#039;,&lt;br /&gt;
	&amp;#039;استان قزوین&amp;#039;,&lt;br /&gt;
	&amp;#039;استان قم&amp;#039;,&lt;br /&gt;
	&amp;#039;استان کردستان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان کرمان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان کرمانشاه&amp;#039;,&lt;br /&gt;
	&amp;#039;استان کهگیلویه و بویراحمد&amp;#039;,&lt;br /&gt;
	&amp;#039;استان گلستان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان گیلان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان لرستان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان مازندران&amp;#039;,&lt;br /&gt;
	&amp;#039;استان مرکزی&amp;#039;,&lt;br /&gt;
	&amp;#039;استان هرمزگان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان همدان&amp;#039;,&lt;br /&gt;
	&amp;#039;استان یزد&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- If the page title matches any of these Lua patterns, treat it as a false positive &lt;br /&gt;
local falsePositiveChecks = {&lt;br /&gt;
	&amp;quot;کرج&amp;quot;,&lt;br /&gt;
	&amp;quot;استان کرج&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function makeTrackingCategory()&lt;br /&gt;
	-- discount the current page, which will always be coded as a blue link, but rendered as bold un-navigable&lt;br /&gt;
	blueLinkCount = blueLinkCount - 1&lt;br /&gt;
	if greyLinkCount == 0 then&lt;br /&gt;
		return &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; بدون پیوند خاکستری]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if blueLinkCount == 0 then&lt;br /&gt;
		return &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; فقط دارای پیوند خاکستری]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if  greyLinkCount &amp;lt;= 10 then&lt;br /&gt;
		return &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; با کمتر از ۱۰ پیوند خاکستری]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if  greyLinkCount &amp;gt;= 25 then&lt;br /&gt;
		return &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; با بیش از ۲۵ پیوند خاکستری]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if  greyLinkCount &amp;gt; 10 then&lt;br /&gt;
		return &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; با بیش از ۱۰ پیوند خاکستری]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeTableRow(rowLabel, provinceList)&lt;br /&gt;
	debugLog(2, &amp;quot;ساخت ردیف جدول, برچسب: &amp;quot;)&lt;br /&gt;
	if (rowLabel == nil) then&lt;br /&gt;
		rowLabel = &amp;quot;بر&amp;amp;nbsp;پایه&amp;lt;br/&amp;gt;استان&amp;quot;&lt;br /&gt;
		debugLog(nil, rowLabel)&lt;br /&gt;
	else&lt;br /&gt;
		rowLabel = mw.text.trim(rowLabel)&lt;br /&gt;
		debugLog(nil, &amp;quot; [&amp;quot; .. rowLabel .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	tableRowNum = tableRowNum + 1&lt;br /&gt;
	local thisRow&lt;br /&gt;
	if (tableRowNum % 2) == 0 then&lt;br /&gt;
		debugLog(3, &amp;quot;با شمارهٔ زوج&amp;quot;)&lt;br /&gt;
		thisRow = &amp;#039;&amp;lt;tr style=&amp;quot;&amp;#039; .. evenRowStyle .. &amp;#039;&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		debugLog(3, &amp;quot;با شمارهٔ فرد&amp;quot;)&lt;br /&gt;
		thisRow = &amp;#039;&amp;lt;tr style=&amp;quot;&amp;#039; .. oddRowStyle .. &amp;#039;&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not ((rowLabel == nil) or (rowLabel ==&amp;quot;&amp;quot;)) then&lt;br /&gt;
		thisRow = thisRow .. &amp;#039;&amp;lt;td style=&amp;quot;&amp;#039; .. labelStyle .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. rowLabel .. &amp;#039;&amp;lt;/td&amp;gt;\n&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- now begin making the row contents&lt;br /&gt;
	thisRow = thisRow .. &amp;#039;&amp;lt;td style=&amp;quot;&amp;#039; .. listStyle .. &amp;#039;;&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;hlist&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
	local i, aProvince&lt;br /&gt;
		debugLog(3, &amp;quot;پردازش فهرست استان‌ها&amp;quot;)&lt;br /&gt;
	for i, aProvince in ipairs(provinceList) do&lt;br /&gt;
		debugLog(4, &amp;quot;شمارهٔ &amp;quot; .. tostring(i) .. &amp;quot;: [&amp;quot; .. aProvince .. &amp;quot;]&amp;quot;)&lt;br /&gt;
		myCatName = makeCatName(aProvince, title_prefix, title_suffix)&lt;br /&gt;
		thisRow = thisRow .. &amp;quot;* &amp;quot; .. makeCatLink(myCatName, aProvince) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	thisRow = thisRow .. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
	return thisRow&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function makeTable()&lt;br /&gt;
	debugLog(1, &amp;quot;ساخت جدول&amp;quot;)&lt;br /&gt;
	tableRowNum = 0&lt;br /&gt;
	local myTable = &amp;#039;&amp;lt;table class=&amp;quot;&amp;#039; .. tableClass .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	myTable = myTable .. &amp;#039; style=&amp;quot;&amp;#039; .. tableStyle .. &amp;#039;; font-size:&amp;#039; .. textSize .. &amp;#039;; max-width:&amp;#039; .. tableFallbackMaxWidth .. &amp;#039;; max-width:&amp;#039; .. tableMaxWidth ..&amp;#039;&amp;quot;&amp;gt;\n&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	myTable = myTable .. makeTableRow(nil, IranProvinces)&lt;br /&gt;
	myTable = myTable .. &amp;quot;&amp;lt;/table&amp;gt;\n&amp;quot;&lt;br /&gt;
	return myTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Make a piped link to a category, if it exists&lt;br /&gt;
-- If it doesn&amp;#039;t exist, just display the greyed link title without linking&lt;br /&gt;
function makeCatLink(catname, disp)&lt;br /&gt;
	local displaytext&lt;br /&gt;
	if (disp ~= &amp;quot;&amp;quot;) and (disp ~= nil) then&lt;br /&gt;
		-- use &amp;#039;disp&amp;#039; parameter, but strip any leading word &amp;quot;استان&amp;quot;&lt;br /&gt;
		displaytext = mw.ustring.gsub(disp, &amp;quot;استان%s+&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
		displaytext = catname&lt;br /&gt;
	end&lt;br /&gt;
	local fmtlink&lt;br /&gt;
	local catPage = mw.title.new( catname, &amp;quot;رده&amp;quot; )&lt;br /&gt;
	if (catPage.exists) then&lt;br /&gt;
		fmtlink = &amp;quot;[[:رده:&amp;quot; .. catname .. &amp;quot;|&amp;quot; .. displaytext .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		blueLinkCount = blueLinkCount + 1&lt;br /&gt;
	else&lt;br /&gt;
		fmtlink = &amp;#039;&amp;lt;span style=&amp;quot;color:&amp;#039; .. greyLinkColor .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. displaytext .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
		greyLinkCount = greyLinkCount + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return fmtlink&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function makeCatName(provinceName, prefix, suffix)&lt;br /&gt;
	local thisCatName = prefix .. provinceName .. suffix&lt;br /&gt;
	debugLog(5, &amp;quot;نام این رده = [&amp;quot; .. thisCatName .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	--[[&lt;br /&gt;
		Now check whether the all following conditions are true&lt;br /&gt;
			1/ the provinceName begins with &amp;quot;استان&amp;quot;&lt;br /&gt;
			2/ the category does NOT exist if we use &amp;quot;استان &amp;quot;&lt;br /&gt;
			3/ the category does exist if we strip &amp;quot;استان &amp;quot;&lt;br /&gt;
		 If those conditions are all true, them strip &amp;quot;استان&amp;quot; &lt;br /&gt;
	]] &lt;br /&gt;
	if (mw.ustring.match(provinceName, &amp;quot;استان &amp;quot;) ~= nil) then&lt;br /&gt;
		debugLog(6, &amp;quot;نام استان با «استان» آغاز می‌شود&amp;quot;)&lt;br /&gt;
		local provinceNameStripped = mw.ustring.gsub(provinceName, &amp;quot;استان &amp;quot;, &amp;quot;&amp;quot;, 1)&lt;br /&gt;
		local thisCatNameStripped = prefix .. provinceNameStripped .. suffix&lt;br /&gt;
		debugLog(6, &amp;quot;نام این رده به‌صورت جدا جدا = [&amp;quot; .. thisCatNameStripped .. &amp;quot;]&amp;quot;)&lt;br /&gt;
		local testCatPage = mw.title.new(thisCatName, &amp;quot;رده&amp;quot; )&lt;br /&gt;
		local testCatPageStripped = mw.title.new(thisCatNameStripped, &amp;quot;رده&amp;quot; )&lt;br /&gt;
		if not testCatPage.exists then&lt;br /&gt;
			debugLog(7, &amp;quot;[&amp;quot; .. testCatPage.fullText .. &amp;quot;] .. موجود نیست&amp;quot;) &lt;br /&gt;
			if (testCatPageStripped.exists) then&lt;br /&gt;
				debugLog(7, &amp;quot;[&amp;quot; .. testCatPageStripped.fullText .. &amp;quot;] .. موجود است، پس از آن استفاده می‌شود&amp;quot;) &lt;br /&gt;
				return thisCatNameStripped&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return thisCatName&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function patternSearchEncode(s)&lt;br /&gt;
	return mw.ustring.gsub(s, &amp;quot;([%W])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Does the pagename include a province name?&lt;br /&gt;
function findprovinceNameInPagename(pn, provinceList, description)&lt;br /&gt;
	local i, aProvince, testProvince&lt;br /&gt;
	debugLog(2, &amp;quot;بررسی [&amp;quot; .. pn ..&amp;quot;] برای نام استان در مجموعهٔ استان‌ها: &amp;quot; .. description)&lt;br /&gt;
	for i, aProvince in ipairs(provinceList) do&lt;br /&gt;
		testProvince = aProvince&lt;br /&gt;
		debugLog(3, &amp;quot;آزمایش: [&amp;quot;  .. testProvince .. &amp;quot;]&amp;quot;)&lt;br /&gt;
		local testProvinceEncoded = patternSearchEncode(testProvince)&lt;br /&gt;
		-- For efficiency, the first test is a simple match as a a screening test&lt;br /&gt;
		-- If the bare county name is nowhere in the pagename, then no need for&lt;br /&gt;
		-- more precise checks&lt;br /&gt;
		-- This check would be one line in regex, but Lua pattern matching is cruder,&lt;br /&gt;
		-- so we need several passes to ensure that any match is of a complete word&lt;br /&gt;
		debugLog(4, &amp;quot;انطباق ساده؟ &amp;quot;)&lt;br /&gt;
		if (not mw.ustring.match(pn, testProvinceEncoded)) then&lt;br /&gt;
			debugLog(nil, &amp;quot;ناموفق&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			debugLog(nil, &amp;quot;موفق&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			-- test for false positives&lt;br /&gt;
			local j, aFalsePositiveTest&lt;br /&gt;
			for j, aFalsePositiveTest in ipairs(falsePositiveChecks) do&lt;br /&gt;
				debugLog(5, &amp;quot;الگوی آزمایش «&amp;quot; .. aFalsePositiveTest .. &amp;quot;» مثبت کاذب است؟ &amp;quot;)&lt;br /&gt;
				if (mw.ustring.match(pn, aFalsePositiveTest)) then&lt;br /&gt;
					debugLog(nil, &amp;quot;منطبق است، پس ناموفق&amp;quot;)&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
				debugLog(nil, &amp;quot;منطبق نیست، پس درست است&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			debugLog(4, &amp;quot;انطباق کل مام؟ &amp;quot;)&lt;br /&gt;
			if (pn == testProvince) then&lt;br /&gt;
				debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
				return testProvince&lt;br /&gt;
			end&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			debugLog(4, &amp;quot;انطباق در ابتدا پیش از جداکننده؟ &amp;quot;)&lt;br /&gt;
			if mw.ustring.match(pn, &amp;quot;^&amp;quot; .. testProvinceEncoded .. &amp;quot;[^%w]&amp;quot;) then&lt;br /&gt;
				debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
				return testProvince&lt;br /&gt;
			end&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			debugLog(4, &amp;quot;انطباق در انتها پس از جداکننده؟ &amp;quot;)&lt;br /&gt;
			if mw.ustring.match(pn, &amp;quot;[^%w]&amp;quot; .. testProvinceEncoded .. &amp;quot;$&amp;quot;) then&lt;br /&gt;
				debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
				return testProvince&lt;br /&gt;
			end&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			debugLog(4, &amp;quot;انطباق در هر جا پس یا پیش از جداکننده؟ &amp;quot;)&lt;br /&gt;
			if mw.ustring.match(pn, &amp;quot;[^%w]&amp;quot; .. testProvinceEncoded .. &amp;quot;[^%w]&amp;quot;) then&lt;br /&gt;
				debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
				return testProvince&lt;br /&gt;
			end&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
		-- Special case: if the province name we are testing begins with a prefixed &amp;quot;استان&amp;quot;&lt;br /&gt;
		debugLog(4, &amp;quot;آزمایش استان با «استان» آغاز می‌شود؟ &amp;quot;)&lt;br /&gt;
		if (mw.ustring.match(testProvince, &amp;quot;استان &amp;quot;) == nil) then&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if (mw.ustring.match(testProvince, &amp;quot;استان &amp;quot;) ~= nil) then&lt;br /&gt;
			local testProvinceStripped = mw.ustring.gsub(testProvince, &amp;quot;استان &amp;quot;, &amp;quot;&amp;quot;, 1)&lt;br /&gt;
			local testProvinceStrippedEncoded = patternSearchEncode(testProvinceStripped)&lt;br /&gt;
			debugLog(4, &amp;quot;الگوی آزمایش بدون مقالهٔ اصلی، مثلاً «&amp;quot; .. testProvinceStrippedEncoded .. &amp;quot;»؟ &amp;quot;)&lt;br /&gt;
			if (mw.ustring.match(pn, &amp;quot;[^%w]&amp;quot; .. testProvinceStrippedEncoded .. &amp;quot;[^%w]&amp;quot;)  ~= nil)&lt;br /&gt;
			or (mw.ustring.match(pn, &amp;quot;^&amp;quot; .. testProvinceStrippedEncoded .. &amp;quot;[^%w]&amp;quot;)  ~= nil)&lt;br /&gt;
			or (mw.ustring.match(pn, &amp;quot;[^%w]&amp;quot; .. testProvinceStrippedEncoded .. &amp;quot;$&amp;quot;)  ~= nil)&lt;br /&gt;
			or (mw.ustring.match(pn, &amp;quot;^&amp;quot; .. testProvinceStrippedEncoded .. &amp;quot;$&amp;quot;)  ~= nil) then&lt;br /&gt;
				debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
				return testProvinceStripped&lt;br /&gt;
			end&lt;br /&gt;
			debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- parse the pagename to find 3 parts: prefix, province name, suffix&lt;br /&gt;
function parsePagename(pn)&lt;br /&gt;
	debugLog(1, &amp;quot;تجزیهٔ نام صفحه: [&amp;quot; .. pn .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	local validprovinceName&lt;br /&gt;
	validprovinceName = findprovinceNameInPagename(pn, IranProvinces, &amp;quot;provincelst&amp;quot;)&lt;br /&gt;
	if validprovinceName == nil then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- if we get here, the page name &amp;quot;pn&amp;quot; includes a validprovinceName&lt;br /&gt;
	-- so now we need to split the string&lt;br /&gt;
	&lt;br /&gt;
	debugLog(2, &amp;quot;تفکیک نام صفحه پیرامون [&amp;quot; .. validprovinceName .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	local validProvinceEncoded = mw.ustring.gsub(validprovinceName, &amp;quot;([%W])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
	match_prefix, match_province, match_suffix = mw.ustring.match(pn, &amp;quot;^(.*)(&amp;quot; .. validProvinceEncoded .. &amp;quot;)(.*)$&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	title_prefix = match_prefix&lt;br /&gt;
	title_suffix = match_suffix&lt;br /&gt;
	debugLog(2, &amp;quot;تجزیه موفق&amp;quot;)&lt;br /&gt;
	debugLog(3, &amp;quot;پیشوند عنوان = [&amp;quot; .. title_prefix .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(3, &amp;quot;استان در این صفححه = [&amp;quot; .. match_province .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(3, &amp;quot;پسوند عنوان = [&amp;quot; .. title_suffix .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function publishDebugLog()&lt;br /&gt;
	if not debugging then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;== خرفسترزدایی ==\n\n&amp;quot; .. debugmsg .. &amp;quot;\n== خروجی ==\n&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- debugLog builds a log which can be output if debuging is enabled&lt;br /&gt;
-- each log entry is given a level, so that the output is not simply a flat list&lt;br /&gt;
-- a debug msg may be appended to the previous msg by setting the level to nil&lt;br /&gt;
function debugLog(level, msg)&lt;br /&gt;
&lt;br /&gt;
	if (debugmsg == nil) then&lt;br /&gt;
		debugmsg = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (level ~= nil) then&lt;br /&gt;
		-- not appending, so make a new line&lt;br /&gt;
		debugmsg = debugmsg .. &amp;quot;\n&amp;quot;&lt;br /&gt;
		-- then add the level&lt;br /&gt;
		local i&lt;br /&gt;
		for i = 1, level do&lt;br /&gt;
			if (i % 2) == 1 then&lt;br /&gt;
				debugmsg = debugmsg .. &amp;quot;#&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				debugmsg = debugmsg .. &amp;quot;*&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	debugmsg = debugmsg .. &amp;quot; &amp;quot; .. msg&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function getYesNoParam(args, thisParamName, defaultVal)&lt;br /&gt;
	local paramVal = args[thisParamName]&lt;br /&gt;
	if paramVal == nil then&lt;br /&gt;
		paramVal = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	debugLog(2, &amp;quot;برآورد پارامتر بله/خیر: [&amp;quot; .. thisParamName .. &amp;quot;] = [&amp;quot; .. paramVal .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(3, &amp;quot;پیش‌فرض = &amp;quot; .. ((defaultVal and &amp;quot;بله&amp;quot;) or &amp;quot;خیر&amp;quot;))&lt;br /&gt;
	debugLog(3, &amp;quot;برآورد به‌عنوان: &amp;quot;)&lt;br /&gt;
	local returnValue&lt;br /&gt;
	if paramVal == &amp;quot;&amp;quot; then&lt;br /&gt;
		returnValue = defaultVal&lt;br /&gt;
	else&lt;br /&gt;
		returnValue = yesno(args[thisParamName], defaultVal)&lt;br /&gt;
	end&lt;br /&gt;
	if (returnValue) then&lt;br /&gt;
		debugLog(nil, &amp;quot;بله&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		debugLog(nil, &amp;quot;خیر&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return returnValue&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeErrorMsg(s)&lt;br /&gt;
	return &amp;#039;&amp;lt;p class=&amp;quot;error&amp;quot;&amp;gt;خطای [[&amp;#039; .. parentname .. &amp;#039;]]: &amp;#039; .. s .. &amp;#039;&amp;lt;/p&amp;gt;\n&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isValidParent(p)&lt;br /&gt;
	local i, aParent&lt;br /&gt;
	for i, aParent in ipairs(callingTemplates) do&lt;br /&gt;
		if p == aParent then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local parent = frame:getParent()&lt;br /&gt;
	if parent then&lt;br /&gt;
		 parentname = parent:getTitle():gsub(&amp;#039;/صفحه تمرین$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (parentname == nil) or not isValidParent(parentname) then&lt;br /&gt;
		local errormsg = &amp;#039;&amp;lt;p class=&amp;quot;error&amp;quot;&amp;gt; خطا: &amp;#039; .. parentname .. &amp;#039; داده‌پوش معتبری برای [[&amp;#039; .. frame:getTitle() .. &amp;#039;]] نیست\n&amp;#039;&lt;br /&gt;
		errormsg = errormsg .. &amp;#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;داده‌پوش‌های معتبر: &amp;#039;&lt;br /&gt;
		local i, aParent&lt;br /&gt;
		for i, aParent in ipairs(callingTemplates) do&lt;br /&gt;
			errormsg = errormsg .. &amp;#039;[[&amp;#039; .. aParent  .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		errormsg = errormsg .. &amp;#039;&amp;lt;/p&amp;gt;&amp;#039;&lt;br /&gt;
		return errormsg&lt;br /&gt;
	end&lt;br /&gt;
	templateName = mw.ustring.gsub(parentname, &amp;quot;^الگو:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	debugLog(1, &amp;quot;بررسی پارامترها&amp;quot;)&lt;br /&gt;
	debugging = getYesNoParam(frame.args, &amp;quot;debug&amp;quot;, false)&lt;br /&gt;
&lt;br /&gt;
	-- get the page title&lt;br /&gt;
	thispage = mw.title.getCurrentTitle()&lt;br /&gt;
	thispagename = thispage.text;&lt;br /&gt;
	&lt;br /&gt;
	debugLog(1, &amp;quot;mw.title.getCurrentTitle()&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;thispage.text = [&amp;quot; .. thispage.text ..&amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;thispage.namespace = [&amp;quot; .. thispage.namespace ..&amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;thispage.nsText = [&amp;quot; .. thispage.nsText ..&amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;این صفحه یک رده است؟ با استفاده از (thispage:inNamespace(14)): &amp;quot;)&lt;br /&gt;
	if not (thispage:inNamespace(14)) then&lt;br /&gt;
		debugLog(nil, &amp;quot;خیر، رده نیست&amp;quot;)&lt;br /&gt;
		debugLog(1, &amp;quot;رده نیست، پس خروجی ارائه نمی‌شود&amp;quot;)&lt;br /&gt;
		return makeErrorMsg(&amp;quot;تنها برای استفاده در صفحه‌های رده&amp;quot;) .. publishDebugLog()&lt;br /&gt;
	end&lt;br /&gt;
	debugLog(nil, &amp;quot;بله، رده است&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not parsePagename(thispagename) then&lt;br /&gt;
		-- some error parsing the title, so don&amp;#039;t proceed to output&lt;br /&gt;
		local trackingCatInvalid = &amp;quot;[[رده:&amp;quot; .. templateName .. &amp;quot; در رده نامعتبر]]&amp;quot;&lt;br /&gt;
		return makeErrorMsg(&amp;#039;نام این رده شامل نام معتبر یکی از استان‌های ایران نیست&amp;#039;) .. publishDebugLog() .. trackingCatInvalid&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	debugLog(1, &amp;quot;تجزیه کامل شد&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;پیشوند عنوان = [&amp;quot; .. title_prefix .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;پسوند عنوان = [&amp;quot; .. title_suffix .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local myNavTable = makeTable()&lt;br /&gt;
	debugLog(2, &amp;quot;تعداد پیوندهای آبی = [&amp;quot; .. blueLinkCount .. &amp;quot;]. &amp;amp;nbsp; (دقت کنید که صفحهٔ کنونی همواره به‌عنوان پیوند آبی شمارش می‌شود، اما قابل ناوبری نخواهد بود)&amp;quot;)&lt;br /&gt;
	debugLog(2, &amp;quot;تعداد پیوندهای خاکستری = [&amp;quot; .. greyLinkCount .. &amp;quot;]&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if (blueLinkCount &amp;lt;= 1) then&lt;br /&gt;
		-- This is a navbar to nowhere, so suppress display&lt;br /&gt;
		myNavTable = &amp;quot;&amp;quot;&lt;br /&gt;
		debugLog(1, &amp;quot;صفر پیوند آبی (به‌جز صفحهٔ کنونی) باعث می‌شود که این ناوبری کاربردی نداشته‌باشد؛ پس جعبهٔ ناوبری نمایش نخواهد یافت&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local myTrackingCat = makeTrackingCategory()&lt;br /&gt;
&lt;br /&gt;
	return publishDebugLog() .. myNavTable .. myTrackingCat&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jeeputer</name></author>
	</entry>
</feed>