بۆ ناوەڕۆک بازبدە

میدیاویکی:Gadget-Extra-Editbuttons-kurdishwikitools.js: جیاوازیی نێوان پێداچوونەوەکان

لە ئینسایکڵۆپیدیای ئازادی ویکیپیدیاوە
ناوەڕۆکی سڕاو ناوەڕۆکی زیادکراو
+ بە پەشتۆ
ئێستا حیسابی کەسی سێیەمی تاک زۆر بە چاکی لە گۆڕینی ئە ← دە کراوە.
ھێڵی ٩٧٣: ھێڵی ٩٧٣:
text = text.replace(
text = text.replace(
new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|پێدا|تێدا|تێڕا|پێڕا|لێڕا|تێوە|پێوە|ڕێک|پێک|تێک|وێک)?ئە(" + dictionary.regîKar + ")(م|ین|ت|یت|ن|ات|ێت|ێ|ی|ا)(ە|ەوە)?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|پێدا|تێدا|تێڕا|پێڕا|لێڕا|تێوە|پێوە|ڕێک|پێک|تێک|وێک)?ئە(" + dictionary.regîKar + ")(م|ین|ت|یت|ن|ات|ێت|ێ|ی|ا)(ە|ەوە)?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
function (x) { return x.replace(/ئە/i, 'دە'); } // 'i' is just to trick bidi algorithm on code view
);

// for ئە ← دە وەک: ئەکات ← دەکات (کەسی سێیەمی تاک شازە)
text = text.replace(
new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|پێدا|تێدا|تێڕا|پێڕا|لێڕا|تێوە|پێوە|ڕێک|پێک|تێک|وێک)?ئە(ب|خ|خو|د|ڕو|شو|ک|گ|ھ)(ات)(ە|ەوە)?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
function (x) { return x.replace(/ئە/i, 'دە'); } // 'i' is just to trick bidi algorithm on code view
function (x) { return x.replace(/ئە/i, 'دە'); } // 'i' is just to trick bidi algorithm on code view
);
);

وەک پێداچوونەوەی ‏١٨:٢٩، ٢٧ی شوباتی ٢٠٢١

// [[fa:Mediawiki:Gadget-Extra-Editbuttons-persianwikitools.js]]

// <nowiki> // DO NOT REMOVE THIS LINE EVER
/**
 * Wikipedia specific Kurdish text style improvement tools
 * Tests: [[Mediawiki:Gadget-Extra-Editbuttons-tests.js]] [[وپ:تست]]
 * See also: [[Mediawiki:Gadget-Extra-Editbuttons-kurdishtools.js]]
 */
