میدیاویکی:Gadget-Extra-Editbuttons-kurdishtools.js

لە ئینسایکڵۆپیدیای ئازادی ویکیپیدیاوە
تێبینی: دوای پاشەکەوتکردن، پێویستە کاشی وێبگەڕەکەت پاک بکەیتەوە تا گۆڕانکارییەکان ببینیت. بۆ گووگڵ کڕۆم، فایەرفۆکس، مایکرۆسۆفت ئێج و سافاری: پەنجە لەسەر دوگمەی ⇧ Shift ڕاگرە و کرتە لەسەر Reload بکە. بۆ وردەکاری و ڕێنمایییەکان لەسەر وێبگەڕەکانی تر، بڕوانە ئێرە.
// [[fa:Mediawiki:Gadget-Extra-Editbuttons-persiantools.js]]]]

// <nowiki> // DO NOT REMOVE THIS LINE EVER
/**
 * Kurdish text style improvement tools
 * Tests: [[Mediawiki:Gadget-Extra-Editbuttons-tests.js]] [[وپ:تست]]
 * See also:
 * * [[Mediawiki:Gadget-Extra-Editbuttons-kurdishwikitools.js]]
 * * [[Mediawiki:Gadget-Extra-Editbuttons-dictionary.js]]
 */
var kurdishTools = (function () {
	'use strict';
	
	var kurdishGlyphs, kurdishDigits, arabicIndicDigits, arabicDigits,
		vowels, kurdishCharacters, kurdishCharactersNoVowels, kurdishPastVerbs,
		nativeVowelCharacters, nativeNonVowelCharacters, nativeWawYeh, nativeAllKurdishCharacters,
		kurdishPresentVerbs, kurdishComplexPastVerbs, kurdishComplexPresentVerbs, similarKurdishCharacters, persianDigits, hamza;

	arabicDigits = '0123456789';
	arabicIndicDigits = '٠١٢٣٤٥٦٧٨٩';
	//نووسە ناکوردییەکانی ي-ك-ە و ھاوشێوەکانی تریان پێش گۆرینیان بۆ نووسە کوردییەکان لە ڕیگولار ئێکسپرێشنەکانی تر، دەبێت بە نووسەی کوردی ناسرابن.
	similarKurdishCharacters = '\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4';
	vowels = '\u064B-\u0650\u0652\u0670';
	kurdishCharacters = '\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarKurdishCharacters;
	kurdishCharactersNoVowels = '\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarKurdishCharacters;
	kurdishDigits = '٠١٢٣٤٥٦٧٨٩';
	persianDigits = '۰۱۲۳۴۵۶۷۸۹';
	hamza = '\u0654';
	// ناساندنی ھەموو پیتە بزوێن و نەبزوێنە کوردییە ستانداردەکان بەجیا
	nativeVowelCharacters = '\u0627\u06C6\u06D5\u06CE'; //(ا، ۆ، ە، ێ)  بێجگە لە (و، ی)
	nativeNonVowelCharacters = '\u0626\u0628\u067E\u062A\u062C\u0686\u062D-\u062F\u0631-\u0634\u0695\u0698\u0639\u063A\u0641\u06A4\u0642\u06A9\u06AF\u0644-\u0646\u06B5\u06BE'; //ھەموو پیتە نەبزوێنەکان بێجگە لە (و، ی)
	nativeWawYeh = '\u0648\u06CC'; //(و، ی)
	nativeAllKurdishCharacters = nativeVowelCharacters + nativeNonVowelCharacters + nativeWawYeh; // ھەموو پیتە کوردییەکان

	function normalizeZwnj(text) {
		return text
			// Replace LRM، RLM characters with ZWNJ and it will remove unneeded ZWNJ at next lines
			// .replace(/[\u180E\u2028\u2029\u202A\u202B\u202C\u202D\u202E\u200F¬]/g, '\u200c')
			.replace(new RegExp('([' + kurdishCharacters + '] *)[\u200F\u200E]+( *[' + kurdishCharacters + '])', 'g'), '$1\u200c$2')
			// Remove more than a ZWNJs
			.replace(/([\u200B-\u200D\uFEFF\u200E\u200F]){2,}/g, '$1')
			// Convert ¬ to zwnj in Kurdish context
			.replace(new RegExp('([' + kurdishCharacters + '])¬(?=[' + kurdishCharacters + '])', 'g'), '$1\u200c')
			// Clean ZWNJs after characters that don't conncet to the next letter
			.replace(/([٠-٩0-9إأةؤورزژاآدذ،؛,\:«»\\\/@#$٪×\*\(\)ـ\-=\|ء])\u200c/g, '$1')
			// Clean ZWNJs before and after English characters
			.replace(/[\u200B-\u200D\uFEFF]([\w])/g, '$1')
			.replace(/([\w])[\u200B-\u200D\uFEFF]/g, '$1')
			// Clean ZWNJs before and after Kurdish characters
			.replace(new RegExp('\[\\u200b\-\\u200d\\uFEFF\]([' + vowels + arabicIndicDigits + kurdishDigits + hamza+'])','g'), '$1')
			.replace(new RegExp('(['+arabicIndicDigits+'])\[\\u200b\-\\u200d\\uFEFF\]','g'), '$1')
			// Clean ZWNJs after and before punctuation
			.replace(/[\u200B\u200C\uFEFF]([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, '$1')
			.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])[\u200B-\u200D\uFEFF]/g, '$1')
			// Clean ZWNJs before brakets which have sapce after\before them
			.replace(/[\u200B-\u200D\uFEFF](\]\][\s\n])/g, '$1')
			.replace(/([\n\s]\[\[)[\u200B-\u200D\uFEFF]/g, '$1');
	}

	kurdishGlyphs = {
		// these two are for visually available ZWNJ #visualZwnj
		//'\u200cه': 'ﻫ',
		//'ی\u200c': 'ﻰﻲ',
		'أ': 'ﺄﺃﺃ',
		'آ': 'ﺁﺁﺂ',
		'إ': 'ﺇﺈﺇ',
		'ا': 'ﺍﺎ',
		'ب': 'ﺏﺐﺑﺒ',
		'پ': 'ﭖﭗﭘﭙ',
		'ت': 'ﺕﺖﺗﺘ',
		'ث': 'ﺙﺚﺛﺜ',
		'ج': 'ﺝﺞﺟﺠ',
		'چ': 'ﭺﭻﭼﭽ',
		'ح': 'ﺡﺢﺣﺤ',
		'خ': 'ﺥﺦﺧﺨ',
		'د': 'ﺩﺪ',
		'ذ': 'ﺫﺬ',
		'ر': 'ﺭﺮ',
		'ڕ': 'ڕ‍ڕ',
		'ز': 'ﺯﺰ',
		'ژ': 'ﮊﮋ',
		'س': 'ﺱﺲﺳﺴ',
		'ش': 'ﺵﺶﺷﺸ',
		'ص': 'ﺹﺺﺻﺼ',
		'ض': 'ﺽﺾﺿﻀ',
		'ط': 'ﻁﻂﻃﻄ',
		'ظ': 'ﻅﻆﻇﻈ',
		'ع': 'ﻉﻊﻋﻌ',
		'غ': 'ﻍﻎﻏﻐ',
		'ف': 'ﻑﻒﻓﻔ',
		'ڤ': 'ﭪﭫﭬﭭ',
		'ق': 'ﻕﻖﻗﻘ',
		'ک': 'ﮎﮏﮐﮑﻙﻚﻛﻜ',
		'گ': 'ﮒﮓﮔﮕ',
		'ل': 'ﻝﻞﻟﻠ',
		'ڵ': 'ڵ‍ڵڵ‍‍ڵ‍',
		'م': 'ﻡﻢﻣﻤ',
		'ن': 'ﻥﻦﻧﻨ',
		'ھ': 'ﻩﻪﻫﻬ',
		'ھ': 'ﮪﮫﮬﮭ',
		'هٔ': 'ﮤﮥ',
		'و': 'ﻭﻮ',
		'ۆ': 'ۆﯙﯚ',
		'ؤ': 'ﺅﺅﺆ',
		'ی': 'ﯼﯽﯾﯿﻯﻰﻱﻲﻳﻴ',
		'ێ': 'ێ‍ێێ‍‍ێ‍',
		'ئ': 'ﺉﺊﺋﺌ',
		'لا': 'ﻻﻼ',
		'لإ': 'ﻹﻺ',
		'لأ': 'ﻸﻷ',
		'لآ': 'ﻵﻶ'
	};

	function toStandardKurdishCharacters(text) {
		var i;
		for (i in kurdishGlyphs) {
			if (kurdishGlyphs.hasOwnProperty(i)) {
				text = text.replace(new RegExp('[' + kurdishGlyphs[i] + ']', 'g'), i);
			}
		}
		return normalizeZwnj(text) // needed because of #visualZwnj
			.replace(/ه\u200c/g, 'ە') // Persian – Arabic Letter Heh to Arabic Letter Ae. \u0647\u200c to \u06D5
			.replace(/ه\s/g, 'ە ')
			.replace(/[\u200c\u0640]/g, '') // PAC-MAN eats all zwnj and Arabic Tatweel characters ᗧ zwnj & Arabic Tatweel
			.replace(/(ه)(،|!|؛|؟|:|«|»|\(|\)|\.)/g, 'ە$2')
			.replace(/ك/g, 'ک') // Arabic
			.replace(/ڪ/g, 'ک') // Urdu
			.replace(/ﻙ/g, 'ک') // Pushtu
			.replace(/ﻚ/g, 'ک') // Uyghur
			.replace(/ي/g, 'ی') // Arabic
			.replace(/ى/g, 'ی') // Urdu
			.replace(/ے/g, 'ی') // Urdu
			.replace(/ۍ/g, 'ی') // Pushtu
			.replace(/ې/g, 'ی') // Uyghur
			.replace(/ہ/g, 'ھ') // Convert &#x06C1; to &#x0647; ہہہہ to ھھھ
			.replace(/ه/g, 'ھ'); // Persian
	}

	function toKurdishDigits(text) {
		var i = 0;
		for (i = 0; i <= 9; i = i + 1) {
			text = text.replace(new RegExp('[' + arabicIndicDigits[i] + arabicDigits[i] + persianDigits[i] + ']', 'g'), kurdishDigits[i]);
		}
		return text
			.replace(new RegExp('([' + kurdishDigits + ']) ?%', 'g'), '$1٪')
			.replace(new RegExp('٪([' + kurdishDigits + ']+(?:[.٬٫][' + kurdishDigits + ']*)*)', 'g'), '$1٪')
			//.replace(new RegExp('([' + kurdishDigits + '])\\.(?=[' + kurdishDigits + '])', 'g'), '$1٫') // kurdish decimal separator
			.replace(new RegExp('([' + kurdishDigits + '])\\،(?=[' + kurdishDigits + '])', 'g'), '$1٬'); // گۆڕینی جياكەرەوەى شەش گۆشە بەجێگەی سیمیکۆڵۆنێک لەنێوان ژمارەکان
	}

	function applyOrthography(text) {
		return text
			.replace(/\r/g, '')
			//خاوێنکردن autoFormatter.js
			.replace( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\u00AD]+/g, '' )
			.replace(/[ \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n/g,'\n')
			//گۆڕینی تاب و بۆشایی و شکاندنیان لە ھێڵی یەکەم بە پووچ چوونکە میدیاویکی ڕەچاوی ناکات
			.replace(/\n[\t\u00A0]+/g, '\n')
			//گۆڕینی ھەموو بۆشاییەکان بە بۆشاییی ئاسایی
			.replace(/[\u0020\u0085\u00A0\u180E\u2000-\u200A\u202F\u205F\u3000]/g, ' ')
			.replace(/[\u0085]/g, '')
			//http://kb.mozillazine.org/Network.IDN.blacklist_chars
			.replace(/[\u01C3\uFE15]/g, '!')
			.replace(/[\u0589\u05C3\uA789]/g, ':')
			.replace(/[\u0338\u2044\u2215\u2571\u29F8\u3033\uFF0F]/g, '/')
			.replace(/[\u05F4]/g, '"')
			.replace(/[\u06D4\u0701\uFF0E\uFF61]/g, '.')
			.replace(/\u3014/g, '(')
			.replace(/\u3015/g, ')')
			// جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله
			//.replace(/[ۂۀ](?![\s\n])/g, 'هٔ ')// // بەکاری ناھێنین //
			// Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ
			//.replace(/ه[\u200c\u200e\s]+ی([\s\n])/g, 'هٔ$1') // // بەکاری ناھێنین //
			// Replace ه followed by (space|ZWNJ|lrm|nothing) follow by ء or with هٔ
			//.replace(/ه[\u200c\u200e\s]*[ءٔ]([\s\n])/g, 'هٔ$1') // // بەکاری ناھێنین //
			// Replace هٓ or single-character ۀ with the standard هٔ
			//.replace(/(ۀ|هٓ)/g, 'هٔ') // // بەکاری ناھێنین //
			// Replace ه followed by ئ or ی, and then by ی, with ه\u200cای, example: خانهئی becomes خانه\u200cای
			//.replace(/ه\u200c[ئی]ی/g, 'ه\u200cای') // // بەکاری ناھێنین //
			// Function for removing incorrect ZWNJs
			.replace(/([\u200c\u200e])([\s\n])/g, '$2')
			.replace(/([\s\n])([\u200c\u200e])/g, '$1')
			//ماوەی پێش بزوێنە کورتەکان نادروستە و دەبێت بگوازرێنەوە تا خۆ بەدوور بگرن لە سەرلێشێواندنی وشەکان و بزوێنەکە.
			.replace(new RegExp('([' + kurdishCharacters + vowels + hamza + '])(\\s)([' + vowels + hamza + '])', 'g'), '$1$3$2')
			
			// چاکسازیی بڕێ لە ڕێنووس و حاڵەتە ناستانداردەکان
			.replace(new RegExp('(?<![' + nativeAllKurdishCharacters + '])(\u0648{2})((?!\u0648)[' + nativeAllKurdishCharacters + ']{1,})', 'gm'), 'و$2') // ووشە بگۆڕە بۆ وشە و نموونە ھاوشێوەکانی
			.replace(new RegExp('([' + nativeNonVowelCharacters + ']|[اە]و{1})(یە{1})', 'gm'), '$1ی$2') // نیە بگۆڕە بۆ نییە و نموونە ھاوشێوەکانی
			.replace(new RegExp('([' + nativeVowelCharacters + ']|\u0648{2})(ییە{1})', 'gm'), '$1ی$2') // نێونەتەوەییەکان بگۆڕە بۆ نێونەتەوەیییەکان و نموونە ھاوشێوەکانی
			.replace(/ۆتە/g, 'ووەتە') //کردۆتەوە بگۆڕە بۆ کردووەتەوە و نموونە ھاوشێوەکانی
			
			// بۆ سڕینەوەی تاگی <nowiki/> ⇒ find: [[ویکیپیدیا]]<nowiki/>یە ⇒ replace: [[ویکیپیدیا]]یە
			.replace(new RegExp('(\]\])(\<nowiki\/\>)([' + nativeAllKurdishCharacters + '])', 'gm'), '$1$3');
			
			//بزوێنە کورتەکان بەدوای یەکدا نایەن و دەبێت پیتێک لەنێوانیان ھەبێت
			//.replace(new RegExp('([' + vowels + hamza + ']){2,}', 'g'), '$1') // // بەکاری ناھێنین //
			//.replace(/ئء/g, 'یء') //two hamzes after each other // // بەکاری ناھێنین //
			//.replace(/أء/g, 'اء') //two hamzes after each other // // بەکاری ناھێنین //
			//.replace(/ؤء/g, 'ؤ') //two hamzes after each other // // بەکاری ناھێنین //
			//.replace(/وء/g, 'ؤ')//bug on  سوء // // بەکاری ناھێنین //
			//.replace(/سؤ ?استفاده/g, 'سوءاستفاده')//bug on سوءاستفاده و سوء // // بەکاری ناھێنین //
			//.replace(/ و یا /g, ' یا ')// replace «و یا» with «یا» // // بەکاری ناھێنین //
			//افزودن همزه
			//.replace(/درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, 'درباره‌$1$2')//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره // // بەکاری ناھێنین //
			//.replace(/درباره /g, 'دربارهٔ ')// // بەکاری ناھێنین //
			//.replace(new RegExp('صفحه(\\s|)(['+kurdishDigits+']+)(\\n|\\.|\\,|\\||\\<)', 'g'), 'صفحهٔ $2$3');//[[Special:PermaLink/15326391#افزودن همزه]] // // بەکاری ناھێنین //
	}

	/**
	 * Replaces Kurdish characters with Arabic's ones so an Arabic sorter can sort Kurdish lines
	 */
	function deKurdish(text) {
		return text
			.replace(/ی/g,"ي")
			.replace(/ک/g,"ك")
			.replace(/ھ/g,"ه")
			.replace(/پ/g,"بی")
			.replace(/چ/g,"جی")
			.replace(/ڕ/g,"ری")
			.replace(/ژ/g,"زی")
			.replace(/ڤ/g,"فی")
			.replace(/ڵ/g,"لی")
			.replace(/گ/g,"كی")
			.replace(/ۆ/g,"وی")
			.replace(/ە/g,"هی")
			.replace(/ێ/g,"يي");
	}

	function kurdishSortText(text) {
		return text.split('\n').sort(function (x, y) {
			var keyX = deKurdish(x),
				keyY = deKurdish(y);
			if (keyX < keyY) {
				return -1;
			}
			if (keyX > keyY) {
				return 1;
			}
			return 0;
		}).join('\n');
	}

	/*kurdishPastVerbs = '(' +
		'ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد' +
		'|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند' +
		'|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید' +
		'|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید' +
		'|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت' +
		'|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست' +
		'|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید' +
		'|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خشکاند' +
		'|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست' +
		'|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست' +
		'|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید' +
		'|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید' +
		'|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت' +
		'|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت' +
		'|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید' +
		'|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست' +
		'|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید' +
		'|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید' +
		'|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت' +
		'|ورزید|وزاند|وزید|یارست|یازید|یافت' +
		')';*/


	/*kurdishPresentVerbs = '(' +
		'ارز|افت|افراز|افروز|افزا|افزای|افسر|افشان|افکن|انبار|انباز|انجام|انداز|اندای|اندوز|اندیش|انگار|انگیز|انگیزان' +
		'|اوبار|ایست|آرا|آرام|آرامان|آرای|آزار|آزما|آزمای|آسا|آسای|آشام|آشوب|آغار|آغاز|آفرین|آکن|آگن|آلا|آلای' +
		'|آمرز|آموز|آموزان|آمیز|آهنج|آور|آویز|آی|بار|باران|باز|باش|باف|بال|باوران|بای|باید|بخش|بخشا|بخشای' +
		'|بر|بَر|بُر|براز|بساو|بسیج|بلع|بند|بو|بوس|بوی|بیز|بین|پا|پاش|پاشان|پالا|پالای|پذیر|پذیران' +
		'|پر|پراکن|پران|پرداز|پرس|پرست|پرهیز|پرور|پروران|پز|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوشان' +
		'|پوی|پیچ|پیچان|پیرا|پیرای|پیما|پیمای|پیوند|تاب|تابان|تاران|تاز|تازان|تپ|تپان|تراش|تراشان|تراو|ترس|ترسان' +
		'|ترش|ترک|ترکان|تکان|تن|توان|توپ|جنب|جنبان|جنگ|جه|جهان|جو|جوش|جوشان|جوی|چاپ|چای|چپ|چپان' +
		'|چر|چران|چرب|چرخ|چرخان|چسب|چسبان|چش|چشان|چک|چکان|چل|چلان|چم|چین|خار|خاران|خای|خر|خراش' +
		'|خراشان|خرام|خروش|خز|خشک|خشکان|خل|خم|خند|خندان|خواب|خوابان|خوان|خواه|خور|خوران|خوف|خیز|خیس' +
		'|خیسان|دار|درخش|درخشان|درو|دزد|دم|ده|دو|دوان|دوز|دوش|ران|ربا|ربای|رخش|رس|رسان' +
		'|رشت|رقص|رقصان|رم|رنج|رنجان|رند|ره|رهان|رو|روب|روی|رویان|ریز|ریس|رین|زا|زار|زای|زدا' +
		'|زدای|زن|زی|ساب|ساز|سای|سپار|سپر|سپوز|ستا|ستان|ستر|ستیز|سر|سرا|سرای|سرشت|سز|سگال|سنب' +
		'|سنج|سوز|سوزان|شاش|شای|شتاب|شکاف|شکف|شکن|شکوف|شکیب|شمار|شمر|شناس|شناسان|شنو|شو|شور|شوران|شوی' +
		'|طپ|طلب|طوف|غارت|غر|غلت|غلتان|غلط|غلطان|غنو|فرسا|فرسای|فرست|فرما|فرمای|فروش|فریب|فشار|فشان|فشر' +
		'|فهم|فهمان|قاپ|قبولان|کار|کاه|کاو|کش|کَش|کُش|کِش|کشان|کف|کن|کوب|کوچ|کوش|گا|گای|گداز' +
		'|گذار|گذر|گذران|گرا|گراز|گرای|گرد|گردان|گرو|گری|گریان|گریز|گز|گزار|گزین|گسار|گستر|گستران|گسل|گشا' +
		'|گشای|گمار|گنج|گنجان|گند|گو|گوار|گوز|گوی|گیر|لرز|لرزان|لغز|لغزان|لم|لمبان|لند|لنگ|له|لول' +
		'|لیس|ماس|مال|مان|مک|مول|موی|میر|ناز|نال|نام|نشان|نشین|نکوه|نگار|نگر|نما|نمای|نمایان|نه' +
		'|نهنب|نواز|نورد|نوش|نوشان|نویس|نیوش|هراس|هست|هل|ورز|وز|وزان|یاب|یار|یاز' +
		')';*/

	/*kurdishComplexPastVerbs={
		'باز':'آفرید|آمد|آموخت|آورد|ایستاد|تابید|جست|خواند|داشت|رساند|ستاند|شمرد|ماند|نمایاند|نهاد|نگریست|پرسید|گذارد'+
			'|گرداند|گردید|گرفت|گشت|گشود|گفت|یافت',
		'در':'بر ?داشت|بر ?گرفت|آمد|آمیخت|آورد|آویخت|افتاد|افکند|انداخت|رفت|ماند|نوردید|کشید|گرفت',//bug: در گذشته 
		'بر':'آشفت|آمد|آورد|افتاد|افراشت|افروخت|افشاند|افکند|انداخت|انگیخت|تاباند|تابید|تافت|تنید|جهید|خاست|خواست|خورد'+
			'|داشت|دمید|شمرد|نهاد|چید|کرد|کشید|گرداند|گردانید|گردید|گزید|گشت|گشود|گمارد|گماشت',
		'فرو':'آمد|خورد|داد|رفت|نشاند|کرد|گذارد|گذاشت',
		'وا':'داشت|رهاند|ماند|نهاد|کرد',
		'ور':'آمد|افتاد|رفت',
		'یاد':'گرفت',
		'پدید':'آورد',
		'پراکنده':'ساخت',
		'زمین':'خورد',
		'گول':'زد',
		'لخت':'کرد'
	}*/

	/*kurdishComplexPresentVerbs={
		'باز':'آفرین|آموز|آور|ایست|تاب|جو|خوان|دار|رس|ستان|شمار|مان|نمایان|نه|نگر|پرس|گذار|گردان|گرد|گشا|گو|گیر|یاب',
		'در':'بر ?دار|بر ?گیر|آمیز|آور|آویز|افت|افکن|انداز|مان|نورد|کش|گذر|گیر',//مشکل با: در روم باستان، در ده 
		'بر':'آشوب|آور|افت|افراز|افروز|افشان|افکن|انداز|انگیز|تابان|تاب|تن|جه|خواه|خور|خیز|دار|دم|شمار|نه|چین|کش|کن'+
			'|گردان|گزین|گشا|گمار',
		//مشکل با : بر گردن
		'فرو':'خور|ده|رو|نشین|کن|گذار',
		'وا':'دار|رهان|مان|نه|کن',
		'ور':'افت|رو',
		'یاد':'گیر',
		'پدید':'آور',
		'پراکنده':'ساز',
		'زمین':'خور',
		'گول':'زن',
		'لخت':'کن'
	}*/

	function complexVerbsApplyZwnj(text) {
		for (var x in kurdishComplexPastVerbs) {
			var y = kurdishComplexPastVerbs[x];
			text = text.replace(new RegExp(
				  '(^|[^' + kurdishCharacters + '])(' + x + ') ?(می|نمی|)( |\u200c|)(ن|)('
					 + y + ')(م|ی|یم|ید|ند|ه|ن|)($|[^' + kurdishCharacters + '])', 'g'),
				'$1$2\u200c$3\u200c$5$6$7$8');
		}
		for (var x in kurdishComplexPresentVerbs) {
			var y = kurdishComplexPresentVerbs[x]
			text = text.replace(new RegExp(
				  '(^|[^' + kurdishCharacters + '])(' + x + ') ?(می|نمی|)( |\u200c|)(ن|)('
					 + y + ')(م|ی|د|یم|ید|ند|ن)($|[^' + kurdishCharacters + '])', 'g'),
				'$1$2\u200c$3\u200c$5$6$7$8');
		}
		return text;
	}

	function applyZwnj(text) {
		text=complexVerbsApplyZwnj(text);
		return normalizeZwnj(text)
			//.replace(
				//new RegExp('(^|[^' + kurdishCharacters + '])(می|نمی) ?' + kurdishPastVerbs +
					//'(م|ی|یم|ید|ند|ه|)($|[^' + kurdishCharacters + '])', 'g'),
				//'$1$2\u200c$3$4$5'
			//)
			//.replace(
				//new RegExp('(^|[^' + kurdishCharacters + '])(می|نمی) ?' + kurdishPresentVerbs +
					//'(م|ی|د|یم|ید|ند)($|[^' + kurdishCharacters + '])', 'g'),
				//'$1$2\u200c$3$4$5'
			//)
			// ماضی نقلی
			//.replace(
				//new RegExp('(^|[^' + kurdishCharacters + '])(ن|)' + kurdishPastVerbs +
					//'ه (ام|ای|ایم|اید|اند|است)($|[^' + kurdishCharacters + '])', 'g'),
				//'$1$2$3ه\u200c$4$5'
			//)
			
			// بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت
			//.replace(
				//new RegExp('(^|[^' + kurdishCharacters + '])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^' + kurdishCharacters + '])', 'g'),
				//'$1$2\u200c$3$4$5'
			//)
			// ای «توان» ناقلا!
			//.replace(/(\s)(می|نمی) ?توان/g, '$1$2\u200cتوان')
			// چسباندن تمام «ها»ها با فاصلهٔ مجازی
			//.replace(/ ها([\]\.،\:»\)\s]|\'{2,3}|\={2,})/g, '\u200cها$1')
			//.replace(/ ها(ی|یی|یم|یت|یش|ی?مان|ی?تان|ی?شان)([\]\.،\:»\)\s])/g, '\u200cها$1$2')
			//.replace(/هها/g, 'ه‌ها')
			// چسباندن تمام «ترین»ها با فاصلهٔ مجازی
			//.replace(/ ترین([\]\.،\:»\)\s]|\'{2,3}|\={2,})/g, '\u200cترین$1')
			// چسباندن تمام «تبار»ها با فاصلهٔ مجازی
			//.replace(
				//new RegExp('([' + kurdishCharacters + ']ی) تبار([^' + kurdishCharacters + '])', 'g'),
				//'$1\u200cتبار$2'
			//)
			// چسباندن تمام «شناس»ها با فاصلهٔ مجازی
			//.replace(
				//new RegExp('([' + kurdishCharacters + ']) شناس(ی?[^' + kurdishCharacters + '])', 'g'),
				//'$1\u200cشناس$2'
			//)
			// چسباندن تمام «گیر»ها با فاصلهٔ مجازی
			//.replace(
				//new RegExp('([' + kurdishCharacters + ']) گیری([^' + kurdishCharacters + '])', 'g'),
				//'$1\u200cگیری$2'
			//)
			// بۆ لابردنی ھێمای ئەستێرە زیادەکانی پێش ئاستەکان
			.replace(/\n\*\s*(\=+.+?\=+\n)/g, '\n$1')
			// ئەندامی نیشانەکانی تاک کۆوتەیشن
			.replace(/(\n=+)(.*?)(?:'+)(.*?)(?:'+)(.*?)(=+\n)/g, '$1$2$3$4$5')
			// اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود
			.replace(/(^\u200c|\u200c$)/mg, '');
			// شناسه ها
			// توجه: «است» تعدماً از شناسه ها حذف شده چون به عنوان فعل مستقل هم کاربرد دارد و در آن موارد باید جدا نوشته شود
			// مثال: «این یک خانه است» که است در آن باید از خانه جدا نوشته شود
			// حروف «ام» و «ای» هم به دلیل تشابه با حرف ندا «اِی» و ام انگلیسی و ای انگلیسی حذف شدند.
			//.replace(new RegExp('ه +(ایم|اید|اند)($|[^' + kurdishCharacters + '\u200c])', 'g'), 'ه\u200c$1$2')// به بخش ماضی نقلی منتقل شد
			// موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود
			//.replace(/ا\sً/g, 'اً')// بەکاری ناھێنین //
			// رفع اشکال که\u200cای
			//.replace(/ که\u200cای /g, ' که ای ')
			//رفع اشکال میستری (Mystery)
			//.replace(/می\u200cستری/g, 'میستری')
			//.replace(/ویکی‌پدیا/g, 'ویکیپیدیا')
			//.replace(new RegExp('می\u200cگوی($|[^' + kurdishCharacters + '\u200c])', 'g'), 'میگوی$1') // for میگوی دریایی
			//.replace(new RegExp('می\u200cدوی($|[^' + kurdishCharacters + '\u200c])', 'g'), 'میدوی$1');// for [[میدوی (ابهام‌زدایی)]]
	}

	function punctuation(text) {
		return text
			/// خاڵبەندیی ناکوردی
			.replace(/ː/g, ':') // Replace incorrect : character
			// بەکارھێنانی ؟ی کوردی
			.replace(new RegExp('([' + kurdishCharacters + '])[ ]*[?]', 'g'), '$1؟')
			// بەکارھێنانی ؛ی کوردی
			.replace(new RegExp('([' + kurdishCharacters + '])[ ]*[;]', 'g'), '$1؛ ')
			// بەکارھێنانی ،ی کوردی
			.replace(new RegExp('([' + kurdishCharacters + '])(\]\]|»|)[ ]*[,]', 'g'), '$1$2، ')
			//سڕینەوەی دوو بۆشاییی دوای یەک لە خاڵبەندی
			.replace(/(،|؛|؟|\.)  /g, '$1 ')
			.replace(/\r/g, '')
			/// زیادکردن یان سڕینەوەی بۆشایییەکان
			// سڕینەوەی بۆشایییە دووبارەکانی نێوان وشەکان، بێجگە لە بۆشاییی نێوان ناوی پارامەترەکان و ھێمای یەکسانەکان
			.replace(/(. ) +(?=[^= ])/g, '$1')
			//بۆشاییی دوای خاڵبەندیی بێجگەلە ! بەھۆی (<!-- و !! لە سەرەوەی خشتەکان)
			.replace(/([،\.\؛\؟»])([^\s\.\(\)«»\"\[\]<>\d\w\{\}\|٠١٢٣٤٥٦٧٨٩\'])/g, '$1 $2')
			// زیادکردنی بۆشایی بۆ دوای خاڵبەندی
			.replace(new RegExp('([' + kurdishCharacters + ']+|\\]|\\)|»)([؟،؛\\!\\.])([' + kurdishCharacters + kurdishDigits + ']+|\\[|\\(|«)', 'g'), '$1$2 $3')
			// سڕینەوەی بۆشایی لەدوای کەوانەی وتە، جووت کەوانەی ئاسایی، و کەوانەی تیژی کراوە
			.replace(/([\(«\[]) /g, '$1')
			// سڕینەوەی بۆشایی لەپێش کەوانەی وتە، جووت کەوانەی ئاسایی، و کەوانەی تیژی داخراو
			.replace(/ ([\)»\]])/g, '$1')
			// زیادکردنی بۆشایی لەپێش کەوانەی وتەی کراوە
			.replace(/([^ \(\[\|\r\n>'])(«)/g, '$1 $2')
			.replace(/ +\( +/g, ' (')
			.replace(new RegExp('([' + kurdishCharacters + ']|\\]|») *\\( *(?=[' + kurdishCharacters + '])(?!ەکان\\)|ان\\))', 'g'), '$1 (')
			.replace(new RegExp('([' + kurdishCharacters + ']) *\\) *(?=[' + kurdishCharacters + ']|\\[|«)', 'g'), '$1) ')
			// ھێڵی نوێ
			.replace(/\n\s+\n/g, '\n\n')
			// Removes extra line between two items list
			.replace(/(\n\*.*?)\n+(?=\n\*)/g, '$1')
			// Removes extra line between two items list
			.replace(/(\n#.*?)\n+(?=\n#)/g, '$1')
			// Convert , to ، if there are Kurdish characters on both sides of it
			.replace(new RegExp('([' + kurdishCharacters + ']), ?(?=[' + kurdishCharacters + '])', 'g'), '$1، ')
			// دوای خاڵبۆری کوردی ھیچ ھێمایەک نەیەت
			.replace(/(؛)(([\s]+)?[\.،؛:!؟\-…])/g, '$1')
			// لە کۆتاییی پەڕەگراف، خاڵبۆر نەیەت
			.replace(/(؛)(\s|)\n\n/g, '.\n\n')
			// خاڵبەندی لە دەسپێکی نیشانەی کراوەدا نەیەت
			.replace(/([\(«])[\s]([؛\.،])/g, '$1')
			// وێرگوڵی کوردی
			// دوای بۆری کوردی ئەم ھێمایانە نەیەت
			.replace(/(،)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))/g, '$1')
			// خاڵ
			// لێرەدا دەبێت سێ خاڵ ھەبێت
			.replace(new RegExp('([' + kurdishCharacters + '])( *)(\\.{3,})', 'g'), '$1$2…')
			.replace(/ \.{3} /g, ' … ')
			// دوای خاڵ ئەم ھێمایانە نەیەت
			.replace(new RegExp('([' + kurdishCharacters + '])\\.( *[،؛:!؟\\?]+)', 'g'), '$1.')
			// خاڵبەندی لەسەرەتای کەوانەی ئاسایی و کەوانەی وتە نەیەت
			.replace(new RegExp('(\\(|«)[\\.،؛](\\s|)([' + kurdishCharacters + '])', 'g'), '$1$3')
			// خاڵبەندی لەکۆتاییی ناوەوەی کەوانەی ئاسایی نەبێت
			.replace(new RegExp('([' + kurdishCharacters + '])(\\s|)[\\.،؛](\\s|)(\\))', 'g'), '$1$2$3$4')
			// ئەگەر مانای ڕستەکان پەیوەندییان بەیەکەوە ھەبوو، باشترە کەڵک لە خاڵبۆر وەرگیرێ نەک خاڵ یان بۆر خۆیان
			.replace(new RegExp('([' + kurdishCharacters + '])(\\s|)(\\.)(\\s|)(بەڵام|کە\\s|و\\s|بۆیە|ھێشتا)', 'g'), '$1؛ $5')
			/// Question & exclamation mark
			// Repeated exclamation mark due to the presence of !! The title of MediaWiki tables should not be modified.
			// دووبارەکردنەوی نیشانەی پرسیاری کوردی
			.replace(/(؟(\s|)){2,}/g, '؟')
			// خاڵبەندیی نادروستی نیشانەی پرسیار و سەرسووڕمان
			.replace('؟ !', '؟!').replace('! ؟', '!؟')
			// Remove space preceding punctuation, except for ellipses
			.replace(/([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|<|$)/g, '$1$2$3')
			// Fix dash between two numbers (1999 - 2022 → 1999–2022) // [[fa:وپ:خط تیره]]
			.replace(new RegExp('([' + kurdishDigits + ']+\\s?(?:\\_\\_|\\-|ـ+)\\s?)*([' + kurdishDigits + ']+)\\s?(?:\\_\\_|\\-|ـ+)\\s?([' + kurdishDigits + ']+)(?!\\s?(?:\\_\\_|\\-|ـ+)\\s?[' + kurdishDigits + ']+)', 'g'), function ($0, $1, $2, $3) { return ($1 ? $0 : $2 + '–' + $3) })
			// پاشگری کۆکردنەوەی «ەکان» لەنێو کەوانەدا دەتوانێت بە وشەی پێشی خۆیەوە بلکێت.
			.replace(/ \(ەکان\)/g, '(ەکان)')
			//.replace(/(\(|)ه‍\. (ق|خ|ش)([\n\/ ]|\))/g, 'ه‍.$2$3')//iاصلاح تاریخ هجری
			// سڕینەوەی بۆشایی لەدوای کەوانەی داخراوی ئاسایی و نیشانەی وتە گەر «ی، ە، یە، ێکی، ەکە» لەدوایان ھاتبوو
			.replace(/(.*?[\)»]) (ی|ە|یە|ێکی|ەکە){1}/g, '$1$2') // [[Special:Diff/822010]]
			// لابردنی بۆشایی لەنێوان دوو دەربڕینی کورت
			.replace(new RegExp('(\^|\\||\\(|«|\\}|"|\\s|\\*|\\#)(([' + kurdishCharacters + ']\{1,2\})\\. \?)\{2,6\}', 'g'), function (m) { return m.replace(/\. (.)/g, '.$1'); });
	}
	return {
		applyOrthography: applyOrthography,
		applyZwnj: applyZwnj,
		normalizeZwnj: normalizeZwnj,
		kurdishSortText: kurdishSortText,
		punctuation: punctuation,
		toKurdishDigits: toKurdishDigits,
		toStandardKurdishCharacters: toStandardKurdishCharacters,
		vowels: vowels,
		kurdishCharacters: kurdishCharacters,
		kurdishCharactersNoVowels: kurdishCharactersNoVowels,
		nativeVowelCharacters: nativeVowelCharacters,
		nativeNonVowelCharacters: nativeNonVowelCharacters,
		nativeWawYeh: nativeWawYeh,
		nativeAllKurdishCharacters: nativeAllKurdishCharacters
	};
}());
if (typeof window !== 'undefined') {
	window.kurdishTools = kurdishTools;
}
// </nowiki>