<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://fr.wikipasokh.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nazarzadeh</id>
	<title>WikiPasokh - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://fr.wikipasokh.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nazarzadeh"/>
	<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/view/Sp%C3%A9cial:Contributions/Nazarzadeh"/>
	<updated>2026-05-27T21:36:54Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Voir_aussi&amp;diff=1668</id>
		<title>Modèle:Voir aussi</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Voir_aussi&amp;diff=1668"/>
		<updated>2025-07-11T07:11:48Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : Page redirigée vers Modèle:See also&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[template:see also]]&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Supplications_des_monoth%C3%A9istes_dans_le_Coran&amp;diff=1667</id>
		<title>Supplications des monothéistes dans le Coran</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Supplications_des_monoth%C3%A9istes_dans_le_Coran&amp;diff=1667"/>
		<updated>2025-07-11T07:11:07Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : /* Invocations des croyants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{question}}Quelles supplications les monothéistes adressent-ils selon le Coran ?{{question end}}&lt;br /&gt;
&lt;br /&gt;
Le Coran rapporte des invocations des monothéistes qui demandaient à Dieu : la guidée, le pardon, le salut du châtiment divin, la victoire contre leurs ennemis, et d&#039;autres requêtes similaires. Les monothéistes sont mentionnés dans ces supplications sous divers titres, notamment : Ceux ayant la foi, les compagnons des prophètes (a), les disciples de Jésus (a), les at-Tâbi&#039;ûn (disciples des compagnons), les serviteurs vertueux de Dieu, l’épouse de &#039;Imrân (a), l’armée de Tâlût, ceux qui sont enracinés dans la connaissance, les opprimés, les compagnons de la caverne, les compagnons d&#039;Al-Aʿrâf, le peuple de Shuʿayb (a) et les magiciens du Pharaon après avoir embrassé la foi. &lt;br /&gt;
== Invocations des croyants ==&lt;br /&gt;
{{Voir aussi | Les caractéristiques des croyants dans le Coran}}&lt;br /&gt;
Supplication pour être guidé : Guide-nous dans le droit chemin,(6) chemin de ceux que Tu as comblés de Tes grâces, non celui des réprouvés, ni celui des égarés.(al-Fâtaha/6-7)&lt;br /&gt;
Demande des biens de ce monde et de l’au-delà : Et il en est qui implorent : « Seigneur ! Accorde-nous bonheur ici-bas et félicité dans l’au-delà, et préserve-nous du châtiment de l’Enfer ! »(al-Baqara/201)&lt;br /&gt;
Demande du pardon divin et de la victoire sur les mécréants : « Seigneur ! Ne nous tiens pas rigueur de nos oublis ou de nos erreurs ! Ne nous accable pas, Seigneur, d’un fardeau semblable à celui imposé aux nations qui nous ont précédés. Ne nous impose pas, Seigneur, ce que nous ne pouvons supporter. Veuille effacer nos fautes, pardonner nos péchés et nous faire miséricorde. Tu es notre Maître et Protecteur, accorde-nous donc la victoire sur les mécréants. » (al-Baqara/286)&lt;br /&gt;
Demande du salut du feu de l’enfer : qui, debout, assis ou allongés sur le côté, invoquent le nom d’Allah et méditent la création des cieux et de la terre, disant : « Tu n’as pas, Seigneur, créé tout ceci en vain. Gloire à Toi ! Préserve-nous des tourments de l’Enfer !(Âl-&#039;Imrân/191)&lt;br /&gt;
Demande du pardon et de la compagnie des vertueux : Nous avons, Seigneur, entendu un homme appeler à la foi et à croire en Toi, et avons répondu à son appel. Veuille, Seigneur, pardonner nos péchés, effacer nos fautes et nous faire rejoindre, à notre mort, les pieux croyants.(193) Veuille, Seigneur, nous accorder ce que Tu nous as promis par la bouche de Tes Messagers et ne pas nous couvrir d’ignominie le Jour de la résurrection. Tu ne manques jamais à Ta promesse ! »(Âl-&#039;Imrân/193-194)&lt;br /&gt;
Invocations des compagnons des prophètes (a)&lt;br /&gt;
Ces hommes n’avaient que ces mots à la bouche : « Veuille, Seigneur, nous pardonner nos péchés et nos excès, raffermir nos pas et nous faire triompher des impies ! » (Âl-&#039;Imrân/147)&lt;br /&gt;
&lt;br /&gt;
Invocation des disciples de Jésus (a)&lt;br /&gt;
Seigneur ! Nous avons foi en Ta révélation et suivons la voie de Ton Messager. Place-nous donc au nombre de ceux qui témoignent de la vérité. » (Âl-&#039;Imrân/53)&lt;br /&gt;
&lt;br /&gt;
Invocation des at-Tâbi&#039;ûn (disciples des compagnons)&lt;br /&gt;
S’agissant des croyants venus après eux, ils implorent : « Veuille, Seigneur, nous pardonner, ainsi qu’à nos frères qui nous ont devancés dans la foi, et préserver nos cœurs de toute haine à l’encontre des croyants ! Tu es, Seigneur, toute bonté et toute miséricorde ! »(al-Hashr/10)&lt;br /&gt;
&lt;br /&gt;
Invocation des serviteurs vertueux de Dieu&lt;br /&gt;
1. Demande du pardon divin et du salut du châtiment : qui disent : « Nous croyons en Toi, Seigneur ! Veuille effacer nos péchés et nous préserver du châtiment de l’Enfer »(Âl-&#039;Imrân/16)&lt;br /&gt;
2. Invocation pour devenir un modèle dans la société : ceux qui disent : « Veuille, Seigneur, faire de nos épouses et de nos enfants une source de joie pour nous et faire de nous des modèles de piété. »(al-Furqân/74)&lt;br /&gt;
&lt;br /&gt;
Invocation de l’épouse de &#039;Imrân (a)&lt;br /&gt;
La femme d’Imrân dit un jour : « Je Te voue, Seigneur, l’enfant que je porte en mon sein. Veuille l’accepter de ma part, Toi qui entends tout et sais tout ! » (Âl-&#039;Imrân/35)&lt;br /&gt;
&lt;br /&gt;
Invocation de l’armée de Tâlût&lt;br /&gt;
Lorsqu’ils firent face à Goliath et son armée, ils implorèrent : « Veuille, Seigneur, nous armer de patience, raffermir nos pas et nous faire triompher de ce peuple impie ! »(al-Baqara/250)&lt;br /&gt;
&lt;br /&gt;
Invocation de ceux qui sont enracinés dans la connaissance&lt;br /&gt;
Ils disent : « Seigneur ! Ne détourne pas nos cœurs de la foi après nous avoir guidés, mais accorde-nous, par un effet de Ta miséricorde, de Tes faveurs en nous maintenant fermement attachés à la foi. C’est Toi le Grand Donateur !(Âl-&#039;Imrân/8)&lt;br /&gt;
&lt;br /&gt;
Invocation des opprimés&lt;br /&gt;
Qu’avez-vous donc à ne pas défendre la cause d’Allah et ces êtres opprimés, hommes, femmes et enfants, qui implorent : « Veuille, Seigneur, nous délivrer de cette cité injuste et nous accorder un allié sûr et un puissant protecteur ! »(an-Nisâ&#039;/75)&lt;br /&gt;
&lt;br /&gt;
Invocation des compagnons de la caverne&lt;br /&gt;
Lorsque, s’étant réfugiés dans une caverne, ces jeunes gens implorèrent : « Veuille, Seigneur, par un effet de Ta miséricorde, nous assister dans notre entreprise et nous ménager une issue favorable. »(al-Kahf/10)&lt;br /&gt;
&lt;br /&gt;
Invocation des compagnons d&#039;Al-Aʿrâf&lt;br /&gt;
Lorsque leurs regards seront dirigés vers les damnés de l’Enfer, ils diront : « Ne nous place pas, Seigneur, avec les impies. »(al-A&#039;râf/47)&lt;br /&gt;
&lt;br /&gt;
Invocation du peuple de Shuʿayb (a)&lt;br /&gt;
Nous prononcerions un infâme mensonge sur Allah si nous revenions à ce culte dont Il nous a délivrés. Nous ne saurions d’ailleurs revenir à cette religion que si Allah, notre Seigneur dont la science embrasse toute chose, en décide ainsi. Nous nous en remettons entièrement à Allah. Veuille, Seigneur, Toi le plus équitable des juges, trancher en toute justice ce différend qui nous oppose à notre peuple. »(al-A&#039;râf/89)&lt;br /&gt;
&lt;br /&gt;
Invocation des magiciens du Pharaon après avoir embrassé la foi&lt;br /&gt;
Le seul reproche que tu puisses d’ailleurs nous faire est d’avoir cru aux signes de notre Seigneur qui se sont manifestés à nous. Veuille, Seigneur, nous armer de patience et nous rappeler à Toi entièrement soumis à Ta volonté. »(al-A&#039;râf/126)&lt;br /&gt;
Ils répondirent : « Nous nous en remettons entièrement à Allah. Ne nous place pas, Seigneur, sous le pouvoir des mécréants, car ils mettraient notre foi à l’épreuve !(85) Veuille, par un effet de Ta miséricorde, nous délivrer de ce peuple impie ! »(al-A&#039;râf/85-86)&lt;br /&gt;
Références&lt;br /&gt;
1. As-Sakhâwî, Muhammad b. Abd ar-Rahân, Fath al-Maghîth sharh Alfîyt al-Hadith, vol 3, p 123, Beyrouth, édition de Salâh Muhammad Muhammad &#039;Uwayda, 1417 H ; Khatîb, Muhammad &#039;Ajâj, Usûl al-Hadith &#039;Ulûmihî wa Mustalahihî, p 410, Beyrouth, 1417 H&lt;br /&gt;
2. Les tout premiers croyants parmi ceux qui ont émigré et ceux qui leur ont apporté leur soutien, ainsi que ceux qui ont fidèlement suivi leur voie, sont entièrement satisfaits d’Allah qui Lui-même est satisfait d’eux. Il leur a préparé des jardins traversés de rivières où ils demeureront à jamais. Voilà le bonheur suprême.  &lt;br /&gt;
3. Le Coran, la sourate al-Mu&#039;minûn, le verset 109 ; la sourate al-Furqân, le verset 65&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Conditions_pour_le_successeur_du_Proph%C3%A8te_(s)&amp;diff=1666</id>
		<title>Conditions pour le successeur du Prophète (s)</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Conditions_pour_le_successeur_du_Proph%C3%A8te_(s)&amp;diff=1666"/>
		<updated>2025-07-11T07:10:30Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{question}}Quelles sont les conditions que les chiites et les sunnites considèrent comme nécessaires pour le successeur du Prophète (s), et quelles sont les différences entre ces deux sectes à cet égard ?{{question end}}&lt;br /&gt;
Le philosophe et théologien chiite, Khâdja Nasîr ad-Din at-Tûsî, dans son livre Risâlatun fi al-Imâma (Traité sur l’Imamat), a décrit les huit caractéristiques essentielles de l’Imam, qui sont : L&#039;infaillibilité (I`sma), la connaissance de la législation et de la gestion, le courage, l&#039;excellence dans les vertus, la pureté corporelle et spirituelle, la proximité avec Dieu, la capacité de réaliser des miracles, l’unité de la mission.&lt;br /&gt;
Selon la vision chiite, l’Imam doit être désigné par Dieu pour pouvoir remplir correctement ses responsabilités en matière de guidance et de préservation de la religion. Il est donc interdit à quiconque de choisir lui-même un tel individu pour ce rôle. Les chiites considèrent l&#039;infaillibilité comme une caractéristique clé de l’Imam, car sans elle, la confiance dans la législation divine serait compromise.&lt;br /&gt;
Les sunnites considèrent plusieurs conditions pour l’Imam, telles que : Être membre du clan des Quraychites, l’équité (justice), la maturité (puberté), le courage.&lt;br /&gt;
&lt;br /&gt;
Cependant, il existe des divergences concernant certaines autres qualités comme l’érudition (Ijthâd) et la compétence (kifâ&#039;a). La majorité des sunnites insistent sur la nécessité que l’Imam soit issu de la tribu des Quraychites, bien que certains groupes, comme les Khâwarij et certains Mu`tazilites, rejettent cette condition. Les sunnites estiment que l’Imam n&#039;a pas besoin d’être infaillible. En effet, même s&#039;il commet des erreurs, il reste obligatoire de lui obéir. Néanmoins, il existe des divergences parmi les sunnites sur cette question, et en raison de l&#039;absence de certaines qualités chez les premiers califes (Abû Bakr, Umar et Uthmân), certains considèrent que ces caractéristiques ne sont pas indispensables pour l’Imam.&lt;br /&gt;
&lt;br /&gt;
==Conditions de l&#039;Imam selon les Chiites==&lt;br /&gt;
Parmi les théologiens chiites, Khwâjah Nasîr ad-Dîn at-Tûsî présente la liste la plus complète des qualités de l&#039;Imam dans son traité sur l&#039;Imamat. Il considère huit caractéristiques essentielles comme nécessaires pour l&#039;Imam : l&#039;infaillibilité (&#039;Isma), la connaissance des règles de la charia et de la gestion, le courage, l&#039;excellence des traits de caractère, l&#039;absence de défauts corporels, spirituels et généalogiques, la proximité de Dieu dans le mérite des récompenses de l&#039;au-delà, la capacité de produire des miracles en cas de besoin, et l&#039;unité dans la fonction d&#039;Imamat.(((1)))&lt;br /&gt;
Les Chiites Imamites considèrent le califat et l&#039;Imamat comme des positions divines, tout comme la prophétie. La responsabilité du calife et de l&#039;Imam est de préserver la charia, d&#039;exprimer et de prêcher la religion, et de résoudre les problèmes de la communauté religieuse. Ainsi, des conditions et des caractéristiques particulières sont considérées comme nécessaires pour l&#039;Imam, de sorte que si quelqu&#039;un ne possède pas ces qualités, il ne peut certainement pas être l&#039;Imam et le successeur du Prophète (s).(((2)))&lt;br /&gt;
===Infaillibilité===&lt;br /&gt;
{{Article principal|Infaillibilité}}&lt;br /&gt;
L&#039;Imam et le calife doivent être infaillibles, c&#039;est-à-dire exemptes de péchés, d&#039;erreurs et de fautes. Si l&#039;Imam n&#039;est pas infaillible, la confiance en la charia serait détruite ; en effet, si celui qui garde la religion commet un péché ou une erreur, il pourrait ajouter quelque chose à la religion et l&#039;attribuer à Dieu, ou agir de manière injuste dans un jugement. De plus, les gens ordinaires sont sujets à l&#039;erreur et ont besoin de quelqu&#039;un pour les empêcher de commettre des péchés et des erreurs et pour les guider sur le droit chemin. Si l&#039;Imam est également sujet à l&#039;erreur, cela conduirait à la contradiction du but recherché.(((3)))&lt;br /&gt;
===Investiture divine===&lt;br /&gt;
{{Article principal | L&#039;investiture divine}}&lt;br /&gt;
&lt;br /&gt;
L&#039;Imamat et le califat sont la représentation de Dieu et du Prophète (s) ; ils doivent donc être établis par la désignation explicite de Dieu et du Prophète (s). Et puisque la manière de leur établissement est limitée à la désignation par Dieu et le Prophète, les autres n&#039;ont pas le droit de désigner l&#039;Imam ; en effet, si la désignation de l&#039;Imam était laissée à la discrétion des gens, des divergences apparaîtraient parmi eux, chaque groupe choisissant quelqu&#039;un et le préférant aux autres. Ainsi, l&#039;Imam doit absolument être désigné par Dieu et le Prophète (s).(((4)))&lt;br /&gt;
===Science===&lt;br /&gt;
{{Article principal | La science de l&#039;Imam}}&lt;br /&gt;
&lt;br /&gt;
Selon les théologiens chiites, l&#039;Imam et le calife du Prophète (s) doivent être compétents dans tout ce dont les musulmans ont besoin, tant dans les affaires religieuses que mondaines, car l&#039;objectif de la nomination de l&#039;Imam est que les musulmans se tournent vers lui pour résoudre tous leurs problèmes. Les Chiites Imamites considèrent que la science et la compétence en matière d&#039;Imamat doivent être à leur plus haut niveau. Les sources chiites indiquent que l&#039;Imam doit posséder une connaissance absolue et infaillible de toutes les sciences et règles islamiques, car sans cette connaissance, l&#039;objectif de l&#039;Imamat, qui est la préservation et l&#039;explication des règles de la charia, ne sera pas complètement atteint.(((5)))&lt;br /&gt;
&lt;br /&gt;
===Supériorité===&lt;br /&gt;
{{Article principal| La supériorité de l&#039;Imam}}&lt;br /&gt;
&lt;br /&gt;
L&#039;Imam doit être supérieur à tous les musulmans dans toutes les qualités parfaites telles que la science, la sagacité, la générosité, la chevalerie, le courage, la libéralité, la justice, la piété, l&#039;adoration, et être le plus excellent.(((6))) La supériorité de l&#039;Imam est l&#039;une des croyances partagées par certaines sectes telles que les Zaydites et les Ismaéliens. De plus, certains, comme Mulla Sadra, croient que les Imams sont supérieurs à toutes les autres créatures dans leur création et possèdent des degrés plus élevés dans l&#039;ordre de la création.(((7)))&lt;br /&gt;
==Opinion des Sunnites sur l&#039;Imam==&lt;br /&gt;
&lt;br /&gt;
Sa&#039;d ad-Dîn at-Taftâzânî, dans une liste relativement complète, énumère les conditions de l&#039;Imam selon les Sunnites : la maturité, la justice, la liberté, l&#039;être homme, l&#039;ijtihad, le courage, la capacité de gestion et l&#039;appartenance à la tribu Quraysh. Il explique que les quatre premières conditions sont largement acceptées, mais qu&#039;il existe des divergences concernant l&#039;ijtihad, le courage et la compétence ; certains théologiens ne considèrent pas ces conditions comme obligatoires, car la rareté de ces qualités pourrait imposer des devoirs excessifs ou inutiles. L&#039;appartenance à la tribu Quraysh est également acceptée par la majorité des musulmans, mais les Khawârij et certains Mu&#039;tazilites y sont opposés.(((8))) Ahmad b. Abd al-Wahhâb an-Nuwayrî, dans son livre Nihâyat al-Arab fi Funûn al-Adab, mentionne plusieurs catégories de conditions qu&#039;il considère nécessaires pour la fonction d&#039;Imam. Il classe ces conditions en deux catégories : celles qui sont conventionnelles et celles qui sont religieuses. Il poursuit ensuite ses explications en rapportant les conditions de l&#039;Imam dans une classification générale.(((9)))&lt;br /&gt;
==Condition de la lignée==&lt;br /&gt;
La première condition que les sources sunnites ont établie pour l&#039;Imam est l&#039;appartenance à la tribu Quraysh. Selon un hadith auquel les Sunnites se réfèrent, l&#039;Imam doit être Qurayshite. Ainsi, si parmi les Quraysh il n&#039;y a personne qui remplisse les conditions nécessaires pour l&#039;Imamat, l&#039;Imam doit être choisi parmi la tribu la plus proche des Quraysh, à savoir la tribu de Kinânah. En l&#039;absence de personne qualifiée dans cette tribu, il sera choisi parmi d&#039;autres Arabes.(((10)))&lt;br /&gt;
==Science==&lt;br /&gt;
La deuxième condition importante pour l&#039;Imamat selon les Sunnites est la connaissance et la compréhension des affaires religieuses par l&#039;Imam. L&#039;Imam doit être capable de comprendre la gestion des aumônes, la question du jihad et la répartition des butins de guerre. L&#039;argument avancé pour cette condition est que si l&#039;Imam ne possède pas une connaissance suffisante des détails juridiques et religieux, il ne sera pas en mesure de les mettre en œuvre. An-Nawawî a déclaré à ce sujet : « La présence d&#039;un Imam qui ne sait pas ce qu&#039;exige l&#039;Imamat ne diffère en rien de l&#039;absence d&#039;un Imam. »(((11))) Les sources sunnites soulignent que l&#039;Imam doit également avoir de la prudence et du courage dans les affaires publiques, le recrutement de l&#039;armée et la défense des frontières, et posséder la capacité de prendre des décisions justes sans être influencé par ses propres désirs.(((12)))&lt;br /&gt;
&lt;br /&gt;
==Justice==&lt;br /&gt;
Selon ce qui est rapporté dans les sources théologiques sunnites, l&#039;Imam doit être juste et respecter la justice dans ses affaires religieuses et transactionnelles. Selon un argument avancé par certains Sunnites, étant donné que l&#039;état de pervers (Fâsiq) est hors du domaine de la foi, une personne dans cet état ne pourra pas exercer l&#039;Imamat sur les musulmans. Si un érudit de la tribu Quraysh est injuste et un autre est juste mais non érudit, le juste doit être désigné Imam, et si nécessaire, ses décisions doivent être prises en consultation avec les savants religieux.(((13))) Certaines sources théologiques sunnites affirment que l&#039;Imam doit être juste et pieux pour pouvoir guider les gens vers la vérité, car une personne injuste n&#039;a pas la qualification pour diriger. Les Sunnites croient que si des ennemis se soulèvent contre le gouvernement, il faudra, si nécessaire, lutter contre eux. Cependant, la défense d&#039;un gouverneur tyrannique n&#039;est pas permise, et le gouverneur doit s&#039;efforcer de préserver la justice.(((14)))&lt;br /&gt;
Nomination par l&#039;Imam précédent ou l&#039;élection par quarante croyants&lt;br /&gt;
&lt;br /&gt;
Si une personne remplit toutes les conditions nécessaires pour l&#039;Imamat, et si l&#039;Imam précédent l&#039;a désignée comme son successeur, il n&#039;y a aucune objection à sa nomination. Si l&#039;Imam précédent ne l&#039;a pas désigné comme successeur, mais qu&#039;il est nécessaire de nommer un nouvel Imam pour les musulmans, quarante personnes justes et savantes parmi les musulmans peuvent, après étude et ijtihad, élire l&#039;Imam. Dans cette élection, la personne la plus savante doit être choisie en premier, suivie des autres individus non savants.(((15)))&lt;br /&gt;
&lt;br /&gt;
Le juge Abd ar-Rahmân al-Îjî à ce sujet dit : « L&#039;Imamat est établi par le serment d&#039;allégeance, comme dans le cas de l&#039;Imamat d&#039;Abu Bakr… L&#039;unanimité de la communauté n&#039;est pas nécessaire pour établir l&#039;Imamat par le serment d&#039;allégeance, car il n&#039;y a pas de preuve rationnelle ou textuelle qui exige que toute la communauté prête serment pour que l&#039;Imamat soit établi ; un serment d&#039;allégeance de une ou deux personnes parmi les détenteurs du pouvoir de décision suffit pour établir l&#039;Imamat. »(((16)))&lt;br /&gt;
Rejet de certaines conditions de l&#039;Imamat&lt;br /&gt;
&lt;br /&gt;
Étant donné que les trois califes après le décès du Prophète de l&#039;Islam (s) ne possédaient pas certaines des conditions requises pour l&#039;Imamat, cela a conduit à des divergences parmi les savants sunnites concernant les conditions de l&#039;Imam. Le juge Abd ar-Rahmân al-Îjî, dans son livre Mawâqif, mentionne ces conditions et précise en disant : « Les Imamites affirment que l&#039;Imam doit être Hâshimite, connaisseur de toutes les questions religieuses, capable de miracles et infaillible, mais nous ne croyons pas à ces conditions, en raison du califat d&#039;Abu Bakr, car il est devenu Imam sans avoir ces qualités. »(((17)))&lt;br /&gt;
&lt;br /&gt;
Le juge Abu Bakr al-Bâqalânî dit : « Il n&#039;est pas nécessaire que l&#039;Imam soit infaillible en matière de péché et d&#039;erreur ; il n&#039;est pas nécessaire que l&#039;Imam soit le meilleur de la communauté, ni que sa science dépasse celle des autres membres de la communauté. La majorité dit : si l&#039;Imam devient un pervers, ou fait du tort aux gens, ou leur vole leurs biens, ou tue des gens, ou néglige les droits des gens, ou suspend les peines prescrites, il ne sera pas déposé de son Imamat, et il n&#039;est pas permis au peuple de se soulever contre lui ; au contraire, l&#039;obéissance aux Imams est obligatoire, même s&#039;ils sont injustes. »(((18)))&lt;br /&gt;
==Références==&lt;br /&gt;
#Tûsî, Nasîr ad-Dîn, Talkhîs al-Mohassal (en arabe), Beyrouth, Dâr al-Adhwâ’, p. 429-430, 1405 H.&lt;br /&gt;
#	Subhânî, Ja‘far, Dânishnâmiyi Kalâmi Islâmî, vol. 1, Qom, Mu’assisiyi Imam Sâdiq, p. 426-430, 1387 Sh.&lt;br /&gt;
#	Khwânsârî, Muhammad Bâqir, Insâf dar Imâmat, p. 35, Nashri Sadûq, 1371 Sh.&lt;br /&gt;
#	Khwânsârî, Muhammad Bâqir, Insâf dar Imâmat, p. 31, Nashri Sadûq, 1371 Sh.&lt;br /&gt;
#	Subhânî, Ja‘far, Dânishnâmiyi Kalâmi Islâmî, vol. 1, Qom, Mu’assisiyi Imam Sâdiq, p. 426-430, 1387 Sh.&lt;br /&gt;
#	Khwânsârî, Muhammad Bâqir, Insâf dar Imâmat, p. 32, 1371 Sh.&lt;br /&gt;
#	Subhânî, Ja‘far, Dânishnâmiyi Kalâmi Islâmî, vol. 1, Qom, Mu’assisiyi Imam Sâdiq, p. 426-430, 1387 Sh.&lt;br /&gt;
#	Taftâzânî, Sa‘d ad-Dîn, Sharh al-Maqâsid (en arabe), vol. 5, Qom, Manshûrât ash-Sharîf ar-Razî, p. 244, 1409 H.&lt;br /&gt;
#	Nawawî, Ahmad, Nihâyat al-Arb fî Funûn al-Adab (en arabe), vol. 6, Le Caire, Dâr al-Kutub wa al-Wathâ’iq al-Qawmiyya, p. 1, 1423 H.&lt;br /&gt;
#	Nawawî, Ahmad, Nihâyat al-Arb fî Funûn al-Adab (en arabe), vol. 6, Le Caire, Dâr al-Kutub wa al-Wathâ’iq al-Qawmiyya, p. 1-3, 1423 H.&lt;br /&gt;
#	Nawawî, Ahmad, Nihâyat al-Arb fî Funûn al-Adab (en arabe), vol. 6, Le Caire, Dâr al-Kutub wa al-Wathâ’iq al-Qawmiyya, p. 2, 1423 H.&lt;br /&gt;
#	Al-‘Abdarî al-Gharnâtî, Muhammad b. Yûsuf, At-Tâj wa al-Iklîl li Mokhtasar Khalîl (en arabe), vol. 8, s.l., Dâr al-Kutub al-‘Ilmiyya, p. 366, 1416 H.&lt;br /&gt;
#	Nawawî, Ahmad, Nihâyat al-Arb fî Funûn al-Adab (en arabe), vol. 6, Le Caire, Dâr al-Kutub wa al-Wathâ’iq al-Qawmiyya, p. 2-3, 1423 H.&lt;br /&gt;
#	Al-‘Abdarî al-Gharnâtî, Mohammad ibn Yûsuf, At-Tâj wa al-Iklîl li Mokhtasar Khalîl (en arabe), vol. 8, s.l., Dâr al-Kutub al-‘Ilmiyya, p. 366, 1416 H.&lt;br /&gt;
#	Nawawî, Ahmad, Nihâyat al-Arb fî Funûn al-Adab (en arabe), vol. 6, Le Caire, Dâr al-Kutub wa al-Wathâ’iq al-Qawmiyya, p. 1-3, 1423 H.&lt;br /&gt;
#	Qâdî ‘Îjî, Al-Mawâqif, vol. 3, p. 594.&lt;br /&gt;
#	Qâdî ‘Îjî, ‘Abd al-Rahmân ibn Ahmad, Al-Mawâqif, vol. 3, p. 586, Beyrouth, Dâr al-Jîl, 1417 H.&lt;br /&gt;
#	Bâqilânî, Tamhîd al-Awâ’il wa Talkhîs al-Dalâ’il, p. 470, Beyrouth, Mu’assisiyat al-Kutub ath-Thaqâfiyya, 1414 H.&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Article_principal&amp;diff=1665</id>
		<title>Modèle:Article principal</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Article_principal&amp;diff=1665"/>
		<updated>2025-07-11T07:08:30Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : Page redirigée vers Modèle:Main&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[template:main]]&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:%D8%AA%DA%A9%D9%85%DB%8C%D9%84_%D9%85%D9%82%D8%A7%D9%84%D9%87&amp;diff=1664</id>
		<title>Modèle:تکمیل مقاله</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:%D8%AA%DA%A9%D9%85%DB%8C%D9%84_%D9%85%D9%82%D8%A7%D9%84%D9%87&amp;diff=1664"/>
		<updated>2025-07-11T07:05:52Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : Page vide créée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-botworks.js&amp;diff=1593</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons-botworks.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-botworks.js&amp;diff=1593"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// &amp;lt;nowiki&amp;gt; // DO NOT REMOVE THIS LINE EVER&lt;br /&gt;
// fork from mediwiki:TofawikiFinal.js&lt;br /&gt;
var botworks = (function () {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
   &lt;br /&gt;
    function trigFillcat() {&lt;br /&gt;
        if (mw.config.get(&#039;wgNamespaceNumber&#039;) !== 0 &amp;amp;&amp;amp; mw.config.get(&#039;wgNamespaceNumber&#039;) !== 14) { return; }&lt;br /&gt;
        var defer = $.Deferred();&lt;br /&gt;
        $.get(&#039;//rezabot.toolforge.org/hamsang_page.php&#039;, {title: mw.config.get(&#039;wgPageName&#039;)}).then(function () {&lt;br /&gt;
            return $.get(&#039;//rezabot.toolforge.org/fillcat.php&#039;, { title: mw.config.get(&#039;wgPageName&#039;)})&lt;br /&gt;
        }).then(defer.resolve, defer.resolve);&lt;br /&gt;
        console.log(&#039;رده همسنگ شروع شد&#039;);&lt;br /&gt;
        return defer;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function trigMissedRef() {&lt;br /&gt;
        if (mw.config.get(&#039;wgNamespaceNumber&#039;) !== 0) { return; }&lt;br /&gt;
        if ($(&#039;#catlinks a[href=&amp;quot;/wiki/%D8%B1%D8%AF%D9%87:%D8%B5%D9%81%D8%AD%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C_%D8%A8%D8%A7_%DB%8C%D8%A7%D8%AF%DA%A9%D8%B1%D8%AF_%D8%AE%D8%B1%D8%A7%D8%A8_(%D9%81%D9%82%D8%AF%D8%A7%D9%86_%D9%85%D9%86%D8%A8%D8%B9)&amp;quot;]&#039;).length === 0) {return; } //رده:صفحه‌های با یادکرد خراب (فقدان منبع)&lt;br /&gt;
        console.log(&#039;اصلاح منبع ناموجود شروع شد&#039;);&lt;br /&gt;
        var defer = $.Deferred();&lt;br /&gt;
        $.get(&#039;//rezabot.toolforge.org/missedRef.php&#039;, {title: mw.config.get(&#039;wgPageName&#039;)}).then(defer.resolve, defer.resolve);&lt;br /&gt;
        mw.notify(&#039;درخواست اصلاح منبع ناموجود&#039;);&lt;br /&gt;
        return defer;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function trigMissedFileUpload() {&lt;br /&gt;
        if ($(&#039;#catlinks a[href=&amp;quot;/wiki/%D8%B1%D8%AF%D9%87:%D8%B5%D9%81%D8%AD%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C_%D8%AF%D8%A7%D8%B1%D8%A7%DB%8C_%D9%BE%DB%8C%D9%88%D9%86%D8%AF_%D8%AE%D8%B1%D8%A7%D8%A8_%D8%A8%D9%87_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87&amp;quot;]&#039;).length === 0){return;}//رده:صفحه‌های_دارای_پیوند_خراب_به_پرونده&lt;br /&gt;
        if (mw.config.get(&#039;wgNamespaceNumber&#039;) !== 0) { return; }&lt;br /&gt;
        if ($(&#039;[class=new][title^=&amp;quot;پرونده:&amp;quot;]&#039;).length === 0) { return; }&lt;br /&gt;
        console.log(&#039;بارگذاری پرونده ناموجود شروع شد&#039;);&lt;br /&gt;
        var defer = $.Deferred();&lt;br /&gt;
        $.get(&#039;//rezabot.toolforge.org/uploadfairuse.php&#039;, { title: mw.config.get(&#039;wgPageName&#039;)}).then(defer.resolve, defer.resolve);&lt;br /&gt;
        mw.notify(&#039;درخواست بارگذاری تصویر منصفانهٔ ناموجود داده شد.&#039;);&lt;br /&gt;
        return defer;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
        trigFillcat: trigFillcat,&lt;br /&gt;
        trigMissedFileUpload: trigMissedFileUpload,&lt;br /&gt;
        trigMissedRef: trigMissedRef&lt;br /&gt;
    };&lt;br /&gt;
}());&lt;br /&gt;
&lt;br /&gt;
if (typeof window !== &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
    window.botworks = botworks;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-autoed.js&amp;diff=1591</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons-autoed.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-autoed.js&amp;diff=1591"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*global mw*/&lt;br /&gt;
//Selected from [[:en:WP:AutoEd]] scripts&lt;br /&gt;
var autoEd = (function () {&lt;br /&gt;
    &amp;quot;use strict&amp;quot;;&lt;br /&gt;
    //---------------------isbn.js--------------------------------------&lt;br /&gt;
    function autoEdISBN(str) { //MAIN FUNCTION describes list of fixes&lt;br /&gt;
&lt;br /&gt;
        //Allows WikiMagic to work with ISBNs&lt;br /&gt;
        str = str.replace(/ISBN *\-10:|ISBN *\-13:|ISBN *\-10|ISBN *\-13|ISBN:/gi, &amp;quot;ISBN&amp;quot;);&lt;br /&gt;
        //ISSN regexs from [[:en:Wikipedia:AutoWikiBrowser/Settings/ISSN]]&lt;br /&gt;
        str = str.replace(/ISSN\s*(\d)/gi,&amp;quot;ISSN $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISSN (\d)(\d)(\d)(\d)[\.\: ~\=]*(\d)(\d)(\d)([\dx])/gi,&amp;quot;ISSN $1$2$3$4-$5$6$7$8 &amp;quot;);&lt;br /&gt;
        str = str.replace(/ISSN (\d)(\d)(\d)(\d)\-(\d)(\d)(\d)x/gi,&amp;quot;ISSN $1$2$3$4-$5$6$7X&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISSN (\d)(\d)(\d)(\d)\-(\d)(\d)(\d)x/gi,&amp;quot;ISSN $1$2$3$4-$5$6$7X&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        //ISBN regexs from [[:Wikipedia:AutoWikiBrowser/Settings/ISBN-hyph]]&lt;br /&gt;
        str = str.replace(/ISBN(\d)/gi,&amp;quot;ISBN $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/\[\[ *(ISBN [\d\-x]{10,13}) *\]\]/gi,&amp;quot;$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/\[\[ISBN\|(ISBN\s*[^\]]*)\]\]/gi,&amp;quot;$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/\[*ISBN\]*\:*[ \t]+([0-9X\-]+)/gi,&amp;quot;ISBN $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISBN +([\d-]{1,9}) (\d+|X\W)/gi,&amp;quot;ISBN $1$2&amp;quot;);&lt;br /&gt;
        str = str.replace(/\[*ISBN\]*\:* *\[\[Special\:Booksources\/\d*\|([\dxX\- ]+)\]\]/gi,&amp;quot;ISBN $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/\[isbn\]\:* *(\d)/gi,&amp;quot;ISBN $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISBN (\d{10,10}) - *(\d)/gi,&amp;quot;ISBN $1 ,$2&amp;quot;);&lt;br /&gt;
        var loopcount = 0;&lt;br /&gt;
        while (loopcount&amp;lt;10) { //&#039;&lt;br /&gt;
            str = str.replace(/ISBN (\d{1,9}) (\d|x)/gi,&amp;quot;ISBN $1$2&amp;quot;);&lt;br /&gt;
            loopcount++;&lt;br /&gt;
        }&lt;br /&gt;
        str = str.replace(/ISBN (\d{1,9})(x)/gi,&amp;quot;ISBN $1X&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISBN (\d\d\d\d\d\d\d\d\d(\d|x)) +(\d)/gi,&amp;quot;ISBN $1, $3&amp;quot;);&lt;br /&gt;
        str = str.replace(/ISBN ([\d-]{12,12}) (\d|x)/gi,&amp;quot;ISBN $1-$2&amp;quot;);&lt;br /&gt;
        /* broken ISBNs with hyphens */&lt;br /&gt;
        // autoFormatter.js &amp;gt; cleanISBNs &lt;br /&gt;
        str = str.replace(&lt;br /&gt;
            /(^|[\s#&#039;(*&amp;gt;|])(?:(ISBN\d?\s*=\s*)|ISBN(?:-?1[03]\b| *1[03]:)?:?\s*)(9-?7-?[89]-?)?([013][\d\u2010-\u2012\u2212-]{8,}[\dX]\b)/gim,&lt;br /&gt;
            function( $0, $1, $2, $3, $4 ) {&lt;br /&gt;
                return $1 + ( $2 || &#039;ISBN &#039; ) + ( $3 || &#039;&#039; ).replace( /^9\D*7\D*(\d)\D*/, &#039;97$1-&#039; ) + $4&lt;br /&gt;
                    /* Remove all dashes */&lt;br /&gt;
                    .replace( /[^\dX]+/gi, &#039;&#039; )&lt;br /&gt;
                    /* Group 0 for English books */&lt;br /&gt;
                    .replace( /^0([01]\d)(\d{6})\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^0([2-6]\d\d)(\d{5})\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^0(7\d{3}|8[0-4]\d\d)(\d{4})\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^0(8[5-9]\d{3})(\d{3})\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^0(9[0-4]\d{4})(\d\d)\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^0(9[5-9]\d{5})(\d)\B/, &#039;0$1-$2-&#039; )&lt;br /&gt;
                    /* Group 1 for English books */&lt;br /&gt;
                    .replace( /^1(0\d)(\d{6})\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^1([1-3]\d\d)(\d{5})\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^1(4\d{3}|5[0-4]\d\d)(\d{4})\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^1(5[5-9]\d{3}|[67]\d{4}|8[0-5]\d{3}|86[0-8]\d\d|869[0-7]\d)(\d{3})\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^1(869[89]\d\d|8[7-9]\d{4}|9[0-8]\d{4}|99[0-8]\d{3})(\d\d)\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^1(999\d{4})(\d)\B/, &#039;1$1-$2-&#039; )&lt;br /&gt;
                    /* Group 3 for German books */&lt;br /&gt;
                    .replace( /^3(0[0-24-9]|1\d)(\d{6})\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^3(03[0-3]|[2-6]\d\d)(\d{5})\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^3(03[4-6]\d|7\d{3}|8[0-4]\d\d)(\d{4})\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^3(03[7-9]\d\d|8[5-9]\d{3}|95[4-9]\d\d|9[69]\d{3})(\d{3})\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^3(9[0-4]\d{4})(\d\d)\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    .replace( /^3(95[0-3]\d{4}|9[78]\d{5})(\d)\B/, &#039;3$1-$2-&#039; )&lt;br /&gt;
                    /* Add missing dash after group */&lt;br /&gt;
                    .replace( /^([0-57]|6\d\d|8\d|9[0-4]|9[5-8]\d|99[0-8]\d|999\d\d)\B/, &#039;$1-&#039; );&lt;br /&gt;
            }&lt;br /&gt;
        );&lt;br /&gt;
        return str&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //---------------------whitespace.js--------------------------------&lt;br /&gt;
    function autoEdWhitespace(str) { //MAIN FUNCTION describes list of fixes&lt;br /&gt;
&lt;br /&gt;
        str = str.replace(/\t/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        str = str.replace(/^ ? ? \n/gm, &amp;quot;\n&amp;quot;);&lt;br /&gt;
        str = str.replace(/(\n\n)\n+/g, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/== ? ?\n\n==/g, &amp;quot;==\n==&amp;quot;);&lt;br /&gt;
        str = str.replace(/\n\n(\* ?\[?http)/g, &amp;quot;\n$1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        str = str.replace(/^ ? ? \n/gm, &amp;quot;\n&amp;quot;);&lt;br /&gt;
        str = str.replace(/\n\n\*/g, &amp;quot;\n*&amp;quot;);&lt;br /&gt;
        //  str = str.replace(/[ \t][ \t]+/g, &amp;quot; &amp;quot;);&lt;br /&gt;
        str = str.replace(/([=\n]\n)\n+/g, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/ \n/g, &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        //==Headings==&lt;br /&gt;
        str = str.replace(/^(={1,4} )[ ]*([^= ][^=]*[^= ])[ ]*( ={1,4})$/gm, &amp;quot;$1$2$3&amp;quot;);&lt;br /&gt;
        str = str.replace(/^(={1,4})([^= ][^=]*[^= ])[ ]+(={1,4})$/gm, &amp;quot;$1$2$3&amp;quot;);&lt;br /&gt;
        str = str.replace(/^(={1,4})[ ]+([^= ][^=]*[^= ])(={1,4})$/gm, &amp;quot;$1$2$3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        return str;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //---------------------htmltowikitext.js--------------------------------&lt;br /&gt;
    //Convert HTML to wikitext&lt;br /&gt;
    function autoEdHTMLtoWikitext(str) {&lt;br /&gt;
        // &amp;lt;b&amp;gt;, &amp;lt;strong&amp;gt;, &amp;lt;i&amp;gt;, and &amp;lt;em&amp;gt; tags&lt;br /&gt;
        str = str.replace(/&amp;lt;(B|STRONG)[ ]*&amp;gt;((?:[^&amp;lt;&amp;gt;]|&amp;lt;[a-z][^&amp;lt;&amp;gt;]*\/&amp;gt;|&amp;lt;([a-z]+)(?:| [^&amp;lt;&amp;gt;]*)&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;\/\3&amp;gt;)*?)&amp;lt;\/\1[ ]*&amp;gt;/gi, &amp;quot;&#039;&#039;&#039;$2&#039;&#039;&#039;&amp;quot;);&lt;br /&gt;
        str = str.replace(/&amp;lt;(I|EM)[ ]*&amp;gt;((?:[^&amp;lt;&amp;gt;]|&amp;lt;[a-z][^&amp;lt;&amp;gt;]*\/&amp;gt;|&amp;lt;([a-z]+)(?:| [^&amp;lt;&amp;gt;]*)&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;\/\3&amp;gt;)*?)&amp;lt;\/\1[ ]*&amp;gt;/gi, &amp;quot;&#039;&#039;$2&#039;&#039;&amp;quot;);&lt;br /&gt;
        // &amp;lt;/br&amp;gt;, &amp;lt;\br&amp;gt;, &amp;lt;br\&amp;gt;, &amp;lt;BR /&amp;gt;, ...&lt;br /&gt;
        str = str.replace(/&amp;lt;[\\\/]+BR[\\\/\s]*&amp;gt;/gim, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
        str = str.replace(/&amp;lt;[\\\/\s]*BR[\s]*[\\\/]+[\s]*&amp;gt;/gim, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
        // &amp;lt;.br&amp;gt;, &amp;lt;br.&amp;gt;, &amp;lt;Br&amp;gt;, ...&lt;br /&gt;
        str = str.replace(/&amp;lt;[\s\.]*BR[\s\.]*&amp;gt;/gim, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
        // &amp;lt;br&amp;gt;&amp;gt;, &amp;lt;&amp;lt;br /&amp;gt;, &amp;lt;&amp;lt;br &amp;gt;&amp;gt; ...&lt;br /&gt;
        str = str.replace(/&amp;lt;[\s]*(&amp;lt;br[\s\/]*&amp;gt;)/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/(&amp;lt;br[\s\/]*&amp;gt;)[\s]*&amp;gt;/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        str = str.replace(/&amp;lt;[\\\/\s]*REFERENCES[\\\/\s]*&amp;gt;/gim, &amp;quot;&amp;lt;references /&amp;gt;&amp;quot;);&lt;br /&gt;
        // Repeated references tag&lt;br /&gt;
        str = str.replace(/(&amp;lt;references \/&amp;gt;)[\s]*\1/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        // Make sure &amp;lt;H1&amp;gt;, ..., &amp;lt;H6&amp;gt; is after a newline&lt;br /&gt;
        str = str.replace(/([^\r\n ])[\t ]*(&amp;lt;H[1-6][^&amp;lt;&amp;gt;]*&amp;gt;)/gim, &amp;quot;$1\n$2&amp;quot;);&lt;br /&gt;
        // Make sure &amp;lt;/H1&amp;gt;, ..., &amp;lt;/H6&amp;gt; is before a newline&lt;br /&gt;
        str = str.replace(/(&amp;lt;\/H[1-6][^&amp;lt;&amp;gt;]*&amp;gt;)[\t ]*([^\r\n ])/gim, &amp;quot;$1\n$2&amp;quot;);&lt;br /&gt;
        // Remove newlines from inside &amp;lt;H1&amp;gt;, ..., &amp;lt;H6&amp;gt;&lt;br /&gt;
        var loopcount = 0;&lt;br /&gt;
        while (str.search(/&amp;lt;H([1-6])[^&amp;lt;&amp;gt;]*&amp;gt;(?:[^&amp;lt;&amp;gt;]|&amp;lt;\/?[^\/h\r\n][^&amp;lt;&amp;gt;]*&amp;gt;)*?&amp;lt;\/H\1[^&amp;lt;&amp;gt;]*&amp;gt;/gim) &amp;gt;= 0 &amp;amp;&amp;amp; loopcount &amp;lt;= 10) {&lt;br /&gt;
            str = str.replace(/(&amp;lt;H)([1-6])([^&amp;lt;&amp;gt;]*&amp;gt;(?:[^&amp;lt;&amp;gt;]|&amp;lt;\/?[^\/h\r\n][^&amp;lt;&amp;gt;]*&amp;gt;)*?)[\r\n]((?:[^&amp;lt;&amp;gt;]|&amp;lt;\/?[^\/h\r\n][^&amp;lt;&amp;gt;]*&amp;gt;)*?&amp;lt;\/H)\2([^&amp;lt;&amp;gt;]*&amp;gt;)/gim, &amp;quot;$1$2$3 $4$2$5&amp;quot;);&lt;br /&gt;
            loopcount++;&lt;br /&gt;
        }&lt;br /&gt;
        // Replace &amp;lt;H1&amp;gt;, ..., &amp;lt;H6&amp;gt; with wikified section headings&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H1[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H1[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1=$2=$3&#039;);&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H2[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H2[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1==$2==$3&#039;);&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H3[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H3[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1===$2===$3&#039;);&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H4[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H4[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1====$2====$3&#039;);&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H5[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H5[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1=====$2=====$3&#039;);&lt;br /&gt;
        str = str.replace(/(^|[\r\n])[\t ]*&amp;lt;H6[^&amp;lt;&amp;gt;]*&amp;gt;([^\r\n]*?)&amp;lt;\/H6[\r\n\t ]*&amp;gt;[\t ]*([\r\n]|$)/gim, &#039;$1======$2======$3&#039;);&lt;br /&gt;
        //Replace &amp;lt;ol&amp;gt;&amp;lt;li&amp;gt; with #&lt;br /&gt;
        str = str.replace(&lt;br /&gt;
                    /(\&amp;lt;ol\&amp;gt;[\s\S]+\&amp;lt;\/ol\&amp;gt;)/g,&lt;br /&gt;
                    function($1) {&lt;br /&gt;
                        return $1.replace(/[\r\n] *\&amp;lt;li\&amp;gt;/g,&#039;\n# &#039;).replace(/\&amp;lt;\/li\&amp;gt;/g,&#039;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                ).replace(/\n\&amp;lt;\/?ol\&amp;gt;/g,&#039;&#039;)&lt;br /&gt;
        //Replace &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; with *&lt;br /&gt;
        str = str.replace(&lt;br /&gt;
                    /(\&amp;lt;ul\&amp;gt;[\s\S]+\&amp;lt;\/ul\&amp;gt;)/g,&lt;br /&gt;
                    function($1) {&lt;br /&gt;
                        return $1.replace(/[\r\n] *\&amp;lt;li\&amp;gt;/g,&#039;\n* &#039;).replace(/\&amp;lt;\/li\&amp;gt;/g,&#039;&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                ).replace(/\n\&amp;lt;\/?ul\&amp;gt;/g,&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
        return str;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //---------------------headlines.js--------------------------------&lt;br /&gt;
    function autoEdHeadlines(str) { //MAIN FUNCTION describes list of fixes&lt;br /&gt;
&lt;br /&gt;
        // Remove bold from section headings&lt;br /&gt;
        var loopcount = 0;&lt;br /&gt;
        while (str.search(/^[=]{1,5}[^=\r\n]*&#039;&#039;&#039;[^=\r\n]*[=]{1,5}/gim) &amp;gt;= 0 &amp;amp;&amp;amp; loopcount &amp;lt;= 10) { //&#039;&lt;br /&gt;
            str = str.replace(/(^[=]{1,5}[^=\r\n]*)&#039;&#039;&#039;([^=\r\n]*[=]{1,5})[\t ]*/gim, &amp;quot;$1$2&amp;quot;); //&#039;&lt;br /&gt;
            loopcount++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Remove trailing colon from section headings&lt;br /&gt;
        str = str.replace(/(^[=]{1,5}[^=\r\n]*)[:]([\t ]*[=]{1,5})[\t ]*/gim, &amp;quot;$1$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Correct caps in &amp;quot;See also&amp;quot; section&lt;br /&gt;
        str = str.replace(/(==[\t ]*)see also([\t ]*==)/gi, &amp;quot;$1See also$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Change common synonyms for &amp;quot;See also&amp;quot; to &amp;quot;See also&amp;quot;, but only if &amp;quot;See also&amp;quot; doesn&#039;t exist&lt;br /&gt;
        if (!str.match(/=[\t ]*See also[\t ]*=/gi)) {&lt;br /&gt;
            str = str.replace(/(==[\t ]*)(?:related topics|related articles|internal links|also see)([\t ]*==)/gi, &amp;quot;$1See also$2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // Common synonyms for &amp;quot;External links&amp;quot;&lt;br /&gt;
        str = str.replace(/(==[\t ]*)(?:external links?|outside links?|web ?links?|exterior links?)([\t ]*==)/gi, &amp;quot;$1External links$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Capitalization and/or plural of &amp;quot;References&amp;quot;, &amp;quot;Sources&amp;quot;, &amp;quot;Further reading&amp;quot;&lt;br /&gt;
        str = str.replace(/(==[\t ]*)references([\t ]*==)/gi, &amp;quot;$1References$2&amp;quot;);&lt;br /&gt;
        str = str.replace(/(==[\t ]*)sources([\t ]*==)/gi, &amp;quot;$1Sources$2&amp;quot;);&lt;br /&gt;
        str = str.replace(/(==[\t ]*)further readings?([\t ]*==)/gi, &amp;quot;$1Further reading$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        return str;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //---------------------tablestowikitext.js--------------------------------&lt;br /&gt;
    function autoEdTablestoWikitext(str) { //MAIN FUNCTION describes list of fixes&lt;br /&gt;
&lt;br /&gt;
        // Remove newlines from inside table specific tags&lt;br /&gt;
        var loopcount = 0;&lt;br /&gt;
        while (str.search(/(?:&amp;lt;\/?table|&amp;lt;\/?tr|&amp;lt;\/?td|&amp;lt;\/?th)[^&amp;lt;&amp;gt;]*[\r\n]/gi) &amp;gt;= 0 &amp;amp;&amp;amp; loopcount &amp;lt;= 10) {&lt;br /&gt;
            str = str.replace(/((?:&amp;lt;\/?table|&amp;lt;\/?tr|&amp;lt;\/?td|&amp;lt;\/?th)[^&amp;lt;&amp;gt;]*)[\r\n]/gi, &amp;quot;$1 &amp;quot;);&lt;br /&gt;
            loopcount++;&lt;br /&gt;
        }&lt;br /&gt;
        // Remove extra whitespace from inside table specific tags&lt;br /&gt;
        str = str.replace(/(&amp;lt;table|&amp;lt;tr|&amp;lt;td|&amp;lt;th)([^&amp;lt;&amp;gt;]*?)[\s]+(&amp;gt;)/gim, &amp;quot;$1$2$3&amp;quot;);&lt;br /&gt;
        str = str.replace(/(&amp;lt;table|&amp;lt;tr|&amp;lt;td|&amp;lt;th)([^&amp;lt;&amp;gt;]*?)[\s][\s]+/gim, &amp;quot;$1$2 &amp;quot;);&lt;br /&gt;
        // Remove any extra junk &amp;lt;/tr&amp;gt;, &amp;lt;/td&amp;gt;, &amp;lt;/th&amp;gt;, &amp;lt;/table&amp;gt;&lt;br /&gt;
        str = str.replace(/(&amp;lt;\/table|&amp;lt;\/tr|&amp;lt;\/td|&amp;lt;\/th)[^&amp;lt;&amp;gt;]+(&amp;gt;)/gim, &amp;quot;$1$2&amp;quot;);&lt;br /&gt;
        // Remove space whitespace after &amp;lt;/tr&amp;gt;, &amp;lt;/td&amp;gt;, &amp;lt;/th&amp;gt;, &amp;lt;table&amp;gt;&lt;br /&gt;
        str = str.replace(/(&amp;lt;\/tr&amp;gt;|&amp;lt;\/td&amp;gt;|&amp;lt;\/th&amp;gt;|&amp;lt;table[^&amp;lt;&amp;gt;]*&amp;gt;)[\s]+/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        // Remove space before &amp;lt;tr&amp;gt;, &amp;lt;td&amp;gt;, &amp;lt;th&amp;gt;, &amp;lt;/table&amp;gt;&lt;br /&gt;
        str = str.replace(/[\s]+(&amp;lt;\/table&amp;gt;|&amp;lt;tr[^&amp;lt;&amp;gt;]*&amp;gt;|&amp;lt;td[^&amp;lt;&amp;gt;]*&amp;gt;|&amp;lt;th[^&amp;lt;&amp;gt;]*&amp;gt;)/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;table&amp;gt;&#039; with &#039;{|&#039;&lt;br /&gt;
        str = str.replace(/&amp;lt;table( [^&amp;lt;&amp;gt;]*|)&amp;gt;[\s]*/gim, &amp;quot;{|$1\n&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;/table&amp;gt;&#039; with &#039;|}&#039;&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;\/table&amp;gt;/gi, &amp;quot;\n|}&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#039; with &#039;||&#039;&lt;br /&gt;
        str = str.replace(/&amp;lt;\/td[\s]*&amp;gt;[\s]*&amp;lt;td[\s]*&amp;gt;/gim, &amp;quot;||&amp;quot;);&lt;br /&gt;
        str = str.replace(/&amp;lt;\/td[\s]*&amp;gt;[\s]*&amp;lt;td ([^&amp;lt;&amp;gt;]+)&amp;gt;/gim, &amp;quot;|| $1 |&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&#039; with &#039;!!&#039;&lt;br /&gt;
        str = str.replace(/&amp;lt;\/th[\s]*&amp;gt;[\s]*&amp;lt;th[\s]*&amp;gt;/gim, &amp;quot;!!&amp;quot;);&lt;br /&gt;
        str = str.replace(/&amp;lt;\/th[\s]*&amp;gt;[\s]*&amp;lt;th ([^&amp;lt;&amp;gt;]+)&amp;gt;/gim, &amp;quot;!! $1 |&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; and &#039;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&#039; with EOL&lt;br /&gt;
        str = str.replace(/&amp;lt;\/(?:td|th)&amp;gt;[\s]*&amp;lt;\/tr&amp;gt;[\s]/gim, &amp;quot;\n&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;/td&amp;gt;&#039;, &#039;&amp;lt;/th&amp;gt;&#039;, &#039;&amp;lt;/tr&amp;gt;&#039; with EOL&lt;br /&gt;
        str = str.replace(/&amp;lt;\/(?:td|th|tr)&amp;gt;[\s]*/gim, &amp;quot;\n&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;tr&amp;gt;&#039; with &#039;|-&#039;&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;tr&amp;gt;[\s]*/gim, &amp;quot;\n|-\n&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;tr ([^&amp;lt;&amp;gt;]*)&amp;gt;[\s]*/gim, &amp;quot;\n|- $1\n&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;td&amp;gt;&#039; with &amp;quot;|&amp;quot;&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;td&amp;gt;([^\s])/gim, &amp;quot;\n| $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;td&amp;gt;([\s])/gim, &amp;quot;\n|$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;td[\s]*([^&amp;lt;&amp;gt;]*?)[\s]*&amp;gt;([^\s])/gim, &amp;quot;\n| $1 | $2&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;td[\s]*([^&amp;lt;&amp;gt;]*?)[\s]*&amp;gt;([\s])/gim, &amp;quot;\n| $1 |$2&amp;quot;);&lt;br /&gt;
        // Replace &#039;&amp;lt;th&amp;gt;&#039; with &#039;!&#039;&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;th&amp;gt;([^\s])/gim, &amp;quot;\n! $1&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;th&amp;gt;([\s])/gim, &amp;quot;\n!$1&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;th[\s]*([^&amp;lt;&amp;gt;]*?)[\s]*&amp;gt;([^\s])/gim, &amp;quot;\n! $1 | $2&amp;quot;);&lt;br /&gt;
        str = str.replace(/[\s]*&amp;lt;th[\s]*([^&amp;lt;&amp;gt;]*?)[\s]*&amp;gt;([^\s])/gim, &amp;quot;\n! $1 |$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        return str;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //---------------------extrabreaks.js--------------------------------&lt;br /&gt;
    function autoEdExtraBreaks(str) { //MAIN FUNCTION describes list of fixes&lt;br /&gt;
&lt;br /&gt;
        //Usually unneeded BR tags from ends of image descriptions and wikilinks (]]), templates (}}), template parameters (|)&lt;br /&gt;
        str = str.replace(/[\t ]*&amp;lt;[\s\/\.]*br[\s\/\.]*&amp;gt;[\t ]*([\t\n ]*?)(\]\]|}}|\|)/gim, &amp;quot;$1$2&amp;quot;);&lt;br /&gt;
        //BR tag before a list item&lt;br /&gt;
        str = str.replace(/[\t ]*&amp;lt;[\s\/\.]*br[\s\/\.]*&amp;gt;[\t ]*([\s]*?[\n]\*)/gim, &amp;quot;$1&amp;quot;);&lt;br /&gt;
        //BR tag followed by at least two newlines&lt;br /&gt;
        str = str.replace(/[\t ]*&amp;lt;[\s\/\.]*br[\s\/\.]*&amp;gt;[\t ]*([\n])[\t ]*([\n])/gim, &amp;quot;$1$2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        return str;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return {&lt;br /&gt;
        autoEdISBN: autoEdISBN,&lt;br /&gt;
        autoEdWhitespace: autoEdWhitespace,&lt;br /&gt;
        autoEdHTMLtoWikitext: autoEdHTMLtoWikitext,&lt;br /&gt;
        autoEdHeadlines: autoEdHeadlines,&lt;br /&gt;
        autoEdTablestoWikitext: autoEdTablestoWikitext,&lt;br /&gt;
        autoEdExtraBreaks: autoEdExtraBreaks&lt;br /&gt;
    };&lt;br /&gt;
}());&lt;br /&gt;
if (typeof window !== &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
    window.autoEd = autoEd;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-dictionary.js&amp;diff=1589</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons-dictionary.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-dictionary.js&amp;diff=1589"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//To find repeated regex run [[مدیاویکی:Gadget-Extra-Editbuttons-RegexTest.js]] at console &lt;br /&gt;
//Check regex parameters at excel&lt;br /&gt;
var persianToolsDictionary = (function () {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    var dictionary = {};&lt;br /&gt;
&lt;br /&gt;
    dictionary.adjective = &#039;اخمو|ارزان|ارغه|الکن|الکی|انبوه|آبدار|(نا)?آرام|آرغنده|(نا)?آشکار|(نا)?آماده|آهسته|(بی\u200c|با)انضباط|باریک|بد|بدحساب|بددل|بدریخت&#039; +&lt;br /&gt;
        &#039;|بر|براق|برخوردار|برومند|بزدل|بلند|بی‌آلایش|بی دست و پا|بیچاره|بیدار|بیمار|پخ|پخش|پخمه|پرت|پرنور|پست|پشمالو|پلید|پوچ|(سر|نا)?پوشیده|پوک&#039; +&lt;br /&gt;
        &#039;|پیر|پیروز|تار|تپل|ترد|ترسو|تفت|تلخ|تنبل|تندرو|تنک|تنگ|تنها|تهی|تیره|جلو|چابک|چاپلوس|چالاک|چپ|چرند|چسبان|چفته|چیره|خام|خانم|خراب&#039; +&lt;br /&gt;
        &#039;|خرم|خسته|خشک|(نا)?خفته|خفن|خل|خنگ|(نا)?خوانا|خوب|خوشکل|خوش‌گوار|خیراندیش|دراز|درخور|درستکار|دلباخته|دلیر|دوست|دون|رحیم|رسمی|روانی|روشن&#039; +&lt;br /&gt;
        &#039;|ریغو|زبر|زبردست|زبل|زشت|زیبا|زیرک|ژرف|ژنده|ساده|(نا)?سالم|ساکت|سبک|سخاوتمند|سر|سرکش|سفت|سوسول|شایسته|شکیبا|شل|شور|طولانی|عالم|فراوان|فرز&#039; +&lt;br /&gt;
        &#039;|فنی|قرتی|قشنگ|قلنبه|قهرمان|کارکن|کال|کبود|کج|کچل|کر|کلان|کلفت|کم|کند|کنس|کوتاه|کوتوله|کوچک|کوچولو|کودن|گدا|گران|گرسنه|گشاد&#039; +&lt;br /&gt;
        &#039;|گنگ|گود|گیج|لاغر|لبریز|لخت|لغزنده|له|مات|مچاله|مچل|(نا)?مرد|مردمی|مردنی|مست|مشکوک|مفید|ناپدید|ناپسند|ناتوان|ناجنس|ناجور|ناچیز|ناخوش&#039; +&lt;br /&gt;
        &#039;|نادان|(نا)?درست|نازک|ناسپاس|نافرمان|ناگوار|نامرد|نرم|نیازمند|نیرومند|هشیار|هیز|واژگون|ول|ولرم|ولنگار|یکپارچه|یکدست|یکرنگ|(نا)?پیدا&#039; +&lt;br /&gt;
        &#039;|گناهکار|ریز|دانا|کثیف|آقا|(با|بی\u200c)سواد|عاشق|(با|بی\u200c)محبت|صاف|زمخت|فریبنده|پیچیده|سخت|دشوار|تمیز|(نا)?پاکیزه|بزرگ|پهن|پخته|بی‌مورد&#039; +&lt;br /&gt;
        &#039;|بی‌نیاز|(بی\u200c|با|)تجربه&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.personNames = &#039;الله|محمد|علی|حسن|حسین|جواد|باقر|مهدی|تقی|نقی|نازی|نجم|&#039; +&lt;br /&gt;
        &#039;اکرم|کاظم|عباس|منصور|خسرو|محمود|شمس|ملک|شوکت|&#039; +&lt;br /&gt;
        &#039;نصر|همت|جهان|جلال|موسی|ابراهیم|جعفر|احمد|قاسم|کمال|هاشم|&#039; +&lt;br /&gt;
        &#039;شفیع|صمد|شیخ|اسماعیل|ربیع|سلیمان|رستم|شاهرخ|فرخ|شریف|نعمت|&#039; +&lt;br /&gt;
        &#039;امیر|خلیل|جلیل|مجید|اسد|شوکت|رضا|عجل|ید|عبد|سهیل|معصوم|عظیم&#039; +&lt;br /&gt;
        &#039;اکبر|اصغر|بهمن|قلی|پری|صفی&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.wordsWithA = &#039;ورامدن|هرزاب|هراینه|هجوامیز|نوش‌اذر|نواوری|نواموز|نهراب|میراخور|میراب|می‌اید|می‌اورند&#039; +&lt;br /&gt;
        &#039;|ماخذ|مابی|لس‌انجلس|گل‌اذین|گزنداور|گرداوری|گرداوردن|گرداورد|گردامدن|کنداور|کفرامیز|فرودامدن|عطراگین|طنزامیز&#039; +&lt;br /&gt;
        &#039;|شیرابه|شهرا[یئ]ین|شهراشوب|سوداور|سراوردن|سرامدن|سرامد|سراشپز|سحرامیز|زیرابی|زوراور|زهرالود|زهراگین|زردالو|دوداهنگ|دواتشه&#039; +&lt;br /&gt;
        &#039;|دژاهنگ|دژالود|درداور|دردالود|درایند|دراید|دراویختن|دراوری|دراورنده|دراورند|دراوردن|درامده|درامدن|درامد|خیزاب|خشم‌الود&#039; +&lt;br /&gt;
        &#039;|چندش‌اور|جگراور|تیراهن|تهورامیز|تنفراور|تنداب|پسندامدن|پرنداور|پردرامد|پراشوب|پراب|بی‌اب|بوا|بنداوردن&#039; +&lt;br /&gt;
        &#039;|بنداور|سرامدن|برایند|براورده|براوردن|براورد|برامده|برامدن|برامدگی|برامد|براشفته|براشفتن|براشفتگی|براسودن|بداهنگ&#039; +&lt;br /&gt;
        &#039;|بداموزی|بدامدن|بدامد|ائورت|ائسه|ا[یئ]ینه|ا[یئ]ین‌نامه|ا[یئ]ین|ایه‌یاب|ایه|اینه‌دار|اینده|ایندگان|ایفون&#039; +&lt;br /&gt;
        &#039;|ایروپلن|ایدین|ایتم|ایت‌الله|ایات|اویشن|اویسا|اویژه|اویزون|اویزه|اویزند|اویزگر|اویزش&#039; +&lt;br /&gt;
        &#039;|اویزدار|اویزان|اویز|اویخته|اویختنی|اویختن|اویختگی|اویخت|اویتخه|اووکادو|اونگون|اونگان|اونگ|اوند|اوریل&#039; +&lt;br /&gt;
        &#039;|اوریدن|اورنده|اورند|اورنجن|اوردیدن|اورده|اوردنی|اوردن|اوردگه|اوردگاه|اوردجو|اورد&#039; +&lt;br /&gt;
        &#039;|اوایش|اوانویس|اوانگارد|اوانتاژ|اواکس|اواشناس|اوازه‌خوان|اوازهای|اوازه|اوازخوان|اواز|اواره|اوارگی|اوارگان&#039; +&lt;br /&gt;
        &#039;|اوار|اهو|اهنین|اهنگ‌ساز|اهنگرخانه|اهنگر|اهنگ|اهن‌فروش|اهن‌ربا&#039; +&lt;br /&gt;
        &#039;|اهن‌پاره|اهن‌بر|اهن‌الات|اهن|اهک‌سازی|اهک‌پزی|اهک‌پز|اهک|اهسته|اهستگی|اهای|اهان&#039; +&lt;br /&gt;
        &#039;|انیون|انوقت|انود|انها|ان‌گه|ان‌گاه|ان‌که|ان‌کس|انکارا|ان‌قدر|انفولانزا|انفلوانزا&#039; +&lt;br /&gt;
        &#039;|انفارکتوس|ان‌طور|ان‌طرف|ان‌سو|انژیوگرافی|انژین|انزیم|ان‌روی|ان‌روز|ان‌رو|اندوسکوپی|ان‌چه|ان‌جا|انتیل|انتیک&#039; +&lt;br /&gt;
        &#039;|انتی|انتن|انتریک|انتراکت|انتراسیت|انتالیا|اناهیتا|اناناس|انان|انالیز|انالوگ|انارشیسم|اناتومی|اناتولی&#039; +&lt;br /&gt;
        &#039;|انابولیسم|امینه|امیغه|امیغ|امیزه|امیزگار|امیزش|امیز|امیخته|امیختن|امیختگی|امیب|امونیوم|امونیت|امونیاک|امون&#039; +&lt;br /&gt;
        &#039;|اموکسی|اموزه|اموزنده|اموزگان|اموزگار|اموزش‌یار|اموزشگاه|اموزشکده|اموزش|اموزانه|اموزاندن|اموز|اموده|امودن|امودریا&#039; +&lt;br /&gt;
        &#039;|اموخته|اموختن|اموختگی|اموختار|امله|امریکا|امرزیده|امرزیدن|امرزیدگی|امرزنده|امرزگار|امرزش|امرز|امرانه&#039; +&lt;br /&gt;
        &#039;|امدید|امدوشد|امدورفت|امده|امدن|امدگی|امدکردن|امد|امخته|امپلی|امپرسنج|امپر|امبولی|امبولانس|امایه|امایش|امال&#039; +&lt;br /&gt;
        &#039;|اماسیده|اماسیدن|اماسانیدن|اماس|امازون|امارگیر|امارگر|امارشناسی|امارشناس|اماده‌کردن|اماده|امادگی|امادگاه&#039; +&lt;br /&gt;
        &#039;|اماج‌گاه|اماج|اماتور|الیداد|الیاژهای|الیاژ|الونک|الومینیوم|الومینیم|الوزرد|الوده|الودن|الودگی|الودگر|الود|الوچه&#039; +&lt;br /&gt;
        &#039;|الوبخارا|الما|الفرد|الفا|الرژی|التو|الترناتیو|الت|الپ|البومین|البوم|البانی|البالوئی|البالو|الا[یئ]یدن&#039; +&lt;br /&gt;
        &#039;|الایشی|الایش|الای|الاسکا|الاخون|الاچیق|الات|الاباما|اگنه|اگنده|اگندن|اگاهی‌نامه|اگاهی‌دادن|اگاهی|اگاهگان&#039; +&lt;br /&gt;
        &#039;|اگاهانیدن|اگاهانه|اگاهاندن|اگاه|اکوستیک|اکوردئون|اکواریوم|اکنه|اکنش|اکنده|اکندن|اکله|اکسفورد|اکروبات|اکتئون&#039; +&lt;br /&gt;
        &#039;|اکتینیوم|اکانتاسه|اکادمیک|اکادمی|اق‌بانو|اقائی|اقایان|اقامنشانه|اقامنش|اقاسی|اقازاده|اقاجان|اقا&#039; +&lt;br /&gt;
        &#039;|افریننده|افرینش|افرین|افریکانس|افریقا|افریده|افریدن|افریدگار|افتومات|افتابه|افتاب‌مهتاب|افتاب‌گیر&#039; +&lt;br /&gt;
        &#039;|افتاب‌گردان|افتاب‌زده|افتاب‌زدگی|افتاب‌رو|افتاب‌خورده|افتاب‌پرست|افتاب|افاقی|افاق|افات|اغول|اغوشیدن|اغوش|اغل&#039; +&lt;br /&gt;
        &#039;|اغشته|اغشتن|اغشتگی|اغش|اغالش|اغاسی|اغازین|اغازیدن|اغازیان|اغازی|اغازه|اغازگر|اغاز|اغاجی|اغا|اشیل|اشیانی|اشیانه&#039; +&lt;br /&gt;
        &#039;|اشیان‌بندی|اشیان|اشور|اشوبیدن|اشوب‌ناک|اشوب‌گرانه|اشوب‌گر|اشوب‌کن|اشوب‌طلب|اشوب‌انگیز|اشوب|اشنایان|اشناوری&#039; +&lt;br /&gt;
        &#039;|اشناگر|اشناسازی|اشنا|اشکوخیدن|اشکاره|اشکارگر|اشکارساز|اشکارا|اشکار|اشفته|اشفتن|اشفتگی|اشغالدان|اشتی&#039; +&lt;br /&gt;
        &#039;|اشفتگی|اشپزخانه|اشپز|اشامیدنی|اشامیدن|اشامه|اشامنده|اشام|اشاب|اسیمه|اسیمگی|اسیب‌زدن&#039; +&lt;br /&gt;
        &#039;|اسیب‌دیده|اسیب|اسیاکردن|اسیاسنگ|اسیازنه|اسیاچرخ|اسیابان|اسیاب|اسیا|اسوده‌خاطر|اسوده‌حال|اسوده|اسودن&#039; +&lt;br /&gt;
        &#039;|اسودگی|اسمون|اسمانه|اسمان‌سنجی|اسمان‌خراش|اسمانخانه|اسمان|اسکاریس|اسفالت|استینه|استرکاری&#039; +&lt;br /&gt;
        &#039;|استردوز|استانه|اسپیرین|اسپرین|اسائی|اسا[یئ]یدن|اساینده|اسایشگاه|اسایش|اسان‌گیری|اسانسورچی&#039; +&lt;br /&gt;
        &#039;|اسانسور|اسان|اژیرهوائی|اژیر|اژیانه|اژنگ|اژند|اژفنداک|اژدار|اژانس|ازیدن|ازیتا|ازوقه|ازمون‌گر|ازمون‌گاه|ازمون|ازموده&#039; +&lt;br /&gt;
        &#039;|ازمودن|ازمودگی|ازمندی|ازمند|ازمائی|ازمایه|ازماینده|ازمایشی|ازمایشو|ازمایشگاه|ازمایشات|ازمایش|ازمابنده|ازما|ازگار&#039; +&lt;br /&gt;
        &#039;|ازرده|ازردن|ازردگی|ازرد|ازاریدن|ازارنده|ازاررسان|ازاردهنده|ازار|ازادی‌خواه|ازادوار&#039; +&lt;br /&gt;
        &#039;|ازاده|ازادمنش|ازادمرد|ازادگی|ازادگان|ازادکامی|ازادانه|ازاد|اریانا|اریان|اریا|ار[و]غ&#039; +&lt;br /&gt;
        &#039;|ارواره|ارنولد|ارنگ|ارنج|ارنائوت|ارمینا|ارمین|ارمیس|ارمیده|ارمیدن|ارمیدگی|ارمیچر|ارمه|ارمان‌شهر|ارماگدون|ارگون&#039; +&lt;br /&gt;
        &#039;|ارکاد|ارشیو|ارشیتکت|ارشه|ارشام|ارش|ارستن|ارسان|ارژانتین|ارزومندانه|ارزومند|ارزوخواه|ارزو|ارتین|ارتیشو|ارتیست&#039; +&lt;br /&gt;
        &#039;|ارتور|ارتمیس|ارتروز|ارا[یئ]یدن|ارایه‌گر|ارایشی|ارایشگر|ارایشگاه|ارایش|ارامیدن|ارامگاه|ارامگان|ارام‌کردن&#039; +&lt;br /&gt;
        &#039;|ارامش|ارامانیدن|ارام|اراسته|اراستن|اراستگی|ارارات|اراء|اذین|اذرین|اذرنوش|اذرنگ|اذرگون|اذرشهر|اذرسنجی&#039; +&lt;br /&gt;
        &#039;|اذرروز|اذرخش|اذربرزین|اذربایجان|اذر|ادینه|ادیس|ادونیس|ادنیس|ادمی‌گرا|ادمیزاد&#039; +&lt;br /&gt;
        &#039;|ادمیرال|ادمیت|ادم‌گرا|ادم‌کش|ادمک|ادم‌فروش|ادم‌ربا|ادم‌خوار|ادرنالین|ادرس|ادامس|اداب|اخوندک|اخوند&#039; +&lt;br /&gt;
        &#039;|اخور|اخرین|اخرسالار|اخرزمان|اخرت‌شناسی|اخرت|اخرالدواء|اخرالامر|اخر|اختن|احاد|اچمز|اچارکشی|اچاردار|اچار|اجیل|اجودان&#039; +&lt;br /&gt;
        &#039;|اجرنما|اجرکاری|اجرچین|اجرپز|اجان|اثار|اتیه|اتیکا|اتیسا|اتلیه|اتشین|اتش‌ناک|اتش‌گیره|اتش‌گیر&#039; +&lt;br /&gt;
        &#039;|اتش‌گون|اتش‌گرفتن|اتش‌گاه|اتشکده|اتش‌کار|اتش‌فشان|اتش‌زنه|اتش‌زدن|اتش‌زا|اتش‌دان|اتش‌خوار|اتش‌خانه|اتش‌پاره|اتش‌بان|اتش‌بازی|اتش‌بار&#039; +&lt;br /&gt;
        &#039;|اتش|اتریوم|اتروپین|اتابای|اپولو|اپوستروف|اپاندیسیت|اپاندیس|اپارتمان|اپارتاید|اپارات|ابیار|ابونه|ابونمان&#039; +&lt;br /&gt;
        &#039;|ابها|ابنوس|اب‌نمک|اب‌نما|اب‌[ن]شدنی|ابنبات|ابمیوه‌گیر|اب‌میوه|اب‌لیمو|ابله‌کوب|ابله‌رو|ابگینه|ابگیر|ابگونه|ابگون‌ساز&#039; +&lt;br /&gt;
        &#039;|اب‌گوشت|اب‌گرمکن|اب‌گردان|اب‌گذر|اب‌گاه|اب‌کش|اب‌کانه|اب‌کامه|اب‌کار|اب‌فشان|ابغوره|ابشی|ابشور|اب‌شنگولی|ابشش|اب‌شدنی&#039; +&lt;br /&gt;
        &#039;|ابش‌خور|ابشتگاه|ابشار|ابسوار|ابسه|ابسکون|ابستن|ابسالان|اب‌سال|ابزی‌گاه|ابزی‌دان|ابزی|ابریزگاه|ابریزگان|ابریزش&#039; +&lt;br /&gt;
        &#039;|ابریز|ابرومند|ابروریزی|ابرنگ|ابرفت|ابراهه|ابراهک|ابراه|ابدیده|ابدزدک|ابدانک|ابدان|ابداری|ابدارخانه|ابدارچی&#039; +&lt;br /&gt;
        &#039;|ابدارباشی|ابدار|اب‌خیز|ابخوری|ابجی|ابجوفروشی|ابجوساز|ابجوساختن|ابجو|ابتین|ابتنی|اب‌پنیر|اگهی&#039; +&lt;br /&gt;
        &#039;|اب‌پاش|اب‌بها|اب‌بند|اب‌باز|اب‌انبار|ابان|اباژور|اباده|ابادکردن|ابادسازی|ابادان|اباد|اباء&#039;; // first charcter should be آ&lt;br /&gt;
         //removed ان for [[ان بی سی]]&lt;br /&gt;
    // match ZWNJ also as a space or optional&lt;br /&gt;
    dictionary.wordsWithA = dictionary.wordsWithA.replace(/\u200c/g, &#039;[\u200c ]?&#039;);&lt;br /&gt;
&lt;br /&gt;
    dictionary.PresentVerbsWithA = &#039;ارا|ارام|ارامان|ارای|ازار|ازما|ازمای|اسا|اسای|اشام|اشوب|اغار|اغاز|افرین|اکن|اگن|الای&#039; +&lt;br /&gt;
        &#039;|امرز|اموز|اموزان|امیز|اهنج|اور|اویز&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.PastVerbsWithA = &#039;اراماند|ارامید|ارمید|ازرد|ازمود|اشامید|اشفت|اشوبید|اغازید|اغشت|افرید|اکند|اگند|الود&#039; +&lt;br /&gt;
        &#039;|امد|امرزید|اموخت|اموزاند|امیخت|اهیخت|اورد|اویخت&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.needsNasb = &#039;اتفاقا|الزاما|لزوما|یقینا|قطعا|حتما|قاعدتا|طبیعتا|طبعا|قهرا|جدّا|حقیقتا|واقعا|مطمئنا|واضحا|مسلما|تماما|کاملا&#039; +&lt;br /&gt;
        &#039;|عینا|اکیدا|مطلقا|دقیقا|مستقیما|اصولا|اصلا|اصالتا|نسبا|نسبتا|تقریبا|حدودا|معمولا|قانونا|شرعا|اخلاقا|خلقا|احتمالا&#039; +&lt;br /&gt;
        &#039;|استثنائا|اساسا|کلّا|جزئا|مجموعا|جمعا|اجماعا|شدیدا|نهایتا|اقلا|اکثرا|غالبا|عمدتا|ندرتا|بعضا|گاها|صریحا|صراحتا|عموما&#039; +&lt;br /&gt;
        &#039;|اختصاصا|خصوصا|مجملا|اجمالا|اختصارا|مختصرا|مشروحا|ظاهرا|باطنا|عمیقا|ذاتا|فطرتا|جسما|ابتدائا|مقدمتا|بدوا|بعدا|قبلا&#039; +&lt;br /&gt;
        &#039;|جدیدا|سابقا|اخیرا|ابدا|عمرا|تلویحا|علنا|حضورا|غیابا|نیابتا|لطفا|اجبارا|اختیارا|عالما|عمدا|عامدا|تعمدا|متعمدا|عادتا&#039; +&lt;br /&gt;
        &#039;|مستقلا|احتیاطا|احیانا|غفلتا|سهوا|اشتباها|عاجلا|عجالتا|مرتجلا|ارتجالا|سریعا|فورا|دا[یئ]ما|ضرورتا|نقدا|منحصرا|صرفا|دفعتا&#039; +&lt;br /&gt;
        &#039;|کرارا|مکررا|مجددا|مرتبا|مستمرا|متواترا|تدریجا|تصادفا|عملا|فعلا|موقتا|ضمنا|نتیجتا|نوعا|اصطلاحا|جسارتا|بالا ?غیرتا|م[وؤ]کدا&#039; +&lt;br /&gt;
        &#039;|ذیلا|شخصا|مشترکا|مفصلا|رسما|ترجیحا|قلبا|ر[اأ]سا|تو[اأ]ما|متناوبا|متوالیا|متقابلا|متعاقبا|متّ?فقا|مثلا|فرضا|ایضا|مضافا&#039; +&lt;br /&gt;
        &#039;|مصرّ?ا|ارفاقا|انصافا|جهارا|متدرجا|غانما|احتراما|ناچارا|سفارشا|تلفنا|زبانا|کتبا|شفاها|چهارما|ثانیا|ثالثا&#039; +&lt;br /&gt;
        &#039;|رابعا|خامسا|سادسا|سابعا|ثامنا|تاسعا|عاشرا|مخصوصا&#039;;//اولا و سوما می‌تواند یک نام خاص باشد.&lt;br /&gt;
&lt;br /&gt;
    dictionary.HamzehZam =&#039;امیرالمومنین|مومن|رویا|فواد|موذن|مودب|موخر|موتمن|مواخذه|مولف|موثر|مونث|موکد|موسس(?! خورناتسی)|سوال|موسسه&#039;;//for[[ران مودی]]removedمودی&lt;br /&gt;
    dictionary.HamzehZam = dictionary.HamzehZam.replace(/و/g, &#039;وء?&#039;);&lt;br /&gt;
 &lt;br /&gt;
    dictionary.HamzehNasb =&#039;تاکید|تالیف|تاسیس|تاسیسات|تامل|تفال|تاهل|تامین|تا[یئ]ید|تادیب|تاثیر|تاثر|تاثیرات|تاثیرگذار|تاجیل&#039;+&lt;br /&gt;
        &#039;|تاخر|تاخیر|توام|ماوا|مستاجر|مبدا|منشا|متاسفانه|متاسف|متاثر|مساله|متاهل|خلا|ملا عام|رافت|ماخذ|مایوس|ماخوذ&#039;+&lt;br /&gt;
        &#039;|مامور|مامورین|ماموران|ماموریت|مامون|مانوس&#039;;//removed راس، تالم&lt;br /&gt;
&lt;br /&gt;
    dictionary.HamzehAtEnd =&#039;اجزا|احشا|ارتجا|ارتقا|ازا|استثنا|استغنا|استقرا|استمنا|استهزا|اشبا|اشقیا|اشیا|اطبا|اطفا|اعتلا&#039;+&lt;br /&gt;
       &#039;|اغوا|افترا|اقتضا|امنا|انبیا|انقضا|اولیا|ماورا&#039;;//re املا-انشا-اعضا-امضا-انزوا-ابتلا-استعفا-اعلا-اعتنا بدون همزه متداولترند، ابدا می‌تواند با همزه یا نتوین باشد در نتیجه برداشته شد&lt;br /&gt;
&lt;br /&gt;
    dictionary.HamzehAtInside ={&#039;سو&#039;:&#039;استفاده|تعبیر|تفاهم|برداشت&#039;,&#039;ما&#039;:&#039;الشعیر&#039;,&#039;ماورا&#039;:&#039;الطبیعه|النهر&#039;};&lt;br /&gt;
&lt;br /&gt;
    dictionary.AlefMaghsooreh =&#039;یحیا|حتا|خنثا|مبرا|مرتضا|مصطفا|موسا|مجتبا|عیسا|عظما|علارغم&#039;;//removed اولا- الا&lt;br /&gt;
&lt;br /&gt;
    dictionary.colorsNames = &#039;زرد|قرمز|آبی|سفید|سیاه|بنفش|سرخ|گلگون|ازرق|ابیض|نارنجی|توسی|کبود|ارغوانی|سورمه‌ای|سپید|مشکی|کرم|قهوه‌ای|سبز|طلا[یئ]ی&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.persianNumbers = &#039;یک|دو|سه|چهار|پنج|شش|هفت|هشت|نه|ده|یازده|دوازده|سیزده|چهارده|&#039; +&lt;br /&gt;
        &#039;پانزده|شانزده|هفده|هجده|نوزده|بیست|سی|چهل|پنجاه|شصت|هفتاد|هشتاد|نود|صد|هزار&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.addToAbad = &#039;گلون|افضل|رقی|خیر|دل|حاجی|سید|مبارک|گنج|نهنگ|چنگ|&#039; +&lt;br /&gt;
        &#039;سرخ|جنگل|خرم|خونی|دولت|به|نیاز|حفظ|عیش|نجم|بلاش|شیار|&#039; +&lt;br /&gt;
        &#039;فتح|فضل|خدر|ساق|کج|زین|اسلام|بالش|پارس|اسکل|یاخچی|مهندس|قوژد&#039;;&lt;br /&gt;
&lt;br /&gt;
    dictionary.firstNameComplex = {&lt;br /&gt;
        &#039;حمید|احمد|محمود&#039;: &#039;رضا&#039;,&lt;br /&gt;
        &#039;خدا&#039;: &#039;بنده|داد&#039;,&lt;br /&gt;
        &#039;امیر&#039;: &#039;علی|حسین|محمد|رضا|مهدی|عباس&#039;,&lt;br /&gt;
        &#039;محمد&#039;: &#039;حسین|رضا|مهدی|جواد|باقر|کاظم|حسن|علی|امیر|طاها|هادی|وحید|حمید&#039;,&lt;br /&gt;
        &#039;علی&#039;: &#039;رضا|محمد|اصغر|اکبر|قلی&#039;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    dictionary.complexes = {&lt;br /&gt;
        &#039;ویکی&#039;: &#039;پدیا|مدیا|انبار|واژه|نبشته|خبر|کتاب|داده|دیتا|سفر|تراول|دانشگاه&#039;,&lt;br /&gt;
        &#039;ایده&#039;: &#039;آل&#039;,&lt;br /&gt;
        &#039;سخت|نرم|پای|جنگ|نوشت|بد|ماشین&#039;: &#039;افزار&#039;,&lt;br /&gt;
        &#039;جنگ&#039;: &#039;افروز&#039;,&lt;br /&gt;
        &#039;برون|درون|میان&#039;: &#039;شهری&#039;,&lt;br /&gt;
        &#039;میان&#039;: &#039;وعده&#039;,&lt;br /&gt;
        &#039;مشگین|کلان&#039;: &#039;شهر&#039;,&lt;br /&gt;
        &#039;پایه|برنامه&#039;: &#039;ریزی&#039;,&lt;br /&gt;
        &#039;پیاده&#039;: &#039;روی|نظام&#039;,&lt;br /&gt;
        &#039;انسان|شیطان|روان|گیاه|زیست|جانور|نماد|زمین|هوا|ریخت|خدا|جامعه|رفتار|فرهنگ|معرفت|زبان|کتاب|ستاره|اختر|شرق|اسلام|ریشه|آسیب|باستان|حق|روش|مکان|ویروس|میکروب|حشره&#039;: &#039;شناس&#039;,&lt;br /&gt;
        &#039;بهره|نتیجه|فاصله|اندازه|مچ|رونق|دست|پا|پاچه|آبمیوه|آتش|آمار|اوج|کشتی|رأی|رای|یار|تصمیم|گوشه|کناره|گروگان|نمونه&#039;: &#039;گیر&#039;,&lt;br /&gt;
        &#039;بهره&#039;: &#039;مند|کش|دهی&#039;,&lt;br /&gt;
        &#039;ترانه&#039;: &#039;سرا|سرایی|نویس|پرداز&#039;,&lt;br /&gt;
        &#039;اوج&#039;: &#039;دهی&#039;,&lt;br /&gt;
        &#039;این&#039;: &#039;جا|طور&#039;,// «این گونه در حال انقراض است»&lt;br /&gt;
        &#039;آزاد|بد|نیک|مثبت|مصلحت&#039;: &#039;اندیش&#039;,&lt;br /&gt;
        &#039;پناه|ستیزه&#039;: &#039;جو|جویی|جویان&#039;,&lt;br /&gt;
        &#039;هم&#039;: &#039;اندیشی|ارزی|راهی|سانی|رزم|خانه|نشین|سان|بند|مرز|سایه|مسلک|زمان|معنی|گام|اکنون&#039;,&lt;br /&gt;
        &#039;گرم|نرم|سرد|جمع|خنک|خشک|مرطوب|ضرب|تقسیم|کم|سرگرم|خوشحال|ناراحت|سخت|روان|باز|زیبا|زشت|مصرف|تولید&#039;: &#039;کننده|کنندگی|کنندگان&#039;,&lt;br /&gt;
        &#039;خود|درون|پیه&#039;: &#039;سوز&#039;,&lt;br /&gt;
        &#039;دل&#039;: &#039;افروز|آزار|آرا|آزرده|بریده|افسرده|ربا|سوز|خواه|گشا&#039;,&lt;br /&gt;
        &#039;تفریق|افزایش|کاهش|ویرایش|کوزه|سفال|غارت|چپاول|صنعت|امداد|حساب|افسون|ریخته|ترویج|جهاد|زر|درود|سفید|شیشه|حیله|توطئه&#039;: &#039;گر&#039;,&lt;br /&gt;
        &#039;آهن&#039;: &#039;ربا&#039;,&lt;br /&gt;
        &#039;طیف|امکان|اقتصاد|نور|زمان|عمق|گرما|فشار|قطر&#039;: &#039;سنج&#039;,&lt;br /&gt;
        &#039;فیزیک|شیمی|ریاضی|تاریخ|قلم|کتاب|جغرافی&#039;: &#039;دان&#039;,&lt;br /&gt;
        &#039;نام|اسم|سیاهه|خود|فیلم‌نامه|فیلمنامه|کتاب|روان|نسخه|ویکی|پاک|چرک|دست|پشت|زیر|پا|داستان|برنامه|تاریخ|رمان|عریضه|قصه|مقاله&#039;: &#039;نویس&#039;,&lt;br /&gt;
        &#039;فیلم&#039;: &#039;بردار|شناس&#039;,&lt;br /&gt;
        &#039;بار|تخم|کتاب|خواب&#039;: &#039;گذار&#039;,&lt;br /&gt;
        //اسم خاص&lt;br /&gt;
        &#039;شهر&#039;: &#039;بانو|زاد|ناز|نوش&#039;,&lt;br /&gt;
        &#039;اسد|اسماء?|اسم|امان|امر|امیر|امین|انصار|انعام|اهل|اولیاء?|اکرم|باب|بدیع|برات|بقیة|بهاء?|جار|جند|حبیب|حجت|حزب|حفظ|حمد|خلق|خلیل|خیر|ذبیح|ذکر|رام|رحمت|رحم|رسول|روح|سیف|شمس|شکر|صدق|صدیق|عبد|عزت|عزیز|عین|فتح|فرج|فضل|قدرت|لطف|لعنت|نصرت|نصر|نظیر|نعمت|نور|هیبت|ولی|کلام|کلیم|ید|یوم&#039;: &#039;الله|اللهی&#039;,&lt;br /&gt;
        //اسم مرکب&lt;br /&gt;
        &#039;مستند|هوا|روان|جریان|کار|مجسمه|ایمن|پیاده|مقاوم|امن|ساده|بهینه|مرتب|شبیه|ویکی|پل|جاده|راه|استاندارد|فیلم|آماده|رها|آگاه|زیبا|یکسان|ذخیره|استاندار|متمایز|جدا|شخصی|انبوه|خصوصی|رده|آشکار|ساعت|ماشین|زمینه|دست|سبب|مدل&#039;: &#039;ساز&#039;,&lt;br /&gt;
        &#039;احترام|اختلاف|اضطراب|اعجاب|افتخار|بحث|بر|تحسین|ترحم|تعجب|تعصب|تنفر|ت[اأ]ثر|ت[اأ]سف|ت[اأ]مل|جالب|جدل|جنجال|حزن|حیرت|خفت|خوف|خیال|چالش|دل|رعب|رقت|روح|شهوت|شور|شوق|شگفت|طرب|عبرت|غرور|غم|فرح|ملال|مهر|نشاط|نفرت|هراس|هوس|وحشت|ی[اأ]س&#039;: &#039;برانگیز|انگیز&#039;,&lt;br /&gt;
        &#039;چهره|دور|تاریخ|خبر|روزنامه|روز|لرزه&#039;: &#039;نگار&#039;,&lt;br /&gt;
        &#039;زود|آرام|آب|کله|آش|بخار&#039;: &#039;پز&#039;,&lt;br /&gt;
        &#039;زهر&#039;: &#039;آگین&#039;,&lt;br /&gt;
        &#039;مه|پیمان|یخ|سنگ|بت|صف|قانون|ساختار|هنجار&#039;: &#039;شکن&#039;,&lt;br /&gt;
        &#039;مه&#039;: &#039;لقا&#039;,&lt;br /&gt;
        &#039;مک&#039;: &#039;کارتی&#039;,&lt;br /&gt;
        &#039;خون&#039;: &#039;آشام|خوار|بار|گرم|سرد|بها&#039;,&lt;br /&gt;
        &#039;شیطان|خدا|بت|خورشید|مهر|آتش|یزدان|ایزد|گاو|خود|آفتاب|یکتا|پول|حق|مال|میهن|نژاد|وطن|یگانه&#039;: &#039;پرست&#039;,&lt;br /&gt;
        &#039;پا[یئ]ین|بالا|عقب|جلو|کنار|ساده|بزرگ|کوچک|عمیق|رقیق|ضخیم|فهیم|گسترده|مهم|مشکل|آسان&#039;: &#039;تر&#039;,&lt;br /&gt;
        &#039;برگشت|انحنا|برش|انعطاف|مهمان|امکان|تفکیک|تغییر|آسیب|تأثیر|دل|سازش|مهاجر|بازگشت&#039;: &#039;پذیر|ناپذیر&#039;,&lt;br /&gt;
        &#039;دانش&#039;: &#039;آموخته|پژوه|آموختگی&#039;,&lt;br /&gt;
        &#039;بی&#039;: &#039;آلایش|ابهت|احترام|احساس|اختیار|اخلاق|ادب|اراده|ارزش|استعداد|استقامت|اصالت|اعتماد|اعتبار|اقتدار|امان|امنیت|انتها|اهمیت|بها|بو|تدبیر|تربیت|تسلط|تعصب|تقوی|توجه|ثبات|جنبه|حس|دریغ|دست و پا|دین|رنگ|روح|رویه|سابقه|سیم|شرف|شعور|لیاقت|مایه|مبالات|مزد|مزه|مصرف|معرفت|معنی|مقدار|مورد|نتیجه|نزاکت|نهایت|نیاز|وجدان|پایه|پرستیژ|پناه|پول|چاره|چیز|کار|دلیل|خبر|طرف|حجاب|هویت|آزار|گزند|حاشیه|تفاوت|حاصل|نام|فکر|بازگشت|شکل|کران|انگیزه|اندازه|ضرر|زیان|خرد|جوابنویس|ریا|باک|قاعده|حواس|قرار&#039;,&lt;br /&gt;
        //فعل&lt;br /&gt;
        &#039;می&#039;: &#039;دانم&#039;,&lt;br /&gt;
        &#039;عرضه&#039;: &#039;کننده|کنندگان&#039;,&lt;br /&gt;
        //صفت مرکب&lt;br /&gt;
        &#039;ابرو&#039;: &#039;کمان|قیطان&#039;,&lt;br /&gt;
        &#039;ابله&#039;: &#039;گونه&#039;,&lt;br /&gt;
        &#039;ابن&#039;: &#039;الیوم|الوقت|السبیل|عباس&#039;,&lt;br /&gt;
        &#039;اغراق|خشونت|موفقیت&#039;: &#039;آمیز&#039;,&lt;br /&gt;
        &#039;اجاق&#039;: &#039;کور|سوز&#039;,&lt;br /&gt;
        &#039;اجل&#039;: &#039;برگشته&#039;,&lt;br /&gt;
        &#039;اسفل&#039;: &#039;السافلین&#039;,&lt;br /&gt;
        &#039;اطلاع&#039;: &#039;رسان|رسانی|دهی&#039;,&lt;br /&gt;
        &#039;انگشت&#039;: &#039;نما|نشان|پیچ&#039;,&lt;br /&gt;
        &#039;سپاس|نام&#039;: &#039;گزار&#039;,&lt;br /&gt;
        &#039;گوشت|گیاه|علف|شیر&#039;: &#039;خوار&#039;,&lt;br /&gt;
        &#039;آدم&#039;: &#039;برفی|فروش|ربا|خوار&#039;,&lt;br /&gt;
        &#039;آنتی&#039;: &#039;بادی|ژن|ویروس|بیوتیک|اکسیدان&#039;,&lt;br /&gt;
        &#039;تری|دی&#039;: &#039;اکسید&#039;,&lt;br /&gt;
        &#039;آب&#039;: &#039;لمبو|تنی&#039;,&lt;br /&gt;
        &#039;آب|چشمک&#039;: &#039;بازی&#039;,&lt;br /&gt;
        &#039;ریش|سنگ|قلم&#039;: &#039;تراش&#039;,&lt;br /&gt;
        &#039;آزرده&#039;: &#039;جان&#039;,&lt;br /&gt;
        &#039;آزادی|جمهوری|تمامیت|عدالت|وطن|بنفشه|خود|بد&#039;: &#039;خواه&#039;,&lt;br /&gt;
        &#039;آسوده&#039;: &#039;خاطر|وجدان&#039;,&lt;br /&gt;
        &#039;آش&#039;: &#039;دهن|خور&#039;,&lt;br /&gt;
        &#039;آشفته&#039;: &#039;سامان|دماغ|روز&#039;,&lt;br /&gt;
        &#039;آکنده&#039;: &#039;گوش|پهلو&#039;,&lt;br /&gt;
        &#039;آلاخون&#039;: &#039;والاخون&#039;,&lt;br /&gt;
        &#039;آمد&#039;: &#039;نیامد|شد&#039;,&lt;br /&gt;
        //&#039;با&#039;: &#039;پرستیژ|ابهت|احساس|اخلاق|ادب|ارزش|استعداد|استقامت|اصالت|اقتدار|اهمیت|تدبیر|تربیت|تسلط|تعصب|تقوی&#039;,&lt;br /&gt;
        &#039;باب&#039;: &#039;الحوائج&#039;,&lt;br /&gt;
        //&#039;باقی|ته&#039;: &#039;مانده&#039;, bug &amp;gt; باقی مانده بود- ته مانده بود.&lt;br /&gt;
        &#039;باد&#039;: &#039;نشسته|گرفته&#039;,&lt;br /&gt;
        &#039;بار&#039;: &#039;خاطر&#039;,&lt;br /&gt;
        &#039;بالا|پایین|پائین&#039;: &#039;تنه&#039;,&lt;br /&gt;
        &#039;برنامه|طرح|بتون&#039;: &#039;ریز&#039;,&lt;br /&gt;
        &#039;بزرگ&#039;: &#039;سال|مرد&#039;,&lt;br /&gt;
        &#039;بزن&#039;: &#039;دررو|بهادر&#039;,&lt;br /&gt;
        &#039;بد|خوش&#039;: &#039;سیرت|اخلاق|تراش|ترکیب|ریخت|ادا|استیل|اندام|بو|بینانه|بینی|پخت|برخورد|یمن|خوراک|خیم|رکاب|حال|مزه|حساب|پوش|قلق|منظر|نام&#039;,&lt;br /&gt;
        &#039;بد|خوش|آب|خواب|جهان|قطب|قبله|جهت&#039;: &#039;نما&#039;,&lt;br /&gt;
        &#039;بد&#039;: &#039;انجام|پیله|خوی|عنق|کاره|گمان|گوهر|لگام|مسب|مست|مهر&#039;,&lt;br /&gt;
        &#039;بن&#039;: &#039;بست&#039;,&lt;br /&gt;
        &#039;به&#039;: &#039;شمار|سازی|غایت|کارگیری&#039;,&lt;br /&gt;
        &#039;تماشا&#039;: &#039;گر|چی|کننده&#039;,&lt;br /&gt;
        &#039;حمله|بهره|پیشه|شعله|طاعت|طالع&#039;: &#039;ور&#039;,&lt;br /&gt;
        &#039;بین&#039;: &#039;النهرین|الملل|الممالک&#039;,&lt;br /&gt;
        &#039;پاچه&#039;: &#039;ورمالیده&#039;,&lt;br /&gt;
        &#039;تکه|پاره|آتش|آهن|جگر|چهار&#039;: &#039;پاره&#039;,&lt;br /&gt;
        &#039;جهان|خدا|سود|شفا|نیرو|گرما|سرما|آزادی|رهایی&#039;: &#039;بخش&#039;,&lt;br /&gt;
        &#039;پاک&#039;: &#039;نفس|سرشت|دامن|سیرت|منش|دیده&#039;,&lt;br /&gt;
        &#039;پالان&#039;: &#039;سا[یئ]یده&#039;,&lt;br /&gt;
        &#039;پینه|کفش|کلاه|تو|رو|چرخ|پالان&#039;: &#039;دوز&#039;,&lt;br /&gt;
        &#039;پراگنده|تاریک|شکسته|آشفته|آزرده|آسوده|بد|خوش|خونین|سیاه|نازک&#039;: &#039;دل&#039;,&lt;br /&gt;
        &#039;پری&#039;: &#039;نژاد|چهر&#039;,&lt;br /&gt;
        &#039;نیک|پست&#039;: &#039;فطرت&#039;,&lt;br /&gt;
        &#039;پی&#039;: &#039;گم|گرد|فراخ|سپید|نوشت&#039;,&lt;br /&gt;
        &#039;پیچ&#039;: &#039;واپیچ|پیچ&#039;,&lt;br /&gt;
        &#039;سفید|سیاه|قهوه‌ای|قرمز|زرد|سبز|بنفش|گلگون|سرخ|پیروزه|مشک|نیل|مشکین|رنگین&#039;: &#039;فام|پوست&#039;,&lt;br /&gt;
        &#039;پیش&#039;: &#039;مرگ|کسوت|درآمد|آهنگ|شماره|بینی&#039;,//بحران مالی پیش آمد&lt;br /&gt;
        &#039;تازه&#039;: &#039;وارد|خط|نفس&#039;,&lt;br /&gt;
        &#039;سیمان|سفید|گل|چمن|مدد|رو|دست‌اندر|زیان|کهنه|کمک|تازه|پا|سنبل|شیرین|پنهان&#039;: &#039;کار&#039;,&lt;br /&gt;
        &#039;تام&#039;: &#039;الاختیار&#039;,&lt;br /&gt;
        &#039;خوش|زشت|ترش|میانه|پیاده&#039;: &#039;رو&#039;,&lt;br /&gt;
        &#039;ترگل&#039;: &#039;ور گل&#039;,&lt;br /&gt;
        &#039;تکه&#039;: &#039;تکه&#039;,&lt;br /&gt;
        &#039;ته&#039;: &#039;استکان|لیوان|مانده|دیگ&#039;,&lt;br /&gt;
        &#039;تن&#039;: &#039;فروش|آسان|آرا|تن|پرور&#039;,&lt;br /&gt;
        &#039;تند&#039;: &#039;خو|خوی&#039;,&lt;br /&gt;
        &#039;تنگ&#039;: &#039;چشم&#039;,&lt;br /&gt;
        &#039;تی&#039;: &#039;تیش&#039;,&lt;br /&gt;
        &#039;پا|تن|زیر|سبز|سرخ|قرمز&#039;: &#039;پوش&#039;,&lt;br /&gt;
        &#039;تیره&#039;: &#039;روز&#039;,&lt;br /&gt;
        &#039;جامع&#039;: &#039;الشرایط|الاطراف&#039;,&lt;br /&gt;
        &#039;جان&#039;: &#039;سخت|جانی&#039;,&lt;br /&gt;
        &#039;یدک|فرو|نسل|آدم|ویروس|نقشه|سر|آب|آچار|زوزه|تیغ|لوله|ماله|بار|خط|شیره&#039;: &#039;کش&#039;,&lt;br /&gt;
        &#039;کشتی|گرده|دشت|نگه|دید|زمین|جنگل|دروازه|ویکی|شتر|دیده&#039;: &#039;بان&#039;,&lt;br /&gt;
        &#039;چابک&#039;: &#039;سوار|دست&#039;,&lt;br /&gt;
        &#039;ناقاره|نقاره|چاپ|درشکه&#039;: &#039;چی&#039;,&lt;br /&gt;
        &#039;قاره|راه&#039;: &#039;پیما|پیمایی|پیمایان&#039;,&lt;br /&gt;
        &#039;چرب|آذری|ترک|فارسی&#039;: &#039;زبان&#039;,&lt;br /&gt;
        &#039;چشمه&#039;: &#039;چشمه&#039;,&lt;br /&gt;
        &#039;چل&#039;: &#039;کلید|تاج|تکه&#039;,&lt;br /&gt;
        &#039;ناقاره|چوبک|دف|دمبک|ساز|نی|سنتور|تار|ارگ&#039;: &#039;زن&#039;,//رده:نوازندگان گیتار زن اهل&lt;br /&gt;
        &#039;چیره&#039;: &#039;دست&#039;,&lt;br /&gt;
        &#039;پول|فنگ|قالی|ظرف|خشک|لباس&#039;: &#039;شو[ئی]ی&#039;,&lt;br /&gt;
        &#039;چیز&#039;: &#039;فهم&#039;,&lt;br /&gt;
        &#039;حرف&#039;: &#039;شنو&#039;,&lt;br /&gt;
        &#039;حق&#039;: &#039;السکوت|التدریس|الزحمه&#039;,&lt;br /&gt;
        &#039;حکیم&#039;: &#039;باشی&#039;,&lt;br /&gt;
        &#039;حرام|حلال|نجیب|اشراف|غنی&#039;: &#039;زاده|زادگان&#039;,&lt;br /&gt;
        &#039;حیرت|دریا|دل&#039;: &#039;زده&#039;,&lt;br /&gt;
        &#039;حیرت|نام|مقام|یاد|خواب|درد|شگفت|جمع|الزام|چندش|خفقان&#039;: &#039;آور&#039;,&lt;br /&gt;
        &#039;درد|سوز&#039;: &#039;ناک&#039;,&lt;br /&gt;
        &#039;حواس&#039;: &#039;پرت&#039;,&lt;br /&gt;
        &#039;خاله&#039;: &#039;زنک&#039;,&lt;br /&gt;
        &#039;خام&#039;: &#039;طمع|طبع&#039;,&lt;br /&gt;
        &#039;خرده&#039;: &#039;پا|شیشه&#039;,&lt;br /&gt;
        &#039;خشک|آسیمه&#039;: &#039;سر&#039;,&lt;br /&gt;
        &#039;خنده&#039;: &#039;رو|خریش&#039;,&lt;br /&gt;
        &#039;خواجه&#039;: &#039;سرا|تاش&#039;,&lt;br /&gt;
        &#039;سگ|مرغ|خوک&#039;: &#039;دانی&#039;,&lt;br /&gt;
        &#039;خونین&#039;: &#039;جگر|چشم|شهر&#039;,&lt;br /&gt;
        &#039;دایم&#039;: &#039;الخمر&#039;,&lt;br /&gt;
        &#039;دائم&#039;: &#039;الصوم|الخمر&#039;,&lt;br /&gt;
        &#039;درشت&#039;: &#039;خو&#039;,&lt;br /&gt;
        &#039;دست&#039;: &#039;خوش|پاچه|چین|آورد|اندرکاران&#039;,&lt;br /&gt;
        &#039;دم&#039;: &#039;کلفت&#039;,&lt;br /&gt;
        &#039;دندان|دوره|شهر|بیابان|کوچه|گردا&#039;: &#039;گرد&#039;,&lt;br /&gt;
        &#039;دودوزه&#039;: &#039;باز&#039;,&lt;br /&gt;
        &#039;ذوات&#039;: &#039;الارحام|الاذناب&#039;,&lt;br /&gt;
        &#039;ذوی&#039;: &#039;القربی|الاوتار|العقول&#039;,&lt;br /&gt;
        &#039;ذی&#039;: &#039;نفع|صلاحیت|فقار|ربط|قیمت|شعور|علاقه|حیات|فن|روح|عقل|حق&#039;,&lt;br /&gt;
        &#039;چشم|بار|بر|پس|تیر|رو|زیر|غلط|نارنجک&#039;: &#039;انداز&#039;,&lt;br /&gt;
        &#039;رای|شتاب&#039;: &#039;دهنده|دهندگان&#039;,&lt;br /&gt;
        &#039;راست&#039;: &#039;راستکی&#039;,&lt;br /&gt;
        &#039;رحمت&#039;: &#039;العالمین&#039;,&lt;br /&gt;
        &#039;رسم&#039;: &#039;الخط&#039;,&lt;br /&gt;
        &#039;رقیق&#039;: &#039;القلب|الفکر&#039;,&lt;br /&gt;
        &#039;رنگ&#039;: &#039;وارنگ&#039;,&lt;br /&gt;
        &#039;اندود&#039;: &#039;کاری&#039;,&lt;br /&gt;
        &#039;سنگ|ریز|دانه|تک|بزرگ|رنگ&#039;: &#039;دانه&#039;,&lt;br /&gt;
        &#039;رو[یئ]ین|پاد|نرم|سخت&#039;: &#039;تن&#039;,&lt;br /&gt;
        &#039;روح&#039;: &#039;افزا&#039;,&lt;br /&gt;
        &#039;ریش&#039;: &#039;ریش&#039;,&lt;br /&gt;
        &#039;رئیس&#039;: &#039;الوزراء|الرؤسا|جمهور&#039;,&lt;br /&gt;
        &#039;تصویب|کار|واژه|اجازه|تکذیب|شب|پایان|اساس|آ[یئ]ین|زندگی|توافق|نظام&#039;: &#039;نامه&#039;,&lt;br /&gt;
        &#039;زنگی&#039;: &#039;مزاج&#039;,&lt;br /&gt;
        &#039;زوار&#039;: &#039;دررفته&#039;,&lt;br /&gt;
        &#039;زیست&#039;: &#039;محیط|بوم&#039;,&lt;br /&gt;
        &#039;سابق|اخیر|فوق|لازم&#039;: &#039;الذکر&#039;,&lt;br /&gt;
        &#039;سبک&#039;: &#039;مغز|سنگ|عنان|روح|لقا|سایه|سنگین|دست&#039;,&lt;br /&gt;
        &#039;سبک|سنگین&#039;: &#039;وزن&#039;,&lt;br /&gt;
        &#039;سر&#039;: &#039;فراز&#039;,&lt;br /&gt;
        &#039;سرمایه&#039;: &#039;گذار|دار&#039;,&lt;br /&gt;
        &#039;سربه&#039;: &#039;مهر&#039;,&lt;br /&gt;
        &#039;سریع&#039;: &#039;السیر|الانتقال&#039;,&lt;br /&gt;
        &#039;سست&#039;: &#039;زخم|رگ|ریش|عنصر&#039;,&lt;br /&gt;
        &#039;سنگ&#039;: &#039;فرش&#039;,&lt;br /&gt;
        &#039;دو|سه|چهار&#039;: &#039;پایه&#039;,&lt;br /&gt;
        &#039;سیاه&#039;: &#039;مست|سوخته|چرده&#039;,&lt;br /&gt;
        &#039;سینه&#039;: &#039;چاک&#039;,&lt;br /&gt;
        &#039;شب&#039;: &#039;رنگ|پره|اداری|نشین&#039;,&lt;br /&gt;
        &#039;شبانه&#039;: &#039;روزی&#039;,&lt;br /&gt;
        &#039;شکسته&#039;: &#039;ناخن|مزاج&#039;,&lt;br /&gt;
        &#039;شکل&#039;: &#039;گیری|پذیر|دادن&#039;,&lt;br /&gt;
        &#039;شلم&#039;: &#039;شوربا&#039;,&lt;br /&gt;
        &#039;شوخ&#039;: &#039;طبع|رو|دیده|چشم&#039;,&lt;br /&gt;
        &#039;شوم|نیک|بلند|بد|خوش&#039;: &#039;اختر|اقبال&#039;,&lt;br /&gt;
        &#039;شوی&#039;: &#039;دیده&#039;,&lt;br /&gt;
        &#039;شیرین&#039;: &#039;عقل|دهن&#039;,&lt;br /&gt;
        &#039;صد&#039;: &#039;شاخ&#039;,&lt;br /&gt;
        &#039;قتل|بار&#039;: &#039;عام&#039;,&lt;br /&gt;
        &#039;صف&#039;: &#039;آوار&#039;,&lt;br /&gt;
        &#039;ضرب&#039;: &#039;المثل|العجل&#039;,&lt;br /&gt;
        &#039;ضد&#039;: &#039;اسلام|یهودی|انقلاب|حال|هوایی|زنگ|آفتاب|بارداری|سرمایه‌داری|آب|یخ|اطلاعات|شوره&#039;,&lt;br /&gt;
        //طبق بندهای    شماره ..&lt;br /&gt;
        //&#039;طبق|زمان&#039;: &#039;بند&#039;, &lt;br /&gt;
        &#039;طبقه|زمان|درجه|رده|گروه|رتبه|دسته|جمله|تقسیم|بسته|آرماتور|اسکلت|امتیاز|بخش|جدول|جمع|جناح|رنگ|ساز|سایز|سرهم|سطح|شرط|شکم|فاز|فصل|قاب|پارتیشن|چشم|کادر|کمر|گاو|نیم|آب|جیره|خالی|ماست|سیل&#039;: &#039;بند&#039;,&lt;br /&gt;
        &#039;طوطی|عیال&#039;: &#039;وار&#039;,&lt;br /&gt;
        &#039;طویل&#039;: &#039;المدت&#039;,&lt;br /&gt;
        &#039;طبیعت|اسلام|یهودی&#039;: &#039;ستیز|گریز&#039;,&lt;br /&gt;
        &#039;طی&#039;: &#039;الارض&#039;,&lt;br /&gt;
        &#039;هنر|عاشق&#039;: &#039;پیشه&#039;,&lt;br /&gt;
        &#039;عالی&#039;: &#039;نسب|رتبه&#039;,&lt;br /&gt;
        &#039;عام&#039;: &#039;المنفعه&#039;,&lt;br /&gt;
        &#039;عدیم&#039;: &#039;النظیر&#039;,&lt;br /&gt;
        &#039;عقب&#039;: &#039;گرد|نشینی&#039;,&lt;br /&gt;
        &#039;علی&#039;: &#039;البدل|الحساب|الخصوص|رغم&#039;,&lt;br /&gt;
        &#039;غلط&#039;: &#039;غلوط&#039;,&lt;br /&gt;
        &#039;فارغ&#039;: &#039;الاکناف|التحصیل&#039;,&lt;br /&gt;
        &#039;فراخ&#039;: &#039;رو|شکم|بال|کام|دیده|سخن|آهنگ|دست|آستین|ابرو|روزی&#039;,&lt;br /&gt;
        &#039;فرخ&#039;: &#039;لقا|دیم|فال|پی&#039;,&lt;br /&gt;
        &#039;فرمان&#039;: &#039;روا|بر&#039;,&lt;br /&gt;
        &#039;فرنگی|قدسی&#039;: &#039;مآب&#039;,&lt;br /&gt;
        &#039;غیر&#039;: &#039;قابل|متعهد|اخلاقی|شرعی|انسانی|اصولی|مجاز|حضوری|دولتی|نظامی|انتفاعی|منتظره|قانونی|معمولی|ممکن|رسمی|فعال|نفتی|منقول|ارادی|جایز|طبیعی|عادی|عمد|لازم|مسئول|عادلانه|خودی|عاقلانه|کافی&#039;,&lt;br /&gt;
        &#039;وفا|فره|نیاز|جفا|خرد|غیرت|باور|ارزش|نعل|درد|علاقه&#039;: &#039;مند&#039;,&lt;br /&gt;
        &#039;فرو&#039;: &#039;نهادن|داشت|گذاشت|مایه|بست|پاشی|پاشیده&#039;,&lt;br /&gt;
        &#039;خارق|فوق&#039;: &#039;العاده&#039;,&lt;br /&gt;
        &#039;کیلو|سانتی|میلی|دسی|نانو|ولت&#039;: &#039;متر|آمپر|گرم&#039;,&lt;br /&gt;
        &#039;قاچ&#039;: &#039;قاچ&#039;,&lt;br /&gt;
        &#039;قایق|کلک|کشتی&#039;: &#039;ران|سوار&#039;,&lt;br /&gt;
        &#039;قافله&#039;: &#039;سالار&#039;,&lt;br /&gt;
        &#039;قایم&#039;: &#039;الزاویه&#039;,&lt;br /&gt;
        &#039;قره&#039;: &#039;قاطی&#039;,&lt;br /&gt;
        &#039;قریب&#039;: &#039;الوقوع&#039;,&lt;br /&gt;
        &#039;کاه|قطره|دله|آفتابه&#039;: &#039;دزد&#039;,&lt;br /&gt;
        &#039;قوی|آتشین&#039;: &#039;پنجه&#039;,&lt;br /&gt;
        &#039;قیمه&#039;: &#039;قیمه&#039;,&lt;br /&gt;
        &#039;کاسه&#039;: &#039;یکی|سیاه|لیس&#039;,&lt;br /&gt;
        &#039;کج&#039;: &#039;نهاد|خلق|کلاه&#039;,&lt;br /&gt;
        &#039;کوه|صخره|دریا|فضا|صحرا&#039;: &#039;نورد&#039;,&lt;br /&gt;
        &#039;کلاه&#039;: &#039;گوشه|گذار&#039;,&lt;br /&gt;
        &#039;کله&#039;: &#039;معلق|خشک|گنده|خر|شق|پوک&#039;,&lt;br /&gt;
        &#039;زبانه|زمین|ماشین|فرمان|کمان|کنگره|گوشه|دامنه|خانه|پول|مقام|آ[یئ]ینه|عهده|بار|ادامه&#039;: &#039;دار&#039;,&lt;br /&gt;
        &#039;مصاحبه|تهیه|تعیین|استفاده|کنترل|تسهیل&#039;: &#039;شونده|شوندگان|کننده|کنندگان&#039;,&lt;br /&gt;
        &#039;کهن&#039;: &#039;سال|دیار&#039;,&lt;br /&gt;
        &#039;کینه&#039;: &#039;توز|ورز&#039;,&lt;br /&gt;
        &#039;گران&#039;: &#039;مغز|سایه|قدر|رکاب|سرشت|پایه|قیمت|روح|سنگ|جان|سر|فروش&#039;,&lt;br /&gt;
        &#039;فضل&#039;: &#039;فروش&#039;,&lt;br /&gt;
        &#039;گشاده&#039;: &#039;رو|دست&#039;,&lt;br /&gt;
        &#039;گل&#039;: &#039;چهره|ریزان|ریز|باران|آرا|اندام|برگ&#039;,&lt;br /&gt;
        &#039;گاه&#039;: &#039;شمار&#039;,&lt;br /&gt;
        &#039;گلوله&#039;: &#039;باران&#039;,&lt;br /&gt;
        &#039;لازم&#039;: &#039;الوصول|الاجراء&#039;,&lt;br /&gt;
        &#039;مشکوک|معلوم|مجهول|فارغ&#039;: &#039;الحال&#039;,&lt;br /&gt;
        &#039;لت&#039;: &#039;لت|انبان|انبار&#039;,&lt;br /&gt;
        &#039;لسان&#039;: &#039;الغیب&#039;,&lt;br /&gt;
        &#039;مالک&#039;: &#039;الرقاب&#039;,&lt;br /&gt;
        &#039;ماه&#039;: &#039;طلعت&#039;,&lt;br /&gt;
        &#039;مشغول&#039;: &#039;الذمه&#039;,&lt;br /&gt;
        &#039;معظم&#039;: &#039;له|القدر&#039;,&lt;br /&gt;
        &#039;ملی|همجنس|زمینه|آرمان|جهاد|اسلام|بنیاد|چپ|راست|صنعت|طبیعت|برون|درون|شرق|غرب|وجدان|اعتدال|عقل|جمهوری&#039;: &#039;گرا|گرایی&#039;,&lt;br /&gt;
        &#039;تخمین&#039;: &#039;گر&#039;,&lt;br /&gt;
        &#039;میرزا&#039;: &#039;قلمدان|قشمشم|بنویس&#039;,&lt;br /&gt;
        &#039;ناخن&#039;: &#039;خشک&#039;,&lt;br /&gt;
        &#039;نازک&#039;: &#039;نی|نارنجی|خیال&#039;,&lt;br /&gt;
        &#039;جهان|نافه&#039;: &#039;گشا&#039;,&lt;br /&gt;
        &#039;ندید&#039;: &#039;بدید&#039;,&lt;br /&gt;
        &#039;نظریه|رویا|رؤیا&#039;: &#039;پرداز&#039;,&lt;br /&gt;
        &#039;نقشه|وزنه|بهره|کلاه&#039;: &#039;بردار&#039;,&lt;br /&gt;
        &#039;نق&#039;: &#039;نقو&#039;,&lt;br /&gt;
        &#039;نگون&#039;: &#039;طشت|بخت&#039;,&lt;br /&gt;
        &#039;نیک&#039;: &#039;روز|انجام|پی|بخت&#039;,&lt;br /&gt;
        &#039;نیم&#039;: &#039;ته&#039;,&lt;br /&gt;
        &#039;نخست&#039;: &#039;وزیر&#039;,&lt;br /&gt;
        &#039;هرکن&#039;: &#039;پرکن&#039;,&lt;br /&gt;
        &#039;همایون&#039;: &#039;فال|آثار|بخت&#039;,&lt;br /&gt;
        &#039;همه&#039;: &#039;کاره|جانبه|پرسی&#039;,&lt;br /&gt;
        &#039;هیچ&#039;: &#039;کاره|یک|کس|کدام|کجا&#039;,&lt;br /&gt;
        &#039;هیچ|دید|شبان|سحر&#039;: &#039;گاه&#039;,&lt;br /&gt;
        &#039;ول&#039;: &#039;خرج|معطل&#039;,&lt;br /&gt;
        &#039;یکه&#039;: &#039;شناس|بزن|سوار|تاز|چین|بند|بنداز|زا&#039;,&lt;br /&gt;
        &#039;بیماری|مشکل&#039;: &#039;زا&#039;,&lt;br /&gt;
        &#039;یک&#039;: &#039;هوا|هشتم|وقت|وزن|ور|نیمه|نفره|نفس|لا|کم|کله|کلام&#039;,&lt;br /&gt;
        &#039;ابجد&#039;: &#039;خوان&#039;,&lt;br /&gt;
        &#039;ابر&#039;: &#039;آلود|قدرت|ابزار&#039;,&lt;br /&gt;
        &#039;ابو&#039;: &#039;العجب|الکلام|الهول&#039;,&lt;br /&gt;
        &#039;اولو&#039;: &#039;الالباب|الامر|العزم&#039;,&lt;br /&gt;
        &#039;حسب|صاحب|واجب&#039;: &#039;الامر&#039;,&lt;br /&gt;
        &#039;گل|آذر|ناهم|هم|گندم&#039;: &#039;گون&#039;,&lt;br /&gt;
        &#039;آزاد&#039;: &#039;مرد|وار&#039;,&lt;br /&gt;
        &#039;باز&#039;: &#039;خرید|خواست|دید|بین&#039;,&lt;br /&gt;
        &#039;بر&#039;: &#039;هم|آشفتگی|آشفته|پایی&#039;,&lt;br /&gt;
        &#039;بلند&#039;: &#039;آوازه|پایه&#039;,&lt;br /&gt;
        &#039;آتش&#039;: &#039;بس|نشان|سوزی|افروز|افکن|افزار&#039;,&lt;br /&gt;
        &#039;پا&#039;: &#039;برجا|برهنه|بست|پتی&#039;,&lt;br /&gt;
        &#039;پایه|بنیان|بمب&#039;: &#039;گذار|گذاری|گذاران&#039;,&lt;br /&gt;
        //&#039;مادر|خواهر|برادر|فرزند|پدر&#039;: &#039;خوانده&#039;, // bug &amp;gt; وی پدر خوانده شد.(پدر صدا زده شد)&lt;br /&gt;
        &#039;پر&#039;: &#039;ابهام|ابهت|اتلاف|ادا|ادویه|ازدحام|استرس|استقامت|اشک|برخورد|ترانه|تردد|ترشح|تشبیه|تصادف|تعصب|تقلب|تلاش|تملق|شور|هیاهو|بیننده|بار&#039;,&lt;br /&gt;
        &#039;کم&#039;: &#039;محل|بضاعت|کم&#039;,&lt;br /&gt;
        &#039;پر|کم&#039;: &#039;نظیر|کار|تعداد|اشتباه|اشکال|اهمیت|تحرک|تحول|ترافیک|تراکم|تقاضا|تکرار|تنش|تنوع|رو|آب&#039;,&lt;br /&gt;
        &#039;تنگا&#039;: &#039;تنگ&#039;,&lt;br /&gt;
        &#039;تیز&#039;: &#039;پا|دست|دندان|هوش|بین&#039;,&lt;br /&gt;
        &#039;چادر|تخت|زاغه|شهر|ته|آب|کاخ|پایتخت|یکجا|ییلاق|قشلاق&#039;: &#039;نشین&#039;,&lt;br /&gt;
        &#039;چهار&#039;: &#039;شانه&#039;,&lt;br /&gt;
        &#039;فلز|تشابه|ویروس|مکان|طلا|کم|عیب|مسافت|فاصله|جهت|موقعیت|غلط|راه|اشتباه|گنج&#039;: &#039;یاب&#039;,&lt;br /&gt;
        &#039;راه|گاو&#039;: &#039;آهن&#039;,&lt;br /&gt;
        &#039;دستگیر&#039;: &#039;شدگان&#039;,&lt;br /&gt;
        &#039;هماهنگ&#039;: &#039;کننده|کنندگان|کردن&#039;,&lt;br /&gt;
        //&#039;یاد&#039;: &#039;داشت|دهی&#039;, به یاد داشت- به یاد دهی افتادم&lt;br /&gt;
        &#039;یار&#039;: &#039;کشی&#039;,&lt;br /&gt;
        &#039;ی[اأ]س&#039;: &#039;آلود&#039;,&lt;br /&gt;
        &#039;حاضر&#039;: &#039;جواب|یراق&#039;,&lt;br /&gt;
        &#039;خرد&#039;: &#039;سال&#039;,&lt;br /&gt;
        &#039;دو&#039;: &#039;برجی|تخمه|سره|قلو|به‌شک&#039;,&lt;br /&gt;
        &#039;ذو&#039;: &#039;الجلال|العرش|القدر|القوافی|اللسانین|المجد|المکارم|المن|المناقب|المنن|النور|الوجهین|جسدین&#039;,&lt;br /&gt;
        &#039;رنگا&#039;: &#039;رنگ&#039;,&lt;br /&gt;
        &#039;رو&#039;: &#039;سفید|سیاه|باز&#039;,&lt;br /&gt;
        &#039;قهوه|نگار|آبدار|گل|کتاب|رود|زور|نوا|سرد&#039;: &#039;خانه&#039;,&lt;br /&gt;
        &#039;روز&#039;: &#039;افزون|انه&#039;,&lt;br /&gt;
        &#039;زود&#039;: &#039;باور&#039;,&lt;br /&gt;
        &#039;شاد&#039;: &#039;روان|کام|مان|مانه&#039;,&lt;br /&gt;
        &#039;فرا&#039;: &#039;خور|روی&#039;,&lt;br /&gt;
        &#039;کد&#039;: &#039;خدا|بانو&#039;,&lt;br /&gt;
        &#039;لا&#039;: &#039;ابالی|جون|کردار|مذهب|مروت|یتغیر|یتناهی|یزال|یعقل&#039;,&lt;br /&gt;
        &#039;نا&#039;: &#039;جوانمرد|خودآگاه|نجیب|امید|آزموده|آشنا|آگاه|برابر|تمام&#039;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    //----------------------------------------Wrong dictations-----------------------&lt;br /&gt;
    dictionary.forReplace = {&lt;br /&gt;
       &#039;آندروید&#039;: &#039;اندروید&#039;,&lt;br /&gt;
       &#039;واشنگتن&#039;: &#039;واشینگتن&#039;,&lt;br /&gt;
       &#039;واشنگتون&#039;: &#039;واشینگتن&#039;,&lt;br /&gt;
       &#039;واشینگتون&#039;: &#039;واشینگتن&#039;,&lt;br /&gt;
       &#039;زیمباوه&#039;: &#039;زیمبابوه&#039;,&lt;br /&gt;
       &#039;به شخصه&#039;: &#039;بشخصه&#039;,&lt;br /&gt;
       &#039;به‌شخصه&#039;: &#039;بشخصه&#039;,&lt;br /&gt;
       &#039;به عینه&#039;: &#039;بعینه&#039;,&lt;br /&gt;
       &#039;به‌عینه&#039;: &#039;بعینه&#039;,&lt;br /&gt;
       &#039;احمدی نژاد&#039;: &#039;احمدی‌نژاد&#039;,&lt;br /&gt;
       &#039;جابه جا&#039;: &#039;جابه‌جا&#039;,&lt;br /&gt;
       &#039;جا به جا&#039;: &#039;جابه‌جا&#039;,&lt;br /&gt;
       &#039;جا به‌جا&#039;: &#039;جابه‌جا&#039;,&lt;br /&gt;
       &#039;بیت المقدس&#039;: &#039;بیت‌المقدس&#039;,&lt;br /&gt;
       &#039;بی بی سی&#039;: &#039;بی‌بی‌سی&#039;,&lt;br /&gt;
       &#039;پی دی اف&#039;: &#039;پی‌دی‌اف&#039;,&lt;br /&gt;
       &#039;اس ام اس&#039;: &#039;اس‌ام‌اس&#039;,&lt;br /&gt;
       &#039;اف بی آی&#039;: &#039;اف‌بی‌آی&#039;,&lt;br /&gt;
        &#039;می سی سی پی&#039;: &#039;می‌سی‌سی‌پی&#039;,&lt;br /&gt;
        //&#039;میسیسیپی&#039;: &#039;می‌سی‌سی‌پی&#039;,&lt;br /&gt;
        &#039;ویژه‌گی&#039;: &#039;ویژگی&#039;,&lt;br /&gt;
        &#039;دبیر کل&#039;: &#039;دبیرکل&#039;,&lt;br /&gt;
        &#039;دایره‌المعارف&#039;: &#039;دایرةالمعارف&#039;,&lt;br /&gt;
        &#039;دایره المعارف&#039;: &#039;دایرةالمعارف&#039;,&lt;br /&gt;
        &#039;تأئید&#039;: &#039;تأیید&#039;,&lt;br /&gt;
        &#039;تائید&#039;: &#039;تأیید&#039;,&lt;br /&gt;
        &#039;تصویه&#039;: &#039;تصفیه&#039;,&lt;br /&gt;
        &#039;بقیه‌الله&#039;: &#039;بقیةالله&#039;,&lt;br /&gt;
        &#039;بقیه الله&#039;: &#039;بقیةالله&#039;,&lt;br /&gt;
        &#039;بقیة الله&#039;: &#039;بقیةالله&#039;,&lt;br /&gt;
        &#039;دگمه&#039;: &#039;دکمه&#039;,&lt;br /&gt;
        &#039;وحله&#039;: &#039;وهله&#039;,&lt;br /&gt;
        //&#039;هاوی&#039;: &#039;حاوی&#039;, ممکن است اسم خاص باشد&lt;br /&gt;
        &#039;نقطه‌نظر&#039;: &#039;دیدگاه&#039;,&lt;br /&gt;
        &#039;ناچاراً&#039;: &#039;به‌ناچار&#039;,&lt;br /&gt;
        &#039;ناچارا&#039;: &#039;به‌ناچار&#039;,&lt;br /&gt;
        &#039;منیت&#039;: &#039;منی&#039;,&lt;br /&gt;
        &#039;منیٔت&#039;: &#039;منی&#039;,&lt;br /&gt;
        &#039;فرآیند&#039;: &#039;فرایند&#039;,&lt;br /&gt;
        &#039;فرآیندها&#039;: &#039;فرایندها&#039;,&lt;br /&gt;
        &#039;کارآیی&#039;: &#039;کارایی&#039;,&lt;br /&gt;
        &#039;ملاحضه&#039;: &#039;ملاحظه&#039;,&lt;br /&gt;
        &#039;ملیون&#039;: &#039;میلیون&#039;,&lt;br /&gt;
        &#039;ملیارد&#039;: &#039;میلیارد&#039;,&lt;br /&gt;
        &#039;مطمعن&#039;: &#039;مطمئن&#039;,&lt;br /&gt;
        &#039;مرهمت&#039;: &#039;مرحمت&#039;,&lt;br /&gt;
        &#039;مرحم&#039;: &#039;مرهم&#039;,&lt;br /&gt;
        &#039;مونته نگرو&#039;: &#039;مونته‌نگرو&#039;,&lt;br /&gt;
        &#039;محصوب&#039;: &#039;محسوب&#039;,&lt;br /&gt;
        &#039;مذبور&#039;: &#039;مزبور&#039;,&lt;br /&gt;
        &#039;متعصفانه|متاصفانه&#039;: &#039;متأسفانه&#039;,&lt;br /&gt;
        &#039;متغییر&#039;: &#039;متغیر&#039;,&lt;br /&gt;
        &#039;لشگر&#039;: &#039;لشکر&#039;,&lt;br /&gt;
        &#039;لحجه&#039;: &#039;لهجه&#039;,&lt;br /&gt;
        &#039;گاهاً&#039;: &#039;گاهی&#039;,&lt;br /&gt;
        &#039;گاها&#039;: &#039;گاهی&#039;,&lt;br /&gt;
        &#039;کهکیلویه&#039;: &#039;کهگیلویه&#039;,&lt;br /&gt;
        &#039;قائله&#039;: &#039;غائله&#039;,&lt;br /&gt;
        &#039;فارق‌التحصیل&#039;: &#039;فارغ‌التحصیل&#039;,&lt;br /&gt;
        &#039;علاالدین&#039;: &#039;علاءالدین&#039;,&lt;br /&gt;
        &#039;علم‌شنگه&#039;: &#039;الم‌شنگه&#039;,&lt;br /&gt;
        &#039;غلطاندن&#039;: &#039;غلتاندن&#039;,&lt;br /&gt;
        &#039;ظبط&#039;: &#039;ضبط&#039;,&lt;br /&gt;
        &#039;طنبور&#039;: &#039;تنبور&#039;,&lt;br /&gt;
        &#039;طپش&#039;: &#039;تپش&#039;,&lt;br /&gt;
        &#039;ضمینه&#039;: &#039;زمینه&#039;,&lt;br /&gt;
        &#039;زخامت|ذخامت&#039;: &#039;ضخامت&#039;,&lt;br /&gt;
        &#039;زخیم|ذخیم&#039;: &#039;ضخیم&#039;,&lt;br /&gt;
        &#039;صحفه&#039;: &#039;صفحه&#039;,&lt;br /&gt;
        //&#039;سوماً&#039;: &#039;سوم&#039;,&lt;br /&gt;
        //&#039;سوما&#039;: &#039;سوم&#039;,&lt;br /&gt;
        &#039;سفارشاً&#039;: &#039;سفارشی&#039;,&lt;br /&gt;
        &#039;سفارشا&#039;: &#039;سفارشی&#039;,&lt;br /&gt;
        &#039;سرلشگر&#039;: &#039;سرلشکر&#039;,&lt;br /&gt;
        &#039;سپاسگذار&#039;: &#039;سپاسگزار&#039;,&lt;br /&gt;
        &#039;خبرگذار&#039;: &#039;خبرگزار&#039;,&lt;br /&gt;
        &#039;ساتع&#039;: &#039;ساطع&#039;,&lt;br /&gt;
        &#039;زنده‌گی&#039;: &#039;زندگی&#039;,&lt;br /&gt;
        &#039;زباناً&#039;: &#039;زبانی&#039;,&lt;br /&gt;
        &#039;زبانا&#039;: &#039;زبانی&#039;,&lt;br /&gt;
        &#039;رهبریت&#039;: &#039;رهبری&#039;,&lt;br /&gt;
        &#039;در باره&#039;: &#039;درباره&#039;,&lt;br /&gt;
        &#039;دوئیت&#039;: &#039;دوگانگی&#039;,&lt;br /&gt;
        //&#039;دوماً&#039;: &#039;دوم&#039;,&lt;br /&gt;
        //&#039;دوما&#039;: &#039;دوم&#039;,&lt;br /&gt;
        &#039;داوطلبین&#039;: &#039;داوطلبان&#039;,&lt;br /&gt;
        &#039;خوشنود&#039;: &#039;خشنود&#039;,&lt;br /&gt;
        &#039;خوبیت&#039;: &#039;خوبی&#039;,&lt;br /&gt;
        &#039;خوانواده&#039;: &#039;خانواده&#039;,&lt;br /&gt;
        &#039;خواستگاه&#039;: &#039;خاستگاه&#039;,&lt;br /&gt;
        &#039;خرشید&#039;: &#039;خورشید&#039;,&lt;br /&gt;
        &#039;خردن&#039;: &#039;خوردن&#039;,&lt;br /&gt;
        &#039;خانند&#039;: &#039;خوانند&#039;,&lt;br /&gt;
        &#039;خابیدن&#039;: &#039;خوابیدن&#039;,&lt;br /&gt;
        &#039;حظور&#039;: &#039;حضور&#039;,&lt;br /&gt;
        &#039;حظرت&#039;: &#039;حضرت&#039;,&lt;br /&gt;
        &#039;حدلامکان&#039;: &#039;حتی‌الامکان&#039;,&lt;br /&gt;
        &#039;حاظر&#039;: &#039;حاضر&#039;,&lt;br /&gt;
        &#039;چهارماً&#039;: &#039;چهارم&#039;,&lt;br /&gt;
        &#039;چهارما&#039;: &#039;چهارم&#039;,&lt;br /&gt;
        &#039;چارشنبه&#039;: &#039;چهارشنبه&#039;,&lt;br /&gt;
        &#039;جاناً&#039;: &#039;جانی&#039;,&lt;br /&gt;
        //&#039;جانا&#039;: &#039;جانی&#039;, باگ در [[جانا رودین]]&lt;br /&gt;
        &#039;توجیح&#039;: &#039;توجیه&#039;,&lt;br /&gt;
        &#039;توضیع&#039;: &#039;توزیع&#039;,&lt;br /&gt;
        &#039;تلوزیون&#039;: &#039;تلویزیون&#039;,&lt;br /&gt;
        &#039;تضاهر&#039;: &#039;تظاهر&#039;,&lt;br /&gt;
        &#039;ترجیه&#039;: &#039;ترجیح&#039;,&lt;br /&gt;
        &#039;پنچ&#039;: &#039;پنج&#039;,&lt;br /&gt;
        &#039;پزشگی&#039;: &#039;پزشکی&#039;,&lt;br /&gt;
        //&#039;پرفسور&#039;: &#039;پروفسور&#039;, //[[Special:Permalink/20573389#professeur]]&lt;br /&gt;
        &#039;پاتوغ&#039;: &#039;پاتوق&#039;,&lt;br /&gt;
        &#039;بی‌مهابا&#039;: &#039;بی‌محابا&#039;,&lt;br /&gt;
        &#039;بنیانگزار&#039;: &#039;بنیانگذار&#039;,&lt;br /&gt;
        &#039;بلقور&#039;: &#039;بلغور&#039;,&lt;br /&gt;
        &#039;بلاخره&#039;: &#039;بالاخره&#039;,&lt;br /&gt;
        &#039;برخواستن&#039;: &#039;برخاستن&#039;,&lt;br /&gt;
        &#039;برعلیه&#039;: &#039;علیه&#039;,&lt;br /&gt;
        &#039;برخواست&#039;: &#039;برخاست&#039;,&lt;br /&gt;
        &#039;بدیت&#039;: &#039;بدی&#039;,&lt;br /&gt;
        &#039;باطلاق&#039;: &#039;باتلاق&#039;,&lt;br /&gt;
        &#039;بازرسین&#039;: &#039;بازرسان&#039;,&lt;br /&gt;
        &#039;بارگزار&#039;: &#039;بارگذار&#039;,&lt;br /&gt;
        &#039;باجناق&#039;: &#039;باجناغ&#039;,&lt;br /&gt;
        &#039;باباقوری&#039;: &#039;باباغوری&#039;,&lt;br /&gt;
        &#039;آروق&#039;: &#039;آروغ&#039;,&lt;br /&gt;
        &#039;انظباط&#039;: &#039;انضباط&#039;,&lt;br /&gt;
        &#039;التفاط&#039;: &#039;التفات&#039;,&lt;br /&gt;
        &#039;افضل‌تر&#039;: &#039;بهتر&#039;,&lt;br /&gt;
        &#039;افسنطین&#039;: &#039;افسنتین&#039;,&lt;br /&gt;
        &#039;اعلم‌تر&#039;: &#039;داناتر&#039;,&lt;br /&gt;
        &#039;اطو&#039;: &#039;اتو&#039;,&lt;br /&gt;
        &#039;اطراق&#039;: &#039;اتراق&#039;,&lt;br /&gt;
        &#039;اطاق&#039;: &#039;اتاق&#039;,&lt;br /&gt;
        &#039;اصطرلاب&#039;: &#039;اسطرلاب&#039;,&lt;br /&gt;
        &#039;ارتقاع&#039;: &#039;ارتقا&#039;,&lt;br /&gt;
        &#039;اختاپوث&#039;: &#039;اختاپوس&#039;,&lt;br /&gt;
        &#039;ابولفضل&#039;: &#039;ابوالفضل&#039;,&lt;br /&gt;
        &#039;امپراطور&#039;: &#039;امپراتور&#039;,&lt;br /&gt;
        //&#039;طوسی&#039;: &#039;توسی&#039;, خواجه نصیرالدین طوسی را به تبدیل می کرد&lt;br /&gt;
        &#039;آزوقه&#039;: &#039;آذوقه&#039;,&lt;br /&gt;
        &#039;ذکام&#039;: &#039;زکام&#039;,&lt;br /&gt;
        &#039;بگیر و ببند&#039;: &#039;بگیر ببند&#039;,&lt;br /&gt;
        &#039;ساز و کار&#039;: &#039;سازوکار&#039;,&lt;br /&gt;
        &#039;جر و بحث&#039;: &#039;جربحث&#039;,&lt;br /&gt;
        &#039;خوار و بار&#039;: &#039;خواربار&#039;,&lt;br /&gt;
        &#039;احجام&#039;: &#039;حجم‌ها&#039;,&lt;br /&gt;
        &#039;لازم به ذکر است&#039;: &#039;لازم است ذکر شود&#039;,&lt;br /&gt;
        &#039;بدلیل&#039;:&#039;به دلیل&#039;,&lt;br /&gt;
        //برپایه http://www.persianacademy.ir/fa/pishvand.aspx&lt;br /&gt;
        &#039;آن‌را&#039;: &#039;آن را&#039;,&lt;br /&gt;
        &#039;این‌را&#039;: &#039;این را&#039;,&lt;br /&gt;
        &#039;هیات&#039;: &#039;هیئت&#039;,&lt;br /&gt;
        &#039;هیأت&#039;: &#039;هیئت&#039;,&lt;br /&gt;
        &#039;رییسه&#039;: &#039;رئیسه&#039;,&lt;br /&gt;
        &#039;رییس&#039;: &#039;رئیس&#039;,&lt;br /&gt;
        &#039;رییس‌جمهور&#039;: &#039;رئیس‌جمهور&#039;,&lt;br /&gt;
        &#039;مساله&#039;: &#039;مسئله&#039;,&lt;br /&gt;
        &#039;مسأله&#039;: &#039;مسئله&#039;,&lt;br /&gt;
        &#039;همین جا&#039;: &#039;همین‌جا&#039;,&lt;br /&gt;
        &#039;همینجا&#039;: &#039;همین‌جا&#039;,&lt;br /&gt;
        &#039;همینطور&#039;: &#039;همین‌طور&#039;,&lt;br /&gt;
        &#039;همین طور&#039;: &#039;همین‌طور&#039;,&lt;br /&gt;
        &#039;همان جا&#039;: &#039;همان‌جا&#039;,&lt;br /&gt;
        &#039;همانجا&#039;: &#039;همان‌جا&#039;,&lt;br /&gt;
        &#039;به طور&#039;: &#039;به‌طور&#039;,&lt;br /&gt;
        &#039;بطور&#039;: &#039;به‌طور&#039;,&lt;br /&gt;
        &#039;همان طور&#039;: &#039;همان‌طور&#039;,&lt;br /&gt;
        &#039;همانطور&#039;: &#039;همان‌طور&#039;,&lt;br /&gt;
        &#039;هیچکدام&#039;: &#039;هیچ‌کدام&#039;,&lt;br /&gt;
        &#039;هیچ کدام&#039;: &#039;هیچ‌کدام&#039;,&lt;br /&gt;
        &#039;هیچکس&#039;: &#039;هیچ‌کس&#039;,&lt;br /&gt;
        &#039;هیچ کس&#039;: &#039;هیچ‌کس&#039;,&lt;br /&gt;
        &#039;هیچیک&#039;: &#039;هیچ‌یک&#039;,&lt;br /&gt;
        &#039;هیچ یک&#039;: &#039;هیچ‌یک&#039;,&lt;br /&gt;
        &#039;هم‌دیگر&#039;: &#039;همدیگر&#039;,&lt;br /&gt;
        &#039;عبدالهی&#039;: &#039;عبداللهی&#039;,&lt;br /&gt;
        &#039;آن چه&#039;: &#039;آنچه&#039;,&lt;br /&gt;
        &#039;آن‌چه&#039;: &#039;آنچه&#039;,&lt;br /&gt;
        &#039;چنان چه&#039;: &#039;چنانچه&#039;,&lt;br /&gt;
        &#039;چنانچه&#039;: &#039;چنانچه&#039;,&lt;br /&gt;
        &#039;چنان که&#039;: &#039;چنان‌که&#039;,&lt;br /&gt;
        &#039;چنانکه&#039;: &#039;چنان‌که&#039;,&lt;br /&gt;
        &#039;ئیدروژن&#039;: &#039;هیدروژن&#039;,&lt;br /&gt;
        //بدل از تنوین&lt;br /&gt;
        &#039;بعضن&#039;: &#039;بعضا&#039;,&lt;br /&gt;
        &#039;غالبن&#039;: &#039;غالبا&#039;,&lt;br /&gt;
        &#039;کاملن&#039;: &#039;کاملا&#039;,&lt;br /&gt;
        &#039;احتمالن&#039;: &#039;احتمالا&#039;,&lt;br /&gt;
        &#039;اصلن&#039;: &#039;اصلا&#039;,&lt;br /&gt;
        &#039;اشتباهن&#039;: &#039;اشتباها&#039;,&lt;br /&gt;
        &#039;منشاء&#039;: &#039;منشأ&#039;,&lt;br /&gt;
        &#039;مبداء&#039;: &#039;مبدأ&#039;,&lt;br /&gt;
        &#039;موسیقیایی&#039;: &#039;موسیقایی&#039;,&lt;br /&gt;
        &#039;یوگوسلاوی&#039;: &#039;یوگسلاوی&#039;,&lt;br /&gt;
        &#039;وب‌گاه&#039;: &#039;وبگاه&#039;,&lt;br /&gt;
        //وپ:کوته‌نوشت&lt;br /&gt;
        //رجوع کنید&lt;br /&gt;
       &#039;ر\\. ?ک\\.?&#039;: &#039;ر.ک.&#039;,&lt;br /&gt;
        //هجری خورشیدی&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?خ\\.?&#039;: &#039;ه‍.خ&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?[\\u200C ]خ&#039;: &#039;ه‍.خ&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?خ\\.?\\)&#039;: &#039;ه‍.خ)&#039;,&lt;br /&gt;
        &#039;\\([هﻫﻩ]\\u200D?\\. ?خ\\.?&#039;: &#039;(ه‍.خ&#039;,&lt;br /&gt;
        //هجری قمری&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?ق\\.?&#039;: &#039;ه‍.ق&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?[\\u200C ]ق&#039;: &#039;ه‍.ق&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?ق\\.?\\)&#039;: &#039;ه‍.ق)&#039;,&lt;br /&gt;
        &#039;\\([هﻫﻩ]\\u200D?\\. ?ق\\.?&#039;: &#039;(ه‍.ق&#039;,&lt;br /&gt;
        //هجری شمسی&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?ش\\.?&#039;: &#039;ه‍.ش&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?[\u200C ]ش&#039;: &#039;ه‍.ش&#039;,&lt;br /&gt;
        &#039;[هﻫﻩ]\\u200D?\\. ?ش\\.?\\)&#039;: &#039;ه‍.ش)&#039;,&lt;br /&gt;
        &#039;\\([هﻫﻩ]\\u200D?\\. ?ش\\.?&#039;: &#039;(ه‍.ش&#039;,&lt;br /&gt;
        //الی آخر&lt;br /&gt;
        &#039;الخ\\.&#039;: &#039;الخ&#039;,&lt;br /&gt;
        &lt;br /&gt;
        &#039;\\{\\{قرآن&#039;: &#039;\{\{quran&#039;,&lt;br /&gt;
        &#039;\\{\\{متن عربی&#039;: &#039;\{\{arabic&#039;,&lt;br /&gt;
        &#039;\\{\\{عربی&#039;: &#039;\{\{arabic&#039;,&lt;br /&gt;
        &#039;\\{\\{شروع متن\\}\\}&#039;: &#039;\{\{text start\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{سوال\\}\\}&#039;: &#039;\{\{question\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{پایان سوال\\}\\}&#039;: &#039;\{\{question end\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{پاسخ\\}\\}&#039;: &#039;\{\{answer\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{پانویس&#039;: &#039;\{\{footnotes&#039;,&lt;br /&gt;
        &#039;\\{\\{پایان پاسخ\\}\\}&#039;: &#039;\{\{answer end\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{شاخه&#039;: &#039;\{\{tree&#039;,&lt;br /&gt;
        &#039;شاخه اصلی&#039;: &#039;main branch&#039;,&lt;br /&gt;
        &#039;شاخه فرعی۱&#039;: &#039;subbranch1&#039;,&lt;br /&gt;
        &#039;شاخه فرعی۲&#039;: &#039;subbranch2&#039;,&lt;br /&gt;
        &#039;شاخه فرعی۳&#039;: &#039;subbranch3&#039;,&lt;br /&gt;
        &#039;\\{\\{پایان متن\\}\\}&#039;: &#039;\{\{text end\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{یادکرد وب&#039;: &#039;\{\{cite web&#039;,&lt;br /&gt;
        &#039;\\|نویسنده&#039;: &#039;\|author&#039;,&lt;br /&gt;
        &#039;\\|تاریخ&#039;: &#039;\|date&#039;,&lt;br /&gt;
        &#039;\\|وبگاه&#039;: &#039;\|website&#039;,&lt;br /&gt;
        &#039;\\|نشانی&#039;: &#039;\|url&#039;,&lt;br /&gt;
        &#039;\\|تاریخ بازبینی&#039;: &#039;\|URL access date&#039;,&lt;br /&gt;
        &#039;\\{\\{یادکرد کتاب&#039;: &#039;\{\{cite book&#039;,&lt;br /&gt;
        &#039;\\|عنوان&#039;: &#039;\|title&#039;,&lt;br /&gt;
        &#039;\\|سال&#039;: &#039;\|year&#039;,&lt;br /&gt;
        &#039;\\|نام&#039;: &#039;\|first&#039;,&lt;br /&gt;
        &#039;\\|نام خانوادگی&#039;: &#039;\|last&#039;,&lt;br /&gt;
        &#039;\\|ناشر&#039;: &#039;\|publisher&#039;,&lt;br /&gt;
        &#039;\\|جلد&#039;: &#039;\|volume&#039;,&lt;br /&gt;
        &#039;\\|صفحه&#039;: &#039;\|page&#039;,&lt;br /&gt;
        &#039;\\|زبان&#039;: &#039;\|language&#039;,&lt;br /&gt;
        &#039;\\|مکان&#039;: &#039;\|location&#039;,&lt;br /&gt;
        &#039;\\|ویرایش&#039;: &#039;\|edition&#039;,&lt;br /&gt;
        &#039;\\|پیوند&#039;: &#039;\|url&#039;,&lt;br /&gt;
        &#039;\\{\\{یادکرد ژورنال&#039;: &#039;\{\{cite journal&#039;,&lt;br /&gt;
        &#039;\\|نام۱&#039;: &#039;\|first1&#039;,&lt;br /&gt;
        &#039;\\|نام خانوادگی۱&#039;: &#039;\|last1&#039;,&lt;br /&gt;
        &#039;\\|دوره&#039;: &#039;\|volume&#039;,&lt;br /&gt;
        &#039;\\|شماره&#039;: &#039;\|issue&#039;,&lt;br /&gt;
        &#039;\\|عنوان&#039;: &#039;\|title&#039;,&lt;br /&gt;
        &#039;\\|ژورنال&#039;: &#039;\|journal&#039;,&lt;br /&gt;
        &#039;\\{\\{متن و ترجمه&#039;: &#039;\{\{text and translation&#039;,&lt;br /&gt;
        &#039;\\{\\{نقل قول دوقلو تاشو&#039;: &#039;\{\{text and translation&#039;,&lt;br /&gt;
        &#039;\\{\\{نقل قول&#039;: &#039;\{\{quote&#039;,&lt;br /&gt;
        &#039;\\{\\{جعبه نقل‌قول&#039;: &#039;\{\{quote&#039;,&lt;br /&gt;
        &#039;\\{\\{قرآن بزرگ&#039;: &#039;\{\{quran big&#039;,&lt;br /&gt;
        &#039;\\{\\{ستون شروع&#039;: &#039;\{\{col-begin&#039;,&lt;br /&gt;
        &#039;\\{\\{ستون&#039;: &#039;\{\{col-begin&#039;,&lt;br /&gt;
        &#039;\\{\\{پایان\\}\\}&#039;: &#039;\{\{end\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{مدرک\\}\\}&#039;: &#039;\{\{citation needed\}\}&#039;,&lt;br /&gt;
        &#039;\\{\\{یادداشت&#039;: &#039;\{\{note&#039;,&lt;br /&gt;
        &#039;\\{\\{جعبه اطلاعات کتاب&#039;: &#039;\{\{infobox book&#039;,&lt;br /&gt;
        &#039;\\{\\{جعبه اطلاعات آیه&#039;: &#039;\{\{infobox verse&#039;,&lt;br /&gt;
        &#039;\\{\\{جعبه اطلاعات حدیث&#039;: &#039;\{\{infobox hadith&#039;,&lt;br /&gt;
        &#039;\\{\\{جعبه اطلاعات شخص&#039;: &#039;\{\{infobox person&#039;,&lt;br /&gt;
        &#039;\\{\\{درگاه&#039;: &#039;\{\{portal&#039;,&lt;br /&gt;
        &#039;\\{\\{اشتباه نشود&#039;: &#039;\{\{distinguish&#039;,&lt;br /&gt;
        &#039;\\{\\{اصلی&#039;: &#039;\{\{main&#039;,&lt;br /&gt;
        &#039;\\{\\{همچنین ببینید&#039;: &#039;\{\{see also&#039;,&lt;br /&gt;
        &#039;\\|ترجمه&#039;: &#039;\|translation&#039;,&lt;br /&gt;
        &#039;\\|سوره&#039;: &#039;\|sura&#039;,&lt;br /&gt;
        &#039;\\|آیه&#039;: &#039;\|verse&#039;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return dictionary;&lt;br /&gt;
}());&lt;br /&gt;
if (typeof window !== &#039;undefined&#039;) {&lt;br /&gt;
    window.persianToolsDictionary = persianToolsDictionary;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persianwikitools.js&amp;diff=1587</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons-persianwikitools.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persianwikitools.js&amp;diff=1587"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// &amp;lt;nowiki&amp;gt; // DO NOT REMOVE THIS LINE EVER&lt;br /&gt;
/**&lt;br /&gt;
 * Wikipedia specific Persian text style improvement tools&lt;br /&gt;
 * Tests: [[مدیاویکی:Gadget-Extra-Editbuttons-tests.js]] [[وپ:تست]]&lt;br /&gt;
 * See also: [[مدیاویکی:Gadget-Extra-Editbuttons-persiantools.js]]&lt;br /&gt;
 */&lt;br /&gt;
/*global persianTools, persianToolsDictionary, autoEd*/&lt;br /&gt;
var persianWikiTools = (function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	var persianMonths = [&amp;quot;فروردین&amp;quot;, &amp;quot;اردیبهشت&amp;quot;, &amp;quot;خرداد&amp;quot;, &amp;quot;تیر&amp;quot;, &amp;quot;مرداد&amp;quot;, &amp;quot;شهریور&amp;quot;, &amp;quot;مهر&amp;quot;, &amp;quot;آبان&amp;quot;, &amp;quot;آذر&amp;quot;, &amp;quot;دی&amp;quot;, &amp;quot;بهمن&amp;quot;, &amp;quot;اسفند&amp;quot;];&lt;br /&gt;
	//http://www.entitycode.com/&lt;br /&gt;
	var htmlEntityCodes = {&lt;br /&gt;
		&amp;quot;&amp;amp;iexcl;&amp;quot;: &amp;quot;¡&amp;quot;, &amp;quot;&amp;amp;cent;&amp;quot;: &amp;quot;¢&amp;quot;, &amp;quot;&amp;amp;pound;&amp;quot;: &amp;quot;£&amp;quot;, &amp;quot;&amp;amp;curren;&amp;quot;: &amp;quot;¤&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;yen;&amp;quot;: &amp;quot;¥&amp;quot;, &amp;quot;&amp;amp;brvbar;&amp;quot;: &amp;quot;¦&amp;quot;, &amp;quot;&amp;amp;sect;&amp;quot;: &amp;quot;§&amp;quot;, &amp;quot;&amp;amp;copy;&amp;quot;: &amp;quot;©&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;middot;&amp;quot;: &amp;quot;·&amp;quot;, &amp;quot;&amp;amp;times;&amp;quot;: &amp;quot;×&amp;quot;, &amp;quot;&amp;amp;rdquo;&amp;quot;: &amp;quot;”&amp;quot;, &amp;quot;&amp;amp;dagger;&amp;quot;: &amp;quot;†&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;Dagger;&amp;quot;: &amp;quot;‡&amp;quot;, &amp;quot;&amp;amp;euro;&amp;quot;: &amp;quot;€&amp;quot;, &amp;quot;&amp;amp;laquo;&amp;quot;: &amp;quot;«&amp;quot;, &amp;quot;&amp;amp;reg;&amp;quot;: &amp;quot;®&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;deg;&amp;quot;: &amp;quot;°&amp;quot;, &amp;quot;&amp;amp;plusmn;&amp;quot;: &amp;quot;±&amp;quot;, &amp;quot;&amp;amp;sup2;&amp;quot;: &amp;quot;²&amp;quot;, &amp;quot;&amp;amp;sup3;&amp;quot;: &amp;quot;³&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;para;&amp;quot;: &amp;quot;¶&amp;quot;, &amp;quot;&amp;amp;sup1;&amp;quot;: &amp;quot;¹&amp;quot;, &amp;quot;&amp;amp;raquo;&amp;quot;: &amp;quot;»&amp;quot;, &amp;quot;&amp;amp;frac14;&amp;quot;: &amp;quot;¼&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;frac12;&amp;quot;: &amp;quot;½&amp;quot;, &amp;quot;&amp;amp;frac34;&amp;quot;: &amp;quot;¾&amp;quot;, &amp;quot;&amp;amp;iquest;&amp;quot;: &amp;quot;¿&amp;quot;, &amp;quot;&amp;amp;divide;&amp;quot;: &amp;quot;÷&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;ndash;&amp;quot;: &amp;quot;–&amp;quot;, &amp;quot;&amp;amp;mdash;&amp;quot;: &amp;quot;—&amp;quot;, &amp;quot;&amp;amp;lsquo;&amp;quot;: &amp;quot;‘&amp;quot;, &amp;quot;&amp;amp;rsquo;&amp;quot;: &amp;quot;’&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;ldquo;&amp;quot;: &amp;quot;“&amp;quot;, &amp;quot;&amp;amp;trade;&amp;quot;: &amp;quot;™&amp;quot;, &amp;quot;&amp;amp;bull;&amp;quot;: &amp;quot;•&amp;quot;, &amp;quot;&amp;amp;hellip;&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;permil;&amp;quot;: &amp;quot;‰&amp;quot;, &amp;quot;&amp;amp;lsaquo;&amp;quot;: &amp;quot;‹&amp;quot;, &amp;quot;&amp;amp;rsaquo;&amp;quot;: &amp;quot;›&amp;quot;, &amp;quot;&amp;amp;larr;&amp;quot;: &amp;quot;←&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;uarr;&amp;quot;: &amp;quot;↑&amp;quot;, &amp;quot;&amp;amp;rarr;&amp;quot;: &amp;quot;→&amp;quot;, &amp;quot;&amp;amp;darr;&amp;quot;: &amp;quot;↓&amp;quot;, &amp;quot;&amp;amp;harr;&amp;quot;: &amp;quot;↔&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;crarr;&amp;quot;: &amp;quot;↵&amp;quot;, &amp;quot;&amp;amp;minus;&amp;quot;: &amp;quot;−&amp;quot;, &amp;quot;&amp;amp;radic;&amp;quot;: &amp;quot;√&amp;quot;, &amp;quot;&amp;amp;infin;&amp;quot;: &amp;quot;∞&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;loz;&amp;quot;: &amp;quot;◊&amp;quot;, &amp;quot;&amp;amp;spades;&amp;quot;: &amp;quot;♠&amp;quot;, &amp;quot;&amp;amp;rfloor;&amp;quot;: &amp;quot;⌋&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;: &amp;quot; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;ne;&amp;quot;: &amp;quot;≠&amp;quot;, &amp;quot;&amp;amp;ap;&amp;quot;: &amp;quot;≈&amp;quot;, &amp;quot;&amp;amp;approx;&amp;quot;: &amp;quot;≈&amp;quot;, &amp;quot;&amp;amp;asymp;&amp;quot;: &amp;quot;≈&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;rceil;&amp;quot;: &amp;quot;⌉&amp;quot;, &amp;quot;&amp;amp;lfloor;&amp;quot;: &amp;quot;⌊&amp;quot;, &amp;quot;&amp;amp;diams;&amp;quot;: &amp;quot;♦&amp;quot;, &amp;quot;&amp;amp;auml;&amp;quot;: &amp;quot;ä&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;ouml;&amp;quot;: &amp;quot;ö&amp;quot;, &amp;quot;&amp;amp;uuml;&amp;quot;: &amp;quot;ü&amp;quot;, &amp;quot;&amp;amp;szlig;&amp;quot;: &amp;quot;ß&amp;quot;, &amp;quot;&amp;amp;aring;&amp;quot;: &amp;quot;å&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;oline; &amp;quot;: &amp;quot;‾ &amp;quot;, &amp;quot;&amp;amp;aelig;&amp;quot;: &amp;quot;æ&amp;quot;, &amp;quot;&amp;amp;ccedil;&amp;quot;: &amp;quot;ç&amp;quot;, &amp;quot;&amp;amp;ntilde;&amp;quot;: &amp;quot;ñ&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;acirc;&amp;quot;: &amp;quot;â&amp;quot;, &amp;quot;&amp;amp;aacute;&amp;quot;: &amp;quot;á&amp;quot;, &amp;quot;&amp;amp;agrave;&amp;quot;: &amp;quot;à&amp;quot;, &amp;quot;&amp;amp;#36;&amp;quot;: &amp;quot;$&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;clubs;&amp;quot;: &amp;quot;♣&amp;quot;, &amp;quot;&amp;amp;hearts;&amp;quot;: &amp;quot;♥&amp;quot;, &amp;quot;&amp;amp;Prime;&amp;quot;: &amp;quot;″&amp;quot;, &amp;quot;&amp;amp;prime;&amp;quot;: &amp;quot;′&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;lceil;&amp;quot;: &amp;quot;⌈&amp;quot;, &amp;quot;&amp;amp;mldr;&amp;quot;: &amp;quot;…&amp;quot;, &amp;quot;&amp;amp;bullet;&amp;quot;: &amp;quot;•&amp;quot;, &amp;quot;&amp;amp;grave;&amp;quot;: &amp;quot;`&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;pm;&amp;quot;: &amp;quot;±&amp;quot;, &amp;quot;&amp;amp;acute;&amp;quot;: &amp;quot;´&amp;quot;, &amp;quot;&amp;amp;centerdot;&amp;quot;: &amp;quot;·&amp;quot;, &amp;quot;&amp;amp;half;&amp;quot;: &amp;quot;½&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;Auml;&amp;quot;: &amp;quot;Ä&amp;quot;, &amp;quot;&amp;amp;Ouml;&amp;quot;: &amp;quot;Ö&amp;quot;, &amp;quot;&amp;amp;Uuml;&amp;quot;: &amp;quot;Ü&amp;quot;, &amp;quot;&amp;amp;rsquor;&amp;quot;: &amp;quot;’&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;lsquor;&amp;quot;: &amp;quot;‚&amp;quot;, &amp;quot;&amp;amp;sbquo;&amp;quot;: &amp;quot;‚&amp;quot;, &amp;quot;&amp;amp;rdquor;&amp;quot;: &amp;quot;”&amp;quot;, &amp;quot;&amp;amp;bdquo;&amp;quot;: &amp;quot;„&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;ldquor;&amp;quot;: &amp;quot;„&amp;quot;, &amp;quot;&amp;amp;ddagger;&amp;quot;: &amp;quot;‡&amp;quot;, &amp;quot;&amp;amp;div;&amp;quot;: &amp;quot;÷&amp;quot;, &amp;quot;&amp;amp;leq;&amp;quot;: &amp;quot;≤&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;amp;geq;&amp;quot;: &amp;quot;≥&amp;quot;, &amp;quot;&amp;amp;le;&amp;quot;: &amp;quot;≤&amp;quot;, &amp;quot;&amp;amp;ge;&amp;quot;: &amp;quot;≥&amp;quot;&lt;br /&gt;
	}; // &amp;amp;quot; , &amp;amp;amp; &amp;amp;lt; &amp;amp;gt; &amp;amp;#124;&lt;br /&gt;
	var patterns = {&lt;br /&gt;
		arabicDigitsEnglishContext: /[a-z]([\|a-z %&amp;quot;&#039;\._:\;,\-\\\/\(\)\#\^\+\d&amp;gt;&amp;lt;–\[\]&amp;amp;?{}](?!\|\|))*\d|(\d|[a-z])[a-z %&amp;quot;&#039;\._:\;\|,\-\\\/\(\)\#\^\+\d&amp;gt;&amp;lt;–\[\]&amp;amp;?{}]*[a-z]\d*/gi,&lt;br /&gt;
		arabicTagEnclosed: /\{\{(?:عربی|شروع عربی|آغاز عربی)\}\}([\s\S]*?)\{\{(?:پایان عربی)\}\}/g,&lt;br /&gt;
		LtRTagEnclosed: /\{\{(?:چپ چین|چپ‌چین)\}\}([\s\S]*?)\{\{(?:پایان چپ‌چین|پایان چپ چین|پایان)\}\}/g,&lt;br /&gt;
		argumentsBlacklist: /(?:accessdate|namespace|legend1start|image|تصویر|doi|style|شابک|عرض|bibcode|isbn|issn|pmid|arxiv|upright|upleft|padding|spacing|border|filename|نام پرونده|ایستاده)\s*\=\s*[^\|\}\]]*/gi,&lt;br /&gt;
		color: /#(?:[abcdef0-9]{8}|[abcdef0-9]{6}|[abcdef0-9]{3})/gi,&lt;br /&gt;
		//colorAsParameter: /\=\s*(?:[abcdef0-9]{8}|[abcdef0-9]{6}|[abcdef0-9]{3})(?:[\s\|\}]|$)/gi,&lt;br /&gt;
		// space, &amp;quot;, \t, \n, {, |, }, ... they will interfere with wiki markup&lt;br /&gt;
		decodeUriBlacklist: /(?:%20|%27|%5C|%5E|%60|%23|%25|%3C|%3E|%5B|%5D|%22|%09|%0A|%7B|%7C|%7D|%C2|%A0)/gi,&lt;br /&gt;
		diffLink: /\[\[(?:ویژه|Special):(?:تفاوت|Diff)\/[^\|\]]*/gi,&lt;br /&gt;
		englishDate: /\d{1,2},? [a-z]{3,} \d{2,4}/gi, // 3, May 2013&lt;br /&gt;
		fileNames: /(?:پرونده|File|تصویر|Image)\:.*?(?=\||\]|\n|$)|=.*\.(?:flac|gif|jpeg|jpg|mid|mp3|mpeg|mpg|ogg|pdf|png|svg|wav|webm)$/mgi, // don&#039;t capture | after&lt;br /&gt;
		fileParameter: /\|\s*(image|تصویر)\s*\=\s*.*/g,&lt;br /&gt;
		ipSign: /\[\[ویژه:مشارکت\u200cها.*?\]\]/g,&lt;br /&gt;
		isbn: /(?:ISBN|ISSN|PMID) [\d\-]*/gi,&lt;br /&gt;
		galleryTag: /&amp;lt;gallery.*?&amp;gt;[\s\S]*?&amp;lt;\/gallery&amp;gt;/g,&lt;br /&gt;
		htmlAttributes: /(?:style|perrow|colspan|color|rowspan|cellpadding|cellspacing|height|width|size|border|thumbtime|name|perrow|upright|upleft)\s*[\=\:]\s*(?:[&#039;\&amp;quot;].*?[&#039;\&amp;quot;]|[\da-z]+)/gi,&lt;br /&gt;
		htmlEntity: /&amp;amp;#\d+;/,&lt;br /&gt;
		imagePixelSize: /[\|=] *[x\d]+?(px|پیکسل)[\]\|\s]/g, // means it will capture |10px| and |10x10px|&lt;br /&gt;
		insideQuote: /[^ا]&amp;quot;.*?&amp;quot;/g,&lt;br /&gt;
		wikilinkTargets: /\[[^\[|\]]+/g,&lt;br /&gt;
		nowikiTag: /&amp;lt;nowiki&amp;gt;.+?&amp;lt;\/nowiki&amp;gt;/g,&lt;br /&gt;
		preTag: /&amp;lt;pre.*?&amp;gt;.*?&amp;lt;\/pre&amp;gt;/g,&lt;br /&gt;
		insideHtmlComment: /&amp;lt;\!\-\-[\s\S]*?\-\-&amp;gt;/g,&lt;br /&gt;
		linksOnEnglishContext: /[a-z][\:\,\. ]*\[\[[\da-z\-\, ]*/gi,&lt;br /&gt;
		mapFrameTag: /&amp;lt;mapframe.*?&amp;gt;[\s\S]*?&amp;lt;\/mapframe&amp;gt;/g,&lt;br /&gt;
		mathTag: /&amp;lt;math.*?&amp;gt;[\s\S]*?&amp;lt;\/math&amp;gt;/g,&lt;br /&gt;
		otherLanguagesInline: /\{\{(?:به .+?|پم|به انگلیسی|انگلیسی|عربی|متن عربی|عبارت عربی|حدیث|به عربی|به اردو|اردو|lang\-[au]r|پینگ|ping)[\s\S]*?\}\}/g,&lt;br /&gt;
		parameter: /\{\{\{\d+/gi,&lt;br /&gt;
		parenthesesAfterDigits: /\w\s?\([\w\s\.\-]*?\)/g,&lt;br /&gt;
		parenthesesHa: /\)ها/g,&lt;br /&gt;
		ref: /(?:&amp;lt;ref[^\/]*?&amp;gt;[\s\S]*?&amp;lt;\/ref&amp;gt;|&amp;lt;ref[^\/]*?\/&amp;gt;)/g, // inside &amp;lt;ref&amp;gt;&amp;lt;/ref&amp;gt; and &amp;lt;ref/&amp;gt;&lt;br /&gt;
		refname: /\&amp;lt;ref name\=.*?\&amp;gt;/g,&lt;br /&gt;
		citation: /\{\{\s*(?:[Cc]it|یادکرد).*?[_\s]*(?:\{\{.*?\}\}|[^\}])*\}\}/g,&lt;br /&gt;
		signatures: /\[\[(?:کاربر|User|بحث[ _]کاربر|User[_ ]talk)\:.*?\]\]/gi,&lt;br /&gt;
		sourceTag: /(&amp;lt;source.*?&amp;gt;[\s\S]*?&amp;lt;\/source&amp;gt;|&amp;lt;syntaxhighlight.*?&amp;gt;[\s\S]*?&amp;lt;\/syntaxhighlight&amp;gt;|&amp;lt;code.*?&amp;gt;[\s\S]*?&amp;lt;\/code&amp;gt;|&amp;lt;timeline.*?&amp;gt;[\s\S]*?&amp;lt;\/timeline&amp;gt;)/g,&lt;br /&gt;
		tagNames: /&amp;lt;\/?[a-zA-Z\d]*/g,&lt;br /&gt;
		graphTemplate: /(?:\&amp;lt;div[^\&amp;gt;]+&amp;gt;)?\{\{[ \_]*(?:الگو|Template)?(?:[Gg]raph\:?[^\|\}]+).*?[_\s\n]*(?:\{\{.*?\}\}|[^\}])*\}\}(?:\&amp;lt;\/div\&amp;gt;)?/g,&lt;br /&gt;
		templateEnglishName: /(الگو|Template):[a-z][a-z\d\-\+_]+/gi,&lt;br /&gt;
		templateWithEnglishName: /\{\{[ \_]*(?:الگو|Template)?[\x00-\x7a~]*\|.*?\}\}/gi,&lt;br /&gt;
		templateParameterName: /\|\s*(?=[a-z_]*\d)[a-z_\d]*\s*\=/gi,&lt;br /&gt;
		globalExceptionTag: /(&amp;lt;nowiki&amp;gt;.+?&amp;lt;\/nowiki&amp;gt;|&amp;lt;!--[\s]*ابر[\s]*--&amp;gt;.+?&amp;lt;!--[\s]*\/[\s]*ابر[\s]*--&amp;gt;|\{\{استثنای ابرابزار\|[\s\S]*?\}\})/gi,&lt;br /&gt;
		translatedUrl: /.(کام|نت|آی‌آر)/g,&lt;br /&gt;
		boxVar: /([a-zA-Z][۱۲۳۴۵۶۷۸۹۰]+) *\=/g,&lt;br /&gt;
		url: /\/\/.*?(?=[\s\n\|\}\]&amp;lt;]|$)/gi,	 // بدون https?: هم ممکن است&lt;br /&gt;
		url2: /\/\/.*?(?:[\s\n\|\}\]&amp;lt;]|$)/gi,	 //برای مواردی که نیاز باشد ادامهٔ نشانی وب را دست نزند&lt;br /&gt;
		urlArchive: /\/\/web\.archive\.org[^\|\}\n\&amp;lt;\&amp;gt;]+/gi,&lt;br /&gt;
		mediawikiFunctions: /\{\{\#(?:\{\{.*?\}\}|[^\}])*\}\}/gi,&lt;br /&gt;
		articleTitleParts: new RegExp(&#039;\\s&#039; + escapeRegExp(mw.config.get(&#039;wgTitle&#039;)).split(&#039; &#039;).join(&#039;\\s|\\s&#039;) + &#039;\\s&#039;, &#039;g&#039;),&lt;br /&gt;
		catgories: /\[\[(?:رده|[Cc]ategory)\:[^\]]+\]\]/gi,&lt;br /&gt;
		rfd: /\{\{نظرخواهی برای حذف.*\}\}/g&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	function escapeRegExp(string) {&lt;br /&gt;
		return string.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;); // $&amp;amp; means the whole matched string&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function escapeRE(s) {&lt;br /&gt;
		return s.replace(/([$()*+\-.?[\\\]^{|}])/g, &#039;\\$1&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function descendingFromComparetor(x, y) {&lt;br /&gt;
		return x.from - y.from;&lt;br /&gt;
	}&lt;br /&gt;
	function removeCheckDict(text) {&lt;br /&gt;
		// رفع مشکل [[Special:Permalink/25174868#متن هایلایت‌شده]]&lt;br /&gt;
		var otext = &#039;&#039;&lt;br /&gt;
		while (otext != text) {&lt;br /&gt;
			otext = text&lt;br /&gt;
			text = text.replace(/\&amp;lt;span[^&amp;gt;]+CheckDictation\-marked[^&amp;gt;]+\&amp;gt;([^&amp;lt;&amp;gt;]+)\&amp;lt;\/span\&amp;gt;/g, &#039;$1&#039;)&lt;br /&gt;
		}&lt;br /&gt;
		return text&lt;br /&gt;
	}&lt;br /&gt;
	function replaceExcept(text, callback, excepts) {&lt;br /&gt;
		var match, result = [], i, ranges, minRange, to, min, max;&lt;br /&gt;
		while (text !== &#039;&#039;) {&lt;br /&gt;
			ranges = [];&lt;br /&gt;
&lt;br /&gt;
			for (i in excepts) {&lt;br /&gt;
				if (excepts.hasOwnProperty(i)) {&lt;br /&gt;
					// a global regex should be reset before calls&lt;br /&gt;
					excepts[i].lastIndex = 0;&lt;br /&gt;
					match = excepts[i].exec(text);&lt;br /&gt;
					if (match !== null) {&lt;br /&gt;
						ranges.push({&lt;br /&gt;
							from: match.index,&lt;br /&gt;
							to: match.index + match[0].length&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// so nothing is matched&lt;br /&gt;
			if (ranges.length === 0) {&lt;br /&gt;
				result.push(callback(text));&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			minRange = ranges.sort(descendingFromComparetor)[0];&lt;br /&gt;
			min = minRange.from;&lt;br /&gt;
&lt;br /&gt;
			to = [];&lt;br /&gt;
			for (i in ranges) {&lt;br /&gt;
				if (ranges.hasOwnProperty(i)) {&lt;br /&gt;
					if (ranges[i].from &amp;lt;= minRange.to) {&lt;br /&gt;
						to.push(ranges[i].to);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			max = Math.max.apply(null, to);&lt;br /&gt;
&lt;br /&gt;
			result.push(callback(text.substr(0, min)));&lt;br /&gt;
			result.push(text.substr(min, max - min));&lt;br /&gt;
			// console.log(&#039;Excepted: &amp;quot;&#039; + text.substr(min, max - min) + &#039;&amp;quot;&#039;);&lt;br /&gt;
			text = text.substr(max);&lt;br /&gt;
		}&lt;br /&gt;
		return result.join(&#039;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function wikiConvertToPersianCharacters(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			persianTools.toStandardPersianCharacters,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.otherLanguagesInline, patterns.arabicTagEnclosed, patterns.fileNames, patterns.signatures, patterns.url, patterns.fileParameter]&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!String.prototype.trim) { // if is not available currently&lt;br /&gt;
		String.prototype.trim = function () {&lt;br /&gt;
			return this.replace(/^\s+|\s+$/g, &#039;&#039;);&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function autoFormatCleanReferences(str) {&lt;br /&gt;
		// تمیزکاری autoFormater.js &amp;gt; cleanReferences&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;\s*references\s*(\s\b[^&amp;lt;&amp;gt;]*?)?\s*(?:\/|&amp;gt;\s*&amp;lt;\s*\/\s*references)\s*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;references$1/&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 0) {&lt;br /&gt;
			//ویکی‌پدیای فارسی منبع برای ارجاع نیست  &lt;br /&gt;
			str = str.replace(/\&amp;lt;ref[^&amp;gt;]*\&amp;gt;\[?(?:https?:)?\/\/fa.(?:m\.)?wikipedia.org\/[^\&amp;lt;\n\}\]\[]+\]?\&amp;lt;\/ref\&amp;gt;/gi, &#039;&#039;)&lt;br /&gt;
		};&lt;br /&gt;
		str = str.replace(/&amp;lt;\s*references\s*(\s\b[^&amp;lt;\/&amp;gt;]*?)?\s*&amp;gt;/gi, &#039;&amp;lt;references$1&amp;gt;&#039;);&lt;br /&gt;
		str = str.replace(/&amp;lt;\s*\/\s*references\s*&amp;gt;/gi, &#039;&amp;lt;\/references&amp;gt;&#039;);&lt;br /&gt;
		var re = /(&amp;lt;references[^&amp;lt;\/&amp;gt;]*)&amp;gt;/g, m;&lt;br /&gt;
		while (m = re.exec(str)) {&lt;br /&gt;
			if (str.indexOf(&#039;&amp;lt;\/references&amp;gt;&#039;, m.index) &amp;lt; 0) {&lt;br /&gt;
				str = str.slice(0, m.index) + m[1] + &#039;/&amp;gt;&#039; + str.slice(m.index + m[0].length);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		str = str.replace(/&amp;lt; *ref\s*(\s\b[^&amp;lt;&amp;gt;]*?)\s*(?:\/+|&amp;gt;\s*&amp;lt;\s*\/+\s*ref) *&amp;gt;/gi, &#039;&amp;lt;ref$1/&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
		/* remove line breaks with assays only the top of the article */&lt;br /&gt;
		var i = str.indexOf(&#039;&amp;lt;references&#039;),&lt;br /&gt;
			slice;&lt;br /&gt;
		if (i &amp;gt; 0) {&lt;br /&gt;
			slice = str.slice(i);&lt;br /&gt;
			slice = slice.replace(/&amp;lt; *ref\s*(\s\b[^&amp;lt;\/&amp;gt;]*?)?\s*&amp;gt;[\t ]*/gi, &#039;&amp;lt;ref$1&amp;gt;&#039;);&lt;br /&gt;
			slice = slice.replace(/(?:(\n[\t ]*)|[\t ]*)&amp;lt;\s*\/+\s*ref\s*&amp;gt;/gi, &#039;$1&amp;lt;\/ref&amp;gt;&#039;);&lt;br /&gt;
			str = str.slice(0, i);&lt;br /&gt;
		}&lt;br /&gt;
		str = str.replace(/&amp;lt; *ref\s*(\s\b[^&amp;lt;\/&amp;gt;]*?)?\s*&amp;gt;\s*/gi, &#039;&amp;lt;ref$1&amp;gt;&#039;);&lt;br /&gt;
		str = str.replace(/\s*&amp;lt;\s*\/+\s*ref\s*&amp;gt;/gi, &#039;&amp;lt;\/ref&amp;gt;&#039;);&lt;br /&gt;
		if (slice) {&lt;br /&gt;
			str += slice;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Space between the end of block and remove &amp;lt;ref&amp;gt; or two &amp;lt;ref&amp;gt; */&lt;br /&gt;
		str = str.replace(/([!,.;?]|&amp;lt;ref\b[^&amp;lt;&amp;gt;]*(?:\/|&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;\/ref)&amp;gt;) +(?=&amp;lt;ref[ &amp;gt;])/gi, &#039;$1&#039;);&lt;br /&gt;
		/* Two identical punctuation before and cut after a &amp;lt;ref&amp;gt; on one */&lt;br /&gt;
		str = str.replace(/([!,.:;?])(&amp;lt;ref\b[^&amp;lt;&amp;gt;]*(?:\/|&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;\/ref)&amp;gt;)\1/gi, &#039;$1$2&#039;);&lt;br /&gt;
		/* ref inside small */&lt;br /&gt;
		return str.replace(/\&amp;lt;small\&amp;gt; *(\&amp;lt;ref[^\&amp;lt;]+\&amp;lt;\/ref\&amp;gt;)&amp;lt;\/small\&amp;gt;/gi, &#039;$1&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function autoFormatCleanTags(str) {&lt;br /&gt;
		str = str.replace(/(&amp;lt;\/?s)trike\b/gi, &#039;$1&#039;);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/\&amp;lt;u\&amp;gt;([^\&amp;lt;]+)\&amp;lt;\/u\&amp;gt;/gi,&lt;br /&gt;
			&amp;quot;&#039;&#039;$1&#039;&#039;&amp;quot;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/\&amp;lt;center\&amp;gt;/gi,&lt;br /&gt;
			&amp;quot;{{وسط‌چین}}&amp;quot;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/\&amp;lt;\/center\&amp;gt;/gi,&lt;br /&gt;
			&amp;quot;{{پایان}}&amp;quot;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;sub\s*(&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;sub$1/sub&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;sup\s*(&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;sup$1/sup&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		/* Drop default font attributes */&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/(&amp;lt;font\b[^&amp;lt;&amp;gt;]*?)\s+fa\w+(?:[\s&amp;quot;&#039;,=]*(?:Arial|Helvetica(?:\W?N\w*)?|sans\W?serif)\b)+[\s&amp;quot;&#039;;]*(?=\s\w+\s*=|&amp;gt;)/gi,&lt;br /&gt;
			&#039;$1&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/(&amp;lt;font\b[^&amp;lt;&amp;gt;]*?)\s+size[\s&amp;quot;&#039;,=]*(?:-1\b|2\b|100\b[ ,.]*\d*%|1(?:\.0*)?em\b)[&amp;quot;&#039;;]*/gi,&lt;br /&gt;
			&#039;$1&#039;&lt;br /&gt;
		);&lt;br /&gt;
		/* Remove inline elements with no attributes */&lt;br /&gt;
		while (/&amp;lt;(font|span)\s*&amp;gt;\s*(?:&amp;lt;(?!\1)|[^&amp;lt;])*?\s*&amp;lt;\/\1[^&amp;lt;&amp;gt;]*&amp;gt;/i.test(str)) {&lt;br /&gt;
			str = str.replace(/&amp;lt;(font|span)\s*&amp;gt;[ \n]*((?:&amp;lt;(?!\1)|[^&amp;lt;])*?)[ \n]*&amp;lt;\/\1[^&amp;lt;&amp;gt;]*&amp;gt;/gi, &#039;$2&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;font\s+color[\s&amp;quot;&#039;,=]*(#[\dA-F]{3,6}|[a-z]{3,20})[\s&amp;quot;&#039;;]*&amp;gt;((?:&amp;lt;(?!font)|[^&amp;lt;])*?)&amp;lt;\/font[^&amp;lt;&amp;gt;]*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;span style=&amp;quot;color:$1;&amp;quot;&amp;gt;$2&amp;lt;\/span&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;font\s+size[\s&amp;quot;&#039;,=]*(?:-[2-9]|[01])[\s&amp;quot;&#039;;]*&amp;gt;((?:&amp;lt;(?!font)|[^&amp;lt;])*?)&amp;lt;\/font[^&amp;lt;&amp;gt;]*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;small&amp;gt;$1&amp;lt;\/small&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;font\s+size[\s&amp;quot;&#039;,=]*(?:[+-]0|3)[\s&amp;quot;&#039;;]*&amp;gt;((?:&amp;lt;(?!font)|[^&amp;lt;])*?)&amp;lt;\/font[^&amp;lt;&amp;gt;]*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;span style=&amp;quot;font-size:larger;&amp;quot;&amp;gt;$1&amp;lt;\/span&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		/* Merge nested inline tags */&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;(abbr|cite|mark|q|s|small|u)\s*&amp;gt;&amp;lt;(font|span)\s+style\s*=\s*[&amp;quot;&#039;]?([^\n&amp;quot;&amp;lt;&amp;gt;]*?);?[&amp;quot;&#039;]?\s*&amp;gt;([^&amp;lt;&amp;gt;]*)&amp;lt;\/\2\s*&amp;gt;\s*(?=&amp;lt;\/\1\s*&amp;gt;)/gi,&lt;br /&gt;
			&#039;&amp;lt;$1 style=&amp;quot;$3;&amp;quot;&amp;gt;$4&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/(&amp;lt;span\b[^&amp;lt;&amp;gt;]*?)\s+style\s*=\s*[&amp;quot;&#039;]?([^\n&amp;quot;&amp;lt;&amp;gt;]*?);?[&amp;quot;&#039;]?\s*&amp;gt;&amp;lt;span\s+style\s*=\s*[&amp;quot;&#039;]?([^\n&amp;quot;&amp;lt;&amp;gt;]*?);?[&amp;quot;&#039;]?\s*&amp;gt;([^&amp;lt;&amp;gt;]*)&amp;lt;\/span\s*&amp;gt;\s*(?=&amp;lt;\/span\s*&amp;gt;)/gi,&lt;br /&gt;
			&#039;$1 style=&amp;quot;$2; $3;&amp;quot;&amp;gt;$4&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		/* Verschiedenste Formen von HTML-Zeilenumbrüchen durch einheitliche ersetzen */&lt;br /&gt;
		str = str.replace(/&amp;lt;(?:[\s\/\\]*br\b)+\s*(\s\w[^&amp;lt;&amp;gt;]*?)?[\s.\/\\]*&amp;gt;/gi, &#039;&amp;lt;br$1/&amp;gt;&#039;);&lt;br /&gt;
		/* Unnötige HTML-Zeilenumbrüche entfernen, wenn sowieso ein Absatz folgt */&lt;br /&gt;
		str = str.replace(/ *(?:{{سخ}}|&amp;lt;br \/&amp;gt;)(?=[\r\n][\n#*:;\|}\]])/gi, &#039;&#039;);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;(ref|small|su[bp])\b\s*(\s\w[^&amp;lt;&amp;gt;]*?)?\s*&amp;gt;&amp;lt;small\s*&amp;gt;([^&amp;lt;&amp;gt;]*)&amp;lt;\/small\s*&amp;gt;&amp;lt;\/\1\s*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;$1$2&amp;gt;$3&amp;lt;\/$1&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/&amp;lt;small\s*&amp;gt;&amp;lt;(ref|small|su[bp])\b\s*(\s\w[^&amp;lt;&amp;gt;]*?)?\s*?( ?\/|&amp;gt;[^&amp;lt;&amp;gt;]*&amp;lt;\/\1)\s*&amp;gt;&amp;lt;\/small\s*&amp;gt;/gi,&lt;br /&gt;
			&#039;&amp;lt;$1$2$3&amp;gt;&#039;&lt;br /&gt;
		);&lt;br /&gt;
		/* Drop old navigation bar wrapper, see [[Template:NaviBlock]] */&lt;br /&gt;
		return str.replace(&lt;br /&gt;
			/&amp;lt;div\s+class[^&amp;lt;&amp;gt;\w]*BoxenVerschmelzen[^&amp;lt;&amp;gt;\w]*&amp;gt;\s*(\{\{[^#:&amp;lt;&amp;gt;{}]*\}\})\s*&amp;lt;\/div&amp;gt;/gi,&lt;br /&gt;
			&#039;$1&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function autoFormatCleanDuplicateLinks(str) {&lt;br /&gt;
		/* Exclude files and infoboxes from the start of the article */&lt;br /&gt;
		var m = /^(?:\s*\[\[\w+:(?:\[\[[^\n\]]*\]\]|[^\n\]])*\]\])*(?:\s*\{\{(?:\{\{[^}]*\}\}|[^}])*\}\})+/.exec(str),&lt;br /&gt;
			start = m ? m[0].length : 0,&lt;br /&gt;
			found = [],&lt;br /&gt;
			a = [];&lt;br /&gt;
		/* Unlink years that are linked more than one time */&lt;br /&gt;
		var re = /\[\[ *([۱۲][۱۲۳۴۵۶۷۸۹۰]{3}|[۱۲][۱۲۳۴۵۶۷۸۹۰]{3} \((میلادی|قمری)\)) *\]\]/g;&lt;br /&gt;
		/* In each case the first discovery of a year noted entlinken thereafter */&lt;br /&gt;
		while (m = re.exec(str)) {&lt;br /&gt;
			if (m.index &amp;gt;= start) {&lt;br /&gt;
				found[m[1]] ? a.push(m) : found[m[1]] = true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		var r = &#039;&#039;,&lt;br /&gt;
			p = 0;&lt;br /&gt;
		for (var i = 0; i &amp;lt; a.length; i++) {&lt;br /&gt;
			r += str.slice(p, a[i].index) + a[i][1];&lt;br /&gt;
			p = a[i].index + a[i][0].length;&lt;br /&gt;
		}&lt;br /&gt;
		return p ? r + str.slice(p) : str;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function autoFormatCleanDates(str) {&lt;br /&gt;
		var months = [&amp;quot;ژانویه&amp;quot;, &amp;quot;فوریه&amp;quot;, &amp;quot;مارس&amp;quot;, &amp;quot;آوریل&amp;quot;, &amp;quot;مه&amp;quot;, &amp;quot;ژوئن&amp;quot;, &amp;quot;ژوئیه&amp;quot;, &amp;quot;اوت&amp;quot;, &amp;quot;سپتامبر&amp;quot;, &amp;quot;اکتبر&amp;quot;, &amp;quot;نوامبر&amp;quot;, &amp;quot;دسامبر&amp;quot;, &amp;quot;January&amp;quot;, &amp;quot;February&amp;quot;, &amp;quot;March&amp;quot;, &amp;quot;April&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;June&amp;quot;, &amp;quot;July&amp;quot;, &amp;quot;August&amp;quot;, &amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;, &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot;].concat(persianMonths);&lt;br /&gt;
&lt;br /&gt;
		/* Add missing space between day and month */&lt;br /&gt;
		str = str.replace(new RegExp(&#039;([\\s!\&#039;(&amp;gt;|„](?:3[01]|[12]\\d|0?[1-9])\\.?)(?=(?:&#039; +&lt;br /&gt;
			months.join(&#039;|&#039;) + &#039;)\\b)&#039;, &#039;g&#039;), &#039;$1 &#039;);&lt;br /&gt;
		/* No non-breaking space between month and year */&lt;br /&gt;
		str = str.replace(new RegExp(&#039;(\\b(?:3[01]|[12]\\d|0?[1-9])\\.?(?:[\\s\\xA0]|&amp;amp;nbsp;)+(?:&#039; +&lt;br /&gt;
			months.join(&#039;|&#039;) + &#039;))(?:\xA0|&amp;amp;nbsp;)(?=[12]\\d{3}\\b)&#039;, &#039;g&#039;), &#039;$1 &#039;);&lt;br /&gt;
		/* Missverständliches deutsches Datumsformat durch Langform ersetzen */&lt;br /&gt;
		var separator = &#039; &#039;;&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/([\s&#039;(&amp;gt;„])(3[01]|[12]\d|0?[1-9])\. *(1[012]|0?[1-9])\. *(?=[12]\d{3}[!,.:;?]?[\s&#039;)&amp;lt;\]“])/g,&lt;br /&gt;
			function ($0, $1, $2, $3) {&lt;br /&gt;
				return $1 + ($2 | 0) + separator + months[$3 | 0] + &#039; &#039;;&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
		// عدد فارسی&lt;br /&gt;
		str = str.replace(new RegExp(&#039;([\\s!\&#039;(&amp;gt;|„](?:۳[۰۱]|[۱۲][۱۲۳۴۵۶۷۸۹]|۰?[۱۲۳۴۵۶۷۸۹])\\.?)(?=(?:&#039; +&lt;br /&gt;
			months.join(&#039;|&#039;) + &#039;)[\\s\&#039;)&amp;lt;\\]»}|])&#039;, &#039;g&#039;), &#039;$1 &#039;);&lt;br /&gt;
		/* No non-breaking space between month and year */&lt;br /&gt;
		str = str.replace(new RegExp(&#039;([\\s\&#039;(&amp;gt;«](?:۳[۰۱]|[۱۲][۱۲۳۴۵۶۷۸۹]|۰?[۱۲۳۴۵۶۷۸۹])\\.?(?:[\\s\\xA0]|&amp;amp;nbsp;)+(?:&#039; +&lt;br /&gt;
			months.join(&#039;|&#039;) + &#039;))(?:\xA0|&amp;amp;nbsp;)(?=[۱۲][۱۲۳۴۵۶۷۸۹]{3}[\\s\&#039;)&amp;lt;\\]»}|])&#039;, &#039;g&#039;), &#039;$1 &#039;);&lt;br /&gt;
		/* Missverständliches deutsches Datumsformat durch Langform ersetzen */&lt;br /&gt;
		var separator = &#039; &#039;;&lt;br /&gt;
		str = str.replace(&lt;br /&gt;
			/([\s&#039;(&amp;gt;«])(۳[۰۱]|[۱۲][۱۲۳۴۵۶۷۸۹]|۰?[۱۲۳۴۵۶۷۸۹])\. *(۱[۰۱۲]|۰?[۱۲۳۴۵۶۷۸۹])\. *(?=[۱۲][۱۲۳۴۵۶۷۸۹]{3}[!,.:;?]?[\s&#039;)&amp;lt;\]»}|])/g,&lt;br /&gt;
			function ($0, $1, $2, $3) {&lt;br /&gt;
				return $1 + ($2 | 0) + separator + months[$3 | 0] + &#039; &#039;;&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
		return str&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quotationReplace(line) {&lt;br /&gt;
		[&lt;br /&gt;
			[&#039;“&#039;, &#039;”&#039;], [&#039;”&#039;, &#039;“&#039;], [&#039;‘&#039;, &#039;’&#039;], [&#039;’&#039;, &#039;‘&#039;], [&#039;‚&#039;, &#039;’&#039;], [&#039;„&#039;, &#039;”&#039;], [&#039;\\&amp;lt;\\&amp;lt;&#039;, &#039;\\&amp;gt;\\&amp;gt;&#039;], [&#039;\\(\\(&#039;, &#039;\\)\\)&#039;]&lt;br /&gt;
		].forEach(function(qs) {&lt;br /&gt;
			line = line.replace(new RegExp(&lt;br /&gt;
				&#039;(^|[&#039; + persianTools.persianCharacters + &#039;\\:&amp;gt;،»؛\\s\\n\\}\\]\\.]+)&#039;&lt;br /&gt;
				+ qs[0] + &#039;((?:\\[\\[|).*?[&#039; + persianTools.persianCharacters + &#039;\\n]+?(?:\\]\\]|\\.|\\&amp;lt;|\\:|\\{|\\[|…|))&#039; + qs[1]&lt;br /&gt;
				+ &#039;([&#039; + persianTools.persianCharacters + &#039;،«؛\\s\\n\\.\\[\\{]|$)&#039;, &#039;g&#039;&lt;br /&gt;
			), &#039;$1«$2»$3&#039;);&lt;br /&gt;
		});&lt;br /&gt;
		return line;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quotation(text) {&lt;br /&gt;
		// این تابع زمانی گیومه را به فارسی تیدیل می‌کند که در پاراگراف مورد نظر تعداد گیومهٔ لاتین زوج باشد.&lt;br /&gt;
		var lines = text.split(/\n\n/);&lt;br /&gt;
		var result = [];&lt;br /&gt;
		for (var i = 0; i &amp;lt; lines.length; ++i) {&lt;br /&gt;
			var line = lines[i];&lt;br /&gt;
			if ((line.match(/&amp;quot;/g) || []).length % 2 === 0) { // count of quote marks&lt;br /&gt;
				// تبدیل گیومهٔ لاتین به فارسی&lt;br /&gt;
				// این دستور در ابتدا باشد تا فاصله‌های قبل و بعد گیومه هم اصلاح شود&lt;br /&gt;
				line = line.replace(&lt;br /&gt;
					new RegExp(&#039;(^|[&#039; + persianTools.persianCharacters + &#039;\\:&amp;gt;،»؛\\s\\n\\}\\]\\.\\)]+)&amp;quot;((?:\\[\\[|).*?[&#039; + persianTools.persianCharacters + &#039;؛\\n،]+?(?:\\]\\]|\\.|\\&amp;lt;|\\:|…|))&amp;quot;([&#039; + persianTools.persianCharacters + &#039;،«؛\\s\\n\\.\\[\\{\\(]|$)&#039;, &#039;g&#039;),&lt;br /&gt;
					&#039;$1«$2»$3&#039;&lt;br /&gt;
				);&lt;br /&gt;
				// if some of quote marks are remained from conversion, something might wrong, revert&lt;br /&gt;
				var testline = line.replace(/(?:&amp;lt;ref[^\/]*?&amp;gt;[\s\S]*?&amp;lt;\/ref&amp;gt;|&amp;lt;ref[^\/]*?\/&amp;gt;)/g, &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
				if (testline.match(/&amp;quot;/g)) {&lt;br /&gt;
					line = lines[i];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// رفع مشکل استفاده از ـً به جای گیومه لاتین در متن فارسی&lt;br /&gt;
			line = line.replace(new RegExp(&#039;ا\\&amp;quot;([ ]*[&#039; + persianTools.persianCharacters + &#039;])&#039;, &#039;g&#039;), &#039;اً$1&#039;)&lt;br /&gt;
			line = line.replace(new RegExp(&#039;ا\\”([ ]*[&#039; + persianTools.persianCharacters + &#039;])&#039;, &#039;g&#039;), &#039;اً$1&#039;)&lt;br /&gt;
			line = quotationReplace(line);&lt;br /&gt;
			result.push(line);&lt;br /&gt;
		}&lt;br /&gt;
		return result.join(&#039;\n\n&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	/**&lt;br /&gt;
	 * افزودن ستون به الگوی پانویس&lt;br /&gt;
	 * @param {string} text محتوا&lt;br /&gt;
	*/&lt;br /&gt;
	function addColumnToRefTemplate(text) {&lt;br /&gt;
		var refTemplate = /\{\{پانویس([^\}\{]+)?\}\}/i.exec(text), needChange = false;&lt;br /&gt;
		if (refTemplate) {&lt;br /&gt;
			if ((text.match(/&amp;lt;ref/gi) || []).length &amp;gt;= 6) {&lt;br /&gt;
				if (refTemplate[1] !== undefined) {&lt;br /&gt;
					var refParams = refTemplate[1].split(&#039;|&#039;);&lt;br /&gt;
					for (var i = refParams.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
						// اگر از پیش ستون یا پارامتر عرض تعریف شده‌باشد تغییری ایجاد نمی‌شود.&lt;br /&gt;
						if (refParams[i].length == 1 || refParams[i].indexOf(&#039;عرض&#039;) &amp;gt; -1) {&lt;br /&gt;
							needChange = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (refTemplate[1] === undefined || !needChange) {&lt;br /&gt;
					return text.replace(refTemplate[0], refTemplate[0].replace(&#039;}}&#039;, &#039;|۲}}&#039;));&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if ((mw.config.get(&#039;wgNamespaceNumber&#039;) === 0 &amp;amp;&amp;amp; mw.config.get(&amp;quot;wgEditMessage&amp;quot;) === &#039;editing&#039;) || mw.config.get(&#039;wgPageName&#039;) === &amp;quot;ویکی‌پدیا:ویکی‌پروژه_ابزارها/آزمایش_واحد&amp;quot;) {&lt;br /&gt;
				if ((text.match(/&amp;lt;ref/gi) || []).length &amp;gt; 0 &amp;amp;&amp;amp; /\{\{پانویس([^\}\{]+)?\}\}/i.exec(text) != null) {&lt;br /&gt;
					var text2 = text.replace(&#039;== منابع ==&#039;, &#039;== منابع ==\n{{پانویس}}&#039;)&lt;br /&gt;
					if (text2 == text) {&lt;br /&gt;
						text2 = text.replace(&#039;== پانویس ==&#039;, &#039;== پانویس ==\n{{پانویس}}&#039;)&lt;br /&gt;
					}&lt;br /&gt;
					if (text2 == text) {&lt;br /&gt;
						text2 = text.replace(&#039;[[رده:&#039;, &#039;== منابع ==\n{{پانویس}}\n\n[[رده:&#039;)&lt;br /&gt;
					}&lt;br /&gt;
					if (text2 == text) {&lt;br /&gt;
						text2 = text + &#039;\n== منابع ==\n{{پانویس}}&#039;&lt;br /&gt;
					}&lt;br /&gt;
					text = text2&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * اصلاح پیوندها&lt;br /&gt;
	 * @param  {string} text محتوا&lt;br /&gt;
	 * @return {string}&lt;br /&gt;
	 */&lt;br /&gt;
	function fixBadLinks(text) {&lt;br /&gt;
		// حذف متن جایگزین پیوند اگر با نشانی پیوند برابر باشد؛ مانند [[سلام|سلام]]&lt;br /&gt;
		text = text.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, &#039;[[$1]]&#039;);&lt;br /&gt;
&lt;br /&gt;
		// حذف پیوند سال و روز ماه&lt;br /&gt;
		text = text.replace(/\[{2}([۰-۹]+|[۰-۹]+ [\)\(\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2]+)(?:\|([^\]\|\[]+))?\]{2}/g, function (match, p1, p2) {&lt;br /&gt;
			// اگر فقط سال پیوند شده‌باشد یا به شکل [[سال|همان سال]] باشد فقط سال را می‌گرداند.&lt;br /&gt;
			var calendar_type = / \((میلادی|قمری|خورشیدی|شمسی|پیش از میلاد|قبل از میلاد)\)/g;&lt;br /&gt;
			if (p1 !== p2 &amp;amp;&amp;amp; p1.replace(calendar_type, &#039;&#039;) === p2) {&lt;br /&gt;
				return p2;&lt;br /&gt;
			}//[[Special:Permalink/19908981#حذف پیوند تاریخ‌ها]]&lt;br /&gt;
			if (p2 === undefined || p1 === p2) {&lt;br /&gt;
				// اگر پیوند به روز و ماه بود، برای جلوگیری از اشتباه و تداخل، بررسی می‌شوند که حتما یکی از ماه‌ها داخل رشته باشد.&lt;br /&gt;
				if (p1.indexOf(&amp;quot; &amp;quot;) &amp;gt; -1) {&lt;br /&gt;
					var&lt;br /&gt;
						months = [&lt;br /&gt;
							&amp;quot;محرم&amp;quot;, &amp;quot;صفر&amp;quot;, &amp;quot;ربیع‌الاول&amp;quot;, &amp;quot;ربیع‌الثانی&amp;quot;, &amp;quot;جمادی‌الاول&amp;quot;, &amp;quot;جمادی‌الثانی&amp;quot;, &amp;quot;رجب&amp;quot;, &amp;quot;شعبان&amp;quot;, &amp;quot;رمضان&amp;quot;, &amp;quot;شوال&amp;quot;, &amp;quot;ذیقعده&amp;quot;, &amp;quot;ذیحجه&amp;quot;&lt;br /&gt;
						].concat(persianMonths),&lt;br /&gt;
						i;&lt;br /&gt;
					for (i = months.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;
						if (p1.indexOf(months[i]) &amp;gt; -1) {&lt;br /&gt;
							return p1.replace(calendar_type, &#039;&#039;);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					return &amp;quot;[[&amp;quot; + p1 + &amp;quot;]]&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				return p1;&lt;br /&gt;
			}&lt;br /&gt;
			// اگر متن جایگزین پیوند مخالف پیوند سال بود، متن جایگزین را برمی‌گرداند.&lt;br /&gt;
			return p2;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function sortCategories(content, pageName) {&lt;br /&gt;
		return content.replace(/((?:\n\[\[رده:.+\]\])+)/, function (categories) {&lt;br /&gt;
			var sortedCategories = persianTools.persianSort(categories.trim().split(&#039;\n&#039;));&lt;br /&gt;
			return &#039;\n&#039; + sortedCategories.map(function (line, i) {&lt;br /&gt;
				// Put a &amp;quot;| &amp;quot; on category with the same name as the page&lt;br /&gt;
				if (line.indexOf(&#039;[[رده:&#039; + pageName + &#039;]]&#039;) === 0)&lt;br /&gt;
					line = &#039;[[رده:&#039; + pageName + &#039;| ]]&#039;;&lt;br /&gt;
&lt;br /&gt;
				// If it contains &amp;quot;| &amp;quot; put it at top&lt;br /&gt;
				if (line.indexOf(&#039;| ]]&#039;) !== -1) i = -1;&lt;br /&gt;
&lt;br /&gt;
				return { index: i, content: line };&lt;br /&gt;
			}).sort(function (x, y) { // sort based on their initial line index&lt;br /&gt;
				return x.index - y.index;&lt;br /&gt;
			}).map(function (x) { return x.content; }).join(&#039;\n&#039;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function wikiPunctuation(text) {&lt;br /&gt;
		text = autoFormatCleanReferences(text)&lt;br /&gt;
		text = autoFormatCleanTags(text)&lt;br /&gt;
		text = autoFormatCleanDuplicateLinks(text)&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				return quotation(text);&lt;br /&gt;
			},&lt;br /&gt;
			[patterns.ref]&lt;br /&gt;
		);&lt;br /&gt;
		if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 0) {&lt;br /&gt;
			var old_text = text.replace(/\=\=/g, &#039;&#039;)&lt;br /&gt;
			if (old_text == text) {//در صورتی که در مقاله بخش‌بندی وجود نداشته باشد&lt;br /&gt;
				text = text.replace(/(\n\{\{سخ\}\}|\n\n)(\s|_|)\&#039;\&#039;\&#039;(.*?)\&#039;\&#039;\&#039;(\s|_|)(\{\{سخ\}\}|\n)([\n\#\*])/g, &#039;\n\n== $3 ==\n$6&#039;)&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				text = text.replace(&lt;br /&gt;
					new RegExp(&#039;([&#039; + persianTools.persianCharactersNoVowels + &#039;])ـ+([&#039; + persianTools.persianCharactersNoVowels + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
					&#039;$1$2&#039;&lt;br /&gt;
				);&lt;br /&gt;
				return text.replace(new RegExp(&#039;([&#039; + persianTools.persianCharacters + &#039;])(\\]\\]|), (\\[\\[|)?(?=[&#039; + persianTools.persianCharacters + &amp;quot;])&amp;quot;, &#039;g&#039;), &#039;$1$2، $3&#039;);&lt;br /&gt;
			},&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.fileNames, patterns.url, patterns.galleryTag, patterns.sourceTag, patterns.translatedUrl, patterns.parenthesesHa]&lt;br /&gt;
		);&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				return text.replace(/(&amp;lt;\/ref&amp;gt;)\s+(&amp;lt;ref)/g, &#039;$1$2&#039;).replace(/([^=])\s+&amp;lt;ref(?!erences)/g, &#039;$1&amp;lt;ref&#039;);&lt;br /&gt;
			},&lt;br /&gt;
			[/\{\{(پانویس|پانویس‌ها|پی‌نوشت)\s*\|[\s\S]*/]&lt;br /&gt;
		);&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				return persianTools.punctuation(text)&lt;br /&gt;
					.replace(/^([*#]+;?)([^*#;\:\s])/mg, &#039;$1 $2&#039;) // Adds a space after the # or * for lists&lt;br /&gt;
					.replace(/^([*#]+;?) {2,}(.)/mg, &#039;$1 $2&#039;); // Trim more that one space after the # or * for lists&lt;br /&gt;
			},&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.mapFrameTag, patterns.mathTag, patterns.fileNames, patterns.url, patterns.wikilinkTargets,&lt;br /&gt;
			patterns.galleryTag, patterns.sourceTag, patterns.translatedUrl, patterns.parenthesesHa, patterns.insideHtmlComment]&lt;br /&gt;
		)&lt;br /&gt;
			.replace(/\u00A0/g, &#039; &#039;) // convert implicit nbsp to space, probably is being added by some bug on ContentTranslation&lt;br /&gt;
			.replace(/٬ /g, &#039;، &#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianTools.persianCharacters + &#039;\]])٬&#039;, &#039;g&#039;), &#039;$1،&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianTools.persianCharacters + &#039;])(\]\]|»|)[ ]*[,]&#039;, &#039;g&#039;), &#039;$1$2، &#039;)&lt;br /&gt;
			.replace(/\[\[([^\|\]]+)\|(\&#039;{2,3})\1&#039;{2,3}\]\]/g, &#039;$2[[$1]]$2&#039;) // for [[foo|&#039;&#039;&#039;foo&#039;&#039;&#039;]] &amp;gt; &#039;&#039;&#039;[[foo]]&#039;&#039;&#039;&lt;br /&gt;
			.replace(new RegExp(&#039;\\[\\[(&#039; + escapeRE(mw.config.get(&#039;wgPageName&#039;)) + &#039;)\\]\\]&#039;, &#039;g&#039;), &#039;$1&#039;) // پیوندزدایی از خود صفحه&lt;br /&gt;
			//برگرفته از https://checkwiki.toolforge.org/cgi-bin/checkwikin.cgi?project=fawiki&amp;amp;view=project&lt;br /&gt;
			.replace(/\[\[([^\|\]]+)\|\1([\u200c ]*(های?))\]\]/g, &#039;[[$1]]$2&#039;)//[[Special:Diff/17515365/17865938]]&lt;br /&gt;
			.replace(/([\S]*)[\s\u200c]*-[\s\u200c]*(تاکنون)(?![ ]+)/g, &#039;$1-اکنون&#039;)//[[Special:Diff/17515365/17865938]]&lt;br /&gt;
			//مشکل در نشانی اینترنتی&lt;br /&gt;
			.replace(/(\&amp;lt;ref.*?\&amp;gt;) *(\[|)\www(6|3|)\./gi, &#039;$1$2http://www$3.&#039;)&lt;br /&gt;
			.replace(/\[\[ *(https?\:\/\/.*?) *\]\]/g, &#039;[$1]&#039;)&lt;br /&gt;
			.replace(/\[\[ *(\/\/.*?) *\]\]/g, &#039;[$1]&#039;)&lt;br /&gt;
			.replace(/(https?:\/?\/?){2,}/g, &#039;$1&#039;)&lt;br /&gt;
			// تمیزکاری autoFormatter.js &amp;gt; cleanExternalLinks&lt;br /&gt;
			.replace(/\b(?:http(s?)(?::+\/*|\/\/+:*)\b)+/gi, &#039;http$1://&#039;)&lt;br /&gt;
			// repair links with vertical stroke&lt;br /&gt;
			.replace(/(\[https?:\/\/[^\s[\]|]*?) *\| *(?=[^\s=[\]|]+\])/gi, &#039;$1 &#039;)&lt;br /&gt;
			// supplement slashes at the end easier Domains&lt;br /&gt;
			.replace(/(\[https?:\/\/\w[\w.-]*\w\.\w+) +/gi, &#039;$1/ &#039;)&lt;br /&gt;
			// Domains lowercase, whether labeled or not&lt;br /&gt;
			.replace(/\bhttps?:\/\/\b[0-9a-z.-]*[A-Z][\w.-]*/g, function ($0) {&lt;br /&gt;
				return $0.toLowerCase();&lt;br /&gt;
			})&lt;br /&gt;
			// پیوند به بیرون‌هایی که در میان پیوند نویسهٔ رفتن به خط بعد، وجود داشته باشد&lt;br /&gt;
			.replace(/\[(?:https?\:|)\/\/[^\]\[]+\]/g, function (x) {&lt;br /&gt;
				x = x.replace(/[\n\r]/g, &#039;&#039;);&lt;br /&gt;
				return x&lt;br /&gt;
			})&lt;br /&gt;
			// فاصله اول زیربخش&lt;br /&gt;
			.replace(/پیوند\n\=/, &#039;پیوند=&#039;)// [[Special:Diff/20238012/20244702]]&lt;br /&gt;
			.replace(/^ +(\=+[^\=]+\=+)/mg, &#039;$1&#039;)&lt;br /&gt;
			.replace(/\[\[\|/g, &#039;[[&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *\/ *br *\&amp;gt;|\&amp;lt; *br *\\ *\&amp;gt;|\&amp;lt; *br *\. *\&amp;gt;)/g, &#039;&amp;lt;br/&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt;br *\/\&amp;gt;|\{\{سخ\}\})([\r\n])(\*|\#|\=\=)/g, &#039;$2$3&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt;br *\/\&amp;gt;|\{\{سخ\}\}) *\]\]/g, &#039;]]&#039;)&lt;br /&gt;
			.replace(/\[\[ *(\&amp;lt;br *\/\&amp;gt;|\{\{سخ\}\})/g, &#039;[[&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *span *\/ *\&amp;gt;|\&amp;lt; *\/ *span *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *center *\/ *\&amp;gt;|\&amp;lt; *\/ *center *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/center&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *b *\/ *\&amp;gt;|\&amp;lt; *\/ *b *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/b&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *div *\/ *\&amp;gt;|\&amp;lt; *\/ *div *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *p *\/ *\&amp;gt;|\&amp;lt; *\/ *p *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/p&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *td *\/ *\&amp;gt;|\&amp;lt; *\/ *td *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/td&amp;gt;&#039;)&lt;br /&gt;
			.replace(/(\&amp;lt; *small *\/ *\&amp;gt;|\&amp;lt; *\/ *small *\/ *\&amp;gt;)/gi, &#039;&amp;lt;/small&amp;gt;&#039;)&lt;br /&gt;
			.replace(/\[\[([^\]]+)\{\{\!\}\}([^\]]+)\]\]/g, &#039;[[$1|$2]]&#039;)//وجود {{!}} درون پیوند&lt;br /&gt;
			.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, &#039;[[$1]]&#039;)//زمانی که بخش هدف و نمایه پیوند یکی باشند&lt;br /&gt;
			.replace(/\[\[(.+)\|(&#039;+)(.+\b)(&#039;+)\]\]/gi, &#039;$2[[$1|$3]]$4&#039;)// انتقال &#039;&#039;&#039; به بیرون پیوند&lt;br /&gt;
			// تمیزکاری autoFormatter.js &amp;gt; CleanGalleries&lt;br /&gt;
			.replace(/&amp;lt;gallery\b([^&amp;lt;&amp;gt;]*)&amp;gt;([^&amp;lt;&amp;gt;]+)&amp;lt;\/gallery\b[^&amp;lt;&amp;gt;]*&amp;gt;/gi,&lt;br /&gt;
				function ($0, $1, $2) {&lt;br /&gt;
					return &#039;&amp;lt;gallery&#039; + $1 + &#039;&amp;gt;&#039; + $2&lt;br /&gt;
						.replace(/^(\s*)\[+([^[\]]*)\]\]?\s*$/gm, &#039;$1$2&#039;)&lt;br /&gt;
						.replace(/^(\s*)\[+/gm, &#039;$1&#039;) + &#039;&amp;lt;\/gallery&amp;gt;&#039;;&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
			// تمیزکاری پرونده‌ها&lt;br /&gt;
			// زمانی که برچسب کوچک در توضیحات تصویر می‌آید برای دستگاه‌های با مانیتور کوچک خواندن متن مشکل می‌شود&lt;br /&gt;
			//https://checkwiki.toolforge.org/cgi-bin/checkwiki.cgi?project=fawiki&amp;amp;view=only&amp;amp;id=77&lt;br /&gt;
			.replace(/\[\[(پرونده|[Ff]ile)\:((?:\[\[.*?\]\]|[^\]])*)\]\]/g, function ($0, $1, $2) {&lt;br /&gt;
				$2 = $2.replace(/\&amp;lt;\/?(big|center|small)&amp;gt;/g, &#039;&#039;);&lt;br /&gt;
				return &#039;[[&#039; + $1 + &#039;:&#039; + $2 + &#039;]]&#039;&lt;br /&gt;
			})&lt;br /&gt;
			.replace(/\[\[ *تصو[يی]ر\:/gi, &#039;[[پرونده:&#039;)&lt;br /&gt;
			// تمیزکاری الگو autoFormater.js &amp;gt; cleanTemplates&lt;br /&gt;
			.replace(/\{\{\s*:?\s*(?:الگو|Template)\s*:\s*/gi, &#039;{\{&#039;)&lt;br /&gt;
			// حذف خط زیر از عنوان الگو&lt;br /&gt;
			.replace(/(?:^|[^{])\{\{[ 0-9a-z\xC0-\u024F-]*_[ \w\xC0-\u024F-]*/gi,&lt;br /&gt;
				function ($0) {&lt;br /&gt;
					return $0.replace(/_+$/, &#039;&#039;).replace(/[ _]+/g, &#039; &#039;).replace(/\{ +/, &#039;{&#039;);&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
			//سایر موارد&lt;br /&gt;
			.replace(/\[\[(رده|الگو|ویکی\u200cپدیا)\: +/g, &#039;[[$1:&#039;)&lt;br /&gt;
			.replace(/\{\{\*\}\}/g, &#039;{{•}}&#039;)&lt;br /&gt;
			.replace(/[\n\s]*\{\{[•·ن](w?)\}\}\s*/g, &#039;{{•$1}} &#039;)&lt;br /&gt;
			.replace(/\=\{\{[•·ن](w?)\}\}\s*/g, &#039;=\n{{•$1}} &#039;)//رفع باگ [[Special:Diff/14799178/16387261]] در خط بالا &lt;br /&gt;
			.replace(/ *(&amp;lt;\/? ?br ?\/?&amp;gt;|\{\{بر\}\}) */g, &#039;{{سخ}}&#039;)&lt;br /&gt;
			.replace(/\{\{سخ\}\}\n\n/g, &#039;\n\n&#039;)&lt;br /&gt;
			.replace(/\n\n\{\{سخ\}\}/g, &#039;\n\n&#039;)&lt;br /&gt;
			.replace(/\{\{سخ\}\}\]/g, &#039;]&#039;)&lt;br /&gt;
			.replace(/\[\{\{سخ\}\}/g, &#039;[&#039;)&lt;br /&gt;
			.replace(/\n\n(\*|\#)/g, &#039;\n$1&#039;)&lt;br /&gt;
			.replace(/\n(\#|\*)( |)\n/g, &#039;\n$1&#039;)&lt;br /&gt;
			.replace(/\n(\*|\#)( |)(\={2,})/g, &#039;\n$3&#039;)&lt;br /&gt;
			.replace(/(\n?)\s+?&amp;lt;\/ref&amp;gt;/g, &#039;$1&amp;lt;/ref&amp;gt;&#039;)&lt;br /&gt;
			.replace(/\{ *\|/g, &#039;{|&#039;)&lt;br /&gt;
			.replace(/\| *\}/g, &#039;|}&#039;)&lt;br /&gt;
			.replace(/\{\| *\{\|/g, &#039;{|&#039;)&lt;br /&gt;
			.replace(/\|\} *\|\}/g, &#039;|}&#039;)&lt;br /&gt;
			.replace(/^=.*&amp;amp;nbsp;.*=$/gim, function ($0) {&lt;br /&gt;
				return $0.replace(/(?:&amp;amp;nbsp;|\s)+/gi, &#039; &#039;);&lt;br /&gt;
			})&lt;br /&gt;
			.replace(/([^=])\n+(\=.*?\=\n+)/g, &#039;$1\n\n$2&#039;)&lt;br /&gt;
			.replace(/^(=+([^=].*?)=+)[\t\s]{1,}\n/g, &#039;$1\n&#039;)&lt;br /&gt;
			.replace(/^(\={2,}) +[\:,;&amp;gt;&amp;amp;\^#@•→←↔↑↓—–…~٫،؛ٔ]/mg, &#039;$1&#039;) // Cleanup headers&lt;br /&gt;
			.replace(/[\:,;&amp;lt;&amp;amp;\^#@•→←↔↑↓—–…~٫،؛ٔ] +(\={2,})$/mg, &#039;$1&#039;)&lt;br /&gt;
			.replace(/^(\={2,}\s*)(«)([^\n«»]*?)(»)(\s*\={2,})/mg, &#039;$1 $3 $5&#039;)&lt;br /&gt;
			.replace(/^(\={2,}) *&#039;+(.*?)&#039;+ *(\={2,})/mg, &#039;$1 $2 $3&#039;)&lt;br /&gt;
			.replace(/^[•●⚫⬤]/mg, &#039;*&#039;) // Wikify bullets in start of lines&lt;br /&gt;
			.replace(/^#\s*(REDIRECT|تغییر[ _]?مسیر)/gi, &#039;#تغییرمسیر&#039;)&lt;br /&gt;
			.replace(/^#تغییرمسیر(?=\S)/g, &#039;#تغییرمسیر &#039;) // Adds a space after #REDIRECT&lt;br /&gt;
			.replace(/(\={2,}) *([^\n\r]*?) *(\={2,})/g, &#039;$1 $2 $3&#039;) // Format headings level 2 and above&lt;br /&gt;
			// زیربخش نیازی به برچسب بزرگ و کوچک ندارد&lt;br /&gt;
			.replace(/(\=+) \&amp;lt;(?:small|big)\&amp;gt;([^\=\n\r]+)\&amp;lt;\/(?:small|big)\&amp;gt; (\=+)/g, &#039;$1 $2 $3&#039;)&lt;br /&gt;
			//حذف فاصلهٔ اضافی درون {{}}&lt;br /&gt;
			.replace(/\{\{(\s*)(.*?)(\s*)\}\}/g, &#039;{{$2}}&#039;)&lt;br /&gt;
			// تبدیل به نویسه / یکی کردن فاصله های مجازی پشت سرهم&lt;br /&gt;
			.replace(/(\{\{فم\}\}|\&amp;amp;zwnj\;|\u200c+)/g, &#039;\u200c&#039;)&lt;br /&gt;
			// Full stop and comma should be before citation. See en:WP:REFPUNC&lt;br /&gt;
			.replace(/ *((?:&amp;lt;ref[^\/]*?&amp;gt;.*?&amp;lt;\/ref&amp;gt;)+)([\.،,:])?/g, &#039;$2$1&#039;)&lt;br /&gt;
			.replace(/([^.])([\.،,:]){2}((?:&amp;lt;ref[^\/]*?&amp;gt;.*?&amp;lt;\/ref&amp;gt;)+)/g, &#039;$1$2$3&#039;)&lt;br /&gt;
			.replace(/ *((?:&amp;lt;ref[^\/]*?\/&amp;gt;)+)([\.،,:])/g, &#039;$2$1&#039;)&lt;br /&gt;
			.replace(/([^.])([\.،,:]){2}(((?:&amp;lt;ref[^\/]*?\/&amp;gt;)+)+)/g, &#039;$1$2$3&#039;)&lt;br /&gt;
			/* هر رده در یک خط */&lt;br /&gt;
			.replace(/([^\s&amp;gt;-]) *(\[\[رده:[^\n[\]]*\]\])/gi, &#039;$1\n$2&#039;)&lt;br /&gt;
			.replace(/(\[\[رده:[^\n[\]]*\]\]) *(?![\s&amp;lt;-]|$)/gi, &#039;$1\n&#039;)&lt;br /&gt;
			.replace(/(\[\[رده:[^\n[\]]*\]\]\n) *(?!\[\[رده:|[\s&amp;lt;-]|$)/gi, &#039;$1\n&#039;)&lt;br /&gt;
			//ترتیب‌پیش‌فرض&lt;br /&gt;
			.replace(/\{\{(?:DEFAULTSORT|[Dd]efaultsort|ترتیب|ترتیب[‌ ]پیش[‌ ]?فرض) *[|:] *(?=.*?}})/g, &#039;{{ترتیب‌پیش‌فرض:&#039;)&lt;br /&gt;
			.replace(/\{\{(ترتیب‌پیش‌فرض|DEFAULTSORT)\:[-\w,\s\(\)]+\}\}\n?/g, &#039;&#039;)&lt;br /&gt;
			.replace(/(\{\{(?:ترتیب‌پیش‌فرض|DEFAULT\w*SORT\w*):[^\n{}]*\}\})\s*(?=\[\[رده:)/gi, &#039;$1\n&#039;)&lt;br /&gt;
			.replace(/(\{\{ترتیب‌پیش‌فرض\:)\s/g, &#039;$1&#039;)&lt;br /&gt;
			.replace(/(==\n)\n+(?=&amp;lt;references[^\n&amp;lt;&amp;gt;]*\/&amp;gt;\n\n)/gi, &#039;$1&#039;)&lt;br /&gt;
			//نچسبیدن و+فاصله به براکت که محصول اشتباه در تایپ کردن است&lt;br /&gt;
			.replace(/\]\]و /g, &#039;]] و &#039;)&lt;br /&gt;
			.replace(/(\s|^)\&#039;\&#039;\&#039;(\s|)(.*?)(\s|)\&#039;\&#039;\&#039;(\s)/g, &amp;quot;$1&#039;&#039;&#039;$3&#039;&#039;&#039;$5&amp;quot;) // حذف فاصلهٔ اضافی درون ویکی کد&lt;br /&gt;
			.replace(/&#039;&#039;&#039;\{\{به /g, &amp;quot;&#039;&#039;&#039; {{به &amp;quot;)&lt;br /&gt;
			.replace(/\*(\s+|\n)?\{\{پانویس/g, &amp;quot;{{پانویس&amp;quot;)&lt;br /&gt;
			.replace(/((?:^|\n\s)\=+\s+\=+(?:\s+|)\n)/g, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
			.replace(/\n{3,}/g, &#039;\n\n&#039;)&lt;br /&gt;
			// فاصله‌های اضافی را از داخل پیوند به بیرون منتقل کند تا اگر اضافه بودند در کدهای دیگر حذف شوند&lt;br /&gt;
			// غیرفعال‌سازی: عملکرد مشابه پایین هم وجود دارد&lt;br /&gt;
			// .replace(/\[\[(\s*)(.*?)(\s*)\]\]/g, &#039;$1[[$2]]$3&#039;)&lt;br /&gt;
			.replace(/(\[{1,2})([^\[\]\n]*[^\[\]\n\|]) +(\]{1,2})/g, &amp;quot;$1$2$3&amp;quot;)&lt;br /&gt;
			.replace(/(\[{1,2}) +([^\[\]\n]+)(\]{1,2})/g, &amp;quot;$1$2$3&amp;quot;)&lt;br /&gt;
			//تبدیل بندهای ترتیبی به قالب‌بندی ویکی [[Special:Permalink/19923598#تبدیل بندهای ترتیبی به قالب‌بندی ویکی]]&lt;br /&gt;
			.replace(/(?:(?:^(?:\* ?)?[۱۲۳۴۵۶۷۸۹۰0-9]{1,2} ?[\.\-\)]) ?[^۱۲۳۴۵۶۷۸۹۰0-9\n]+\n+){2,}/gm, function (x) {&lt;br /&gt;
				var x2 = x.replace(/((?:\* ?)?[۱۲۳۴۵۶۷۸۹۰0-9]{1,2} ?[\.\-\)]) ?([^۱۲۳۴۵۶۷۸۹۰0-9\n]+)\n+/gm, &#039;# $2\n&#039;)&lt;br /&gt;
				if (x2.replace(/[۱۲۳۴۵۶۷۸۹۰0-9]/g, &#039;&#039;) === x2) {&lt;br /&gt;
					return x2;&lt;br /&gt;
				}&lt;br /&gt;
				return x;&lt;br /&gt;
			})&lt;br /&gt;
			.trim();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function wikiSubsection(text) {&lt;br /&gt;
		return text.replace(/\&amp;lt;(?:\s*)references?(?:\s*\/|\s*\/\s*)\&amp;gt;/g, &#039;{{پانویس}}&#039;)&lt;br /&gt;
			.replace(/\{\{(?:[Rr]eflist|[Rr]eferences?|پانویس[‌ ]?ها)(?=\||\})/g, &#039;{{پانویس&#039;)&lt;br /&gt;
			.replace(/\{\{راست(| |‌)چین\}\}\s*\{\{پانویس(.*?)\}\}\s*\{\{(پایان راست(| |‌)چین|پایان)\}\}/g, &#039;{{پانویس$2}}&#039;)&lt;br /&gt;
			.replace(/\{\{چپ(| |‌)چین\}\}\s*\{\{پانویس(.*?)\}\}\s*\{\{(پایان چپ(| |‌)چین|پایان)\}\}/g, &#039;{{پانویس$2|چپ‌چین=بله}}&#039;)&lt;br /&gt;
			.replace(/\&amp;lt;small\&amp;gt;\s*\{\{پانویس(.*?)\}\}\s*\&amp;lt;\/small\&amp;gt;/g, &#039;{{پانویس$1|اندازه=کوچک}}&#039;)&lt;br /&gt;
			.replace(/(({\{پانویس.*?\}\})(\n|)){1,}/g, &#039;$1&#039;)&lt;br /&gt;
			.replace(/\=\s*لیست\s*\=/g, &#039;= فهرست =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:[gG]allery|نگارستان|گالری (تصویر|عکس|))\s*\=/g, &#039;= نگارخانه =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:بیوگرافی|زندگینامه)\s*\=/g, &#039;= زندگی‌نامه =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:[eE]xternal links|لینک‌?های بیرونی|پیوندهای خارجی|لینک‌?های خارجی|پیوندهای بیرونی)\s*\=/g, &#039;= پیوند به بیرون =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:[nN]otes|[fF]ootnotes?|پاورقی|پاورقی‌ها|پانوشت|پانویس‌ها)\s*\=/g, &#039;= پانویس =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:[Ss]ee [Aa]lso|همچنین ببینی[مد]|بیشتر ببینی[مد]|همچنین نگاه کنید|بیشتر بدانی[مد]|مراجعات مرتبط|جستار وابسته|مطلب مرتبط|مطالب مرتبط|جستارهای مشابه|جستارهای دیگر)\s*\=/g, &#039;= جستارهای وابسته =&#039;)&lt;br /&gt;
			.replace(/\=\s*(?:منبع|منبع[‌ ]?ها|رفرنس|رفرنس[‌ ]?ها|ارجاع[‌ ]?ها|ارجاع|مرجع[‌ ]?ها|رفرنس|برگرفته از|مراجع|منابع و یادداشت[‌ ]?ها|منبع|مرجع|م[آا]خذ|منابع و م[آا]خذ|منابع و پانویس‌ها|فهرست مراجع|لیست مراجع|فهرست ارجاع[‌ ]?ها|فهرست ارجاع|[rR]eferences)\s*\=/g, &#039;= منابع =&#039;)&lt;br /&gt;
			//.replace(/\=\s*(?:مطالعه بیشتر|بیشتر بخوانی[مد])\s*\=/g, &#039;= برای مطالعهٔ بیشتر =&#039;)&lt;br /&gt;
			.replace(/^\={3,}\s*(جستارهای وابسته|پانویس|منابع)\s*\={3,}$/g, &#039;== $1 ==&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	function wikiUrlMinifier(text) {&lt;br /&gt;
		return text&lt;br /&gt;
			.replace(patterns.url, function (x) {&lt;br /&gt;
				return replaceExcept(&lt;br /&gt;
					x,&lt;br /&gt;
					function (x) {&lt;br /&gt;
						try {&lt;br /&gt;
							x = decodeURI(x);&lt;br /&gt;
						} catch (e) {&lt;br /&gt;
							try {&lt;br /&gt;
								x = decodeURIComponent(unescape(x));&lt;br /&gt;
							} catch (e) { mw.notify(e); }&lt;br /&gt;
						}&lt;br /&gt;
						return x;&lt;br /&gt;
					},&lt;br /&gt;
					[patterns.globalExceptionTag, patterns.decodeUriBlacklist, patterns.refname, patterns.urlArchive]&lt;br /&gt;
				);&lt;br /&gt;
			})&lt;br /&gt;
&lt;br /&gt;
			// Strip the http(s) prefix&lt;br /&gt;
			.replace(/\[(https?\:)(?=\/\/(?:[\w\-]+)\.(?:m\.)?(wiki(pedia|media|data|source|news|oyage|quote)|wiktionary)\.org\/[^\s\]]*)/g, &#039;[&#039;)&lt;br /&gt;
			.replace(/[\[\=](?:https?\:|)\/\/[\w\-]{2,}\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/([^\n?]*?)[\]\|]/g, function (x) {&lt;br /&gt;
				x = x.replace(/\[(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?) (.*?)\]/g, &#039;[[:$1:$2|$3]]&#039;)&lt;br /&gt;
				x = x.replace(/\[(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?)\]/g, &#039;[[:$1:$2]]&#039;)&lt;br /&gt;
				//x = x.replace(/\=(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?)\|/g,&#039;=[[:$1:$2]]|&#039;) // در الگو یادکرد مشکل ایجاد می‌کند&lt;br /&gt;
				x = x.replace(/\[\[\:fa\:/g, &#039;[[&#039;).replace(/\%20/g, &#039; &#039;).replace(/٪۲۰/g, &#039; &#039;).replace(/\[\[[a-zA-Z\&#039;0-9 ]+\|/g, &#039;[[&#039;)&lt;br /&gt;
				x = x.replace(/\[\[.*?\]\]/g, function (y) {&lt;br /&gt;
					y = y.replace(/\_/g, &#039; &#039;)&lt;br /&gt;
					return y&lt;br /&gt;
				})&lt;br /&gt;
				return x&lt;br /&gt;
			}).replace(/\[{2}([^\|]+)\|\1\]{2}/gi, &#039;[[$1]]&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	function SubSectionLeveling(text) {&lt;br /&gt;
		// تنظیم سطح زیربخش‌ها&lt;br /&gt;
		text = text.replace(/^(\={2,}) *(.*?) *(\={2,})/mg, &#039;$1 $2 $3&#039;)&lt;br /&gt;
		if ((mw.config.get(&#039;wgNamespaceNumber&#039;) === 0 &amp;amp;&amp;amp; mw.config.get(&amp;quot;wgEditMessage&amp;quot;) === &#039;editing&#039;) || mw.config.get(&#039;wgPageName&#039;) === &amp;quot;ویکی‌پدیا:ویکی‌پروژه_ابزارها/آزمایش_واحد&amp;quot;) {&lt;br /&gt;
			//مقاله‌ای که فقط زیربخش سطح ۱ دارد&lt;br /&gt;
			if (text.replace(/\=\=/g, &#039;&#039;) === text) {&lt;br /&gt;
				var text2 = text.replace(new RegExp(&#039;^\=([^\=\r\n]+)\=$&#039;, &#039;gm&#039;), &amp;quot;== $1 ==&amp;quot;)&lt;br /&gt;
				if (text !== text2) {&lt;br /&gt;
					text = text2.replace(/\n\=  /g, &#039;\n= &#039;).replace(/  \=\n/g, &#039; =\n&#039;)&lt;br /&gt;
				};&lt;br /&gt;
			};&lt;br /&gt;
			//مقاله‌ای که فقط زیربخش سطح ۳ یا ۴ دارد&lt;br /&gt;
			var text_test = text.replace(/^\=+ (منابع|جستارهای وابسته|پیوند به بیرون|پانویس|نگارخانه) \=+\n/gm, &#039;&#039;)&lt;br /&gt;
			if (text_test.replace(/^\=\= /gm, &#039;&#039;) === text_test) {&lt;br /&gt;
				if (text_test.replace(/^\=\=\= /gm, &#039;&#039;) !== text_test) {&lt;br /&gt;
					//سطح ۳&lt;br /&gt;
					text = text.replace(new RegExp(&#039;^\=\=\=([^\=\r\n]+)\=\=\=$&#039;, &#039;gm&#039;), &amp;quot;== $1 ==&amp;quot;)&lt;br /&gt;
					text = text.replace(new RegExp(&#039;^\=\=\=\=([^\=\r\n]+)\=\=\=\=$&#039;, &#039;gm&#039;), &amp;quot;=== $1 ===&amp;quot;)&lt;br /&gt;
				} else if (text_test.replace(/^\=\=\=\= /gm, &#039;&#039;) !== text_test) {&lt;br /&gt;
					//سطح ۴&lt;br /&gt;
					text = text.replace(new RegExp(&#039;^\=\=\=\=([^\=\r\n]+)\=\=\=\=$&#039;, &#039;gm&#039;), &amp;quot;== $1 ==&amp;quot;)&lt;br /&gt;
				} else {&lt;br /&gt;
					text = text.replace(/===/g, &#039;==&#039;)&lt;br /&gt;
				};&lt;br /&gt;
			};&lt;br /&gt;
			text = text.replace(/==  /g, &#039;== &#039;).replace(/  ==/g, &#039; ==&#039;)&lt;br /&gt;
		};&lt;br /&gt;
		return text;&lt;br /&gt;
	};&lt;br /&gt;
	function decimalPointToPersian(text) {&lt;br /&gt;
		//Decimal point [[Special:Permalink/25438370#جمع‌بندی_بدون_رسیدگی]]&lt;br /&gt;
		return text.replace(new RegExp(&#039;([۰۱۲۳۴۵۶۷۸۹])\\.(?=[۰۱۲۳۴۵۶۷۸۹])&#039;, &#039;g&#039;), &#039;$1٫&#039;)&lt;br /&gt;
	};&lt;br /&gt;
	function wikiTextDigitsToPersian(text) {&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			toEnglishDigits,&lt;br /&gt;
			[patterns.argumentsBlacklist, patterns.fileNames, patterns.fileParameter]);&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			persianTools.toPersianDigits,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.url, patterns.argumentsBlacklist, patterns.mapFrameTag, patterns.mathTag, patterns.imagePixelSize, patterns.fileNames, patterns.ref,&lt;br /&gt;
			patterns.sourceTag, patterns.arabicDigitsEnglishContext, patterns.signatures, patterns.htmlEntity, patterns.diffLink,&lt;br /&gt;
			patterns.htmlAttributes, patterns.fileParameter, patterns.templateParameterName, patterns.ipSign,&lt;br /&gt;
			patterns.parenthesesAfterDigits, patterns.otherLanguagesInline, patterns.preTag, patterns.isbn, patterns.englishDate,&lt;br /&gt;
			patterns.parameter, patterns.color, patterns.templateEnglishName, patterns.linksOnEnglishContext, patterns.citation, patterns.refname,&lt;br /&gt;
			patterns.LtRTagEnclosed, patterns.boxVar, patterns.mediawikiFunctions, patterns.graphTemplate]&lt;br /&gt;
		);&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			decimalPointToPersian,&lt;br /&gt;
			[patterns.catgories, patterns.graphTemplate]&lt;br /&gt;
		);&lt;br /&gt;
		return text&lt;br /&gt;
			//  thousands&#039; separator&lt;br /&gt;
			.replace(/([۱۲۳۴۵۶۷۸۹۰]),([۱۲۳۴۵۶۷۸۹۰])/g, &#039;$1٬$2&#039;)&lt;br /&gt;
			.replace(/([۱۲۳۴۵۶۷۸۹۰])( |)\u0652/g, &#039;$1°&#039;)//تبدیل نویسه سکون+عدد فارسی به نویسه درجه و عدد فارسی&lt;br /&gt;
			.replace(/\u0652( |)([۱۲۳۴۵۶۷۸۹۰])/g, &#039;°$2&#039;)&lt;br /&gt;
			//فاصله بین نویسه درجه و حروف الفبای فارسی به جز عدد فارسی&lt;br /&gt;
			.replace(/([\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2])°/g, &#039;$1 °&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function dictationReplace(x, y, extensions, text) {&lt;br /&gt;
		return text.replace(&lt;br /&gt;
			new RegExp(&lt;br /&gt;
				&#039;(^|[^&#039; + persianTools.persianCharacters + &#039;])(\\s|\u200c|_|)(&#039; + x + &#039;)(\\s|_)(&#039; + y + &#039;)(\\s|\u200c|_|)(&#039; +&lt;br /&gt;
				extensions + &#039;)($|[^&#039; + persianTools.persianCharacters + &#039;])&#039;,&lt;br /&gt;
				&#039;g&#039;&lt;br /&gt;
			),&lt;br /&gt;
			&#039;$1$2$3\u200c$5$6$7$8&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// it has dependency to MediaWiki:Gadget-Extra-Editbuttons-Dictionary.js&lt;br /&gt;
	function dictation(text) {&lt;br /&gt;
		var i,&lt;br /&gt;
			dictionary = persianToolsDictionary,&lt;br /&gt;
			NASB = &#039;\u064b&#039;, // ًـ&lt;br /&gt;
			ZAMM = &#039;\u064c&#039;; // ُـ&lt;br /&gt;
		for (i in dictionary.complexes) {&lt;br /&gt;
			if (dictionary.complexes.hasOwnProperty(i)) {&lt;br /&gt;
				text = dictationReplace(&lt;br /&gt;
					i,&lt;br /&gt;
					dictionary.complexes[i],&lt;br /&gt;
					&#039;ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|&#039;,&lt;br /&gt;
					text&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// for last name&lt;br /&gt;
		text = dictationReplace(&lt;br /&gt;
			dictionary.personNames,&lt;br /&gt;
			&#039;ی|یی|زاده|نیا|گان|فر|نژاد|یان|ی\u200cها|یها&#039;,&lt;br /&gt;
			&#039;ی|&#039;,&lt;br /&gt;
			text&lt;br /&gt;
		);&lt;br /&gt;
		// for &#039;آباد&#039;s&lt;br /&gt;
		text = dictationReplace(&lt;br /&gt;
			dictionary.personNames + &#039;|&#039; + dictionary.addToAbad,&lt;br /&gt;
			&#039;آباد&#039;,&lt;br /&gt;
			&#039;زاده|نیا|پور|گان|فر|نژاد|ی|یان|ها|های|یی|هایی|ی\u200cها|یها|&#039;,&lt;br /&gt;
			text&lt;br /&gt;
		);&lt;br /&gt;
		// for first names&lt;br /&gt;
		for (i in dictionary.firstNameComplex) {&lt;br /&gt;
			if (dictionary.firstNameComplex.hasOwnProperty(i)) {&lt;br /&gt;
				text = text.replace(&lt;br /&gt;
					new RegExp(&lt;br /&gt;
						&#039;(^|[^&#039; + persianTools.persianCharacters + &#039;]|\\s|_)(&#039; + i + &#039;)(\\s|_)(&#039; +&lt;br /&gt;
						dictionary.firstNameComplex[i] + &#039;)(\\s|_)($|[^&#039; + persianTools.persianCharacters + &#039;]|[^&#039; +&lt;br /&gt;
						persianTools.persianCharacters + &#039;])&#039;,&lt;br /&gt;
						&#039;g&#039;&lt;br /&gt;
					),&lt;br /&gt;
					&#039;$1$2\u200c$4$5$6&#039;&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// for colors&lt;br /&gt;
		text = dictationReplace(&lt;br /&gt;
			dictionary.colorsNames,&lt;br /&gt;
			&#039;فام|گون&#039;,&lt;br /&gt;
			&#039;زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|ی\u200cها|یها|هایم|هایت|هایش|هایمان|هایتان|هایشان|&#039;,&lt;br /&gt;
			text&lt;br /&gt;
		);&lt;br /&gt;
		// for numbers&lt;br /&gt;
		text = dictationReplace(&lt;br /&gt;
			dictionary.persianNumbers,&lt;br /&gt;
			&#039;گانه|ماهه&#039;,&lt;br /&gt;
			&#039;زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|&#039;,&lt;br /&gt;
			text&lt;br /&gt;
		);&lt;br /&gt;
		// wrong dictation&lt;br /&gt;
		for (i in dictionary.forReplace) {&lt;br /&gt;
			if (dictionary.forReplace.hasOwnProperty(i)) {&lt;br /&gt;
				text = text.replace(&lt;br /&gt;
					new RegExp(&lt;br /&gt;
						&#039;(^|[^&#039; + persianTools.persianCharacters + &#039;])(\\s|\\(|\u200c|_|)(&#039; + i + &#039;)(\\s|\\)|\u200c|_|)($|[^&#039; +&lt;br /&gt;
						persianTools.persianCharacters + &#039;])&#039;,&lt;br /&gt;
						&#039;g&#039;&lt;br /&gt;
					),&lt;br /&gt;
					&#039;$1$2&#039; + dictionary.forReplace[i] + &#039;$4$5&#039;&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var preword = &amp;quot;(^|\\s|_|«|»|\\[|\\(|\\&amp;lt;|\\&amp;gt;|\\&#039;)(&amp;quot;;&lt;br /&gt;
		// کلماتی که آ دارند&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(preword + dictionary.wordsWithA + &amp;quot;)(ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\&#039;|\\!|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/ا/i, &#039;آ&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
		// بن مضارع که آ دارند&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(&amp;quot;(^|\u200c|\\s|_|«|»|\\[|\\(|\\&amp;lt;|\\&amp;gt;|\\&#039;)(&amp;quot; + dictionary.PresentVerbsWithA + &amp;quot;)(م|ی|د|یم|ید|ند)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/ا/i, &#039;آ&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// بن ماضی که آ دارند&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(&amp;quot;(^|\u200c|\\s|_|«|»|\\[|\\(|\\&amp;lt;|\\&amp;gt;|\\&#039;)(&amp;quot; + dictionary.PastVerbsWithA + &amp;quot;)(م|ی|یم|ید|ند|ه|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/ا/i, &#039;آ&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// همزه ضم&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(preword + dictionary.HamzehZam + &amp;quot;)(‌ها|ها|ین|ان|ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/وء/, &#039;ؤ&#039;).replace(/و/i, &#039;ؤ&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
		//همزه نصب&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(preword + dictionary.HamzehNasb + &amp;quot;)(ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/ا/i, &#039;أ&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		//همزه وسط کلمه&lt;br /&gt;
		for (i in dictionary.HamzehAtInside) {&lt;br /&gt;
			text = text.replace(new RegExp(&lt;br /&gt;
				preword + i + &#039;)(| )(&#039; + dictionary.HamzehAtInside[i] + &amp;quot;)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;,&lt;br /&gt;
				&#039;g&#039;&lt;br /&gt;
			), &#039;$1$2ء$4&#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// در مورد افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.&lt;br /&gt;
		/* text = text.replace(new RegExp(preword + dictionary.HamzehAtEnd + &amp;quot;)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&#039;$1$2ء&#039;); */&lt;br /&gt;
&lt;br /&gt;
		//الف مقصوره&lt;br /&gt;
		text = text.replace(&lt;br /&gt;
			new RegExp(preword + dictionary.AlefMaghsooreh + &amp;quot;)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;),&lt;br /&gt;
			function (x) { return x.replace(/ا/i, &#039;ی&#039;); } // &#039;i&#039; is just to trick bidi algorithm on code view&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// صفت+تر&lt;br /&gt;
		text = text.replace(new RegExp(&amp;quot;(^|\\s|_|«|»|\\]|\\[|\\(|\\&amp;lt;|\\&amp;gt;|\\&#039;)(&amp;quot; + dictionary.adjective + &amp;quot;)( |_)تر(?= |«|»|\\.|\\[|\\]|،|_|\\s|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;), &#039;$1$2\u200cتر&#039;);&lt;br /&gt;
&lt;br /&gt;
		// اسامی رنگ‌ها (به‌عنوان صفت)+تر&lt;br /&gt;
		text = text.replace(new RegExp(&amp;quot;(^|\\s|_|«|»|\\]|\\[|\\(|\\&amp;lt;|\\&amp;gt;|\\&#039;)(&amp;quot; + dictionary.colorsNames + &amp;quot;)( |_)تر(?= |«|»|\\.|\\[|\\]|،|_|\\s|\\:|\\)|\\&amp;lt;|\\&amp;gt;|؟|\\!|\\&#039;|$)&amp;quot;, &#039;g&#039;), &#039;$1$2\u200cتر&#039;);&lt;br /&gt;
&lt;br /&gt;
		text = text.replace(/به دست\u200cآورد/g, &#039;به دست آورد&#039;); // Solving a bug!&lt;br /&gt;
		text = persianTools.normalizeZwnj(text);&lt;br /&gt;
		return text.replace(new RegExp(&amp;quot;(^|[؛\\s\\n\\.،«»\&#039;\\&amp;lt;\\&amp;gt;؟])(&amp;quot; + dictionary.needsNasb + &#039;)[&#039; + NASB + ZAMM + &#039;]?([؛؟\\s\\n\\.،«»\&#039;&amp;quot;\\&amp;lt;\\&amp;gt;]|$)&#039;, &#039;g&#039;), function (match) {&lt;br /&gt;
			return match&lt;br /&gt;
				.replace(new RegExp(&#039;ا([\\s\\n\\.،«»؟؛&amp;quot;\&#039;\\&amp;gt;\\&amp;lt;&#039; + ZAMM + &#039;])&#039;, &#039;i&#039;), &#039;ا&#039; + NASB + &#039;$1&#039;)&lt;br /&gt;
				.replace(new RegExp(NASB + &#039;[&amp;quot;&#039; + NASB + ZAMM + &#039;]&#039;), NASB);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function wikiDictation(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			dictation,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.insideQuote, patterns.argumentsBlacklist, patterns.articleTitleParts]&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
	function wikiApplyOrthography(text) {&lt;br /&gt;
		text = text //en:Wikipedia:HTML5&lt;br /&gt;
			//big&lt;br /&gt;
			.replace(/((?:\&amp;lt;big\&amp;gt;){5})([^&amp;lt;]+)((?:\&amp;lt;\/big\&amp;gt;){5})/g, &#039;&amp;lt;span style=&amp;quot;font-size: 56px;&amp;quot;&amp;gt;$2&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
			.replace(/((?:\&amp;lt;big\&amp;gt;){4})([^&amp;lt;]+)((?:\&amp;lt;\/big\&amp;gt;){4})/g, &#039;&amp;lt;span style=&amp;quot;font-size: 38px;&amp;quot;&amp;gt;$2&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
			.replace(/((?:\&amp;lt;big\&amp;gt;){3})([^&amp;lt;]+)((?:\&amp;lt;\/big\&amp;gt;){3})/g, &#039;{{خیلی بزرگ|$2}}&#039;)&lt;br /&gt;
			.replace(/((?:\&amp;lt;big\&amp;gt;){2})([^&amp;lt;]+)((?:\&amp;lt;\/big\&amp;gt;){2})/g, &#039;{{بزرگ|$2}}&#039;)&lt;br /&gt;
			.replace(/((?:\&amp;lt;big\&amp;gt;){1})([^&amp;lt;]+|[\s\S]+)((?:\&amp;lt;\/big\&amp;gt;){1})/g, &#039;{{درشت|$2}}&#039;)&lt;br /&gt;
			//center&lt;br /&gt;
			.replace(/&amp;lt;center&amp;gt;&amp;lt;gallery&amp;gt;([\S\s]+?)\&amp;lt;\/gallery&amp;gt;&amp;lt;\/center&amp;gt;/g, &#039;&amp;lt;gallery class=&amp;quot;center&amp;quot;&amp;gt;$1&amp;lt;/gallery&amp;gt;&#039;)&lt;br /&gt;
			//.replace(/&amp;lt;center&amp;gt;([\S\s]+?)&amp;lt;\/center&amp;gt;/g,&#039;{{وسط|$1}}&#039;)&lt;br /&gt;
			//empty tag&lt;br /&gt;
			.replace(/&amp;lt;span style=&amp;quot;font-size: [^&amp;gt;]+&amp;quot;&amp;gt;&amp;lt;\/span&amp;gt;/g, &#039;&#039;)&lt;br /&gt;
			.replace(/{{(?:درشت|خیلی بزرگ|بزرگ|وسط)\|}}/g, &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
		//حذف برچسب‌های خالی نرم‌افزار مدیاویکی&lt;br /&gt;
		var tags = [&#039;math&#039;, &#039;div&#039;, &#039;grammarly\\-btn&#039;, &#039;code&#039;, &#039;nowiki&#039;, &#039;pre&#039;, &#039;syntaxhighlight&#039;, &#039;source&#039;, &#039;s&#039;, &#039;noinclude&#039;, &#039;includeonly&#039;, &#039;big&#039;, &#039;small&#039;, &#039;gallery&#039;];// has bug for sub , sup [[Special:Diff/19450140/19490903]]&lt;br /&gt;
		text = replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				for (var i = 0; i &amp;lt; tags.length; ++i) {&lt;br /&gt;
					for (var b = 0; b &amp;lt; 5; ++b) {//خیلی از برچسب‌های خالی تو در تو هستند مانند [[Special:PermaLink/19223877]]&lt;br /&gt;
						text = text.replace(new RegExp(&#039;\&amp;lt;&#039; + tags[i] + &#039;[^\&amp;gt;]*\&amp;gt;(\\n|\\s|\u200c)*?\&amp;lt;\\/&#039; + tags[i] + &#039;\&amp;gt;&#039;, &#039;g&#039;), &#039;&#039;);&lt;br /&gt;
					}&lt;br /&gt;
					// remove the tags if they occurred multiple times consequently&lt;br /&gt;
					if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 0 || mw.config.get(&#039;wgNamespaceNumber&#039;) === 4) {&lt;br /&gt;
						text = text.replace(new RegExp(&#039;(\&amp;lt;&#039; + tags[i] + &#039;\&amp;gt;){2,}&#039;, &#039;g&#039;), &#039;$1&#039;)&lt;br /&gt;
							.replace(new RegExp(&#039;(\&amp;lt;\\/&#039; + tags[i] + &#039;\&amp;gt;){2,}&#039;, &#039;g&#039;), &#039;$1&#039;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 0) {&lt;br /&gt;
					text = text.replace(/\&amp;lt;ref\&amp;gt;[\s\n]*\&amp;lt;\/ref\&amp;gt;/g, &#039;&#039;).replace(/\&amp;lt;ref\&amp;gt;[\s\n]*\&amp;lt;ref\&amp;gt;/g, &#039;&amp;lt;ref&amp;gt;&#039;).replace(/\&amp;lt;\/ref\&amp;gt;[\s\n]*\&amp;lt;\/ref\&amp;gt;/g, &#039;&amp;lt;/ref&amp;gt;&#039;).replace(/\&amp;lt;ref\/\&amp;gt;/g, &#039;&amp;lt;/ref&amp;gt;&#039;);&lt;br /&gt;
				};&lt;br /&gt;
				return text&lt;br /&gt;
			},&lt;br /&gt;
			[patterns.insideHtmlComment]&lt;br /&gt;
		);&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			persianTools.applyOrthography,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.wikilinkTargets, patterns.rfd]&lt;br /&gt;
		).replace(patterns.galleryTag, function (gallery) {&lt;br /&gt;
			// apply `applyOrthography` on gallery descriptions separately&lt;br /&gt;
			return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {&lt;br /&gt;
				return y + persianTools.applyOrthography(z);&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// probably should be exactly same above but for applyZwnj&lt;br /&gt;
	function wikiApplyZwnj(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			persianTools.applyZwnj,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag]&lt;br /&gt;
		).replace(patterns.galleryTag, function (gallery) {&lt;br /&gt;
			// apply `applyOrthography` on gallery descriptions separatly&lt;br /&gt;
			return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {&lt;br /&gt;
				return y + persianTools.applyZwnj(z);&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function replaceEnMonth(text) {&lt;br /&gt;
		var enMonth = {&lt;br /&gt;
			&#039;آگست&#039;: &#039;اوت&#039;,&lt;br /&gt;
			&#039;آگوست&#039;: &#039;اوت&#039;,&lt;br /&gt;
			&#039;جولای&#039;: &#039;ژوئیه&#039;,&lt;br /&gt;
			&#039;مارچ&#039;: &#039;مارس&#039;,&lt;br /&gt;
			&#039;آپریل&#039;: &#039;آوریل&#039;,&lt;br /&gt;
			&#039;فوریوری&#039;: &#039;فوریه&#039;,&lt;br /&gt;
			&#039;january&#039;: &#039;ژانویه&#039;,&lt;br /&gt;
			&#039;jan&#039;: &#039;ژانویه&#039;,&lt;br /&gt;
			&#039;february&#039;: &#039;فوریه&#039;,&lt;br /&gt;
			&#039;feb&#039;: &#039;فوریه&#039;,&lt;br /&gt;
			&#039;march&#039;: &#039;مارس&#039;,&lt;br /&gt;
			&#039;mar&#039;: &#039;مارس&#039;,&lt;br /&gt;
			&#039;april&#039;: &#039;آوریل&#039;,&lt;br /&gt;
			&#039;apr&#039;: &#039;آوریل&#039;,&lt;br /&gt;
			&#039;may&#039;: &#039;مه&#039;,&lt;br /&gt;
			&#039;june&#039;: &#039;ژوئن&#039;,&lt;br /&gt;
			&#039;jun&#039;: &#039;ژوئن&#039;,&lt;br /&gt;
			&#039;july&#039;: &#039;ژوئیه&#039;,&lt;br /&gt;
			&#039;august&#039;: &#039;اوت&#039;,&lt;br /&gt;
			&#039;aug&#039;: &#039;اوت&#039;,&lt;br /&gt;
			&#039;september&#039;: &#039;سپتامبر&#039;,&lt;br /&gt;
			&#039;sept&#039;: &#039;سپتامبر&#039;,&lt;br /&gt;
			&#039;sep&#039;: &#039;سپتامبر&#039;,&lt;br /&gt;
			&#039;october&#039;: &#039;اکتبر&#039;,&lt;br /&gt;
			&#039;oct&#039;: &#039;اکتبر&#039;,&lt;br /&gt;
			&#039;november&#039;: &#039;نوامبر&#039;,&lt;br /&gt;
			&#039;nov&#039;: &#039;نوامبر&#039;,&lt;br /&gt;
			&#039;december&#039;: &#039;دسامبر&#039;,&lt;br /&gt;
			&#039;dec&#039;: &#039;دسامبر&#039;&lt;br /&gt;
		};&lt;br /&gt;
		for (var i in enMonth) {&lt;br /&gt;
			var text_new = text.replace(new RegExp(i, &#039;ig&#039;), enMonth[i])&lt;br /&gt;
			if (text_new != text) {&lt;br /&gt;
				return text_new&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return text&lt;br /&gt;
	};&lt;br /&gt;
	function autoFormatCleanDatesException(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			autoFormatCleanDates,&lt;br /&gt;
			[patterns.globalExceptionTag, patterns.fileNames, patterns.galleryTag, patterns.mapFrameTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist, patterns.ref]&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	function wikitranslateEnMonth(text) {&lt;br /&gt;
		text = autoFormatCleanDatesException(text)&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function translateEnMonth(text) {&lt;br /&gt;
				var enMonthRegex = &#039;(آگست|آگوست|جولای|مارچ|آپریل|january|jan|february|feb|march|mar|april|apr|may|jun|june|july|august|aug|sep|sept|september|oct|october|nov|november|december|dec)&#039;;&lt;br /&gt;
				return text.replace(new RegExp(&#039;([^a-zA-Z])(\^|\\||\\s|\\=|\\n|\\(|«|\\:)&#039; + enMonthRegex + &#039; (\\d{1,2}|[۱۲۳۴۵۶۷۸۹۰]{1,2})\\, (\\d{3,4}|[۱۲۳۴۵۶۷۸۹۰]{3,4})(\\||\\s|\\n|\$|\\)|\\}|»)([\^a\-zA\-Z])&#039;, &#039;ig&#039;),&lt;br /&gt;
					function (x) {&lt;br /&gt;
						x = x.replace(new RegExp(&#039;([\^a\-zA\-Z])(\^|\\||\\s|\\=|\\n|\\(|«|\\:)&#039; + enMonthRegex + &#039; (\\d{1,2}|[۱۲۳۴۵۶۷۸۹۰]{1,2})\\, (\\d{3,4}|[۱۲۳۴۵۶۷۸۹۰]{3,4})(\\||\\s|\\n|\$|\\)|\\}||»)([^a-zA-Z])&#039;, &#039;ig&#039;),&lt;br /&gt;
							&#039;$1$2$4 $3 $5$6$7&#039;)&lt;br /&gt;
						x = persianTools.toPersianDigits(x);&lt;br /&gt;
						x = replaceEnMonth(x);&lt;br /&gt;
						return x;&lt;br /&gt;
					})&lt;br /&gt;
					.replace(new RegExp(&#039;([\^a\-zA\-Z])(\^|\\||\\s|\\=|\\n|\\(|«)((\\d{1,2}|[۱۲۳۴۵۶۷۸۹۰]{1,2}) |)&#039; + enMonthRegex + &#039; (\\d{3,4}|[۱۲۳۴۵۶۷۸۹۰]{3,4})(\\||\\s|\\n|$|\\)|\\}|»|\\:)([\^a\-zA\-Z])&#039;, &#039;ig&#039;),&lt;br /&gt;
						function (x) {&lt;br /&gt;
							x = persianTools.toPersianDigits(x);&lt;br /&gt;
							x = replaceEnMonth(x);&lt;br /&gt;
							return x;&lt;br /&gt;
						}&lt;br /&gt;
					);&lt;br /&gt;
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.ref, patterns.fileParameter, patterns.galleryTag, patterns.mapFrameTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist]&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var arabicDigits = &#039;0123456789&#039;, persianDigits = &#039;۰۱۲۳۴۵۶۷۸۹&#039;, arabicIndicDigits = &#039;٠١٢٣٤٥٦٧٨٩&#039;;&lt;br /&gt;
	function robustToEnglishDigits(text) {&lt;br /&gt;
		var i = 0;&lt;br /&gt;
		for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
			text = text.replace(new RegExp(&#039;[&#039; + persianDigits[i] + arabicIndicDigits[i] + &#039;]&#039;, &#039;g&#039;), arabicDigits[i]);&lt;br /&gt;
		}&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toEnglishDigits(text) {&lt;br /&gt;
		text = text.replace(/[a-zA-Z]([\_\s\:\.\,\;\]\[\&amp;quot;\&#039;\)\(\}\{\/\\ ]+|)([۱۲۳۴۵۶۷۸۹۰٪\.٫\-\—\–°÷×\+\,\s\_\:،»«؛]+)([\_\s\:\.\,\;\]\[\&amp;quot;\&#039;\)\(\}\{\/\\\&amp;lt;\&amp;gt; ]+|)([a-zA-Z\&amp;gt;]|$)/g, function (x) {&lt;br /&gt;
			var i = 0;&lt;br /&gt;
			for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
				x = x.replace(new RegExp(&#039;[&#039; + persianDigits[i] + arabicIndicDigits[i] + &#039;]&#039;, &#039;g&#039;), arabicDigits[i]);&lt;br /&gt;
			}&lt;br /&gt;
			return x.replace(/،/g, &#039;,&#039;).replace(/»/g, &#039;&amp;quot;&#039;).replace(/«/g, &#039;&amp;quot;&#039;).replace(/؛/g, &#039;;&#039;);&lt;br /&gt;
		});&lt;br /&gt;
		// bug [[Special:Diff/17760890/17760898]]&lt;br /&gt;
		text = text.replace(/([a-zA-Z][۱۲۳۴۵۶۷۸۹۰]+) *\=/g, function (x) {&lt;br /&gt;
			var i = 0;&lt;br /&gt;
			for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
				x = x.replace(new RegExp(&#039;[&#039; + persianDigits[i] + arabicIndicDigits[i] + &#039;]&#039;, &#039;g&#039;), arabicDigits[i]);&lt;br /&gt;
			}&lt;br /&gt;
			return x;&lt;br /&gt;
		});&lt;br /&gt;
		// ISBN, ISSN and PMID&#039;s numbers should in english&lt;br /&gt;
		text = text.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([۱۲۳۴۵۶۷۸۹۰0-9–—−ـ_\-]+)([^۱۲۳۴۵۶۷۸۹۰0-9–—−ـ_\-]|$)/gi, function (x) {&lt;br /&gt;
			x = x.replace(/[–—−ـ_\-]+/g, &#039;-&#039;)&lt;br /&gt;
			var i = 0;&lt;br /&gt;
			for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
				x = x.replace(new RegExp(&#039;[&#039; + persianDigits[i] + arabicIndicDigits[i] + &#039;]&#039;, &#039;g&#039;), arabicDigits[i]);&lt;br /&gt;
			}&lt;br /&gt;
			x = x.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([۱۲۳۴۵۶۷۸۹۰\-0-9]+)([^۱۲۳۴۵۶۷۸۹۰\-0-9]|$)/gi, &#039;$1 $2$3&#039;)&lt;br /&gt;
			x = x.replace(&#039;PubMed&#039;, &#039;PMID&#039;)&lt;br /&gt;
			return x;&lt;br /&gt;
		});&lt;br /&gt;
		text = text.replace(/ISBN \-note/g, &#039;ISBN-note&#039;);&lt;br /&gt;
		// تبدیل عددهای فارسی در عدد ترتیبی انگلیسی&lt;br /&gt;
		text = text.replace(/(?:^|[&amp;quot;\&#039;\s_«\(\[\{])([۱۲۳۴۵۶۷۸۹۰]+)(st|nd|rd|th)[\s_\.,»&amp;quot;\&#039;\)\]\}]/g, function (x) {&lt;br /&gt;
			var i = 0;&lt;br /&gt;
			for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
				x = x.replace(new RegExp(&#039;[&#039; + persianDigits[i] + arabicIndicDigits[i] + &#039;]&#039;, &#039;g&#039;), arabicDigits[i]);&lt;br /&gt;
			}&lt;br /&gt;
			return x;&lt;br /&gt;
		});&lt;br /&gt;
		return text&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + arabicDigits + &#039;]) ?٪&#039;, &#039;g&#039;), &#039;$1%&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + arabicDigits + &#039;])٫(?=[&#039; + arabicDigits + &#039;])&#039;, &#039;g&#039;), &#039;$1.&#039;) // English decimal separator&lt;br /&gt;
	}&lt;br /&gt;
	function cleanTemplateBracesFromArticle(text, alwaysRun) { // like [[Special:Diff/18828723]]&lt;br /&gt;
		if (mw.config.get(&#039;wgNamespaceNumber&#039;) !== 0 &amp;amp;&amp;amp; !alwaysRun) {&lt;br /&gt;
			return text;&lt;br /&gt;
		}&lt;br /&gt;
		var i = 0&lt;br /&gt;
		for (i = 0; i &amp;lt;= 5; i = i + 1) {&lt;br /&gt;
			text = text.replace(/\{\{\{[^\|\}]+\|([^\}]+)\}\}\}/g, &#039;$1&#039;)&lt;br /&gt;
				.replace(/\{\{\{[^\|\}]+\| *\}\}\}/g, &#039;&#039;)&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return text.replace(/\{\{\#(?!invoke)/ig, &#039;{{جا:#&#039;)&lt;br /&gt;
			.replace(/\{\{ *(PAGENAME|FULLPAGENAMEE|SITENAME|NAMESPACE) *\}\}/g, &#039;{{جا:$1}}&#039;)&lt;br /&gt;
			.replace(&#039;{{ترتیب‌پیش‌فرض:}}&#039;, &#039;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	function decodeHTMLSymbolEntitiesCodes(text) {&lt;br /&gt;
		//&amp;amp;copy; &amp;gt; ©&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function decodeEntitiesCodes(text) {&lt;br /&gt;
				if(!text) return &#039;&#039;;&lt;br /&gt;
				for (var i in htmlEntityCodes) {&lt;br /&gt;
					var entityInput = i;&lt;br /&gt;
					var entityoutput = htmlEntityCodes[i];&lt;br /&gt;
					text = text.replace(new RegExp(entityInput, &#039;g&#039;), entityoutput);&lt;br /&gt;
				}&lt;br /&gt;
				return text;&lt;br /&gt;
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.ref, patterns.fileParameter,&lt;br /&gt;
			patterns.galleryTag, patterns.mapFrameTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName,&lt;br /&gt;
			patterns.citation, patterns.url]&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	function removeWikiSigne(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			function (text) {&lt;br /&gt;
				text = text.replace(/\[\[([^\|\]]+)\|([^\]]+)\]\]/g, &#039;$2&#039;);&lt;br /&gt;
				text = text.replace(/\[\[([^\|\]]+)\]\]/g, &#039;$1&#039;);&lt;br /&gt;
				return text;&lt;br /&gt;
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.fileParameter,&lt;br /&gt;
			patterns.mapFrameTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.nowikiTag, patterns.preTag,&lt;br /&gt;
			patterns.insideHtmlComment]&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	function autoEdHTMLtoWikitextWikiTools(text) {&lt;br /&gt;
		return replaceExcept(&lt;br /&gt;
			text,&lt;br /&gt;
			autoEd.autoEdHTMLtoWikitext,&lt;br /&gt;
			[patterns.fileParameter, patterns.mapFrameTag, patterns.mathTag, patterns.sourceTag]&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	function superTool(text) {&lt;br /&gt;
		text = decodeHTMLSymbolEntitiesCodes(text);&lt;br /&gt;
		text = cleanTemplateBracesFromArticle(text);&lt;br /&gt;
		text = persianWikiTools.wikiConvertToPersianCharacters(text);&lt;br /&gt;
		text = persianWikiTools.wikiApplyZwnj(text);&lt;br /&gt;
		text = persianWikiTools.wikiApplyOrthography(text);&lt;br /&gt;
		text = persianWikiTools.wikitranslateEnMonth(text);&lt;br /&gt;
		if (mw.config.get(&#039;wgNamespaceNumber&#039;) !== 10) {&lt;br /&gt;
			text = persianWikiTools.wikiTextDigitsToPersian(text);&lt;br /&gt;
		}&lt;br /&gt;
		text = persianWikiTools.wikiUrlMinifier(text);&lt;br /&gt;
		text = persianWikiTools.wikiDictation(text);&lt;br /&gt;
		text = persianWikiTools.wikiPunctuation(text);&lt;br /&gt;
		text = persianWikiTools.wikiSubsection(text);&lt;br /&gt;
		text = persianWikiTools.SubSectionLeveling(text)&lt;br /&gt;
		//ابزارهای بیشتر برگرفته از ویکی‌پدیای انگلیسی [[Mediawiki:Gadget-Extra-Editbuttons-autoed.js]]&lt;br /&gt;
		text = autoEd.autoEdISBN(text);&lt;br /&gt;
		text = autoEd.autoEdWhitespace(text);&lt;br /&gt;
		text = autoEdHTMLtoWikitextWikiTools(text);&lt;br /&gt;
		text = autoEd.autoEdHeadlines(text);&lt;br /&gt;
		text = autoEd.autoEdTablestoWikitext(text);&lt;br /&gt;
		text = autoEd.autoEdExtraBreaks(text);&lt;br /&gt;
		text = persianWikiTools.addColumnToRefTemplate(text);&lt;br /&gt;
		text = persianWikiTools.removeCheckDict(text);&lt;br /&gt;
		text = persianWikiTools.sortCategories(text, mw.config.get(&#039;wgPageName&#039;).replace(/_/g, &#039; &#039;));&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function superToolMove(text) {&lt;br /&gt;
		text = &#039; &#039; + text + &#039; &#039;; // بعضی از کدها اگر فاصله در انتها یا اول نباشد عمل نمی‌کنند مانند افزودن تنوین به کلمه بعدا&lt;br /&gt;
		text = persianWikiTools.wikiConvertToPersianCharacters(text);&lt;br /&gt;
		text = persianTools.applyZwnj(text);&lt;br /&gt;
		text = persianWikiTools.wikiApplyOrthography(text);&lt;br /&gt;
		text = persianWikiTools.wikiTextDigitsToPersian(text);&lt;br /&gt;
		text = persianWikiTools.wikiUrlMinifier(text);&lt;br /&gt;
		text = persianWikiTools.wikiDictation(text);&lt;br /&gt;
		text = persianWikiTools.wikiPunctuation(text);&lt;br /&gt;
		return text.trim();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Puts the selceted text (trims spaces from start and end) in bdi tags&lt;br /&gt;
	// does not put the whole content in tags if no text is selected&lt;br /&gt;
	function putSelectionInBDI(text) {&lt;br /&gt;
	    // if no text is selected, don&#039;t put the whole content inside the tags&lt;br /&gt;
	    // can&#039;t return nothing because applyOnSelection() expects some text&lt;br /&gt;
	    // and throws an error while no text is provided&lt;br /&gt;
	    if (text == $(&#039;#wpTextbox1&#039;).val()) {&lt;br /&gt;
	        return text;&lt;br /&gt;
	    } else {&lt;br /&gt;
	        // regExp to trim space from begining and end of the selected text,&lt;br /&gt;
	        // and save them to be placed outside of tags&lt;br /&gt;
	        var regExp = /(^\s*)|(\s*$)/gm;&lt;br /&gt;
	        var startEndSpaces = text.match(regExp);&lt;br /&gt;
	        // place selected spaces outside of tags&lt;br /&gt;
	        // and remove them from the text inside&lt;br /&gt;
	        var outText = startEndSpaces[0] + &#039;&amp;lt;bdi&amp;gt;&#039; + text.replace(regExp, &#039;&#039;) + &#039;&amp;lt;/bdi&amp;gt;&#039; +  startEndSpaces[1]; &lt;br /&gt;
	        return outText;&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return {&lt;br /&gt;
		removeWikiSigne: removeWikiSigne,&lt;br /&gt;
		superTool: superTool,&lt;br /&gt;
		superToolMove: superToolMove,&lt;br /&gt;
		dictation: dictation,&lt;br /&gt;
		wikiApplyOrthography: wikiApplyOrthography,&lt;br /&gt;
		wikiApplyZwnj: wikiApplyZwnj,&lt;br /&gt;
		wikiConvertToPersianCharacters: wikiConvertToPersianCharacters,&lt;br /&gt;
		wikiDictation: wikiDictation,&lt;br /&gt;
		wikiPunctuation: wikiPunctuation,&lt;br /&gt;
		wikiSubsection: wikiSubsection,&lt;br /&gt;
		SubSectionLeveling: SubSectionLeveling,&lt;br /&gt;
		wikiUrlMinifier: wikiUrlMinifier,&lt;br /&gt;
		wikiTextDigitsToPersian: wikiTextDigitsToPersian,&lt;br /&gt;
		wikitranslateEnMonth: wikitranslateEnMonth,&lt;br /&gt;
		addColumnToRefTemplate: addColumnToRefTemplate,&lt;br /&gt;
		fixBadLinks: fixBadLinks,&lt;br /&gt;
		robustToEnglishDigits: robustToEnglishDigits,&lt;br /&gt;
		toEnglishDigits: toEnglishDigits,&lt;br /&gt;
		cleanTemplateBracesFromArticle: cleanTemplateBracesFromArticle,&lt;br /&gt;
		removeCheckDict: removeCheckDict,&lt;br /&gt;
		sortCategories: sortCategories,&lt;br /&gt;
		putSelectionInBDI : putSelectionInBDI&lt;br /&gt;
	};&lt;br /&gt;
}());&lt;br /&gt;
if (typeof window !== &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
	window.persianWikiTools = persianWikiTools;&lt;br /&gt;
}&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persiantools.js&amp;diff=1585</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons-persiantools.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persiantools.js&amp;diff=1585"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// &amp;lt;nowiki&amp;gt; // DO NOT REMOVE THIS LINE EVER&lt;br /&gt;
/**&lt;br /&gt;
 * Persian text style improvement tools&lt;br /&gt;
 * Tests: [[مدیاویکی:Gadget-Extra-Editbuttons-tests.js]] [[وپ:تست]]&lt;br /&gt;
 * See also:&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-persianwikitools.js]]&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-dictionary.js]]&lt;br /&gt;
 */&lt;br /&gt;
var persianTools = (function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	&lt;br /&gt;
	var persianGlyphs, persianDigits, arabicIndicDigits, arabicDigits,&lt;br /&gt;
		vowels, persianCharacters, persianCharactersNoVowels, persianPastVerbs,&lt;br /&gt;
		persianPresentVerbs, persianComplexPastVerbs, persianComplexPresentVerbs, similarPersianCharacters, hamza;&lt;br /&gt;
&lt;br /&gt;
	arabicDigits = &#039;0123456789&#039;;&lt;br /&gt;
	arabicIndicDigits = &#039;٠١٢٣٤٥٦٧٨٩&#039;;&lt;br /&gt;
	//نویسه\u200cهای غیرفارسی ي-ك-ە و موارد مشابه پیش از تبدیل به نویسهٔ فارسی در سایر ریجکس\u200cها باید به عنوان کاراکتر فارسی شناخته شوند.&lt;br /&gt;
	similarPersianCharacters = &#039;\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4&#039;;&lt;br /&gt;
	vowels = &#039;\u064B-\u0650\u0652\u0670&#039;;&lt;br /&gt;
	persianCharacters = &#039;\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2&#039; + similarPersianCharacters;&lt;br /&gt;
	persianCharactersNoVowels = &#039;\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2&#039; + similarPersianCharacters;&lt;br /&gt;
	persianDigits = &#039;۰۱۲۳۴۵۶۷۸۹&#039;;&lt;br /&gt;
	hamza = &#039;\u0654&#039;;&lt;br /&gt;
&lt;br /&gt;
	function normalizeZwnj(text) {&lt;br /&gt;
		return text&lt;br /&gt;
			// Replace LRM، RLM characters with ZWNJ and it will remove unneeded ZWNJ at next lines&lt;br /&gt;
			// .replace(/[\u180E\u2028\u2029\u202A\u202B\u202C\u202D\u202E\u200F¬]/g, &#039;\u200c&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;] *)[\u200F\u200E]+( *[&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;), &#039;$1\u200c$2&#039;)&lt;br /&gt;
			// Remove more than a ZWNJs&lt;br /&gt;
			.replace(/([\u200B-\u200D\uFEFF\u200E\u200F]){2,}/g, &#039;$1&#039;)&lt;br /&gt;
			// Convert ¬ to zwnj in Persian context&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])¬(?=[&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;), &#039;$1\u200c&#039;)&lt;br /&gt;
			// Clean ZWNJs after characters that don&#039;t conncet to the next letter&lt;br /&gt;
			.replace(/([۰-۹0-9إأةؤورزژاآدذ،؛,\:«»\\\/@#$٪×\*\(\)ـ\-=\|ء])\u200c/g, &#039;$1&#039;)&lt;br /&gt;
			// Clean ZWNJs before and after English characters&lt;br /&gt;
			.replace(/[\u200B-\u200D\uFEFF]([\w])/g, &#039;$1&#039;)&lt;br /&gt;
			.replace(/([\w])[\u200B-\u200D\uFEFF]/g, &#039;$1&#039;)&lt;br /&gt;
			// Clean ZWNJs before and after Persian characters&lt;br /&gt;
			.replace(new RegExp(&#039;\[\\u200b\-\\u200d\\uFEFF\]([&#039; + vowels + arabicIndicDigits + persianDigits + hamza + &#039;])&#039;,&#039;g&#039;), &#039;$1&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039;+arabicIndicDigits+&#039;])\[\\u200b\-\\u200d\\uFEFF\]&#039;,&#039;g&#039;), &#039;$1&#039;)&lt;br /&gt;
			// Clean ZWNJs after and before punctuation&lt;br /&gt;
			.replace(/[\u200B\u200C\uFEFF]([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, &#039;$1&#039;)&lt;br /&gt;
			.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])[\u200B-\u200D\uFEFF]/g, &#039;$1&#039;)&lt;br /&gt;
			// Clean ZWNJs before brackets which have space after/before them&lt;br /&gt;
			.replace(/[\u200B-\u200D\uFEFF](\]\][\s\n])/g, &#039;$1&#039;)&lt;br /&gt;
			.replace(/([\n\s]\[\[)[\u200B-\u200D\uFEFF]/g, &#039;$1&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	persianGlyphs = {&lt;br /&gt;
		// these two are for visually available ZWNJ #visualZwnj&lt;br /&gt;
		&#039;\u200cه&#039;: &#039;ﻫ&#039;,&lt;br /&gt;
		&#039;ی\u200c&#039;: &#039;ﻰﻲ&#039;,&lt;br /&gt;
		&#039;أ&#039;: &#039;ﺄﺃﺃ&#039;,&lt;br /&gt;
		&#039;آ&#039;: &#039;ﺁﺁﺂ&#039;,&lt;br /&gt;
		&#039;إ&#039;: &#039;ﺇﺈﺇ&#039;,&lt;br /&gt;
		&#039;ا&#039;: &#039;ﺍﺎ&#039;,&lt;br /&gt;
		&#039;ب&#039;: &#039;ﺏﺐﺑﺒ&#039;,&lt;br /&gt;
		&#039;پ&#039;: &#039;ﭖﭗﭘﭙ&#039;,&lt;br /&gt;
		&#039;ت&#039;: &#039;ﺕﺖﺗﺘ&#039;,&lt;br /&gt;
		&#039;ث&#039;: &#039;ﺙﺚﺛﺜ&#039;,&lt;br /&gt;
		&#039;ج&#039;: &#039;ﺝﺞﺟﺠ&#039;,&lt;br /&gt;
		&#039;چ&#039;: &#039;ﭺﭻﭼﭽ&#039;,&lt;br /&gt;
		&#039;ح&#039;: &#039;ﺡﺢﺣﺤ&#039;,&lt;br /&gt;
		&#039;خ&#039;: &#039;ﺥﺦﺧﺨ&#039;,&lt;br /&gt;
		&#039;د&#039;: &#039;ﺩﺪ&#039;,&lt;br /&gt;
		&#039;ذ&#039;: &#039;ﺫﺬ&#039;,&lt;br /&gt;
		&#039;ر&#039;: &#039;ﺭﺮ&#039;,&lt;br /&gt;
		&#039;ز&#039;: &#039;ﺯﺰ&#039;,&lt;br /&gt;
		&#039;ژ&#039;: &#039;ﮊﮋ&#039;,&lt;br /&gt;
		&#039;س&#039;: &#039;ﺱﺲﺳﺴ&#039;,&lt;br /&gt;
		&#039;ش&#039;: &#039;ﺵﺶﺷﺸ&#039;,&lt;br /&gt;
		&#039;ص&#039;: &#039;ﺹﺺﺻﺼ&#039;,&lt;br /&gt;
		&#039;ض&#039;: &#039;ﺽﺾﺿﻀ&#039;,&lt;br /&gt;
		&#039;ط&#039;: &#039;ﻁﻂﻃﻄ&#039;,&lt;br /&gt;
		&#039;ظ&#039;: &#039;ﻅﻆﻇﻈ&#039;,&lt;br /&gt;
		&#039;ع&#039;: &#039;ﻉﻊﻋﻌ&#039;,&lt;br /&gt;
		&#039;غ&#039;: &#039;ﻍﻎﻏﻐ&#039;,&lt;br /&gt;
		&#039;ف&#039;: &#039;ﻑﻒﻓﻔ&#039;,&lt;br /&gt;
		&#039;ق&#039;: &#039;ﻕﻖﻗﻘ&#039;,&lt;br /&gt;
		&#039;ک&#039;: &#039;ﮎﮏﮐﮑﻙﻚﻛﻜ&#039;,&lt;br /&gt;
		&#039;گ&#039;: &#039;ﮒﮓﮔﮕ&#039;,&lt;br /&gt;
		&#039;ل&#039;: &#039;ﻝﻞﻟﻠ&#039;,&lt;br /&gt;
		&#039;م&#039;: &#039;ﻡﻢﻣﻤ&#039;,&lt;br /&gt;
		&#039;ن&#039;: &#039;ﻥﻦﻧﻨ&#039;,&lt;br /&gt;
		&#039;ه&#039;: &#039;ﻩﻪﻫﻬ&#039;,&lt;br /&gt;
		&#039;هٔ&#039;: &#039;ﮤﮥ&#039;,&lt;br /&gt;
		&#039;و&#039;: &#039;ﻭﻮ&#039;,&lt;br /&gt;
		&#039;ؤ&#039;: &#039;ﺅﺅﺆ&#039;,&lt;br /&gt;
		&#039;ی&#039;: &#039;ﯼﯽﯾﯿﻯﻰﻱﻲﻳﻴ&#039;,&lt;br /&gt;
		&#039;ئ&#039;: &#039;ﺉﺊﺋﺌ&#039;,&lt;br /&gt;
		&#039;لا&#039;: &#039;ﻻﻼ&#039;,&lt;br /&gt;
		&#039;لإ&#039;: &#039;ﻹﻺ&#039;,&lt;br /&gt;
		&#039;لأ&#039;: &#039;ﻸﻷ&#039;,&lt;br /&gt;
		&#039;لآ&#039;: &#039;ﻵﻶ&#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	function toStandardPersianCharacters(text) {&lt;br /&gt;
		var i;&lt;br /&gt;
		for (i in persianGlyphs) {&lt;br /&gt;
			if (persianGlyphs.hasOwnProperty(i)) {&lt;br /&gt;
				text = text.replace(new RegExp(&#039;[&#039; + persianGlyphs[i] + &#039;]&#039;, &#039;g&#039;), i);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return normalizeZwnj(text) // needed because of #visualZwnj&lt;br /&gt;
			.replace(/ك/g, &#039;ک&#039;) // Arabic&lt;br /&gt;
			.replace(/ڪ/g, &#039;ک&#039;) // Urdu&lt;br /&gt;
			.replace(/ﻙ/g, &#039;ک&#039;) // Pushtu&lt;br /&gt;
			.replace(/ﻚ/g, &#039;ک&#039;) // Uyghur&lt;br /&gt;
			.replace(/ي/g, &#039;ی&#039;) // Arabic&lt;br /&gt;
			.replace(/ى/g, &#039;ی&#039;) // Urdu&lt;br /&gt;
			.replace(/ے/g, &#039;ی&#039;) // Urdu&lt;br /&gt;
			.replace(/ۍ/g, &#039;ی&#039;) // Pushtu&lt;br /&gt;
			.replace(/ې/g, &#039;ی&#039;) // Uyghur&lt;br /&gt;
			.replace(/ہ/g, &#039;ه&#039;) // Convert &amp;amp;#x06C1; to &amp;amp;#x0647; ہہہہ to ههه&lt;br /&gt;
			.replace(/ە/g, &#039;ه\u200c&#039;) // Kurdish&lt;br /&gt;
			.replace(/ھ/g, &#039;ه&#039;); // Kurdish&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toPersianDigits(text) {&lt;br /&gt;
		var i = 0;&lt;br /&gt;
		for (i = 0; i &amp;lt;= 9; i = i + 1) {&lt;br /&gt;
			text = text.replace(new RegExp(&#039;[&#039; + arabicIndicDigits[i] + arabicDigits[i] + &#039;]&#039;, &#039;g&#039;), persianDigits[i]);&lt;br /&gt;
		}&lt;br /&gt;
		return text&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianDigits + &#039;]) ?%&#039;, &#039;g&#039;), &#039;$1٪&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;٪([&#039; + persianDigits + &#039;]+(?:[.٬٫][&#039; + persianDigits + &#039;]*)*)&#039;, &#039;g&#039;), &#039;$1٪&#039;)&lt;br /&gt;
			//.replace(new RegExp(&#039;([&#039; + persianDigits + &#039;])\\.(?=[&#039; + persianDigits + &#039;])&#039;, &#039;g&#039;), &#039;$1٫&#039;) // persian decimal separator&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianDigits + &#039;])\\،(?=[&#039; + persianDigits + &#039;])&#039;, &#039;g&#039;), &#039;$1٬&#039;); // جایگزینی جداکننده هزاگان به جای ویرگول در میان اعداد&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function applyOrthography(text) {&lt;br /&gt;
		return text&lt;br /&gt;
			.replace(/\r/g, &#039;&#039;)&lt;br /&gt;
			//تمیزکاری autoFormatter.js&lt;br /&gt;
			.replace( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\u00AD]+/g, &#039;&#039; )&lt;br /&gt;
			.replace(/[ \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n/g,&#039;\n&#039;)&lt;br /&gt;
			//تبدیل تب و فاصله نشکن اول خط به هیچ چون مدیاویکی آن را در نظر نمی‌گیرد&lt;br /&gt;
			.replace(/\n[\t\u00A0]+/g, &#039;\n&#039;)&lt;br /&gt;
			//تبدیل انواع فاصله‌ها به فاصله ساده&lt;br /&gt;
			.replace(/[\u0020\u0085\u00A0\u180E\u2000-\u200A\u202F\u205F\u3000]/g, &#039; &#039;)&lt;br /&gt;
			.replace(/[\u0085]/g, &#039;&#039;)&lt;br /&gt;
			//http://kb.mozillazine.org/Network.IDN.blacklist_chars&lt;br /&gt;
			.replace(/[\u01C3\uFE15]/g, &#039;!&#039;)&lt;br /&gt;
			.replace(/[\u0589\u05C3\uA789]/g, &#039;:&#039;)&lt;br /&gt;
			.replace(/[\u0338\u2044\u2215\u2571\u29F8\u3033\uFF0F]/g, &#039;/&#039;)&lt;br /&gt;
			.replace(/[\u05F4]/g, &#039;&amp;quot;&#039;)&lt;br /&gt;
			.replace(/[\u06D4\u0701\uFF0E\uFF61]/g, &#039;.&#039;)&lt;br /&gt;
			.replace(/\u3014/g, &#039;(&#039;)&lt;br /&gt;
			.replace(/\u3015/g, &#039;)&#039;)&lt;br /&gt;
			// جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله&lt;br /&gt;
			.replace(/[ۂۀ](?![\s\n])/g, &#039;هٔ &#039;)&lt;br /&gt;
			// Replace ه followed by ARABIC LETTER HIGH HAMZA with the correct one, ARABIC HAMZA ABOVE&lt;br /&gt;
			.replace(/هٴ([\s\n])/g, &#039;هٔ$1&#039;)&lt;br /&gt;
			// Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ&lt;br /&gt;
			.replace(/ه[\u200c\u200e\s]+ی([\s\n])/g, &#039;هٔ$1&#039;)&lt;br /&gt;
			// Replace ه followed by (space|ZWNJ|lrm|nothing) follow by ء or with هٔ&lt;br /&gt;
			.replace(/ه[\u200c\u200e\s]*[ءٔ]([\s\n])/g, &#039;هٔ$1&#039;)&lt;br /&gt;
			// Replace هٓ or single-character ۀ with the standard هٔ&lt;br /&gt;
			.replace(/(ۀ|هٓ)/g, &#039;هٔ&#039;)&lt;br /&gt;
			// Replace ه followed by ئ or ی, and then by ی, with ه\u200cای, example: خانهئی becomes خانه\u200cای&lt;br /&gt;
			.replace(/ه\u200c[ئی]ی/g, &#039;ه\u200cای&#039;)&lt;br /&gt;
			// Function for removing incorrect ZWNJs&lt;br /&gt;
			.replace(/([\u200c\u200e])([\s\n])/g, &#039;$2&#039;)&lt;br /&gt;
			.replace(/([\s\n])([\u200c\u200e])/g, &#039;$1&#039;)&lt;br /&gt;
			//فاصلهٔ پیش از واکه\u200cهای کوتاه اشتباه است و برای جلوگیر از به هم چسبیدن کلمات فاصله و واکه جابجا باید گردند.&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + vowels + hamza + &#039;])(\\s)([&#039; + vowels + hamza + &#039;])&#039;, &#039;g&#039;), &#039;$1$3$2&#039;)&lt;br /&gt;
			//واکه\u200cهای کوتاه پشت سرهم نمی\u200cآیند و یک حرف باید بینشان فاصله باشد&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + vowels + hamza + &#039;]){2,}&#039;, &#039;g&#039;), &#039;$1&#039;)&lt;br /&gt;
			.replace(/ئء/g, &#039;یء&#039;) //two hamzes after each other&lt;br /&gt;
			.replace(/أء/g, &#039;اء&#039;) //two hamzes after each other&lt;br /&gt;
			.replace(/ؤء/g, &#039;ؤ&#039;) //two hamzes after each other&lt;br /&gt;
			//.replace(/وء/g, &#039;ؤ&#039;)//bug on  سوء&lt;br /&gt;
			.replace(/سؤ ?استفاده/g, &#039;سوءاستفاده&#039;)//bug on سوءاستفاده و سوء&lt;br /&gt;
			.replace(/ و یا /g, &#039; یا &#039;);// replace «و یا» with «یا»&lt;br /&gt;
			//افزودن همزه&lt;br /&gt;
			//.replace(/درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, &#039;درباره‌$1$2&#039;)//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره&lt;br /&gt;
			//.replace(/درباره /g, &#039;دربارهٔ &#039;)&lt;br /&gt;
			//.replace(new RegExp(&#039;صفحه(\\s|)([&#039;+persianDigits+&#039;]+)(\\n|\\.|\\,|\\||\\&amp;lt;)&#039;, &#039;g&#039;), &#039;صفحهٔ $2$3&#039;);//[[Special:PermaLink/15326391#افزودن همزه]]&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Replaces Persian characters with Arabic&#039;s ones so an Arabic sorter can sort Persian lines&lt;br /&gt;
	 */&lt;br /&gt;
	function prepareForArabicSort(text) {&lt;br /&gt;
		return text&lt;br /&gt;
			.replace(/ی/g, &#039;ي&#039;)&lt;br /&gt;
			.replace(/ک/g, &#039;ك&#039;)&lt;br /&gt;
			.replace(/گ/g, &#039;كی&#039;)&lt;br /&gt;
			.replace(/ژ/g, &#039;زی&#039;)&lt;br /&gt;
			.replace(/چ/g, &#039;جی&#039;)&lt;br /&gt;
			.replace(/پ/g, &#039;بی&#039;)&lt;br /&gt;
			.replace(/و/g, &#039;نی&#039;)&lt;br /&gt;
			// 1728 === &#039;۰&#039;.charCodeAt(0) - &#039;0&#039;.charCodeAt(0)&lt;br /&gt;
			.replace(/([۰-۹])/g, function (x) { return String.fromCharCode(x.charCodeAt(0) - 1728) });&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function persianSort(array) {&lt;br /&gt;
		return array.sort(function (x, y) {&lt;br /&gt;
			var keyX = prepareForArabicSort(x),&lt;br /&gt;
				keyY = prepareForArabicSort(y);&lt;br /&gt;
			return keyX &amp;lt; keyY ? -1 : keyX &amp;gt; keyY ? 1 : 0;&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	persianPastVerbs = &#039;(&#039; +&lt;br /&gt;
		&#039;ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد&#039; +&lt;br /&gt;
		&#039;|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند&#039; +&lt;br /&gt;
		&#039;|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید&#039; +&lt;br /&gt;
		&#039;|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید&#039; +&lt;br /&gt;
		&#039;|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت&#039; +&lt;br /&gt;
		&#039;|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست&#039; +&lt;br /&gt;
		&#039;|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید&#039; +&lt;br /&gt;
		&#039;|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خشکاند&#039; +&lt;br /&gt;
		&#039;|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست&#039; +&lt;br /&gt;
		&#039;|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست&#039; +&lt;br /&gt;
		&#039;|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید&#039; +&lt;br /&gt;
		&#039;|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید&#039; +&lt;br /&gt;
		&#039;|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت&#039; +&lt;br /&gt;
		&#039;|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت&#039; +&lt;br /&gt;
		&#039;|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید&#039; +&lt;br /&gt;
		&#039;|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست&#039; +&lt;br /&gt;
		&#039;|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید&#039; +&lt;br /&gt;
		&#039;|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید&#039; +&lt;br /&gt;
		&#039;|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت&#039; +&lt;br /&gt;
		&#039;|ورزید|وزاند|وزید|یارست|یازید|یافت&#039; +&lt;br /&gt;
		&#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
	persianPresentVerbs = &#039;(&#039; +&lt;br /&gt;
		&#039;ارز|افت|افراز|افروز|افزا|افزای|افسر|افشان|افکن|انبار|انباز|انجام|انداز|اندای|اندوز|اندیش|انگار|انگیز|انگیزان&#039; +&lt;br /&gt;
		&#039;|اوبار|ایست|آرا|آرام|آرامان|آرای|آزار|آزما|آزمای|آسا|آسای|آشام|آشوب|آغار|آغاز|آفرین|آکن|آگن|آلا|آلای&#039; +&lt;br /&gt;
		&#039;|آمرز|آموز|آموزان|آمیز|آهنج|آور|آویز|آی|بار|باران|باز|باش|باف|بال|باوران|بای|باید|بخش|بخشا|بخشای&#039; +&lt;br /&gt;
		&#039;|بر|بَر|بُر|براز|بساو|بسیج|بلع|بند|بو|بوس|بوی|بیز|بین|پا|پاش|پاشان|پالا|پالای|پذیر|پذیران&#039; +&lt;br /&gt;
		&#039;|پر|پراکن|پران|پرداز|پرس|پرست|پرهیز|پرور|پروران|پز|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوشان&#039; +&lt;br /&gt;
		&#039;|پوی|پیچ|پیچان|پیرا|پیرای|پیما|پیمای|پیوند|تاب|تابان|تاران|تاز|تازان|تپ|تپان|تراش|تراشان|تراو|ترس|ترسان&#039; +&lt;br /&gt;
		&#039;|ترش|ترک|ترکان|تکان|تن|توان|توپ|جنب|جنبان|جنگ|جه|جهان|جو|جوش|جوشان|جوی|چاپ|چای|چپ|چپان&#039; +&lt;br /&gt;
		&#039;|چر|چران|چرب|چرخ|چرخان|چسب|چسبان|چش|چشان|چک|چکان|چل|چلان|چم|چین|خار|خاران|خای|خر|خراش&#039; +&lt;br /&gt;
		&#039;|خراشان|خرام|خروش|خز|خشک|خشکان|خل|خم|خند|خندان|خواب|خوابان|خوان|خواه|خور|خوران|خوف|خیز|خیس&#039; +&lt;br /&gt;
		&#039;|خیسان|دار|درخش|درخشان|درو|دزد|دم|ده|دو|دوان|دوز|دوش|ران|ربا|ربای|رخش|رس|رسان&#039; +&lt;br /&gt;
		&#039;|رشت|رقص|رقصان|رم|رنج|رنجان|رند|ره|رهان|رو|روب|روی|رویان|ریز|ریس|رین|زا|زار|زای|زدا&#039; +&lt;br /&gt;
		&#039;|زدای|زن|زی|ساب|ساز|سای|سپار|سپر|سپوز|ستا|ستان|ستر|ستیز|سر|سرا|سرای|سرشت|سز|سگال|سنب&#039; +&lt;br /&gt;
		&#039;|سنج|سوز|سوزان|شاش|شای|شتاب|شکاف|شکف|شکن|شکوف|شکیب|شمار|شمر|شناس|شناسان|شنو|شو|شور|شوران|شوی&#039; +&lt;br /&gt;
		&#039;|طپ|طلب|طوف|غارت|غر|غلت|غلتان|غلط|غلطان|غنو|فرسا|فرسای|فرست|فرما|فرمای|فروش|فریب|فشار|فشان|فشر&#039; +&lt;br /&gt;
		&#039;|فهم|فهمان|قاپ|قبولان|کار|کاه|کاو|کش|کَش|کُش|کِش|کشان|کف|کن|کوب|کوچ|کوش|گا|گای|گداز&#039; +&lt;br /&gt;
		&#039;|گذار|گذر|گذران|گرا|گراز|گرای|گرد|گردان|گرو|گری|گریان|گریز|گز|گزار|گزین|گسار|گستر|گستران|گسل|گشا&#039; +&lt;br /&gt;
		&#039;|گشای|گمار|گنج|گنجان|گند|گو|گوار|گوز|گوی|گیر|لرز|لرزان|لغز|لغزان|لم|لمبان|لند|لنگ|له|لول&#039; +&lt;br /&gt;
		&#039;|لیس|ماس|مال|مان|مک|مول|موی|میر|ناز|نال|نام|نشان|نشین|نکوه|نگار|نگر|نما|نمای|نمایان|نه&#039; +&lt;br /&gt;
		&#039;|نهنب|نواز|نورد|نوش|نوشان|نویس|نیوش|هراس|هست|هل|ورز|وز|وزان|یاب|یار|یاز&#039; +&lt;br /&gt;
		&#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
	persianComplexPastVerbs={&lt;br /&gt;
		&#039;باز&#039;:&#039;آفرید|آمد|آموخت|آورد|ایستاد|تابید|جست|خواند|داشت|رساند|ستاند|شمرد|ماند|نمایاند|نهاد|نگریست|پرسید|گذارد&#039;+&lt;br /&gt;
			&#039;|گرداند|گردید|گرفت|گشت|گشود|گفت|یافت&#039;,&lt;br /&gt;
		&#039;در&#039;:&#039;بر ?داشت|بر ?گرفت|آمد|آمیخت|آورد|آویخت|افتاد|افکند|انداخت|رفت|ماند|نوردید|کشید|گرفت&#039;,//bug: در گذشته &lt;br /&gt;
		&#039;بر&#039;:&#039;آشفت|آمد|آورد|افتاد|افراشت|افروخت|افشاند|افکند|انداخت|انگیخت|تاباند|تابید|تافت|تنید|جهید|خاست|خواست|خورد&#039;+&lt;br /&gt;
			&#039;|داشت|دمید|شمرد|نهاد|چید|کرد|کشید|گرداند|گردانید|گردید|گزید|گشت|گشود|گمارد|گماشت&#039;,&lt;br /&gt;
		&#039;فرو&#039;:&#039;آمد|خورد|داد|رفت|نشاند|کرد|گذارد|گذاشت&#039;,&lt;br /&gt;
		&#039;وا&#039;:&#039;داشت|رهاند|ماند|نهاد|کرد&#039;,&lt;br /&gt;
		&#039;ور&#039;:&#039;آمد|افتاد|رفت&#039;,&lt;br /&gt;
		&#039;یاد&#039;:&#039;گرفت&#039;,&lt;br /&gt;
		&#039;پدید&#039;:&#039;آورد&#039;,&lt;br /&gt;
		&#039;پراکنده&#039;:&#039;ساخت&#039;,&lt;br /&gt;
		&#039;زمین&#039;:&#039;خورد&#039;,&lt;br /&gt;
		&#039;گول&#039;:&#039;زد&#039;,&lt;br /&gt;
		&#039;لخت&#039;:&#039;کرد&#039;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	persianComplexPresentVerbs={&lt;br /&gt;
		&#039;باز&#039;:&#039;آفرین|آموز|آور|ایست|تاب|جو|خوان|دار|رس|ستان|شمار|مان|نمایان|نه|نگر|پرس|گذار|گردان|گرد|گشا|گو|گیر|یاب&#039;,&lt;br /&gt;
		&#039;در&#039;:&#039;بر ?دار|بر ?گیر|آمیز|آور|آویز|افت|افکن|انداز|مان|نورد|کش|گذر|گیر&#039;,//مشکل با: در روم باستان، در ده &lt;br /&gt;
		&#039;بر&#039;:&#039;آشوب|آور|افت|افراز|افروز|افشان|افکن|انداز|انگیز|تابان|تاب|تن|جه|خواه|خور|خیز|دار|دم|شمار|نه|چین|کش|کن&#039;+&lt;br /&gt;
			&#039;|گردان|گزین|گشا|گمار&#039;,&lt;br /&gt;
		//مشکل با : بر گردن&lt;br /&gt;
		&#039;فرو&#039;:&#039;خور|ده|رو|نشین|کن|گذار&#039;,&lt;br /&gt;
		&#039;وا&#039;:&#039;دار|رهان|مان|نه|کن&#039;,&lt;br /&gt;
		&#039;ور&#039;:&#039;افت|رو&#039;,&lt;br /&gt;
		&#039;یاد&#039;:&#039;گیر&#039;,&lt;br /&gt;
		&#039;پدید&#039;:&#039;آور&#039;,&lt;br /&gt;
		&#039;پراکنده&#039;:&#039;ساز&#039;,&lt;br /&gt;
		&#039;زمین&#039;:&#039;خور&#039;,&lt;br /&gt;
		&#039;گول&#039;:&#039;زن&#039;,&lt;br /&gt;
		&#039;لخت&#039;:&#039;کن&#039;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function complexVerbsApplyZwnj(text) {&lt;br /&gt;
		for (var x in persianComplexPastVerbs) {&lt;br /&gt;
			var y = persianComplexPastVerbs[x]&lt;br /&gt;
			text = text.replace(new RegExp(&lt;br /&gt;
				  &#039;(^|[^&#039; + persianCharacters + &#039;])(&#039; + x + &#039;) ?(می|نمی|)( |\u200c|)(ن|)(&#039;&lt;br /&gt;
					 + y + &#039;)(م|ی|یم|ید|ند|ه|ن|)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2\u200c$3\u200c$5$6$7$8&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		for (var x in persianComplexPresentVerbs) {&lt;br /&gt;
			var y = persianComplexPresentVerbs[x]&lt;br /&gt;
			text = text.replace(new RegExp(&lt;br /&gt;
				  &#039;(^|[^&#039; + persianCharacters + &#039;])(&#039; + x + &#039;) ?(می|نمی|)( |\u200c|)(ن|)(&#039;&lt;br /&gt;
					 + y + &#039;)(م|ی|د|یم|ید|ند|ن)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2\u200c$3\u200c$5$6$7$8&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function applyZwnj(text) {&lt;br /&gt;
		text=complexVerbsApplyZwnj(text);&lt;br /&gt;
		return normalizeZwnj(text)&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;(^|[^&#039; + persianCharacters + &#039;])(می|نمی) ?&#039; + persianPastVerbs +&lt;br /&gt;
					&#039;(م|ی|یم|ید|ند|ه|)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2\u200c$3$4$5&#039;&lt;br /&gt;
			)&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;(^|[^&#039; + persianCharacters + &#039;])(می|نمی) ?&#039; + persianPresentVerbs +&lt;br /&gt;
					&#039;(م|ی|د|یم|ید|ند)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2\u200c$3$4$5&#039;&lt;br /&gt;
			)&lt;br /&gt;
			// ماضی نقلی&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;(^|[^&#039; + persianCharacters + &#039;])(ن|)&#039; + persianPastVerbs +&lt;br /&gt;
					&#039;ه (ام|ای|ایم|اید|اند)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2$3ه\u200c$4$5&#039;&lt;br /&gt;
			)&lt;br /&gt;
			&lt;br /&gt;
			// بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;(^|[^&#039; + persianCharacters + &#039;])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1$2\u200c$3$4$5&#039;&lt;br /&gt;
			)&lt;br /&gt;
			// ای «توان» ناقلا!&lt;br /&gt;
			.replace(/(\s)(می|نمی) ?توان/g, &#039;$1$2\u200cتوان&#039;)&lt;br /&gt;
			// چسباندن تمام «ها»ها با فاصلهٔ مجازی&lt;br /&gt;
			.replace(/ ها([\]\.،\:»\)\s]|\&#039;{2,3}|\={2,})/g, &#039;\u200cها$1&#039;)&lt;br /&gt;
			.replace(/ ها(ی|یی|یم|یت|یش|ی?مان|ی?تان|ی?شان)([\]\.،\:»\)\s])/g, &#039;\u200cها$1$2&#039;)&lt;br /&gt;
			.replace(/هها/g, &#039;ه‌ها&#039;)&lt;br /&gt;
			// چسباندن تمام «ترین»ها با فاصلهٔ مجازی&lt;br /&gt;
			.replace(/ ترین([\]\.،\:»\)\s]|\&#039;{2,3}|\={2,})/g, &#039;\u200cترین$1&#039;)&lt;br /&gt;
			// چسباندن تمام «تبار»ها با فاصلهٔ مجازی&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;([&#039; + persianCharacters + &#039;]ی) تبار([^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1\u200cتبار$2&#039;&lt;br /&gt;
			)&lt;br /&gt;
			// چسباندن تمام «شناس»ها با فاصلهٔ مجازی&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;([&#039; + persianCharacters + &#039;]) شناس(ی?[^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1\u200cشناس$2&#039;&lt;br /&gt;
			)&lt;br /&gt;
			// چسباندن تمام «گیر»ها با فاصلهٔ مجازی&lt;br /&gt;
			.replace(&lt;br /&gt;
				new RegExp(&#039;([&#039; + persianCharacters + &#039;]) گیری([^&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;),&lt;br /&gt;
				&#039;$1\u200cگیری$2&#039;&lt;br /&gt;
			)&lt;br /&gt;
			// برای حذف علامت ستاره اضافی قبل از عنوان ها&lt;br /&gt;
			.replace(/\n\*\s*(\=+.+?\=+\n)/g, &#039;\n$1&#039;)&lt;br /&gt;
			// عضو علامت های نقل قول تکی از عنوان ها&lt;br /&gt;
			.replace(/(\n=+)(.*?)(?:&#039;+)(.*?)(?:&#039;+)(.*?)(=+\n)/g, &#039;$1$2$3$4$5&#039;)&lt;br /&gt;
			// اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود&lt;br /&gt;
			.replace(/(^\u200c|\u200c$)/mg, &#039;&#039;)&lt;br /&gt;
			// شناسه ها&lt;br /&gt;
			// توجه: «است» تعدماً از شناسه ها حذف شده چون به عنوان فعل مستقل هم کاربرد دارد و در آن موارد باید جدا نوشته شود&lt;br /&gt;
			// مثال: «این یک خانه است» که است در آن باید از خانه جدا نوشته شود&lt;br /&gt;
			// حروف «ام» و «ای» هم به دلیل تشابه با حرف ندا «اِی» و ام انگلیسی و ای انگلیسی حذف شدند.&lt;br /&gt;
			//.replace(new RegExp(&#039;ه +(ایم|اید|اند)($|[^&#039; + persianCharacters + &#039;\u200c])&#039;, &#039;g&#039;), &#039;ه\u200c$1$2&#039;)// به بخش ماضی نقلی منتقل شد&lt;br /&gt;
			// موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود&lt;br /&gt;
			.replace(/ا\sً/g, &#039;اً&#039;)&lt;br /&gt;
			// رفع اشکال که\u200cای&lt;br /&gt;
			.replace(/ که\u200cای /g, &#039; که ای &#039;)&lt;br /&gt;
			//رفع اشکال میستری (Mystery)&lt;br /&gt;
			.replace(/می\u200cستری/g, &#039;میستری&#039;)&lt;br /&gt;
			.replace(/ویکیپدیا/g, &#039;ویکی‌پدیا&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;می\u200cگوی($|[^&#039; + persianCharacters + &#039;\u200c])&#039;, &#039;g&#039;), &#039;میگوی$1&#039;) // for میگوی دریایی&lt;br /&gt;
			.replace(new RegExp(&#039;می\u200cدوی($|[^&#039; + persianCharacters + &#039;\u200c])&#039;, &#039;g&#039;), &#039;میدوی$1&#039;);// for [[میدوی (ابهام‌زدایی)]]&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function punctuation(text) {&lt;br /&gt;
		return text&lt;br /&gt;
			/// سجاوندی غیرفارسی&lt;br /&gt;
			.replace(/ː/g, &#039;:&#039;) // Replace incorrect : character&lt;br /&gt;
			// استفاده از ؟ فارسی&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])[ ]*[?]&#039;, &#039;g&#039;), &#039;$1؟&#039;)&lt;br /&gt;
			// استفاده از ; فارسی&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])[ ]*[;]&#039;, &#039;g&#039;), &#039;$1؛ &#039;)&lt;br /&gt;
			// استفاده از ، فارسی&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])(\]\]|»|)[ ]*[,]&#039;, &#039;g&#039;), &#039;$1$2، &#039;)&lt;br /&gt;
			//حذف دو فاصله بعد از سجاوندی&lt;br /&gt;
			.replace(/(،|؛|؟|\.)  /g, &#039;$1 &#039;)&lt;br /&gt;
			.replace(/\r/g, &#039;&#039;)&lt;br /&gt;
			// افزودن یا حذف فاصله&lt;br /&gt;
			// حذف فاصله‌های تکراری میان واژه‌ها، به جز بین نام پارامتر و علامت مساوی&lt;br /&gt;
			.replace(/(. ) +(?=[^= ])/g, &#039;$1&#039;)&lt;br /&gt;
			//فاصله بعد از سجاوندی به جز ! به دلیل (&amp;lt;!-- و !! در بالای جدول‌ها)&lt;br /&gt;
			.replace(/([،\.\؛\؟»])([^\s،\.\(\)«»\&amp;quot;\[\]&amp;lt;&amp;gt;\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\&#039;])/g, &#039;$1 $2&#039;)&lt;br /&gt;
			// افزودن فاصله به بعد از سجاوندی&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;]+|\\]|\\)|»)([؟،؛\\!\\.])([&#039; + persianCharacters +persianDigits + &#039;]+|\\[|\\(|«)&#039;, &#039;g&#039;), &#039;$1$2 $3&#039;)&lt;br /&gt;
			// حذف فاصله بعد از گیومه، پرانتز، براکت باز&lt;br /&gt;
			.replace(/([\(«\[]) /g, &#039;$1&#039;)&lt;br /&gt;
			// حذف فاصله قبل از گیومه، پرانتز&lt;br /&gt;
			.replace(/ ([\)»])/g, &#039;$1&#039;)&lt;br /&gt;
			//.replace(/ (\])/g, &#039;$1&#039;) // فاصله پیش از پراکت را حذف نکن زیرا در ویکی کاربرد مهمی دارد&lt;br /&gt;
			// افزودن فاصله قبل از گیومه باز&lt;br /&gt;
			.replace(/([^ \(\[\|\r\n&amp;gt;&#039;])(«)/g, &#039;$1 $2&#039;)&lt;br /&gt;
			.replace(/ +\( +/g, &#039; (&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;]|\\]|») *\\( *(?=[&#039; + persianCharacters + &#039;])(?!ها\\)|ان\\))&#039;, &#039;g&#039;), &#039;$1 (&#039;)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;]) *\\) *(?=[&#039; + persianCharacters + &#039;]|\\[|«)&#039;, &#039;g&#039;), &#039;$1) &#039;)&lt;br /&gt;
			// خط جدید&lt;br /&gt;
			.replace(/\n\s{1,}\n/g, &#039;\n\n&#039;)&lt;br /&gt;
			// Removes extra line between two items list&lt;br /&gt;
			.replace(/(\n\*.*?)\n+(?=\n\*)/g, &#039;$1&#039;)&lt;br /&gt;
			// Removes extra line between two items list&lt;br /&gt;
			.replace(/(\n#.*?)\n+(?=\n#)/g, &#039;$1&#039;)&lt;br /&gt;
			// Convert , to ، if there are Persian characters on both sides of it &lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;]), ?(?=[&#039; + persianCharacters + &amp;quot;])&amp;quot;, &#039;g&#039;), &#039;$1$2، &#039;)&lt;br /&gt;
			// بعد از نقطه‌ویرگول فارسی علامتی قرار نمی‌گیرد&lt;br /&gt;
			.replace(/(؛)(([\s]+)?[\.،؛:!؟\-…])/g, &#039;$1&#039;)&lt;br /&gt;
			// در انتهای پاراگراف نقطه‌ویرگول فارسی نمی‌آید&lt;br /&gt;
			.replace(/(؛)(\s|)\n\n/g, &#039;.\n\n&#039;)&lt;br /&gt;
			// سجاوندی در ابتدای علامت باز قرار نمی‌گیرد&lt;br /&gt;
			.replace(/([\(«])[\s]([؛\.،])/g, &#039;$1&#039;)&lt;br /&gt;
			// ویرگول فارسی&lt;br /&gt;
			// بعد از ویرگول فارسی این علامت‌ها قرار نمی‌گیرد&lt;br /&gt;
			.replace(/(،)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))/g, &#039;$1&#039;)&lt;br /&gt;
			// نقطه&lt;br /&gt;
			// باید سه نقطه باشد&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])( *)(\\.{3,})&#039;, &#039;g&#039;), &#039;$1$2…&#039;)&lt;br /&gt;
			.replace(/ \.\.\. /g, &#039; … &#039;)&lt;br /&gt;
			// بعد از نقطه این علایم نمی‌آیند&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])\\.( *[،؛:!؟\\?]+)&#039;, &#039;g&#039;), &#039;$1.&#039;)&lt;br /&gt;
			// سجاوندی در ابتدای پرانتز و گیومه باز قرار نمی‌گیرد&lt;br /&gt;
			.replace(new RegExp(&#039;(\\(|«)[\\.،؛](\\s|)([&#039; + persianCharacters + &#039;])&#039;, &#039;g&#039;), &#039;$1$3&#039;)&lt;br /&gt;
			// سجاوندی در داخل پرانتز&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])(\\s|)[\\.،؛](\\s|)(\\))&#039;, &#039;g&#039;), &#039;$1$2$3$4&#039;)&lt;br /&gt;
			// در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianCharacters + &#039;])(\\s|)(\\.)(\\s|)(مثلاً|فرضاً|زیرا|یعنی|بنابراین|لذا)&#039;, &#039;g&#039;), &#039;$1؛ $5&#039;)&lt;br /&gt;
			/// Question &amp;amp; exclamation mark&lt;br /&gt;
			// علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.&lt;br /&gt;
			// تكرار علامت سوال فارسی&lt;br /&gt;
			.replace(/(؟(\s|)){2,}/g, &#039;؟&#039;)&lt;br /&gt;
			// علامت‌گذاری نادرست&lt;br /&gt;
			.replace(&#039;؟ !&#039;, &#039;؟!&#039;).replace(&#039;! ؟&#039;, &#039;!؟&#039;)&lt;br /&gt;
			// Remove space preceding punctuation, except for ellipses&lt;br /&gt;
			.replace(/([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|&amp;lt;|$)/g, &#039;$1$2$3&#039;)&lt;br /&gt;
			// تبدیل نیم‌خط به تمام خط بین اعداد فارسی (وپ:خط تیره)&lt;br /&gt;
			.replace(new RegExp(&#039;([&#039; + persianDigits + &#039;]+\\s?(?:\\_\\_|\\-|ـ+)\\s?)*([&#039; + persianDigits + &#039;]+)\\s?(?:\\_\\_|\\-|ـ+)\\s?([&#039; + persianDigits + &#039;]+)(?!\\s?(?:\\_\\_|\\-|ـ+)\\s?[&#039; + persianDigits + &#039;]+)&#039;, &#039;g&#039;), function ($0, $1, $2, $3) { return ($1 ? $0 : $2 + &#039;–&#039; + $3) })&lt;br /&gt;
			// عبارت «ها» درون پرانتز می‌تواند به کلمه قبلی خود بچسبد&lt;br /&gt;
			.replace(/ \(ها\)/g, &#039;(ها)&#039;)&lt;br /&gt;
			.replace(/(\(|)ه‍\. (ق|خ|ش)([\n\/ ]|\))/g, &#039;ه‍.$2$3&#039;)//iاصلاح تاریخ هجری&lt;br /&gt;
			// حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند&lt;br /&gt;
			.replace(new RegExp(&#039;(\^|\\||\\(|«|\\}|&amp;quot;|\\s|\\*|\\#)(([&#039; + persianCharacters + &#039;]\{1,2\})\\. \?)\{2,6\}&#039;, &#039;g&#039;), function (m) { return m.replace(/\. (.)/g, &#039;.$1&#039;); })&lt;br /&gt;
			//ویکی پاسخ &lt;br /&gt;
			.replace(/به\[\[/g, &#039;به [[&#039;)&lt;br /&gt;
			.replace(/ \(ع\)/g, &#039;(ع)&#039;)&lt;br /&gt;
			.replace(/ \(ص\)/g, &#039;(ص)&#039;)&lt;br /&gt;
			.replace(/ \(س\)/g, &#039;(س)&#039;)&lt;br /&gt;
			.replace(/ \(عج\)/g, &#039;(عج)&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return {&lt;br /&gt;
		applyOrthography: applyOrthography,&lt;br /&gt;
		applyZwnj: applyZwnj,&lt;br /&gt;
		normalizeZwnj: normalizeZwnj,&lt;br /&gt;
		persianSort: persianSort,&lt;br /&gt;
		punctuation: punctuation,&lt;br /&gt;
		toPersianDigits: toPersianDigits,&lt;br /&gt;
		toStandardPersianCharacters: toStandardPersianCharacters,&lt;br /&gt;
		vowels: vowels,&lt;br /&gt;
		persianCharacters: persianCharacters,&lt;br /&gt;
		persianCharactersNoVowels: persianCharactersNoVowels&lt;br /&gt;
	};&lt;br /&gt;
}());&lt;br /&gt;
if (typeof window !== &#039;undefined&#039;) {&lt;br /&gt;
	window.persianTools = persianTools;&lt;br /&gt;
}&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons.js&amp;diff=1583</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons.js</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons.js&amp;diff=1583"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// &amp;lt;nowiki&amp;gt; // DON&#039;T REMOVE THIS LINE EVER&lt;br /&gt;
/*global jQuery, mediaWiki, persianWikiTools, persianTools*/&lt;br /&gt;
/**&lt;br /&gt;
 * UI code for Persian tools&lt;br /&gt;
 * Tests: [[مدیاویکی:Gadget-Extra-Editbuttons-tests.js]] [[وپ:تست]]&lt;br /&gt;
 * See also:&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-persiantools.js]]&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-persianwikitools.js]]&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-dictionary.js]]&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-autoed.js]]&lt;br /&gt;
 * * [[مدیاویکی:Gadget-Extra-Editbuttons-botworks.js]]&lt;br /&gt;
 */&lt;br /&gt;
(function ($, mw) {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	//&lt;br /&gt;
	// ابزار در حالت نمایش&lt;br /&gt;
	//&lt;br /&gt;
&lt;br /&gt;
	function loadPage(title) {&lt;br /&gt;
		return new mw.Api().get({&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;revisions&#039;,&lt;br /&gt;
			titles: title,&lt;br /&gt;
			rvprop: &#039;content&#039;,&lt;br /&gt;
			format: &#039;json&#039;&lt;br /&gt;
		}).then(function (data) {&lt;br /&gt;
			return Object.values(data.query.pages)[0].revisions[0][&#039;*&#039;];&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function redirectPost(url, data) {&lt;br /&gt;
		var form = document.createElement(&#039;form&#039;);&lt;br /&gt;
		document.body.appendChild(form);&lt;br /&gt;
		form.method = &#039;post&#039;;&lt;br /&gt;
		form.action = url;&lt;br /&gt;
		for (var name in data) {&lt;br /&gt;
			var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
			input.type = &#039;hidden&#039;;&lt;br /&gt;
			input.name = name;&lt;br /&gt;
			input.value = data[name];&lt;br /&gt;
			form.appendChild(input);&lt;br /&gt;
		}&lt;br /&gt;
		form.submit();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function addWatchthisParamIfAlreadyIsWatched(object) {&lt;br /&gt;
		// if unwatch button exists it is in the user&#039;s watchlist right now&lt;br /&gt;
		if ($(&#039;#ca-unwatch&#039;).length) {&lt;br /&gt;
			object.wpWatchthis = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return object;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function bringShowChanges(page, content, summary) {&lt;br /&gt;
		redirectPost(new mw.Uri(mw.config.get(&#039;wgScript&#039;)).extend({&lt;br /&gt;
			title: page,&lt;br /&gt;
			action: &#039;submit&#039;&lt;br /&gt;
		}), addWatchthisParamIfAlreadyIsWatched({&lt;br /&gt;
			wpTextbox1: content,&lt;br /&gt;
			wpDiff: &#039;&#039;,&lt;br /&gt;
			wpSummary: summary,&lt;br /&gt;
			wpUltimateParam: 1&lt;br /&gt;
		}));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (mw.config.get(&#039;wgAction&#039;) === &#039;view&#039; &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&#039;wgIsArticle&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&#039;wgUserEditCount&#039;) &amp;gt; 100 &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&#039;wgPageName&#039;) !== &#039;صفحهٔ_اصلی&#039; &amp;amp;&amp;amp;&lt;br /&gt;
			$(&#039;#mw-imagepage-nofile, #noarticletext&#039;).length === 0 &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&#039;wgNamespaceNumber&#039;) !== 6 &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&#039;wgNamespaceNumber&#039;) !== 8) {&lt;br /&gt;
		$(&#039;#ca-abar-abzar&#039;).remove();&lt;br /&gt;
		var interwikiFix = !$(&#039;#t-wikibase&#039;).length &amp;amp;&amp;amp;&lt;br /&gt;
			$(&#039;.interlanguage-link&#039;).length &amp;amp;&amp;amp;&lt;br /&gt;
			$(&#039;.wbc-editpage&#039;).length;&lt;br /&gt;
		$(mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-views&#039;, &#039;#&#039;,&lt;br /&gt;
			interwikiFix ? &#039;ابرابزار+انتقال میان‌ویکی&#039; : &#039;ابرابزار&#039;,&lt;br /&gt;
			&#039;ca-abar-abzar&#039;,&lt;br /&gt;
			interwikiFix ?&lt;br /&gt;
				&#039;ابزار پیشرفتهٔ ویرایش متن + ابزار انتقال خودکار میان‌ویکی سنتی به ویکی‌داده&#039; :&lt;br /&gt;
				&#039;ابزار پیشرفتهٔ ویرایش متن&#039;&lt;br /&gt;
		)).click(function (e) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			Promise.all([&lt;br /&gt;
				// افزودن میان‌ویکی سنتی به ویکی‌داده به صورت خودکار&lt;br /&gt;
				interwikiFix ? &lt;br /&gt;
					$.get(&#039;//dexbot.toolforge.org/interwikidata.php&#039;, {&lt;br /&gt;
						page: mw.config.get(&#039;wgPageName&#039;)&lt;br /&gt;
					}) : &#039;&#039;,&lt;br /&gt;
				// اجرای کدهای ربات&lt;br /&gt;
				botworks.trigFillcat,&lt;br /&gt;
				botworks.trigMissedFileUpload,&lt;br /&gt;
				botworks.trigMissedRef&lt;br /&gt;
			]).catch(function () {}).then(function () {&lt;br /&gt;
				return loadPage(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
			}).then(function (content) {&lt;br /&gt;
				bringShowChanges(&lt;br /&gt;
					mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
					persianWikiTools.superTool(content),&lt;br /&gt;
					&#039;ابرابزار&#039;&lt;br /&gt;
				);&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//&lt;br /&gt;
	// ابزار در حالت ویرایش&lt;br /&gt;
	//&lt;br /&gt;
&lt;br /&gt;
	function insertTags(pre, post, peri) {&lt;br /&gt;
		if ($(&#039;#wpTextbox1&#039;).length) {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).textSelection(&lt;br /&gt;
				&#039;encapsulateSelection&#039;, { pre: pre, peri: peri, post: post }&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Adds edit summary&lt;br /&gt;
	 */&lt;br /&gt;
	function addEditSummary(summaryText, replaceSummary) {&lt;br /&gt;
		var summary = $(&#039;input#wpSummary, #wpSummary &amp;gt; input&#039;),&lt;br /&gt;
			summaryPrefix = &#039;&#039;,&lt;br /&gt;
			pos;&lt;br /&gt;
		if (mw.util.getParamValue(&#039;section&#039;) === &#039;new&#039; ||&lt;br /&gt;
				summaryText === &#039;&#039; || summary.length === 0) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (summary.val().includes(&#039;*/ &#039;)) {&lt;br /&gt;
			pos = summary.val().indexOf(&#039;*/ &#039;);&lt;br /&gt;
			summaryPrefix = summary.val().substr(0, pos + 3);&lt;br /&gt;
		}&lt;br /&gt;
		if (replaceSummary) {&lt;br /&gt;
			summary.val(summaryPrefix + summaryText);&lt;br /&gt;
		} else {&lt;br /&gt;
			if (summary.val() === summaryPrefix) {&lt;br /&gt;
				summary.val(summary.val() + summaryText);&lt;br /&gt;
			} else {&lt;br /&gt;
				if (!summary.val().includes(summaryText)) { // do not repeat in edit summary&lt;br /&gt;
					summary.val(summary.val() + &#039;، &#039; + summaryText);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Makes a simple button from parameters&lt;br /&gt;
	 */&lt;br /&gt;
	function buttonGenerator(callback, summaryText, replaceSummary, image, title, alt, idSuffix) {&lt;br /&gt;
		function clickCallback(e) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			callback();&lt;br /&gt;
			addEditSummary(summaryText, replaceSummary);&lt;br /&gt;
		}&lt;br /&gt;
		var img = $(&#039;&amp;lt;img&amp;gt;&#039;).on(&#039;error&#039;, function () {&lt;br /&gt;
			img.replaceWith($(&#039;&amp;lt;span&amp;gt;&#039;, {&lt;br /&gt;
				class: &#039;mw-ui-button mw-ui-small mw-ui-constructive&#039;,&lt;br /&gt;
				text: alt,&lt;br /&gt;
				style: &#039;padding: 0;&#039;&lt;br /&gt;
			}));&lt;br /&gt;
		}).attr({&lt;br /&gt;
			src: image,&lt;br /&gt;
			title: title,&lt;br /&gt;
			alt: alt&lt;br /&gt;
		});&lt;br /&gt;
		var button = $(&#039;&amp;lt;span&amp;gt;&#039;, {&lt;br /&gt;
			id: &#039;persian-wiki-tools-&#039; + idSuffix&lt;br /&gt;
		}).click(clickCallback).append(img);&lt;br /&gt;
		return button[0];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Applies the string functions defined below to the&lt;br /&gt;
	 * selected text in the edit box. If no text is selected, applies&lt;br /&gt;
	 * the function to the whole contents of edit box.&lt;br /&gt;
	 */&lt;br /&gt;
	function applyOnSelection(callback) {&lt;br /&gt;
		var txtarea, range, startPos, endPos, selText;&lt;br /&gt;
		if (document.getElementById(&#039;editform&#039;) || $(&#039;.ns-446&#039;).length) {&lt;br /&gt;
			txtarea = document.getElementById(&#039;wpTextbox1&#039;);&lt;br /&gt;
		} else if ($(&#039;[name=wpNewTitleMain]&#039;)[0]) {&lt;br /&gt;
			txtarea = $(&#039;[name=wpNewTitleMain]&#039;)[0];&lt;br /&gt;
		} else {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (document.selection &amp;amp;&amp;amp; document.selection.createRange) { // IE/Opera&lt;br /&gt;
			// get current selection	&lt;br /&gt;
			txtarea.focus();&lt;br /&gt;
			range = document.selection.createRange();&lt;br /&gt;
			selText = range.text;&lt;br /&gt;
			if (selText) {&lt;br /&gt;
				range.text = callback(selText);&lt;br /&gt;
				range.select();&lt;br /&gt;
			} else {&lt;br /&gt;
				txtarea.value = callback(txtarea.value);&lt;br /&gt;
			}&lt;br /&gt;
		} else if (txtarea.selectionStart || txtarea.selectionStart === 0) { // Mozilla&lt;br /&gt;
			// get current selection&lt;br /&gt;
			txtarea.focus();&lt;br /&gt;
			startPos = txtarea.selectionStart;&lt;br /&gt;
			endPos = txtarea.selectionEnd;&lt;br /&gt;
			selText = txtarea.value.substring(startPos, endPos);&lt;br /&gt;
			// insert tags&lt;br /&gt;
			if (selText) {&lt;br /&gt;
				txtarea.value = txtarea.value.substring(0, startPos) + callback(selText) + txtarea.value.substring(endPos, txtarea.value.length);&lt;br /&gt;
				txtarea.selectionStart = startPos + selText.length;&lt;br /&gt;
				txtarea.selectionEnd = txtarea.selectionStart;&lt;br /&gt;
			} else {&lt;br /&gt;
				txtarea.value = callback(txtarea.value);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var tools = {};&lt;br /&gt;
&lt;br /&gt;
	// Buttons that FIX wikitext&lt;br /&gt;
	/* ی ک &lt;br /&gt;
	tools.ykArabic = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianTools.toStandardPersianCharacters);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح نویسه\u200cهای عربی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/8/88/Button_YehKeh.png&#039;,&lt;br /&gt;
		&#039;اصلاح ی و ک&#039;,&lt;br /&gt;
		&#039;ی و ک&#039;,&lt;br /&gt;
		&#039;YehKeh&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* فاصلهٔ مجازی&lt;br /&gt;
	tools.zwnj = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiApplyZwnj);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح فاصلهٔ مجازی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/d/d0/Button_ZWNJ.png&#039;,&lt;br /&gt;
		&#039;فاصلهٔ مجازی&#039;,&lt;br /&gt;
		&#039;فاصلهٔ مجازی&#039;,&lt;br /&gt;
		&#039;ZWNJ&#039;&lt;br /&gt;
	);&lt;br /&gt;
 */&lt;br /&gt;
	/* اصلاح نویسه\u200cها و حالت\u200cهای غیراستاندارد &lt;br /&gt;
	tools.applyOrthography = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiApplyOrthography);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح نویسه&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/9/94/Button_non_standard.png&#039;,&lt;br /&gt;
		&#039;اصلاح نویسه\u200cها و حالت\u200cهای غیراستاندارد&#039;,&lt;br /&gt;
		&#039;اصلاح نویسه\u200cها و حالت\u200cهای غیراستاندارد&#039;,&lt;br /&gt;
		&#039;apply-orthography&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* اصلاح ارقام&lt;br /&gt;
	tools.dig = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiTextDigitsToPersian);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح ارقام&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/4/4a/Button_numbers.png&#039;,&lt;br /&gt;
		&#039;اصلاح ارقام&#039;,&lt;br /&gt;
		&#039;ارقام&#039;,&lt;br /&gt;
		&#039;numbers&#039;&lt;br /&gt;
	); */&lt;br /&gt;
&lt;br /&gt;
	/* اصلاح ارقام مخصوص صفحه انتقال */&lt;br /&gt;
	tools.digMove = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiConvertToPersianCharacters);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح ارقام&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/4/4a/Button_numbers.png&#039;,&lt;br /&gt;
		&#039;اصلاح ارقام&#039;,&lt;br /&gt;
		&#039;ارقام&#039;,&lt;br /&gt;
		&#039;numbers&#039;&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	//عدم تغییر در متن بحث‌ها، سیاست‌ها در فضاهای نام دیگر&lt;br /&gt;
	/*if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 0) {&lt;br /&gt;
		 برداشتن پیوند تاریخ‌ها &lt;br /&gt;
		tools.fixBadLinks = buttonGenerator(&lt;br /&gt;
			function () {&lt;br /&gt;
				applyOnSelection(persianWikiTools.fixBadLinks);&lt;br /&gt;
			},&lt;br /&gt;
			&#039;[[وپ:پیوند سال|حذف پیوند تاریخ‌ها]]&#039;,&lt;br /&gt;
			false,&lt;br /&gt;
			&#039;//upload.wikimedia.org/wikipedia/commons/1/11/Btn_toolbar_link_remove.png&#039;,&lt;br /&gt;
			&#039;حذف پیوند تاریخ‌ها&#039;,&lt;br /&gt;
			&#039;پیوند تاریخ‌ها&#039;,&lt;br /&gt;
			&#039;datelinks&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}*/&lt;br /&gt;
&lt;br /&gt;
	/* یونیکد نشانی وب */&lt;br /&gt;
	tools.urlFix = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiUrlMinifier);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح نشانی وب&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/b/ba/Button_decode_URI.png&#039;,&lt;br /&gt;
		&#039;یونی\u200cکدسازی نشانی\u200cها&#039;,&lt;br /&gt;
		&#039;یونی\u200cکدسازی&#039;,&lt;br /&gt;
		&#039;decode-URI&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* اصلاح علامت @ */&lt;br /&gt;
	tools.atSignFix = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(function (text) {&lt;br /&gt;
				return text.replace(/(\S+?)@(\S+?)/g, &#039;$1{&#039; + &#039;{at}}$2&#039;);&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح @&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/7/7f/Button_at_sign.png&#039;,&lt;br /&gt;
		&#039;اصلاح علامت @&#039;,&lt;br /&gt;
		&#039;@&#039;,&lt;br /&gt;
		&#039;at-sign&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* ابرابزار */&lt;br /&gt;
	tools.superTool = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.superTool);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png&#039;,&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		&#039;super-tool&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* ابزار املا */&lt;br /&gt;
	tools.dictation = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiDictation);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح املا&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/a/a3/Button_Dictation-fa.png&#039;,&lt;br /&gt;
		&#039;املا&#039;,&lt;br /&gt;
		&#039;املا&#039;,&lt;br /&gt;
		&#039;dictation&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* ابرابزار مخصوص صفحه انتقال */&lt;br /&gt;
	tools.superToolMove = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.superToolMove);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png&#039;,&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		&#039;ابرابزار&#039;,&lt;br /&gt;
		&#039;super-tool&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* اصلاحات قراردادن نقطه&lt;br /&gt;
	tools.punc = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.wikiPunctuation);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;اصلاح سجاوندی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/e/ed/Button_punctuation.png&#039;,&lt;br /&gt;
		&#039;نقطه\u200cگذاری&#039;,&lt;br /&gt;
		&#039;نقطه\u200cگذاری&#039;,&lt;br /&gt;
		&#039;punctuation&#039;&lt;br /&gt;
	); */&lt;br /&gt;
&lt;br /&gt;
	// Buttons that add tags&lt;br /&gt;
	/* برچسب ویکی\u200cسازی &lt;br /&gt;
	tools.wikify = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{ویکی\u200cسازی}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب ویکی\u200cسازی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/3/38/Button_wikify.png&#039;,&lt;br /&gt;
		&#039;برچسب ویکی\u200cسازی&#039;,&lt;br /&gt;
		&#039;ویکی\u200cسازی&#039;,&lt;br /&gt;
		&#039;wikify&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* بدون منبع &lt;br /&gt;
	tools.noSource = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{بدون منبع}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب منبع&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/8/8a/Button_no_source_fa.png&#039;,&lt;br /&gt;
		&#039;برچسب بدون منبع&#039;,&lt;br /&gt;
		&#039;بدون منبع&#039;,&lt;br /&gt;
		&#039;no-source&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* حذف سریع &lt;br /&gt;
	tools.speedyDel = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			var temp = $(&#039;#wpTextbox1&#039;).val();&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;&#039;);&lt;br /&gt;
			insertTags(&#039;{&#039; + &#039;{&#039; + &#039;حذف سریع|&#039;, &#039;}}\n&#039; + temp, &#039;معیار&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;حذف سریع&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/1/13/Button_delete.png&#039;,&lt;br /&gt;
		&#039;برچسب حذف سریع&#039;,&lt;br /&gt;
		&#039;حذف سریع&#039;,&lt;br /&gt;
		&#039;delete-vote&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* حذف زماندار &lt;br /&gt;
	tools.prod = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			var temp = $(&#039;#wpTextbox1&#039;).val();&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;&#039;);&lt;br /&gt;
			insertTags(&#039;{&#039; + &#039;{&#039; + &#039;جا:حذف زمان\u200cدار|&#039;, &#039;}}\n&#039; + temp, &#039;معیار&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;حذف زمان\u200cدار&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/3/3f/Button_attendre.png&#039;,&lt;br /&gt;
		&#039;برچسب حذف زمان\u200cدار&#039;,&lt;br /&gt;
		&#039;حذف زمان\u200cدار&#039;,&lt;br /&gt;
		&#039;attendre&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* منبع تصویر نامعلوم &lt;br /&gt;
	tools.picSource = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{&#039; + &#039;جا:منبع تصویر نامعلوم&#039; + &#039;}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب منبع&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/5/59/Button_image_source.png&#039;,&lt;br /&gt;
		&#039;برچسب منبع تصویر نامعلوم&#039;,&lt;br /&gt;
		&#039;منبع تصویر نامعلوم&#039;,&lt;br /&gt;
		&#039;image-source&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* حق تکثیر تصویر نامعلوم &lt;br /&gt;
	tools.picCopy = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{&#039; + &#039;جا:حق تکثیر تصویر نامعلوم}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب حق تکثیر&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/7/7e/Button_image_copyright.png&#039;,&lt;br /&gt;
		&#039;برچسب حق تکثیر تصویر نامعلوم&#039;,&lt;br /&gt;
		&#039;حق تکثیر تصویر نامعلوم&#039;,&lt;br /&gt;
		&#039;image-copyright&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* تمیزکاری &lt;br /&gt;
	tools.cleanup = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{تمیزکاری}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب تمیزکاری&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/2/2e/Button_broom.png&#039;,&lt;br /&gt;
		&#039;برچسب تمیزکاری&#039;,&lt;br /&gt;
		&#039;تمیزکاری&#039;,&lt;br /&gt;
		&#039;broom&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* اخطار نگاره &lt;br /&gt;
	tools.imgWarn = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;&#039;);&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;{&#039; + &#039;{&#039; + &#039;جا:اخطار نگاره|&#039;,&lt;br /&gt;
				&#039;}}&#039;,&lt;br /&gt;
				&#039;نگاره&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب نگاره&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/e/ec/Button_aviso.png&#039;,&lt;br /&gt;
		&#039;اخطار نگاره&#039;,&lt;br /&gt;
		&#039;اخطار نگاره&#039;,&lt;br /&gt;
		&#039;aviso&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* حق تکثیر مشکوک &lt;br /&gt;
	tools.sus = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{حق تکثیر مشکوک}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب حق تکثیر&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/c/c7/Button_Sus.png&#039;,&lt;br /&gt;
		&#039;برچسب حق تکثیر مشکوک&#039;,&lt;br /&gt;
		&#039;حق تکثیر مشکوک&#039;,&lt;br /&gt;
		&#039;sus&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* نقض حق تکثیر &lt;br /&gt;
	tools.copyR = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;&#039;);&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;{&#039; + &#039;{&#039; + &#039;جا:نقض حق تکثیر|url=&#039;,&lt;br /&gt;
				&#039;}}&#039;,&lt;br /&gt;
				&#039;نشانی ایرنتنتی&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب حق تکثیر&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/6/6f/Button_CopyR.png&#039;,&lt;br /&gt;
		&#039;برچسب نقض حق تکثیر&#039;,&lt;br /&gt;
		&#039;نقض حق تکثیر&#039;,&lt;br /&gt;
		&#039;copyr&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* لحن نامناسب &lt;br /&gt;
	tools.tone = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;{&#039; + &#039;{لحن نامناسب}}\n&#039; + $(&#039;#wpTextbox1&#039;).val());&lt;br /&gt;
		},&lt;br /&gt;
		&#039;برچسب لحن&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/f/fc/Button_Tone.png&#039;,&lt;br /&gt;
		&#039;برچسب لحن نامناسب&#039;,&lt;br /&gt;
		&#039;لحن&#039;,&lt;br /&gt;
		&#039;tone&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	// Buttons that help with wiki writing&lt;br /&gt;
	/* تغییر جهت */&lt;br /&gt;
	tools.toggleDirection = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1, [name=wpNewTitleMain], .ace_editor&#039;).css({&lt;br /&gt;
				&#039;text-align&#039;: &#039;start&#039;,&lt;br /&gt;
				&#039;direction&#039;: $(&#039;#wpTextbox1, [name=wpNewTitleMain]&#039;).css(&#039;direction&#039;) === &#039;rtl&#039; ? &#039;ltr&#039; : &#039;rtl&#039;&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/d/d0/Button_toggle_dir.png&#039;,&lt;br /&gt;
		&#039;تغییر جهت جعبهٔ ویرایش&#039;,&lt;br /&gt;
		&#039;تغییرجهت&#039;,&lt;br /&gt;
		&#039;toggle-dir&#039;&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	tools.putSelectionInBDI = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.putSelectionInBDI);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;جداسازی دوجهته&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/3/31/Button_bdi_tag.png&#039;,&lt;br /&gt;
		&#039;جداسازی دوجهته&#039;,&lt;br /&gt;
		&#039;دوجهته&#039;,&lt;br /&gt;
		&#039;put-in-bdi&#039;&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	/* پیوند درونی */&lt;br /&gt;
	tools.wikiLink = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;[[&#039;, &#039;]]&#039;, &#039;مقاله&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/d/d0/Button_in_wikify.png&#039;,&lt;br /&gt;
		&#039;پیوند&#039;,&lt;br /&gt;
		&#039;پیوند&#039;,&lt;br /&gt;
		&#039;wikify&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* متن خطخورده */&lt;br /&gt;
	tools.strikeTextButton = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;&amp;lt;s&amp;gt;&#039;, &#039;&amp;lt;/s&amp;gt;&#039;, &#039;متن خط خورده&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/c/c9/Button_strike.png&#039;,&lt;br /&gt;
		&#039;متن خط\u200cخورده&#039;,&lt;br /&gt;
		&#039;متن خط\u200cخورده&#039;,&lt;br /&gt;
		&#039;strike&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* توضیح &lt;br /&gt;
	tools.commentButton = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;&amp;lt;!--&#039;, &#039;--&amp;gt;&#039;, &#039;توضیح&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/3/34/Button_hide_comment.png&#039;,&lt;br /&gt;
		&#039;توضیح&#039;,&lt;br /&gt;
		&#039;توضیح&#039;,&lt;br /&gt;
		&#039;hide-comment&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* ملزومات مقاله &lt;br /&gt;
	tools.addEssentialThings = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;== جستارهای وابسته ==\n\n== منابع ==\n{&#039; + &#039;{پانویس}}&#039;, &#039;&#039;, &#039;&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/e/ef/Add_note.jpg&#039;,&lt;br /&gt;
		&#039;ملزومات مقاله&#039;,&lt;br /&gt;
		&#039;ملزومات مقاله&#039;,&lt;br /&gt;
		&#039;add-note&#039;&lt;br /&gt;
	);*/&lt;br /&gt;
	/* خوشامدید &lt;br /&gt;
	tools.welcome = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;{&#039; + &#039;{&#039; + &#039;جا:خوشامد|~~&#039; + &#039;~~}}&#039;,&lt;br /&gt;
				&#039;&#039;,&lt;br /&gt;
				&#039;&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;خوشامدگویی&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/4/4a/Smilies_Alien_cool.png&#039;,&lt;br /&gt;
		&#039;خوشامدگویی&#039;,&lt;br /&gt;
		&#039;خوشامد&#039;,&lt;br /&gt;
		&#039;alien-cool&#039;&lt;br /&gt;
	);*/&lt;br /&gt;
	/* چپچین */&lt;br /&gt;
	tools.chapChin = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;{&#039; + &#039;{چپ\u200cچین}}\n&#039;,&lt;br /&gt;
				&#039;\n{&#039; + &#039;{پایان چپ\u200cچین}}&#039;,&lt;br /&gt;
				&#039;متن چپ\u200cچین\u200cشده&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/e/ea/Button_align_left.png&#039;,&lt;br /&gt;
		&#039;چپ\u200cچین\u200cکردن متن&#039;,&lt;br /&gt;
		&#039;چپ\u200cچین&#039;,&lt;br /&gt;
		&#039;align-left&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* اندیس بالا &lt;br /&gt;
	tools.upperText = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;&amp;lt;sup&amp;gt;&#039;, &#039;&amp;lt;/sup&amp;gt;&#039;, &#039;اندیس&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/6/6a/Button_sup_letter.png&#039;,&lt;br /&gt;
		&#039;اندیس بالا&#039;,&lt;br /&gt;
		&#039;اندیس بالا&#039;,&lt;br /&gt;
		&#039;upper-letter&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* اندیس پایین &lt;br /&gt;
	tools.lowerText = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&#039;&amp;lt;sub&amp;gt;&#039;, &#039;&amp;lt;/sub&amp;gt;&#039;, &#039;اندیس&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/a/aa/Button_sub_letter.png&#039;,&lt;br /&gt;
		&#039;اندیس پایین&#039;,&lt;br /&gt;
		&#039;اندیس پایین&#039;,&lt;br /&gt;
		&#039;lower-letter&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* تغییرمسیر &lt;br /&gt;
	tools.redirectButton = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val(&#039;&#039;);&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;#تغییرمسیر [[&#039;,&lt;br /&gt;
				&#039;]]&#039;,&lt;br /&gt;
				&#039;پیوند&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/c/c8/Button_redirect.png&#039;,&lt;br /&gt;
		&#039;تغییرمسیر&#039;,&lt;br /&gt;
		&#039;تغییرمسیر&#039;,&lt;br /&gt;
		&#039;redirect&#039;&lt;br /&gt;
	);&lt;br /&gt;
*/&lt;br /&gt;
	/* سال میلادی */&lt;br /&gt;
	tools.gregYear = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			insertTags(&lt;br /&gt;
				&#039;[[&#039;,&lt;br /&gt;
				&#039; (میلادی)|]]&#039;,&lt;br /&gt;
				&#039;سال&#039;&lt;br /&gt;
			);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/a/a7/Button_cal.png&#039;,&lt;br /&gt;
		&#039;سال میلادی&#039;,&lt;br /&gt;
		&#039;میلادی&#039;,&lt;br /&gt;
		&#039;cal&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* مرتبسازی */&lt;br /&gt;
	tools.sortText = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(function (text) {&lt;br /&gt;
				return persianTools.persianSort(text.split(&#039;\n&#039;)).join(&#039;\n&#039;);&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/3/33/Button_sort.png&#039;,&lt;br /&gt;
		&#039;مرتب\u200cسازی بر اساس الفبا&#039;,&lt;br /&gt;
		&#039;مرتب\u200cسازی&#039;,&lt;br /&gt;
		&#039;sort&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	/* شد! &lt;br /&gt;
	tools.shod = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			$(&#039;#wpTextbox1&#039;).val($(&#039;#wpTextbox1&#039;).val().trimRight() + &#039;\n:{&#039; + &#039;{شد}} ~~&#039; + &#039;~~&#039;);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;شد&#039;,&lt;br /&gt;
		true,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/5/5b/Button_check.png&#039;,&lt;br /&gt;
		&#039;شد&#039;,&lt;br /&gt;
		&#039;شد&#039;,&lt;br /&gt;
		&#039;check&#039;&lt;br /&gt;
	);*/&lt;br /&gt;
	/* عدد انگلیسی */&lt;br /&gt;
	tools.toEnNumRobust = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.robustToEnglishDigits);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;عدد انگلیسی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/commons/f/f5/Button_enNum.png&#039;,&lt;br /&gt;
		&#039;عدد انگلیسی&#039;,&lt;br /&gt;
		&#039;عدد انگلیسی&#039;,&lt;br /&gt;
		&#039;ToEnNumberRobust&#039;&lt;br /&gt;
	);&lt;br /&gt;
	/* حذف ویکی‌سازی &lt;br /&gt;
	tools.removeWiki = buttonGenerator(&lt;br /&gt;
		function () {&lt;br /&gt;
			applyOnSelection(persianWikiTools.removeWikiSigne);&lt;br /&gt;
		},&lt;br /&gt;
		&#039;حذف ویکی‌سازی&#039;,&lt;br /&gt;
		false,&lt;br /&gt;
		&#039;//upload.wikimedia.org/wikipedia/fa/8/88/Button_NoWiki.png&#039;,&lt;br /&gt;
		&#039;حذف ویکی‌سازی&#039;,&lt;br /&gt;
		&#039;حذف ویکی‌سازی&#039;,&lt;br /&gt;
		&#039;removeWiki&#039;&lt;br /&gt;
	);*/&lt;br /&gt;
	$(function () {&lt;br /&gt;
		if (typeof Array.prototype.includes !== &#039;function&#039;) {&lt;br /&gt;
			mw.log.error(&#039;Script not supported by browser.&#039;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		// کد مناسب ویرایشگر جدید متنی&lt;br /&gt;
		/*mw.hook(&#039;ve.activationComplete&#039;).add(function () {&lt;br /&gt;
			var surface = ve.init.target.getSurface();&lt;br /&gt;
			if (surface.getMode() === &#039;source&#039;) {&lt;br /&gt;
				$(&#039;#firstHeading&#039;).append($(&#039;&amp;lt;img&amp;gt;&#039;, { src: &#039;//upload.wikimedia.org/wikipedia/fa/f/fc/Button_super_tool.png&#039; }).click(function () {&lt;br /&gt;
					$(&#039;.ve-ce-contentBranchNode&#039;).get().forEach(function (x) {&lt;br /&gt;
						x.innerText = persianWikiTools.superTool(x.innerText);&lt;br /&gt;
					});&lt;br /&gt;
				}));&lt;br /&gt;
			}&lt;br /&gt;
		});*/&lt;br /&gt;
&lt;br /&gt;
		var extraEditButtons = [],&lt;br /&gt;
			extraMoveButtons = [],&lt;br /&gt;
			space = &#039; &#039;;&lt;br /&gt;
&lt;br /&gt;
		extraEditButtons = extraEditButtons.concat(tools.toggleDirection, tools.putSelectionInBDI, space, tools.ykArabic, tools.zwnj, tools.applyOrthography,&lt;br /&gt;
			tools.dig, tools.punc, tools.dictation, tools.superTool, space, tools.urlFix, tools.fixBadLinks, space, tools.welcome,&lt;br /&gt;
			tools.addEssentialThings, tools.noSource, tools.sus, tools.tone, tools.wikify,&lt;br /&gt;
			tools.shod, tools.cleanup, tools.speedyDel, tools.prod, space, tools.redirectButton,&lt;br /&gt;
			tools.gregYear, tools.strikeTextButton, tools.chapChin, tools.commentButton, space, tools.sortText, space, tools.picCopy, tools.picSource, space, tools.toEnNumRobust);&lt;br /&gt;
		var userGroups = mw.config.get(&#039;wgUserGroups&#039;, []);&lt;br /&gt;
		// شرط برای کاربری که گشت خودکار دارد&lt;br /&gt;
		// ابزار حذف الگوهای ناموجود&lt;br /&gt;
		if (userGroups.includes(&#039;autopatrolled&#039;) ||&lt;br /&gt;
				userGroups.includes(&#039;eliminator&#039;) ||&lt;br /&gt;
				userGroups.includes(&#039;sysop&#039;)) {&lt;br /&gt;
			extraEditButtons = extraEditButtons.concat(tools.removeWiki);&lt;br /&gt;
		}&lt;br /&gt;
		extraEditButtons = extraEditButtons.concat(space).concat(window.userCustomEditButtons || []);&lt;br /&gt;
&lt;br /&gt;
		extraMoveButtons = extraMoveButtons.concat(tools.superToolMove, space, tools.toggleDirection, space,&lt;br /&gt;
			tools.ykArabic, tools.zwnj, tools.applyOrthography, tools.digMove, tools.punc, space, tools.dictation);&lt;br /&gt;
&lt;br /&gt;
		$(&#039;#persian-wiki-tools&#039;).remove();&lt;br /&gt;
		if ($(&#039;#wpTextbox1&#039;).length) {&lt;br /&gt;
			$(&#039;&amp;lt;div&amp;gt;&#039;, {&lt;br /&gt;
				id: &#039;persian-wiki-tools&#039;,&lt;br /&gt;
				dir: &#039;rtl&#039;,&lt;br /&gt;
				style: &#039;float:right;&#039;&lt;br /&gt;
			}).append(extraEditButtons).insertBefore(&#039;#wpTextbox1&#039;);&lt;br /&gt;
		} else if ($(&#039;#movepage&#039;).length) {&lt;br /&gt;
			$(&#039;&amp;lt;span&amp;gt;&#039;, {&lt;br /&gt;
				id: &#039;persian-wiki-tools&#039;&lt;br /&gt;
			}).append(extraMoveButtons).insertAfter(&#039;#wpNewTitle&#039;);&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
}(jQuery, mediaWiki));&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons&amp;diff=1581</id>
		<title>MediaWiki:Gadget-Extra-Editbuttons</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=MediaWiki:Gadget-Extra-Editbuttons&amp;diff=1581"/>
		<updated>2025-01-25T07:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;دکمه‌های ویرایشی بیشتر ([https://fa.wikipedia.org/wiki/%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%D9%BE%D8%AF%DB%8C%D8%A7:%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_%D9%88%DB%8C%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7 راهنما])&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Remove_first_word&amp;diff=1579</id>
		<title>Modèle:Remove first word</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Remove_first_word&amp;diff=1579"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:InfoboxImage&amp;diff=1577</id>
		<title>Module:InfoboxImage</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:InfoboxImage&amp;diff=1577"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Inputs:&lt;br /&gt;
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link&lt;br /&gt;
--    page - page to display for multipage images (DjVu)&lt;br /&gt;
--    size - size to display the image&lt;br /&gt;
--    maxsize - maximum size for image&lt;br /&gt;
--    sizedefault - default size to display the image if size param is blank&lt;br /&gt;
--    alt - alt text for image&lt;br /&gt;
--    title - title text for image&lt;br /&gt;
--    border - set to yes if border&lt;br /&gt;
--    center - set to yes, if the image has to be centered&lt;br /&gt;
--    upright - upright image param&lt;br /&gt;
--    suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it&lt;br /&gt;
--    link - page to visit when clicking on image&lt;br /&gt;
--    class - HTML classes to add to the image&lt;br /&gt;
-- Outputs:&lt;br /&gt;
--    Formatted image.&lt;br /&gt;
-- More details available at the &amp;quot;Module:InfoboxImage/doc&amp;quot; page&lt;br /&gt;
&lt;br /&gt;
local i = {};&lt;br /&gt;
&lt;br /&gt;
local placeholder_image = {&lt;br /&gt;
    &amp;quot;Blue - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Blue - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None (square).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Location map of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Male no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Missing flag.png&amp;quot;,&lt;br /&gt;
    &amp;quot;No flag.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No free portrait.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (female).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (male).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Cricket no pic.png&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Example.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Image placeholder.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Nocover-upload.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noribbon.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No portrait-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin bandera.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin escudo.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image - temple.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image butterfly.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image1.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Resolution angle.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-No portrait-text-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Insert image here.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No image available.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET square.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No Photo Available.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No Screenshot.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No-image-available.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Null.png&amp;quot;,&lt;br /&gt;
	&amp;quot;PictureNeeded.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Place holder.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Unbenannt.JPG&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadACopyrightFreeImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImageShort.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noimage.gif&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local categories = {&lt;br /&gt;
	url_image_links = &amp;quot;[[Category:Pages using infoboxes with URL in image parameter]]&amp;quot;,&lt;br /&gt;
	thumbnail_images = &amp;quot;[[Category:Pages using infoboxes with thumbnail images]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function trackable()&lt;br /&gt;
	local ns = mw.title.getCurrentTitle().nsText:lower()&lt;br /&gt;
	return not (ns == &#039;user&#039; or ns == &#039;user talk&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function i.IsPlaceholder(image)&lt;br /&gt;
    -- change underscores to spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
    assert(image ~= nil, &#039;mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) must not return nil&#039;)&lt;br /&gt;
    -- if image starts with [[ then remove that and anything after |&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        image = mw.ustring.sub(image,3);&lt;br /&gt;
        image = mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
        assert(image ~= nil, &#039;mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;) must not return nil&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    assert(image ~= nil, &amp;quot;mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;) must not return nil&amp;quot;)&lt;br /&gt;
    -- remove prefix if exists&lt;br /&gt;
    local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
    for i, name in ipairs(allNames) do&lt;br /&gt;
        if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
            image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    -- capitalise first letter&lt;br /&gt;
    image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);&lt;br /&gt;
&lt;br /&gt;
    for i,j in pairs(placeholder_image) do&lt;br /&gt;
        if image == j 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 i.InfoboxImage(frame)&lt;br /&gt;
    local image = frame.args[&amp;quot;image&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    if image == &amp;quot;&amp;quot; or image == nil then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if image == &amp;quot;&amp;amp;nbsp;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    end&lt;br /&gt;
    if frame.args[&amp;quot;suppressplaceholder&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
        if i.IsPlaceholder(image) == true then&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if string.find(image, &amp;quot;^%[*https?:&amp;quot;) then&lt;br /&gt;
		-- Error category.&lt;br /&gt;
		return trackable() and categories.url_image_links or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        -- search for thumbnail images and add to tracking cat if found&lt;br /&gt;
        local cat = &amp;quot;&amp;quot;;&lt;br /&gt;
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, &amp;quot;|%s*thumb%s*[|%]]&amp;quot;) or mw.ustring.find(image, &amp;quot;|%s*thumbnail%s*[|%]]&amp;quot;)) then&lt;br /&gt;
            cat = trackable() and categories.thumbnail_images or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        return image .. cat;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,2) == &amp;quot;{{&amp;quot; and mw.ustring.sub(image,1,3) ~= &amp;quot;{{{&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,1) == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,8) == mw.ustring.char(127)..&amp;quot;&#039;\&amp;quot;`UNIQ&amp;quot; then&lt;br /&gt;
        -- Found strip marker at begining, so pass don&#039;t process at all&lt;br /&gt;
        return image;&lt;br /&gt;
    else&lt;br /&gt;
        local result = &amp;quot;&amp;quot;;&lt;br /&gt;
        local page = frame.args[&amp;quot;page&amp;quot;];&lt;br /&gt;
        local size = frame.args[&amp;quot;size&amp;quot;];&lt;br /&gt;
        local maxsize = frame.args[&amp;quot;maxsize&amp;quot;];&lt;br /&gt;
        local sizedefault = frame.args[&amp;quot;sizedefault&amp;quot;];&lt;br /&gt;
        local alt = frame.args[&amp;quot;alt&amp;quot;];&lt;br /&gt;
        local link = frame.args[&amp;quot;link&amp;quot;];&lt;br /&gt;
        local title = frame.args[&amp;quot;title&amp;quot;];&lt;br /&gt;
        local border = frame.args[&amp;quot;border&amp;quot;];&lt;br /&gt;
        local upright = frame.args[&amp;quot;upright&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local thumbtime = frame.args[&amp;quot;thumbtime&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local center = frame.args[&amp;quot;center&amp;quot;];&lt;br /&gt;
        local class = frame.args[&amp;quot;class&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        -- remove prefix if exists&lt;br /&gt;
        local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
        for i, name in ipairs(allNames) do&lt;br /&gt;
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if maxsize ~= &amp;quot;&amp;quot; and maxsize ~= nil then&lt;br /&gt;
            -- if no sizedefault then set to maxsize&lt;br /&gt;
            if sizedefault == &amp;quot;&amp;quot; or sizedefault == nil then&lt;br /&gt;
                sizedefault = maxsize&lt;br /&gt;
            end&lt;br /&gt;
            -- check to see if size bigger than maxsize&lt;br /&gt;
            if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
                local sizenumber = tonumber(mw.ustring.match(size,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                if sizenumber&amp;gt;maxsizenumber and maxsizenumber&amp;gt;0 then&lt;br /&gt;
                    size = maxsize;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to size if just a number&lt;br /&gt;
        if (tonumber(size) or 0) &amp;gt; 0 then&lt;br /&gt;
            size = size .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to sizedefault if just a number&lt;br /&gt;
        if (tonumber(sizedefault) or 0) &amp;gt; 0 then&lt;br /&gt;
            sizedefault = sizedefault .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        result = &amp;quot;[[File:&amp;quot; .. image;&lt;br /&gt;
        if page ~= &amp;quot;&amp;quot; and page ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|page=&amp;quot; .. page;&lt;br /&gt;
        end&lt;br /&gt;
        if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. size;&lt;br /&gt;
        elseif sizedefault ~= &amp;quot;&amp;quot; and sizedefault ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. sizedefault;&lt;br /&gt;
        else&lt;br /&gt;
            result = result .. &amp;quot;|frameless&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if center == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|center&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|alt=&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; and link ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|link=&amp;quot; .. link;&lt;br /&gt;
        end&lt;br /&gt;
        if border == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|border&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if upright == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright&amp;quot;;&lt;br /&gt;
        elseif upright ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright=&amp;quot; .. upright;&lt;br /&gt;
        end&lt;br /&gt;
        if thumbtime ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|thumbtime=&amp;quot; .. thumbtime;&lt;br /&gt;
        end&lt;br /&gt;
        if class ~= nil and class ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|class=&amp;quot; .. class;&lt;br /&gt;
        end&lt;br /&gt;
        -- if alt value is a keyword then do not use as a description&lt;br /&gt;
        if alt == &amp;quot;thumbnail&amp;quot; or alt == &amp;quot;thumb&amp;quot; or alt == &amp;quot;frameless&amp;quot; or alt == &amp;quot;left&amp;quot; or alt == &amp;quot;center&amp;quot; or alt == &amp;quot;right&amp;quot; or alt == &amp;quot;upright&amp;quot; or alt == &amp;quot;border&amp;quot; or mw.ustring.match(alt or &amp;quot;&amp;quot;, &#039;^[0-9]*px$&#039;, 1) ~= nil then&lt;br /&gt;
            alt = nil;&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            -- does title param contain any templatestyles? If yes then set to blank.&lt;br /&gt;
            if mw.ustring.match(frame:preprocess(title), &#039;UNIQ%-%-templatestyles&#039;, 1) ~= nil then&lt;br /&gt;
                title = nil;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. title;&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return i;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Citation_needed/doc&amp;diff=1575</id>
		<title>Modèle:Citation needed/doc</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Citation_needed/doc&amp;diff=1575"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
{{High-use}}&lt;br /&gt;
{{cascade-protected template}}&lt;br /&gt;
{{Notice|An introductory version of this documentation is provided at [[Wikipedia:Citation needed]].}}&lt;br /&gt;
{{Template shortcut|cn|fact}}&lt;br /&gt;
{{Lua|Module:Unsubst|Module:Check for unknown parameters}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{pp-semi-indef}}&amp;lt;!--persistent vandalism from anon users--&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{Redirect|Template:Proveit|the template about the referencing gadget|Template:User ProveIt}}&lt;br /&gt;
[[File:Webcomic xkcd - Wikipedian protester - English.svg|thumb|right|&amp;amp;lsqb;[[Wikipedia:citation needed|citation needed]]&amp;amp;rsqb;]]&lt;br /&gt;
{{Tlb|Citation needed}} is a [[Help:Template|template]] used to identify claims in articles, particularly if questionable, that need a [[Wikipedia:Citing sources|citation]] to a [[WP:Reliable sources|reliable source]]. This template produces the superscripted message&amp;amp;nbsp;{{citation needed|date=May 2013|reason=example}} and is installed with no spaces directly after punctuation.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* {{tnull|Citation needed|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&lt;br /&gt;
* {{tnull|Citation needed|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}|reason{{=}}&#039;&#039;Your explanation here&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The {{para|date}} parameter consists of the full English name of the current month (with initial capital and rest lowercase), a space, and the year. For example, &amp;quot;{{xt|January 2013}}&amp;quot; but not &amp;quot;{{!xt|jan13}}&amp;quot; or &amp;quot;{{!xt|January 23, 2013}}&amp;quot;. Deviation from this rule will place the article in [[:Category:Articles with invalid date parameter in template]]. &lt;br /&gt;
** To automatically add the current date, you can use [[Help:Substitution|substitution]] like this: &amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline&amp;gt;{{subst:Citation needed}}&amp;lt;/syntaxhighlight&amp;gt;. &lt;br /&gt;
** If the {{para|date}} parameter is not given, a [[Wikipedia:Bots|bot]] will soon add it ([[User:AnomieBOT|AnomieBOT]]&#039;s TagDater task) but it&#039;s better if you add it yourself to avoid an extra edit to the article&#039;s history.&lt;br /&gt;
* The {{para|reason}} parameter is for an explanation why you think the material needs a source. It is optional but very helpful. It is displayed as a [[tooltip]] in some browsers (hover the mouse here {{Citation needed|reason=If and only if this text is displayed, the reason parameter is working in your browser|date={{currentmonth}} {{currentyear}}}} to check behaviour of your browser). For example, the following usage might be appropriate to the claim that &amp;quot;Humphrey Bogart was an avid snooker player&amp;quot;: &amp;lt;br/&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline&amp;gt;{{Citation needed|reason=This claim needs a reliable source; Bogart was a famous actor but his major biographies don&#039;t mention snooker.|date=July 2024}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Use only [[plain text]] for the {{para|reason}} parameter. It does not support [[Help:Wiki markup|wiki markup]] like wikilinks, which can mess up the tooltip.&lt;br /&gt;
** Double quotation marks used within the {{para|reason}} parameter will likewise mess up the tooltip; use single quotes or the HTML code &amp;lt;code&amp;gt;&amp;amp;amp;quot;&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
** If omitted, the tooltip &amp;quot;This claim needs references to reliable sources.&amp;quot; is used by default.&lt;br /&gt;
* This template should usually be installed directly &#039;&#039;after&#039;&#039; punctuation, such as a full stop (period) or a comma.&lt;br /&gt;
* Use of this template places the article into [[:Category:All articles with unsourced statements]] and [[:Category:Articles with unsourced statements from {{CURRENTMONTHNAME}} {{CURRENTYEAR}}]] (example; past months are listed in [[:Category:Articles with unsourced statements]]).&lt;br /&gt;
* Remove the template when you add a citation for a statement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
This sentence shows the template used at the end.&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline&amp;gt;{{Citation needed|reason=Reliable source needed for the whole sentence|date=July 2004}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This wikitext will be rendered as follows:&lt;br /&gt;
&lt;br /&gt;
:This sentence shows the template used at the end.{{Citation needed|reason=Reliable source needed for the whole sentence|date=July 2004}}&lt;br /&gt;
&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
:[[Humphrey Bogart]] was an avid snooker player.&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline&amp;gt;{{Citation needed|date=July 2004}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The template indicates that it may be that Humphrey Bogart played snooker at some point and it may be that he was enthusiastic about the game but no &#039;&#039;reliable&#039;&#039;, &#039;&#039;published&#039;&#039; sources were given to verify it and the information is not considered [[common knowledge]]. &lt;br /&gt;
&lt;br /&gt;
:[[Humphrey Bogart]] was an avid snooker player.{{Citation needed|date=July 2004}}&lt;br /&gt;
&lt;br /&gt;
=== Example 3 ===&lt;br /&gt;
If it is considered that he might have played snooker but was not an avid player, a reason for the need of a citation may be given, displayed as a tooltip when the mouse hovers on &amp;quot;citation needed&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
:[[Humphrey Bogart]] was an avid snooker player.&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline&amp;gt;{{Citation needed|date=July 2004|reason=Only aware he was photographed playing once. Not aware of any source that claims he played a lot.}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[Humphrey Bogart]] was an avid snooker player.{{Citation needed|date=July 2004|reason=Only aware he was photographed playing once. Not aware of any source that claims he played a lot.}}&lt;br /&gt;
&lt;br /&gt;
In this example, it may be better to use the {{tl|Citation needed span}}, which has slightly different syntax, template to highlight the word &amp;quot;avid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== When not to use this template ==&lt;br /&gt;
Contentious material about [[Wikipedia:Biographies of living persons|living persons]] that is unsourced or poorly sourced should be &#039;&#039;&#039;removed immediately&#039;&#039;&#039;. Do not tag it; immediately remove it. This includes material that is disparaging, misrepresentative, insulting, harmful, or possibly [[libelous]]. For some policy about this, see the sections [[Wikipedia:Biographies of living persons#Remove contentious material that is unsourced or poorly sourced|&amp;quot;Remove contentious material that is unsourced or poorly sourced&amp;quot;]] at [[Wikipedia:Biographies of living persons]] and [[Wikipedia:Verifiability#Burden of evidence|&amp;quot;Burden of evidence&amp;quot;]] at [[Wikipedia:Verifiability]].&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;nowiki&amp;gt;{{Citation needed}}&amp;lt;/nowiki&amp;gt; template is intended for use when there is a general question of the verifiability of a statement, or when an editor believes that a reference verifying the statement should be provided. Other templates are available for other or more specific issues; see the [[#Article_message_box_templates|list of inline templates]]. For example, claims that you think are incorrect should be tagged with {{Tl|Dubious}}, and those which represent a non-neutral view should be tagged with {{Tl|POV statement}}. Being specific about the nature of the problem will help other editors correct it.&lt;br /&gt;
&lt;br /&gt;
Within a [[Wikipedia:lead section|lead section]] that is clearly written as a summary of a substantially sourced article,&lt;br /&gt;
* statements that are supported with citations within the body of the article should not be tagged,&lt;br /&gt;
* statements that are not supported in the article body should be tagged with {{tl|Not verified in body}}.&lt;br /&gt;
&lt;br /&gt;
If you have the time and ability to find an authoritative reference, please do so. Then add the citation yourself, or correct the article text. After all, the ultimate goal is not to merely identify problems, but to fix them.&lt;br /&gt;
&lt;br /&gt;
While an editor may add this template to any uncited passage for any reason, many editors object to what they perceive as overuse of this tag, particularly in what is known as &amp;quot;[[drive-by]]&amp;quot; tagging, which is applying the tag without attempting to address the issues at all. Consider whether adding this tag in an article is the best approach before using it, and use it judiciously. Wikipedia&#039;s [[WP:Verifiability|verifiability policy]] requires neither reliable sources for [[Common knowledge|common well-known facts]] (e.g., &amp;quot;the Moon orbits the Earth&amp;quot;), nor that citations be repeated through every sentence in a paragraph. All direct quotations and facts whose accuracy might be challenged (e.g., statistics) require citations. See [[WP:MINREF]] for the list of material that is absolutely required to be followed by an [[Wikipedia:Inline citation|inline citation]], rather than a [[Wikipedia:General references|general reference]] or no citation at all. Also note that the [[WP:BURDEN|burden of evidence]] lies with the editor who adds or restores material.&lt;br /&gt;
&lt;br /&gt;
This template is intended for specific passages that need citation. For entire articles or sections that contain significant material lacking citations (rather than just specific short passages), there are other, more appropriate templates, such as {{Tl|Unreferenced}} and {{Tl|More citations needed}} (for whole articles) as well as {{Tl|Unreferenced section}} and {{Tl|More citations needed section}} (for sections of articles).&lt;br /&gt;
&lt;br /&gt;
Do not use this template to tag policies or guidelines.&lt;br /&gt;
&lt;br /&gt;
== How to respond to this tag ==&lt;br /&gt;
The addition of this tag is a request for an inline citation to support the tagged statement. If you are able to provide a citation to support the claim, then please do so.&lt;br /&gt;
&lt;br /&gt;
Except for [[WP:Biographies of living persons|contentious claims about living people]], which should be immediately removed if not cited, there is no specific deadline for providing citations. Please do not delete information that you believe is correct solely because no one has provided a citation within an arbitrary time limit. If there is some uncertainty about its accuracy, most editors are willing to wait at least a month to see whether a citation can be provided.&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
{{TemplateData header}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;The template is used to identify claims in articles, particularly if questionable, that lack a citation to a reliable source.&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;date&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Month and year&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Provides the month and year of the citation request; e.g., &#039;January 2013&#039;, but not &#039;jan13&#039;&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;{{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;reason&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Reason for citation&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A reason as to why, or for what content, the citation is needed; use single quotes, if any&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tracking categories ==&lt;br /&gt;
* {{clc|Pages containing citation needed template with unsupported parameters}} – a hidden maintenance/tracking category which is added to pages using this template with unsupported parameters&lt;br /&gt;
* {{clc|All articles with unsourced statements}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Citation needed]], Wikipedia&#039;s mainspace article about this template&lt;br /&gt;
* [[Template:Citation needed span]], variant of this template that explicitly attaches to a portion of text&lt;br /&gt;
* [[Template:Not verified in body]], a similar template specifically for the lead of articles&lt;br /&gt;
* [[Template:Medical citation needed]]&lt;br /&gt;
* [[Template:More citations needed]]&lt;br /&gt;
* [[Wikipedia:Citing sources]], especially [[Wikipedia:Citing sources#Unsourced material|Unsourced material]]&lt;br /&gt;
* [[Wikipedia:Reliable sources]]&lt;br /&gt;
* [[Wikipedia:Template index/Cleanup#Verifiability and sources]]&lt;br /&gt;
* [[Wikipedia:Template index/Sources of articles]]&lt;br /&gt;
* [[Wikipedia:Verifiability]]&lt;br /&gt;
&lt;br /&gt;
=== Article message box templates ===&lt;br /&gt;
* {{Tl|Cite check}}: article or section may have inappropriate or misinterpreted citations.&lt;br /&gt;
* {{Tl|More citations needed}}: article or section has weak or incomplete sources, references, or citations.&lt;br /&gt;
* {{Tl|Unreferenced}} and {{Tl|Unreferenced section}}: article or section has no sources, references, or citations given at all.&lt;br /&gt;
* Citation method and style&lt;br /&gt;
** {{Tl|Citation style}}&lt;br /&gt;
** {{Tl|No footnotes}}&lt;br /&gt;
&lt;br /&gt;
{{Inline cleanup tags}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Template categories --&amp;gt;&lt;br /&gt;
[[Category:Inline citation and verifiability dispute templates]]&lt;br /&gt;
[[Category:Templates that add a tracking category]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Inline_cleanup_tags&amp;diff=1573</id>
		<title>Modèle:Inline cleanup tags</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Inline_cleanup_tags&amp;diff=1573"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
| name = Inline cleanup tags&lt;br /&gt;
| state = {{{state&amp;lt;includeonly&amp;gt;|autocollapse&amp;lt;/includeonly&amp;gt;}}}&lt;br /&gt;
| bodyclass = hlist&lt;br /&gt;
| title = Inline cleanup tags&lt;br /&gt;
| evenodd = off&lt;br /&gt;
| group1 = Attribution&lt;br /&gt;
| list1 =&lt;br /&gt;
* {{tl|Among whom}}&lt;br /&gt;
* {{tl|According to whom}}&lt;br /&gt;
* {{tl|Attribution needed}}&lt;br /&gt;
* {{tl|By whom}}&lt;br /&gt;
* {{tl|From whom?}}&lt;br /&gt;
* {{tl|Like whom?}}&lt;br /&gt;
* {{tl|To whom?}}&lt;br /&gt;
* {{tl|Who}}&lt;br /&gt;
* {{tl|With whom}}&lt;br /&gt;
&lt;br /&gt;
| group2 = Clarity&lt;br /&gt;
| list2 =&lt;br /&gt;
* {{tl|Ambiguous}}&lt;br /&gt;
* {{tl|Clarify}}&lt;br /&gt;
* {{tl|Clarify span}}&lt;br /&gt;
* {{tl|Clarify timeframe}}&lt;br /&gt;
* {{tl|Context inline}}&lt;br /&gt;
* {{tl|Expand acronym}}&lt;br /&gt;
* {{tl|Incomprehensible inline}}&lt;br /&gt;
* {{tl|Incomprehensible span}}&lt;br /&gt;
* {{tl|Key needed}}&lt;br /&gt;
* {{tl|Non sequitur}}&lt;br /&gt;
* {{tl|Sentence fragment}}&lt;br /&gt;
* {{tl|Which calendar}}&lt;br /&gt;
&lt;br /&gt;
| group3 = Miscellaneous&lt;br /&gt;
| list3 =&lt;br /&gt;
* {{tl|Chinese script needed inline}} &lt;br /&gt;
* {{tl|Copyright violation}}&lt;br /&gt;
* {{tl|Copyvio link}}&lt;br /&gt;
* {{tl|Data missing}}&lt;br /&gt;
* {{tl|Disambiguation needed}}&lt;br /&gt;
* {{tl|External links inline}}&lt;br /&gt;
* {{tl|Improve caption}}&lt;br /&gt;
* {{tl|Needs IPA}}&lt;br /&gt;
* {{tl|Original research inline}}&lt;br /&gt;
* {{tl|Original research span}}&lt;br /&gt;
* {{tl|Pronunciation needed}}&lt;br /&gt;
* {{tl|Script needed inline}} &lt;br /&gt;
* {{tl|Spam link}}&lt;br /&gt;
* {{tl|Synthesis inline}}&lt;br /&gt;
* {{tl|Synthesis span}}&lt;br /&gt;
* {{tl|Under discussion inline}}&lt;br /&gt;
* {{tl|Verify spelling}}&lt;br /&gt;
* {{tl|Whose translation}}&lt;br /&gt;
&lt;br /&gt;
| group4 = Neutrality&lt;br /&gt;
| list4 =&lt;br /&gt;
* {{tl|Buzzword inline}}&lt;br /&gt;
* {{tl|Compared to?}}&lt;br /&gt;
* {{tl|Editorializing}}&lt;br /&gt;
* {{tl|Fact or opinion}}&lt;br /&gt;
* {{tl|Opinion}}&lt;br /&gt;
* {{tl|Peacock inline}}&lt;br /&gt;
* {{tl|POV statement}}&lt;br /&gt;
* {{tl|Promotion inline}}&lt;br /&gt;
* {{tl|Unbalanced opinion}}&lt;br /&gt;
* {{tl|Weasel inline}}&lt;br /&gt;
&lt;br /&gt;
| group5 = Precision&lt;br /&gt;
| list5 = {{Navbox |child&lt;br /&gt;
  | evenodd = off&lt;br /&gt;
  | list1 =&lt;br /&gt;
* {{tl|By how much}}&lt;br /&gt;
* {{tl|Definition}}&lt;br /&gt;
* {{tl|Definition needed}}&lt;br /&gt;
* {{tl|Example needed}}&lt;br /&gt;
* {{tl|Example needed span}}&lt;br /&gt;
* {{tl|Explain}}&lt;br /&gt;
* {{tl|How}}&lt;br /&gt;
* {{tl|How often}}&lt;br /&gt;
* {{tl|Misquoted}}&lt;br /&gt;
* {{tl|Quantify}}&lt;br /&gt;
* {{tl|Specify}}&lt;br /&gt;
* {{tl|Vague}}&lt;br /&gt;
* {{tl|When}}&lt;br /&gt;
* {{tl|Where}}&lt;br /&gt;
* {{tl|Which}}&lt;br /&gt;
* {{tl|Who else}}&lt;br /&gt;
* {{tl|Why}}&lt;br /&gt;
* {{tl|Year needed}}&lt;br /&gt;
&lt;br /&gt;
  | group2 = Excessive&lt;br /&gt;
  | list2 =&lt;br /&gt;
* {{tl|Overly detailed inline}}&lt;br /&gt;
* {{tl|Duplication span}}&lt;br /&gt;
* {{tl|Importance inline}}&lt;br /&gt;
* {{tl|Relevance inline}}&lt;br /&gt;
* {{tl|Undue weight inline}}&lt;br /&gt;
* {{tl|Globalize inline}}&lt;br /&gt;
* {{tl|Infobox clutter}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
| group6 = Time-sensitivity&lt;br /&gt;
| list6 =&lt;br /&gt;
* {{tl|Anachronism inline}}&lt;br /&gt;
* {{tl|Clarify timeframe}}&lt;br /&gt;
* {{tl|Current event inline}}&lt;br /&gt;
* {{tl|Is this date calibrated?}}&lt;br /&gt;
* {{tl|Update after}}&lt;br /&gt;
* {{tl|Update inline}}&lt;br /&gt;
* {{tl|Update span}}&lt;br /&gt;
&lt;br /&gt;
| group7 = Verifiability&lt;br /&gt;
| list7 = {{Navbox|child&lt;br /&gt;
  | evenodd = off&lt;br /&gt;
  | groupstyle = white-space: normal;&lt;br /&gt;
  | group1 = Dubious&lt;br /&gt;
  | list1 =&lt;br /&gt;
* {{tl|Contradictory inline}}&lt;br /&gt;
* {{tl|Disputed inline}}&lt;br /&gt;
* {{tl|Dubious}}&lt;br /&gt;
* {{tl|Dubious span}}&lt;br /&gt;
* {{tl|Inconsistent}}&lt;br /&gt;
* {{tl|Needs independent confirmation}}&lt;br /&gt;
* {{tl|Speculation inline}}&lt;br /&gt;
&lt;br /&gt;
  | group2 = [[WP:Bare URLs|Bare URLs]]&lt;br /&gt;
  | list2 =&lt;br /&gt;
* {{tl|Bare URL inline}}&lt;br /&gt;
* {{tl|Bare URL non-HTML}}&lt;br /&gt;
* {{tl|Bare URL AV media}}&lt;br /&gt;
* {{tl|Bare URL PDF}}&lt;br /&gt;
* {{tl|Bare URL image}}&lt;br /&gt;
* {{tl|Bare URL DOC}}&lt;br /&gt;
* {{tl|Bare URL plain text}}&lt;br /&gt;
* {{tl|Bare URL spreadsheet}}&lt;br /&gt;
&lt;br /&gt;
  | group3 = Incomplete or broken citation&lt;br /&gt;
  | list3 =&lt;br /&gt;
* {{tl|Author incomplete}}&lt;br /&gt;
* {{tl|Author missing}}&lt;br /&gt;
* {{tl|Date missing}}&lt;br /&gt;
* {{tl|Dead link}}&lt;br /&gt;
* {{tl|Edition needed}}&lt;br /&gt;
* {{tl|Episode needed}}&lt;br /&gt;
* {{tl|Full citation needed}}&lt;br /&gt;
* {{tl|Incomplete short citation}}&lt;br /&gt;
* {{tl|ISBN missing}}&lt;br /&gt;
* {{tl|Moved resource}}&lt;br /&gt;
* {{tl|Page needed}}&lt;br /&gt;
* {{tl|Place missing}}&lt;br /&gt;
* {{tl|Publisher missing}}&lt;br /&gt;
* {{tl|Season needed}}&lt;br /&gt;
* {{tl|Time needed}}&lt;br /&gt;
* {{tl|Title incomplete}}&lt;br /&gt;
* {{tl|Title missing}}&lt;br /&gt;
* {{tl|Unused source}}&lt;br /&gt;
* {{tl|Volume needed}}&lt;br /&gt;
* {{tl|Year missing}}&lt;br /&gt;
&lt;br /&gt;
  | group4 = Missing or problematic reference&lt;br /&gt;
  | list4 =&lt;br /&gt;
* {{tl|Additional citation needed}}&lt;br /&gt;
* {{tl|Better source needed}}&lt;br /&gt;
* {{tl|Better source needed example}}&lt;br /&gt;
* {{tl|Check quotation}}&lt;br /&gt;
* {{tl|Chronology citation needed}}&lt;br /&gt;
* {{tl|Circular reference}}&lt;br /&gt;
* {{tl|Citation needed}}&lt;br /&gt;
* {{tl|Citation needed span}}&lt;br /&gt;
* {{tl|Citation not found}}&lt;br /&gt;
* {{tl|Close paraphrasing inline}}&lt;br /&gt;
* {{tl|COI source}}&lt;br /&gt;
* {{tl|Deprecated inline}}&lt;br /&gt;
* {{tl|Excessive citations inline}}&lt;br /&gt;
* {{tl|Failed verification}}&lt;br /&gt;
* {{tl|Failed verification span}}&lt;br /&gt;
* {{tl|Image reference needed}}&lt;br /&gt;
* {{tl|Irrelevant citation}}&lt;br /&gt;
* {{tl|Medical citation needed}}&lt;br /&gt;
* {{tl|Medical citation needed span}}&lt;br /&gt;
* {{tl|Nonspecific}}&lt;br /&gt;
* {{tl|Not verified in body}}&lt;br /&gt;
* {{tl|Obsolete source}}&lt;br /&gt;
* {{tl|Page range too broad}}&lt;br /&gt;
* {{tl|Primary source inline}}&lt;br /&gt;
* {{tl|Promotional source}}&lt;br /&gt;
* {{tl|Quote without source}}&lt;br /&gt;
* {{tl|Request quotation}}&lt;br /&gt;
* {{tl|Request quotation span}}&lt;br /&gt;
* {{tl|Retracted}}&lt;br /&gt;
* {{tl|Scientific citation needed}}&lt;br /&gt;
* {{tl|Self-published inline}}&lt;br /&gt;
* {{tl|Tertiary source inline}}&lt;br /&gt;
* {{tl|Third-party inline}}&lt;br /&gt;
* {{tl|Unreliable fringe source}}&lt;br /&gt;
* {{tl|Unreliable medical source}}&lt;br /&gt;
* {{tl|Unreliable source?}}&lt;br /&gt;
* {{tl|Verify quote}}&lt;br /&gt;
* {{tl|Verify source}}&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| group8 = Wording&lt;br /&gt;
| list8 =&lt;br /&gt;
* {{tl|Buzzword inline}}&lt;br /&gt;
* {{tl|Colloquialism}}&lt;br /&gt;
* {{tl|Copy edit inline}}&lt;br /&gt;
* {{tl|Idiom}}&lt;br /&gt;
* {{tl|Neologism inline}}&lt;br /&gt;
* {{tl|Technical inline}}&lt;br /&gt;
* {{tl|Tone inline}}&lt;br /&gt;
&lt;br /&gt;
| group9 = General advice&lt;br /&gt;
| list9 =&lt;br /&gt;
* [[Wikipedia:Citing sources|Citing sources]]&lt;br /&gt;
* [[Wikipedia:Reliable sources|Reliable sources]]&lt;br /&gt;
* [[Help:Maintenance template removal |Maintenance template removal]]&lt;br /&gt;
* [[Wikipedia:Citation needed|Citation needed]]&lt;br /&gt;
* [[Help:Find sources|Find sources]]&lt;br /&gt;
* [[Wikipedia:Combining sources|Combining sources]]&lt;br /&gt;
* [[Help:Overview of referencing styles|Referencing styles]]&lt;br /&gt;
&lt;br /&gt;
| belowstyle = font-weight:bold;&lt;br /&gt;
| below =&lt;br /&gt;
* {{icon|Category}} {{c|Inline cleanup templates}}&lt;br /&gt;
* {{icon link|WikiProject|Wikipedia:WikiProject Inline Templates|WikiProject Inline Templates}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Currentyear&amp;diff=1571</id>
		<title>Modèle:Currentyear</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Currentyear&amp;diff=1571"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;CURRENTYEAR}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|link box=off|content=This template exists for people who use incorrect capitalization of the [[Help:Magic words|magic word]] &amp;lt;nowiki&amp;gt;{{CURRENTYEAR}}&amp;lt;/nowiki&amp;gt;. The magic word should be used in preference to this template.&lt;br /&gt;
==See also==&lt;br /&gt;
*{{Tl|Year needed}}}}&lt;br /&gt;
[[Category:Wikipedia magic word templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Currentmonth&amp;diff=1569</id>
		<title>Modèle:Currentmonth</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Currentmonth&amp;diff=1569"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;CURRENTMONTHNAME}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|link box=off|content=This template exists for people who use incorrect capitalization of the [[Help:Magic words|magic word]] &amp;lt;nowiki&amp;gt;{{CURRENTMONTHNAME}}&amp;lt;/nowiki&amp;gt;. The magic word should be used in preference to this template.&lt;br /&gt;
{{Calendar, clock, date and time computing templates}}&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Wikipedia magic word templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_link_null&amp;diff=1567</id>
		<title>Modèle:Template link null</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_link_null&amp;diff=1567"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#Invoke:Template link general|main|nolink=yes|code=yes}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|1=Template:Tlg/doc&lt;br /&gt;
|content = {{tlg/doc|tnull}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Tnull&amp;diff=1565</id>
		<title>Modèle:Tnull</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Tnull&amp;diff=1565"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Template link null]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Text&amp;diff=1563</id>
		<title>Module:Text</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Text&amp;diff=1563"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local yesNo = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
local Text = { serial = &amp;quot;2022-07-21&amp;quot;,&lt;br /&gt;
               suite  = &amp;quot;Text&amp;quot; }&lt;br /&gt;
--[=[&lt;br /&gt;
Text utilities&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function fiatQuote( apply, alien, advance )&lt;br /&gt;
    -- Quote text&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code&lt;br /&gt;
    --     advance  -- number, with level 1 or 2&lt;br /&gt;
    local r = apply and tostring(apply) or &amp;quot;&amp;quot;&lt;br /&gt;
    alien = alien or &amp;quot;en&amp;quot;&lt;br /&gt;
    advance = tonumber(advance) or 0&lt;br /&gt;
    local suite&lt;br /&gt;
    local data = mw.loadData(&#039;Module:Text/data&#039;)&lt;br /&gt;
    local QuoteLang = data.QuoteLang&lt;br /&gt;
    local QuoteType = data.QuoteType&lt;br /&gt;
    local slang = alien:match( &amp;quot;^(%l+)-&amp;quot; )&lt;br /&gt;
    suite = QuoteLang[alien] or slang and QuoteLang[slang] or QuoteLang[&amp;quot;en&amp;quot;]&lt;br /&gt;
    if suite then&lt;br /&gt;
        local quotes = QuoteType[ suite ]&lt;br /&gt;
        if quotes then&lt;br /&gt;
            local space&lt;br /&gt;
            if quotes[ 3 ] then&lt;br /&gt;
                space = &amp;quot;&amp;amp;#160;&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                space = &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            quotes = quotes[ advance ]&lt;br /&gt;
            if quotes then&lt;br /&gt;
                r = mw.ustring.format( &amp;quot;%s%s%s%s%s&amp;quot;,&lt;br /&gt;
                                       mw.ustring.char( quotes[ 1 ] ),&lt;br /&gt;
                                       space,&lt;br /&gt;
                                       apply,&lt;br /&gt;
                                       space,&lt;br /&gt;
                                       mw.ustring.char( quotes[ 2 ] ) )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            mw.log( &amp;quot;fiatQuote() &amp;quot; .. suite )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fiatQuote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.char = function ( apply, again, accept )&lt;br /&gt;
    -- Create string from codepoints&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply   -- table (sequence) with numerical codepoints, or nil&lt;br /&gt;
    --     again   -- number of repetitions, or nil&lt;br /&gt;
    --     accept  -- true, if no error messages to be appended&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    apply = type(apply) == &amp;quot;table&amp;quot; and apply or {}&lt;br /&gt;
    again = math.floor(tonumber(again) or 1)&lt;br /&gt;
    if again &amp;lt; 1 then&lt;br /&gt;
    	return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local bad   = { }&lt;br /&gt;
    local codes = { }&lt;br /&gt;
    for _, v in ipairs( apply ) do&lt;br /&gt;
    	local n = tonumber(v)&lt;br /&gt;
    	if not n or (n &amp;lt; 32 and n ~= 9 and n ~= 10) then&lt;br /&gt;
    		table.insert(bad, tostring(v))&lt;br /&gt;
    	else&lt;br /&gt;
    		table.insert(codes, math.floor(n))&lt;br /&gt;
		end&lt;br /&gt;
    end &lt;br /&gt;
    if #bad &amp;gt; 0 then&lt;br /&gt;
    	if not accept then&lt;br /&gt;
    		r = tostring(  mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                    		:addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                    		:wikitext( &amp;quot;bad codepoints: &amp;quot; .. table.concat( bad, &amp;quot; &amp;quot; )) )&lt;br /&gt;
    	end&lt;br /&gt;
    	return r&lt;br /&gt;
    end&lt;br /&gt;
    if #codes &amp;gt; 0 then&lt;br /&gt;
    	r = mw.ustring.char( unpack( codes ) )&lt;br /&gt;
    	if again &amp;gt; 1 then&lt;br /&gt;
    		r = r:rep(again)&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.char()&lt;br /&gt;
&lt;br /&gt;
local function trimAndFormat(args, fmt)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	if type(args) ~= &#039;table&#039; then&lt;br /&gt;
		args = {args}&lt;br /&gt;
	end&lt;br /&gt;
	for _, v in ipairs(args) do&lt;br /&gt;
		v = mw.text.trim(tostring(v))&lt;br /&gt;
		if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			table.insert(result,fmt and mw.ustring.format(fmt, v) or v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Text.concatParams = function ( args, apply, adapt )&lt;br /&gt;
    -- Concat list items into one string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args   -- table (sequence) with numKey=string&lt;br /&gt;
    --     apply  -- string (optional); separator (default: &amp;quot;|&amp;quot;)&lt;br /&gt;
    --     adapt  -- string (optional); format including &amp;quot;%s&amp;quot;&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local collect = { }&lt;br /&gt;
    return table.concat(trimAndFormat(args,adapt), apply or &amp;quot;|&amp;quot;)&lt;br /&gt;
end -- Text.concatParams()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.containsCJK = function ( s )&lt;br /&gt;
    -- Is any CJK code within?&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     s  -- string&lt;br /&gt;
    -- Returns: true, if CJK detected&lt;br /&gt;
    s = s and tostring(s) or &amp;quot;&amp;quot;&lt;br /&gt;
    local patternCJK = mw.loadData(&#039;Module:Text/data&#039;).PatternCJK&lt;br /&gt;
    return mw.ustring.find( s, patternCJK ) ~= nil&lt;br /&gt;
end -- Text.containsCJK()&lt;br /&gt;
&lt;br /&gt;
Text.removeDelimited = function (s, prefix, suffix)&lt;br /&gt;
	-- Remove all text in s delimited by prefix and suffix (inclusive)&lt;br /&gt;
	-- Arguments:&lt;br /&gt;
	--    s = string to process&lt;br /&gt;
	--    prefix = initial delimiter&lt;br /&gt;
	--    suffix = ending delimiter&lt;br /&gt;
	-- Returns: stripped string&lt;br /&gt;
	s = s and tostring(s) or &amp;quot;&amp;quot;&lt;br /&gt;
	prefix = prefix and tostring(prefix) or &amp;quot;&amp;quot;&lt;br /&gt;
	suffix = suffix and tostring(suffix) or &amp;quot;&amp;quot;&lt;br /&gt;
	local prefixLen = mw.ustring.len(prefix)&lt;br /&gt;
	local suffixLen = mw.ustring.len(suffix)&lt;br /&gt;
	if prefixLen == 0 or suffixLen == 0 then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	local i = s:find(prefix, 1, true)&lt;br /&gt;
	local r = s&lt;br /&gt;
	local j&lt;br /&gt;
	while i do&lt;br /&gt;
		j = r:find(suffix, i + prefixLen)&lt;br /&gt;
		if j then&lt;br /&gt;
			r = r:sub(1, i - 1)..r:sub(j+suffixLen)&lt;br /&gt;
		else&lt;br /&gt;
			r = r:sub(1, i - 1)&lt;br /&gt;
		end&lt;br /&gt;
		i = r:find(prefix, 1, true)&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Text.getPlain = function ( adjust )&lt;br /&gt;
    -- Remove wikisyntax from string, except templates&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local r = Text.removeDelimited(adjust,&amp;quot;&amp;lt;!--&amp;quot;,&amp;quot;--&amp;gt;&amp;quot;)&lt;br /&gt;
    r = r:gsub( &amp;quot;(&amp;lt;/?%l[^&amp;gt;]*&amp;gt;)&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&#039;&#039;&#039;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&#039;&#039;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.getPlain()&lt;br /&gt;
&lt;br /&gt;
Text.isLatinRange = function (s)&lt;br /&gt;
    -- Are characters expected to be latin or symbols within latin texts?&lt;br /&gt;
    -- Arguments:&lt;br /&gt;
    --  s = string to analyze&lt;br /&gt;
    -- Returns: true, if valid for latin only&lt;br /&gt;
    s = s and tostring(s) or &amp;quot;&amp;quot;  --- ensure input is always string&lt;br /&gt;
    local PatternLatin = mw.loadData(&#039;Module:Text/data&#039;).PatternLatin&lt;br /&gt;
    return mw.ustring.match(s, PatternLatin) ~= nil&lt;br /&gt;
end -- Text.isLatinRange()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.isQuote = function ( s )&lt;br /&gt;
    -- Is this character any quotation mark?&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     s = single character to analyze&lt;br /&gt;
    -- Returns: true, if s is quotation mark&lt;br /&gt;
    s = s and tostring(s) or &amp;quot;&amp;quot;&lt;br /&gt;
    if s == &amp;quot;&amp;quot; then&lt;br /&gt;
    	return false&lt;br /&gt;
    end&lt;br /&gt;
    local SeekQuote = mw.loadData(&#039;Module:Text/data&#039;).SeekQuote&lt;br /&gt;
    return mw.ustring.find( SeekQuote, s, 1, true ) ~= nil&lt;br /&gt;
end -- Text.isQuote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.listToText = function ( args, adapt )&lt;br /&gt;
    -- Format list items similar to mw.text.listToText()&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args   -- table (sequence) with numKey=string&lt;br /&gt;
    --     adapt  -- string (optional); format including &amp;quot;%s&amp;quot;&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    return mw.text.listToText(trimAndFormat(args, adapt))&lt;br /&gt;
end -- Text.listToText()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.quote = function ( apply, alien, advance )&lt;br /&gt;
    -- Quote text&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code, or nil&lt;br /&gt;
    --     advance  -- number, with level 1 or 2, or nil&lt;br /&gt;
    -- Returns: quoted string&lt;br /&gt;
    apply = apply and tostring(apply) or &amp;quot;&amp;quot;&lt;br /&gt;
    local mode, slang&lt;br /&gt;
    if type( alien ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        slang = mw.text.trim( alien ):lower()&lt;br /&gt;
    else&lt;br /&gt;
        slang = mw.title.getCurrentTitle().pageLanguage&lt;br /&gt;
        if not slang then&lt;br /&gt;
            -- TODO FIXME: Introduction expected 2017-04&lt;br /&gt;
            slang = mw.language.getContentLanguage():getCode()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if advance == 2 then&lt;br /&gt;
        mode = 2&lt;br /&gt;
    else&lt;br /&gt;
        mode = 1&lt;br /&gt;
    end&lt;br /&gt;
    return fiatQuote( mw.text.trim( apply ), slang, mode )&lt;br /&gt;
end -- Text.quote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.quoteUnquoted = function ( apply, alien, advance )&lt;br /&gt;
    -- Quote text, if not yet quoted and not empty&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code, or nil&lt;br /&gt;
    --     advance  -- number, with level 1 or 2, or nil&lt;br /&gt;
    -- Returns: string; possibly quoted&lt;br /&gt;
    local r = mw.text.trim( apply and tostring(apply) or &amp;quot;&amp;quot; )&lt;br /&gt;
    local s = mw.ustring.sub( r, 1, 1 )&lt;br /&gt;
    if s ~= &amp;quot;&amp;quot;  and  not Text.isQuote( s, advance ) then&lt;br /&gt;
        s = mw.ustring.sub( r, -1, 1 )&lt;br /&gt;
        if not Text.isQuote( s ) then&lt;br /&gt;
            r = Text.quote( r, alien, advance )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.quoteUnquoted()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.removeDiacritics = function ( adjust )&lt;br /&gt;
    -- Remove all diacritics&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string; all latin letters should be ASCII&lt;br /&gt;
    --                  or basic greek or cyrillic or symbols etc.&lt;br /&gt;
    local cleanup, decomposed&lt;br /&gt;
    local PatternCombined = mw.loadData(&#039;Module:Text/data&#039;).PatternCombined&lt;br /&gt;
    decomposed = mw.ustring.toNFD( adjust and tostring(adjust) or &amp;quot;&amp;quot; )&lt;br /&gt;
    cleanup    = mw.ustring.gsub( decomposed, PatternCombined, &amp;quot;&amp;quot; )&lt;br /&gt;
    return mw.ustring.toNFC( cleanup )&lt;br /&gt;
end -- Text.removeDiacritics()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.sentenceTerminated = function ( analyse )&lt;br /&gt;
    -- Is string terminated by dot, question or exclamation mark?&lt;br /&gt;
    --     Quotation, link termination and so on granted&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    -- Returns: true, if sentence terminated&lt;br /&gt;
    local r&lt;br /&gt;
    local PatternTerminated = mw.loadData(&#039;Module:Text/data&#039;).PatternTerminated&lt;br /&gt;
    if mw.ustring.find( analyse, PatternTerminated ) then&lt;br /&gt;
        r = true&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.sentenceTerminated()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.ucfirstAll = function ( adjust)&lt;br /&gt;
    -- Capitalize all words&lt;br /&gt;
    -- Arguments:&lt;br /&gt;
    --     adjust = string to adjust&lt;br /&gt;
    -- Returns: string with all first letters in upper case&lt;br /&gt;
    adjust = adjust and tostring(adjust) or &amp;quot;&amp;quot;&lt;br /&gt;
    local r = mw.text.decode(adjust,true)&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local c, j, m&lt;br /&gt;
    m = (r ~= adjust)&lt;br /&gt;
    r = &amp;quot; &amp;quot;..r&lt;br /&gt;
    while i do&lt;br /&gt;
        i = mw.ustring.find( r, &amp;quot;%W%l&amp;quot;, i )&lt;br /&gt;
        if i then&lt;br /&gt;
            j = i + 1&lt;br /&gt;
            c = mw.ustring.upper( mw.ustring.sub( r, j, j ) )&lt;br /&gt;
            r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                               mw.ustring.sub( r, 1, i ),&lt;br /&gt;
                               c,&lt;br /&gt;
                               mw.ustring.sub( r, i + 2 ) )&lt;br /&gt;
            i = j&lt;br /&gt;
        end&lt;br /&gt;
    end -- while i&lt;br /&gt;
    r = r:sub( 2 )&lt;br /&gt;
    if m then&lt;br /&gt;
    	r = mw.text.encode(r)&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.ucfirstAll()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.uprightNonlatin = function ( adjust )&lt;br /&gt;
    -- Ensure non-italics for non-latin text parts&lt;br /&gt;
    --     One single greek letter might be granted&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string with non-latin parts enclosed in &amp;lt;span&amp;gt;&lt;br /&gt;
    local r&lt;br /&gt;
    local data = mw.loadData(&#039;Module:Text/data&#039;)&lt;br /&gt;
    local PatternLatin = data.PatternLatin&lt;br /&gt;
    local RangesLatin = data.RangesLatin&lt;br /&gt;
    local NumLatinRanges = data.NumLatinRanges&lt;br /&gt;
    if mw.ustring.match( adjust, PatternLatin ) then&lt;br /&gt;
        -- latin only, horizontal dashes, quotes&lt;br /&gt;
        r = adjust&lt;br /&gt;
    else&lt;br /&gt;
        local c&lt;br /&gt;
        local j    = false&lt;br /&gt;
        local k    = 1&lt;br /&gt;
        local m    = false&lt;br /&gt;
        local n    = mw.ustring.len( adjust )&lt;br /&gt;
        local span = &amp;quot;%s%s&amp;lt;span dir=&#039;auto&#039; style=&#039;font-style:normal&#039;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
        local flat = function ( a )&lt;br /&gt;
                  -- isLatin&lt;br /&gt;
                  local range&lt;br /&gt;
                  -- NumLatinRanges has to be precomputed because # does not work from loadData&lt;br /&gt;
                  for i = 1, NumLatinRanges do&lt;br /&gt;
                      range = RangesLatin[ i ]&lt;br /&gt;
                      if a &amp;gt;= range[ 1 ]  and  a &amp;lt;= range[ 2 ] then&lt;br /&gt;
                          return true&lt;br /&gt;
                      end&lt;br /&gt;
                  end    -- for i&lt;br /&gt;
              end -- flat()&lt;br /&gt;
        local focus = function ( a )&lt;br /&gt;
                  -- char is not ambivalent&lt;br /&gt;
                  local r = ( a &amp;gt; 64 )&lt;br /&gt;
                  if r then&lt;br /&gt;
                      r = ( a &amp;lt; 8192  or  a &amp;gt; 8212 )&lt;br /&gt;
                  else&lt;br /&gt;
                      r = ( a == 38  or  a == 60 )    -- &#039;&amp;amp;&#039; &#039;&amp;lt;&#039;&lt;br /&gt;
                  end&lt;br /&gt;
                  return r&lt;br /&gt;
              end -- focus()&lt;br /&gt;
        local form = function ( a )&lt;br /&gt;
                return string.format( span,&lt;br /&gt;
                                      r,&lt;br /&gt;
                                      mw.ustring.sub( adjust, k, j - 1 ),&lt;br /&gt;
                                      mw.ustring.sub( adjust, j, a ) )&lt;br /&gt;
              end -- form()&lt;br /&gt;
        r = &amp;quot;&amp;quot;&lt;br /&gt;
        for i = 1, n do&lt;br /&gt;
            c = mw.ustring.codepoint( adjust, i, i )&lt;br /&gt;
            if focus( c ) then&lt;br /&gt;
                if flat( c ) then&lt;br /&gt;
                    if j then&lt;br /&gt;
                        if m then&lt;br /&gt;
                            if i == m then&lt;br /&gt;
                                -- single greek letter.&lt;br /&gt;
                                j = false&lt;br /&gt;
                            end&lt;br /&gt;
                            m = false&lt;br /&gt;
                        end&lt;br /&gt;
                        if j then&lt;br /&gt;
                            local nx = i - 1&lt;br /&gt;
                            local s  = &amp;quot;&amp;quot;&lt;br /&gt;
                            for ix = nx, 1, -1 do&lt;br /&gt;
                                c = mw.ustring.sub( adjust, ix, ix )&lt;br /&gt;
                                if c == &amp;quot; &amp;quot;  or  c == &amp;quot;(&amp;quot; then&lt;br /&gt;
                                    nx = nx - 1&lt;br /&gt;
                                    s  = c .. s&lt;br /&gt;
                                else&lt;br /&gt;
                                    break -- for ix&lt;br /&gt;
                                end&lt;br /&gt;
                            end -- for ix&lt;br /&gt;
                            r = form( nx ) .. s&lt;br /&gt;
                            j = false&lt;br /&gt;
                            k = i&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif not j then&lt;br /&gt;
                    j = i&lt;br /&gt;
                    if c &amp;gt;= 880  and  c &amp;lt;= 1023 then&lt;br /&gt;
                        -- single greek letter?&lt;br /&gt;
                        m = i + 1&lt;br /&gt;
                    else&lt;br /&gt;
                        m = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif m then&lt;br /&gt;
                m = m + 1&lt;br /&gt;
            end&lt;br /&gt;
        end    -- for i&lt;br /&gt;
        if j  and  ( not m  or  m &amp;lt; n ) then&lt;br /&gt;
            r = form( n )&lt;br /&gt;
        else&lt;br /&gt;
            r = r .. mw.ustring.sub( adjust, k )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.uprightNonlatin()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.test = function ( about )&lt;br /&gt;
    local r&lt;br /&gt;
    if about == &amp;quot;quote&amp;quot; then&lt;br /&gt;
        data = mw.loadData(&#039;Module:Text/data&#039;)&lt;br /&gt;
        r = { }&lt;br /&gt;
        r.QuoteLang = data.QuoteLang&lt;br /&gt;
        r.QuoteType = data.QuoteType&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.test()&lt;br /&gt;
&lt;br /&gt;
-- Non Unicode-aware version of mw.text.split and mw.text.gsplit&lt;br /&gt;
-- based on [[phab:diffusion/ELUA/browse/master/includes/Engines/LuaCommon/lualib/mw.text.lua]]&lt;br /&gt;
-- These run up to 60 times faster than the Unicode-aware versions&lt;br /&gt;
Text.split = function ( text, pattern, plain )&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for m in Text.gsplit( text, pattern, plain ) do&lt;br /&gt;
		ret[#ret+1] = m&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Text.gsplit = function ( text, pattern, plain )&lt;br /&gt;
	local s, l = 1, string.len( text )&lt;br /&gt;
	return function ()&lt;br /&gt;
		if s then&lt;br /&gt;
			local e, n = string.find( text, pattern, s, plain )&lt;br /&gt;
			local ret&lt;br /&gt;
			if not e then&lt;br /&gt;
				ret = string.sub( text, s )&lt;br /&gt;
				s = nil&lt;br /&gt;
			elseif n &amp;lt; e then&lt;br /&gt;
				-- Empty separator!&lt;br /&gt;
				ret = string.sub( text, s, e )&lt;br /&gt;
				if e &amp;lt; l then&lt;br /&gt;
					s = e + 1&lt;br /&gt;
				else&lt;br /&gt;
					s = nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				ret = e &amp;gt; s and string.sub( text, s, e - 1 ) or &#039;&#039;&lt;br /&gt;
				s = n + 1&lt;br /&gt;
			end&lt;br /&gt;
			return ret&lt;br /&gt;
		end&lt;br /&gt;
	end, nil, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
for _, func in ipairs({&#039;containsCJK&#039;,&#039;isLatinRange&#039;,&#039;isQuote&#039;,&#039;sentenceTerminated&#039;}) do&lt;br /&gt;
	p[func] = function (frame) &lt;br /&gt;
		return Text[func]( frame.args[ 1 ] or &amp;quot;&amp;quot; ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for _, func in ipairs({&#039;getPlain&#039;,&#039;removeDiacritics&#039;,&#039;ucfirstAll&#039;,&#039;uprightNonlatin&#039;}) do&lt;br /&gt;
	p[func] = function (frame) &lt;br /&gt;
		return Text[func]( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.char( frame )&lt;br /&gt;
    local params = frame:getParent().args&lt;br /&gt;
    local story = params[ 1 ]&lt;br /&gt;
    local codes, lenient, multiple&lt;br /&gt;
    if not story then&lt;br /&gt;
        params = frame.args&lt;br /&gt;
        story  = params[ 1 ]&lt;br /&gt;
    end&lt;br /&gt;
    if story then&lt;br /&gt;
        local items = mw.text.split( mw.text.trim(story), &amp;quot;%s+&amp;quot; )&lt;br /&gt;
        if #items &amp;gt; 0 then&lt;br /&gt;
            local j&lt;br /&gt;
            lenient  = (yesNo(params.errors) == false)&lt;br /&gt;
            codes    = { }&lt;br /&gt;
            multiple = tonumber( params[ &amp;quot;*&amp;quot; ] )&lt;br /&gt;
            for _, v in ipairs( items ) do&lt;br /&gt;
            	j = tonumber((v:sub( 1, 1 ) == &amp;quot;x&amp;quot; and &amp;quot;0&amp;quot; or &amp;quot;&amp;quot;) .. v)&lt;br /&gt;
                table.insert( codes,  j or v )&lt;br /&gt;
            end &lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Text.char( codes, multiple, lenient )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.concatParams( frame )&lt;br /&gt;
    local args&lt;br /&gt;
    local template = frame.args.template&lt;br /&gt;
    if type( template ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        template = mw.text.trim( template )&lt;br /&gt;
        template = ( template == &amp;quot;1&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if template then&lt;br /&gt;
        args = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        args = frame.args&lt;br /&gt;
    end&lt;br /&gt;
    return Text.concatParams( args,&lt;br /&gt;
                              frame.args.separator,&lt;br /&gt;
                              frame.args.format )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.listToFormat(frame)&lt;br /&gt;
    local lists = {}&lt;br /&gt;
    local pformat = frame.args[&amp;quot;format&amp;quot;]&lt;br /&gt;
    local sep = frame.args[&amp;quot;sep&amp;quot;] or &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Parameter parsen: Listen&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        local knum = tonumber(k)&lt;br /&gt;
        if knum then lists[knum] = v end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Listen splitten&lt;br /&gt;
    local maxListLen = 0&lt;br /&gt;
    for i = 1, #lists do&lt;br /&gt;
        lists[i] = mw.text.split(lists[i], sep)&lt;br /&gt;
        if #lists[i] &amp;gt; maxListLen then maxListLen = #lists[i] end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Ergebnisstring generieren&lt;br /&gt;
    local result = &amp;quot;&amp;quot;&lt;br /&gt;
    local result_line = &amp;quot;&amp;quot;&lt;br /&gt;
    for i = 1, maxListLen do&lt;br /&gt;
        result_line = pformat&lt;br /&gt;
        for j = 1, #lists do&lt;br /&gt;
            result_line = mw.ustring.gsub(result_line, &amp;quot;%%s&amp;quot;, lists[j][i], 1)&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. result_line&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.listToText( frame )&lt;br /&gt;
    local args&lt;br /&gt;
    local template = frame.args.template&lt;br /&gt;
    if type( template ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        template = mw.text.trim( template )&lt;br /&gt;
        template = ( template == &amp;quot;1&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if template then&lt;br /&gt;
        args = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        args = frame.args&lt;br /&gt;
    end&lt;br /&gt;
    return Text.listToText( args, frame.args.format )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.quote( frame )&lt;br /&gt;
    local slang = frame.args[2]&lt;br /&gt;
    if type( slang ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        slang = mw.text.trim( slang )&lt;br /&gt;
        if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
            slang = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Text.quote( frame.args[ 1 ] or &amp;quot;&amp;quot;,&lt;br /&gt;
                       slang,&lt;br /&gt;
                       tonumber( frame.args[3] ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.quoteUnquoted( frame )&lt;br /&gt;
    local slang = frame.args[2]&lt;br /&gt;
    if type( slang ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        slang = mw.text.trim( slang )&lt;br /&gt;
        if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
            slang = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Text.quoteUnquoted( frame.args[ 1 ] or &amp;quot;&amp;quot;,&lt;br /&gt;
                               slang,&lt;br /&gt;
                               tonumber( frame.args[3] ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.zip(frame)&lt;br /&gt;
    local lists = {}&lt;br /&gt;
    local seps = {}&lt;br /&gt;
    local defaultsep = frame.args[&amp;quot;sep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local innersep = frame.args[&amp;quot;isep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local outersep = frame.args[&amp;quot;osep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Parameter parsen&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        local knum = tonumber(k)&lt;br /&gt;
        if knum then lists[knum] = v else&lt;br /&gt;
            if string.sub(k, 1, 3) == &amp;quot;sep&amp;quot; then&lt;br /&gt;
                local sepnum = tonumber(string.sub(k, 4))&lt;br /&gt;
                if sepnum then seps[sepnum] = v end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- sofern keine expliziten Separatoren angegeben sind, den Standardseparator verwenden&lt;br /&gt;
    for i = 1, math.max(#seps, #lists) do&lt;br /&gt;
        if not seps[i] then seps[i] = defaultsep end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Listen splitten&lt;br /&gt;
    local maxListLen = 0&lt;br /&gt;
    for i = 1, #lists do&lt;br /&gt;
        lists[i] = mw.text.split(lists[i], seps[i])&lt;br /&gt;
        if #lists[i] &amp;gt; maxListLen then maxListLen = #lists[i] end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;&amp;quot;&lt;br /&gt;
    for i = 1, maxListLen do&lt;br /&gt;
        if i ~= 1 then result = result .. outersep end&lt;br /&gt;
        for j = 1, #lists do&lt;br /&gt;
            if j ~= 1 then result = result .. innersep end&lt;br /&gt;
            result = result .. (lists[j][i] or &amp;quot;&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.split(frame)&lt;br /&gt;
	local text = frame.args.text or frame.args[1] or &#039;&#039;&lt;br /&gt;
	local pattern = frame.args.pattern or frame.args[2] or &#039;&#039;&lt;br /&gt;
	local plain = yesNo(frame.args.plain or frame.args[3])&lt;br /&gt;
	local index = tonumber(frame.args.index) or tonumber(frame.args[4]) or 1&lt;br /&gt;
	local a = Text.split(text, pattern, plain)&lt;br /&gt;
	if index &amp;lt; 0 then index = #a + index + 1 end&lt;br /&gt;
	return a[index]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.failsafe()&lt;br /&gt;
    return Text.serial&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.Text = function ()&lt;br /&gt;
    return Text&lt;br /&gt;
end -- p.Text&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Icon_link&amp;diff=1561</id>
		<title>Modèle:Icon link</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Icon_link&amp;diff=1561"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SAFESUBST:&amp;lt;noinclude/&amp;gt;#invoke:icon|link}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_link_without_namespace&amp;diff=1559</id>
		<title>Modèle:Category link without namespace</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_link_without_namespace&amp;diff=1559"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:{{PAGENAME:{{{1}}}}}|{{{2|{{PAGENAME:{{{1}}}}}}}}]]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Icon&amp;diff=1557</id>
		<title>Modèle:Icon</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Icon&amp;diff=1557"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Icon|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Icon/data&amp;diff=1555</id>
		<title>Module:Icon/data</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Icon/data&amp;diff=1555"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module stores icon data for [[Module:Icon]].&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Icon data&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local data = {&lt;br /&gt;
	fa = {&lt;br /&gt;
		image = &amp;quot;Featured article star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	far = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	farc = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffa = {&lt;br /&gt;
		aliases = {&amp;quot;dfa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Featured article star - cross.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fac = {&lt;br /&gt;
		aliases = {&amp;quot;fan&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffac = {&lt;br /&gt;
		aliases = {&amp;quot;nofa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fl = {&lt;br /&gt;
		image = &amp;quot;Featured article star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	flrc = {&lt;br /&gt;
		aliases = {&amp;quot;flr&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffl = {&lt;br /&gt;
		aliases = {&amp;quot;dfl&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-featured-strike.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured list&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	flc = {&lt;br /&gt;
		aliases = {&amp;quot;fln&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fflc = {&lt;br /&gt;
		aliases = {&amp;quot;nofl&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured list candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	a = {&lt;br /&gt;
		image = &amp;quot;Symbol a class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;A-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	admin = {&lt;br /&gt;
		aliases = {&amp;quot;mop&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Wikipedia Administrator.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Administrator&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	dac = {&lt;br /&gt;
		aliases = {&amp;quot;daa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol unsupport A vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Demoted A-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	acc = {&lt;br /&gt;
		aliases = {&amp;quot;acn&amp;quot;, &amp;quot;aac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;A candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;A-Class article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	noac = {&lt;br /&gt;
		aliases = {&amp;quot;faac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol unsupport A vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Failed A-Class article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ga = {&lt;br /&gt;
		image = &amp;quot;Symbol support vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gar = {&lt;br /&gt;
		image = &amp;quot;GA Candidate Neutral vote(ChaosNil).svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article reassessment&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dga = {&lt;br /&gt;
		image = &amp;quot;Symbol unsupport vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Delisted good article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gan = {&lt;br /&gt;
		aliases = {&amp;quot;gac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;GA candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article nominee&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	ga2 = {&lt;br /&gt;
		image = &amp;quot;Symbol neutral vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article, 2nd opinion&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gah = {&lt;br /&gt;
		image = &amp;quot;Symbol wait.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article on hold&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	fgan = {&lt;br /&gt;
		aliases = {&amp;quot;noga&amp;quot;, &amp;quot;gaf&amp;quot;, &amp;quot;gf&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol oppose vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Failed good article nominee&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	fp = {&lt;br /&gt;
		image = &amp;quot;Cscr-featured.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpc = {&lt;br /&gt;
		aliases = {&amp;quot;fpn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured picture candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffp = {&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	vp = {&lt;br /&gt;
		image = &amp;quot;ENWP VP Logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	vpc = {&lt;br /&gt;
		image = &amp;quot;Valued pics 1.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued picture candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fs = {&lt;br /&gt;
		image = &amp;quot;Cscr-featured.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured sound&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffs = {&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured sound&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fsc = {&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured sound candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpo = {&lt;br /&gt;
		image = &amp;quot;Linecons big-star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Before the featured portal process ceased in 2017, this had been designated as a featured portal.&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpor = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured portal review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffpo = {&lt;br /&gt;
		image = &amp;quot;Featured article star - cross.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured portal&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpoc = {&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured portal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ft = {&lt;br /&gt;
		image = &amp;quot;Cscr-featuredtopic.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ftrc = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fft = {&lt;br /&gt;
		aliases = {&amp;quot;dft&amp;quot;},&lt;br /&gt;
		image = &amp;quot;DFT candidate_cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured topic&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ftc = {&lt;br /&gt;
		aliases = {&amp;quot;ftn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;FT candidate cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gt = {&lt;br /&gt;
		image = &amp;quot;Support cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gtrc = {&lt;br /&gt;
		image = &amp;quot;Symbol unsupport vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic removal candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gtc = {&lt;br /&gt;
		aliases = {&amp;quot;gtn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;GA candidate cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	bplus = {&lt;br /&gt;
		aliases = {&amp;quot;b+&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol bplus class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Bplus-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	b = {&lt;br /&gt;
		image = &amp;quot;Symbol b class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;B-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	br = {&lt;br /&gt;
		aliases = {&amp;quot;bcr&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Bclass-checklist.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;B-Class review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	c = {&lt;br /&gt;
		image = &amp;quot;Symbol c class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;C-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	start = {&lt;br /&gt;
		image = &amp;quot;Symbol start class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Start-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	stub = {&lt;br /&gt;
		image = &amp;quot;Symbol stub class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Stub-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	list = {&lt;br /&gt;
		aliases = {&amp;quot;comparison&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol list class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;List-Class article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	no = {&lt;br /&gt;
		image = &amp;quot;Crystal button cancel.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Unknown-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	book = {&lt;br /&gt;
		image = &amp;quot;Symbol book class2.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikipedia book&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	category = {&lt;br /&gt;
		aliases = {&amp;quot;cat&amp;quot;, &amp;quot;categ&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol category class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Category&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	disambiguation = {&lt;br /&gt;
		aliases = {&amp;quot;dab&amp;quot;, &amp;quot;disamb&amp;quot;, &amp;quot;disambig&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol dab class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Disambiguation page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	image = {&lt;br /&gt;
		aliases = {&amp;quot;file&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol file class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;File&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	needed = {&lt;br /&gt;
		image = &amp;quot;Symbol needed class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Needed article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	outline = {&lt;br /&gt;
		image = &amp;quot;Global thinking.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Outline&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	portal = {&lt;br /&gt;
		image = &amp;quot;Symbol portal class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Portal&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	project = {&lt;br /&gt;
		image = &amp;quot;Symbol project class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Project page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	redirect = {&lt;br /&gt;
		aliases = {&amp;quot;red&amp;quot;, &amp;quot;redir&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol redirect vote2.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Redirect&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	template = {&lt;br /&gt;
		aliases = {&amp;quot;temp&amp;quot;, &amp;quot;templ&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol template class pink.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Template&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	essay = {&lt;br /&gt;
		image = &amp;quot;Essay.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Essay&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	na = {&lt;br /&gt;
		image = &amp;quot;Symbol na class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Non-article page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	aa = {&lt;br /&gt;
		image = &amp;quot;Yes check.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Audited article of limited subject matter&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	da = {&lt;br /&gt;
		image = &amp;quot;Symbol oppose vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Demoted article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dyk = {&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Did You Know?&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dyk2 = {&lt;br /&gt;
		image = &amp;quot;DYK questionmark icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Did You Know?&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	pr = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps kedit.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Peer review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ppr = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps kedit.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Portal peer review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	q = {&lt;br /&gt;
		aliases = {&amp;quot;question&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Question&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	cleanup = {&lt;br /&gt;
		image = &amp;quot;Edit-clear.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Cleanup work&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	qi = {&lt;br /&gt;
		image = &amp;quot;Quality images logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Quality image on Wikimedia Commons&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	vi = {&lt;br /&gt;
		image = &amp;quot;Valued image seal.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued image on Wikimedia Commons&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	tfa = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Today&#039;s Featured Article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	tfl = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Today&#039;s Featured List&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	itn = {&lt;br /&gt;
		image = &amp;quot;Globe current.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;In The News&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	otd = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps date.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;On This Day&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikiproject = {&lt;br /&gt;
		image = &amp;quot;People icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;WikiProject&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	goce = {&lt;br /&gt;
		image = &amp;quot;Writing Magnifying.PNG&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Guild of Copy Editors&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikipedia = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikipedia page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	commons = {&lt;br /&gt;
		image = &amp;quot;Commons-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Commons page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	wikiquote = {&lt;br /&gt;
		image = &amp;quot;Wikiquote-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikiquote page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	wikiversity = {&lt;br /&gt;
		image = &amp;quot;Wikiversity logo 2017.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikiversity page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikibooks = {&lt;br /&gt;
		image = &amp;quot;Wikibooks-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikibooks page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikisource = {&lt;br /&gt;
		image = &amp;quot;Wikisource-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikisource page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wiktionary = {&lt;br /&gt;
		image = &amp;quot;Wiktionary-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wiktionary page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikinews = {&lt;br /&gt;
		image = &amp;quot;Wikinews-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikinews page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikispecies = {&lt;br /&gt;
		image = &amp;quot;Wikispecies-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikispecies page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikidata = {&lt;br /&gt;
		image = &amp;quot;Wikidata-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikidata page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	wikivoyage = {&lt;br /&gt;
		image = &amp;quot;Wikivoyage-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikivoyage page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	 mediawiki = {&lt;br /&gt;
		 image = &amp;quot;MediaWiki-2020-icon.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;MediaWiki&amp;quot;,&lt;br /&gt;
		 link = true,&lt;br /&gt;
	 },&lt;br /&gt;
	 phabricator = {&lt;br /&gt;
		 aliases = {&amp;quot;phab&amp;quot;},&lt;br /&gt;
		 image = &amp;quot;Favicon-Phabricator-WM.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;Phabricator&amp;quot;,&lt;br /&gt;
		 link = false,&lt;br /&gt;
	 },&lt;br /&gt;
	 wikitech = {&lt;br /&gt;
		 image = &amp;quot;Wikitech-2021-blue-icon.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;Wikitech&amp;quot;,&lt;br /&gt;
		 link = true,&lt;br /&gt;
	 },&lt;br /&gt;
	meta = {&lt;br /&gt;
		image = &amp;quot;Wikimedia Community Logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Meta-wiki page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	four = {&lt;br /&gt;
		aliases = {&amp;quot;4a&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Four Award.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Four Award&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	million = {&lt;br /&gt;
		image = &amp;quot;Million award logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Million Award&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	module = {&lt;br /&gt;
		image = &amp;quot;Lua-logo-nolabel.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Module&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	vital = {&lt;br /&gt;
		image = &amp;quot;Círculos_Concéntricos.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Vital article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	potd  = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Picture of the Day&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	draft = {&lt;br /&gt;
		image = &amp;quot;Symbol draft class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Draft-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	user = {&lt;br /&gt;
		image = &amp;quot;Symbol user class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;User-Class article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	info = {&lt;br /&gt;
		image = &amp;quot;Information icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Information&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	discussionnotificaion = {&lt;br /&gt;
		image = &amp;quot;Echo edit-user-talk icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Discussion&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	alert = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Black alert&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-imagewarning&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert image warning.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Alert&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-constructive&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert-constructive.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Green alert&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-blackred&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert destructive black-darkred.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Black, white, and red alert&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	barnstar2 = {&lt;br /&gt;
		image = &amp;quot;Original Barnstar Hires.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Original barnstar hires&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	barnstar = {&lt;br /&gt;
		image = &amp;quot;Original Barnstar.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Original barnstar&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	_DEFAULT = {&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End icon data&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Make aliases work the same as normal keys, and remove the &amp;quot;aliases&amp;quot; subtables.&lt;br /&gt;
local ret= {}&lt;br /&gt;
for code, iconData in pairs(data) do&lt;br /&gt;
	iconData.canonicalCode = code&lt;br /&gt;
	if iconData.aliases then&lt;br /&gt;
		for _, alias in ipairs(iconData.aliases) do&lt;br /&gt;
			ret[alias] = iconData&lt;br /&gt;
		end&lt;br /&gt;
		iconData.aliases = nil&lt;br /&gt;
	end&lt;br /&gt;
	ret[code] = iconData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ret&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Icon&amp;diff=1553</id>
		<title>Module:Icon</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Icon&amp;diff=1553"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements [[Template:Icon]].&lt;br /&gt;
&lt;br /&gt;
require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
local yesNo = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
local getArgs = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
local getPlain = nil&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Determine whether we&#039;re being called from a sandbox&lt;br /&gt;
local sandbox = mw.getCurrentFrame():getTitle():find(&#039;sandbox&#039;, 1, true) and &#039;/sandbox&#039; or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-- Implements [[Template:Icon]]&lt;br /&gt;
-- Returns the icon image corresponding to a string (like &#039;B&#039;)&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	local data_module = &#039;Module:Icon/data&#039;..sandbox&lt;br /&gt;
	data = data or mw.loadData(data_module)&lt;br /&gt;
	local code = args.class or args[1]&lt;br /&gt;
	local iconData&lt;br /&gt;
	if code then&lt;br /&gt;
		code = code:match(&#039;^%s*(.-)%s*$&#039;):lower() -- trim whitespace and put in lower case&lt;br /&gt;
		iconData = data[code]&lt;br /&gt;
	end&lt;br /&gt;
	if not iconData then&lt;br /&gt;
		iconData = data._DEFAULT&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[[File:%s%s%s|%s|class=noviewer|alt=%s]]&#039;,&lt;br /&gt;
		iconData.image,&lt;br /&gt;
		iconData.tooltip and &#039;|&#039; .. iconData.tooltip or &#039;&#039;,&lt;br /&gt;
		iconData.link == false and &#039;|link=&#039; or &#039;&#039;,&lt;br /&gt;
		args.size or &#039;16x16px&#039;,&lt;br /&gt;
		iconData.alt or &#039;&#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implements [[Template:Icon link]], a superset of [[Template:Icon]]&lt;br /&gt;
-- Returns an icon, plus a suitably formatted wikilink&lt;br /&gt;
function p._link(args, data)&lt;br /&gt;
	args.size = args.size or args.iconsize&lt;br /&gt;
	local icon = p._main(args, data)&lt;br /&gt;
	-- If no link given in args[2], default back to [[Template:Icon]]&lt;br /&gt;
	if not args[2] then&lt;br /&gt;
		return icon&lt;br /&gt;
	end&lt;br /&gt;
	-- Strip wiki markup out of link&lt;br /&gt;
	getPlain = getPlain or require(&amp;quot;Module:Text&amp;quot;).Text().getPlain&lt;br /&gt;
	local link = getPlain(args[2])&lt;br /&gt;
	local display = args[3] or args[2]&lt;br /&gt;
	-- italicize display string, if requested&lt;br /&gt;
	if yesNo(args.i) or yesNo(args.italic) or yesNo(args.italics) then&lt;br /&gt;
		display = &#039;&amp;lt;i&amp;gt;&#039;..display..&#039;&amp;lt;/i&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- if display is link, just use standard wlink&lt;br /&gt;
	if link == display then&lt;br /&gt;
		return &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;..icon..&#039; &amp;lt;/span&amp;gt;[[&#039;..link..&#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;..icon..&#039; &amp;lt;/span&amp;gt;[[&#039;..link..&#039;|&#039;..display..&#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame,{parentFirst=true})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
	local args = getArgs(frame,{parentFirst=true})&lt;br /&gt;
	return p._link(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;&#039;] = function (frame) return p._main(frame.args) end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Unsubst&amp;diff=1551</id>
		<title>Module:Unsubst</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Unsubst&amp;diff=1551"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local BODY_PARAM = &#039;$B&#039;&lt;br /&gt;
&lt;br /&gt;
local specialParams = {&lt;br /&gt;
	[&#039;$params&#039;] = &#039;parameter list&#039;,&lt;br /&gt;
	[&#039;$aliases&#039;] = &#039;parameter aliases&#039;,&lt;br /&gt;
	[&#039;$flags&#039;] = &#039;flags&#039;,&lt;br /&gt;
	[&#039;$B&#039;] = &#039;template content&#039;,&lt;br /&gt;
	[&#039;$template-name&#039;] = &#039;template invocation name override&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, body)&lt;br /&gt;
	-- If we are substing, this function returns a template invocation, and if&lt;br /&gt;
	-- not, it returns the template body. The template body can be specified in&lt;br /&gt;
	-- the body parameter, or in the template parameter defined in the&lt;br /&gt;
	-- BODY_PARAM variable. This function can be called from Lua or from&lt;br /&gt;
	-- #invoke.&lt;br /&gt;
&lt;br /&gt;
	-- Return the template body if we aren&#039;t substing.&lt;br /&gt;
	if not mw.isSubsting() then&lt;br /&gt;
		if body ~= nil then&lt;br /&gt;
			return body&lt;br /&gt;
		elseif frame.args[BODY_PARAM] ~= nil then&lt;br /&gt;
			return frame.args[BODY_PARAM]&lt;br /&gt;
		else&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;no template content specified (use parameter &#039;%s&#039; from #invoke)&amp;quot;,&lt;br /&gt;
				BODY_PARAM&lt;br /&gt;
			), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Sanity check for the frame object.&lt;br /&gt;
	if type(frame) ~= &#039;table&#039;&lt;br /&gt;
		or type(frame.getParent) ~= &#039;function&#039;&lt;br /&gt;
		or not frame:getParent()&lt;br /&gt;
	then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;quot;argument #1 to &#039;main&#039; must be a frame object with a parent &amp;quot; ..&lt;br /&gt;
			&amp;quot;frame available&amp;quot;,&lt;br /&gt;
			2&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the invocation name.&lt;br /&gt;
	local mTemplateInvocation = require(&#039;Module:Template invocation&#039;)&lt;br /&gt;
	local name&lt;br /&gt;
&lt;br /&gt;
	if frame.args[&#039;$template-name&#039;] and &#039;&#039; ~= frame.args[&#039;$template-name&#039;] then&lt;br /&gt;
		name = frame.args[&#039;$template-name&#039;]										-- override whatever the template name is with this name&lt;br /&gt;
	else&lt;br /&gt;
		name = mTemplateInvocation.name(frame:getParent():getTitle())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Combine passed args with passed defaults&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*override%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Trim parameters, if not specified otherwise&lt;br /&gt;
	if not string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*keep%-whitespace%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( args ) do args[k] = mw.ustring.match(v, &#039;^%s*(.*)%s*$&#039;) or &#039;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Pull information from parameter aliases&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	if frame.args[&#039;$aliases&#039;] then&lt;br /&gt;
		local list = mw.text.split( frame.args[&#039;$aliases&#039;], &#039;%s*,%s*&#039; )&lt;br /&gt;
		for k, v in ipairs( list ) do&lt;br /&gt;
			local tmp = mw.text.split( v, &#039;%s*&amp;gt;%s*&#039; )&lt;br /&gt;
			aliases[tonumber(mw.ustring.match(tmp[1], &#039;^[1-9][0-9]*$&#039;)) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], &#039;^[1-9][0-9]*$&#039;))) or tmp[2])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( aliases ) do&lt;br /&gt;
		if args[k] and ( not args[v] or args[v] == &#039;&#039; ) then&lt;br /&gt;
			args[v] = args[k]&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove empty parameters, if specified&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*remove%-empty%s*,&#039; ) then&lt;br /&gt;
		local tmp = 0&lt;br /&gt;
		for k, v in ipairs( args ) do&lt;br /&gt;
			if v ~= &#039;&#039; or ( args[k+1] and args[k+1] ~= &#039;&#039; ) or ( args[k+2] and args[k+2] ~= &#039;&#039; ) then&lt;br /&gt;
				tmp = k&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( args ) do&lt;br /&gt;
			if v == &#039;&#039; then&lt;br /&gt;
				if not (type(k) == &#039;number&#039; and k &amp;lt; tmp) then args[k] = nil end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Order parameters&lt;br /&gt;
	if frame.args[&#039;$params&#039;] then&lt;br /&gt;
		local params, tmp = mw.text.split( frame.args[&#039;$params&#039;], &#039;%s*,%s*&#039; ), {}&lt;br /&gt;
		for k, v in ipairs(params) do&lt;br /&gt;
			v = tonumber(mw.ustring.match(v, &#039;^[1-9][0-9]*$&#039;)) or v&lt;br /&gt;
			if args[v] then tmp[v], args[v] = args[v], nil end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end&lt;br /&gt;
		args = tmp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mTemplateInvocation.invocation(name, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;&#039;] = p.main -- For backwards compatibility&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Delink&amp;diff=1549</id>
		<title>Modèle:Delink</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Delink&amp;diff=1549"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:delink|delink}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Fix&amp;diff=1547</id>
		<title>Modèle:Fix</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Fix&amp;diff=1547"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{{subst|¬}}}&lt;br /&gt;
 |¬={{category handler&lt;br /&gt;
  |template=[[Category:Templates needing substitution checking]]&lt;br /&gt;
  |nocat={{{nocat|&amp;lt;noinclude&amp;gt;true&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |SUBST=[[Category:Pages with incorrectly substituted templates]]&lt;br /&gt;
}}{{Category handler&lt;br /&gt;
 |main={{Fix/category&lt;br /&gt;
  |cat-date={{{cat-date|}}} &lt;br /&gt;
  |cat={{{cat|}}} &lt;br /&gt;
  |cat-date2={{{cat-date2|}}} &lt;br /&gt;
  |cat2={{{cat2|}}} &lt;br /&gt;
  |cat-date3={{{cat-date3|}}} &lt;br /&gt;
  |cat3={{{cat3|}}} &lt;br /&gt;
  |date={{{date|}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |template={{#if:{{{name|}}}|{{#ifeq:{{{name}}}|{{ROOTPAGENAME}}||{{#if:{{{date|}}}||[[Category:Templates including undated clean-up tags]]}}}}}} &lt;br /&gt;
 |subpage=no&lt;br /&gt;
}}{{#if:{{{text|}}}&lt;br /&gt;
 |&amp;lt;sup class=&amp;quot;noprint Inline-Template {{{class|}}}&amp;quot; style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;amp;#91;&amp;lt;i&amp;gt;{{#if:{{{pre-text|}}}&lt;br /&gt;
  |{{{pre-text}}}&amp;amp;#32;&lt;br /&gt;
 }}[[{{{link|Wikipedia:Cleanup}}}|&amp;lt;span title=&amp;quot;{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}|&amp;amp;#32;({{{date}}})}}}}|pattern=&amp;quot; |replace=&amp;amp;quot; |plain=true}}&amp;quot;&amp;gt;{{{text|}}}&amp;lt;/span&amp;gt;]]{{#if:{{{post-text|}}}&lt;br /&gt;
  |&amp;amp;#32;{{{post-text}}}&lt;br /&gt;
 }}&amp;lt;/i&amp;gt;&amp;amp;#93;&amp;lt;/sup&amp;gt;|{{{special|}}}&lt;br /&gt;
}}{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using Template:Fix with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Fix]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| cat | cat-date | cat-date2 | cat-date3 | cat2 | cat3 | class | date | link | name | nocat | post-text | pre-text | special | subst | text | title }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add cats and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Delink&amp;diff=1545</id>
		<title>Module:Delink</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Delink&amp;diff=1545"/>
		<updated>2025-01-25T07:17:02Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module de-links most wikitext.&lt;br /&gt;
&lt;br /&gt;
require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs&lt;br /&gt;
&lt;br /&gt;
local function delinkReversePipeTrick(s)&lt;br /&gt;
	if s:match(&amp;quot;^%[%[|.*[|\n]&amp;quot;) then -- Check for newlines or multiple pipes.&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	return s:match(&amp;quot;%[%[|(.*)%]%]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function delinkPipeTrick(s)&lt;br /&gt;
	-- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].&lt;br /&gt;
	-- First, remove the text before the first colon, if any.&lt;br /&gt;
	if s:match(&amp;quot;:&amp;quot;) then&lt;br /&gt;
		s = s:match(&amp;quot;%[%[.-:(.*)|%]%]&amp;quot;)&lt;br /&gt;
	-- If there are no colons, grab all of the text apart from the square brackets and the pipe.&lt;br /&gt;
	else&lt;br /&gt;
		s = s:match(&amp;quot;%[%[(.*)|%]%]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Next up, brackets and commas.&lt;br /&gt;
	if s:match(&amp;quot;%(.-%)$&amp;quot;) then -- Brackets trump commas.&lt;br /&gt;
		s = s:match(&amp;quot;(.-) ?%(.-%)$&amp;quot;)&lt;br /&gt;
	elseif s:match(&amp;quot;,&amp;quot;) then -- If there are no brackets, display only the text before the first comma.&lt;br /&gt;
		s = s:match(&amp;quot;(.-),.*$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return wikilink target |wikilinks=target&lt;br /&gt;
local function getDelinkedTarget(s)&lt;br /&gt;
	local result = s&lt;br /&gt;
	-- Deal with the reverse pipe trick.&lt;br /&gt;
	if result:match(&amp;quot;%[%[|&amp;quot;) then&lt;br /&gt;
		return delinkReversePipeTrick(result)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	result = mw.uri.decode(result, &amp;quot;PATH&amp;quot;) -- decode percent-encoded entities. Leave underscores and plus signs.&lt;br /&gt;
	result = mw.text.decode(result, true) -- decode HTML entities.&lt;br /&gt;
	&lt;br /&gt;
	-- Check for bad titles. To do this we need to find the&lt;br /&gt;
	-- title area of the link, i.e. the part before any pipes.&lt;br /&gt;
	local target_area&lt;br /&gt;
	if result:match(&amp;quot;|&amp;quot;) then -- Find if we&#039;re dealing with a piped link.&lt;br /&gt;
		target_area = result:match(&amp;quot;^%[%[(.-)|.*%]%]&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		target_area = result:match(&amp;quot;^%[%[(.-)%]%]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for bad characters.&lt;br /&gt;
	if mw.ustring.match(target_area, &amp;quot;[%[%]&amp;lt;&amp;gt;{}%%%c\n]&amp;quot;) and mw.ustring.match(target_area, &amp;quot;[%[%]&amp;lt;&amp;gt;{}%%%c\n]&amp;quot;) ~= &amp;quot;?&amp;quot; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return target_area&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDelinkedLabel(s)&lt;br /&gt;
	local result = s&lt;br /&gt;
	-- Deal with the reverse pipe trick.&lt;br /&gt;
	if result:match(&amp;quot;%[%[|&amp;quot;) then&lt;br /&gt;
		return delinkReversePipeTrick(result)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	result = mw.uri.decode(result, &amp;quot;PATH&amp;quot;) -- decode percent-encoded entities. Leave underscores and plus signs.&lt;br /&gt;
	result = mw.text.decode(result, true) -- decode HTML entities.&lt;br /&gt;
&lt;br /&gt;
	-- Check for bad titles. To do this we need to find the&lt;br /&gt;
	-- title area of the link, i.e. the part before any pipes.&lt;br /&gt;
	local target_area&lt;br /&gt;
	if result:match(&amp;quot;|&amp;quot;) then -- Find if we&#039;re dealing with a piped link.&lt;br /&gt;
		target_area = result:match(&amp;quot;^%[%[(.-)|.*%]%]&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		target_area = result:match(&amp;quot;^%[%[(.-)%]%]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for bad characters.&lt;br /&gt;
	if mw.ustring.match(target_area, &amp;quot;[%[%]&amp;lt;&amp;gt;{}%%%c\n]&amp;quot;) and mw.ustring.match(target_area, &amp;quot;[%[%]&amp;lt;&amp;gt;{}%%%c\n]&amp;quot;) ~= &amp;quot;?&amp;quot; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for categories, interwikis, and files.&lt;br /&gt;
	local colon_prefix = result:match(&amp;quot;%[%[(.-):.*%]%]&amp;quot;) or &amp;quot;&amp;quot; -- Get the text before the first colon.&lt;br /&gt;
	local ns = mw.site.namespaces[colon_prefix] -- see if this is a known namespace&lt;br /&gt;
	if mw.language.isKnownLanguageTag(colon_prefix) or (ns and (ns.canonicalName == &amp;quot;File&amp;quot; or ns.canonicalName == &amp;quot;Category&amp;quot;)) then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove the colon if the link is using the [[Help:Colon trick]].&lt;br /&gt;
	if result:match(&amp;quot;%[%[:&amp;quot;) then&lt;br /&gt;
		result = &amp;quot;[[&amp;quot; .. result:match(&amp;quot;%[%[:(.*%]%])&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Deal with links using the [[Help:Pipe trick]].&lt;br /&gt;
	if mw.ustring.match(result, &amp;quot;^%[%[[^|]*|%]%]&amp;quot;) then&lt;br /&gt;
		return delinkPipeTrick(result)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Find the display area of the wikilink&lt;br /&gt;
	if result:match(&amp;quot;|&amp;quot;) then -- Find if we&#039;re dealing with a piped link.&lt;br /&gt;
		result = result:match(&amp;quot;^%[%[.-|(.+)%]%]&amp;quot;)&lt;br /&gt;
		-- Remove new lines from the display of multiline piped links,&lt;br /&gt;
		-- where the pipe is before the first new line.&lt;br /&gt;
		result = result:gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		result = result:match(&amp;quot;^%[%[(.-)%]%]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function delinkURL(s)&lt;br /&gt;
	-- Assume we have already delinked internal wikilinks, and that&lt;br /&gt;
	-- we have been passed some text between two square brackets [foo].&lt;br /&gt;
	&lt;br /&gt;
	-- If the text contains a line break it is not formatted as a URL, regardless of other content.&lt;br /&gt;
	if s:match(&amp;quot;\n&amp;quot;) then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check if the text has a valid URL prefix and at least one valid URL character.&lt;br /&gt;
	local valid_url_prefixes = {&amp;quot;//&amp;quot;, &amp;quot;http://&amp;quot;, &amp;quot;https://&amp;quot;, &amp;quot;ftp://&amp;quot;, &amp;quot;gopher://&amp;quot;, &amp;quot;mailto:&amp;quot;, &amp;quot;news:&amp;quot;, &amp;quot;irc://&amp;quot;} &lt;br /&gt;
	local url_prefix&lt;br /&gt;
	for _ ,v in ipairs(valid_url_prefixes) do&lt;br /&gt;
		if mw.ustring.match(s, &#039;^%[&#039; .. v ..&#039;[^&amp;quot;%s].*%]&#039; ) then&lt;br /&gt;
			url_prefix = v&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Get display text&lt;br /&gt;
	if not url_prefix then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&amp;quot;^%[&amp;quot; .. url_prefix .. &amp;quot;(.*)%]&amp;quot;) -- Grab all of the text after the URL prefix and before the final square bracket.&lt;br /&gt;
	s = s:match(&#039;^.-([&amp;quot;&amp;lt;&amp;gt; ].*)&#039;) or &amp;quot;&amp;quot; -- Grab all of the text after the first URL separator character (&amp;quot;&amp;lt;&amp;gt; ).&lt;br /&gt;
	s = mw.ustring.match(s, &amp;quot;^%s*(%S.*)$&amp;quot;) or &amp;quot;&amp;quot; -- If the separating character was a space, trim it off.&lt;br /&gt;
	&lt;br /&gt;
	local s_decoded = mw.text.decode(s, true)&lt;br /&gt;
	if mw.ustring.match(s_decoded, &amp;quot;%c&amp;quot;) then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return s_decoded&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function delinkLinkClass(text, pattern, delinkFunction)&lt;br /&gt;
	if type(text) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Attempt to de-link non-string input.&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if type(pattern) ~= &amp;quot;string&amp;quot; or mw.ustring.sub(pattern, 1, 1) ~= &amp;quot;^&amp;quot; then&lt;br /&gt;
		error(&#039;Invalid pattern detected. Patterns must begin with &amp;quot;^&amp;quot;.&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	-- Iterate over the text string, and replace any matched text. using the &lt;br /&gt;
	-- delink function. We need to iterate character by character rather &lt;br /&gt;
	-- than just use gsub, otherwise nested links aren&#039;t detected properly.&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	while text ~= &amp;quot;&amp;quot; do&lt;br /&gt;
		-- Replace text using one iteration of gsub.&lt;br /&gt;
		text = mw.ustring.gsub(text, pattern, delinkFunction, 1)&lt;br /&gt;
		-- Append the left-most character to the result string.&lt;br /&gt;
		result = result .. mw.ustring.sub(text, 1, 1)&lt;br /&gt;
		text = mw.ustring.sub(text, 2, -1)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._delink(args)&lt;br /&gt;
	local text = args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	if args.refs == &amp;quot;yes&amp;quot; then&lt;br /&gt;
		-- Remove any [[Help:Strip markers]] representing ref tags. In most situations &lt;br /&gt;
		-- this is not a good idea - only use it if you know what you are doing!&lt;br /&gt;
		text = mw.ustring.gsub(text, &amp;quot;UNIQ%w*%-ref%-%d*%-QINU&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if args.comments ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
		text = text:gsub(&amp;quot;&amp;lt;!%-%-.-%-%-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;) -- Remove html comments.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.wikilinks ~= &amp;quot;no&amp;quot; and args.wikilinks ~= &amp;quot;target&amp;quot; then&lt;br /&gt;
		-- De-link wikilinks and return the label portion of the wikilink.&lt;br /&gt;
		text = delinkLinkClass(text, &amp;quot;^%[%[.-%]%]&amp;quot;, getDelinkedLabel)&lt;br /&gt;
	elseif args.wikilinks == &amp;quot;target&amp;quot; then&lt;br /&gt;
		-- De-link wikilinks and return the target portions of the wikilink.&lt;br /&gt;
		text = delinkLinkClass(text, &amp;quot;^%[%[.-%]%]&amp;quot;, getDelinkedTarget)&lt;br /&gt;
	end&lt;br /&gt;
	if args.urls ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
		text = delinkLinkClass(text, &amp;quot;^%[.-%]&amp;quot;, delinkURL) -- De-link URLs.&lt;br /&gt;
	end&lt;br /&gt;
	if args.whitespace ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
		-- Replace single new lines with a single space, but leave double new lines&lt;br /&gt;
		-- and new lines only containing spaces or tabs before a second new line.&lt;br /&gt;
		text = mw.ustring.gsub(text, &amp;quot;([^\n \t][ \t]*)\n([ \t]*[^\n \t])&amp;quot;, &amp;quot;%1 %2&amp;quot;)&lt;br /&gt;
		text = text:gsub(&amp;quot;[ \t]+&amp;quot;, &amp;quot; &amp;quot;) -- Remove extra tabs and spaces.&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.delink(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	return p._delink(getArgs(frame, {wrappers = &#039;Template:Delink&#039;}))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Namespace_detect/config&amp;diff=1543</id>
		<title>Module:Namespace detect/config</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Namespace_detect/config&amp;diff=1543"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                    Namespace detect configuration data                     --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module stores configuration data for Module:Namespace detect. Here    --&lt;br /&gt;
-- you can localise the module to your wiki&#039;s language.                       --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To activate a configuration item, you need to uncomment it. This means     --&lt;br /&gt;
-- that you need to remove the text &amp;quot;-- &amp;quot; at the start of the line.           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names. Values added     --&lt;br /&gt;
-- here will work in addition to the default English parameter names.         --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &#039;parameter name&#039;                                                 --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = {&#039;parameter name 1&#039;, &#039;parameter name 2&#039;, &#039;parameter name 3&#039;}     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays content for the main namespace:&lt;br /&gt;
-- cfg.main = &#039;main&#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays in talk namespaces:&lt;br /&gt;
-- cfg.talk = &#039;talk&#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays content for &amp;quot;other&amp;quot; namespaces (namespaces for which&lt;br /&gt;
---- parameters have not been specified):&lt;br /&gt;
-- cfg.other = &#039;other&#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter makes talk pages behave as though they are the corresponding&lt;br /&gt;
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].&lt;br /&gt;
---- Edit that module to change the default values of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc.&lt;br /&gt;
-- cfg.subjectns = &#039;subjectns&#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a demonstration namespace:&lt;br /&gt;
-- cfg.demospace = &#039;demospace&#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.demopage = &#039;page&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Table configuration                              --&lt;br /&gt;
-- These configuration items allow customisation of the &amp;quot;table&amp;quot; function,     --&lt;br /&gt;
-- used to generate a table of possible parameters in the module              --&lt;br /&gt;
-- documentation.                                                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---- The header for the namespace column in the wikitable containing the list of&lt;br /&gt;
---- possible subject-space parameters.&lt;br /&gt;
-- cfg.wikitableNamespaceHeader = &#039;Namespace&#039;&lt;br /&gt;
&lt;br /&gt;
---- The header for the wikitable containing the list of possible subject-space&lt;br /&gt;
---- parameters.&lt;br /&gt;
-- cfg.wikitableAliasesHeader = &#039;Aliases&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                        End of configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Namespace_detect/data&amp;diff=1541</id>
		<title>Module:Namespace detect/data</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Namespace_detect/data&amp;diff=1541"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                          Namespace detect data                             --&lt;br /&gt;
-- This module holds data for [[Module:Namespace detect]] to be loaded per    --&lt;br /&gt;
-- page, rather than per #invoke, for performance reasons.                    --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = require(&#039;Module:Namespace detect/config&#039;)&lt;br /&gt;
&lt;br /&gt;
local function addKey(t, key, defaultKey)&lt;br /&gt;
	if key ~= defaultKey then&lt;br /&gt;
		t[#t + 1] = key&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get a table of parameters to query for each default parameter name.&lt;br /&gt;
-- This allows wikis to customise parameter names in the cfg table while&lt;br /&gt;
-- ensuring that default parameter names will always work. The cfg table&lt;br /&gt;
-- values can be added as a string, or as an array of strings.&lt;br /&gt;
&lt;br /&gt;
local defaultKeys = {&lt;br /&gt;
	&#039;main&#039;,&lt;br /&gt;
	&#039;talk&#039;,&lt;br /&gt;
	&#039;other&#039;,&lt;br /&gt;
	&#039;subjectns&#039;,&lt;br /&gt;
	&#039;demospace&#039;,&lt;br /&gt;
	&#039;demopage&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local argKeys = {}&lt;br /&gt;
for i, defaultKey in ipairs(defaultKeys) do&lt;br /&gt;
	argKeys[defaultKey] = {defaultKey}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for defaultKey, t in pairs(argKeys) do&lt;br /&gt;
	local cfgValue = cfg[defaultKey]&lt;br /&gt;
	local cfgValueType = type(cfgValue)&lt;br /&gt;
	if cfgValueType == &#039;string&#039; then&lt;br /&gt;
		addKey(t, cfgValue, defaultKey)&lt;br /&gt;
	elseif cfgValueType == &#039;table&#039; then&lt;br /&gt;
		for i, key in ipairs(cfgValue) do&lt;br /&gt;
			addKey(t, key, defaultKey)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	cfg[defaultKey] = nil -- Free the cfg value as we don&#039;t need it any more.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParamMappings()&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table of how parameter names map to namespace names. The keys&lt;br /&gt;
	-- are the actual namespace names, in lower case, and the values are the&lt;br /&gt;
	-- possible parameter names for that namespace, also in lower case. The&lt;br /&gt;
	-- table entries are structured like this:&lt;br /&gt;
	-- {&lt;br /&gt;
	--   [&#039;&#039;] = {&#039;main&#039;},&lt;br /&gt;
	--   [&#039;wikipedia&#039;] = {&#039;wikipedia&#039;, &#039;project&#039;, &#039;wp&#039;},&lt;br /&gt;
	--   ...&lt;br /&gt;
	-- }&lt;br /&gt;
	--]]&lt;br /&gt;
	local mappings = {}&lt;br /&gt;
	local mainNsName = mw.site.subjectNamespaces[0].name&lt;br /&gt;
	mainNsName = mw.ustring.lower(mainNsName)&lt;br /&gt;
	mappings[mainNsName] = mw.clone(argKeys.main)&lt;br /&gt;
	mappings[&#039;talk&#039;] = mw.clone(argKeys.talk)&lt;br /&gt;
	for nsid, ns in pairs(mw.site.subjectNamespaces) do&lt;br /&gt;
		if nsid ~= 0 then -- Exclude main namespace.&lt;br /&gt;
			local nsname = mw.ustring.lower(ns.name)&lt;br /&gt;
			local canonicalName = mw.ustring.lower(ns.canonicalName)&lt;br /&gt;
			mappings[nsname] = {nsname}&lt;br /&gt;
			if canonicalName ~= nsname then&lt;br /&gt;
				table.insert(mappings[nsname], canonicalName)&lt;br /&gt;
			end&lt;br /&gt;
			for _, alias in ipairs(ns.aliases) do&lt;br /&gt;
				table.insert(mappings[nsname], mw.ustring.lower(alias))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	argKeys = argKeys,&lt;br /&gt;
	cfg = cfg,&lt;br /&gt;
	mappings = getParamMappings()&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Category_handler/blacklist&amp;diff=1539</id>
		<title>Module:Category handler/blacklist</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Category_handler/blacklist&amp;diff=1539"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains the blacklist used by [[Module:Category handler]].&lt;br /&gt;
-- Pages that match Lua patterns in this list will not be categorised unless&lt;br /&gt;
-- categorisation is explicitly requested.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	&#039;^Main Page$&#039;, -- don&#039;t categorise the main page.&lt;br /&gt;
&lt;br /&gt;
	-- Don&#039;t categorise the following pages or their subpages.&lt;br /&gt;
	-- &amp;quot;%f[/\0]&amp;quot; matches if the next character is &amp;quot;/&amp;quot; or the end of the string.&lt;br /&gt;
	&#039;^Wikipedia:Cascade%-protected items%f[/\0]&#039;,&lt;br /&gt;
	&#039;^User:UBX%f[/\0]&#039;, -- The userbox &amp;quot;template&amp;quot; space.&lt;br /&gt;
	&#039;^User talk:UBX%f[/\0]&#039;,&lt;br /&gt;
&lt;br /&gt;
	-- Don&#039;t categorise subpages of these pages, but allow&lt;br /&gt;
	-- categorisation of the base page.&lt;br /&gt;
	&#039;^Wikipedia:Template index/.*$&#039;,&lt;br /&gt;
&lt;br /&gt;
	-- Don&#039;t categorise archives.&lt;br /&gt;
	&#039;/[aA]rchive&#039;,&lt;br /&gt;
	&amp;quot;^Wikipedia:Administrators&#039; noticeboard/IncidentArchive%d+$&amp;quot;,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Category_handler/shared&amp;diff=1537</id>
		<title>Module:Category handler/shared</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Category_handler/shared&amp;diff=1537"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains shared functions used by [[Module:Category handler]]&lt;br /&gt;
-- and its submodules.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.matchesBlacklist(page, blacklist)&lt;br /&gt;
	for i, pattern in ipairs(blacklist) do&lt;br /&gt;
		local match = mw.ustring.match(page, pattern)&lt;br /&gt;
		if match 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.getParamMappings(useLoadData)&lt;br /&gt;
	local dataPage = &#039;Module:Namespace detect/data&#039;&lt;br /&gt;
	if useLoadData then&lt;br /&gt;
		return mw.loadData(dataPage).mappings&lt;br /&gt;
	else&lt;br /&gt;
		return require(dataPage).mappings&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getNamespaceParameters(titleObj, mappings)&lt;br /&gt;
	-- We don&#039;t use title.nsText for the namespace name because it adds&lt;br /&gt;
	-- underscores.&lt;br /&gt;
	local mappingsKey&lt;br /&gt;
	if titleObj.isTalkPage then&lt;br /&gt;
		mappingsKey = &#039;talk&#039;&lt;br /&gt;
	else&lt;br /&gt;
		mappingsKey = mw.site.namespaces[titleObj.namespace].name&lt;br /&gt;
	end&lt;br /&gt;
	mappingsKey = mw.ustring.lower(mappingsKey)&lt;br /&gt;
	return mappings[mappingsKey] or {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Category_handler/config&amp;diff=1535</id>
		<title>Module:Category handler/config</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Category_handler/config&amp;diff=1535"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--            [[Module:Category handler]] configuration data                  --&lt;br /&gt;
--       Language-specific parameter names and values can be set here.        --&lt;br /&gt;
--       For blacklist config, see [[Module:Category handler/blacklist]].     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                       Start configuration data                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names.                  --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = &#039;parameter name&#039;,                                                    --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = {&#039;parameter name 1&#039;, &#039;parameter name 2&#039;, &#039;parameter name 3&#039;},        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.parameters = {&lt;br /&gt;
	&lt;br /&gt;
	-- The nocat and categories parameter suppress&lt;br /&gt;
	-- categorisation. They are used with Module:Yesno, and work as follows:&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.nocat:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is suppressed&lt;br /&gt;
	-- false                                    Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.categories:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- false                                    Categorisation is suppressed&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	nocat = &#039;nocat&#039;,&lt;br /&gt;
	categories = &#039;categories&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for the legacy &amp;quot;category2&amp;quot; parameter. This skips the&lt;br /&gt;
	-- blacklist if set to the cfg.category2Yes value, and suppresses&lt;br /&gt;
	-- categorisation if present but equal to anything other than&lt;br /&gt;
	-- cfg.category2Yes or cfg.category2Negative.&lt;br /&gt;
	category2 = &#039;category2&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- cfg.subpage is the parameter name to specify how to behave on subpages.&lt;br /&gt;
	subpage = &#039;subpage&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter for data to return in all namespaces.&lt;br /&gt;
	all = &#039;all&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for data to return if no data is specified for the&lt;br /&gt;
	-- namespace that is detected.&lt;br /&gt;
	other = &#039;other&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name used to specify a page other than the current page;&lt;br /&gt;
	-- used for testing and demonstration.&lt;br /&gt;
	demopage = &#039;page&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter values                              --&lt;br /&gt;
-- These are set values that can be used with certain parameters. Only one    --&lt;br /&gt;
-- value can be specified, like this:                                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &#039;value name&#039;                                                     --                                               --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.category2 parameter. Setting&lt;br /&gt;
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2&lt;br /&gt;
-- is present but equal to anything other than cfg.category2Yes or&lt;br /&gt;
-- cfg.category2Negative then it supresses cateogrisation.&lt;br /&gt;
cfg.category2Yes = &#039;yes&#039;&lt;br /&gt;
cfg.category2Negative = &#039;¬&#039;&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.subpage parameter.&lt;br /&gt;
-- cfg.subpageNo is the value to specify to not categorise on subpages;&lt;br /&gt;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.&lt;br /&gt;
cfg.subpageNo = &#039;no&#039;&lt;br /&gt;
cfg.subpageOnly = &#039;only&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Default namespaces                               --&lt;br /&gt;
-- This is a table of namespaces to categorise by default. The keys are the   --&lt;br /&gt;
-- namespace numbers.                                                         --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.defaultNamespaces = {&lt;br /&gt;
	[  0] = true, -- main&lt;br /&gt;
	[  6] = true, -- file&lt;br /&gt;
	[ 12] = true, -- help&lt;br /&gt;
	[ 14] = true, -- category&lt;br /&gt;
	[100] = true, -- portal&lt;br /&gt;
	[108] = true, -- book&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                                Wrappers                                    --&lt;br /&gt;
-- This is a wrapper template or a list of wrapper templates to be passed to  --&lt;br /&gt;
-- [[Module:Arguments]].                                                      --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.wrappers = &#039;Template:Category handler&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           End configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Category_handler/data&amp;diff=1533</id>
		<title>Module:Category handler/data</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Category_handler/data&amp;diff=1533"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module assembles data to be passed to [[Module:Category handler]] using&lt;br /&gt;
-- mw.loadData. This includes the configuration data and whether the current&lt;br /&gt;
-- page matches the title blacklist.&lt;br /&gt;
&lt;br /&gt;
local data = require(&#039;Module:Category handler/config&#039;)&lt;br /&gt;
local mShared = require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
local blacklist = require(&#039;Module:Category handler/blacklist&#039;)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(&lt;br /&gt;
	title.prefixedText,&lt;br /&gt;
	blacklist&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(&lt;br /&gt;
	title,&lt;br /&gt;
	mShared.getParamMappings()&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return data&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_handler&amp;diff=1531</id>
		<title>Modèle:Category handler</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_handler&amp;diff=1531"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Category handler|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, and interwikis to Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Category_handler&amp;diff=1529</id>
		<title>Module:Category handler</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Category_handler&amp;diff=1529"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--                              CATEGORY HANDLER                              --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--      This module implements the {{category handler}} template in Lua,      --&lt;br /&gt;
--      with a few improvements: all namespaces and all namespace aliases     --&lt;br /&gt;
--      are supported, and namespace names are detected automatically for     --&lt;br /&gt;
--      the local wiki. This module requires [[Module:Namespace detect]]      --&lt;br /&gt;
--      and [[Module:Yesno]] to be available on the local wiki. It can be     --&lt;br /&gt;
--      configured for different wikis by altering the values in              --&lt;br /&gt;
--      [[Module:Category handler/config]], and pages can be blacklisted      --&lt;br /&gt;
--      from categorisation by using [[Module:Category handler/blacklist]].   --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load things we don&#039;t always need&lt;br /&gt;
local mShared, mappings&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function trimWhitespace(s, removeBlanks)&lt;br /&gt;
	if type(s) ~= &#039;string&#039; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	if removeBlanks then&lt;br /&gt;
		if s ~= &#039;&#039; then&lt;br /&gt;
			return s&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- CategoryHandler class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local CategoryHandler = {}&lt;br /&gt;
CategoryHandler.__index = CategoryHandler&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler.new(data, args)&lt;br /&gt;
	local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)&lt;br /&gt;
	&lt;br /&gt;
	-- Set the title object&lt;br /&gt;
	do&lt;br /&gt;
		local pagename = obj:parameter(&#039;demopage&#039;)&lt;br /&gt;
		local success, titleObj&lt;br /&gt;
		if pagename then&lt;br /&gt;
			success, titleObj = pcall(mw.title.new, pagename)&lt;br /&gt;
		end&lt;br /&gt;
		if success and titleObj then&lt;br /&gt;
			obj.title = titleObj&lt;br /&gt;
			if titleObj == mw.title.getCurrentTitle() then&lt;br /&gt;
				obj._usesCurrentTitle = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			obj.title = mw.title.getCurrentTitle()&lt;br /&gt;
			obj._usesCurrentTitle = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set suppression parameter values&lt;br /&gt;
	for _, key in ipairs{&#039;nocat&#039;, &#039;categories&#039;} do&lt;br /&gt;
		local value = obj:parameter(key)&lt;br /&gt;
		value = trimWhitespace(value, true)&lt;br /&gt;
		obj[&#039;_&#039; .. key] = yesno(value)&lt;br /&gt;
	end&lt;br /&gt;
	do&lt;br /&gt;
		local subpage = obj:parameter(&#039;subpage&#039;)&lt;br /&gt;
		local category2 = obj:parameter(&#039;category2&#039;)&lt;br /&gt;
		if type(subpage) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(subpage)&lt;br /&gt;
		end&lt;br /&gt;
		if type(category2) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(category2)&lt;br /&gt;
		end&lt;br /&gt;
		obj._subpage = trimWhitespace(subpage, true)&lt;br /&gt;
		obj._category2 = trimWhitespace(category2) -- don&#039;t remove blank values&lt;br /&gt;
	end&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:parameter(key)&lt;br /&gt;
	local parameterNames = self._data.parameters[key]&lt;br /&gt;
	local pntype = type(parameterNames)&lt;br /&gt;
	if pntype == &#039;string&#039; or pntype == &#039;number&#039; then&lt;br /&gt;
		return self._args[parameterNames]&lt;br /&gt;
	elseif pntype == &#039;table&#039; then&lt;br /&gt;
		for _, name in ipairs(parameterNames) do&lt;br /&gt;
			local value = self._args[name]&lt;br /&gt;
			if value ~= nil then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;invalid config key &amp;quot;%s&amp;quot;&#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressedByArguments()&lt;br /&gt;
	return&lt;br /&gt;
		-- See if a category suppression argument has been set.&lt;br /&gt;
		self._nocat == true&lt;br /&gt;
		or self._categories == false&lt;br /&gt;
		or (&lt;br /&gt;
			self._category2&lt;br /&gt;
			and self._category2 ~= self._data.category2Yes&lt;br /&gt;
			and self._category2 ~= self._data.category2Negative&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		-- Check whether we are on a subpage, and see if categories are&lt;br /&gt;
		-- suppressed based on our subpage status.&lt;br /&gt;
		or self._subpage == self._data.subpageNo and self.title.isSubpage&lt;br /&gt;
		or self._subpage == self._data.subpageOnly and not self.title.isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:shouldSkipBlacklistCheck()&lt;br /&gt;
	-- Check whether the category suppression arguments indicate we&lt;br /&gt;
	-- should skip the blacklist check.&lt;br /&gt;
	return self._nocat == false&lt;br /&gt;
		or self._categories == true&lt;br /&gt;
		or self._category2 == self._data.category2Yes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:matchesBlacklist()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleMatchesBlacklist&lt;br /&gt;
	else&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		return mShared.matchesBlacklist(&lt;br /&gt;
			self.title.prefixedText,&lt;br /&gt;
			mw.loadData(&#039;Module:Category handler/blacklist&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressed()&lt;br /&gt;
	-- Find if categories are suppressed by either the arguments or by&lt;br /&gt;
	-- matching the blacklist.&lt;br /&gt;
	return self:isSuppressedByArguments()&lt;br /&gt;
		or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getNamespaceParameters()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleNamespaceParameters&lt;br /&gt;
	else&lt;br /&gt;
		if not mappings then&lt;br /&gt;
			mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
			mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
		end&lt;br /&gt;
		return mShared.getNamespaceParameters(&lt;br /&gt;
			self.title,&lt;br /&gt;
			mappings&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:namespaceParametersExist()&lt;br /&gt;
	-- Find whether any namespace parameters have been specified.&lt;br /&gt;
	-- We use the order &amp;quot;all&amp;quot; --&amp;gt; namespace params --&amp;gt; &amp;quot;other&amp;quot; as this is what&lt;br /&gt;
	-- the old template did.&lt;br /&gt;
	if self:parameter(&#039;all&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if not mappings then&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
	end&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			if self._args[param] then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if self:parameter(&#039;other&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getCategories()&lt;br /&gt;
	local params = self:getNamespaceParameters()&lt;br /&gt;
	local nsCategory&lt;br /&gt;
	for i, param in ipairs(params) do&lt;br /&gt;
		local value = self._args[param]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			nsCategory = value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nsCategory ~= nil or self:namespaceParametersExist() then&lt;br /&gt;
		-- Namespace parameters exist - advanced usage.&lt;br /&gt;
		if nsCategory == nil then&lt;br /&gt;
			nsCategory = self:parameter(&#039;other&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local ret = {self:parameter(&#039;all&#039;)}&lt;br /&gt;
		local numParam = tonumber(nsCategory)&lt;br /&gt;
		if numParam and numParam &amp;gt;= 1 and math.floor(numParam) == numParam then&lt;br /&gt;
			-- nsCategory is an integer&lt;br /&gt;
			ret[#ret + 1] = self._args[numParam]&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = nsCategory&lt;br /&gt;
		end&lt;br /&gt;
		if #ret &amp;lt; 1 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat(ret)&lt;br /&gt;
		end&lt;br /&gt;
	elseif self._data.defaultNamespaces[self.title.namespace] then&lt;br /&gt;
		-- Namespace parameters don&#039;t exist, simple usage.&lt;br /&gt;
		return self._args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- Used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		CategoryHandler = CategoryHandler&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local handler = CategoryHandler.new(data, args)&lt;br /&gt;
	if handler:isSuppressed() then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return handler:getCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = data.wrappers,&lt;br /&gt;
		valueFunc = function (k, v)&lt;br /&gt;
			v = trimWhitespace(v)&lt;br /&gt;
			if type(k) == &#039;number&#039; then&lt;br /&gt;
				if v ~= &#039;&#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				else&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args, data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_link_with_count&amp;diff=1527</id>
		<title>Modèle:Category link with count</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Category_link_with_count&amp;diff=1527"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{name|}}}|{{{name}}}|Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;]]&amp;amp;nbsp;({{PAGESINCATEGORY:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|{{{2|all}}}}})&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Clc&amp;diff=1525</id>
		<title>Modèle:Clc</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Clc&amp;diff=1525"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Category link with count]]&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_link_with_bold&amp;diff=1523</id>
		<title>Modèle:Template link with bold</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_link_with_bold&amp;diff=1523"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#Invoke:Template link general|main|bold=on}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|1=Template:Tlg/doc&lt;br /&gt;
|content = {{tlg/doc|tlb}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Tlb&amp;diff=1521</id>
		<title>Modèle:Tlb</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Tlb&amp;diff=1521"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Template link with bold]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:C&amp;diff=1519</id>
		<title>Modèle:C</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:C&amp;diff=1519"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Category link without namespace]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Notice&amp;diff=1517</id>
		<title>Modèle:Notice</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Notice&amp;diff=1517"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mbox&lt;br /&gt;
| name       = Notice&lt;br /&gt;
| demospace  = {{{demospace|}}}&lt;br /&gt;
| style      = {{#if:{{{style|}}} |{{{style}}} }}&lt;br /&gt;
| subst      = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| type       = notice&lt;br /&gt;
| image      = {{#if:{{{image|}}} |[[File:{{{image}}}|40px|Notice|alt={{{imagealt|}}}]]}}&lt;br /&gt;
| small      = {{{small|}}}&lt;br /&gt;
| smallimage = {{#if:{{{image|}}} |[[File:{{{image}}}|30px|Notice|alt={{{imagealt|}}}]]}}&lt;br /&gt;
| imageright = {{#if:{{{imageright|}}} |{{{imageright}}} |{{#if:{{{shortcut|{{{shortcut1|}}}}}} |{{Ombox/shortcut|{{{shortcut|{{{shortcut1|}}}}}}|{{{shortcut2|}}}|{{{shortcut3|}}}|{{{shortcut4|}}}|{{{shortcut5|}}}}}}} }}&lt;br /&gt;
| textstyle  = {{{textstyle|text-align: {{#if:{{{center|}}}|center|{{{align|left}}}}};}}}&lt;br /&gt;
| text       = {{#if:{{{header|{{{heading|{{{title|}}}}}}}}} |&amp;lt;div style=&amp;quot;{{{headstyle|text-align: {{#if:{{{center|}}}|center|left}};}}}&amp;quot;&amp;gt;&#039;&#039;&#039;{{{header|{{{heading|{{{title|}}}}}}}}}&#039;&#039;&#039;&amp;lt;/div&amp;gt;}}&amp;lt;!--&lt;br /&gt;
            --&amp;gt;{{{text|{{{content|{{{reason|{{{1}}}}}}}}}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_shortcut&amp;diff=1515</id>
		<title>Modèle:Template shortcut</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Mod%C3%A8le:Template_shortcut&amp;diff=1515"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Shortcut|main|template=yes}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/styles.css&amp;diff=1513</id>
		<title>Module:Citation/CS1/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/styles.css&amp;diff=1513"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Protection icon&lt;br /&gt;
the following line controls the page-protection icon in the upper right corner&lt;br /&gt;
it must remain within this comment&lt;br /&gt;
	{{sandbox other||{{pp-template}}}}&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Overrides&lt;br /&gt;
Some wikis do not override user agent default styles for HTML &amp;lt;cite&amp;gt; and &amp;lt;q&amp;gt;,&lt;br /&gt;
unlike en.wp. On en.wp, keep these the same as [[MediaWiki:Common.css]].&lt;br /&gt;
&lt;br /&gt;
The word-wrap and :target styles were moved here from Common.css.&lt;br /&gt;
On en.wp, keep these the same as [[Template:Citation/styles.css]].&lt;br /&gt;
*/&lt;br /&gt;
cite.citation {&lt;br /&gt;
	font-style: inherit; /* Remove italics for &amp;lt;cite&amp;gt; */&lt;br /&gt;
	/* Break long urls, etc., rather than overflowing box */&lt;br /&gt;
	word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.citation q {&lt;br /&gt;
	quotes: &#039;&amp;quot;&#039; &#039;&amp;quot;&#039; &amp;quot;&#039;&amp;quot; &amp;quot;&#039;&amp;quot;; /* Straight quote marks for &amp;lt;q&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Highlight linked elements (such as clicked references) in blue */&lt;br /&gt;
.citation:target {&lt;br /&gt;
	/* ignore the linter - all browsers of interest implement this */&lt;br /&gt;
	background-color: rgba(0, 127, 255, 0.133);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ID and URL access&lt;br /&gt;
Both core and Common.css have selector .mw-parser-output a[href$=&amp;quot;.pdf&amp;quot;].external&lt;br /&gt;
for PDF pages. All TemplateStyles pages are hoisted to .mw-parser-output. We need&lt;br /&gt;
to have specificity equal to a[href$=&amp;quot;.pdf&amp;quot;].external for locks to override PDF icon.&lt;br /&gt;
That&#039;s essentially 2 classes and 1 element.&lt;br /&gt;
&lt;br /&gt;
the .id-lock-... selectors are for use by non-citation templates like&lt;br /&gt;
{{Catalog lookup link}}&lt;br /&gt;
&lt;br /&gt;
bg-size `contain` in Minerva and Timeless is too large, so we set a size for them&lt;br /&gt;
and then exclude them later&lt;br /&gt;
*/&lt;br /&gt;
.id-lock-free.id-lock-free a {&lt;br /&gt;
	background: url(//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg)&lt;br /&gt;
		right 0.1em center/9px no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.id-lock-limited.id-lock-limited a,&lt;br /&gt;
.id-lock-registration.id-lock-registration a {&lt;br /&gt;
	background: url(//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg)&lt;br /&gt;
		right 0.1em center/9px no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.id-lock-subscription.id-lock-subscription a {&lt;br /&gt;
	background: url(//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg)&lt;br /&gt;
		right 0.1em center/9px no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Wikisource&lt;br /&gt;
Wikisource icon when |chapter= or |title= is wikilinked to Wikisource&lt;br /&gt;
as in cite wikisource&lt;br /&gt;
*/&lt;br /&gt;
.cs1-ws-icon a {&lt;br /&gt;
	background: url(//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg)&lt;br /&gt;
		right 0.1em center/12px no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body:not(.skin-timeless):not(.skin-minerva) .id-lock-free a,&lt;br /&gt;
body:not(.skin-timeless):not(.skin-minerva) .id-lock-limited a,&lt;br /&gt;
body:not(.skin-timeless):not(.skin-minerva) .id-lock-registration a,&lt;br /&gt;
body:not(.skin-timeless):not(.skin-minerva) .id-lock-subscription a,&lt;br /&gt;
body:not(.skin-timeless):not(.skin-minerva) .cs1-ws-icon a {&lt;br /&gt;
	background-size: contain;&lt;br /&gt;
	/* Common.css has a padding set for PDF URLs. bg-contain expands to the&lt;br /&gt;
	 * size of the padding which makes the icons very large. we &amp;quot;reset&amp;quot; the&lt;br /&gt;
	 * padding here. 1em picked out of a hat based on console having a similar&lt;br /&gt;
	 * rule from elsewhere&lt;br /&gt;
	 */&lt;br /&gt;
	padding: 0 1em 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Errors and maintenance */&lt;br /&gt;
.cs1-code {&lt;br /&gt;
	/* &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; style override: mediawiki&#039;s css definition is specified here:&lt;br /&gt;
	https://git.wikimedia.org/blob/mediawiki%2Fcore.git/&lt;br /&gt;
		69cd73811f7aadd093050dbf20ed70ef0b42a713/skins%2Fcommon%2FcommonElements.css#L199&lt;br /&gt;
	*/&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	background: inherit;&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cs1-hidden-error {&lt;br /&gt;
	display: none;&lt;br /&gt;
	color: var(--color-error, #d33);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cs1-visible-error {&lt;br /&gt;
	color: var(--color-error, #d33);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cs1-maint {&lt;br /&gt;
	display: none;&lt;br /&gt;
	color: #085;&lt;br /&gt;
	margin-left: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* kerning */&lt;br /&gt;
.cs1-kern-left {&lt;br /&gt;
	padding-left: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cs1-kern-right {&lt;br /&gt;
	padding-right: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* selflinks – avoid bold font style when cs1|2 template links to the current page */&lt;br /&gt;
.citation .mw-selflink {&lt;br /&gt;
	font-weight: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen {&lt;br /&gt;
	/* Small text size&lt;br /&gt;
	Set small text size in one place. 0.95 (here) * 0.9 (from references list) is&lt;br /&gt;
	~0.85, which is the lower bound for size for accessibility. Old styling for this&lt;br /&gt;
	was just 0.85. We could write the rule so that when this template is inside&lt;br /&gt;
	references/reflist, only then does it multiply by 0.95; else multiply by 0.85 */&lt;br /&gt;
	.cs1-format {&lt;br /&gt;
		font-size: 95%;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	html.skin-theme-clientpref-night .cs1-maint {&lt;br /&gt;
		color: #18911f;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (prefers-color-scheme: dark) {&lt;br /&gt;
	html.skin-theme-clientpref-os .cs1-maint {&lt;br /&gt;
		color: #18911f;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/COinS&amp;diff=1511</id>
		<title>Module:Citation/CS1/COinS</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/COinS&amp;diff=1511"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local has_accept_as_written, is_set, in_array, remove_wiki_link, strip_apostrophe_markup;	-- functions in Module:Citation/CS1/Utilities&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of configuration tables that are defined in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ C O I N S _ T I T L E &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)&lt;br /&gt;
&lt;br /&gt;
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn&#039;t corrupted with strings&lt;br /&gt;
of %27%27...&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_coins_title (title, script)&lt;br /&gt;
	title = has_accept_as_written (title);&lt;br /&gt;
	if is_set (title) then&lt;br /&gt;
		title = strip_apostrophe_markup (title);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		title = &#039;&#039;;																-- if not set, make sure title is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (script) then&lt;br /&gt;
		script = script:gsub (&#039;^%l%l%s*:%s*&#039;, &#039;&#039;);								-- remove language prefix if present (script value may now be empty string)&lt;br /&gt;
		script = strip_apostrophe_markup (script);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		script = &#039;&#039;;															-- if not set, make sure script is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (title) and is_set (script) then&lt;br /&gt;
		script = &#039; &#039; .. script;													-- add a space before we concatenate&lt;br /&gt;
	end&lt;br /&gt;
	return title .. script;														-- return the concatenation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E S C A P E _ L U A _ M A G I C _ C H A R S &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns a string where all of Lua&#039;s magic characters have been escaped.  This is important because functions like&lt;br /&gt;
string.gsub() treat their pattern and replace strings as patterns, not literal strings.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function escape_lua_magic_chars (argument)&lt;br /&gt;
	argument = argument:gsub(&amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;);										-- replace % with %%&lt;br /&gt;
	argument = argument:gsub(&amp;quot;([%^%$%(%)%.%[%]%*%+%-%?])&amp;quot;, &amp;quot;%%%1&amp;quot;);				-- replace all other Lua magic pattern characters&lt;br /&gt;
	return argument;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ C O I N S _ P A G E S &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_coins_pages (pages)&lt;br /&gt;
	local pattern;&lt;br /&gt;
	if not is_set (pages) then return pages; end								-- if no page numbers then we&#039;re done&lt;br /&gt;
	&lt;br /&gt;
	while true do&lt;br /&gt;
		pattern = pages:match(&amp;quot;%[(%w*:?//[^ ]+%s+)[%w%d].*%]&amp;quot;);					-- pattern is the opening bracket, the URL and following space(s): &amp;quot;[url &amp;quot;&lt;br /&gt;
		if nil == pattern then break; end										-- no more URLs&lt;br /&gt;
		pattern = escape_lua_magic_chars (pattern);								-- pattern is not a literal string; escape Lua&#039;s magic pattern characters&lt;br /&gt;
		pages = pages:gsub(pattern, &amp;quot;&amp;quot;);										-- remove as many instances of pattern as possible&lt;br /&gt;
	end&lt;br /&gt;
	pages = pages:gsub(&amp;quot;[%[%]]&amp;quot;, &amp;quot;&amp;quot;);											-- remove the brackets&lt;br /&gt;
	pages = pages:gsub(&amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );												-- replace endashes with hyphens&lt;br /&gt;
	pages = pages:gsub(&amp;quot;&amp;amp;%w+;&amp;quot;, &amp;quot;-&amp;quot; );											-- and replace HTML entities (&amp;amp;ndash; etc.) with hyphens; do we need to replace numerical entities like &amp;amp;#32; and the like?&lt;br /&gt;
	return pages;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; C O I N S _ R E P L A C E _ M A T H _ S T R I P M A R K E R &amp;gt;------------------&lt;br /&gt;
&lt;br /&gt;
There are three options for math markup rendering that depend on the editor&#039;s math preference settings.  These&lt;br /&gt;
settings are at [[Special:Preferences#mw-prefsection-rendering]] and are&lt;br /&gt;
	PNG images&lt;br /&gt;
	TeX source&lt;br /&gt;
	MathML with SVG or PNG fallback&lt;br /&gt;
&lt;br /&gt;
All three are heavy with HTML and CSS which doesn&#039;t belong in the metadata.&lt;br /&gt;
&lt;br /&gt;
Without this function, the metadata saved in the raw wikitext contained the rendering determined by the settings&lt;br /&gt;
of the last editor to save the page.&lt;br /&gt;
&lt;br /&gt;
This function gets the rendered form of an equation according to the editor&#039;s preference before the page is saved.  It&lt;br /&gt;
then searches the rendering for the text equivalent of the rendered equation and replaces the rendering with that so&lt;br /&gt;
that the page is saved without extraneous HTML/CSS markup and with a reasonably readable text form of the equation.&lt;br /&gt;
&lt;br /&gt;
When a replacement is made, this function returns true and the value with replacement; otherwise false and the initial&lt;br /&gt;
value.  To replace multipe equations it is necessary to call this function from within a loop.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function coins_replace_math_stripmarker (value)&lt;br /&gt;
	local stripmarker = cfg.stripmarkers[&#039;math&#039;];&lt;br /&gt;
	local rendering = value:match (stripmarker);								-- is there a math stripmarker&lt;br /&gt;
&lt;br /&gt;
	if not rendering then														-- when value doesn&#039;t have a math stripmarker, abandon this test&lt;br /&gt;
		return false, value;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	rendering = mw.text.unstripNoWiki (rendering);								-- convert stripmarker into rendered value (or nil? &#039;&#039;? when math render error)&lt;br /&gt;
	&lt;br /&gt;
	if rendering:match (&#039;alt=&amp;quot;[^&amp;quot;]+&amp;quot;&#039;) then										-- if PNG math option&lt;br /&gt;
		rendering = rendering:match (&#039;alt=&amp;quot;([^&amp;quot;]+)&amp;quot;&#039;);							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&#039;$%s+.+%s+%$&#039;) then									-- if TeX math option; $ is legit character that is escapes as \$&lt;br /&gt;
		rendering = rendering:match (&#039;$%s+(.+)%s+%$&#039;)							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;.+&amp;lt;/annotation&amp;gt;&#039;) then			-- if MathML math option&lt;br /&gt;
		rendering = rendering:match (&#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;(.+)&amp;lt;/annotation&amp;gt;&#039;)		-- extract just the math text&lt;br /&gt;
	else&lt;br /&gt;
		return false, value;													-- had math stripmarker but not one of the three defined forms&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, value:gsub (stripmarker, rendering, 1);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S _ C L E A N U P &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain HTML entities.&lt;br /&gt;
&lt;br /&gt;
2015-12-10: there is a bug in mw.text.unstripNoWiki ().  It replaces math stripmarkers with the appropriate content&lt;br /&gt;
when it shouldn&#039;t.  See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29&lt;br /&gt;
&lt;br /&gt;
TODO: move the replacement patterns and replacement values into a table in /Configuration similar to the invisible&lt;br /&gt;
characters table?&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function coins_cleanup (value)&lt;br /&gt;
	local replaced = true;														-- default state to get the do loop running&lt;br /&gt;
&lt;br /&gt;
	while replaced do															-- loop until all math stripmarkers replaced&lt;br /&gt;
		replaced, value = coins_replace_math_stripmarker (value);				-- replace math stripmarker with text representation of the equation&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	value = value:gsub (cfg.stripmarkers[&#039;math&#039;], &amp;quot;MATH RENDER ERROR&amp;quot;);			-- one or more couldn&#039;t be replaced; insert vague error message&lt;br /&gt;
	&lt;br /&gt;
	value = mw.text.unstripNoWiki (value);										-- replace nowiki stripmarkers with their content&lt;br /&gt;
	value = value:gsub (&#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot; style=&amp;quot;padding%-left:0%.1em;&amp;quot;&amp;gt;&amp;amp;#39;(s?)&amp;lt;/span&amp;gt;&#039;, &amp;quot;&#039;%1&amp;quot;);	-- replace {{&#039;}} or {{&#039;s}} with simple apostrophe or apostrophe-s&lt;br /&gt;
	value = value:gsub (&#039;&amp;amp;nbsp;&#039;, &#039; &#039;);											-- replace &amp;amp;nbsp; entity with plain space&lt;br /&gt;
	value = value:gsub (&#039;\226\128\138&#039;, &#039; &#039;);									-- replace hair space with plain space&lt;br /&gt;
	if not mw.ustring.find (value, cfg.indic_script) then						-- don&#039;t remove zero-width joiner characters from indic script&lt;br /&gt;
		value = value:gsub (&#039;&amp;amp;zwj;&#039;, &#039;&#039;);										-- remove &amp;amp;zwj; entities&lt;br /&gt;
		value = mw.ustring.gsub (value, &#039;[\226\128\141\226\128\139\194\173]&#039;, &#039;&#039;);	-- remove zero-width joiner, zero-width space, soft hyphen&lt;br /&gt;
	end&lt;br /&gt;
	value = value:gsub (&#039;[\009\010\013 ]+&#039;, &#039; &#039;);								-- replace horizontal tab, line feed, carriage return with plain space&lt;br /&gt;
	return value;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) allows automated tools to parse the citation information.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function COinS(data, class)&lt;br /&gt;
	if &#039;table&#039; ~= type(data) or nil == next(data) then&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (data) do													-- spin through all of the metadata parameter values&lt;br /&gt;
		if &#039;ID_list&#039; ~= k and &#039;Authors&#039; ~= k then								-- except the ID_list and Author tables (author nowiki stripmarker done when Author table processed)&lt;br /&gt;
			data[k] = coins_cleanup (v);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ctx_ver = &amp;quot;Z39.88-2004&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	-- treat table strictly as an array with only set values.&lt;br /&gt;
	local OCinSoutput = setmetatable( {}, {&lt;br /&gt;
		__newindex = function(self, key, value)&lt;br /&gt;
			if is_set(value) then&lt;br /&gt;
				rawset( self, #self+1, table.concat{ key, &#039;=&#039;, mw.uri.encode( remove_wiki_link( value ) ) } );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	if in_array (class, {&#039;arxiv&#039;, &#039;biorxiv&#039;, &#039;citeseerx&#039;, &#039;medrxiv&#039;, &#039;ssrn&#039;, &#039;journal&#039;, &#039;news&#039;, &#039;magazine&#039;}) or&lt;br /&gt;
		(in_array (class, {&#039;conference&#039;, &#039;interview&#039;, &#039;map&#039;, &#039;press release&#039;, &#039;web&#039;}) and is_set(data.Periodical)) or&lt;br /&gt;
		(&#039;citation&#039; == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then&lt;br /&gt;
			OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:journal&amp;quot;;			-- journal metadata identifier&lt;br /&gt;
			if in_array (class, {&#039;arxiv&#039;, &#039;biorxiv&#039;, &#039;citeseerx&#039;, &#039;medrxiv&#039;, &#039;ssrn&#039;}) then	-- set genre according to the type of citation template we are rendering&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;preprint&amp;quot;;							-- cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, cite ssrn&lt;br /&gt;
			elseif &#039;conference&#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;						-- cite conference (when Periodical set)&lt;br /&gt;
			elseif &#039;web&#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;							-- cite web (when Periodical set)&lt;br /&gt;
			else&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;article&amp;quot;;							-- journal and other &#039;periodical&#039; articles&lt;br /&gt;
			end&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.jtitle&amp;quot;] = data.Periodical;						-- journal only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;								-- &#039;periodical&#039; article titles&lt;br /&gt;
&lt;br /&gt;
																				-- these used only for periodicals&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.ssn&amp;quot;] = data.Season;								-- keywords: winter, spring, summer, fall&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.quarter&amp;quot;] = data.Quarter;							-- single digits 1-&amp;gt;first quarter, etc.&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.chron&amp;quot;] = data.Chron;								-- free-form date components&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.volume&amp;quot;] = data.Volume;							-- does not apply to books&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.issue&amp;quot;] = data.Issue;&lt;br /&gt;
			OCinSoutput[&#039;rft.artnum&#039;] = data.ArticleNumber;						-- {{cite journal}} only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;								-- also used in book metadata&lt;br /&gt;
&lt;br /&gt;
	elseif &#039;thesis&#039; ~= class then												-- all others except cite thesis are treated as &#039;book&#039; metadata; genre distinguishes&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;					-- book metadata identifier&lt;br /&gt;
		if &#039;report&#039; == class or &#039;techreport&#039; == class then						-- cite report and cite techreport&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;report&amp;quot;;&lt;br /&gt;
		elseif &#039;conference&#039; == class then										-- cite conference when Periodical not set&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;							-- conference paper as chapter in proceedings (book)&lt;br /&gt;
		elseif in_array (class, {&#039;book&#039;, &#039;citation&#039;, &#039;encyclopaedia&#039;, &#039;interview&#039;, &#039;map&#039;}) then&lt;br /&gt;
			if is_set (data.Chapter) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;bookitem&amp;quot;;&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;						-- book chapter, encyclopedia article, interview in a book, or map title&lt;br /&gt;
			else&lt;br /&gt;
				if &#039;map&#039; == class or &#039;interview&#039; == class then&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &#039;unknown&#039;;						-- standalone map or interview&lt;br /&gt;
				else&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &#039;book&#039;;							-- book and encyclopedia&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else	-- {&#039;audio-visual&#039;, &#039;AV-media-notes&#039;, &#039;DVD-notes&#039;, &#039;episode&#039;, &#039;interview&#039;, &#039;mailinglist&#039;, &#039;map&#039;, &#039;newsgroup&#039;, &#039;podcast&#039;, &#039;press release&#039;, &#039;serial&#039;, &#039;sign&#039;, &#039;speech&#039;, &#039;web&#039;}&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Title;									-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.place&amp;quot;] = data.PublicationPlace;						-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.series&amp;quot;] = data.Series;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;									-- book, journal&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.edition&amp;quot;] = data.Edition;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pub&amp;quot;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
		&lt;br /&gt;
	else																		-- cite thesis&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:dissertation&amp;quot;;			-- dissertation metadata identifier&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.title&amp;quot;] = data.Title;									-- dissertation (also patent but that is not yet supported)&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.degree&amp;quot;] = data.Degree;								-- dissertation only&lt;br /&gt;
		OCinSoutput[&#039;rft.inst&#039;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
	end&lt;br /&gt;
	-- NB. Not currently supported are &amp;quot;info:ofi/fmt:kev:mtx:patent&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:dc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:sch_svc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:ctx&amp;quot;&lt;br /&gt;
																				-- and now common parameters (as much as possible)&lt;br /&gt;
	OCinSoutput[&amp;quot;rft.date&amp;quot;] = data.Date;										-- book, journal, dissertation&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs( data.ID_list ) do										-- what to do about these? For now assume that they are common to all?&lt;br /&gt;
		if k == &#039;ISBN&#039; then v = v:gsub( &amp;quot;[^-0-9X]&amp;quot;, &amp;quot;&amp;quot; ); end&lt;br /&gt;
		local id = cfg.id_handlers[k].COinS;&lt;br /&gt;
		if string.sub( id or &amp;quot;&amp;quot;, 1, 4 ) == &#039;info&#039; then							-- for ids that are in the info:registry&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ id, &amp;quot;/&amp;quot;, v };&lt;br /&gt;
		elseif string.sub (id or &amp;quot;&amp;quot;, 1, 3 ) == &#039;rft&#039; then						-- for isbn, issn, eissn, etc. that have defined COinS keywords&lt;br /&gt;
			OCinSoutput[ id ] = v;&lt;br /&gt;
		elseif &#039;url&#039; == id then													-- for urls that are assembled in ~/Identifiers; |asin= and |ol=&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat ({data.ID_list[k], &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label});&lt;br /&gt;
		elseif id then															-- when cfg.id_handlers[k].COinS is not nil so urls created here&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ cfg.id_handlers[k].prefix, v, cfg.id_handlers[k].suffix or &#039;&#039;, &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label };	-- others; provide a URL and indicate identifier name as #fragment (human-readable, but transparent to browsers)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local last, first;&lt;br /&gt;
	for k, v in ipairs( data.Authors ) do&lt;br /&gt;
		last, first = coins_cleanup (v.last), coins_cleanup (v.first or &#039;&#039;);	-- replace any nowiki stripmarkers, non-printing or invisible characters&lt;br /&gt;
		if k == 1 then															-- for the first author name only&lt;br /&gt;
			if is_set(last) and is_set(first) then								-- set these COinS values if |first= and |last= specify the first author name&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aulast&amp;quot;] = last;								-- book, journal, dissertation&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aufirst&amp;quot;] = first;								-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then &lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation -- otherwise use this form for the first name&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- for all other authors&lt;br /&gt;
			if is_set(last) and is_set(first) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = table.concat{ last, &amp;quot;, &amp;quot;, first };		-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation&lt;br /&gt;
			end&lt;br /&gt;
			-- TODO: At present we do not report &amp;quot;et al.&amp;quot;. Add anything special if this condition applies?&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	OCinSoutput.rft_id = data.URL;&lt;br /&gt;
	OCinSoutput.rfr_id = table.concat{ &amp;quot;info:sid/&amp;quot;, mw.site.server:match( &amp;quot;[^/]*$&amp;quot; ), &amp;quot;:&amp;quot;, data.RawPage };&lt;br /&gt;
&lt;br /&gt;
	-- TODO: Add optional extra info:&lt;br /&gt;
	-- rfr_dat=#REVISION&amp;lt;version&amp;gt; (referrer private data)&lt;br /&gt;
	-- ctx_id=&amp;lt;data.RawPage&amp;gt;#&amp;lt;ref&amp;gt; (identifier for the context object)&lt;br /&gt;
	-- ctx_tim=&amp;lt;ts&amp;gt; (timestamp in format yyyy-mm-ddThh:mm:ssTZD or yyyy-mm-dd)&lt;br /&gt;
	-- ctx_enc=info:ofi/enc:UTF-8 (character encoding)&lt;br /&gt;
	&lt;br /&gt;
	OCinSoutput = setmetatable( OCinSoutput, nil );&lt;br /&gt;
&lt;br /&gt;
	-- sort with version string always first, and combine.&lt;br /&gt;
	-- table.sort( OCinSoutput );&lt;br /&gt;
	table.insert( OCinSoutput, 1, &amp;quot;ctx_ver=&amp;quot; .. ctx_ver ); -- such as &amp;quot;Z39.88-2004&amp;quot;&lt;br /&gt;
	return table.concat(OCinSoutput, &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
&lt;br /&gt;
	has_accept_as_written = utilities_page_ptr.has_accept_as_written;			-- import functions from selected Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	remove_wiki_link = utilities_page_ptr.remove_wiki_link;&lt;br /&gt;
	strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	make_coins_title = make_coins_title,&lt;br /&gt;
	get_coins_pages = get_coins_pages,&lt;br /&gt;
	COinS = COinS,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=1509</id>
		<title>Module:Citation/CS1/Identifiers</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=1509"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local has_accept_as_written, is_set, in_array, set_message, select_one,			-- functions in Module:Citation/CS1/Utilities&lt;br /&gt;
		substitute, make_wikilink;&lt;br /&gt;
&lt;br /&gt;
local z;																		-- table of tables defined in Module:Citation/CS1/Utilities&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of configuration tables that are defined in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A G E   S C O P E   V A R I A B L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
declare variables here that have page-wide scope that are not brought in from other modules; that are created here and used here&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local auto_link_urls = {};														-- holds identifier URLs for those identifiers that can auto-link |title=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; H E L P E R   F U N C T I O N S &amp;gt;&amp;gt;============================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W I K I D A T A _ A R T I C L E _ N A M E _ G E T &amp;gt;----------------------------&lt;br /&gt;
&lt;br /&gt;
as an aid to internationalizing identifier-label wikilinks, gets identifier article names from Wikidata.&lt;br /&gt;
&lt;br /&gt;
returns :&amp;lt;lang code&amp;gt;:&amp;lt;article title&amp;gt; when &amp;lt;q&amp;gt; has an &amp;lt;article title&amp;gt; for &amp;lt;lang code&amp;gt;; nil else&lt;br /&gt;
&lt;br /&gt;
for identifiers that do not have q, returns nil&lt;br /&gt;
&lt;br /&gt;
for wikis that do not have mw.wikibase installed, returns nil&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wikidata_article_name_get (q)&lt;br /&gt;
	if not is_set (q) or (q and not mw.wikibase) then							-- when no q number or when a q number but mw.wikibase not installed on this wiki&lt;br /&gt;
		return nil;																-- abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wd_article;&lt;br /&gt;
	local this_wiki_code = cfg.this_wiki_code;									-- Wikipedia subdomain; &#039;en&#039; for en.wikipedia.org&lt;br /&gt;
&lt;br /&gt;
	wd_article = mw.wikibase.getSitelink (q, this_wiki_code .. &#039;wiki&#039;);			-- fetch article title from WD; nil when no title available at this wiki&lt;br /&gt;
&lt;br /&gt;
	if wd_article then&lt;br /&gt;
		wd_article = table.concat ({&#039;:&#039;, this_wiki_code, &#039;:&#039;, wd_article});		-- interwiki-style link without brackets if taken from WD; leading colon required&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return wd_article;															-- article title from WD; nil else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I N K _ L A B E L _ M A K E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
common function to create identifier link label from handler table or from Wikidata&lt;br /&gt;
&lt;br /&gt;
returns the first available of&lt;br /&gt;
	1. redirect from local wiki&#039;s handler table (if enabled)&lt;br /&gt;
	2. Wikidata (if there is a Wikidata entry for this identifier in the local wiki&#039;s language)&lt;br /&gt;
	3. label specified in the local wiki&#039;s handler table&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function link_label_make (handler)&lt;br /&gt;
	local wd_article;&lt;br /&gt;
	&lt;br /&gt;
	if not (cfg.use_identifier_redirects and is_set (handler.redirect)) then	-- redirect has priority so if enabled and available don&#039;t fetch from Wikidata because expensive&lt;br /&gt;
		wd_article = wikidata_article_name_get (handler.q);						-- if Wikidata has an article title for this wiki, get it;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return (cfg.use_identifier_redirects and is_set (handler.redirect) and handler.redirect) or wd_article or handler.link;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T E R N A L _ L I N K _ I D &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a wiki-style external link&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function external_link_id (options)&lt;br /&gt;
	local url_string = options.id;&lt;br /&gt;
	local ext_link;&lt;br /&gt;
	local this_wiki_code = cfg.this_wiki_code;									-- Wikipedia subdomain; &#039;en&#039; for en.wikipedia.org&lt;br /&gt;
	local wd_article;															-- article title from Wikidata&lt;br /&gt;
	&lt;br /&gt;
	if options.encode == true or options.encode == nil then&lt;br /&gt;
		url_string = mw.uri.encode (url_string, &#039;PATH&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if options.auto_link and is_set (options.access) then&lt;br /&gt;
		auto_link_urls[options.auto_link] = table.concat ({options.prefix, url_string, options.suffix});&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ext_link = mw.ustring.format (&#039;[%s%s%s %s]&#039;, options.prefix, url_string, options.suffix or &amp;quot;&amp;quot;, mw.text.nowiki (options.id));&lt;br /&gt;
	if is_set (options.access) then&lt;br /&gt;
		ext_link = substitute (cfg.presentation[&#039;ext-link-access-signal&#039;], {cfg.presentation[options.access].class, cfg.presentation[options.access].title, ext_link});	-- add the free-to-read / paywall lock&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat	({&lt;br /&gt;
		make_wikilink (link_label_make (options), options.label),				-- redirect, Wikidata link, or locally specified link (in that order)&lt;br /&gt;
		options.separator or &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		ext_link&lt;br /&gt;
		});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I N T E R N A L _ L I N K _ I D &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a wiki-style internal link&lt;br /&gt;
&lt;br /&gt;
TODO: Does not currently need to support options.access, options.encode, auto-linking and COinS (as in external_link_id),&lt;br /&gt;
but may be needed in the future for :m:Interwiki_map custom-prefixes like :arxiv:, :bibcode:, :DOI:, :hdl:, :ISSN:,&lt;br /&gt;
:JSTOR:, :Openlibrary:, :PMID:, :RFC:.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function internal_link_id (options)&lt;br /&gt;
	local id = mw.ustring.gsub (options.id, &#039;%d&#039;, cfg.date_names.local_digits);	-- translate &#039;local&#039; digits to Western 0-9&lt;br /&gt;
&lt;br /&gt;
	return table.concat (&lt;br /&gt;
		{&lt;br /&gt;
		make_wikilink (link_label_make (options), options.label),				-- wiki-link the identifier label&lt;br /&gt;
		options.separator or &#039;&amp;amp;nbsp;&#039;,											-- add the separator&lt;br /&gt;
		make_wikilink (&lt;br /&gt;
			table.concat (&lt;br /&gt;
				{&lt;br /&gt;
				options.prefix,&lt;br /&gt;
				id,																-- translated to Western digits&lt;br /&gt;
				options.suffix or &#039;&#039;&lt;br /&gt;
				}),&lt;br /&gt;
			substitute (cfg.presentation[&#039;bdi&#039;], {&#039;&#039;, mw.text.nowiki (options.id)})	-- bdi tags to prevent Latin script identifiers from being reversed at RTL language wikis&lt;br /&gt;
			);																	-- nowiki because MediaWiki still has magic links for ISBN and the like; TODO: is it really required?&lt;br /&gt;
		});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ E M B A R G O E D &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines if a PMC identifier&#039;s online version is embargoed. Compares the date in |pmc-embargo-date= against&lt;br /&gt;
today&#039;s date.  If embargo date is in the future, returns the content of |pmc-embargo-date=; otherwise, returns&lt;br /&gt;
an empty string because the embargo has expired or because |pmc-embargo-date= was not set in this cite.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_embargoed (embargo)&lt;br /&gt;
	if is_set (embargo) then&lt;br /&gt;
		local lang = mw.getContentLanguage();&lt;br /&gt;
		local good1, embargo_date, todays_date;&lt;br /&gt;
		good1, embargo_date = pcall (lang.formatDate, lang, &#039;U&#039;, embargo);&lt;br /&gt;
		todays_date = lang:formatDate (&#039;U&#039;);&lt;br /&gt;
	&lt;br /&gt;
		if good1 then															-- if embargo date is a good date&lt;br /&gt;
			if tonumber (embargo_date) &amp;gt;= tonumber (todays_date) then			-- is embargo date is in the future?&lt;br /&gt;
				return embargo;													-- still embargoed&lt;br /&gt;
			else&lt;br /&gt;
				set_message (&#039;maint_pmc_embargo&#039;);								-- embargo has expired; add main cat&lt;br /&gt;
				return &#039;&#039;;														-- unset because embargo has expired&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;;																	-- |pmc-embargo-date= not set return empty string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ V A L I D _ R X I V _ D A T E &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
for biorxiv, returns true if:&lt;br /&gt;
	2019-12-11T00:00Z &amp;lt;= biorxiv_date &amp;lt; today + 2 days&lt;br /&gt;
for medrxiv, returns true if:&lt;br /&gt;
	2020-01-01T00:00Z &amp;lt;= medrxiv_date &amp;lt; today + 2 days&lt;br /&gt;
	&lt;br /&gt;
The dated form of biorxiv identifier has a start date of 2019-12-11.  The Unix timestamp for that date is {{#time:U|2019-12-11}} = 1576022400&lt;br /&gt;
The medrxiv identifier has a start date of 2020-01-01.  The Unix timestamp for that date is {{#time:U|2020-01-01}} = 1577836800&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rxiv_date&amp;gt; is the date provided in those |biorxiv= parameter values that are dated and in |medrxiv= parameter values at time 00:00:00 UTC&lt;br /&gt;
&amp;lt;today&amp;gt; is the current date at time 00:00:00 UTC plus 48 hours&lt;br /&gt;
	if today&#039;s date is 2023-01-01T00:00:00 then&lt;br /&gt;
		adding 24 hours gives 2023-01-02T00:00:00 – one second more than today&lt;br /&gt;
		adding 24 hours gives 2023-01-03T00:00:00 – one second more than tomorrow&lt;br /&gt;
&lt;br /&gt;
inputs:&lt;br /&gt;
	&amp;lt;y&amp;gt;, &amp;lt;m&amp;gt;, &amp;lt;d&amp;gt; – year, month, day parts of the date from the birxiv or medrxiv identifier&lt;br /&gt;
	&amp;lt;select&amp;gt; &#039;b&#039; for biorxiv, &#039;m&#039; for medrxiv; defaults to &#039;b&#039;&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_rxiv_date (y, m, d, select)&lt;br /&gt;
	if 0 == tonumber (m) and 12 &amp;lt; tonumber (m) then								-- &amp;lt;m&amp;gt; must be a number 1–12&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	if 0 == tonumber (d) and 31 &amp;lt; tonumber (d) then								-- &amp;lt;d&amp;gt; must be a number 1–31; TODO: account for month length and leap yer?&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local rxiv_date = table.concat ({y, m, d}, &#039;-&#039;);							-- make ymd date string&lt;br /&gt;
	local good1, good2;&lt;br /&gt;
	local rxiv_ts, tomorrow_ts;													-- to hold Unix timestamps representing the dates&lt;br /&gt;
	local lang_object = mw.getContentLanguage();&lt;br /&gt;
&lt;br /&gt;
	good1, rxiv_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, rxiv_date);		-- convert rxiv_date value to Unix timestamp &lt;br /&gt;
	good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, &#039;today + 2 days&#039; );	-- today midnight + 2 days is one second more than all day tomorrow&lt;br /&gt;
	&lt;br /&gt;
	if good1 and good2 then														-- lang.formatDate() returns a timestamp in the local script which tonumber() may not understand&lt;br /&gt;
		rxiv_ts = tonumber (rxiv_ts) or lang_object:parseFormattedNumber (rxiv_ts);	-- convert to numbers for the comparison;&lt;br /&gt;
		tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- one or both failed to convert to Unix timestamp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local limit_ts = ((select and (&#039;m&#039; == select)) and 1577836800) or 1576022400;	-- choose the appropriate limit timesatmp&lt;br /&gt;
&lt;br /&gt;
	return ((limit_ts &amp;lt;= rxiv_ts) and (rxiv_ts &amp;lt; tomorrow_ts))					-- limit_ts &amp;lt;= rxiv_date &amp;lt; tomorrow&#039;s date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ISBN-10 and ISSN validator code calculates checksum across all ISBN/ISSN digits including the check digit.&lt;br /&gt;
ISBN-13 is checked in isbn().&lt;br /&gt;
&lt;br /&gt;
If the number is valid the result will be 0. Before calling this function, ISBN/ISSN must be checked for length&lt;br /&gt;
and stripped of dashes, spaces and other non-ISxN characters.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn (isxn_str, len)&lt;br /&gt;
	local temp = 0;&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, len) };										-- make a table of byte values &#039;0&#039; → 0x30 .. &#039;9&#039; → 0x39, &#039;X&#039; → 0x58&lt;br /&gt;
	len = len + 1;																-- adjust to be a loop counter&lt;br /&gt;
	for i, v in ipairs (isxn_str) do											-- loop through all of the bytes and calculate the checksum&lt;br /&gt;
		if v == string.byte (&amp;quot;X&amp;quot; ) then											-- if checkdigit is X (compares the byte value of &#039;X&#039; which is 0x58)&lt;br /&gt;
			temp = temp + 10 * (len - i);										-- it represents 10 decimal&lt;br /&gt;
		else&lt;br /&gt;
			temp = temp + tonumber (string.char (v) )*(len-i);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 11 == 0;														-- returns true if calculation result is zero&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N _ 1 3 &amp;gt;-----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ISBN-13 and ISMN validator code calculates checksum across all 13 ISBN/ISMN digits including the check digit.&lt;br /&gt;
If the number is valid, the result will be 0. Before calling this function, ISBN-13/ISMN must be checked for length&lt;br /&gt;
and stripped of dashes, spaces and other non-ISxN-13 characters.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn_13 (isxn_str)&lt;br /&gt;
	local temp=0;&lt;br /&gt;
	&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, 13) };										-- make a table of byte values &#039;0&#039; → 0x30 .. &#039;9&#039; → 0x39&lt;br /&gt;
	for i, v in ipairs (isxn_str) do&lt;br /&gt;
		temp = temp + (3 - 2*(i % 2)) * tonumber (string.char (v) );			-- multiply odd index digits by 1, even index digits by 3 and sum; includes check digit&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 10 == 0;														-- sum modulo 10 is zero when ISBN-13/ISMN is correct&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N O R M A L I Z E _ L C C N &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
LCCN normalization (https://www.loc.gov/marc/lccn-namespace.html#normalization)&lt;br /&gt;
1. Remove all blanks.&lt;br /&gt;
2. If there is a forward slash (/) in the string, remove it, and remove all characters to the right of the forward slash.&lt;br /&gt;
3. If there is a hyphen in the string:&lt;br /&gt;
	a. Remove it.&lt;br /&gt;
	b. Inspect the substring following (to the right of) the (removed) hyphen. Then (and assuming that steps 1 and 2 have been carried out):&lt;br /&gt;
		1. All these characters should be digits, and there should be six or less. (not done in this function)&lt;br /&gt;
		2. If the length of the substring is less than 6, left-fill the substring with zeroes until the length is six.&lt;br /&gt;
&lt;br /&gt;
Returns a normalized LCCN for lccn() to validate.  There is no error checking (step 3.b.1) performed in this function.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function normalize_lccn (lccn)&lt;br /&gt;
	lccn = lccn:gsub (&amp;quot;%s&amp;quot;, &amp;quot;&amp;quot;);												-- 1. strip whitespace&lt;br /&gt;
&lt;br /&gt;
	if nil ~= string.find (lccn, &#039;/&#039;) then&lt;br /&gt;
		lccn = lccn:match (&amp;quot;(.-)/&amp;quot;);											-- 2. remove forward slash and all character to the right of it&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix&lt;br /&gt;
	local suffix&lt;br /&gt;
	prefix, suffix = lccn:match (&amp;quot;(.+)%-(.+)&amp;quot;);									-- 3.a remove hyphen by splitting the string into prefix and suffix&lt;br /&gt;
&lt;br /&gt;
	if nil ~= suffix then														-- if there was a hyphen&lt;br /&gt;
		suffix = string.rep(&amp;quot;0&amp;quot;, 6-string.len (suffix)) .. suffix;				-- 3.b.2 left fill the suffix with 0s if suffix length less than 6&lt;br /&gt;
		lccn = prefix..suffix;													-- reassemble the LCCN&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return lccn;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; I D E N T I F I E R   F U N C T I O N S &amp;gt;&amp;gt;====================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R X I V &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
See: https://arxiv.org/help/arxiv_identifier&lt;br /&gt;
&lt;br /&gt;
format and error check arXiv identifier.  There are three valid forms of the identifier:&lt;br /&gt;
the first form, valid only between date codes 9107 and 0703, is:&lt;br /&gt;
	arXiv:&amp;lt;archive&amp;gt;.&amp;lt;class&amp;gt;/&amp;lt;date code&amp;gt;&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;archive&amp;gt; is a string of alpha characters - may be hyphenated; no other punctuation&lt;br /&gt;
	&amp;lt;class&amp;gt; is a string of alpha characters - may be hyphenated; no other punctuation; not the same as |class= parameter which is not supported in this form&lt;br /&gt;
	&amp;lt;date code&amp;gt; is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01&lt;br /&gt;
		first digit of YY for this form can only 9 and 0&lt;br /&gt;
	&amp;lt;number&amp;gt; is a three-digit number&lt;br /&gt;
	&amp;lt;version&amp;gt; is a 1 or more digit number preceded with a lowercase v; no spaces (undocumented)&lt;br /&gt;
	&lt;br /&gt;
the second form, valid from April 2007 through December 2014 is:&lt;br /&gt;
	arXiv:&amp;lt;date code&amp;gt;.&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;date code&amp;gt; is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01&lt;br /&gt;
	&amp;lt;number&amp;gt; is a four-digit number&lt;br /&gt;
	&amp;lt;version&amp;gt; is a 1 or more digit number preceded with a lowercase v; no spaces&lt;br /&gt;
&lt;br /&gt;
the third form, valid from January 2015 is:&lt;br /&gt;
	arXiv:&amp;lt;date code&amp;gt;.&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;date code&amp;gt; and &amp;lt;version&amp;gt; are as defined for 0704-1412&lt;br /&gt;
	&amp;lt;number&amp;gt; is a five-digit number&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function arxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local class = options.Class;												-- TODO: lowercase?&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local year, month, version;&lt;br /&gt;
	local err_msg = false;														-- assume no error message&lt;br /&gt;
	local text;																	-- output text&lt;br /&gt;
	&lt;br /&gt;
	if id:match(&amp;quot;^%a[%a%.%-]+/[90]%d[01]%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%a[%a%.%-]+/[90]%d[01]%d%d%d%dv%d+$&amp;quot;) then	-- test for the 9107-0703 format with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^%a[%a%.%-]+/([90]%d)([01]%d)%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((not (90 &amp;lt; year or 8 &amp;gt; year)) or (1 &amp;gt; month or 12 &amp;lt; month)) or		-- if invalid year or invalid month&lt;br /&gt;
			((91 == year and 7 &amp;gt; month) or (7 == year and 3 &amp;lt; month)) then		-- if years ok, are starting and ending months ok?&lt;br /&gt;
				err_msg = true;													-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%dv%d+$&amp;quot;) then	-- test for the 0704-1412 with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^(%d%d)([01]%d)%.%d%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((7 &amp;gt; year) or (14 &amp;lt; year) or (1 &amp;gt; month or 12 &amp;lt; month)) or			-- is year invalid or is month invalid? (doesn&#039;t test for future years)&lt;br /&gt;
			((7 == year) and (4 &amp;gt; month)) then									-- when year is 07, is month invalid (before April)?&lt;br /&gt;
				err_msg = true;													-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d%dv%d+$&amp;quot;) then	-- test for the 1501- format with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^(%d%d)([01]%d)%.%d%d%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((15 &amp;gt; year) or (1 &amp;gt; month or 12 &amp;lt; month)) then						-- is year invalid or is month invalid? (doesn&#039;t test for future years)&lt;br /&gt;
			err_msg = true;														-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		err_msg = true;															-- not a recognized format; flag for error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		options.coins_list_t[&#039;ARXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local err_msg_t = {};&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		set_message (&#039;err_bad_arxiv&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});&lt;br /&gt;
&lt;br /&gt;
	if is_set (class) then&lt;br /&gt;
		if id:match (&#039;^%d+&#039;) then&lt;br /&gt;
			text = table.concat ({text, &#039; [[https://arxiv.org/archive/&#039;, class, &#039; &#039;, class, &#039;]]&#039;});	-- external link within square brackets, not wikilink&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;err_class_ignored&#039;);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B I B C O D E &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validates (sort of) and formats a bibcode ID.&lt;br /&gt;
&lt;br /&gt;
Format for bibcodes is specified here: https://adsabs.harvard.edu/abs_doc/help_pages/data.html#bibcodes&lt;br /&gt;
&lt;br /&gt;
But, this: 2015arXiv151206696F is apparently valid so apparently, the only things that really matter are length, 19 characters&lt;br /&gt;
and first four digits must be a year.  This function makes these tests:&lt;br /&gt;
	length must be 19 characters&lt;br /&gt;
	characters in position&lt;br /&gt;
		1–4 must be digits and must represent a year in the range of 1000 – next year&lt;br /&gt;
		5 must be a letter&lt;br /&gt;
		6–8 must be letter, digit, ampersand, or dot (ampersand cannot directly precede a dot; &amp;amp;. )&lt;br /&gt;
		9–18 must be letter, digit, or dot&lt;br /&gt;
		19 must be a letter or dot&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function bibcode (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local err_type;&lt;br /&gt;
	local err_msg = &#039;&#039;;&lt;br /&gt;
	local year;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = access});&lt;br /&gt;
	&lt;br /&gt;
	if 19 ~= id:len() then&lt;br /&gt;
		err_type = cfg.err_msg_supl.length;&lt;br /&gt;
	else&lt;br /&gt;
		year = id:match (&amp;quot;^(%d%d%d%d)[%a][%w&amp;amp;%.][%w&amp;amp;%.][%w&amp;amp;%.][%w.]+[%a%.]$&amp;quot;);&lt;br /&gt;
		if not year then														-- if nil then no pattern match&lt;br /&gt;
			err_type = cfg.err_msg_supl.value;									-- so value error&lt;br /&gt;
		else&lt;br /&gt;
			local next_year = tonumber (os.date (&#039;%Y&#039;)) + 1;					-- get the current year as a number and add one for next year&lt;br /&gt;
			year = tonumber (year);												-- convert year portion of bibcode to a number&lt;br /&gt;
			if (1000 &amp;gt; year) or (year &amp;gt; next_year) then&lt;br /&gt;
				err_type = cfg.err_msg_supl.year;								-- year out of bounds&lt;br /&gt;
			end&lt;br /&gt;
			if id:find(&#039;&amp;amp;%.&#039;) then&lt;br /&gt;
				err_type = cfg.err_msg_supl.journal;							-- journal abbreviation must not have &#039;&amp;amp;.&#039; (if it does it&#039;s missing a letter)&lt;br /&gt;
			end&lt;br /&gt;
			if id:match (&#039;.........%.tmp%.&#039;) then								-- temporary bibcodes when positions 10–14 are &#039;.tmp.&#039;&lt;br /&gt;
				set_message (&#039;maint_bibcode&#039;);&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (err_type) and not ignore_invalid then							-- if there was an error detected and accept-as-written markup not used&lt;br /&gt;
		set_message (&#039;err_bad_bibcode&#039;, {err_type});&lt;br /&gt;
		options.coins_list_t[&#039;BIBCODE&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B I O R X I V &amp;gt;-----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format bioRxiv ID and do simple error checking.  Before 2019-12-11, biorXiv IDs were 10.1101/ followed by exactly&lt;br /&gt;
6 digits.  After 2019-12-11, biorXiv IDs retained the six-digit identifier but prefixed that with a yyyy.mm.dd. &lt;br /&gt;
date and suffixed with an optional version identifier.&lt;br /&gt;
&lt;br /&gt;
The bioRxiv ID is the string of characters:&lt;br /&gt;
	https://doi.org/10.1101/078733 -&amp;gt; 10.1101/078733&lt;br /&gt;
or a date followed by a six-digit number followed by an optional version indicator &#039;v&#039; and one or more digits:&lt;br /&gt;
	https://www.biorxiv.org/content/10.1101/2019.12.11.123456v2 -&amp;gt; 10.1101/2019.12.11.123456v2&lt;br /&gt;
	&lt;br /&gt;
see https://www.biorxiv.org/about-biorxiv&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function biorxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_msg = true;														-- flag; assume that there will be an error&lt;br /&gt;
	&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^10%.1101/%d%d%d%d%d%d$&#039;,												-- simple 6-digit identifier (before 2019-12-11)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%dv%d+$&#039;,				-- y.m.d. date + 6-digit identifier + version (after 2019-12-11)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d$&#039;,					-- y.m.d. date + 6-digit identifier (after 2019-12-11)&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	for _, pattern in ipairs (patterns) do										-- spin through the patterns looking for a match&lt;br /&gt;
		if id:match (pattern) then&lt;br /&gt;
			local y, m, d = id:match (pattern);									-- found a match, attempt to get year, month and date from the identifier&lt;br /&gt;
&lt;br /&gt;
			if m then															-- m is nil when id is the six-digit form&lt;br /&gt;
				if not is_valid_rxiv_date (y, m, d, &#039;b&#039;) then					-- validate the encoded date; &#039;b&#039; for biorxiv limit&lt;br /&gt;
					break;														-- date fail; break out early so we don&#039;t unset the error message&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			err_msg = nil;														-- we found a match so unset the error message&lt;br /&gt;
			break;																-- and done&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- err_cat remains set here when no match&lt;br /&gt;
&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		options.coins_list_t[&#039;BIORXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		set_message (&#039;err_bad_biorxiv&#039;);										-- and set the error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator,&lt;br /&gt;
			encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C I T E S E E R X &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
CiteSeerX use their own notion of &amp;quot;doi&amp;quot; (not to be confused with the identifiers resolved via doi.org).&lt;br /&gt;
&lt;br /&gt;
The description of the structure of this identifier can be found at Help_talk:Citation_Style_1/Archive_26#CiteSeerX_id_structure&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function citeseerx (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local matched;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = handler.access});&lt;br /&gt;
	&lt;br /&gt;
	matched = id:match (&amp;quot;^10%.1%.1%.[1-9]%d?%d?%d?%.[1-9]%d?%d?%d?$&amp;quot;);&lt;br /&gt;
	if not matched then&lt;br /&gt;
		set_message (&#039;err_bad_citeseerx&#039; );&lt;br /&gt;
		options.coins_list_t[&#039;CITESEERX&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D O I &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a DOI and checks for DOI errors.&lt;br /&gt;
&lt;br /&gt;
DOI names contain two parts: prefix and suffix separated by a forward slash.&lt;br /&gt;
	Prefix: directory indicator &#039;10.&#039; followed by a registrant code&lt;br /&gt;
	Suffix: character string of any length chosen by the registrant&lt;br /&gt;
&lt;br /&gt;
This function checks a DOI name for: prefix/suffix.  If the DOI name contains spaces or endashes, or, if it ends&lt;br /&gt;
with a period or a comma, this function will emit a bad_doi error message.&lt;br /&gt;
&lt;br /&gt;
DOI names are case-insensitive and can incorporate any printable Unicode characters so the test for spaces, endash,&lt;br /&gt;
and terminal punctuation may not be technically correct but it appears, that in practice these characters are rarely&lt;br /&gt;
if ever used in DOI names.&lt;br /&gt;
&lt;br /&gt;
https://www.doi.org/doi_handbook/2_Numbering.html				-- 2.2 Syntax of a DOI name&lt;br /&gt;
https://www.doi.org/doi_handbook/2_Numbering.html#2.2.2			-- 2.2.2 DOI prefix&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function doi (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local inactive = options.DoiBroken&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
&lt;br /&gt;
	local function is_extended_free (registrant, id)							-- local function to check those few registrants that are mixed; identifiable by the doi suffix &amp;lt;incipit&amp;gt;&lt;br /&gt;
		if cfg.extended_registrants_t[registrant] then							-- if this registrant has known free-to-read extentions&lt;br /&gt;
			for _, incipit in ipairs (cfg.extended_registrants_t[registrant]) do	-- loop through the registrant&#039;s incipits&lt;br /&gt;
				if string.find (id, incipit, 1, true) then						-- if found&lt;br /&gt;
					return true;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text;&lt;br /&gt;
	if is_set (inactive) then&lt;br /&gt;
		local inactive_year = inactive:match(&amp;quot;%d%d%d%d&amp;quot;);						-- try to get the year portion from the inactive date&lt;br /&gt;
		local inactive_month, good;&lt;br /&gt;
&lt;br /&gt;
		if is_set (inactive_year) then&lt;br /&gt;
			if 4 &amp;lt; inactive:len() then											-- inactive date has more than just a year (could be anything)&lt;br /&gt;
				local lang_obj = mw.getContentLanguage();						-- get a language object for this wiki&lt;br /&gt;
				good, inactive_month = pcall (lang_obj.formatDate, lang_obj, &#039;F&#039;, inactive);	-- try to get the month name from the inactive date&lt;br /&gt;
				if not good then&lt;br /&gt;
					inactive_month = nil;										-- something went wrong so make sure this is unset&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end																		-- otherwise, |doi-broken-date= has something but it isn&#039;t a date&lt;br /&gt;
		&lt;br /&gt;
		if is_set (inactive_year) and is_set (inactive_month) then&lt;br /&gt;
			set_message (&#039;maint_doi_inactive_dated&#039;, {inactive_year, inactive_month, &#039; &#039;});&lt;br /&gt;
		elseif is_set (inactive_year) then&lt;br /&gt;
			set_message (&#039;maint_doi_inactive_dated&#039;, {inactive_year, &#039;&#039;, &#039;&#039;});&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;maint_doi_inactive&#039;);&lt;br /&gt;
		end&lt;br /&gt;
		inactive = &amp;quot; (&amp;quot; .. cfg.messages[&#039;inactive&#039;] .. &#039; &#039; .. inactive .. &#039;)&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local registrant = mw.ustring.match (id, &#039;^10%.([^/]+)/[^%s–]-[^%.,]$&#039;);	-- registrant set when DOI has the proper basic form&lt;br /&gt;
&lt;br /&gt;
	local registrant_err_patterns = {											-- these patterns are for code ranges that are not supported &lt;br /&gt;
		&#039;^[^1-3]%d%d%d%d%.%d+$&#039;,												-- 5 digits with subcode (0xxxx, 40000+); accepts: 10000–39999&lt;br /&gt;
		&#039;^[^1-6]%d%d%d%d$&#039;,														-- 5 digits without subcode (0xxxx, 60000+); accepts: 10000–69999&lt;br /&gt;
		&#039;^[^1-9]%d%d%d%.%d+$&#039;,												-- 4 digits with subcode (0xxx); accepts: 1000–9999&lt;br /&gt;
		&#039;^[^1-9]%d%d%d$&#039;,														-- 4 digits without subcode (0xxx); accepts: 1000–9999&lt;br /&gt;
		&#039;^%d%d%d%d%d%d+&#039;,														-- 6 or more digits&lt;br /&gt;
		&#039;^%d%d?%d?$&#039;,															-- less than 4 digits without subcode (3 digits with subcode is legitimate)&lt;br /&gt;
		&#039;^%d%d?%.[%d%.]+&#039;,														-- 1 or 2 digits with subcode&lt;br /&gt;
		&#039;^5555$&#039;,																-- test registrant will never resolve&lt;br /&gt;
		&#039;[^%d%.]&#039;,																-- any character that isn&#039;t a digit or a dot&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	if not ignore_invalid then&lt;br /&gt;
		if registrant then														-- when DOI has proper form&lt;br /&gt;
			for i, pattern in ipairs (registrant_err_patterns) do				-- spin through error patterns&lt;br /&gt;
				if registrant:match (pattern) then								-- to validate registrant codes&lt;br /&gt;
					err_flag = set_message (&#039;err_bad_doi&#039;);						-- when found, mark this DOI as bad&lt;br /&gt;
					break;														-- and done&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_doi&#039;);								-- invalid directory or malformed&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;maint_doi_ignore&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_flag then&lt;br /&gt;
		options.coins_list_t[&#039;DOI&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else&lt;br /&gt;
		if not access and (cfg.known_free_doi_registrants_t[registrant] or is_extended_free (registrant, id)) then		-- |doi-access=free not set and &amp;lt;registrant&amp;gt; is known to be free&lt;br /&gt;
			set_message (&#039;maint_doi_unflagged_free&#039;);							-- set a maint cat&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access,&lt;br /&gt;
		auto_link = not (err_flag or is_set (inactive) or ignore_invalid) and &#039;doi&#039; or nil -- do not auto-link when |doi-broken-date= has a value or when there is a DOI error or (to play it safe, after all, auto-linking is not essential) when invalid DOIs are ignored&lt;br /&gt;
		}) .. (inactive or &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H D L &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats an HDL with minor error checking.&lt;br /&gt;
&lt;br /&gt;
HDL names contain two parts: prefix and suffix separated by a forward slash.&lt;br /&gt;
	Prefix: character string using any character in the UCS-2 character set except &#039;/&#039;&lt;br /&gt;
	Suffix: character string of any length using any character in the UCS-2 character set chosen by the registrant&lt;br /&gt;
&lt;br /&gt;
This function checks a HDL name for: prefix/suffix.  If the HDL name contains spaces, endashes, or, if it ends&lt;br /&gt;
with a period or a comma, this function will emit a bad_hdl error message.&lt;br /&gt;
&lt;br /&gt;
HDL names are case-insensitive and can incorporate any printable Unicode characters so the test for endashes and&lt;br /&gt;
terminal punctuation may not be technically correct but it appears, that in practice these characters are rarely&lt;br /&gt;
if ever used in HDLs.&lt;br /&gt;
&lt;br /&gt;
Query string parameters are named here: https://www.handle.net/proxy_servlet.html.  query strings are not displayed&lt;br /&gt;
but since &#039;?&#039; is an allowed character in an HDL, &#039;?&#039; followed by one of the query parameters is the only way we&lt;br /&gt;
have to detect the query string so that it isn&#039;t URL-encoded with the rest of the identifier.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function hdl (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local query_params = {														-- list of known query parameters from https://www.handle.net/proxy_servlet.html&lt;br /&gt;
		&#039;noredirect&#039;,&lt;br /&gt;
		&#039;ignore_aliases&#039;,&lt;br /&gt;
		&#039;auth&#039;,&lt;br /&gt;
		&#039;cert&#039;,&lt;br /&gt;
		&#039;index&#039;,&lt;br /&gt;
		&#039;type&#039;,&lt;br /&gt;
		&#039;urlappend&#039;,&lt;br /&gt;
		&#039;locatt&#039;,&lt;br /&gt;
		&#039;action&#039;,&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	local hdl, suffix, param = id:match (&#039;(.-)(%?(%a+).+)$&#039;);					-- look for query string&lt;br /&gt;
	local found;&lt;br /&gt;
&lt;br /&gt;
	if hdl then																	-- when there are query strings, this is the handle identifier portion&lt;br /&gt;
		for _, q in ipairs (query_params) do									-- spin through the list of query parameters&lt;br /&gt;
			if param:match (&#039;^&#039; .. q) then										-- if the query string begins with one of the parameters&lt;br /&gt;
				found = true;													-- announce a find&lt;br /&gt;
				break;															-- and stop looking&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if found then&lt;br /&gt;
		id = hdl;																-- found so replace id with the handle portion; this will be URL-encoded, suffix will not&lt;br /&gt;
	else&lt;br /&gt;
		suffix = &#039;&#039;;															-- make sure suffix is empty string for concatenation else&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, suffix = suffix, separator = handler.separator, encode = handler.encode, access = access})&lt;br /&gt;
&lt;br /&gt;
	if nil == id:match(&amp;quot;^[^%s–]-/[^%s–]-[^%.,]$&amp;quot;) then							-- HDL must contain a forward slash, must not contain spaces, endashes, and must not end with period or comma&lt;br /&gt;
		set_message (&#039;err_bad_hdl&#039; );&lt;br /&gt;
		options.coins_list_t[&#039;HDL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S B N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines whether an ISBN string is valid&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function isbn (options)&lt;br /&gt;
	local isbn_str = options.id;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	local function return_result (check, err_type)								-- local function to handle the various returns&lt;br /&gt;
		local ISBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect,&lt;br /&gt;
						prefix = handler.prefix, id = isbn_str, separator = handler.separator});&lt;br /&gt;
		if ignore_invalid then													-- if ignoring ISBN errors&lt;br /&gt;
			set_message (&#039;maint_isbn_ignore&#039;);									-- add a maint category even when there is no error&lt;br /&gt;
		else																	-- here when not ignoring&lt;br /&gt;
			if not check then													-- and there is an error&lt;br /&gt;
				options.coins_list_t[&#039;ISBN&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
				set_message (&#039;err_bad_isbn&#039;, err_type);							-- set an error message&lt;br /&gt;
				return ISBN;										 			-- return id text&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return ISBN;															-- return id text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil ~= isbn_str:match (&#039;[^%s-0-9X]&#039;) then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.char);					-- fail if isbn_str contains anything but digits, hyphens, or the uppercase X&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local id = isbn_str:gsub (&#039;[%s-]&#039;, &#039;&#039;);										-- remove hyphens and whitespace&lt;br /&gt;
&lt;br /&gt;
	local len = id:len();&lt;br /&gt;
 &lt;br /&gt;
	if len ~= 10 and len ~= 13 then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.length);					-- fail if incorrect length&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if len == 10 then&lt;br /&gt;
		if id:match (&#039;^%d*X?$&#039;) == nil then										-- fail if isbn_str has &#039;X&#039; anywhere but last position&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.form);									&lt;br /&gt;
		end&lt;br /&gt;
		if not is_valid_isxn (id, 10) then										-- test isbn-10 for numerical validity&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.check);				-- fail if isbn-10 is not numerically valid&lt;br /&gt;
		end&lt;br /&gt;
		if id:find (&#039;^63[01]&#039;) then												-- 630xxxxxxx and 631xxxxxxx are (apparently) not valid isbn group ids but are used by amazon as numeric identifiers (asin)&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.group);				-- fail if isbn-10 begins with 630/1&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (true, cfg.err_msg_supl.check);					-- pass if isbn-10 is numerically valid&lt;br /&gt;
	else&lt;br /&gt;
		if id:match (&#039;^%d+$&#039;) == nil then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.char);				-- fail if ISBN-13 is not all digits&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&#039;^97[89]%d*$&#039;) == nil then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.prefix);				-- fail when ISBN-13 does not begin with 978 or 979&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&#039;^9790&#039;) then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.group);				-- group identifier &#039;0&#039; is reserved to ISMN&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (is_valid_isxn_13 (id), cfg.err_msg_supl.check);&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A S I N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a link to Amazon.  Do simple error checking: ASIN must be mix of 10 numeric or uppercase alpha&lt;br /&gt;
characters.  If a mix, first character must be uppercase alpha; if all numeric, ASINs must be 10-digit&lt;br /&gt;
ISBN. If 10-digit ISBN, add a maintenance category so a bot or AWB script can replace |asin= with |isbn=.&lt;br /&gt;
Error message if not 10 characters, if not ISBN-10, if mixed and first character is a digit.&lt;br /&gt;
&lt;br /&gt;
|asin=630....... and |asin=631....... are (apparently) not a legitimate ISBN though it checksums as one; these&lt;br /&gt;
do not cause this function to emit the maint_asin message&lt;br /&gt;
&lt;br /&gt;
This function is positioned here because it calls isbn()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function asin (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local domain = options.ASINTLD;&lt;br /&gt;
	&lt;br /&gt;
	local err_flag;&lt;br /&gt;
&lt;br /&gt;
	if not id:match(&amp;quot;^[%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u]$&amp;quot;) then&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_asin&#039;);								-- ASIN is not a mix of 10 uppercase alpha and numeric characters&lt;br /&gt;
	else&lt;br /&gt;
		if id:match(&amp;quot;^%d%d%d%d%d%d%d%d%d[%dX]$&amp;quot;) then							-- if 10-digit numeric (or 9 digits with terminal X)&lt;br /&gt;
			if is_valid_isxn (id, 10) then										-- see if ASIN value is or validates as ISBN-10&lt;br /&gt;
				if not id:find (&#039;^63[01]&#039;) then									-- 630xxxxxxx and 631xxxxxxx are (apparently) not a valid isbn prefixes but are used by amazon as a numeric identifier&lt;br /&gt;
					err_flag = set_message (&#039;err_bad_asin&#039;);					-- ASIN has ISBN-10 form but begins with something other than 630/1 so probably an isbn &lt;br /&gt;
				end&lt;br /&gt;
			elseif not is_set (err_flag) then&lt;br /&gt;
				err_flag = set_message (&#039;err_bad_asin&#039;);						-- ASIN is not ISBN-10&lt;br /&gt;
			end&lt;br /&gt;
		elseif not id:match(&amp;quot;^%u[%d%u]+$&amp;quot;) then&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_asin&#039;);							-- asin doesn&#039;t begin with uppercase alpha&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (not is_set (domain)) or in_array (domain, {&#039;us&#039;}) then					-- default: United States&lt;br /&gt;
		domain = &amp;quot;com&amp;quot;;&lt;br /&gt;
	elseif in_array (domain, {&#039;jp&#039;, &#039;uk&#039;}) then									-- Japan, United Kingdom&lt;br /&gt;
		domain = &amp;quot;co.&amp;quot; .. domain;&lt;br /&gt;
	elseif in_array (domain, {&#039;z.cn&#039;}) then 									-- China&lt;br /&gt;
		domain = &amp;quot;cn&amp;quot;;&lt;br /&gt;
	elseif in_array (domain, {&#039;au&#039;, &#039;br&#039;, &#039;mx&#039;, &#039;sg&#039;, &#039;tr&#039;}) then				-- Australia, Brazil, Mexico, Singapore, Turkey&lt;br /&gt;
		domain = &amp;quot;com.&amp;quot; .. domain;&lt;br /&gt;
	elseif not in_array (domain, {&#039;ae&#039;, &#039;ca&#039;, &#039;cn&#039;, &#039;de&#039;, &#039;es&#039;, &#039;fr&#039;, &#039;in&#039;, &#039;it&#039;, &#039;nl&#039;, &#039;pl&#039;, &#039;sa&#039;, &#039;se&#039;, &#039;co.jp&#039;, &#039;co.uk&#039;, &#039;com&#039;, &#039;com.au&#039;, &#039;com.br&#039;, &#039;com.mx&#039;, &#039;com.sg&#039;, &#039;com.tr&#039;}) then -- Arabic Emirates, Canada, China, Germany, Spain, France, Indonesia, Italy, Netherlands, Poland, Saudi Arabia, Sweden (as of 2021-03 Austria (.at), Liechtenstein (.li) and Switzerland (.ch) still redirect to the German site (.de) with special settings, so don&#039;t maintain local ASINs for them)&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_asin_tld&#039;);							-- unsupported asin-tld value&lt;br /&gt;
	end&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;ASIN&#039;] = handler.prefix .. domain .. &amp;quot;/dp/&amp;quot; .. id;	-- asin for coins&lt;br /&gt;
	else&lt;br /&gt;
		options.coins_list_t[&#039;ASIN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix .. domain .. &amp;quot;/dp/&amp;quot;,&lt;br /&gt;
		id = id, encode = handler.encode, separator = handler.separator})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S M N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines whether an ISMN string is valid.  Similar to ISBN-13, ISMN is 13 digits beginning 979-0-... and uses the&lt;br /&gt;
same check digit calculations.  See https://www.ismn-international.org/download/Web_ISMN_Users_Manual_2008-6.pdf&lt;br /&gt;
section 2, pages 9–12.&lt;br /&gt;
&lt;br /&gt;
ismn value not made part of COinS metadata because we don&#039;t have a url or isn&#039;t a COinS-defined identifier (rft.xxx)&lt;br /&gt;
or an identifier registered at info-uri.info (info:)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ismn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_ismn = true;&lt;br /&gt;
	local id_copy;&lt;br /&gt;
&lt;br /&gt;
	id_copy = id;																-- save a copy because this testing is destructive&lt;br /&gt;
	id = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);													-- remove hyphens and white space&lt;br /&gt;
&lt;br /&gt;
	if 13 ~= id:len() or id:match (&amp;quot;^9790%d*$&amp;quot; ) == nil then					-- ISMN must be 13 digits and begin with 9790&lt;br /&gt;
		valid_ismn = false;&lt;br /&gt;
	else&lt;br /&gt;
		valid_ismn=is_valid_isxn_13 (id);										-- validate ISMN&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--	text = internal_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,		-- use this (or external version) when there is some place to link to&lt;br /&gt;
	--		prefix = handler.prefix, id = id_copy, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
&lt;br /&gt;
	text = table.concat (														-- because no place to link to yet&lt;br /&gt;
		{&lt;br /&gt;
		make_wikilink (link_label_make (handler), handler.label),&lt;br /&gt;
		handler.separator,&lt;br /&gt;
		id_copy&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	if false == valid_ismn then&lt;br /&gt;
		options.coins_list_t[&#039;ISMN&#039;] = nil;										-- when error, unset so not included in COinS; not really necessary here because ismn not made part of COinS&lt;br /&gt;
		set_message (&#039;err_bad_ismn&#039;);											-- create an error message if the ISMN is invalid&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S S N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format an ISSN.  This code fixes the case where an editor has included an ISSN in the citation but&lt;br /&gt;
has separated the two groups of four digits with a space.  When that condition occurred, the resulting link looked&lt;br /&gt;
like this:&lt;br /&gt;
&lt;br /&gt;
	|issn=0819 4327 gives: [https://www.worldcat.org/issn/0819 4327 0819 4327]	-- can&#039;t have spaces in an external link&lt;br /&gt;
	&lt;br /&gt;
This code now prevents that by inserting a hyphen at the ISSN midpoint.  It also validates the ISSN for length&lt;br /&gt;
and makes sure that the checkdigit agrees with the calculated value.  Incorrect length (8 digits), characters&lt;br /&gt;
other than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check ISSN error message.  The&lt;br /&gt;
ISSN is always displayed with a hyphen, even if the ISSN was given as a single group of 8 digits.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function issn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
&lt;br /&gt;
	local issn_copy = id;														-- save a copy of unadulterated ISSN; use this version for display if ISSN does not validate&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_issn = true;&lt;br /&gt;
&lt;br /&gt;
	id = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);													-- remove hyphens and whitespace&lt;br /&gt;
&lt;br /&gt;
	if 8 ~= id:len() or nil == id:match (&amp;quot;^%d*X?$&amp;quot; ) then						-- validate the ISSN: 8 digits long, containing only 0-9 or X in the last position&lt;br /&gt;
		valid_issn = false;														-- wrong length or improper character&lt;br /&gt;
	else&lt;br /&gt;
		valid_issn = is_valid_isxn (id, 8);										-- validate ISSN&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if true == valid_issn then&lt;br /&gt;
		id = string.sub (id, 1, 4 ) .. &amp;quot;-&amp;quot; .. string.sub (id, 5 );				-- if valid, display correctly formatted version&lt;br /&gt;
	else&lt;br /&gt;
		id = issn_copy;															-- if not valid, show the invalid ISSN with error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
&lt;br /&gt;
	if ignore_invalid then&lt;br /&gt;
		set_message (&#039;maint_issn_ignore&#039;);&lt;br /&gt;
	else&lt;br /&gt;
		if false == valid_issn then&lt;br /&gt;
			options.coins_list_t[&#039;ISSN&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
			set_message (&#039;err_bad_issn&#039;, (options.hkey == &#039;EISSN&#039;) and &#039;e&#039; or &#039;&#039;);	-- create an error message if the ISSN is invalid&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; J F M &amp;gt;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A numerical identifier in the form nn.nnnn.nn&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function jfm (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Jj][Ff][Mm](.*)$&#039;);									-- identifier with jfm prefix; extract identifier&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_jfm_format&#039;);&lt;br /&gt;
	else																		-- plain number without JFM prefix&lt;br /&gt;
		id_num = id;															-- if here id does not have prefix&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if id_num and id_num:match(&#039;^%d%d%.%d%d%d%d%.%d%d$&#039;) then&lt;br /&gt;
		id = id_num;															-- jfm matches pattern&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_jfm&#039; );											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;JFM&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; J S T O R &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format a JSTOR with some error checking&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function jstor (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:find (&#039;[Jj][Ss][Tt][Oo][Rr]&#039;) or id:find (&#039;^https?://&#039;) or id:find (&#039;%s&#039;) then&lt;br /&gt;
		set_message (&#039;err_bad_jstor&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;JSTOR&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L C C N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format LCCN link and do simple error checking.  LCCN is a character string 8-12 characters long. The length of&lt;br /&gt;
the LCCN dictates the character type of the first 1-3 characters; the rightmost eight are always digits.&lt;br /&gt;
https://oclc-research.github.io/infoURI-Frozen/info-uri.info/info:lccn/reg.html&lt;br /&gt;
&lt;br /&gt;
length = 8 then all digits&lt;br /&gt;
length = 9 then lccn[1] is lowercase alpha&lt;br /&gt;
length = 10 then lccn[1] and lccn[2] are both lowercase alpha or both digits&lt;br /&gt;
length = 11 then lccn[1] is lower case alpha, lccn[2] and lccn[3] are both lowercase alpha or both digits&lt;br /&gt;
length = 12 then lccn[1] and lccn[2] are both lowercase alpha&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lccn (options)&lt;br /&gt;
	local lccn = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;																-- presume that LCCN is valid&lt;br /&gt;
	local id = lccn;															-- local copy of the LCCN&lt;br /&gt;
&lt;br /&gt;
	id = normalize_lccn (id);													-- get canonical form (no whitespace, hyphens, forward slashes)&lt;br /&gt;
	local len = id:len();														-- get the length of the LCCN&lt;br /&gt;
&lt;br /&gt;
	if 8 == len then&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then												-- if LCCN has anything but digits (nil if only digits)&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 9 == len then														-- LCCN should be adddddddd&lt;br /&gt;
		if nil == id:match(&amp;quot;%l%d%d%d%d%d%d%d%d&amp;quot;) then							-- does it match our pattern?&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 10 == len then														-- LCCN should be aadddddddd or dddddddddd&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then												-- if LCCN has anything but digits (nil if only digits) ...&lt;br /&gt;
			if nil == id:match(&amp;quot;^%l%l%d%d%d%d%d%d%d%d&amp;quot;) then					-- ... see if it matches our pattern&lt;br /&gt;
				err_flag = set_message (&#039;err_bad_lccn&#039;);						-- no match, set an error message&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif 11 == len then														-- LCCN should be aaadddddddd or adddddddddd&lt;br /&gt;
		if not (id:match(&amp;quot;^%l%l%l%d%d%d%d%d%d%d%d&amp;quot;) or id:match(&amp;quot;^%l%d%d%d%d%d%d%d%d%d%d&amp;quot;)) then	-- see if it matches one of our patterns&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 12 == len then														-- LCCN should be aadddddddddd&lt;br /&gt;
		if not id:match(&amp;quot;^%l%l%d%d%d%d%d%d%d%d%d%d&amp;quot;) then						-- see if it matches our pattern&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_lccn&#039;);								-- wrong length, set an error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) and nil ~= lccn:find (&#039;%s&#039;) then&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_lccn&#039;);								-- lccn contains a space, set an error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;LCCN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = lccn, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M E D R X I V &amp;gt;-----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format medRxiv ID and do simple error checking.  Similar to later bioRxiv IDs, medRxiv IDs are prefixed with a&lt;br /&gt;
yyyy.mm.dd. date and suffixed with an optional version identifier.  Ealiest date accepted is 2020.01.01&lt;br /&gt;
&lt;br /&gt;
The medRxiv ID is a date followed by an eight-digit number followed by an optional version indicator &#039;v&#039; and one or more digits:&lt;br /&gt;
	https://www.medrxiv.org/content/10.1101/2020.11.16.20232009v2 -&amp;gt; 10.1101/2020.11.16.20232009v2&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function medrxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_msg_flag = true;													-- flag; assume that there will be an error&lt;br /&gt;
&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;%d%d%d%d%d%d%d%d$&#039;,													-- simple 8-digit identifier; these should be relatively rare&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d%d%dv%d+$&#039;,			-- y.m.d. date + 8-digit identifier + version (2020-01-01 and later)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d%d%d$&#039;,				-- y.m.d. date + 8-digit identifier (2020-01-01 and later)&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	for _, pattern in ipairs (patterns) do										-- spin through the patterns looking for a match&lt;br /&gt;
		if id:match (pattern) then&lt;br /&gt;
			local y, m, d = id:match (pattern);									-- found a match, attempt to get year, month and date from the identifier&lt;br /&gt;
&lt;br /&gt;
			if m then															-- m is nil when id is the 8-digit form&lt;br /&gt;
				if not is_valid_rxiv_date (y, m, d, &#039;b&#039;) then					-- validate the encoded date; &#039;b&#039; for medrxiv limit&lt;br /&gt;
					break;														-- date fail; break out early so we don&#039;t unset the error message&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			err_msg_flag = nil;													-- we found a match so unset the error message&lt;br /&gt;
			break;																-- and done&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- &amp;lt;err_msg_flag&amp;gt; remains set here when no match&lt;br /&gt;
&lt;br /&gt;
	if err_msg_flag then&lt;br /&gt;
		options.coins_list_t[&#039;MEDRXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		set_message (&#039;err_bad_medrxiv&#039;);										-- and set the error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator,&lt;br /&gt;
			encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M R &amp;gt;--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A seven digit number; if not seven digits, zero-fill leading digits to make seven digits.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function mr (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local id_len;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Mm][Rr](%d+)$&#039;);										-- identifier with mr prefix&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_mr_format&#039;);										-- add maint cat&lt;br /&gt;
	else																		-- plain number without mr prefix&lt;br /&gt;
		id_num = id:match (&#039;^%d+$&#039;);											-- if here id is all digits&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	id_len = id_num and id_num:len() or 0;&lt;br /&gt;
	if (7 &amp;gt;= id_len) and (0 ~= id_len) then&lt;br /&gt;
		id = string.rep (&#039;0&#039;, 7-id_len) .. id_num;								-- zero-fill leading digits&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_mr&#039;);												-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;MR&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O C L C &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format an OCLC ID.  https://www.oclc.org/batchload/controlnumber.en.html {{dead link}}&lt;br /&gt;
archived at: https://web.archive.org/web/20161228233804/https://www.oclc.org/batchload/controlnumber.en.html&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function oclc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local number;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&#039;^ocm%d%d%d%d%d%d%d%d$&#039;) then									-- ocm prefix and 8 digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;ocm(%d+)&#039;);											-- get the number&lt;br /&gt;
	elseif id:match(&#039;^ocn%d%d%d%d%d%d%d%d%d$&#039;) then								-- ocn prefix and 9 digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;ocn(%d+)&#039;);											-- get the number&lt;br /&gt;
	elseif id:match(&#039;^on%d%d%d%d%d%d%d%d%d%d+$&#039;) then							-- on prefix and 10 or more digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;^on(%d%d%d%d%d%d%d%d%d%d+)$&#039;);						-- get the number&lt;br /&gt;
	elseif id:match(&#039;^%(OCoLC%)[1-9]%d*$&#039;) then									-- (OCoLC) prefix and variable number digits; no leading zeros; 035 field&lt;br /&gt;
		number = id:match(&#039;%(OCoLC%)([1-9]%d*)&#039;);								-- get the number&lt;br /&gt;
		if 9 &amp;lt; number:len() then&lt;br /&gt;
			number = nil;														-- constrain to 1 to 9 digits; change this when OCLC issues 10-digit numbers&lt;br /&gt;
		end&lt;br /&gt;
	elseif id:match(&#039;^%d+$&#039;) then												-- no prefix&lt;br /&gt;
		number = id;															-- get the number&lt;br /&gt;
		if tonumber (id) &amp;gt; handler.id_limit then&lt;br /&gt;
			number = nil;														-- unset when id value exceeds the limit&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if number then																-- proper format&lt;br /&gt;
		id = number;															-- exclude prefix, if any, from external link&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_oclc&#039;)											-- add an error message if the id is malformed&lt;br /&gt;
		options.coins_list_t[&#039;OCLC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O P E N L I B R A R Y &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats an OpenLibrary link, and checks for associated errors.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function openlibrary (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ident, code = id:gsub(&#039;^OL&#039;, &#039;&#039;):match(&amp;quot;^(%d+([AMW]))$&amp;quot;);				-- strip optional OL prefix followed immediately by digits followed by &#039;A&#039;, &#039;M&#039;, or &#039;W&#039;;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
	local prefix = {															-- these are appended to the handler.prefix according to code&lt;br /&gt;
		[&#039;A&#039;]=&#039;authors/OL&#039;,&lt;br /&gt;
		[&#039;M&#039;]=&#039;books/OL&#039;,&lt;br /&gt;
		[&#039;W&#039;]=&#039;works/OL&#039;,&lt;br /&gt;
		[&#039;X&#039;]=&#039;OL&#039;																-- not a code; spoof when &#039;code&#039; in id is invalid&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	if not ident then&lt;br /&gt;
		code = &#039;X&#039;;																-- no code or id completely invalid&lt;br /&gt;
		ident = id;																-- copy id to ident so that we display the flawed identifier&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_ol&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;OL&#039;] = handler.prefix .. prefix[code] .. ident;	-- experiment for ol coins&lt;br /&gt;
	else&lt;br /&gt;
		options.coins_list_t[&#039;OL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix .. prefix[code],&lt;br /&gt;
		id = ident, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O S T I &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format OSTI and do simple error checking. OSTIs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the OSTI to see that it contains only digits and is less than test_limit specified in the configuration;&lt;br /&gt;
the value in test_limit will need to be updated periodically as more OSTIs are issued.&lt;br /&gt;
&lt;br /&gt;
NB. 1018 is the lowest OSTI number found in the wild (so far) and resolving OK on the OSTI site&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function osti (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if OSTI has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_osti&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;OSTI&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- OSTI is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1018 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then						-- if OSTI is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_osti&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;OSTI&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P M C &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format a PMC, do simple error checking, and check for embargoed articles.&lt;br /&gt;
&lt;br /&gt;
The embargo parameter takes a date for a value. If the embargo date is in the future the PMC identifier will not&lt;br /&gt;
be linked to the article.  If the embargo date is today or in the past, or if it is empty or omitted, then the&lt;br /&gt;
PMC identifier is linked to the article through the link at cfg.id_handlers[&#039;PMC&#039;].prefix.&lt;br /&gt;
&lt;br /&gt;
PMC embargo date testing is done in function is_embargoed () which is called earlier because when the citation&lt;br /&gt;
has |pmc=&amp;lt;value&amp;gt; but does not have a |url= then |title= is linked with the PMC link.  Function is_embargoed ()&lt;br /&gt;
returns the embargo date if the PMC article is still embargoed, otherwise it returns an empty string.&lt;br /&gt;
&lt;br /&gt;
PMCs are sequential numbers beginning at 1 and counting up.  This code checks the PMC to see that it contains only digits and is less&lt;br /&gt;
than test_limit; the value in local variable test_limit will need to be updated periodically as more PMCs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function pmc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local embargo = options.Embargo;											-- TODO: lowercase?&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Pp][Mm][Cc](%d+)$&#039;);									-- identifier with PMC prefix&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_pmc_format&#039;);&lt;br /&gt;
	else																		-- plain number without PMC prefix&lt;br /&gt;
		id_num = id:match (&#039;^%d+$&#039;);											-- if here id is all digits&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if PMC is outside test limit boundaries&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_pmc&#039;);								-- set an error message&lt;br /&gt;
		else&lt;br /&gt;
			id = tostring (id_num);												-- make sure id is a string&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_pmc&#039;);									-- set an error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if is_set (embargo) and is_set (is_embargoed (embargo)) then				-- is PMC is still embargoed?&lt;br /&gt;
		text = table.concat (													-- still embargoed so no external link&lt;br /&gt;
			{&lt;br /&gt;
			make_wikilink (link_label_make (handler), handler.label),&lt;br /&gt;
			handler.separator,&lt;br /&gt;
			id,&lt;br /&gt;
			});&lt;br /&gt;
	else&lt;br /&gt;
		text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,	-- no embargo date or embargo has expired, ok to link to article&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access,&lt;br /&gt;
			auto_link = not err_flag and &#039;pmc&#039; or nil							-- do not auto-link when PMC has error&lt;br /&gt;
			});&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_flag then&lt;br /&gt;
		options.coins_list_t[&#039;PMC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P M I D &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format PMID and do simple error checking.  PMIDs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the PMID to see that it contains only digits and is less than test_limit; the value in local variable&lt;br /&gt;
test_limit will need to be updated periodically as more PMIDs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function pmid (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if PMID has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_pmid&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;PMID&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- PMID is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if PMID is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_pmid&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;PMID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R F C &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format RFC and do simple error checking. RFCs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the RFC to see that it contains only digits and is less than test_limit specified in the configuration;&lt;br /&gt;
the value in test_limit will need to be updated periodically as more RFCs are issued.&lt;br /&gt;
&lt;br /&gt;
An index of all RFCs is here: https://tools.ietf.org/rfc/&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function rfc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if RFC has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_rfc&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;RFC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- RFC is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if RFC is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_rfc&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;RFC&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S 2 C I D &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format an S2CID, do simple error checking&lt;br /&gt;
&lt;br /&gt;
S2CIDs are sequential numbers beginning at 1 and counting up.  This code checks the S2CID to see that it is only&lt;br /&gt;
digits and is less than test_limit; the value in local variable test_limit will need to be updated periodically&lt;br /&gt;
as more S2CIDs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function s2cid (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
	&lt;br /&gt;
	id_num = id:match (&#039;^[1-9]%d*$&#039;);											-- id must be all digits; must not begin with 0; no open access flag&lt;br /&gt;
&lt;br /&gt;
 	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if handler.id_limit &amp;lt; id_num then										-- if S2CID is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_s2cid&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;S2CID&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		set_message (&#039;err_bad_s2cid&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;S2CID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S B N &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
9-digit form of ISBN-10; uses same check-digit validation when SBN is prefixed with an additional &#039;0&#039; to make 10 digits&lt;br /&gt;
&lt;br /&gt;
sbn value not made part of COinS metadata because we don&#039;t have a url or isn&#039;t a COinS-defined identifier (rft.xxx)&lt;br /&gt;
or an identifier registered at info-uri.info (info:)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function sbn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local function return_result (check, err_type)								-- local function to handle the various returns&lt;br /&gt;
		local SBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect,&lt;br /&gt;
						prefix = handler.prefix, id = id, separator = handler.separator});&lt;br /&gt;
		if not ignore_invalid then												-- if not ignoring SBN errors&lt;br /&gt;
			if not check then&lt;br /&gt;
				options.coins_list_t[&#039;SBN&#039;] = nil;								-- when error, unset so not included in COinS; not really necessary here because sbn not made part of COinS&lt;br /&gt;
				set_message (&#039;err_bad_sbn&#039;, {err_type});						-- display an error message&lt;br /&gt;
				return SBN; &lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;maint_isbn_ignore&#039;);									-- add a maint category even when there is no error (ToDo: Possibly switch to separate message for SBNs only)&lt;br /&gt;
		end&lt;br /&gt;
		return SBN;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if id:match (&#039;[^%s-0-9X]&#039;) then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.char);					-- fail if SBN contains anything but digits, hyphens, or the uppercase X&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ident = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);										-- remove hyphens and whitespace; they interfere with the rest of the tests&lt;br /&gt;
&lt;br /&gt;
	if  9 ~= ident:len() then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.length);					-- fail if incorrect length&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ident:match (&#039;^%d*X?$&#039;) == nil then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.form);					-- fail if SBN has &#039;X&#039; anywhere but last position&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return return_result (is_valid_isxn (&#039;0&#039; .. ident, 10), cfg.err_msg_supl.check);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S S R N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format an SSRN, do simple error checking&lt;br /&gt;
&lt;br /&gt;
SSRNs are sequential numbers beginning at 100? and counting up.  This code checks the SSRN to see that it is&lt;br /&gt;
only digits and is greater than 99 and less than test_limit; the value in local variable test_limit will need&lt;br /&gt;
to be updated periodically as more SSRNs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ssrn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
	&lt;br /&gt;
	id_num = id:match (&#039;^%d+$&#039;);												-- id must be all digits&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if 100 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then						-- if SSRN is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_ssrn&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;SSRN&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		set_message (&#039;err_bad_ssrn&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;SSRN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = options.access});&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; U S E N E T _ I D &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format a usenet message id.  Simple error checking, looks for &#039;id-left@id-right&#039; not enclosed in&lt;br /&gt;
&#039;&amp;lt;&#039; and/or &#039;&amp;gt;&#039; angle brackets.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function usenet_id (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
 &lt;br /&gt;
	if not id:match(&#039;^.+@.+$&#039;) or not id:match(&#039;^[^&amp;lt;].*[^&amp;gt;]$&#039;) then				-- doesn&#039;t have &#039;@&#039; or has one or first or last character is &#039;&amp;lt; or &#039;&amp;gt;&#039;&lt;br /&gt;
		set_message (&#039;err_bad_usenet_id&#039;)										-- add an error message if the message id is invalid&lt;br /&gt;
		options.coins_list_t[&#039;USENETID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Z B L &amp;gt;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A numerical identifier in the form nnnn.nnnnn - leading zeros in the first quartet optional&lt;br /&gt;
&lt;br /&gt;
format described here: http://emis.mi.sanu.ac.rs/ZMATH/zmath/en/help/search/&lt;br /&gt;
&lt;br /&gt;
temporary format is apparently eight digits.  Anything else is an error&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function zbl (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&#039;^%d%d%d%d%d%d%d%d$&#039;) then										-- is this identifier using temporary format?&lt;br /&gt;
		set_message (&#039;maint_zbl&#039;);												-- yes, add maint cat&lt;br /&gt;
	elseif not id:match(&#039;^%d?%d?%d?%d%.%d%d%d%d%d$&#039;) then						-- not temporary, is it normal format?&lt;br /&gt;
		set_message (&#039;err_bad_zbl&#039;);											-- no, set an error message&lt;br /&gt;
		options.coins_list_t[&#039;ZBL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; I N T E R F A C E   F U N C T I O N S &amp;gt;&amp;gt;==========================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T R A C T _ I D S &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates ID table from arguments using configuration settings. Loops through cfg.id_handlers and searches args for&lt;br /&gt;
any of the parameters listed in each cfg.id_handlers[&#039;...&#039;].parameters.  If found, adds the parameter and value to&lt;br /&gt;
the identifier list.  Emits redundant error message if more than one alias exists in args&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extract_ids (args)&lt;br /&gt;
	local id_list = {};															-- list of identifiers found in args&lt;br /&gt;
	for k, v in pairs (cfg.id_handlers) do										-- k is uppercase identifier name as index to cfg.id_handlers; e.g. cfg.id_handlers[&#039;ISBN&#039;], v is a table&lt;br /&gt;
		v = select_one (args, v.parameters, &#039;err_redundant_parameters&#039; );		-- v.parameters is a table of aliases for k; here we pick one from args if present&lt;br /&gt;
		if is_set (v) then id_list[k] = v; end									-- if found in args, add identifier to our list&lt;br /&gt;
	end&lt;br /&gt;
	return id_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T R A C T _ I D _ A C C E S S _ L E V E L S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Fetches custom id access levels from arguments using configuration settings. Parameters which have a predefined access&lt;br /&gt;
level (e.g. arxiv) do not use this function as they are directly rendered as free without using an additional parameter.&lt;br /&gt;
&lt;br /&gt;
returns a table of k/v pairs where k is same as the identifier&#039;s key in cfg.id_handlers and v is the assigned (valid) keyword&lt;br /&gt;
&lt;br /&gt;
access-level values must match the case used in cfg.keywords_lists[&#039;id-access&#039;] (lowercase unless there is some special reason for something else)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extract_id_access_levels (args, id_list)&lt;br /&gt;
	local id_accesses_list = {};&lt;br /&gt;
	for k, v in pairs (cfg.id_handlers) do&lt;br /&gt;
		local access_param = v.custom_access;									-- name of identifier&#039;s access-level parameter&lt;br /&gt;
		if is_set (access_param) then&lt;br /&gt;
			local access_level = args[access_param];							-- get the assigned value if there is one&lt;br /&gt;
			if is_set (access_level) then&lt;br /&gt;
				if not in_array (access_level, cfg.keywords_lists[&#039;id-access&#039;]) then	-- exact match required&lt;br /&gt;
					set_message (&#039;err_invalid_param_val&#039;, {access_param, access_level});	&lt;br /&gt;
					access_level = nil;											-- invalid so unset&lt;br /&gt;
				end&lt;br /&gt;
				if not is_set (id_list[k]) then									-- identifier access-level must have a matching identifier&lt;br /&gt;
					set_message (&#039;err_param_access_requires_param&#039;, {k:lower()});	-- parameter name is uppercase in cfg.id_handlers (k); lowercase for error message&lt;br /&gt;
				end&lt;br /&gt;
				id_accesses_list[k] = cfg.keywords_xlate[access_level];			-- get translated keyword&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return id_accesses_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B U I L D _ I D _ L I S T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
render the identifiers into a sorted sequence table&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ID_list_coins_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value&lt;br /&gt;
&amp;lt;options_t&amp;gt; is a table of various k/v option pairs provided in the call to new_build_id_list();&lt;br /&gt;
	modified by	this function and passed to all identifier rendering functions&lt;br /&gt;
&amp;lt;access_levels_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value (if valid)&lt;br /&gt;
&lt;br /&gt;
returns a sequence table of sorted (by hkey - &#039;handler&#039; key) rendered identifier strings&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function build_id_list (ID_list_coins_t, options_t, access_levels_t)&lt;br /&gt;
	local ID_list_t = {};&lt;br /&gt;
	local accept;&lt;br /&gt;
	local func_map = {															--function map points to functions associated with hkey identifier&lt;br /&gt;
		[&#039;ARXIV&#039;] = arxiv,&lt;br /&gt;
		[&#039;ASIN&#039;] = asin,&lt;br /&gt;
		[&#039;BIBCODE&#039;] = bibcode,&lt;br /&gt;
		[&#039;BIORXIV&#039;] = biorxiv,&lt;br /&gt;
		[&#039;CITESEERX&#039;] = citeseerx,&lt;br /&gt;
		[&#039;DOI&#039;] = doi,&lt;br /&gt;
		[&#039;EISSN&#039;] = issn,&lt;br /&gt;
		[&#039;HDL&#039;] = hdl,&lt;br /&gt;
		[&#039;ISBN&#039;] = isbn,&lt;br /&gt;
		[&#039;ISMN&#039;] = ismn,&lt;br /&gt;
		[&#039;ISSN&#039;] = issn,&lt;br /&gt;
		[&#039;JFM&#039;] = jfm,&lt;br /&gt;
		[&#039;JSTOR&#039;] = jstor,&lt;br /&gt;
		[&#039;LCCN&#039;] = lccn,&lt;br /&gt;
		[&#039;MEDRXIV&#039;] = medrxiv,&lt;br /&gt;
		[&#039;MR&#039;] = mr,&lt;br /&gt;
		[&#039;OCLC&#039;] = oclc,&lt;br /&gt;
		[&#039;OL&#039;] = openlibrary,&lt;br /&gt;
		[&#039;OSTI&#039;] = osti,&lt;br /&gt;
		[&#039;PMC&#039;] = pmc,&lt;br /&gt;
		[&#039;PMID&#039;] = pmid,&lt;br /&gt;
		[&#039;RFC&#039;]  = rfc,&lt;br /&gt;
		[&#039;S2CID&#039;] = s2cid,&lt;br /&gt;
		[&#039;SBN&#039;] = sbn,&lt;br /&gt;
		[&#039;SSRN&#039;] = ssrn,&lt;br /&gt;
		[&#039;USENETID&#039;] = usenet_id,&lt;br /&gt;
		[&#039;ZBL&#039;] = zbl,&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	for hkey, v in pairs (ID_list_coins_t) do&lt;br /&gt;
		v, accept = has_accept_as_written (v);									-- remove accept-as-written markup if present; accept is boolean true when markup removed; false else&lt;br /&gt;
																				-- every function gets the options table with value v and accept boolean&lt;br /&gt;
		options_t.hkey = hkey;													-- ~/Configuration handler key&lt;br /&gt;
		options_t.id = v;														-- add that identifier value to the options table&lt;br /&gt;
		options_t.accept = accept;												-- add the accept boolean flag&lt;br /&gt;
		options_t.access = access_levels_t[hkey];								-- add the access level for those that have an |&amp;lt;identifier-access= parameter&lt;br /&gt;
		options_t.handler = cfg.id_handlers[hkey];&lt;br /&gt;
		options_t.coins_list_t = ID_list_coins_t;								-- pointer to ID_list_coins_t; for |asin= and |ol=; also to keep erroneous values out of the citation&#039;s metadata&lt;br /&gt;
		options_t.coins_list_t[hkey] = v;										-- id value without accept-as-written markup for metadata&lt;br /&gt;
		&lt;br /&gt;
		if options_t.handler.access and not in_array (options_t.handler.access, cfg.keywords_lists[&#039;id-access&#039;]) then&lt;br /&gt;
			error (cfg.messages[&#039;unknown_ID_access&#039;] .. options_t.handler.access);	-- here when handler access key set to a value not listed in list of allowed id access keywords&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if func_map[hkey] then&lt;br /&gt;
			local id_text = func_map[hkey] (options_t);							-- call the function to get identifier text and any error message&lt;br /&gt;
			table.insert (ID_list_t, {hkey, id_text});							-- add identifier text to the output sequence table&lt;br /&gt;
		else&lt;br /&gt;
			error (cfg.messages[&#039;unknown_ID_key&#039;] .. hkey);						-- here when func_map doesn&#039;t have a function for hkey&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function comp (a, b)													-- used by following table.sort()&lt;br /&gt;
		return a[1]:lower() &amp;lt; b[1]:lower();										-- sort by hkey&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort (ID_list_t, comp);												-- sequence table of tables sort	&lt;br /&gt;
	for k, v in ipairs (ID_list_t) do											-- convert sequence table of tables to simple sequence table of strings&lt;br /&gt;
		ID_list_t[k] = v[2];													-- v[2] is the identifier rendering from the call to the various functions in func_map{}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ID_list_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O P T I O N S _ C H E C K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
check that certain option parameters have their associated identifier parameters with values&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ID_list_coins_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value&lt;br /&gt;
&amp;lt;ID_support_t&amp;gt; is a sequence table of tables created in citation0() where each subtable has four elements:&lt;br /&gt;
	[1] is the support parameter&#039;s assigned value; empty string if not set&lt;br /&gt;
	[2] is a text string same as key in cfg.id_handlers&lt;br /&gt;
	[3] is cfg.error_conditions key used to create error message&lt;br /&gt;
	[4] is original ID support parameter name used to create error message&lt;br /&gt;
	&lt;br /&gt;
returns nothing; on error emits an appropriate error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function options_check (ID_list_coins_t, ID_support_t)&lt;br /&gt;
	for _, v in ipairs (ID_support_t) do&lt;br /&gt;
		if is_set (v[1]) and not ID_list_coins_t[v[2]] then						-- when support parameter has a value but matching identifier parameter is missing or empty&lt;br /&gt;
			set_message (v[3], (v[4]));											-- emit the appropriate error message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I D E N T I F I E R _ L I S T S _ G E T &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Creates two identifier lists: a k/v table of identifiers and their values to be used locally and for use in the&lt;br /&gt;
COinS metadata, and a sequence table of the rendered identifier strings that will be included in the rendered&lt;br /&gt;
citation.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function identifier_lists_get (args_t, options_t, ID_support_t)&lt;br /&gt;
	local ID_list_coins_t = extract_ids (args_t);										-- get a table of identifiers and their values for use locally and for use in COinS&lt;br /&gt;
	options_check (ID_list_coins_t, ID_support_t);										-- ID support parameters must have matching identifier parameters &lt;br /&gt;
	local ID_access_levels_t = extract_id_access_levels (args_t, ID_list_coins_t);		-- get a table of identifier access levels&lt;br /&gt;
	local ID_list_t = build_id_list (ID_list_coins_t, options_t, ID_access_levels_t);	-- get a sequence table of rendered identifier strings&lt;br /&gt;
&lt;br /&gt;
	return ID_list_t, ID_list_coins_t;											-- return the tables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
&lt;br /&gt;
	has_accept_as_written = utilities_page_ptr.has_accept_as_written;			-- import functions from select Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;								&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	set_message = utilities_page_ptr.set_message;&lt;br /&gt;
	select_one = utilities_page_ptr.select_one;&lt;br /&gt;
	substitute = utilities_page_ptr.substitute;&lt;br /&gt;
	make_wikilink = utilities_page_ptr.make_wikilink;&lt;br /&gt;
&lt;br /&gt;
	z = utilities_page_ptr.z;													-- table of tables in Module:Citation/CS1/Utilities&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	auto_link_urls = auto_link_urls,											-- table of identifier URLs to be used when auto-linking |title=&lt;br /&gt;
	&lt;br /&gt;
	identifier_lists_get = identifier_lists_get,								-- experiment to replace individual calls to build_id_list(), extract_ids, extract_id_access_levels&lt;br /&gt;
	is_embargoed = is_embargoed;&lt;br /&gt;
	set_selected_modules = set_selected_modules;&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=1507</id>
		<title>Module:Citation/CS1/Date validation</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=1507"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style;		-- imported functions from selected Module:Citation/CS1/Utilities&lt;br /&gt;
local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F I L E - S C O P E   D E C L A R A T I O N S &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
File-scope variables are declared here&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local lang_object = mw.getContentLanguage();									-- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?&lt;br /&gt;
local year_limit;																-- used by is_valid_year()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ V A L I D _ A C C E S S D A T E &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true if:&lt;br /&gt;
	Wikipedia start date &amp;lt;= accessdate &amp;lt; today + 2 days&lt;br /&gt;
&lt;br /&gt;
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)&lt;br /&gt;
accessdate is the date provided in |access-date= at time 00:00:00 UTC&lt;br /&gt;
today is the current date at time 00:00:00 UTC plus 48 hours&lt;br /&gt;
	if today is 2015-01-01T00:00:00 then&lt;br /&gt;
		adding 24 hours gives 2015-01-02T00:00:00 – one second more than today&lt;br /&gt;
		adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow&lt;br /&gt;
&lt;br /&gt;
This function does not work if it is fed month names for languages other than English.  Wikimedia #time: parser&lt;br /&gt;
apparently doesn&#039;t understand non-English date month names. This function will always return false when the date&lt;br /&gt;
contains a non-English month name because good1 is false after the call to lang.formatDate().  To get around that&lt;br /&gt;
call this function with YYYY-MM-DD format dates.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_accessdate (accessdate)&lt;br /&gt;
	local good1, good2;&lt;br /&gt;
	local access_ts, tomorrow_ts;												-- to hold Unix time stamps representing the dates&lt;br /&gt;
&lt;br /&gt;
	good1, access_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, accessdate );			-- convert accessdate value to Unix timestamp &lt;br /&gt;
	good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, &#039;today + 2 days&#039; );	-- today midnight + 2 days is one second more than all day tomorrow&lt;br /&gt;
	&lt;br /&gt;
	if good1 and good2 then														-- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand&lt;br /&gt;
		access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts);		-- convert to numbers for the comparison;&lt;br /&gt;
		tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- one or both failed to convert to Unix time stamp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 979516800 &amp;lt;= access_ts and access_ts &amp;lt; tomorrow_ts then					-- Wikipedia start date &amp;lt;= accessdate &amp;lt; tomorrow&#039;s date&lt;br /&gt;
		return true;&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- accessdate out of range&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ M O N T H _ N U M B E R &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the month in a date: 1 for January, etc.  Capitalization and spelling must be correct.&lt;br /&gt;
If not a valid month, returns 0&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_month_number (month)&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].long[month] or cfg.date_names[&#039;local&#039;].short[month] or	-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].long[month] or	cfg.date_names[&#039;en&#039;].short[month] or		-- failing that, look for English names&lt;br /&gt;
			0;																				-- not a recognized month name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ S E A S O N _ N U M B E R &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the sequence of seasons in a year: 21 for Spring, etc.  Capitalization and spelling&lt;br /&gt;
must be correct. If not a valid season, returns 0.&lt;br /&gt;
	21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)&lt;br /&gt;
which became part of ISO 8601 in 2019.  See &#039;§Sub-year groupings&#039;.  The standard defines various divisions using&lt;br /&gt;
numbers 21-41.  cs1|2 only supports generic seasons.  EDTF does support the distinction between north and south&lt;br /&gt;
hemisphere seasons but cs1|2 has no way to make that distinction.&lt;br /&gt;
&lt;br /&gt;
These additional divisions not currently supported:&lt;br /&gt;
	25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere&lt;br /&gt;
	29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere&lt;br /&gt;
	33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)&lt;br /&gt;
	37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)&lt;br /&gt;
	40-41 = Semestral 1, Semestral-2 (6 months each)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_season_number (season, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- season dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].season[season] or							-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].season[season] or								-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized season name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ Q U A R T E R _ N U M B E R &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc.  Capitalization and spelling&lt;br /&gt;
must be correct. If not a valid quarter, returns 0.&lt;br /&gt;
	33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)&lt;br /&gt;
which became part of ISO 8601 in 2019.  See &#039;§Sub-year groupings&#039;.  The standard defines various divisions using&lt;br /&gt;
numbers 21-41.  cs1|2 only supports generic seasons and quarters.&lt;br /&gt;
&lt;br /&gt;
These additional divisions not currently supported:&lt;br /&gt;
	37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)&lt;br /&gt;
	40-41 = Semestral 1, Semestral-2 (6 months each)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_quarter_number (quarter, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- quarter dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	quarter = mw.ustring.gsub (quarter, &#039; +&#039;, &#039; &#039;);								-- special case replace multiple space chars with a single space char&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].quarter[quarter] or							-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].quarter[quarter] or							-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized quarter name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ P R O P E R _ N A M E _ N U M B E R &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a non-zero number if date contains a recognized proper-name.  Capitalization and spelling must be correct.&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_proper_name_number (name, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- proper-name dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].named[name] or								-- look for local names dates first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].named[name] or									-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized named date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ E L E M E N T _ N U M B E R &amp;lt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_element_number (element, param)&lt;br /&gt;
	local num;&lt;br /&gt;
	&lt;br /&gt;
	local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number};	-- list of functions to execute in order&lt;br /&gt;
	&lt;br /&gt;
	for _, func in ipairs (funcs) do											-- spin through the function list&lt;br /&gt;
		num = func (element, param);											-- call the function and get the returned number&lt;br /&gt;
		if 0 ~= num then														-- non-zero when valid month season quarter &lt;br /&gt;
			return num;															-- return that number&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil;																	-- not valid&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ Y E A R &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Function gets current year from the server and compares it to year from a citation parameter.  Years more than one&lt;br /&gt;
year in the future are not acceptable.&lt;br /&gt;
&lt;br /&gt;
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_year (year, param)&lt;br /&gt;
	if not is_set (year_limit) then&lt;br /&gt;
		year_limit = tonumber(os.date(&amp;quot;%Y&amp;quot;))+1;									-- global variable so we only have to fetch it once&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	year = tonumber (year) or lang_object:parseFormattedNumber (year);			-- convert to number for the comparison&lt;br /&gt;
	if year and (100 &amp;gt; year) then												-- years less than 100 not supported&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if &#039;pmc-embargo-date&#039; == param then											-- special case for |pmc-embargo-date=&lt;br /&gt;
		return year and (year &amp;lt;= tonumber(os.date(&amp;quot;%Y&amp;quot;))+2) or false;			-- years more than two years in the future are not accepted&lt;br /&gt;
	end	&lt;br /&gt;
	return year and (year &amp;lt;= year_limit) or false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ D A T E &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if day is less than or equal to the number of days in month and year is no farther into the future&lt;br /&gt;
than next year; else returns false.&lt;br /&gt;
&lt;br /&gt;
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap&lt;br /&gt;
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately&lt;br /&gt;
1923) dates are assumed to be Gregorian.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_date (year, month, day, param)&lt;br /&gt;
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};&lt;br /&gt;
local month_length;&lt;br /&gt;
	if not is_valid_year (year, param) then										-- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	month = tonumber (month);													-- required for YYYY-MM-DD dates&lt;br /&gt;
	&lt;br /&gt;
	if (2 == month) then														-- if February&lt;br /&gt;
		month_length = 28;														-- then 28 days unless&lt;br /&gt;
		if 1582 &amp;gt; tonumber(year) then											-- Julian calendar&lt;br /&gt;
			if 0 == (year%4) then												-- is a leap year?&lt;br /&gt;
				month_length = 29;												-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- Gregorian calendar&lt;br /&gt;
			if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then	-- is a leap year?&lt;br /&gt;
				month_length = 29;												-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month_length = days_in_month[month];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber (day) &amp;gt; month_length then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E &amp;gt;--------------------------&lt;br /&gt;
&lt;br /&gt;
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August. &lt;br /&gt;
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are&lt;br /&gt;
listed in the short subtable.  When both have the same style (both are listed in the same table), returns true; false else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_month_range_style (month1, month2)&lt;br /&gt;
	if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or					-- are both English names listed in the long subtable?&lt;br /&gt;
		(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or				-- are both English names listed in the short subtable?&lt;br /&gt;
		(cfg.date_names[&#039;local&#039;].long[month1] and cfg.date_names[&#039;local&#039;].long[month2]) or		-- are both local names listed in the long subtable?&lt;br /&gt;
		(cfg.date_names[&#039;local&#039;].short[month1] and cfg.date_names[&#039;local&#039;].short[month2]) then	-- are both local names listed in the short subtable?&lt;br /&gt;
			return true;&lt;br /&gt;
	end&lt;br /&gt;
	return false;																-- names are mixed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E &amp;gt;------------------------&lt;br /&gt;
&lt;br /&gt;
Check a pair of months or seasons to see if both are valid members of a month or season pair.&lt;br /&gt;
&lt;br /&gt;
Month pairs are expected to be left to right, earliest to latest in time.&lt;br /&gt;
&lt;br /&gt;
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_month_season_range(range_start, range_end, param)&lt;br /&gt;
	local range_start_number = get_month_number (range_start);&lt;br /&gt;
	local range_end_number;&lt;br /&gt;
&lt;br /&gt;
	if 0 == range_start_number then												-- is this a month range?&lt;br /&gt;
		range_start_number = get_season_number (range_start, param);			-- not a month; is it a season? get start season number&lt;br /&gt;
		range_end_number = get_season_number (range_end, param);				-- get end season number&lt;br /&gt;
&lt;br /&gt;
		if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then&lt;br /&gt;
			return true;														-- any season pairing is accepted except when both are the same&lt;br /&gt;
		end&lt;br /&gt;
		return false;															-- range_start and/or range_end is not a season&lt;br /&gt;
	end&lt;br /&gt;
																				-- here when range_start is a month&lt;br /&gt;
	range_end_number = get_month_number (range_end);							-- get end month number&lt;br /&gt;
	if range_start_number &amp;lt; range_end_number and								-- range_start is a month; does range_start precede range_end?&lt;br /&gt;
		is_valid_month_range_style (range_start, range_end) then				-- do months have the same style?&lt;br /&gt;
			return true;														-- proper order and same style&lt;br /&gt;
	end&lt;br /&gt;
	return false;																-- range_start month number is greater than or equal to range end number; or range end isn&#039;t a month&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ C O I N S _ D A T E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function receives a table of date parts for one or two dates and an empty table reference declared in&lt;br /&gt;
Module:Citation/CS1.  The function is called only for |date= parameters and only if the |date=&amp;lt;value&amp;gt; is &lt;br /&gt;
determined to be a valid date format.  The question of what to do with invalid date formats is not answered here.&lt;br /&gt;
&lt;br /&gt;
The date parts in the input table are converted to an ISO 8601 conforming date string:&lt;br /&gt;
	single whole dates:		yyyy-mm-dd&lt;br /&gt;
	month and year dates:	yyyy-mm&lt;br /&gt;
	year dates:				yyyy&lt;br /&gt;
	ranges:					yyyy-mm-dd/yyyy-mm-dd&lt;br /&gt;
							yyyy-mm/yyyy-mm&lt;br /&gt;
							yyyy/yyyy&lt;br /&gt;
&lt;br /&gt;
Dates in the Julian calendar are reduced to year or year/year so that we don&#039;t have to do calendar conversion from&lt;br /&gt;
Julian to Proleptic Gregorian.&lt;br /&gt;
&lt;br /&gt;
The input table has:&lt;br /&gt;
	year, year2 – always present; if before 1582, ignore months and days if present&lt;br /&gt;
	month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas&lt;br /&gt;
	day, day2 –  0 if not provided, 1-31 for days&lt;br /&gt;
	&lt;br /&gt;
the output table receives:&lt;br /&gt;
	rftdate:	an ISO 8601 formatted date&lt;br /&gt;
	rftchron:	a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)&lt;br /&gt;
	rftssn:		one of four season keywords: winter, spring, summer, fall (lowercase)&lt;br /&gt;
	rftquarter:	one of four values: 1, 2, 3, 4&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_COinS_date (input, tCOinS_date)&lt;br /&gt;
	local date;																	-- one date or first date in a range&lt;br /&gt;
	local date2 = &#039;&#039;;															-- end of range date&lt;br /&gt;
	input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year);	-- language-aware tonumber()&lt;br /&gt;
	input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2);	-- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals&lt;br /&gt;
&lt;br /&gt;
	if ((1582 == input.year) and (10 &amp;gt; tonumber(input.month))) or (1582 &amp;gt; input.year) then	-- if a Julian calendar date&lt;br /&gt;
		tCOinS_date.rftdate = tostring (input.year);							-- &amp;amp;rft.date gets year only&lt;br /&gt;
		return;																	-- done&lt;br /&gt;
	end&lt;br /&gt;
																				-- here for all forms of Gregorian dates&lt;br /&gt;
	if 20 &amp;lt; tonumber (input.month) then											-- if season, quarter, or proper-name date&lt;br /&gt;
		date = input.year;														-- &amp;amp;rft.date gets year only&lt;br /&gt;
		if 0 ~= input.year2 and input.year ~= input.year2 then					-- if a range, only the second year portion when not the same as range start year&lt;br /&gt;
			date = string.format (&#039;%.4d/%.4d&#039;, input.year, input.year2)			-- assemble the date range&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local season = {[24] = &#039;winter&#039;, [21] = &#039;spring&#039;, [22] = &#039;summer&#039;, [23] = &#039;fall&#039;, [33] = &#039;1&#039;, [34] = &#039;2&#039;, [35] = &#039;3&#039;, [36] = &#039;4&#039;, [98] = &#039;Easter&#039;, [99] = &#039;Christmas&#039;};	-- seasons lowercase, no autumn; proper-names use title case&lt;br /&gt;
		if 0 == input.month2 then												-- single season, quarter, or proper-name date&lt;br /&gt;
			if 40 &amp;lt; tonumber(input.month) then&lt;br /&gt;
				tCOinS_date.rftchron = season[input.month];						-- proper-name date; used in journal metadata only&lt;br /&gt;
			elseif 30 &amp;lt; tonumber(input.month) then&lt;br /&gt;
				tCOinS_date.rftquarter = season[input.month];					-- quarter date; used in journal metadata only&lt;br /&gt;
			else&lt;br /&gt;
				tCOinS_date.rftssn = season[input.month];						-- season date; used in journal metadata only&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- season ranges are lumped into &amp;amp;rft.chron; &amp;amp;rft.ssn and &amp;amp;rft.quarter are left blank&lt;br /&gt;
			if input.year ~= input.year2 then									-- season year – season year range or season year–year&lt;br /&gt;
				if 0 ~= input.month2 then&lt;br /&gt;
					tCOinS_date.rftchron = string.format (&#039;%s %s – %s %s&#039;, season[input.month], input.year, season[input.month2], input.year2);	-- used in journal metadata only&lt;br /&gt;
				end&lt;br /&gt;
			else																-- season–season year range&lt;br /&gt;
				tCOinS_date.rftchron = season[input.month] .. &#039;–&#039; .. season[input.month2];	-- season–season year range; used in journal metadata only&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		tCOinS_date.rftdate = tostring (date);&lt;br /&gt;
		return;																	-- done&lt;br /&gt;
	end&lt;br /&gt;
																				-- here for gregorian calendar dates&lt;br /&gt;
	if 0 ~= input.day then&lt;br /&gt;
		date = string.format (&#039;%s-%.2d-%.2d&#039;, input.year, tonumber(input.month), tonumber(input.day));	-- whole date&lt;br /&gt;
	elseif 0 ~= input.month then&lt;br /&gt;
		date = string.format (&#039;%s-%.2d&#039;, input.year, tonumber(input.month));	-- year and month&lt;br /&gt;
	else&lt;br /&gt;
		date = string.format (&#039;%s&#039;, input.year);								-- just year&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 0 ~= input.year2 then&lt;br /&gt;
		if 0 ~= input.day2 then&lt;br /&gt;
			date2 = string.format (&#039;/%s-%.2d-%.2d&#039;, input.year2, tonumber(input.month2), tonumber(input.day2));		-- whole date&lt;br /&gt;
		elseif 0 ~= input.month2 then&lt;br /&gt;
			date2 = string.format (&#039;/%s-%.2d&#039;, input.year2, tonumber(input.month2));	-- year and month&lt;br /&gt;
		else&lt;br /&gt;
			date2 = string.format (&#039;/%s&#039;, input.year2);							-- just year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	tCOinS_date.rftdate = date .. date2;										-- date2 has the &#039;/&#039; separator&lt;br /&gt;
	return;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A T T E R N S _ T &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
this is the list of patterns for date formats that this module recognizes.  Approximately the first half of these&lt;br /&gt;
patterns represent formats that might be reformatted into another format.  Those that might be reformatted have&lt;br /&gt;
&#039;indicator&#039; letters that identify the content of the matching capture: &#039;d&#039; (day), &#039;m&#039; (month), &#039;a&#039; (anchor year),&lt;br /&gt;
&#039;y&#039; (year); second day, month, year have a &#039;2&#039; suffix.&lt;br /&gt;
&lt;br /&gt;
These patterns are used for both date validation and for reformatting.  This table should not be moved to ~/Configuration&lt;br /&gt;
because changes to this table require changes to check_date() and to reformatter() and reformat_date()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local patterns_t = {&lt;br /&gt;
	 																			-- year-initial numerical year-month-day&lt;br /&gt;
	[&#039;ymd&#039;] = {&#039;^(%d%d%d%d)%-(%d%d)%-(%d%d)$&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},					&lt;br /&gt;
																				-- month-initial: month day, year&lt;br /&gt;
	[&#039;Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?), +((%d%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month-initial day range: month day–day, year; days are separated by endash&lt;br /&gt;
	[&#039;Md-dy&#039;] = {&#039;^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +((%d%d%d%d)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day-initial: day month year&lt;br /&gt;
	[&#039;dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +((%d%d%d%d?)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki&lt;br /&gt;
	--	[&#039;yMd&#039;] = {&#039;^((%d%d%d%d?)%a?) +(%D-) +(%d%d?)$&#039;, &#039;a&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},&lt;br /&gt;
																				-- day-range-initial: day–day month year; days are separated by endash&lt;br /&gt;
	[&#039;d-dMy&#039;] = {&#039;^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +((%d%d%d%d)%a?)$&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day initial month-day-range: day month - day month year; uses spaced endash&lt;br /&gt;
	[&#039;dM-dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +((%d%d%d%d)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month initial month-day-range: month day – month day, year;  uses spaced endash&lt;br /&gt;
	[&#039;Md-Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +((%d%d%d%d)%a?)$&#039;,&#039;m&#039;, &#039;d&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day initial month-day-year-range: day month year - day month year; uses spaced endash&lt;br /&gt;
	[&#039;dMy-dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +(%d%d%d%d) +[%-–] +([1-9]%d?) +(%D-) +((%d%d%d%d)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
																				-- month initial month-day-year-range: month day, year – month day, year;  uses spaced endash&lt;br /&gt;
	[&#039;Mdy-Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?), +(%d%d%d%d) +[%-–] +(%D-) +([1-9]%d?), +((%d%d%d%d)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
&lt;br /&gt;
																				-- these date formats cannot be converted, per se, but month name can be rendered short or long&lt;br /&gt;
																				-- month/season year - month/season year; separated by spaced endash&lt;br /&gt;
	[&#039;My-My&#039;] = {&#039;^(%D-) +(%d%d%d%d) +[%-–] +(%D-) +((%d%d%d%d)%a?)$&#039;, &#039;m&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
																				-- month/season range year; months separated by endash&lt;br /&gt;
	[&#039;M-My&#039;] = {&#039;^(%D-)[%-–](%D-) +((%d%d%d%d)%a?)$&#039;, &#039;m&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.&lt;br /&gt;
	[&#039;My&#039;] = {&#039;^([^%d–]-) +((%d%d%d%d)%a?)$&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},					-- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn&#039;t&lt;br /&gt;
&lt;br /&gt;
																				-- these date formats cannot be converted&lt;br /&gt;
	[&#039;Sy4-y2&#039;] = {&#039;^(%D-) +((%d%d)%d%d)[%-–]((%d%d)%a?)$&#039;},						-- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash&lt;br /&gt;
	[&#039;Sy-y&#039;] = {&#039;^(%D-) +(%d%d%d%d)[%-–]((%d%d%d%d)%a?)$&#039;},						-- special case Winter/Summer year-year; year separated with unspaced endash&lt;br /&gt;
	[&#039;y-y&#039;] = {&#039;^(%d%d%d%d?)[%-–]((%d%d%d%d?)%a?)$&#039;},							-- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999&lt;br /&gt;
	[&#039;y4-y2&#039;] = {&#039;^((%d%d)%d%d)[%-–]((%d%d)%a?)$&#039;},								-- year range: YYYY–YY; separated by unspaced endash&lt;br /&gt;
	[&#039;y&#039;] = {&#039;^((%d%d%d%d?)%a?)$&#039;},												-- year; here accept either YYY or YYYY&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ E M B A R G O _ D A T E &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true and date value if that value has proper dmy, mdy, ymd format.&lt;br /&gt;
&lt;br /&gt;
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is&lt;br /&gt;
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_embargo_date (v)&lt;br /&gt;
	if v:match (patterns_t[&#039;ymd&#039;][1]) or										-- ymd&lt;br /&gt;
		v:match (patterns_t[&#039;Mdy&#039;][1]) or										-- dmy&lt;br /&gt;
		v:match (patterns_t[&#039;dMy&#039;][1]) then										-- mdy&lt;br /&gt;
			return true, v;&lt;br /&gt;
	end&lt;br /&gt;
	return false, &#039;9999&#039;;														-- if here not good date so return false and set embargo date to long time in future&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C H E C K _ D A T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only&lt;br /&gt;
allowed range separator is endash.  Additionally, check the date to see that it is a real date: no 31 in 30-day&lt;br /&gt;
months; no 29 February when not a leap year.  Months, both long-form and three character abbreviations, and seasons&lt;br /&gt;
must be spelled correctly.  Future years beyond next year are not allowed.&lt;br /&gt;
&lt;br /&gt;
If the date fails the format tests, this function returns false and does not return values for anchor_year and&lt;br /&gt;
COinS_date.  When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets&lt;br /&gt;
its year from the year parameter if present otherwise CITEREF does not get a date value.&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	false if date string is not a real date; else&lt;br /&gt;
	true, anchor_year, COinS_date&lt;br /&gt;
		anchor_year can be used in CITEREF anchors&lt;br /&gt;
		COinS_date is ISO 8601 format date; see make_COInS_date()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function check_date (date_string, param, tCOinS_date)&lt;br /&gt;
	local year;																	-- assume that year2, months, and days are not used;&lt;br /&gt;
	local year2 = 0;															-- second year in a year range&lt;br /&gt;
	local month = 0;&lt;br /&gt;
	local month2 = 0;															-- second month in a month range&lt;br /&gt;
	local day = 0;&lt;br /&gt;
	local day2 = 0;																-- second day in a day range&lt;br /&gt;
	local anchor_year;&lt;br /&gt;
	local coins_date;&lt;br /&gt;
&lt;br /&gt;
	if date_string:match (patterns_t[&#039;ymd&#039;][1]) then							-- year-initial numerical year month day format&lt;br /&gt;
		year, month, day = date_string:match (patterns_t[&#039;ymd&#039;][1]);&lt;br /&gt;
		if 12 &amp;lt; tonumber(month) or 1 &amp;gt; tonumber(month) or 1582 &amp;gt; tonumber(year) or 0 == tonumber(day) then return false; end	-- month or day number not valid or not Gregorian calendar&lt;br /&gt;
		anchor_year = year;&lt;br /&gt;
	&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Mdy&#039;][1]) then				-- month-initial: month day, year&lt;br /&gt;
		month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Mdy&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
				&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Md-dy&#039;][1]) then			-- month-initial day range: month day–day, year; days are separated by endash&lt;br /&gt;
		month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Md-dy&#039;][1]);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end				-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
		month2=month;															-- for metadata&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dMy&#039;][1]) then				-- day-initial: day month year&lt;br /&gt;
		day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;dMy&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
--[[ NOT supported at en.wiki&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;yMd&#039;][1]) then				-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed&lt;br /&gt;
		anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t[&#039;yMd&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
-- end NOT supported at en.wiki ]]&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;d-dMy&#039;][1]) then			-- day-range-initial: day–day month year; days are separated by endash&lt;br /&gt;
		day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;d-dMy&#039;][1]);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end				-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
		month2 = month;															-- for metadata&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dM-dMy&#039;][1]) then			-- day initial month-day-range: day month - day month year; uses spaced endash&lt;br /&gt;
		day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;dM-dMy&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end	-- date range order is left to right: earlier to later;&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Md-Mdy&#039;][1]) then			-- month initial month-day-range: month day – month day, year; uses spaced endash&lt;br /&gt;
		month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Md-Mdy&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dMy-dMy&#039;][1]) then			-- day initial month-day-year-range: day month year - day month year; uses spaced endash&lt;br /&gt;
		day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;dMy-dMy&#039;][1]);&lt;br /&gt;
		if tonumber(year2) &amp;lt;= tonumber(year) then return false; end				-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end		-- year2 no more than one year in the future; months same style&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		if 0 == month or 0 == month2 then return false; end						-- both must be valid&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Mdy-Mdy&#039;][1]) then			-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash&lt;br /&gt;
		month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Mdy-Mdy&#039;][1]);&lt;br /&gt;
		if tonumber(year2) &amp;lt;= tonumber(year) then return false; end				-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end		-- year2 no more than one year in the future; months same style&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number(month2);&lt;br /&gt;
		if 0 == month or 0 == month2 then return false; end						-- both must be valid&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Sy4-y2&#039;][1]) then			-- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash&lt;br /&gt;
		local century;&lt;br /&gt;
		month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Sy4-y2&#039;][1]);&lt;br /&gt;
		if &#039;Winter&#039; ~= month and &#039;Summer&#039; ~= month then return false end;		-- &#039;month&#039; can only be Winter or Summer&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		year2 = century..year2;													-- add the century to year2 for comparisons&lt;br /&gt;
		if 1 ~= tonumber(year2) - tonumber(year) then return false; end			-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
		month = get_season_number(month, param);&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Sy-y&#039;][1]) then			-- special case Winter/Summer year-year; year separated with unspaced endash&lt;br /&gt;
		month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Sy-y&#039;][1]);&lt;br /&gt;
		month = get_season_number (month, param);								-- &amp;lt;month&amp;gt; can only be winter or summer; also for metadata&lt;br /&gt;
		if (month ~= cfg.date_names[&#039;en&#039;].season[&#039;Winter&#039;]) and (month ~= cfg.date_names[&#039;en&#039;].season[&#039;Summer&#039;]) then&lt;br /&gt;
			return false;														-- not Summer or Winter; abandon&lt;br /&gt;
		end&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		if 1 ~= tonumber(year2) - tonumber(year) then return false; end			-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;My-My&#039;][1]) then			-- month/season year - month/season year; separated by spaced endash&lt;br /&gt;
		month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;My-My&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
		if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then 	-- both must be month year, same month style&lt;br /&gt;
			month = get_month_number(month);&lt;br /&gt;
			month2 = get_month_number(month2);&lt;br /&gt;
		elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then	-- both must be season year, not mixed&lt;br /&gt;
			month = get_season_number(month, param);&lt;br /&gt;
			month2 = get_season_number(month2, param);&lt;br /&gt;
		else&lt;br /&gt;
			 return false;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;M-My&#039;][1]) then			-- month/season range year; months separated by endash &lt;br /&gt;
		month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;M-My&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end&lt;br /&gt;
		if 0 ~= get_month_number(month) then									-- determined to be a valid range so just check this one to know if month or season&lt;br /&gt;
			month = get_month_number(month);&lt;br /&gt;
			month2 = get_month_number(month2);&lt;br /&gt;
			if 0 == month or 0 == month2 then return false; end&lt;br /&gt;
		else&lt;br /&gt;
			month = get_season_number(month, param);&lt;br /&gt;
			month2 = get_season_number(month2, param);&lt;br /&gt;
		end&lt;br /&gt;
		year2 = year;&lt;br /&gt;
		&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;My&#039;][1]) then				-- month/season/quarter/proper-name year&lt;br /&gt;
		month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;My&#039;][1]);&lt;br /&gt;
		if not is_valid_year(year) then return false; end&lt;br /&gt;
		month = get_element_number(month, param);								-- get month season quarter proper-name number or nil&lt;br /&gt;
		if not month then return false; end										-- not valid whatever it is&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y-y&#039;][1]) then				-- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999&lt;br /&gt;
		year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;y-y&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y4-y2&#039;][1]) then			-- Year range: YYYY–YY; separated by unspaced endash&lt;br /&gt;
		local century;&lt;br /&gt;
		year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;y4-y2&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor year from both years&lt;br /&gt;
&lt;br /&gt;
		if 13 &amp;gt; tonumber(year2) then return false; end							-- don&#039;t allow 2003-05 which might be May 2003&lt;br /&gt;
		year2 = century .. year2;												-- add the century to year2 for comparisons&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
		if in_array (param, {&#039;date&#039;, &#039;publication-date&#039;, &#039;year&#039;}) then			-- here when &#039;valid&#039; abbreviated year range; if one of these parameters&lt;br /&gt;
			add_prop_cat (&#039;year-range-abbreviated&#039;);							-- add properties cat&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y&#039;][1]) then				-- year; here accept either YYY or YYYY&lt;br /&gt;
		anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;y&#039;][1]);&lt;br /&gt;
		if false == is_valid_year(year) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- date format not one of the MOS:DATE approved formats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if param ~= &#039;date&#039; then														-- CITEREF disambiguation only allowed in |date=; |year= &amp;amp; |publication-date= promote to date&lt;br /&gt;
		if anchor_year:match (&#039;%l$&#039;) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &#039;access-date&#039; == param then												-- test access-date here because we have numerical date parts&lt;br /&gt;
		if 0 ~= year and 0 ~= month and 0 ~= day and 							-- all parts of a single date required&lt;br /&gt;
			0 == year2 and 0 == month2 and 0 == day2 then						-- none of these; access-date must not be a range&lt;br /&gt;
				if not is_valid_accessdate(year .. &#039;-&#039; .. month .. &#039;-&#039; .. day) then	&lt;br /&gt;
					return false;												-- return false when access-date out of bounds&lt;br /&gt;
				end&lt;br /&gt;
		else&lt;br /&gt;
			return false;														-- return false when access-date is a range of two dates&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &#039;archive-date&#039; == param then												-- test archive-date here because we have numerical date parts&lt;br /&gt;
		if not (0 ~= year and 0 ~= month and 0 ~= day and						-- all parts of a single date required&lt;br /&gt;
			0 == year2 and 0 == month2 and 0 == day2) then						-- none of these; archive-date must not be a range&lt;br /&gt;
				return false;													-- return false when archive-date is a range of two dates&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result=true;															-- check whole dates for validity; assume true because not all dates will go through this test&lt;br /&gt;
	if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then		-- YMD (simple whole date)&lt;br /&gt;
		result = is_valid_date (year, month, day, param);						-- &amp;lt;param&amp;gt; for |pmc-embargo-date=&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then	-- YMD-d (day range)&lt;br /&gt;
		result = is_valid_date (year, month, day);&lt;br /&gt;
		result = result and is_valid_date (year, month, day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-md (day month range)&lt;br /&gt;
		result = is_valid_date (year, month, day);&lt;br /&gt;
		result = result and is_valid_date (year, month2, day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-ymd (day month year range)&lt;br /&gt;
		result = is_valid_date(year, month, day);&lt;br /&gt;
		result = result and is_valid_date(year2, month2, day2);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if false == result then return false; end&lt;br /&gt;
&lt;br /&gt;
	if nil ~= tCOinS_date then													-- this table only passed into this function when testing |date= parameter values&lt;br /&gt;
		make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date);	-- make an ISO 8601 date string for COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, anchor_year;													-- format is good and date string represents a real date&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D A T E S &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns&lt;br /&gt;
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in&lt;br /&gt;
the COinS metadata) are derived.  The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords &amp;quot;n.d.&amp;quot; or &amp;quot;nd&amp;quot; (without quotes).&lt;br /&gt;
&lt;br /&gt;
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,&lt;br /&gt;
parameters with errors are added to the &amp;lt;error_list&amp;gt; sequence table as the dates are tested.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function dates(date_parameters_list, tCOinS_date, error_list)&lt;br /&gt;
	local anchor_year;															-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local COinS_date;															-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local embargo_date;															-- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999&lt;br /&gt;
	local good_date = false;&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(date_parameters_list) do									-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(v.val) then													-- if the parameter has a value&lt;br /&gt;
			v.val = mw.ustring.gsub(v.val, &#039;%d&#039;, cfg.date_names.local_digits);	-- translate &#039;local&#039; digits to Western 0-9&lt;br /&gt;
			if v.val:match(&amp;quot;^c%. [1-9]%d%d%d?%a?$&amp;quot;) then						-- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=&lt;br /&gt;
				local year = v.val:match(&amp;quot;c%. ([1-9]%d%d%d?)%a?&amp;quot;);				-- get the year portion so it can be tested&lt;br /&gt;
				if &#039;date&#039; == k then&lt;br /&gt;
					anchor_year, COinS_date = v.val:match(&amp;quot;((c%. [1-9]%d%d%d?)%a?)&amp;quot;);	-- anchor year and COinS_date only from |date= parameter&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				elseif &#039;year&#039; == k then&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;date&#039; == k then												-- if the parameter is |date=&lt;br /&gt;
				if v.val:match(&amp;quot;^n%.d%.%a?$&amp;quot;) then -- ToDo: I18N								-- if |date=n.d. with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((n%.d%.)%a?)&amp;quot;); -- ToDo: I18N	-- &amp;quot;n.d.&amp;quot;; no error when date parameter is set to no date&lt;br /&gt;
				elseif v.val:match(&amp;quot;^nd%a?$&amp;quot;) then -- ToDo: I18N								-- if |date=nd with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((nd)%a?)&amp;quot;); -- ToDo: I18N	-- &amp;quot;nd&amp;quot;;	no error when date parameter is set to no date&lt;br /&gt;
				else&lt;br /&gt;
					good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date);	-- go test the date&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;year&#039; == k then												-- if the parameter is |year= it should hold only a year value&lt;br /&gt;
				if v.val:match(&amp;quot;^[1-9]%d%d%d?%a?$&amp;quot;) then						-- if |year = 3 or 4 digits only with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((%d+)%a?)&amp;quot;);&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;pmc-embargo-date&#039; == k then									-- if the parameter is |pmc-embargo-date=&lt;br /&gt;
				good_date = check_date (v.val, k);								-- go test the date&lt;br /&gt;
				if true == good_date then										-- if the date is a valid date&lt;br /&gt;
					good_date, embargo_date = is_valid_embargo_date (v.val);	-- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999&lt;br /&gt;
				end&lt;br /&gt;
			else																-- any other date-holding parameter&lt;br /&gt;
				good_date = check_date (v.val, k);								-- go test the date&lt;br /&gt;
			end&lt;br /&gt;
			if false == good_date then											-- assemble one error message so we don&#039;t add the tracking category multiple times&lt;br /&gt;
				table.insert (error_list, wrap_style (&#039;parameter&#039;, v.name));	-- make parameter name suitable for error message list&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return anchor_year, embargo_date;											-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Y E A R _ C H E C K &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Temporary function to test |year= for acceptable values:&lt;br /&gt;
	YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.&lt;br /&gt;
&lt;br /&gt;
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.&lt;br /&gt;
&lt;br /&gt;
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-&lt;br /&gt;
less useless&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function year_check (year)&lt;br /&gt;
	year = year:gsub (&#039;c%. *&#039;, &#039;&#039;);												-- remove circa annotation (if present) before testing &amp;lt;year&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	for _, index in ipairs ({&#039;y-y&#039;, &#039;y4-y2&#039;, &#039;y&#039;}) do							-- spin through these indexes into patterns_t&lt;br /&gt;
		if mw.ustring.match (year, patterns_t[index][1]) then&lt;br /&gt;
			return;																-- if a match then |year= holds a valid &#039;year&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	set_message (&#039;maint_year&#039;);													-- if here, |year= value is not an accepted value; add a maint cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Y E A R _ D A T E _ C H E C K &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Compare the value provided in |year= with the year value(s) provided in |date=.  This function sets a local numeric value:&lt;br /&gt;
	0 - year value does not match the year value in date&lt;br /&gt;
	1 - (default) year value matches the year value in date or one of the year values when date contains two years&lt;br /&gt;
	2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)&lt;br /&gt;
&lt;br /&gt;
the numeric value in &amp;lt;result&amp;gt; determines the &#039;output&#039; if any from this function:&lt;br /&gt;
	0 – adds error message to error_list sequence table&lt;br /&gt;
	1 – adds maint cat&lt;br /&gt;
	2 – does nothing&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)&lt;br /&gt;
	local year;&lt;br /&gt;
	local date1;&lt;br /&gt;
	local date2;&lt;br /&gt;
	local result = 1;															-- result of the test; assume that the test passes&lt;br /&gt;
&lt;br /&gt;
	year = year_string:match (&#039;(%d%d%d%d?)&#039;);&lt;br /&gt;
&lt;br /&gt;
	if date_string:match (&#039;%d%d%d%d%-%d%d%-%d%d&#039;) and year_string:match (&#039;%d%d%d%d%a&#039;) then	--special case where both date and year are required YYYY-MM-DD and YYYYx&lt;br /&gt;
		date1 = date_string:match (&#039;(%d%d%d%d)&#039;);&lt;br /&gt;
		year = year_string:match (&#039;(%d%d%d%d)&#039;);&lt;br /&gt;
		if year ~= date1 then&lt;br /&gt;
			result = 0;															-- years don&#039;t match&lt;br /&gt;
		else&lt;br /&gt;
			result = 2;															-- years match; but because disambiguated, don&#039;t add to maint cat&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	elseif date_string:match (&amp;quot;%d%d%d%d?.-%d%d%d%d?&amp;quot;) then						-- any of the standard range formats of date with two three- or four-digit years&lt;br /&gt;
		date1, date2 = date_string:match (&amp;quot;(%d%d%d%d?).-(%d%d%d%d?)&amp;quot;);&lt;br /&gt;
		if year ~= date1 and year ~= date2 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, &amp;quot;%d%d%d%d[%-–]%d%d&amp;quot;) then				-- YYYY-YY date ranges&lt;br /&gt;
		local century;&lt;br /&gt;
		date1, century, date2 = mw.ustring.match(date_string, &amp;quot;((%d%d)%d%d)[%-–]+(%d%d)&amp;quot;);&lt;br /&gt;
		date2 = century..date2;													-- convert YY to YYYY&lt;br /&gt;
		if year ~= date1 and year ~= date2 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match (&amp;quot;%d%d%d%d?&amp;quot;) then									-- any of the standard formats of date with one year&lt;br /&gt;
		date1 = date_string:match (&amp;quot;(%d%d%d%d?)&amp;quot;);&lt;br /&gt;
		if year ~= date1 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- should never get here; this function called only when no other date errors&lt;br /&gt;
		result = 0;																-- no recognizable year in date&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 0 == result then															-- year / date mismatch&lt;br /&gt;
		table.insert (error_list, substitute (cfg.messages[&#039;mismatch&#039;], {year_origin, date_origin}));	-- add error message to error_list sequence table&lt;br /&gt;
	elseif 1 == result then														-- redundant year / date&lt;br /&gt;
		set_message (&#039;maint_date_year&#039;);										-- add a maint cat&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R E F O R M A T T E R &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reformat &#039;date&#039; into new format specified by format_param if pattern_idx (the current format of &#039;date&#039;) can be&lt;br /&gt;
reformatted.  Does the grunt work for reformat_dates().&lt;br /&gt;
&lt;br /&gt;
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:&lt;br /&gt;
	format string used by string.format()&lt;br /&gt;
	identifier letters (&#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;) that serve as indexes into a table t{} that holds captures&lt;br /&gt;
		from mw.ustring.match() for the various date parts specified by  patterns_t[pattern_idx][1]&lt;br /&gt;
&lt;br /&gt;
Items in patterns_t{} have the general form:&lt;br /&gt;
	[&#039;ymd&#039;] = {&#039;^(%d%d%d%d)%-(%d%d)%-(%d%d)$&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;}, where:&lt;br /&gt;
		[&#039;ymd&#039;] is pattern_idx&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][1] is the match pattern with captures for mw.ustring.match()&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][2] is an indicator letter identifying the content of the first capture&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][3] ... the second capture etc.&lt;br /&gt;
&lt;br /&gt;
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier&lt;br /&gt;
characters as indexes into t{}  For the above, a ymd date is in t{} as:&lt;br /&gt;
	t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)&lt;br /&gt;
&lt;br /&gt;
To reformat, this function is called with the pattern_idx that matches the current format of the date and with&lt;br /&gt;
format_param set to the desired format.  This function loads table t{} as described and then calls string.format()&lt;br /&gt;
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according&lt;br /&gt;
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local re_formats = {&lt;br /&gt;
	[&#039;ymd&#039;] = {																	-- date format is ymd; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- |df=mdy&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- |df=dmy&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Mdy&#039;] = {																	-- date format is Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- |df=dmy&lt;br /&gt;
		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},									-- |df=ymd&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dMy&#039;] = {																	-- date format is dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- |df=mdy&lt;br /&gt;
		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},									-- |df=ymd&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Md-dy&#039;] = {																-- date format is Md-dy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s–%s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;y&#039;},						-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s–%s %s %s&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;y&#039;},							-- |df=dmy -&amp;gt; d-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;d-dMy&#039;] = {																-- date format is d-d&amp;gt;y; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s–%s %s %s&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;y&#039;},							-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s–%s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;y&#039;},						-- |df=mdy -&amp;gt; Md-dy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dM-dMy&#039;] = {																-- date format is dM-dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y&#039;},				-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y&#039;},				-- |df=mdy -&amp;gt; Md-Mdy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Md-Mdy&#039;] = {																-- date format is Md-Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;,  &#039;m2&#039;, &#039;d2&#039;, &#039;y&#039;},			-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y&#039;},				-- |df=dmy -&amp;gt; dM-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dMy-dMy&#039;] = {																-- date format is dMy-dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;},		-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y2&#039;},	-- |df=mdy -&amp;gt; Mdy-Mdy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Mdy-Mdy&#039;] = {																-- date format is Mdy-Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y2&#039;},	-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;},		-- |df=dmy -&amp;gt; dMy-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;My-My&#039;] = {																-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s %s – %s %s&#039;, &#039;m&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;y2&#039;},						-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;M-My&#039;] = {																-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s–%s %s&#039;, &#039;m&#039;, &#039;m2&#039;, &#039;y&#039;},									-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;My&#039;] = {																	-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s %s&#039;, &#039;m&#039;, &#039;y&#039;},											-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	--	[&#039;yMd&#039;] = {																-- not supported at en.wiki&lt;br /&gt;
	--		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},								-- |df=mdy&lt;br /&gt;
	--		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},								-- |df=dmy&lt;br /&gt;
	--		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=ymd&lt;br /&gt;
	--		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function reformatter (date, pattern_idx, format_param, mon_len)&lt;br /&gt;
	if not in_array (pattern_idx, {&#039;ymd&#039;, &#039;Mdy&#039;, &#039;Md-dy&#039;, &#039;dMy&#039;, &#039;yMd&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;, &#039;My-My&#039;, &#039;M-My&#039;, &#039;My&#039;}) then&lt;br /&gt;
		return;																	-- not in this set of date format patterns_t then not a reformattable date&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if &#039;ymd&#039; == format_param and in_array (pattern_idx, {&#039;ymd&#039;, &#039;Md-dy&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;, &#039;My-My&#039;, &#039;M-My&#039;, &#039;My&#039;}) then&lt;br /&gt;
		return;																	-- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if in_array (pattern_idx, {&#039;My&#039;, &#039;M-My&#039;, &#039;My-My&#039;}) then						-- these are not dmy/mdy so can&#039;t be &#039;reformatted&#039; into either&lt;br /&gt;
		format_param = &#039;any&#039;;													-- so format-agnostic &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
																				-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line&lt;br /&gt;
	--	if &#039;yMd&#039; == format_param and in_array (pattern_idx, {&#039;yMd&#039;, &#039;Md-dy&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;}) then	-- these formats not convertable; yMd not supported at en.wiki&lt;br /&gt;
	if &#039;yMd&#039; == format_param then												-- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line&lt;br /&gt;
		return;																	-- not a reformattable date&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local c1, c2, c3, c4, c5, c6, c7;											-- these hold the captures specified in patterns_t[pattern_idx][1]&lt;br /&gt;
	c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]);	-- get the captures&lt;br /&gt;
&lt;br /&gt;
	local t = {																	-- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]&lt;br /&gt;
		[patterns_t[pattern_idx][2]] = c1;										-- at minimum there is always one capture with a matching indicator letter&lt;br /&gt;
		[patterns_t[pattern_idx][3] or &#039;x&#039;] = c2;								-- patterns_t can have a variable number of captures; each capture requires an indicator letter;&lt;br /&gt;
		[patterns_t[pattern_idx][4] or &#039;x&#039;] = c3;								-- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;&lt;br /&gt;
		[patterns_t[pattern_idx][5] or &#039;x&#039;] = c4;								-- the &#039;x&#039; here spoofs an indicator letter to prevent &#039;table index is nil&#039; error&lt;br /&gt;
		[patterns_t[pattern_idx][6] or &#039;x&#039;] = c5;&lt;br /&gt;
		[patterns_t[pattern_idx][7] or &#039;x&#039;] = c6;&lt;br /&gt;
		[patterns_t[pattern_idx][8] or &#039;x&#039;] = c7;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	if t.a then																	-- if this date has an anchor year capture (all convertable date formats except ymd)&lt;br /&gt;
		if t.y2 then															-- for year range date formats														&lt;br /&gt;
			t.y2 = t.a;															-- use the anchor year capture when reassembling the date&lt;br /&gt;
		else																	-- here for single date formats (except ymd)&lt;br /&gt;
			t.y = t.a;															-- use the anchor year capture when reassembling the date&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber(t.m) then														-- if raw month is a number (converting from ymd)&lt;br /&gt;
		if &#039;s&#039; == mon_len then													-- if we are to use abbreviated month names&lt;br /&gt;
			t.m = cfg.date_names[&#039;inv_local_short&#039;][tonumber(t.m)];					-- convert it to a month name&lt;br /&gt;
		else&lt;br /&gt;
			t.m = cfg.date_names[&#039;inv_local_long&#039;][tonumber(t.m)];					-- convert it to a month name&lt;br /&gt;
		end&lt;br /&gt;
		t.d = t.d:gsub (&#039;0(%d)&#039;, &#039;%1&#039;);											-- strip leading &#039;0&#039; from day if present&lt;br /&gt;
	elseif &#039;ymd&#039; == format_param then											-- when converting to ymd&lt;br /&gt;
		t.y = t.y:gsub (&#039;%a&#039;, &#039;&#039;);												-- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?&lt;br /&gt;
		if 1582 &amp;gt; tonumber (t.y) then											-- ymd format dates not allowed before 1582&lt;br /&gt;
			return;&lt;br /&gt;
		end&lt;br /&gt;
		t.m = string.format (&#039;%02d&#039;, get_month_number (t.m));					-- make sure that month and day are two digits&lt;br /&gt;
		t.d = string.format (&#039;%02d&#039;, t.d);&lt;br /&gt;
	elseif mon_len then															-- if mon_len is set to either &#039;short&#039; or &#039;long&#039;&lt;br /&gt;
		for _, mon in ipairs ({&#039;m&#039;, &#039;m2&#039;}) do									-- because there can be two month names, check both &lt;br /&gt;
			if t[mon] then&lt;br /&gt;
				t[mon] = get_month_number (t[mon]);								-- get the month number for this month (is length agnostic)&lt;br /&gt;
				if 0 == t[mon] then return; end									-- seasons and named dates can&#039;t be converted&lt;br /&gt;
				t[mon] = ((&#039;s&#039; == mon_len) and cfg.date_names[&#039;inv_local_short&#039;][t[mon]]) or cfg.date_names[&#039;inv_local_long&#039;][t[mon]];	-- fetch month name according to length&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local new_date = string.format (re_formats[pattern_idx][format_param][1],	-- format string&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][2]],							-- named captures from t{}&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][3]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][4]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][5]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][6]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][7]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][8]]&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	return new_date;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; R E F O R M A T _ D A T E S &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Reformats existing dates into the format specified by format.&lt;br /&gt;
&lt;br /&gt;
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all.  The -all version includes&lt;br /&gt;
access- and archive-dates; otherwise these dates are not reformatted.&lt;br /&gt;
&lt;br /&gt;
This function allows automatic date formatting.  In ~/Configuration, the article source is searched for one of&lt;br /&gt;
the {{use xxx dates}} templates.  If found, xxx becomes the global date format as xxx-all.  If |cs1-dates= in&lt;br /&gt;
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered.  Legitimate&lt;br /&gt;
values for |cs1-dates= are:&lt;br /&gt;
	l - all dates are rendered with long month names&lt;br /&gt;
	ls - publication dates use long month names; access-/archive-dates use abbreviated month names&lt;br /&gt;
	ly - publication dates use long month names; access-/archive-dates rendered in ymd format&lt;br /&gt;
	s - all dates are rendered with abbreviated (short) month names&lt;br /&gt;
	sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format&lt;br /&gt;
	y - all dates are rendered in ymd format&lt;br /&gt;
&lt;br /&gt;
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the&lt;br /&gt;
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=&lt;br /&gt;
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.&lt;br /&gt;
&lt;br /&gt;
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the&lt;br /&gt;
list in the new format.  Dates in date_parameters_list are presumed here to be valid (no errors).  This function&lt;br /&gt;
returns true when a date has been reformatted, false else.  Actual reformatting is done by reformatter().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function reformat_dates (date_parameters_list, format)&lt;br /&gt;
	local all = false;															-- set to false to skip access- and archive-dates&lt;br /&gt;
	local len_p = &#039;l&#039;;															-- default publication date length shall be long&lt;br /&gt;
	local len_a = &#039;l&#039;;															-- default access-/archive-date length shall be long&lt;br /&gt;
	local result = false;&lt;br /&gt;
	local new_date;																&lt;br /&gt;
	&lt;br /&gt;
	if format:match(&#039;%a+%-all&#039;) then											-- manual df keyword; auto df keyword when length not specified in {{use xxx dates}}; &lt;br /&gt;
		format = format:match(&#039;(%a+)%-all&#039;);									-- extract the format&lt;br /&gt;
		all = true;																-- all dates are long format dates because this keyword doesn&#039;t specify length&lt;br /&gt;
	elseif format:match(&#039;%a+%-[lsy][sy]?&#039;) then									-- auto df keywords; internal only&lt;br /&gt;
		all = true;																-- auto df applies to all dates; use length specified by capture len_p for all dates&lt;br /&gt;
		format, len_p, len_a = format:match(&#039;(%a+)%-([lsy])([sy]?)&#039;);			-- extract the format and length keywords&lt;br /&gt;
		if &#039;y&#039; == len_p then													-- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted&lt;br /&gt;
			format = &#039;ymd&#039;;														-- override {{use xxx dates}}&lt;br /&gt;
		elseif (not is_set(len_a)) or (len_p == len_a) then						-- no access-/archive-date length specified or same length as publication dates then&lt;br /&gt;
			len_a = len_p;														-- in case len_a not set&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- else only publication dates and they are long&lt;br /&gt;
&lt;br /&gt;
	for param_name, param_val in pairs (date_parameters_list) do				-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set (param_val.val) then											-- if the parameter has a value&lt;br /&gt;
			if not (not all and in_array (param_name, {&#039;access-date&#039;, &#039;archive-date&#039;})) then	-- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way&lt;br /&gt;
				for pattern_idx, pattern in pairs (patterns_t) do&lt;br /&gt;
					if mw.ustring.match (param_val.val, pattern[1]) then&lt;br /&gt;
						if all and in_array (param_name, {&#039;access-date&#039;, &#039;archive-date&#039;}) then	-- if this date is an access- or archive-date&lt;br /&gt;
							new_date = reformatter (param_val.val, pattern_idx, ((&#039;y&#039; == len_a) and &#039;ymd&#039;) or format, len_a);	-- choose ymd or dmy/mdy according to len_a setting&lt;br /&gt;
						else													-- all other dates&lt;br /&gt;
							new_date = reformatter (param_val.val, pattern_idx, format, len_p);&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						if new_date then										-- set when date was reformatted&lt;br /&gt;
							date_parameters_list[param_name].val = new_date;	-- update date in date list&lt;br /&gt;
							result = true;										-- and announce that changes have been made&lt;br /&gt;
							break;&lt;br /&gt;
						end&lt;br /&gt;
					end	-- if&lt;br /&gt;
				end		-- for&lt;br /&gt;
			end			-- if&lt;br /&gt;
		end				-- if&lt;br /&gt;
	end					-- for&lt;br /&gt;
	return result;																-- declare boolean result and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D A T E _ H Y P H E N _ T O _ D A S H &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
Loops through the list of date-holding parameters and converts any hyphen to an ndash.  Not called if the cs1|2&lt;br /&gt;
template has any date errors.&lt;br /&gt;
&lt;br /&gt;
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function date_hyphen_to_dash (date_parameters_list)&lt;br /&gt;
	local result = false;&lt;br /&gt;
	local n;&lt;br /&gt;
	for param_name, param_val in pairs(date_parameters_list) do					-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set (param_val.val) and&lt;br /&gt;
			not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then		-- for those that are not ymd dates (ustring because here digits may not be Western)&lt;br /&gt;
				param_val.val, n = param_val.val:gsub (&#039;%-&#039;, &#039;–&#039;);				-- replace any hyphen with ndash&lt;br /&gt;
				if 0 ~= n then&lt;br /&gt;
					date_parameters_list[param_name].val = param_val.val;		-- update the list&lt;br /&gt;
					result = true;&lt;br /&gt;
				end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result;																-- so we know if any hyphens were replaced&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; D A T E _ N A M E _ X L A T E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Attempts to translate English date names to local-language date names using names supplied by MediaWiki&#039;s&lt;br /&gt;
date parser function.  This is simple name-for-name replacement and may not work for all languages.&lt;br /&gt;
&lt;br /&gt;
if xlat_dig is true, this function will also translate Western (English) digits to the local language&#039;s digits.&lt;br /&gt;
This will also translate ymd dates.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function date_name_xlate (date_parameters_list, xlt_dig)&lt;br /&gt;
	local xlate;&lt;br /&gt;
	local mode;																	-- long or short month names&lt;br /&gt;
	local modified = false;&lt;br /&gt;
	local date;&lt;br /&gt;
	&lt;br /&gt;
	local sources_t = {&lt;br /&gt;
		{cfg.date_names.en.long, cfg.date_names.inv_local_long},				-- for translating long English month names to long local month names&lt;br /&gt;
		{cfg.date_names.en.short, cfg.date_names.inv_local_short},				-- short month names&lt;br /&gt;
		{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter},			-- quarter date names&lt;br /&gt;
		{cfg.date_names.en.season, cfg.date_names.inv_local_season},			-- season date nam&lt;br /&gt;
		{cfg.date_names.en.named, cfg.date_names.inv_local_named},				-- named dates&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	local function is_xlateable (month)											-- local function to get local date name that replaces existing English-language date name&lt;br /&gt;
		for _, date_names_t in ipairs (sources_t) do							-- for each sequence table in date_names_t&lt;br /&gt;
			if date_names_t[1][month] then										-- if date name is English month (long or short), quarter, season or named and&lt;br /&gt;
				if date_names_t[2][date_names_t[1][month]] then					-- if there is a matching local date name&lt;br /&gt;
					return date_names_t[2][date_names_t[1][month]];				-- return the local date name&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for param_name, param_val in pairs(date_parameters_list) do					-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(param_val.val) then											-- if the parameter has a value&lt;br /&gt;
			date = param_val.val;&lt;br /&gt;
			for month in mw.ustring.gmatch (date, &#039;[%a ]+&#039;) do					-- iterate through all date names in the date (single date or date range)&lt;br /&gt;
				month = mw.text.trim (month);									-- this because quarterly dates contain whitespace&lt;br /&gt;
				xlate = is_xlateable (month);									-- get translate &amp;lt;month&amp;gt;; returns translation or nil&lt;br /&gt;
				&lt;br /&gt;
				if xlate then		&lt;br /&gt;
					date = mw.ustring.gsub (date, month, xlate);				-- replace the English with the translation&lt;br /&gt;
					date_parameters_list[param_name].val = date;				-- save the translated date&lt;br /&gt;
					modified = true;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if xlt_dig then														-- shall we also translate digits?&lt;br /&gt;
				date = date:gsub (&#039;%d&#039;, cfg.date_names.xlate_digits);			-- translate digits from Western to &#039;local digits&#039;&lt;br /&gt;
				date_parameters_list[param_name].val = date;					-- save the translated date&lt;br /&gt;
				modified = true;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return modified;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	add_prop_cat = utilities_page_ptr.add_prop_cat ;							-- import functions from selected Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	set_message = utilities_page_ptr.set_message;&lt;br /&gt;
	substitute = utilities_page_ptr.substitute;&lt;br /&gt;
	wrap_style = utilities_page_ptr.wrap_style;&lt;br /&gt;
&lt;br /&gt;
	cfg = cfg_table_ptr;														-- import tables from selected Module:Citation/CS1/Configuration&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R C H I V E _ D A T E _ C H E C K &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Compare value in |archive-date= with the timestamp in Wayback machine urls.  Emits an error message with suggested&lt;br /&gt;
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match&lt;br /&gt;
the timestamp.&lt;br /&gt;
&lt;br /&gt;
this function never called when any date in a cs1|2 template has errors&lt;br /&gt;
&lt;br /&gt;
error message suggests new |archive-date= value in an appropriate format specified by &amp;lt;df&amp;gt;.  &amp;lt;df&amp;gt; is either &lt;br /&gt;
|df= or cfg.global_df in that order.  If &amp;lt;df&amp;gt; is nil, suggested date has format from |archive-date=.  There is&lt;br /&gt;
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.&lt;br /&gt;
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format&lt;br /&gt;
is not changed.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function archive_date_check (archive_date, archive_url_timestamp, df)&lt;br /&gt;
	local archive_date_format = &#039;dmy-y&#039;;										-- holds the date format of date in |archive-date; default to ymd; &#039;dmy&#039; used here to spoof reformat_dates() &lt;br /&gt;
	&lt;br /&gt;
	for _, v_t in ipairs ({{&#039;dMy&#039;, &#039;dmy-all&#039;}, {&#039;Mdy&#039;, &#039;mdy-all&#039;}}) do			-- is |archive-date= format dmy or mdy?&lt;br /&gt;
		if archive_date:match (patterns_t[v_t[1]][1]) then						-- does the pattern match?&lt;br /&gt;
			archive_date_format = cfg.keywords_xlate[v_t[2]];					-- get appropriate |df= supported keyword from the i18n translator table&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local dates_t = {};&lt;br /&gt;
	dates_t[&#039;archive-date&#039;] = {val=archive_date, name=&#039;&#039;};						-- setup to call reformat_dates(); never called when errors so &amp;lt;name&amp;gt; unset as not needed&lt;br /&gt;
	reformat_dates (dates_t, &#039;dmy-y&#039;);											-- reformat |archive-date= to ymd; &#039;dmy&#039; used here to spoof reformat_dates()&lt;br /&gt;
	local archive_url_date = archive_url_timestamp:gsub (&#039;(%d%d%d%d)(%d%d)(%d%d)%d*&#039;, &#039;%1-%2-%3&#039;);	-- make ymd format date from timestamp&lt;br /&gt;
&lt;br /&gt;
	if dates_t[&#039;archive-date&#039;].val == archive_url_date then						-- are the two dates the same&lt;br /&gt;
		return;																	-- yes, done&lt;br /&gt;
	else&lt;br /&gt;
		dates_t[&#039;archive-date&#039;] = {val=archive_url_date, name=&#039;&#039;};				-- setup to call reformat_dates() with the timestamp date&lt;br /&gt;
		reformat_dates (dates_t, df or archive_date_format);					-- reformat timestamp to format specified by &amp;lt;df&amp;gt; or format used in |archive-date= &lt;br /&gt;
		archive_url_date = dates_t[&#039;archive-date&#039;].val;&lt;br /&gt;
		set_message (&#039;err_archive_date_url_ts_mismatch&#039;, archive_url_date);		-- emit an error message&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {																		-- return exported functions&lt;br /&gt;
	archive_date_check = archive_date_check,&lt;br /&gt;
	date_hyphen_to_dash = date_hyphen_to_dash,&lt;br /&gt;
	date_name_xlate = date_name_xlate,&lt;br /&gt;
	dates = dates,&lt;br /&gt;
	reformat_dates = reformat_dates,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	year_check = year_check,&lt;br /&gt;
	year_date_check = year_date_check,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
	<entry>
		<id>https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Utilities&amp;diff=1505</id>
		<title>Module:Citation/CS1/Utilities</title>
		<link rel="alternate" type="text/html" href="https://fr.wikipasokh.com/index.php?title=Module:Citation/CS1/Utilities&amp;diff=1505"/>
		<updated>2025-01-25T07:17:01Z</updated>

		<summary type="html">&lt;p&gt;Nazarzadeh : 1 version importée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local z = {&lt;br /&gt;
	error_cats_t = {};															-- for categorizing citations that contain errors&lt;br /&gt;
	error_ids_t = {};															-- list of error identifiers; used to prevent duplication of certain errors; local to this module&lt;br /&gt;
	error_msgs_t = {};															-- sequence table of error messages&lt;br /&gt;
	maint_cats_t = {};															-- for categorizing citations that aren&#039;t erroneous per se, but could use a little work&lt;br /&gt;
	prop_cats_t = {};															-- for categorizing citations based on certain properties, language of source for instance&lt;br /&gt;
	prop_keys_t = {};															-- for adding classes to the citation&#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ S E T &amp;gt;------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if argument is set; false otherwise. Argument is &#039;set&#039; when it exists (not nil) or when it is not an empty string.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_set (var)&lt;br /&gt;
	return not (var == nil or var == &#039;&#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I N _ A R R A Y &amp;gt;--------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Whether needle is in haystack&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function in_array (needle, haystack)&lt;br /&gt;
	if needle == nil then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	for n, v in ipairs (haystack) do&lt;br /&gt;
		if v == needle then&lt;br /&gt;
			return n;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H A S _ A C C E P T _ A S _ W R I T T E N &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;str&amp;gt; is wholly wrapped in accept-as-written markup, return &amp;lt;str&amp;gt; without markup and true; return &amp;lt;str&amp;gt; and false else&lt;br /&gt;
&lt;br /&gt;
with allow_empty = false, &amp;lt;str&amp;gt; must have at least one character inside the markup&lt;br /&gt;
with allow_empty = true, &amp;lt;str&amp;gt; the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition &amp;quot;has no applicable value&amp;quot; in citation-context.&lt;br /&gt;
&lt;br /&gt;
After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function has_accept_as_written (str, allow_empty)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str, false;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local count;&lt;br /&gt;
&lt;br /&gt;
	if true == allow_empty then&lt;br /&gt;
		str, count = str:gsub (&#039;^%(%((.*)%)%)$&#039;, &#039;%1&#039;); 						-- allows (()) to be an empty set&lt;br /&gt;
	else&lt;br /&gt;
		str, count = str:gsub (&#039;^%(%((.+)%)%)$&#039;, &#039;%1&#039;);&lt;br /&gt;
	end&lt;br /&gt;
	return str, 0 ~= count;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S U B S T I T U T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates numbered arguments in a message string using an argument table. &amp;lt;args&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function substitute (msg, args)&lt;br /&gt;
	return args and mw.message.newRawMessage (msg, args):plain() or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R O R _ C O M M E N T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Wraps error messages with CSS markup according to the state of hidden. &amp;lt;content&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function error_comment (content, hidden)&lt;br /&gt;
	return substitute (hidden and cfg.presentation[&#039;hidden-error&#039;] or cfg.presentation[&#039;visible-error&#039;], content);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H Y P H E N _ T O _ D A S H &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Converts a hyphen to a dash under certain conditions.  The hyphen must separate&lt;br /&gt;
like items; unlike items are returned unmodified.  These forms are modified:&lt;br /&gt;
	letter - letter (A - B)&lt;br /&gt;
	digit - digit (4-5)&lt;br /&gt;
	digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)&lt;br /&gt;
	letterdigit - letterdigit (A1-A5) (an optional separator between letter and&lt;br /&gt;
		digit is supported – a.1-a.5 or a-1-a-5)&lt;br /&gt;
	digitletter - digitletter (5a - 5d) (an optional separator between letter and&lt;br /&gt;
		digit is supported – 5.a-5.d or 5-a-5-d)&lt;br /&gt;
&lt;br /&gt;
any other forms are returned unmodified.&lt;br /&gt;
&lt;br /&gt;
str may be a comma- or semicolon-separated list&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function hyphen_to_dash (str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local accept;																-- boolean&lt;br /&gt;
&lt;br /&gt;
	str = str:gsub (&amp;quot;(%(%(.-%)%))&amp;quot;, function(m) return m:gsub(&amp;quot;,&amp;quot;, &amp;quot;，&amp;quot;):gsub(&amp;quot;;&amp;quot;, &amp;quot;；&amp;quot;) end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they&#039;ll be ignored during the split	&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;[nm]dash;&#039;, {[&#039;&amp;amp;ndash;&#039;] = &#039;–&#039;, [&#039;&amp;amp;mdash;&#039;] = &#039;—&#039;});		-- replace &amp;amp;mdash; and &amp;amp;ndash; entities with their characters; semicolon mucks up the text.split&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;#45;&#039;, &#039;-&#039;); -- replace HTML numeric entity with hyphen character&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;nbsp;&#039;, &#039; &#039;); -- replace &amp;amp;nbsp; entity with generic keyboard space character&lt;br /&gt;
	&lt;br /&gt;
	local out = {};&lt;br /&gt;
	local list = mw.text.split (str, &#039;%s*[,;]%s*&#039;);								-- split str at comma or semicolon separators if there are any&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs (list) do												-- for each item in the list&lt;br /&gt;
		item, accept = has_accept_as_written (item);							-- remove accept-this-as-written markup when it wraps all of item&lt;br /&gt;
		if not accept and mw.ustring.match (item, &#039;^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$&#039;) then	-- if a hyphenated range or has endash or emdash separators&lt;br /&gt;
			if item:match (&#039;^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$&#039;) or			-- letterdigit hyphen letterdigit (optional separator between letter and digit)&lt;br /&gt;
				item:match (&#039;^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$&#039;) or			-- digitletter hyphen digitletter (optional separator between digit and letter)&lt;br /&gt;
				item:match (&#039;^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$&#039;) or			-- digit separator digit hyphen digit separator digit&lt;br /&gt;
				item:match (&#039;^%d+%s*%-%s*%d+$&#039;) or								-- digit hyphen digit&lt;br /&gt;
				item:match (&#039;^%a+%s*%-%s*%a+$&#039;) then							-- letter hyphen letter&lt;br /&gt;
					item = item:gsub (&#039;(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)&#039;, &#039;%1–%2&#039;);	-- replace hyphen, remove extraneous space characters&lt;br /&gt;
			else&lt;br /&gt;
				item = mw.ustring.gsub (item, &#039;%s*[–—]%s*&#039;, &#039;–&#039;);				-- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (out, item);												-- add the (possibly modified) item to the output table&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local temp_str = &#039;&#039;;														-- concatenate the output table into a comma separated string&lt;br /&gt;
	temp_str, accept = has_accept_as_written (table.concat (out, &#039;, &#039;));		-- remove accept-this-as-written markup when it wraps all of concatenated out&lt;br /&gt;
	if accept then&lt;br /&gt;
		temp_str = has_accept_as_written (str);									-- when global markup removed, return original str; do it this way to suppress boolean second return value&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);						-- else, return assembled temp_str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; M A K E _ W I K I L I N K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only&lt;br /&gt;
link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are&lt;br /&gt;
provided or link is omitted, returns an empty string.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function make_wikilink (link, display)&lt;br /&gt;
	if not is_set (link) then return &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
	if is_set (display) and link ~= display then			&lt;br /&gt;
		return table.concat ({&#039;[[&#039;, link, &#039;|&#039;, display, &#039;]]&#039;});			&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat ({&#039;[[&#039;, link, &#039;]]&#039;});&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ M E S S A G E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets an error message using the ~/Configuration error_conditions{} table along with arguments supplied in the function&lt;br /&gt;
call, inserts the resulting message in z.error_msgs_t{} sequence table, and returns the error message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error_id&amp;gt; – key value for appropriate error handler in ~/Configuration error_conditions{} table &lt;br /&gt;
&amp;lt;arguments&amp;gt; – may be a single string or a sequence table of multiple strings to be subsititued into error_conditions[error_id].message&lt;br /&gt;
&amp;lt;raw&amp;gt; – boolean&lt;br /&gt;
	true –	causes this function to return the error message not wrapped in visible-error, hidden-error span tag;&lt;br /&gt;
			returns error_conditions[error_id].hidden as a second return value&lt;br /&gt;
			does not add message to z.error_msgs_t sequence table&lt;br /&gt;
	false, nil – adds message wrapped in visible-error, hidden-error span tag to z.error_msgs_t&lt;br /&gt;
			returns the error message wrapped in visible-error, hidden-error span tag; there is no second return value&lt;br /&gt;
&amp;lt;prefix&amp;gt; – string to be prepended to &amp;lt;message&amp;gt;									-- TODO: remove support for these unused(?) arguments?&lt;br /&gt;
&amp;lt;suffix&amp;gt; – string to be appended to &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: change z.error_cats_t and z.maint_cats_t to have the form cat_name = true?  this to avoid dups without having to have an extra table&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_maint_cats = {}														-- list of maintenance categories that have been added to z.maint_cats_t; TODO: figure out how to delete this table&lt;br /&gt;
&lt;br /&gt;
local function set_message (error_id, arguments, raw, prefix, suffix)&lt;br /&gt;
	local error_state = cfg.error_conditions[error_id];&lt;br /&gt;
	&lt;br /&gt;
	prefix = prefix or &#039;&#039;;&lt;br /&gt;
	suffix = suffix or &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	if error_state == nil then&lt;br /&gt;
		error (cfg.messages[&#039;undefined_error&#039;] .. &#039;: &#039; .. error_id);			-- because missing error handler in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
	elseif is_set (error_state.category) then&lt;br /&gt;
		if error_state.message then												-- when error_state.message defined, this is an error message&lt;br /&gt;
			table.insert (z.error_cats_t, error_state.category);&lt;br /&gt;
		else&lt;br /&gt;
			if not added_maint_cats[error_id] then&lt;br /&gt;
				added_maint_cats[error_id] = true;								-- note that we&#039;ve added this category&lt;br /&gt;
				table.insert (z.maint_cats_t, substitute (error_state.category, arguments));	-- make cat name then add to table&lt;br /&gt;
			end&lt;br /&gt;
			return;																-- because no message, nothing more to do&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local message = substitute (error_state.message, arguments);&lt;br /&gt;
&lt;br /&gt;
	message = table.concat (&lt;br /&gt;
		{&lt;br /&gt;
		message,&lt;br /&gt;
		&#039; (&#039;,&lt;br /&gt;
		make_wikilink (&lt;br /&gt;
			table.concat (&lt;br /&gt;
				{&lt;br /&gt;
				cfg.messages[&#039;help page link&#039;],&lt;br /&gt;
				&#039;#&#039;,&lt;br /&gt;
				error_state.anchor&lt;br /&gt;
				}),&lt;br /&gt;
			cfg.messages[&#039;help page label&#039;]),&lt;br /&gt;
		&#039;)&#039;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	z.error_ids_t[error_id] = true;&lt;br /&gt;
	if z.error_ids_t[&#039;err_citation_missing_title&#039;] and							-- if missing-title error already noted&lt;br /&gt;
		in_array (error_id, {&#039;err_bare_url_missing_title&#039;, &#039;err_trans_missing_title&#039;}) then		-- and this error is one of these&lt;br /&gt;
			return &#039;&#039;, false;													-- don&#039;t bother because one flavor of missing title is sufficient&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	message = table.concat ({prefix, message, suffix});&lt;br /&gt;
&lt;br /&gt;
	if true == raw then&lt;br /&gt;
		return message, error_state.hidden;										-- return message not wrapped in visible-error, hidden-error span tag&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	message = error_comment (message, error_state.hidden);						-- wrap message in visible-error, hidden-error span tag&lt;br /&gt;
	table.insert (z.error_msgs_t, message);										-- add it to the messages sequence table&lt;br /&gt;
	return message;																-- and done; return value generally not used but is used as a flag in various functions of ~/Identifiers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; I S _ A L I A S _ U S E D &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function is used by select_one() to determine if one of a list of alias parameters is in the argument list&lt;br /&gt;
provided by the template.&lt;br /&gt;
&lt;br /&gt;
Input:&lt;br /&gt;
	args – pointer to the arguments table from calling template&lt;br /&gt;
	alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration&lt;br /&gt;
	index – for enumerated parameters, identifies which one&lt;br /&gt;
	enumerated – true/false flag used to choose how enumerated aliases are examined&lt;br /&gt;
	value – value associated with an alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	selected – the alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	error_list – list of aliases that are duplicates of the alias already selected&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected&lt;br /&gt;
	selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_alias_used (args, alias, index, enumerated, value, selected, error_list)&lt;br /&gt;
	if enumerated then															-- is this a test for an enumerated parameters?&lt;br /&gt;
		alias = alias:gsub (&#039;#&#039;, index);										-- replace &#039;#&#039; with the value in index&lt;br /&gt;
	else&lt;br /&gt;
		alias = alias:gsub (&#039;#&#039;, &#039;&#039;);											-- remove &#039;#&#039; if it exists&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (args[alias]) then												-- alias is in the template&#039;s argument list&lt;br /&gt;
		if value ~= nil and selected ~= alias then								-- if we have already selected one of the aliases&lt;br /&gt;
			local skip;&lt;br /&gt;
			for _, v in ipairs (error_list) do									-- spin through the error list to see if we&#039;ve added this alias&lt;br /&gt;
				if v == alias then&lt;br /&gt;
					skip = true;&lt;br /&gt;
					break;														-- has been added so stop looking &lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not skip then													-- has not been added so&lt;br /&gt;
				table.insert (error_list, alias);								-- add error alias to the error list&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			value = args[alias];												-- not yet selected an alias, so select this one&lt;br /&gt;
			selected = alias;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return value, selected;														-- return newly selected alias, or previously selected alias&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ M A I N T _ C A T &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.maint_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
To prevent duplication, the added_maint_cats table lists the categories by key that have been added to z.maint_cats_t.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_maint_cat (key, arguments)&lt;br /&gt;
	if not added_maint_cats [key] then&lt;br /&gt;
		added_maint_cats [key] = true;											-- note that we&#039;ve added this category&lt;br /&gt;
		table.insert (z.maint_cats_t, substitute (cfg.maint_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ P R O P _ C A T &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.prop_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
&lt;br /&gt;
foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages&lt;br /&gt;
may be categorized but multiples of the same language are not categorized.&lt;br /&gt;
&lt;br /&gt;
added_prop_cats is a table declared in page scope variables above&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_prop_cats = {};														-- list of property categories that have been added to z.prop_cats_t&lt;br /&gt;
&lt;br /&gt;
local function add_prop_cat (key, arguments, key_modifier)&lt;br /&gt;
	local key_modified = key .. ((key_modifier and key_modifier) or &#039;&#039;);		-- modify &amp;lt;key&amp;gt; with &amp;lt;key_modifier&amp;gt; if present and not nil&lt;br /&gt;
	&lt;br /&gt;
	if not added_prop_cats [key_modified] then&lt;br /&gt;
		added_prop_cats [key_modified] = true;									-- note that we&#039;ve added this category&lt;br /&gt;
		table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
		table.insert (z.prop_keys_t, &#039;cs1-prop-&#039; .. key);						-- convert key to class for use in the citation&#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S A F E _ F O R _ I T A L I C S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Protects a string that will be wrapped in wiki italic markup &#039;&#039; ... &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note: We cannot use &amp;lt;i&amp;gt; for italics, as the expected behavior for italics specified by &#039;&#039;...&#039;&#039; in the title is that&lt;br /&gt;
they will be inverted (i.e. unitalicized) in the resulting references.  In addition, &amp;lt;i&amp;gt; and &#039;&#039; tend to interact&lt;br /&gt;
poorly under Mediawiki&#039;s HTML tidy.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function safe_for_italics (str)&lt;br /&gt;
	if not is_set (str) then return str end&lt;br /&gt;
&lt;br /&gt;
	if str:sub (1, 1) == &amp;quot;&#039;&amp;quot; then str = &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot; .. str; end&lt;br /&gt;
	if str:sub (-1, -1) == &amp;quot;&#039;&amp;quot; then str = str .. &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;; end&lt;br /&gt;
	&lt;br /&gt;
	return str:gsub (&#039;\n&#039;, &#039; &#039;);												-- Remove newlines as they break italics.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W R A P _ S T Y L E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Applies styling to various parameters.  Supplied string is wrapped using a message_list configuration taking one&lt;br /&gt;
argument; protects italic styled parameters.  Additional text taken from citation_config.presentation - the reason&lt;br /&gt;
this function is similar to but separate from wrap_msg().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wrap_style (key, str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	elseif in_array (key, {&#039;italic-title&#039;, &#039;trans-italic-title&#039;}) then&lt;br /&gt;
		str = safe_for_italics (str);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return substitute (cfg.presentation[key], {str});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ S E P _ L I S T &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
make a separated list of items using provided separators.&lt;br /&gt;
	&amp;lt;sep_list&amp;gt; - typically &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
	&amp;lt;sep_list_pair&amp;gt; - typically &#039;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
	&amp;lt;sep_list_end&amp;gt; - typically &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&#039; or &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&amp;amp;&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
defaults to cfg.presentation[&#039;sep_list&#039;], cfg.presentation[&#039;sep_list_pair&#039;], and cfg.presentation[&#039;sep_list_end&#039;]&lt;br /&gt;
if &amp;lt;sep_list_end&amp;gt; is specified, &amp;lt;sep_list&amp;gt; and &amp;lt;sep_list_pair&amp;gt; must also be supplied&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)&lt;br /&gt;
	local list = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	if not sep_list then														-- set the defaults&lt;br /&gt;
		sep_list = cfg.presentation[&#039;sep_list&#039;];&lt;br /&gt;
		sep_list_pair = cfg.presentation[&#039;sep_list_pair&#039;];&lt;br /&gt;
		sep_list_end = cfg.presentation[&#039;sep_list_end&#039;];&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if 2 &amp;gt;= count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list_pair);							-- insert separator between two items; returns list_seq[1] then only one item&lt;br /&gt;
	elseif 2 &amp;lt; count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list, 1, count - 1);					-- concatenate all but last item with plain list separator&lt;br /&gt;
		list = table.concat ({list, list_seq[count]}, sep_list_end);			-- concatenate last item onto end of &amp;lt;list&amp;gt; with final separator&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E L E C T _ O N E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Chooses one matching parameter from a list of parameters to consider.  The list of parameters to consider is just&lt;br /&gt;
names.  For parameters that may be enumerated, the position of the numerator in the parameter name is identified&lt;br /&gt;
by the &#039;#&#039; so |author-last1= and |author1-last= are represented as &#039;author-last#&#039; and &#039;author#-last&#039;.&lt;br /&gt;
&lt;br /&gt;
Because enumerated parameter |&amp;lt;param&amp;gt;1= is an alias of |&amp;lt;param&amp;gt;= we must test for both possibilities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generates an error if more than one match is present.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function select_one (args, aliases_list, error_condition, index)&lt;br /&gt;
	local value = nil;															-- the value assigned to the selected parameter&lt;br /&gt;
	local selected = &#039;&#039;;														-- the name of the parameter we have chosen&lt;br /&gt;
	local error_list = {};&lt;br /&gt;
&lt;br /&gt;
	if index ~= nil then index = tostring(index); end&lt;br /&gt;
&lt;br /&gt;
	for _, alias in ipairs (aliases_list) do									-- for each alias in the aliases list&lt;br /&gt;
		if alias:match (&#039;#&#039;) then												-- if this alias can be enumerated&lt;br /&gt;
			if &#039;1&#039; == index then												-- when index is 1 test for enumerated and non-enumerated aliases&lt;br /&gt;
				value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- first test for non-enumerated alias&lt;br /&gt;
			end&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, true, value, selected, error_list);	-- test for enumerated alias&lt;br /&gt;
		else&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- test for non-enumerated alias&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #error_list &amp;gt; 0 and &#039;none&#039; ~= error_condition then						-- for cases where this code is used outside of extract_names()&lt;br /&gt;
		for i, v in ipairs (error_list) do&lt;br /&gt;
			error_list[i] = wrap_style (&#039;parameter&#039;, v);&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (error_list, wrap_style (&#039;parameter&#039;, selected));&lt;br /&gt;
		set_message (error_condition, {make_sep_list (#error_list, error_list)});&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return value, selected;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; R E M O V E _ W I K I _ L I N K &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Gets the display text from a wikilink like [[A|B]] or [[B]] gives B&lt;br /&gt;
&lt;br /&gt;
The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup).&lt;br /&gt;
&lt;br /&gt;
In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label&lt;br /&gt;
if str was wrapped in wikilink markup.  Presumably, this is because without wikimarkup in str, there is no match&lt;br /&gt;
in the initial gsub, the replacement function l() doesn&#039;t get called.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function remove_wiki_link (str)&lt;br /&gt;
	return (str:gsub (&amp;quot;%[%[([^%[%]]*)%]%]&amp;quot;, function(l)&lt;br /&gt;
		return l:gsub (&amp;quot;^[^|]*|(.*)$&amp;quot;, &amp;quot;%1&amp;quot; ):gsub (&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
	end));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ W I K I L I N K &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts.&lt;br /&gt;
If str is a complex wikilink ([[L|D]]):&lt;br /&gt;
	returns wl_type 2 and D and L from [[L|D]];&lt;br /&gt;
if str is a simple wikilink ([[D]])&lt;br /&gt;
	returns wl_type 1 and D from [[D]] and L as empty string;&lt;br /&gt;
if not a wikilink:&lt;br /&gt;
	returns wl_type 0, str as D, and L as empty string.&lt;br /&gt;
&lt;br /&gt;
trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and&lt;br /&gt;
treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes).&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_wikilink (str)&lt;br /&gt;
	local D, L&lt;br /&gt;
	local wl_type = 2;															-- assume that str is a complex wikilink [[L|D]]&lt;br /&gt;
&lt;br /&gt;
	if not str:match (&#039;^%[%[[^%]]+%]%]$&#039;) then									-- is str some sort of a wikilink (must have some sort of content)&lt;br /&gt;
		return 0, str, &#039;&#039;;														-- not a wikilink; return wl_type as 0, str as D, and empty string as L&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	L, D = str:match (&#039;^%[%[([^|]+)|([^%]]+)%]%]$&#039;);							-- get L and D from [[L|D]] &lt;br /&gt;
&lt;br /&gt;
	if not is_set (D) then														-- if no separate display&lt;br /&gt;
		D = str:match (&#039;^%[%[([^%]]*)|*%]%]$&#039;);									-- get D from [[D]] or [[D|]]&lt;br /&gt;
		wl_type = 1; &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	D = mw.text.trim (D, &#039;%s|&#039;);												-- trim white space and pipe characters &lt;br /&gt;
	return wl_type, D, L or &#039;&#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S T R I P _ A P O S T R O P H E _ M A R K U P &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
Strip wiki italic and bold markup from argument so that it doesn&#039;t contaminate COinS metadata.&lt;br /&gt;
This function strips common patterns of apostrophe markup.  We presume that editors who have taken the time to&lt;br /&gt;
markup a title have, as a result, provided valid markup. When they don&#039;t, some single apostrophes are left behind.&lt;br /&gt;
&lt;br /&gt;
Returns the argument without wiki markup and a number; the number is more-or-less meaningless except as a flag&lt;br /&gt;
to indicate that markup was replaced; do not rely on it as an indicator of how many of any kind of markup was&lt;br /&gt;
removed; returns the argument and nil when no markup removed&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function strip_apostrophe_markup (argument)&lt;br /&gt;
	if not is_set (argument) then&lt;br /&gt;
		return argument, nil;													-- no argument, nothing to do&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil == argument:find ( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then								-- Is there at least one double apostrophe?  If not, exit.&lt;br /&gt;
		return argument, nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local flag;&lt;br /&gt;
	while true do&lt;br /&gt;
		if argument:find (&amp;quot;&#039;&#039;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- bold italic (5)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&#039;%&#039;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);					-- remove all instances of it&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- italic start and end without content (4)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&#039;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- bold (3)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&amp;quot;, 1, true) then								-- italic (2)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		else&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return argument, flag;														-- done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T S &amp;gt;----------------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	add_maint_cat = add_maint_cat,												-- exported functions&lt;br /&gt;
	add_prop_cat = add_prop_cat,&lt;br /&gt;
	error_comment = error_comment,&lt;br /&gt;
	has_accept_as_written = has_accept_as_written,&lt;br /&gt;
	hyphen_to_dash = hyphen_to_dash,&lt;br /&gt;
	in_array = in_array,&lt;br /&gt;
	is_set = is_set,&lt;br /&gt;
	is_wikilink = is_wikilink,&lt;br /&gt;
	make_sep_list = make_sep_list,&lt;br /&gt;
	make_wikilink = make_wikilink,&lt;br /&gt;
	remove_wiki_link = remove_wiki_link,&lt;br /&gt;
	safe_for_italics = safe_for_italics,&lt;br /&gt;
	select_one = select_one,&lt;br /&gt;
	set_message = set_message,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	strip_apostrophe_markup = strip_apostrophe_markup,&lt;br /&gt;
	substitute = substitute,&lt;br /&gt;
	wrap_style = wrap_style,&lt;br /&gt;
&lt;br /&gt;
	z = z,																		-- exported table&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nazarzadeh</name></author>
	</entry>
</feed>