/*global kurdishTools, kurdishToolsDictionary, autoEd*/
var kurdishWikiTools = (function () {
	'use strict';
	var kurdishMonths = ["کانوونی دووەم", "شوبات", "ئازار", "نیسان", "ئایار", "حوزەیران", "تەممووز", "ئاب", "ئەیلوول", "تشرینی یەکەم", "تشرینی دووەم", "کانوونی یەکەم"];
	//http://www.entitycode.com/
	var htmlEntityCodes = {
		"&iexcl;": "¡", "&cent;": "¢", "&pound;": "£", "&curren;": "¤",
		"&yen;": "¥", "&brvbar;": "¦", "&sect;": "§", "&copy;": "©",
		"&middot;": "·", "&times;": "×", "&rdquo;": "”", "&dagger;": "†",
		"&Dagger;": "‡", "&euro;": "€", "&laquo;": "«", "&reg;": "®",
		"&deg;": "°", "&plusmn;": "±", "&sup2;": "²", "&sup3;": "³",
		"&para;": "¶", "&sup1;": "¹", "&raquo;": "»", "&frac14;": "¼",
		"&frac12;": "½", "&frac34;": "¾", "&iquest;": "¿", "&divide;": "÷",
		"&ndash;": "–", "&mdash;": "—", "&lsquo;": "‘", "&rsquo;": "’",
		"&ldquo;": "“", "&trade;": "™", "&bull;": "•", "&hellip;": "…",
		"&permil;": "‰", "&lsaquo;": "‹", "&rsaquo;": "›", "&larr;": "←",
		"&uarr;": "↑", "&rarr;": "→", "&darr;": "↓", "&harr;": "↔",
		"&crarr;": "↵", "&minus;": "−", "&radic;": "√", "&infin;": "∞",
		"&loz;": "◊", "&spades;": "♠", "&rfloor;": "⌋", "&nbsp;": " ",
		"&ne;": "≠", "&ap;": "≈", "&approx;": "≈", "&asymp;": "≈",
		"&rceil;": "⌉", "&lfloor;": "⌊", "&diams;": "♦", "&auml;": "ä",
		"&ouml;": "ö", "&uuml;": "ü", "&szlig;": "ß", "&aring;": "å",
		"&oline; ": "‾ ", "&aelig;": "æ", "&ccedil;": "ç", "&ntilde;": "ñ",
		"&acirc;": "â", "&aacute;": "á", "&agrave;": "à", "&#36;": "$",
		"&clubs;": "♣", "&hearts;": "♥", "&Prime;": "″", "&prime;": "′",
		"&lceil;": "⌈", "&mldr;": "…", "&bullet;": "•", "&grave;": "`",
		"&pm;": "±", "&acute;": "´", "&centerdot;": "·", "&half;": "½",
		"&Auml;": "Ä", "&Ouml;": "Ö", "&Uuml;": "Ü", "&rsquor;": "’",
		"&lsquor;": "‚", "&sbquo;": "‚", "&rdquor;": "”", "&bdquo;": "„",
		"&ldquor;": "„", "&ddagger;": "‡", "&div;": "÷", "&leq;": "≤",
		"&geq;": "≥", "&le;": "≤", "&ge;": "≥"
	}; // &quot; , &amp; &lt; &gt; &#124;
	var patterns = {
		arabicDigitsEnglishContext: /[a-z]([\|a-z %"'\._:\;,\-\\\/\(\)\#\^\+\d><–\[\]&?{}](?!\|\|))*\d|(\d|[a-z])[a-z %"'\._:\;\|,\-\\\/\(\)\#\^\+\d><–\[\]&?{}]*[a-z]\d*/gi,
		arabicTagEnclosed: /\{\{(?:بە عەرەبی|دەستپێکردنی عەرەبی|سەرەتای عەرەبی)\}\}([\s\S]*?)\{\{(?:کۆتایی عەرەبی)\}\}/g,
		LtRTagEnclosed: /\{\{(?:Ltr|Ltr)\}\}([\s\S]*?)\{\{(?:Ltr\/end|Ltr\/end|Ltr\/end)\}\}/g,
		argumentsBlacklist: /(?:accessdate|namespace|legend1start|image|میدیا|doi|style|ژپنک|width|bibcode|isbn|issn|pmid|arxiv|upright|upleft|padding|spacing|border|filename|ناوی پەڕگە)\s*\=\s*[^\|\}\]]*/gi,
		color: /#(?:[abcdef0-9]{8}|[abcdef0-9]{6}|[abcdef0-9]{3})/gi,
		//colorAsParameter: /\=\s*(?:[abcdef0-9]{8}|[abcdef0-9]{6}|[abcdef0-9]{3})(?:[\s\|\}]|$)/gi,
		// space, ", \t, \n, {, |, }, ... they will interfere with wiki markup
		decodeUriBlacklist: /(?:%20|%27|%5C|%5E|%60|%23|%25|%3C|%3E|%5B|%5D|%22|%09|%0A|%7B|%7C|%7D)/gi,
		diffLink: /\[\[(?:تایبەت|Special):(?:Diff|Diff)\/[^\|\]]*/gi,
		englishDate: /\d{1,2},? [a-z]{3,} \d{2,4}/gi, // 3, May 2013
		fileNames: /(?:پەڕگە|File|میدیا|Image)\:.*?(?=\||\]|\n|$)/gi, // don't capture | after
		fileParameter: /\|\s*(image|میدیا)\s*\=\s*.*/g,
		ipSign: /\[\[تایبەت:بەشدارییەکان.*?\]\]/g,
		isbn: /(?:ISBN|ISSN|PMID) [\d\-]*/gi,
		galleryTag: /<gallery.*?>[\s\S]*?<\/gallery>/g,
		htmlAttributes: /(?:style|perrow|colspan|color|rowspan|cellpadding|cellspacing|height|width|size|border|thumbtime|name|perrow|upright|upleft)\s*[\=\:]\s*(?:['\"].*?['\"]|[\da-z]+)/gi,
		htmlEntity: /&#\d+;/,
		imagePixelSize: /[\|=] *[x\d]+?(px|پیکسڵ)[\]\|\s]/g, // means it will capture |10px| and |10x10px|
		insideQuote: /[^ا]".*?"/g,
		wikilinkTargets: /\[[^\[|\]]+/g,
		nowikiTag:/<nowiki>.+?<\/nowiki>/g,
		preTag:/<pre.*?>.*?<\/pre>/g,
		insideHtmlComment: /<\!\-\-[\s\S]*?\-\->/g,
		linksOnEnglishContext: /[a-z][\:\,\. ]*\[\[[\da-z\-\, ]*/gi,
		mathTag: /<math.*?>[\s\S]*?<\/math>/g,
		otherLanguagesInline: /\{\{(?:بە .+?ی|ئینگ|ئینگلیزی|بە ئینگلیزی|عەرەبی|نووسەی عەرەبی|بە عەرەبی|فەرموودە|بە فارسی|بە پەشتۆ|بە ئوردوو|ئوردوو|[Ll]ang\-[au]r|[Ll]ang\-[fl]a|پینگ|و|وب|وەڵام بۆ|[Pp]ing)\|.*?\}\}/g,
		parameter: /\{\{\{\d+/gi,
		parenthesesAfterDigits: /\w\s?\([\w\s\.\-]*?\)/g,
		parenthesesHa: /\)ەکان/g,
		ref: /(?:<ref[^\/]*?>[\s\S]*?<\/ref>|<ref[^\/]*?\/>)/g, // inside <ref></ref> and <ref/>
		refname: /\<ref name\=.*?\>/g,
		citation:/\{\{\s*(?:[Cc]it|یادکرد).*?[_\s]*(?:\{\{.*?\}\}|[^\}])*\}\}/g,
		signatures: /\[\[(?:بەکارھێنەر|User|لێدوانی[ _]بەکارھێنەر|User[_ ]talk)\:.*?\]\]/gi,
		sourceTag: /(<source.*?>[\s\S]*?<\/source>|<syntaxhighlight.*?>[\s\S]*?<\/syntaxhighlight>|<code.*?>[\s\S]*?<\/code>|<timeline.*?>[\s\S]*?<\/timeline>)/g,
		tagNames: /<\/?[a-zA-Z\d]*/g,
		templateEnglishName: /(داڕێژە|Template):[a-z][a-z\d\-\+_]+/gi,
		templateWithEnglishName: /\{\{[ \_]*(?:داڕێژە|Template)?[\x00-\x7a~]*\|.*?\}\}/gi,
		templateParameterName: /\|\s*(?=[a-z_]*\d)[a-z_\d]*\s*\=/gi,
		globalExceptionTag: /(<nowiki>.+?<\/nowiki>|<!--[\s]*قت[\s]*-->.+?<!--[\s]*\/[\s]*قت[\s]*-->|\{\{قەدەغەکردنی تووڵامراز\|[\s\S]*?\}\})/gi,
		translatedUrl: /.(کام|نێت|ئای-ئاڕ)/g,
		boxVar: /([a-zA-Z][١٢٣٤٥٦٧٨٩٠]+) *\=/g,
		url: /\/\/.*?(?=[\s\n\|\}\]<]|$)/gi,	 // بەبێ https?: لەوانەیە
		mediawikiFunctions: /\{\{\#(?:\{\{.*?\}\}|[^\}])*\}\}/gi,
		articleTitleParts: new RegExp('\\s' + escapeRegExp(mw.config.get('wgTitle')).split(' ').join('\\s|\\s') + '\\s', 'g'),
		catgories:/\[\[(?:پۆل|[Cc]ategory)\:[^\]]+\]\]/gi
	};

	function escapeRegExp(string) {
		return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
	}

	function escapeRE( s ) {
		return s.replace( /([$()*+\-.?[\\\]^{|}])/g, '\\$1' );
	}

	function descendingFromComparetor(x, y) {
		return x.from - y.from;
	}
	function removeCheckDict(text){
		// كێشەی [[Special:Permalink/25174868#متن هایلایت‌شده]]
		var otext = ''
		while (otext!=text){
			otext = text
			text=text.replace(/\<span[^>]+CheckDictation\-marked[^>]+\>([^<>]+)\<\/span\>/g, '$1')
		}
		return text
	}
	function replaceExcept(text, callback, excepts) {
		var match, result = [], i, ranges, minRange, to, min, max;
		while (text !== '') {
			ranges = [];

			for (i in excepts) {
				if (excepts.hasOwnProperty(i)) {
					// a global regex should be reset before calls
					excepts[i].lastIndex = 0;
					match = excepts[i].exec(text);
					if (match !== null) {
						ranges.push({
							from: match.index,
							to: match.index + match[0].length
						});
					}
				}
			}

			// so nothing is matched
			if (ranges.length === 0) {
				result.push(callback(text));
				break;
			}

			minRange = ranges.sort(descendingFromComparetor)[0];
			min = minRange.from;

			to = [];
			for (i in ranges) {
				if (ranges.hasOwnProperty(i)) {
					if (ranges[i].from <= minRange.to) {
						to.push(ranges[i].to);
					}
				}
			}
			max = Math.max.apply(null, to);

			result.push(callback(text.substr(0, min)));
			result.push(text.substr(min, max - min));
			// console.log('Excepted: "' + text.substr(min, max - min) + '"');
			text = text.substr(max);
		}
		return result.join('');
	}

	function wikiConvertToKurdishCharacters(text) {
		return replaceExcept(
			text,
			kurdishTools.toStandardKurdishCharacters,
			[patterns.globalExceptionTag, patterns.otherLanguagesInline, patterns.arabicTagEnclosed, patterns.fileNames, patterns.signatures, patterns.url]
		);
	}

	if (!String.prototype.trim) { // if is not available currently
		String.prototype.trim = function () {
			return this.replace(/^\s+|\s+$/g, '');
		};
	}

	function autoFormatCleanReferences ( str ) {
		// خاوێنکردن autoFormater.js > cleanReferences
		str = str.replace(
			/<\s*references\s*(\s\b[^<>]*?)?\s*(?:\/|>\s*<\s*\/\s*references)\s*>/gi,
			'<references$1/>'
		);
		if (mw.config.get('wgNamespaceNumber') === 0){
			//ویکیپیدیای کوردی سەرچاوەیەک نییە بۆ سەرچاوەکان  
			str = str.replace(/\<ref[^>]*\>\[?(?:https?:)?\/\/ckb.(?:m\.)?wikipedia.org\/[^\<\n\}\]\[]+\]?\<\/ref\>/gi, '')
		};
		str = str.replace( /<\s*references\s*(\s\b[^<\/>]*?)?\s*>/gi, '<references$1>' );
		str = str.replace( /<\s*\/\s*references\s*>/gi, '<\/references>' );
		var re = /(<references[^<\/>]*)>/g, m;
		while ( m = re.exec( str ) ) {
			if ( str.indexOf( '<\/references>', m.index ) < 0 ) {
				str = str.slice( 0, m.index ) + m[1] + '/>' + str.slice( m.index + m[0].length );
			}
		}
		str = str.replace( /< *ref\s*(\s\b[^<>]*?)\s*(?:\/+|>\s*<\s*\/+\s*ref) *>/gi, '<ref$1/>' );

		/* remove line breaks with assays only the top of the article */
		var i = str.indexOf( '<references' ),
			slice;
		if ( i > 0 ) {
			slice = str.slice( i );
			slice = slice.replace( /< *ref\s*(\s\b[^<\/>]*?)?\s*>[\t ]*/gi, '<ref$1>' );
			slice = slice.replace( /(?:(\n[\t ]*)|[\t ]*)<\s*\/+\s*ref\s*>/gi, '$1<\/ref>' );
			str = str.slice( 0, i );
		}
		str = str.replace( /< *ref\s*(\s\b[^<\/>]*?)?\s*>\s*/gi, '<ref$1>' );
		str = str.replace( /\s*<\s*\/+\s*ref\s*>/gi, '<\/ref>' );
		if ( slice ) {
			str += slice;
		}

		/* Space between the end of block and remove <ref> or two <ref> */
		str = str.replace( /([!,.;?]|<ref\b[^<>]*(?:\/|>[^<>]*<\/ref)>) +(?=<ref[ >])/gi, '$1' );
		/* Two identical punctuation before and cut after a <ref> on one */
		str = str.replace( /([!,.:;?])(<ref\b[^<>]*(?:\/|>[^<>]*<\/ref)>)\1/gi, '$1$2' );
		/* ref inside small */
		return str.replace( /\<small\> *(\<ref[^\<]+\<\/ref\>)<\/small\>/gi, '$1' );
	}

	function autoFormatCleanTags(str) {
		str = str.replace( /(<\/?s)trike\b/gi, '$1' );
		str = str.replace(
			/\<u\>([^\<]+)\<\/u\>/gi,
			"''$1''"
		);
		str = str.replace(
			/\<center\>/gi,
			"{{چینی ناوەند}}"
		);
		str = str.replace(
			/\<\/center\>/gi,
			"{{کۆتایی}}"
		);
		str = str.replace(
			/<sub\s*(>[^<>]*<)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*>/gi,
			'<sub$1/sub>'
		);
		str = str.replace(
			/<sup\s*(>[^<>]*<)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*>/gi,
			'<sup$1/sup>'
		);

		/* Drop default font attributes */
		str = str.replace(
			/(<font\b[^<>]*?)\s+fa\w+(?:[\s"',=]*(?:Arial|Helvetica(?:\W?N\w*)?|sans\W?serif)\b)+[\s"';]*(?=\s\w+\s*=|>)/gi,
			'$1'
		);
		str = str.replace(
			/(<font\b[^<>]*?)\s+size[\s"',=]*(?:-1\b|2\b|100\b[ ,.]*\d*%|1(?:\.0*)?em\b)["';]*/gi,
			'$1'
		);
		/* Remove inline elements with no attributes */
		while ( /<(font|span)\s*>\s*(?:<(?!\1)|[^<])*?\s*<\/\1[^<>]*>/i.test( str ) ) {
			str = str.replace( /<(font|span)\s*>[ \n]*((?:<(?!\1)|[^<])*?)[ \n]*<\/\1[^<>]*>/gi, '$2' );
		}
		str = str.replace(
			/<font\s+color[\s"',=]*(#[\dA-F]{3,6}|[a-z]{3,20})[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
			'<span style="color:$1;">$2<\/span>'
		);
		str = str.replace(
			/<font\s+size[\s"',=]*(?:-[2-9]|[01])[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
			'<small>$1<\/small>'
		);
		str = str.replace(
			/<font\s+size[\s"',=]*(?:[+-]0|3)[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
			'<span style="font-size:larger;">$1<\/span>'
		);
		/* Merge nested inline tags */
		str = str.replace(
			/<(abbr|cite|mark|q|s|small|u)\s*><(font|span)\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*>([^<>]*)<\/\2\s*>\s*(?=<\/\1\s*>)/gi,
			'<$1 style="$3;">$4'
		);
		str = str.replace(
			/(<span\b[^<>]*?)\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*><span\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*>([^<>]*)<\/span\s*>\s*(?=<\/span\s*>)/gi,
			'$1 style="$2; $3;">$4'
		);

		/* Verschiedenste Formen von HTML-Zeilenumbrüchen durch einheitliche ersetzen */
		str = str.replace( /<(?:[\s\/\\]*br\b)+\s*(\s\w[^<>]*?)?[\s.\/\\]*>/gi, '<br$1/>' );
		/* Unnötige HTML-Zeilenumbrüche entfernen, wenn sowieso ein Absatz folgt */
		str = str.replace( / *(?:{{ھن}}|<br \/>)(?=[\r\n][\n#*:;\|}\]])/gi, '' );
		str = str.replace(
			/<(ref|small|su[bp])\b\s*(\s\w[^<>]*?)?\s*><small\s*>([^<>]*)<\/small\s*><\/\1\s*>/gi,
			'<$1$2>$3<\/$1>'
		);
		str = str.replace(
			/<small\s*><(ref|small|su[bp])\b\s*(\s\w[^<>]*?)?\s*?( ?\/|>[^<>]*<\/\1)\s*><\/small\s*>/gi,
			'<$1$2$3>'
		);
		/* Drop old navigation bar wrapper, see [[Template:NaviBlock]] */
		return str.replace(
			/<div\s+class[^<>\w]*BoxenVerschmelzen[^<>\w]*>\s*(\{\{[^#:<>{}]*\}\})\s*<\/div>/gi,
			'$1'
		);
	}

	function autoFormatCleanDuplicateLinks(str) {
		/* Exclude files and infoboxes from the start of the article */
		var m = /^(?:\s*\[\[\w+:(?:\[\[[^\n\]]*\]\]|[^\n\]])*\]\])*(?:\s*\{\{(?:\{\{[^}]*\}\}|[^}])*\}\})+/.exec( str ),
			start = m ? m[0].length : 0,
			found = [],
			a = [];
		/* Unlink years that are linked more than one time */
		var re = /\[\[ *([١٢][١٢٣٤٥٦٧٨٩٠]{3}|[١٢][١٢٣٤٥٦٧٨٩٠]{3} \((زایینی|ھەیڤی)\)) *\]\]/g;
		/* In each case the first discovery of a year noted entlinken thereafter */
		while ( m = re.exec( str ) ) {
			if ( m.index >= start ) {
				found[m[1]] ? a.push( m ) : found[m[1]] = true;
			}
		}
		var r = '',
			p = 0;
		for ( var i = 0; i < a.length; i++ ) {
			r += str.slice( p, a[i].index ) + a[i][1];
			p = a[i].index + a[i][0].length;
		}
		return p ? r + str.slice( p ) : str;
	}

	function autoFormatCleanDates(str){
		var months = ["کانوونی دووەم", "شوبات", "ئازار", "نیسان", "ئایار", "حوزەیران", "تەممووز", "ئاب", "ئەیلوول", "تشرینی یەکەم", "تشرینی دووەم", "کانوونی یەکەم", 'خاکەلێوە', 'گوڵان', 'جۆزەردان', 'پوشپەڕ',
			'گەلاوێژ', 'خەرمانان', 'ڕەزبەر', 'خەزەڵوەر', 'سەرماوەز', 'بەفرانبار', 'ڕێبەندان', 'ڕەشەمێ',"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
			
		/* بۆ ڕاستکردنەوەی شێوازە ناستانداردەکانی ڕێکەوتەکان بە ستانداردی ویکیپیدیا (نم: ١٥/٧/٢٠٢٠ بۆ ١٥ی تەممووزی ٢٠٢٠) بەپێی [[وپ:ڕوژ]] */
		var ckbMonths = {
			'٠١': 'کانوونی دووەم',
			'٠٢': 'شوبات',
			'٠٣': 'ئازار',
			'٠٤': 'نیسان',
			'٠٥': 'ئایار',
			'٠٦': 'حوزەیران',
			'٠٧': 'تەممووز',
			'٠٨': 'ئاب',
			'٠٩': 'ئەیلوول',
			'١': 'کانوونی دووەم',
			'٢': 'شوبات',
			'٣': 'ئازار',
			'٤': 'نیسان',
			'٥': 'ئایار',
			'٦': 'حوزەیران',
			'٧': 'تەممووز',
			'٨': 'ئاب',
			'٩': 'ئەیلوول',
			'١٠': 'تشرینی یەکەم',
			'١١': 'تشرینی دووەم',
			'١٢': 'کانوونی یەکەم',
			'01': 'کانوونی دووەم',
			'02': 'شوبات',
			'03': 'ئازار',
			'04': 'نیسان',
			'05': 'ئایار',
			'06': 'حوزەیران',
			'07': 'تەممووز',
			'08': 'ئاب',
			'09': 'ئەیلوول',
			'1': 'کانوونی دووەم',
			'2': 'شوبات',
			'3': 'ئازار',
			'4': 'نیسان',
			'5': 'ئایار',
			'6': 'حوزەیران',
			'7': 'تەممووز',
			'8': 'ئاب',
			'9': 'ئەیلوول',
			'10': 'تشرینی یەکەم',
			'11': 'تشرینی دووەم',
			'12': 'کانوونی یەکەم',
		};
		var sep = /[\/\\\-−―–—]/.source;
		var day = /([0-9٠-٩]{1,2}(?!\|))/.source;
		var month = day;
		var year = /([0-9٠-٩]{4}(?!\|))/.source;
		function dateReplace(m, day, month, year) {
			var ckbMonth = ckbMonths[month];
			if (!ckbMonth) {
				return m;
			}
			if (year.length == 2) {
				[year, day] = [day, year];
			}
			return day + 'ی ' + ckbMonth + 'ی ' + year;
		}
		str = str.replace(
			new RegExp(day + sep + month + sep + year, 'g'), dateReplace
			).replace(
			new RegExp(year + sep + month + sep + day, 'g'), dateReplace
			);

		/* Add missing space between day and month */
		str = str.replace( new RegExp( '([\\s!\'(>|„](?:3[01]|[12]\\d|0?[1-9])\\.?)(?=(?:' +
			months.join( '|' ) + ')\\b)', 'g' ), '$1 ' );
		/* No non-breaking space between month and year */
		str = str.replace( new RegExp( '(\\b(?:3[01]|[12]\\d|0?[1-9])\\.?(?:[\\s\\xA0]|&nbsp;)+(?:' +
			months.join( '|' ) + '))(?:\xA0|&nbsp;)(?=[12]\\d{3}\\b)', 'g' ), '$1 ' );
		/* Missverständliches deutsches Datumsformat durch Langform ersetzen */
		var separator= ' ';
		str = str.replace(
			/([\s'(>„])(3[01]|[12]\d|0?[1-9])\. *(1[012]|0?[1-9])\. *(?=[12]\d{3}[!,.:;?]?[\s')<\]“])/g,
			function( $0, $1, $2, $3 ) {
				return $1 + ( $2 | 0 ) + separator + months[$3 | 0] + ' ';
			}
		);
		// ژمارەی کوردی
		str = str.replace( new RegExp( '([\\s!\'(>|„](?:٣[٠١]|[١٢][١٢٣٤٥٦٧٨٩]|٠?[١٢٣٤٥٦٧٨٩])\\.?)(?=(?:' +
			months.join( '|' ) + ')[\\s\')<\\]»}|])', 'g' ), '$1 ' );
		/* No non-breaking space between month and year */
		str = str.replace( new RegExp( '([\\s\'(>«](?:٣[٠١]|[١٢][١٢٣٤٥٦٧٨٩]|٠?[١٢٣٤٥٦٧٨٩])\\.?(?:[\\s\\xA0]|&nbsp;)+(?:' +
			months.join( '|' ) + '))(?:\xA0|&nbsp;)(?=[١٢][١٢٣٤٥٦٧٨٩]{3}[\\s\')<\\]»}|])', 'g' ), '$1 ' );
		/* Missverständliches deutsches Datumsformat durch Langform ersetzen */
		var separator= ' ';
		str = str.replace(
			/([\s'(>«])(٣[٠١]|[١٢][١٢٣٤٥٦٧٨٩]|٠?[١٢٣٤٥٦٧٨٩])\. *(١[٠١٢]|٠?[١٢٣٤٥٦٧٨٩])\. *(?=[١٢][١٢٣٤٥٦٧٨٩]{3}[!,.:;?]?[\s')<\]»}|])/g,
			function( $0, $1, $2, $3 ) {
				return $1 + ( $2 | 0 ) + separator + months[$3 | 0] + ' ';
			}
		);
		return str
	}

	function quotation(text) {
		// این تابع زمانی گیومه را به فارسی تیدیل می‌کند که در پاراگراف مورد نظر تعداد گیومهٔ لاتین زوج باشد.
		var lines = text.split(/\n\n/);
		var result = [];
		for (var i = 0; i < lines.length; ++i) {
			var line = lines[i];
			if ((line.match(/"/g) || []).length % 2 === 0) { // count of quote marks
				// تبدیل گیومهٔ لاتین به فارسی
				// این دستور در ابتدا باشد تا فاصله‌های قبل و بعد گیومه هم اصلاح شود
				line = line.replace(
					new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.\\)]+)"((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '؛\\n،]+?(?:\\]\\]|\\.|\\<|\\:|…|))"([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{\\(]|$)', 'g'),
					'$1«$2»$3'
				);
				// if some of quote marks are remained from conversion, something might wrong, revert
				var testline=line.replace(/(?:<ref[^\/]*?>[\s\S]*?<\/ref>|<ref[^\/]*?\/>)/g,'')

				if (testline.match(/"/g)) {
					line = lines[i];
				}
			}
			// رفع مشکل استفاده از ـً به جای گیومه لاتین در متن فارسی
			// بەکاریان ناھێنین
			//line=line.replace(new RegExp('ا\\"([ ]*[' +kurdishTools.kurdishCharacters + '])', 'g'), 'اً$1')
			//line=line.replace(new RegExp('ا\\”([ ]*[' +kurdishTools.kurdishCharacters + '])', 'g'), 'اً$1')
			// ”“ گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)“((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))”([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			//وارونه ”“ تبدیل 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)”((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))“([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			// ‘’ گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)‘((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))’([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			//وارونه ‘’ تبدیل 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)’((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))‘([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			// ‚’ گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)‚((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))’([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			// „” گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)„((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))”([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			// << >> گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)\\<\\<((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))\\>\\>([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			// (()) گۆڕینی 
			line = line.replace(
				new RegExp('(^|[' + kurdishTools.kurdishCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)\\(\\(((?:\\[\\[|).*?[' + kurdishTools.kurdishCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))\\)\\)([' + kurdishTools.kurdishCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
				'$1«$2»$3'
			);
			result.push(line);
		}
		return result.join('\n\n');
	}
	/**
	 * زیادکردنی ستوون بۆ داڕێژەی سەرچاوەکان
	 * @param {string} text محتوا
	*/
	function addColumnToRefTemplate(text) {
		var refTemplate = /\{\{سەرچاوەکان([^\}\{]+)?\}\}/i.exec(text), needChange = false;
		if (refTemplate) {
			if ((text.match(/<ref/gi) || []).length >= 6) {
				if (refTemplate[1] !== undefined) {
					var refParams = refTemplate[1].split('|');
					for (var i = refParams.length - 1; i >= 0; i--) {
						// ئەگەر ھیچ پارامەترێکی پێش-ستوون یان پانی پێناسە نەکرابوو، ھیچ گۆڕانکارییەک ڕوونادات.
						if (refParams[i].length == 1 || refParams[i].indexOf('width') > -1) {
							needChange = true;
							break;
						}
					}
				}
				if (refTemplate[1] === undefined || !needChange) {
					return text.replace(refTemplate[0], refTemplate[0].replace('}}', '|٢}}'));
				}
			}
		}else{
			if ((mw.config.get('wgNamespaceNumber') === 0 && mw.config.get("wgEditMessage")==='editing')||mw.config.get('wgPageName') ==="ویکی‌پدیا:ویکی‌پروژه_ابزارها/آزمایش_واحد") {
				if ((text.match(/<ref/gi) || []).length > 0 &&  /\{\{سەرچاوەکان([^\}\{]+)?\}\}/i.exec(text) !=null) {
					var text2 = text.replace ('== سەرچاوەکان ==','== سەرچاوەکان ==\n{{سەرچاوەکان}}')
					if (text2==text){
						text2 = text.replace ('== سەرچاوەکان ==','== سەرچاوەکان ==\n{{سەرچاوەکان}}')
					}
					if (text2==text){
						text2 = text.replace ('[[پۆل:','== سەرچاوەکان ==\n{{سەرچاوەکان}}\n\n[[پۆل:')
					}
					if (text2==text){
						text2 = text + '\n== سەرچاوەکان ==\n{{سەرچاوەکان}}'
					}
					text=text2
				}
			}
		}
		return text;
	}
	
	/**
	 * چاکسازیی بەستەرەکان
	 * @param  {string} text محتوا
	 * @return {string}
	 */
	function fixBadLinks(text) {
		// سڕینەوەی دەقی بەستەر ئەگەر یەکسان بوو بە ناونیشانی بەستەرەکە؛ بۆ نموونە [[ویکیپیدیا|ویکیپیدیا]]
		text = text.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, '[[$1]]');

		// سڕینەوەی بەستەری ساڵ و ڕۆژی مانگەکە
		text = text.replace(/\[{2}([٠-٩]+\u06CC?(?: [\)\(\u0600-\u07B0 \u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2]+)?)(?:\|([^\]\|\[]+))?\]{2}/g, function (match, p1, p2) { 
		// تەنیا ساڵەکە دەگەڕێنێتەوە ئەگەر بەشێوەی [[ساڵ|ھەمان ساڵ]] نووسرابێت
		if (p1 !== p2 && p1.replace(/ \((زایینی|کۆچی|خورشیدی|شمسی|پ.ز.|پێش زایین)\)/g,'') === p2){
			return p2;
		}//[[Special:Permalink/19908981#حذف پیوند تاریخ‌ها]]
		if (p2 === undefined || p1 === p2) {
			// ئەگەر بەستەرەکە بۆ ڕۆژ و مانگە، دڵنیا ببەوە کە یەک لە مانگەکان لەناو نووسینەکەیە تا خۆت لە سەرلێشێوان و تێکەڵبوون بەدوور بگریت.
			if (p1.indexOf(" ") > -1) {
				var
					months = ["خاکەلێوە", "گوڵان", "جۆزەردان", "پوشپەڕ", "گەلاوێژ", "خەرمانان", "ڕەزبەر", "خەزەڵوەر", "سەرماوەز", "بەفرانبار", "ڕێبەندان", "ڕەشەمێ",
	"کانوونی دووەم", "شوبات", "ئازار", "نیسان", "ئایار", "حوزەیران", "تەممووز", "ئاب", "ئەیلوول", "تشرینی یەکەم", "تشرینی دووەم", "کانوونی یەکەم",
	"موحەڕڕەم", "سەفەر", "ڕەبیعەلئەووەڵ", "ڕەبیعەلئاخیر", "جومادەلئوولا", "جومادەلئاخیر", "ڕەجەب", "شەعبان", "ڕەمەزان", "شەووال", "زولقەعدە", "زولحەججە"],
					i;
				for (i = months.length - 1; i >= 0; i--) {
					if (p1.indexOf(months[i]) > -1) {
						return p1.replace(/ \((زایینی|کۆچی|خورشیدی|شمسی|پ.ز.|پێش زایین)\)/g,'');
					}
				}
				return "[[" + p1 + "]]";
			}
			return p1;
		}
		// ئەگەر نووسینی بەستەرە جێگرەوەکە بەرامبەر بەستەری ساڵەکە بوو، ئەوا نووسینە جێگرەوەکە بھێنەرەوە.
		return p2;
	});

	return text;
}

	function wikiPunctuation(text) {
		text = autoFormatCleanReferences (text)
		text = autoFormatCleanTags(text)
		text = autoFormatCleanDuplicateLinks(text)
		text = replaceExcept(
			text,
			function (text) {
				return quotation(text);
			},
			[patterns.ref]
		);
		if (mw.config.get('wgNamespaceNumber') === 0){
			var old_text=text.replace(/\=\=/g, '')
			if (old_text==text){//ئەگەر وتاری بەش بەش نەبێت
				text=text.replace(/(\n\{\{ھن\}\}|\n\n)(\s|_|)\'\'\'(.*?)\'\'\'(\s|_|)(\{\{ھن\}\}|\n)([\n\#\*])/g, '\n\n== $3 ==\n$6')
			}
		}
		text = replaceExcept(
			text,
			function (text) {
				text = text.replace(
					new RegExp('([' + kurdishTools.kurdishCharactersNoVowels + '])ـ+([' + kurdishTools.kurdishCharactersNoVowels + '])', 'g'),
					'$1$2'
				);
				return text.replace(new RegExp('([' + kurdishTools.kurdishCharacters + '])(\\]\\]|), (\\[\\[|)?(?=[' + kurdishTools.kurdishCharacters + "])", 'g'), '$1$2، $3');
			},
			[patterns.globalExceptionTag, patterns.fileNames, patterns.url, patterns.galleryTag, patterns.sourceTag, patterns.translatedUrl, patterns.parenthesesHa]
		);
		text = replaceExcept(
			text,
			function (text) {
				return text.replace(/(<\/ref>)\s+(<ref)/g, '$1$2').replace(/([^=])\s+<ref(?!erences)/g, '$1<ref');
			},
			[/\{\{(سەرچاوە|سەرچاوەکان|پەراوێز)\s*\|[\s\S]*/]
		);
		return replaceExcept(
			text,
			function (text) {
				return kurdishTools.punctuation(text)
					.replace(/^([*#]+)([^*#\:\s])/mg, '$1 $2') // Adds a space after the # or * for lists
					.replace(/^([*#]+) {2,}([^*#\:\s])/mg, '$1 $2'); // Trim more that one space after the # or * for lists
			},
			[patterns.globalExceptionTag, patterns.mathTag, patterns.fileNames, patterns.url, patterns.wikilinkTargets,
				patterns.galleryTag, patterns.sourceTag, patterns.translatedUrl, patterns.parenthesesHa]
		)
			.replace(/\u00A0/g, ' ') // convert implicit nbsp to space, probably is being added by some bug on ContentTranslation
			.replace(/٬ /g, '، ')
			.replace(new RegExp('([' + kurdishTools.kurdishCharacters + '\]])٬', 'g'), '$1،')
			.replace(new RegExp('([' + kurdishTools.kurdishCharacters + '])(\]\]|»|)[ ]*[,]', 'g'), '$1$2، ')
			.replace(/\[\[([^\|\]]+)\|(\'{2,3})\1'{2,3}\]\]/g,'$2[[$1]]$2') // for [[foo|'''foo''']] > '''[[foo]]'''
			.replace(new RegExp('\\[\\[(' + escapeRE(mw.config.get('wgPageName')) + ')\\]\\]', 'g'), '$1') // سڕینەوەی بەستەردان بە خوودی پەڕە
			//Retrieved from https://tools.wmflabs.org/checkwiki/cgi-bin/checkwikin.cgi?project=fawiki&view=project
			.replace(/\[\[([^\|\]]+)\|\1([\u200c ]*(ی?))\]\]/g, '[[$1]]$2')//[[Special:Diff/17515365/17865938]]
			.replace(/([\S]*)[\s\u200c]*-[\s\u200c]*(ھێشتا)(?![ ]+)/g, '$1-ئێستا')//[[Special:Diff/17515365/17865938]]
			//Problem with URL
			.replace(/(\<ref.*?\>) *(\[|)\www(6|3|)\./gi, '$1$2http://www$3.')
			.replace(/\[\[ *(https?\:\/\/.*?) *\]\]/g, '[$1]')
			.replace(/\[\[ *(\/\/.*?) *\]\]/g, '[$1]')
			.replace(/(https?:\/?\/?){2,}/g, '$1')
			// خاوێنکردن autoFormatter.js > cleanExternalLinks
			.replace(/\b(?:http(s?)(?::+\/*|\/\/+:*)\b)+/gi, 'http$1://')
			// repair links with vertical stroke
			.replace(/(\[https?:\/\/[^\s[\]|]*?) *\| *(?=[^\s=[\]|]+\])/gi, '$1 ')
			// supplement slashes at the end easier Domains
			.replace(/(\[https?:\/\/\w[\w.-]*\w\.\w+) +/gi, '$1/ ')
			// Domains lowercase, whether labeled or not
			.replace(/\bhttps?:\/\/\b[0-9a-z.-]*[A-Z][\w.-]*/g, function ($0) {
				return $0.toLowerCase();
			})
			// Link to the exits that exist between the character link to the next line
			.replace(/\[(?:https?\:|)\/\/[^\]\[]+\]/g, function (x) {
				x = x.replace(/[\n\r]/g,'');
				return x
			})
			// یەکەم بۆشاییی ژێربەش
			.replace(/بەستەر\n\=/,'بەستەر=')// [[Special:Diff/20238012/20244702]]
			.replace(/^ +(\=+[^\=]+\=+)/mg, '$1')
			.replace(/\[\[\|/g, '[[')
			.replace(/(\< *\/ *br *\>|\< *br *\\ *\>|\< *br *\. *\>)/g, '<br/>')
			.replace(/(\<br *\/\>|\{\{ھن\}\})([\r\n])(\*|\#|\=\=)/g, '$2$3')
			.replace(/(\<br *\/\>|\{\{ھن\}\}) *\]\]/g, ']]')
			.replace(/\[\[ *(\<br *\/\>|\{\{ھن\}\})/g, '[[')
			.replace(/(\< *span *\/ *\>|\< *\/ *span *\/ *\>)/gi, '</span>')
			.replace(/(\< *center *\/ *\>|\< *\/ *center *\/ *\>)/gi, '</center>')
			.replace(/(\< *b *\/ *\>|\< *\/ *b *\/ *\>)/gi, '</b>')
			.replace(/(\< *div *\/ *\>|\< *\/ *div *\/ *\>)/gi, '</div>')
			.replace(/(\< *p *\/ *\>|\< *\/ *p *\/ *\>)/gi, '</p>')
			.replace(/(\< *td *\/ *\>|\< *\/ *td *\/ *\>)/gi, '</td>')
			.replace(/(\< *small *\/ *\>|\< *\/ *small *\/ *\>)/gi, '</small>')
			.replace(/\[\[([^\]]+)\{\{\!\}\}([^\]]+)\]\]/g, '[[$1|$2]]')//ھەبوونی {{!}} لەناو بەستەرەکە
			.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, '[[$1]]')//کاتێک بەشی ئامانجەکە و بەستەری پرۆفایلەکە یەک بن
			.replace(/\[\[(.+)\|('+)(.+\b)('+)\]\]/gi, '$2[[$1|$3]]$4')// انتقال ''' به بیرون پیوند
			// خاوێنکردن autoFormatter.js > CleanGalleries
			.replace(/<gallery\b([^<>]*)>([^<>]+)<\/gallery\b[^<>]*>/gi,
				function( $0, $1, $2 ) {
					return '<gallery' + $1 + '>' + $2
						.replace( /^(\s*)\[+([^[\]]*)\]\]?\s*$/gm, '$1$2' )
						.replace( /^(\s*)\[+/gm, '$1' ) + '<\/gallery>';
				}
			)
			// خاوێنکردنی پەڕگەکان
			// خوێندنەوەی دەق بۆ ئەو ئامێرانەی کە شاشەکانیان بچووکە سەختە لەکاتێکدا شوێنە بچووکەکان لە وەسفی وێنەکە دێن
			//https://tools.wmflabs.org/checkwiki/cgi-bin/checkwiki.cgi?project=fawiki&view=only&id=77
			.replace(/\[\[(پەڕگە|[Ff]ile)\:((?:\[\[.*?\]\]|[^\]])*)\]\]/g, function ($0, $1, $2) {
				$2 = $2.replace(/\<\/?(big|center|small)>/g,'');
				return '[['+$1+':'+$2+']]'
			})
			.replace( /\[\[ *میدیا\:/gi, '[[پەڕگە:' )
			// خاوێنکردنی داڕێژە autoFormater.js > cleanTemplates
			.replace( /\{\{\s*:?\s*(?:داڕێژە|Template)\s*:\s*/gi, '{\{' )
			// سڕینەوەی ھێڵی نوێ لە ناونیشانی داڕێژەکەوە
			.replace(/(?:^|[^{])\{\{[ 0-9a-z\xC0-\u024F-]*_[ \w\xC0-\u024F-]*/gi,
				function( $0 ) {
					return $0.replace( /_+$/, '' ).replace( /[ _]+/g, ' ' ).replace( /\{ +/, '{' );
				}
			)
			//حاڵەتەکانی تر
			.replace(/\[\[(پۆل|داڕێژە|ویکیپیدیا)\: +/g, '[[$1:')
			.replace(/\{\{\*\}\}/g, '{{•}}')
			.replace(/[\n\s]*\{\{[•·ن](w?)\}\}\s*/g, '{{•$1}} ')
			.replace(/\=\{\{[•·ن](w?)\}\}\s*/g, '=\n{{•$1}} ')//کێشەی [[Special:Diff/14799178/16387261]] لە ھێڵی سەرەوە 
			.replace(/ *(<\/? ?br ?\/?>|\{\{بر\}\}) */g, '{{ھن}}')
			.replace(/\{\{ھن\}\}\n\n/g, '\n\n')
			.replace(/\n\n\{\{ھن\}\}/g, '\n\n')
			.replace(/\{\{ھن\}\}\]/g, ']')
			.replace(/\[\{\{ھن\}\}/g, '[')
			.replace(/\n\n(\*|\#)/g,'\n$1')
			.replace(/\n(\#|\*)( |)\n/g,'\n$1')
			.replace(/\n(\*|\#)( |)(\={2,})/g,'\n$3')
			.replace(/(\n?)\s+?<\/ref>/g, '$1</ref>')
			.replace(/\{ *\|/g, '{|')
			.replace(/\| *\}/g, '|}')
			.replace(/\{\| *\{\|/g, '{|')
			.replace(/\|\} *\|\}/g, '|}')
			.replace( /^=.*&nbsp;.*=$/gim, function( $0 ) {
						return $0.replace( /(?:&nbsp;|\s)+/gi, ' ' );
			})
			.replace(/([^=])\n+(\=.*?\=\n+)/g, '$1\n\n$2')
			.replace(/^(=+([^=].*?)=+)[\t\s]{1,}\n/g, '$1\n')
			.replace(/^(\={2,}) +[\:,;>&\^#@•→←↔↑↓—–…~٫،؛ٔ]/mg, '$1') // Cleanup headers
			.replace(/[\:,;<&\^#@•→←↔↑↓—–…~٫،؛ٔ] +(\={2,})$/mg, '$1')
			.replace(/^(\={2,}\s*)(«)([^\n«»]*?)(»)(\s*\={2,})/mg, '$1 $3 $5')
			.replace(/^(\={2,}) *'+(.*?)'+ *(\={2,})/mg, '$1 $2 $3')
			.replace(/^[•●⚫⬤]/mg, '*') // Wikify bullets in start of lines
			.replace(/^#\s*(REDIRECT|Redirect)/gi, '#ڕەوانەکەر')
			.replace(/^#ڕەوانەکەر(?=\S)/g, '#ڕەوانەکەر') // Adds a space after #REDIRECT
			.replace(/(\={2,}) *([^\n\r]*?) *(\={2,})/g, '$1 $2 $3') // Format headings level 2 and above
			// ژێربەش پێویستی بە تاگە گەورە و بچووک نییە
			.replace(/(\=+) \<(?:small|big)\>([^\=\n\r]+)\<\/(?:small|big)\> (\=+)/g, '$1 $2 $3') 
			// Move extra spaces from inside the link to be deleted in other codes if added
			.replace(/\[\[(\s*)(.*?)(\s*)\]\]/g, '$1[[$2]]$3')
			//سڕینەوەی بۆشایییە زیادەکانی ناو {{}}
			.replace(/\{\{(\s*)(.*?)(\s*)\}\}/g, '{{$2}}')
			// تبدیل به نویسه / یکی کردن فاصله های مجازی پشت سرهم
			//.replace(/(\{\{فم\}\}|\&zwnj\;|\u200c+)/g, '\u200c') // بەکاری ناھێنین
			// Full stop and comma should be before citation. See en:WP:REFPUNC
			.replace(/ *((?:<ref[^\/]*?>.*?<\/ref>)+)([\.،,:])?/g, '$2$1')
			.replace(/([^.])([\.،,:]){2}((?:<ref[^\/]*?>.*?<\/ref>)+)/g, '$1$2$3')
			.replace(/ *((?:<ref[^\/]*?\/>)+)([\.،,:])/g, '$2$1')
			.replace(/([^.])([\.،,:]){2}(((?:<ref[^\/]*?\/>)+)+)/g, '$1$2$3')
			/* ھەر پۆلێک بۆ ھێڵێک */
			.replace( /([^\s>-]) *(\[\[پۆل:[^\n[\]]*\]\])/gi, '$1\n$2' )
			.replace( /(\[\[پۆل:[^\n[\]]*\]\]) *(?![\s<-]|$)/gi, '$1\n' )
			.replace( /(\[\[پۆل:[^\n[\]]*\]\]\n) *(?!\[\[پۆل:|[\s<-]|$)/gi,'$1\n')
			//DEFAULTSORT
			.replace(/\{\{(?:DEFAULTSORT|[Dd]efaultsort|) *[|:] *(?=.*?}})/g, '{{DEFAULTSORT:')
			.replace(/\{\{(DEFAULTSORT|DEFAULTSORT)\:[-\w,\s\(\)]+\}\}\n?/g, '')
			.replace(/(\{\{(?:DEFAULTSORT|DEFAULT\w*SORT\w*):[^\n{}]*\}\})\s*(?=\[\[پۆل:)/gi,'$1\n')
			.replace(/(\{\{DEFAULTSORT\:)\s/g, '$1')
			.replace( /(==\n)\n+(?=<references[^\n<>]*\/>\n\n)/gi, '$1' )
			//نەچەسپاندنی و+بۆشایی بە براکێت کە ھەڵەی بەرھەمی تایپە
			.replace(/\]\]و /g, ']] و ')
			.replace(/(\s|^)\'\'\'(\s|)(.*?)(\s|)\'\'\'(\s)/g, "$1'''$3'''$5") // سڕینەوەی زیادە بۆشاییی ناو ویکیکۆد
			.replace(/'''\{\{ئز /g, "''' {{ئز ")
			.replace(/\*(\s+|\n)?\{\{سەرچاوەکان/g, "{{سەرچاوەکان")
			.replace(/((?:^|\n\s)\=+\s+\=+(?:\s+|)\n)/g, "\n\n")
			.replace(/\n{3,}/g, '\n\n')
			.replace(/(\[{1,2})([^\[\]\n]+) +(\]{1,2})/g, "$1$2$3")
			.replace(/(\[{1,2}) +([^\[\]\n]+)(\]{1,2})/g, "$1$2$3")
			//گۆڕینی ڕیزبەندیی ژمارەکان بۆ شێوازی ویکی [[Special:Permalink/19923598#تبدیل بندهای ترتیبی به قالب‌بندی ویکی]]
			.replace(/(?:(?:^(?:\* ?)?[١٢٣٤٥٦٧٨٩٠0-9]{1,2} ?[\.\-\)]) ?[^١٢٣٤٥٦٧٨٩٠0-9\n]+\n+){2,}/gm, function (x) {
				var x2=x.replace(/((?:\* ?)?[١٢٣٤٥٦٧٨٩٠0-9]{1,2} ?[\.\-\)]) ?([^١٢٣٤٥٦٧٨٩٠0-9\n]+)\n+/gm,'# $2\n')
				if (x2.replace(/[١٢٣٤٥٦٧٨٩٠0-9]/g, '')===x2){
					return x2;
				}
				return x;
			})
			.trim();
	}

	function wikiSubsection(text) {
		return text.replace(/\<(?:\s*)references?(?:\s*\/|\s*\/\s*)\>/g, '{{سەرچاوەکان}}')
			   .replace(/\{\{(?:[Rr]eflist|[Rr]eferences?|سەرچاوەکان)(?=\||\})/g, '{{سەرچاوەکان')
			   .replace(/\{\{چینی ڕاست\}\}\s*\{\{سەرچاوە(.*?)\}\}\s*\{\{(کۆتایی چینی ڕاست|کۆتایی)\}\}/g, '{{سەرچاوە$2}}')
			   .replace(/\{\{چینی چەپ\}\}\s*\{\{سەرچاوە(.*?)\}\}\s*\{\{(کۆتایی چینی چەپ|کۆتایی)\}\}/g, '{{سەرچاوە$2|چینی چەپ=بەڵێ}}')
			   .replace(/\<small\>\s*\{\{سەرچاوە(.*?)\}\}\s*\<\/small\>/g, '{{سەرچاوە$1|قەبارە=بچووک}}')
			   .replace(/(({\{سەرچاوە.*?\}\})(\n|)){1,}/g, '$1')
			   .replace(/\=\s*لیست\s*\=/g, '= پێڕست =')
			   .replace(/\=\s*(?:[gG]allery|گەلەری|وێنەخانە|گالەری|گالێری (میدیا|وێنە|))\s*\=/g, '= پێشانگا =')
			   .replace(/\=\s*(?:بایۆگرافی|زیندەگینامە)\s*\=/g, '= ژیاننامە =')
			   .replace(/\=\s*(?:[eE]xternal links|لینکە دەرەکییەکان|لینکە دەرەکیەکان|لینکی دەرەکی|بەستەر بۆ دەرەوە|بەستەری دەرەکی|بەستەرە دەرەکیەکان)\s*\=/g, '= بەستەرە دەرەکییەکان =')
			   .replace(/\=\s*(?:[nN]otes|[fF]ootnotes?|ژێدەر|ژێدەرەکان|پەراوێز|پەراوێزەکان|پەڕاوێز|پەڕاوێزەکان|ڕیفرێنس|ڕیفرێنسەکان|سۆرس|سۆرسەکان|سەرچاوە)\s*\=/g, '= سەرچاوەکان =')
			   .replace(/\=\s*(?:[Ss]ee [Aa]lso|زیاتر ببینە|زیاتر بخوێنەرەوە|زیاتر بخوێنەوە|ئەم وتارانەش ببینە|وتاری تر|بابەتی تر|ھەروەھا ببینە|هەروەها ببینە|تەماشای زیاتر بکە|ئەمەش ببینە)\s*\=/g, '= ئەمانەش ببینە =')
			   .replace(/\=\s*(?:سەرچاوە|سەرچاوەکان|ڕیفرێنس|ڕیفرێنسەکان|گەڕێندراوەتەوە لە|پەراوێز|پەراوێزەکان|پەراوێز و سەرچاوەکان|پێڕستی سەرچاوەکان|لیستی سەرچاوەکان|[rR]eferences)\s*\=/g, '= سەرچاوەکان =')
			   .replace(/\=\s*(?:خوێندنەوەی زیاتر|زیاتر بخوێنەرەوە)\s*\=/g, '= زیاتر بخوێنەوە =')
			   .replace(/^\={3,}\s*(ئەمانەش ببینە|سەرچاوەکان|پەڕاوێزەکان)\s*\={3,}$/g, '== $1 ==');
	}
	
		
	/*	hejiraYearFix
	 *	Description: It checks the hejira years and convert all to Gregorian. It is helpful when working on hejira years or you working on persian articles
	 */
	function wikiHejiraYearFix(text) {
		return text.replace(/([^0-9٠-٩])([1١][3٣][0-9٠-٩]{2})(?![0-9٠-٩])/g, function (_, p1, p2) {
			return p1 + (parseInt(robustToEnglishDigits(p2)) + 621);
		})
	}
	
	function wikiUrlMinifier(text) {
		return text
			.replace(patterns.url, function (x) {
				return replaceExcept(
					x,
					function (x) {
						try {
							x = decodeURI(x);
						} catch (e) {
							try {
								x = decodeURIComponent(unescape(x));
							} catch (e) {mw.notify(e); }
						}
						return x;
					},
					[patterns.globalExceptionTag, patterns.decodeUriBlacklist, patterns.refname]
				);
			})

			// Strip the http(s) prefix
			.replace(/\[(https?\:)(?=\/\/(?:[\w\-]+)\.(?:m\.)?(wiki(pedia|media|data|source|news|oyage|quote)|wiktionary)\.org\/[^\s\]]*)/g, '[')
			.replace(/[\[\=](?:https?\:|)\/\/[\w\-]{2,}\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/([^\n?]*?)[\]\|]/g, function (x) {
				x = x.replace(/\[(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?) (.*?)\]/g,'[[:$1:$2|$3]]')
				x = x.replace(/\[(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?)\]/g,'[[:$1:$2]]')
				//x = x.replace(/\=(?:https?\:|)\/\/([\w\-]{2,})\.(?:m\.)?wikipedia\.org\/w(?:iki)?\/(.*?)\|/g,'=[[:$1:$2]]|') // کێشەیەک لە داڕێژەی بیرخستنەوە ھەیە
				x = x.replace(/\[\[\:ckb\:/g,'[[').replace(/\%20/g,' ').replace(/٪٢٠/g,' ').replace(/\[\[[a-zA-Z\'0-9 ]+\|/g,'[[')
				x = x.replace(/\[\[.*?\]\]/g, function (y) {
					y = y.replace(/\_/g,' ')
					return y
				})
				return x
			}).replace(/\[{2}([^\|]+)\|\1\]{2}/gi, '[[$1]]');
	}
	function SubSectionLeveling (text) {
		// ڕێکخستنی ئاستی ژێربەشەکان
		text=text.replace(/^(\={2,}) *(.*?) *(\={2,})/mg, '$1 $2 $3')
		if ((mw.config.get('wgNamespaceNumber') === 0 && mw.config.get("wgEditMessage")==='editing')||mw.config.get('wgPageName') ==="ویکی‌پدیا:ویکی‌پروژه_ابزارها/آزمایش_واحد") {
			//وتارێک کە تەنیا ئاستی ژێربەشی ١ی ھەبێت
			if (text.replace(/\=\=/g,'')===text){
				var text2 = text.replace(new RegExp('^\=([^\=\r\n]+)\=$', 'gm'), "== $1 ==")
				if (text!==text2){
					text=text2.replace(/\n\=  /g,'\n= ').replace(/  \=\n/g,' =\n')
				};
			};
			//وتارێک کە تەنیا ئاستی ژێربەشی ٣ یان ٤ی ھەبێت
			var text_test=text.replace(/^\=+ (سەرچاوەکان|ئەمانەش ببینە|بەستەرە دەرەکییەکان|سەرچاوەکان|پێشانگا) \=+\n/gm,'')
			if (text_test.replace(/^\=\= /gm,'')===text_test){
				if (text_test.replace(/^\=\=\= /gm,'')!==text_test){
					//ئاستی ٣
					text = text.replace(new RegExp('^\=\=\=([^\=\r\n]+)\=\=\=$', 'gm'), "== $1 ==")
					text = text.replace(new RegExp('^\=\=\=\=([^\=\r\n]+)\=\=\=\=$', 'gm'), "=== $1 ===")
				} else if (text_test.replace(/^\=\=\=\= /gm,'')!==text_test) {
					//ئاستی ٤
					text = text.replace(new RegExp('^\=\=\=\=([^\=\r\n]+)\=\=\=\=$', 'gm'), "== $1 ==")
				}else{
					text=text.replace(/===/g,'==')
				};
			};
			text=text.replace(/==  /g,'== ').replace(/  ==/g,' ==')
		};
		return text;
	};
	function decimalPointToKurdish(text) {
		//Decimal point [[Special:Permalink/25438370#جمع‌بندی_بدون_رسیدگی]]
		return text.replace(new RegExp('([٠١٢٣٤٥٦٧٨٩])\\.(?=[٠١٢٣٤٥٦٧٨٩])', 'g'), '$1٫')
	};
	function wikiTextDigitsToKurdish(text) {
		text = replaceExcept(
			text,
			toEnglishDigits,
			[patterns.argumentsBlacklist, patterns.fileNames, patterns.fileParameter]);
		text = replaceExcept(
			text,
			kurdishTools.toKurdishDigits,
			[patterns.globalExceptionTag, patterns.url, patterns.argumentsBlacklist, patterns.mathTag, patterns.imagePixelSize, patterns.fileNames, patterns.ref,
				patterns.sourceTag, patterns.arabicDigitsEnglishContext, patterns.signatures, patterns.htmlEntity, patterns.diffLink,
				patterns.htmlAttributes, patterns.fileParameter, patterns.templateParameterName, patterns.ipSign,
				patterns.parenthesesAfterDigits, patterns.otherLanguagesInline, patterns.preTag , patterns.isbn, patterns.englishDate,
				patterns.parameter, patterns.color, patterns.templateEnglishName, patterns.linksOnEnglishContext, patterns.citation, patterns.refname,
				patterns.LtRTagEnclosed, patterns.boxVar, patterns.mediawikiFunctions]
		);
		text = replaceExcept(
			text,
			decimalPointToKurdish,
			[patterns.catgories]
		);
		return text
			//  thousands' separator
			.replace(/([١٢٣٤٥٦٧٨٩٠]),([١٢٣٤٥٦٧٨٩٠])/g, '$1٬$2')
			.replace(/([١٢٣٤٥٦٧٨٩٠])( |)\u0652/g, '$1°')//گۆڕینی نووسەی پلە+ژمارەی کوردی بە نووسەی پلە و ژمارەی کوردی
			.replace(/\u0652( |)([١٢٣٤٥٦٧٨٩٠])/g, '°$2')
			//بۆشایی نێوان نووسەی پلە و پیتە ئەلفوێیە کوردییەکان بێجگەلە ژمارە کوردییەکان
			.replace(/([\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2])°/g, '$1 °');
	}

	function dictationReplace(x, y, extensions, text) {
		return text.replace(
			new RegExp(
				'(^|[^' + kurdishTools.kurdishCharacters + '])(\\s|\u200c|_|)(' + x + ')(\\s|_)(' + y + ')(\\s|\u200c|_|)(' +
					extensions + ')($|[^' + kurdishTools.kurdishCharacters + '])',
				'g'
			),
			'$1$2$3\u200c$5$6$7$8'
		);
	}

	// it has dependency to MediaWiki:Gadget-Extra-Editbuttons-dictionary.js
	function dictation(text) {
		var i,
			dictionary = kurdishToolsDictionary,
			NASB = '\u064b', // ًـ
			ZAMM = '\u064c'; // ُـ
		for (i in dictionary.complexes) {
			if (dictionary.complexes.hasOwnProperty(i)) {
				text = dictationReplace(
					i,
					dictionary.complexes[i],
					'ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|',
					text
				);
			}
		}
		// for last name
		text = dictationReplace(
			dictionary.personNames,
			'ی|یی|زاده|نیا|گان|فر|نژاد|یان|ی\u200cها|یها',
			'ی|',
			text
		);
		// for 'آباد's
		text = dictationReplace(
			dictionary.personNames + '|' + dictionary.addToAbad,
			'آباد',
			'زاده|نیا|پور|گان|فر|نژاد|ی|یان|ها|های|یی|هایی|ی\u200cها|یها|',
			text
		);
		// for first names
		for (i in dictionary.firstNameComplex) {
			if (dictionary.firstNameComplex.hasOwnProperty(i)) {
				text = text.replace(
					new RegExp(
						'(^|[^' + kurdishTools.kurdishCharacters + ']|\\s|_)(' + i + ')(\\s|_)(' +
							dictionary.firstNameComplex[i] + ')(\\s|_)($|[^' + kurdishTools.kurdishCharacters + ']|[^' +
							kurdishTools.kurdishCharacters + '])',
						'g'
					),
					'$1$2\u200c$4$5$6'
				);
			}
		}
		// for colors
		text = dictationReplace(
			dictionary.colorsNames,
			'فام|گون',
			'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|ی\u200cها|یها|هایم|هایت|هایش|هایمان|هایتان|هایشان|',
			text
		);

		// for numbers
		text = dictationReplace(
			dictionary.kurdishNumbers,
			'گانه|ماهه',
			'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|',
			text
		);
		// wrong dictation
		for (i in dictionary.forReplace) {
			if (dictionary.forReplace.hasOwnProperty(i)) {
				text = text.replace(
					new RegExp(
						'(^|[^' + kurdishTools.kurdishCharacters + '])(\\s|\\(|\u200c|_|)(' + i + ')(\\s|\\)|\u200c|_|)($|[^' +
							kurdishTools.kurdishCharacters + '])',
						'g'
					),
					'$1$2' + dictionary.forReplace[i] + '$4$5'
				);
			}
		}

		var preword = "(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(";

		// for /u:/ وو → و
		text = text.replace(
			new RegExp(preword + dictionary.shortWawToLongWaw + ")([" + kurdishTools.nativeAllKurdishCharacters + "]{1,})?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
			function (x) { return x.replace(/و/i, 'وو'); } // 'i' is just to trick bidi algorithm on code view
		);

		// for /u/ و → وو
		text = text.replace(
			new RegExp(preword + dictionary.longWawToShortWaw + ")([" + kurdishTools.nativeAllKurdishCharacters + "]{1,})?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
			function (x) { return x.replace(/وو/i, 'و'); } // 'i' is just to trick bidi algorithm on code view
		);

		// for ئە ← دە وەک: ئەکەم ← دەکەم
		text = text.replace(
			new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|پێدا|تێدا|تێڕا|پێڕا|لێڕا|تێوە|پێوە|ڕێک|پێک|تێک|وێک)?ئە(" + dictionary.regîKar + ")(م|ین|ت|یت|ن|ات|ێت|ێ|ی|ا)(ە|ەوە)?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
			function (x) { return x.replace(/ئە/i, 'دە'); } // 'i' is just to trick bidi algorithm on code view
		);

		// for ئە ← دە وەک: ئەکات ← دەکات (کەسی سێیەمی تاک شازە)
		text = text.replace(
			new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|پێدا|تێدا|تێڕا|پێڕا|لێڕا|تێوە|پێوە|ڕێک|پێک|تێک|وێک)?ئە(ب|خ|خو|د|ڕو|شو|ک|گ|ھ)(ات)(ە|ەوە)?(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
			function (x) { return x.replace(/ئە/i, 'دە'); } // 'i' is just to trick bidi algorithm on code view
		);

		// کلماتی که آ دارند
		text = text.replace(
			new RegExp(preword + dictionary.wordsWithA + ")(ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),
			function (x) { return x.replace(/ا/i, 'آ'); } // 'i' is just to trick bidi algorithm on code view
		);
		// بن مضارع که آ دارند
		text = text.replace(
			new RegExp("(^|\u200c|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + dictionary.PresentVerbsWithA + ")(م|ی|د|یم|ید|ند)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),
			function (x) { return x.replace(/ا/i, 'آ'); } // 'i' is just to trick bidi algorithm on code view
		);

		// بن ماضی که آ دارند
		text = text.replace(
			new RegExp("(^|\u200c|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + dictionary.PastVerbsWithA + ")(م|ی|یم|ید|ند|ه|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),
			function (x) { return x.replace(/ا/i, 'آ'); } // 'i' is just to trick bidi algorithm on code view
		);

		// همزه ضم
		text = text.replace(
			new RegExp(preword + dictionary.HamzehZam + ")(‌ها|ها|ین|ان|ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),
			function (x) { return x.replace(/وء/, 'ؤ').replace(/و/i, 'ؤ'); } // 'i' is just to trick bidi algorithm on code view
		);
		//همزه نصب
		text = text.replace(
			new RegExp(preword + dictionary.HamzehNasb + ")(ی|ئی|یی|ٔ|)(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),
			function (x) { return x.replace(/ا/i, 'أ'); } // 'i' is just to trick bidi algorithm on code view
		);

		//همزه وسط کلمه
		for (i in dictionary.HamzehAtInside) {
			text = text.replace(new RegExp(
				preword + i + ')(| )(' + dictionary.HamzehAtInside[i] + ")(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)",
				'g'
			), '$1$2ء$4');
		}

		// در مورد افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.
		/* text = text.replace(new RegExp(preword + dictionary.HamzehAtEnd + ")(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),'$1$2ء'); */

		//الف مقصوره
		text = text.replace(
			new RegExp(preword + dictionary.AlefMaghsooreh + ")(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),
			function (x) { return x.replace(/ا/i, 'ی'); } // 'i' is just to trick bidi algorithm on code view
		);

		// کێشەی پێشگر و جێناوی لکاو (ھەڵمگرن ← ھەڵم گرن)
		text = text.replace(new RegExp(preword + "ھەڵ|دا|ڕا|پێ|تێ|لێ|ڕێ|دەر|وەر|ڕێک|پێک|تێک)(ش|یش)?(م|مت|می|مان|مانتان|مانیان|ت|تم|تی|تان|تانمان|تانیان|ی|یم|یت|یان|یانمان|یانتان)(دە|ئە|ب|مە|نا|نە)?(" + dictionary.regîKar + ")(م|ین|ی|یت|ێت|ە|ن)(?= |«|»|\\.|،|_|\\]|\\s|\\:|\\)|\\<|\\>|؟|\\'|\\!|$)", 'g'),'$1$2$3$4 $5$6$7');

		// صفت+تر
		text = text.replace(new RegExp("(^|\\s|_|«|»|\\]|\\[|\\(|\\<|\\>|\\')(" + dictionary.adjective + ")( |_)تر(?= |«|»|\\.|\\[|\\]|،|_|\\s|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),'$1$2\u200cتر');
		
		// اسامی رنگ‌ها (به‌عنوان صفت)+تر
		text = text.replace(new RegExp("(^|\\s|_|«|»|\\]|\\[|\\(|\\<|\\>|\\')(" + dictionary.colorsNames + ")( |_)تر(?= |«|»|\\.|\\[|\\]|،|_|\\s|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),'$1$2\u200cتر');
		
		text = text.replace(/به دست\u200cآورد/g, 'به دست آورد'); // Solving a bug!
		text = kurdishTools.normalizeZwnj(text);
		return text.replace(new RegExp("(^|[؛\\s\\n\\.،«»\'\\<\\>؟])(" + dictionary.needsNasb + ')[' + NASB + ZAMM + ']?([؛؟\\s\\n\\.،«»\'"\\<\\>]|$)', 'g'), function (match) {
			return match
				.replace(new RegExp('ا([\\s\\n\\.،«»؟؛"\'\\>\\<' + ZAMM + '])', 'i'), 'ا' + NASB + '$1')
				.replace(new RegExp(NASB + '["' + NASB + ZAMM + ']'), NASB);
		});
	}

	function wikiDictation(text) {
		return replaceExcept(
			text,
			dictation,
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.insideQuote, patterns.argumentsBlacklist, patterns.articleTitleParts]
		);
	}
	function wikiApplyOrthography(text) {
		text=text //en:Wikipedia:HTML5
				//big
				.replace(/((?:\<big\>){5})([^<]+)((?:\<\/big\>){5})/g,'<span style="font-size: 56px;">$2</span>')
				.replace(/((?:\<big\>){4})([^<]+)((?:\<\/big\>){4})/g,'<span style="font-size: 38px;">$2</span>')
				.replace(/((?:\<big\>){3})([^<]+)((?:\<\/big\>){3})/g,'{{زۆر گەورە|$2}}')
				.replace(/((?:\<big\>){2})([^<]+)((?:\<\/big\>){2})/g,'{{گەورە٢|$2}}')
				.replace(/((?:\<big\>){1})([^<]+|[\s\S]+)((?:\<\/big\>){1})/g,'{{گەورە|$2}}')
				//center
				.replace(/<center><gallery>([\S\s]+?)\<\/gallery><\/center>/g,'<gallery class="center">$1</gallery>')
				//.replace(/<center>([\S\s]+?)<\/center>/g,'{{ناوەند|$1}}')
				//empty tag
				.replace(/<span style="font-size: [^>]+"><\/span>/g,'')
				.replace(/{{(?:گەورە|زۆر گەورە|گەورە٢|ناوەند)\|}}/g,'')

		//سڕینەوەی تاگە واڵاکانی نەرمامێری میدیاویکی
		var tags = ['math', 'div', 'grammarly\\-btn','code', 'nowiki', 'pre', 'syntaxhighlight' ,'source', 's', 'noinclude', 'includeonly', 'big', 'small','gallery'];// has bug for sub , sup [[Special:Diff/19450140/19490903]]
		text = replaceExcept(
		  text,
		  function (text) {
			for (var i = 0; i < tags.length; ++i) {
				for (var b = 0; b < 5; ++b) {//خیلی از برچسب‌های خالی تو در تو هستند مانند [[Special:PermaLink/19223877]]
			  	text = text.replace(new RegExp('\<' + tags[i] + '[^\>]*\>(\\n|\\s|\u200c)*?\<\\/' + tags[i] + '\>', 'g'), '');
				}
			  // remove the tags if they occurred multiple times consequently
			  if (mw.config.get('wgNamespaceNumber') === 0 || mw.config.get('wgNamespaceNumber') === 4) {
				text = text.replace(new RegExp('(\<' + tags[i] + '\>){2,}', 'g'), '$1')
				  .replace(new RegExp('(\<\\/' + tags[i] + '\>){2,}', 'g'), '$1');
			  }
			}
			if (mw.config.get('wgNamespaceNumber') === 0) {
				 text=text.replace(/\<ref\>[\s\n]*\<\/ref\>/g,'').replace(/\<ref\>[\s\n]*\<ref\>/g,'<ref>').replace(/\<\/ref\>[\s\n]*\<\/ref\>/g,'</ref>').replace(/\<ref\/\>/g,'</ref>');
			};
			return text
		  },
		  [patterns.insideHtmlComment]
		);
		return replaceExcept(
			text,
			kurdishTools.applyOrthography,
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.wikilinkTargets]
		).replace(patterns.galleryTag, function (gallery) {
			// apply `applyOrthography` on gallery descriptions separately
			return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {
				return y + kurdishTools.applyOrthography(z);
			});
		});
	}
	
	// probably should be exactly same above but for applyZwnj
	function wikiApplyZwnj(text) {
		return replaceExcept(
			text,
			kurdishTools.applyZwnj,
			[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag]
		).replace(patterns.galleryTag, function (gallery) {
			// apply `applyOrthography` on gallery descriptions separatly
			return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {
				return y + kurdishTools.applyZwnj(z);
			});
		});
	}

	function replaceEnMonth(text) {
		var enMonth = {
			'january': 'کانوونی دووەم',
			'jan': 'کانوونی دووەم',
			'february': 'شوبات',
			'feb': 'شوبات',
			'march': 'ئازار',
			'mar': 'ئازار',
			'april': 'نیسان',
			'apr': 'نیسان',
			'may': 'ئایار',
			'june': 'حوزەیران',
			'jun': 'حوزەیران',
			'july': 'تەممووز',
			'august': 'ئاب',
			'aug': 'ئاب',
			'september': 'ئەیلوول',
			'sept': 'ئەیلوول',
			'sep': 'ئەیلوول',
			'october': 'تشرینی یەکەم',
			'oct': 'تشرینی یەکەم',
			'november': 'تشرینی دووەم',
			'nov': 'تشرینی دووەم',
			'december': 'کانوونی یەکەم',
			'dec': 'کانوونی یەکەم'
		};
		for (var i in enMonth) {
			var text_new = text.replace(new RegExp(i, 'ig'), enMonth[i])
			if (text_new != text) {
				return text_new
			}
		}
		return text
	};
	function autoFormatCleanDatesException (text) {
		return replaceExcept(
			text,
			autoFormatCleanDates,
			[patterns.globalExceptionTag, patterns.fileNames, patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist, patterns.ref, patterns.url]
		)
	}
	function wikitranslateEnMonth(text) {
		text=autoFormatCleanDatesException(text)
		return replaceExcept(
			text,
			function translateEnMonth(text) {
				var enMonthRegex = '(ئابی|ئابی|تەممووزی|ئازاری|نیسانی|january|jan|february|feb|march|mar|april|apr|may|jun|june|july|august|aug|sep|sept|september|oct|october|nov|november|december|dec)';
				return text.replace(new RegExp('([^a-zA-Z])(\^|\\||\\s|\\=|\\n|\\(|«|\\:)' + enMonthRegex + ' (\\d{1,2}|[١٢٣٤٥٦٧٨٩٠]{1,2})\\, (\\d{3,4}|[١٢٣٤٥٦٧٨٩٠]{3,4})(\\||\\s|\\n|\$|\\)|\\}|»)([\^a\-zA\-Z])', 'ig'),
						function (x) {
							x=x.replace(new RegExp('([\^a\-zA\-Z])(\^|\\||\\s|\\=|\\n|\\(|«|\\:)' + enMonthRegex + ' (\\d{1,2}|[١٢٣٤٥٦٧٨٩٠]{1,2})\\, (\\d{3,4}|[١٢٣٤٥٦٧٨٩٠]{3,4})(\\||\\s|\\n|\$|\\)|\\}||»)([^a-zA-Z])', 'ig'),
							'$1$2$4 $3 $5$6$7')
							x = kurdishTools.toKurdishDigits(x);
							x = replaceEnMonth(x);
							return x;
						})
					.replace(new RegExp('([\^a\-zA\-Z])(\^|\\||\\s|\\=|\\n|\\(|«)((\\d{1,2}|[١٢٣٤٥٦٧٨٩٠]{1,2}) |)' + enMonthRegex + ' (\\d{3,4}|[١٢٣٤٥٦٧٨٩٠]{3,4})(\\||\\s|\\n|$|\\)|\\}|»|\\:)([\^a\-zA\-Z])', 'ig'),
						function(x) {
							x = kurdishTools.toKurdishDigits(x);
							x = replaceEnMonth(x);
							return x;
						}
					);
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.ref, patterns.fileParameter, patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist]
		)
	}
	
	var arabicDigits = '0123456789', kurdishDigits = '٠١٢٣٤٥٦٧٨٩', arabicIndicDigits = '٠١٢٣٤٥٦٧٨٩';
	function robustToEnglishDigits(text) {
		var i = 0;
		for (i = 0; i <= 9; i = i + 1) {
			text = text.replace(new RegExp('[' + kurdishDigits[i] + arabicIndicDigits[i]+']', 'g'), arabicDigits[i]);
		}
		return text;
	}
		
	function toEnglishDigits(text) {
		text = text.replace(/[a-zA-Z]([\_\s\:\.\,\;\]\[\"\'\)\(\}\{\/\\ ]+|)([١٢٣٤٥٦٧٨٩٠٪\.٫\-\—\–°÷×\+\,\s\_\:،»«؛]+)([\_\s\:\.\,\;\]\[\"\'\)\(\}\{\/\\\<\> ]+|)([a-zA-Z\>]|$)/g, function (x) {
			var i = 0;
			for (i = 0; i <= 9; i = i + 1) {
				x = x.replace(new RegExp('[' + kurdishDigits[i] + arabicIndicDigits[i]+ ']', 'g'), arabicDigits[i]);
			}
			return x.replace(/،/g,',').replace(/»/g,'"').replace(/«/g,'"').replace(/؛/g,';');
		});
		// bug [[Special:Diff/17760890/17760898]]
		text = text.replace(/([a-zA-Z][١٢٣٤٥٦٧٨٩٠]+) *\=/g, function (x) {
			var i = 0;
			for (i = 0; i <= 9; i = i + 1) {
				x = x.replace(new RegExp('[' + kurdishDigits[i] + arabicIndicDigits[i]+ ']', 'g'), arabicDigits[i]);
			}
			return x;
		});
		// ISBN, ISSN and PMID's numbers should in english
		text = text.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([١٢٣٤٥٦٧٨٩٠0-9–—−ـ_\-]+)([^١٢٣٤٥٦٧٨٩٠0-9–—−ـ_\-]|$)/gi, function (x) {
			x=x.replace(/[–—−ـ_\-]+/g,'-')
			var i = 0;
			for (i = 0; i <= 9; i = i + 1) {
				x = x.replace(new RegExp('[' + kurdishDigits[i] + arabicIndicDigits[i]+ ']', 'g'), arabicDigits[i]);
			}
			x = x.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([١٢٣٤٥٦٧٨٩٠\-0-9]+)([^١٢٣٤٥٦٧٨٩٠\-0-9]|$)/gi,'$1 $2$3')
			x = x.replace('PubMed','PMID')
			return x;
		});
		//text = text.replace(/ISBN \-note/g,'ISBN-note');
		// تبدیل عددهای فارسی در عدد ترتیبی انگلیسی
		text = text.replace(/(?:^|["\'\s_«\(\[\{])([١٢٣٤٥٦٧٨٩٠]+)(st|nd|rd|th)[\s_\.,»"\'\)\]\}]/g, function (x) {
			var i = 0;
			for (i = 0; i <= 9; i = i + 1) {
				x = x.replace(new RegExp('[' + kurdishDigits[i]+ arabicIndicDigits[i] + ']', 'g'), arabicDigits[i]);
			}
			return x;
		});
		return text
			.replace(new RegExp('([' + arabicDigits + ']) ?٪', 'g'), '$1%')
			.replace(new RegExp('([' + arabicDigits + '])٫(?=[' + arabicDigits + '])', 'g'), '$1.') // English decimal separator
	}
	function cleanTemplateBracesFromArticle(text, alwaysRun) { // like [[fa:Special:Diff/18828723]]
            if (mw.config.get('wgNamespaceNumber') !== 0 && !alwaysRun) {
                  return text;
            }
            var i =0
            for (i = 0; i <= 5; i = i + 1) {
				text = text.replace(/\{\{\{[^\|\}]+\|([^\}]+)\}\}\}/g, '$1')
				           .replace(/\{\{\{[^\|\}]+\| *\}\}\}/g, '')
			}

            return text.replace(/\{\{\#(?!invoke)/ig, '{{subst:#')
                       .replace(/\{\{ *(PAGENAME|FULLPAGENAMEE|SITENAME|NAMESPACE) *\}\}/g, '{{subst:$1}}')
                       .replace('{{DEFAULTSORT:}}', '');
	}
	function decodeHTMLSymbolEntitiesCodes (text) {
		//&copy; > ©
		return replaceExcept(
			text,
			function decodeEntitiesCodes (text) {
				if(!text) return '';
				for (var i in htmlEntityCodes) {
					var entityInput = i;
					var entityoutput = htmlEntityCodes[i];
					text=text.replace(new RegExp(entityInput, 'g'), entityoutput);
				}
				return text;
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.ref, patterns.fileParameter,
			patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName,
			patterns.citation, patterns.url]
		)
	}
	function removeWikiSigne (text) {
		return replaceExcept(
			text,
			function (text) {
				text=text.replace(/\[\[([^\|\]]+)\|([^\]]+)\]\]/g, '$2');
				text=text.replace(/\[\[([^\|\]]+)\]\]/g, '$1');
				return text;
			}, [patterns.globalExceptionTag, patterns.fileNames, patterns.fileParameter,
		 patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.nowikiTag, patterns.preTag,
		 patterns.insideHtmlComment]
		)
	}
	function autoEdHTMLtoWikitextWikiTools (text) {
		return replaceExcept(
			text,
			autoEd.autoEdHTMLtoWikitext,
			[patterns.fileParameter, patterns.mathTag, patterns.sourceTag]
		)
	}
	function superTool(text) {
		text = decodeHTMLSymbolEntitiesCodes (text);
		text = cleanTemplateBracesFromArticle (text);
		text = kurdishWikiTools.wikiConvertToKurdishCharacters(text);
		text = kurdishWikiTools.wikiApplyZwnj(text);
		text = kurdishWikiTools.wikiApplyOrthography(text);
		text = kurdishWikiTools.wikitranslateEnMonth(text);
		if (mw.config.get('wgNamespaceNumber') !== 10) {
			text = kurdishWikiTools.wikiTextDigitsToKurdish(text);
		}
		text = kurdishWikiTools.wikiUrlMinifier(text);
		text = kurdishWikiTools.wikiDictation(text);
		text = kurdishWikiTools.wikiPunctuation(text);
		text = kurdishWikiTools.wikiSubsection(text);
		text = kurdishWikiTools.SubSectionLeveling (text)
		//ابزارهای بیشتر برگرفته از ویکی‌پدیای انگلیسی [[Mediawiki:Gadget-Extra-Editbuttons-autoed.js]]
		text = autoEd.autoEdISBN(text);
		text = autoEd.autoEdWhitespace(text);
		text = autoEdHTMLtoWikitextWikiTools(text);
		text = autoEd.autoEdHeadlines(text);
		text = autoEd.autoEdTablestoWikitext(text);
		text = autoEd.autoEdExtraBreaks(text);
		text = kurdishWikiTools.addColumnToRefTemplate(text);
		text = kurdishWikiTools.removeCheckDict(text);
		return text;
	}
	
	function superToolMove(text) {
		text = ' ' + text + ' '; // بعضی از کدها اگر فاصله در انتها یا اول نباشد عمل نمی‌کنند مانند افزودن تنوین به کلمه بعدا
		text = kurdishWikiTools.wikiConvertToKurdishCharacters(text);
		text = kurdishTools.applyZwnj(text);
		text = kurdishWikiTools.wikiApplyOrthography(text);
		text = kurdishWikiTools.wikiTextDigitsToKurdish(text);
		text = kurdishWikiTools.wikiUrlMinifier(text);
		text = kurdishWikiTools.wikiDictation(text);
		text = kurdishWikiTools.wikiPunctuation(text);
		return text.trim();
	}

	return {
		removeWikiSigne: removeWikiSigne,
		superTool: superTool,
		superToolMove: superToolMove,
		dictation: dictation,
		wikiApplyOrthography: wikiApplyOrthography,
		wikiApplyZwnj: wikiApplyZwnj,
		wikiConvertToKurdishCharacters: wikiConvertToKurdishCharacters,
		wikiDictation: wikiDictation,
		wikiPunctuation: wikiPunctuation,
		wikiSubsection:wikiSubsection,
		SubSectionLeveling:SubSectionLeveling,
		wikiHejiraYearFix: wikiHejiraYearFix,
		wikiUrlMinifier: wikiUrlMinifier,
		wikiTextDigitsToKurdish: wikiTextDigitsToKurdish,
		wikitranslateEnMonth: wikitranslateEnMonth,
		addColumnToRefTemplate: addColumnToRefTemplate,
		fixBadLinks: fixBadLinks,
		robustToEnglishDigits: robustToEnglishDigits,
		toEnglishDigits: toEnglishDigits,
		cleanTemplateBracesFromArticle: cleanTemplateBracesFromArticle,
		removeCheckDict:removeCheckDict
	};
}());
if (typeof window !== "undefined") {
	window.kurdishWikiTools = kurdishWikiTools;
}
// </nowiki>