تفاوت میان نسخه‌های «ویکی‌پدیا:ویرایشگر خودکار/ابرابزار/fa bot.js»

جز
ویرایش به‌وسیلهٔ ابرابزار:
(به‌روزرسانی)
جز (ویرایش به‌وسیلهٔ ابرابزار:)
*/
var persianTools = (function () {
'use strict';
var persianGlyphs, persianDigits, arabicIndicDigits, arabicDigits,
vowels, persianCharacters, persianCharactersNoVowels, persianPastVerbs,
persianPresentVerbs, persianComplexPastVerbs, persianComplexPresentVerbs, similarPersianCharacters, hamza;
 
var persianGlyphs, persianDigits, arabicIndicDigits, arabicDigits,
arabicDigits = '0123456789';
vowels, persianCharacters, persianCharactersNoVowels, persianPastVerbs,
arabicIndicDigits = '٠١٢٣٤٥٦٧٨٩';
persianPresentVerbs, persianComplexPastVerbs, persianComplexPresentVerbs, similarPersianCharacters, hamza;
//نویسه\u200cهای غیرفارسی ي-ك-ە و موارد مشابه پیش از تبدیل به نویسهٔ فارسی در سایر ریجکس\u200cها باید به عنوان کاراکتر فارسی شناخته شوند.
similarPersianCharacters = '\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4';
vowels = '\u064B-\u0650\u0652\u0670';
persianCharacters = '\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters;
persianCharactersNoVowels = '\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters;
persianDigits = '۰۱۲۳۴۵۶۷۸۹';
hamza = '\u0654';
 
arabicDigits = '0123456789';
function normalizeZwnj(text) {
arabicIndicDigits = '٠١٢٣٤٥٦٧٨٩';
return text
//نویسه\u200cهای غیرفارسی ی-ک-ه و موارد مشابه پیش از تبدیل به نویسهٔ فارسی در سایر ریجکس\u200cها باید به عنوان کاراکتر فارسی شناخته شوند.
// Replace LRM، RLM characters with ZWNJ and it will remove unneeded ZWNJ at next lines
similarPersianCharacters = '\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4';
// .replace(/[\u180E\u2028\u2029\u202A\u202B\u202C\u202D\u202E\u200F¬]/g, '\u200c')
vowels = '\u064B-\u0650\u0652\u0670';
.replace(new RegExp('([' + persianCharacters + '] *)[\u200F\u200E]+( *[' + persianCharacters + '])', 'g'), '$1\u200c$2')
persianCharacters = '\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters;
// Remove more than a ZWNJs
persianCharactersNoVowels = '\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters;
.replace(/\u200c{2,}/g, '\u200c')
persianDigits = '۰۱۲۳۴۵۶۷۸۹';
// Convert ¬ to zwnj in Persian context
hamza = '\u0654';
.replace(new RegExp('([' + persianCharacters + '])¬(?=[' + persianCharacters + '])', '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(/\u200c([\w])/g, '$1')
.replace(/([\w])\u200c/g, '$1')
// Clean ZWNJs before and after Persian characters
.replace(new RegExp('\\u200c([' + vowels + arabicIndicDigits + persianDigits + hamza+'])','g'), '$1')
.replace(new RegExp('(['+arabicIndicDigits+'])\\u200c','g'), '$1')
.replace(/([\w])\u200c/g, '$1')
// Clean ZWNJs after and before punctuation
.replace(/\u200c([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, '$1')
.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])\u200c/g, '$1')
// Clean ZWNJs before brakets which have sapce after\before them
.replace(/\u200c(\]\][\s\n])/g, '$1')
.replace(/([\n\s]\[\[)\u200c/g, '$1');
}
 
function normalizeZwnj(text) {
persianGlyphs = {
return text
// these two are for visually available ZWNJ #visualZwnj
// Replace LRM, RLM characters with ZWNJ and it will remove unneeded ZWNJ at next lines
'\u200cه': 'ﻫ',
// .replace(/[\u180E\u2028\u2029\u202A\u202B\u202C\u202D\u202E\u200F¬]/g, '\u200c')
'ی\u200c': 'ﻰﻲ',
.replace(new RegExp('([' + persianCharacters + '] *)[\u200F\u200E]+( *[' + persianCharacters + '])', 'g'), '$1\u200c$2')
'أ': 'ﺄﺃﺃ',
// Remove more than a ZWNJs
'آ': 'ﺁﺁﺂ',
.replace(/\u200c{2,}/g, '\u200c')
'إ': 'ﺇﺈﺇ',
// Convert ¬ to zwnj in Persian context
'ا': 'ﺍﺎ',
.replace(new RegExp('([' + persianCharacters + '])¬(?=[' + persianCharacters + '])', '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(/\u200c([\w])/g, '$1')
'ج': 'ﺝﺞﺟﺠ',
.replace(/([\w])\u200c/g, '$1')
'چ': 'ﭺﭻﭼﭽ',
// Clean ZWNJs before and after Persian characters
'ح': 'ﺡﺢﺣﺤ',
.replace(new RegExp('\\u200c([' + vowels + arabicIndicDigits + persianDigits + hamza+'])','g'), '$1')
'خ': 'ﺥﺦﺧﺨ',
.replace(new RegExp('(['+arabicIndicDigits+'])\\u200c','g'), '$1')
'د': 'ﺩﺪ',
.replace(/([\w])\u200c/g, '$1')
'ذ': 'ﺫﺬ',
// Clean ZWNJs after and before punctuation
'ر': 'ﺭﺮ',
.replace(/\u200c([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, '$1')
'ز': 'ﺯﺰ',
.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])\u200c/g, '$1')
'ژ': 'ﮊﮋ',
// Clean ZWNJs before brakets which have sapce after\before them
'س': 'ﺱﺲﺳﺴ',
.replace(/\u200c(\]\][\s\n])/g, '$1')
'ش': 'ﺵﺶﺷﺸ',
.replace(/([\n\s]\[\[)\u200c/g, '$1');
'ص': 'ﺹﺺﺻﺼ',
}
'ض': 'ﺽﺾﺿﻀ',
'ط': 'ﻁﻂﻃﻄ',
'ظ': 'ﻅﻆﻇﻈ',
'ع': 'ﻉﻊﻋﻌ',
'غ': 'ﻍﻎﻏﻐ',
'ف': 'ﻑﻒﻓﻔ',
'ق': 'ﻕﻖﻗﻘ',
'ک': 'ﮎﮏﮐﮑﻙﻚﻛﻜ',
'گ': 'ﮒﮓﮔﮕ',
'ل': 'ﻝﻞﻟﻠ',
'م': 'ﻡﻢﻣﻤ',
'ن': 'ﻥﻦﻧﻨ',
'ه': 'ﻩﻪﻫﻬ',
'هٔ': 'ﮤﮥ',
'و': 'ﻭﻮ',
'ؤ': 'ﺅﺅﺆ',
'ی': 'ﯼﯽﯾﯿﻯﻰﻱﻲﻳﻴ',
'ئ': 'ﺉﺊﺋﺌ',
'لا': 'ﻻﻼ',
'لإ': 'ﻹﻺ',
'لأ': 'ﻸﻷ',
'لآ': 'ﻵﻶ'
};
 
persianGlyphs = {
function toStandardPersianCharacters(text) {
// these two are for visually available ZWNJ #visualZwnj
var i;
'\u200cه': '‌ه',
for (i in persianGlyphs) {
'ی\u200c': 'ی‌ی‌',
if (persianGlyphs.hasOwnProperty(i)) {
'أ': 'أأأ',
text = text.replace(new RegExp('[' + persianGlyphs[i] + ']', 'g'), i);
'آ': 'آآآ',
}
'إ': 'إإإ',
}
'ا': 'اا',
return normalizeZwnj(text) // needed because of #visualZwnj
'ب': 'بببب',
.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 ہ to ه ہہہہ to ههه
'ر': 'رر',
.replace(/ە/g, 'ه\u200c') // Kurdish
'ز': 'زز',
.replace(/ھ/g, 'ه'); // Kurdish
'ژ': 'ژژ',
}
'س': 'سسسس',
'ش': 'شششش',
'ص': 'صصصص',
'ض': 'ضضضض',
'ط': 'طططط',
'ظ': 'ظظظظ',
'ع': 'عععع',
'غ': 'غغغغ',
'ف': 'فففف',
'ق': 'قققق',
'ک': 'کککککککک',
'گ': 'گگگگ',
'ل': 'لللل',
'م': 'مممم',
'ن': 'نننن',
'ه': 'هه‌هه',
'هٔ': 'هٔهٔ',
'و': 'وو',
'ؤ': 'ؤؤؤ',
'ی': 'یییییی‌یی‌یی',
'ئ': 'ئئئئ',
'لا': 'لالا',
'لإ': 'لإلإ',
'لأ': 'لألأ',
'لآ': 'لآلآ'
};
 
function toPersianDigitstoStandardPersianCharacters(text) {
var i =var 0i;
for (i = 0; i <= 9; i = i +in 1persianGlyphs) {
if (persianGlyphs.hasOwnProperty(i)) {
text = text.replace(new RegExp('[' + arabicIndicDigits[i] + arabicDigits[i] + ']', 'g'), persianDigits[i]);
text = text.replace(new RegExp('[' + persianGlyphs[i] + ']', 'g'), i);
}
}
return text
}
.replace(new RegExp('([' + persianDigits + ']) ?%', 'g'), '$1٪')
return normalizeZwnj(text) // needed because of #visualZwnj
.replace(new RegExp('٪([' + persianDigits + ']+(?:[.٬٫][' + persianDigits + ']*)*)', 'g'), '$1٪')
.replace(/ک/g, 'ک') // Arabic
.replace(new RegExp('([' + persianDigits + '])\\.(?=[' + persianDigits + '])', 'g'), '$1٫') // persian decimal separator
.replace(/ک/g, 'ک') // Urdu
.replace(new RegExp('([' + persianDigits + '])\\،(?=[' + persianDigits + '])', 'g'), '$1٬'); // جایگزینی جداکننده هزاگان به جای ویرگول در میان اعداد
.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, 'ه\u200c') // Kurdish
.replace(/ه/g, 'ه'); // Kurdish
}
 
function applyOrthographytoPersianDigits(text) {
var i = 0;
return text
for (i = 0; i <= 9; i = i + 1) {
.replace(/\r/g, '')
text = text.replace(new RegExp('[' + arabicIndicDigits[i] + arabicDigits[i] + ']', 'g'), persianDigits[i]);
//تمیزکاری autoFormatter.js
}
.replace( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\u00AD]+/g, '' )
return text
.replace(/[ \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n/g,'\n')
.replace(new RegExp('([' + persianDigits + ']) ?%', 'g'), '$1%')
//تبدیل تب و فاصله نشکن اول خط به هیچ چون مدیاویکی آن را در نظر نمی‌گیرد
.replace(new RegExp('٪([' + persianDigits + ']+(?:[.٬٫][' + persianDigits + ']*)*)', 'g'), '$1%')
.replace(/\n[\t\u00A0]+/g, '\n')
.replace(new RegExp('([' + persianDigits + '])\\.(?=[' + persianDigits + '])', 'g'), '$1٫') // persian decimal separator
//تبدیل انواع فاصله‌ها به فاصله ساده
.replace(new RegExp('([' + persianDigits + '])\\،(?=[' + persianDigits + '])', 'g'), '$1٬'); // جایگزینی جداکننده هزاگان به جای ویرگول در میان اعداد
.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(/[\u02D0\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')
//فاصلهٔ پیش از واکه\u200cهای کوتاه اشتباه است و برای جلوگیر از به هم چسبیدن کلمات فاصله و واکه جابجا باید گردند.
.replace(new RegExp('([' + persianCharacters + vowels + hamza + '])(\\s)([' + vowels + hamza + '])', 'g'), '$1$3$2')
//واکه\u200cهای کوتاه پشت سرهم نمی\u200cآیند و یک حرف باید بینشان فاصله باشد
.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(/درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, 'درباره‌$1$2')//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
.replace(/درباره /g, 'دربارهٔ ')
.replace(new RegExp('صفحه(\\s|)(['+persianDigits+']+)(\\n|\\.|\\,|\\||\\<)', 'g'), 'صفحهٔ $2$3');//[[Special:PermaLink/15326391#افزودن همزه]]
}
 
function applyOrthography(text) {
/**
return text
* Replaces Persian characters with Arabic's ones so an Arabic sorter can sort Persian lines
.replace(/\r/g, '')
*/
//تمیزکاری autoFormatter.js
function dePersian(text) {
.replace( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\u00AD]+/g, '' )
return text
.replace(/[\xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n/g,'\n')
.replace(/ی/g, 'ي')
//تبدیل تب و فاصله نشکن اول خط به هیچ چون مدیاویکی آن را در نظر نمی‌گیرد
.replace(/ک/g, 'ك')
.replace(/گ\n[\t\u00A0]+/g, 'كی\n')
//تبدیل انواع فاصله‌ها به فاصله ساده
.replace(/ژ/g, 'زی')
.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(/[\u02D0\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')
//فاصلهٔ پیش از واکه\u200cهای کوتاه اشتباه است و برای جلوگیر از به هم چسبیدن کلمات فاصله و واکه جابجا باید گردند.
.replace(new RegExp('([' + persianCharacters + vowels + hamza + '])(\\s)([' + vowels + hamza + '])', 'g'), '$1$3$2')
//واکه\u200cهای کوتاه پشت سرهم نمی\u200cآیند و یک حرف باید بینشان فاصله باشد
.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(/دربارهٔ (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, 'درباره$1$2')//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
.replace(/دربارهٔ /g, 'دربارهٔ ')
.replace(new RegExp('صفحه(\\s|)(['+persianDigits+']+)(\\n|\\.|\\,|\\||\\<)', 'g'), 'صفحهٔ $2$3');//[[Special:PermaLink/15326391#افزودن همزه]]
}
 
/**
function persianSortText(text) {
* Replaces Persian characters with Arabic's ones so an Arabic sorter can sort Persian lines
return text.split('\n').sort(function (x, y) {
*/
var keyX = dePersian(x),
keyY =function dePersian(ytext); {
return text
if (keyX < keyY) {
.replace(/ی/g, 'ی')
return -1;
.replace(/ک/g, 'ک')
}
.replace(/گ/g, 'کی')
if (keyX > keyY) {
.replace(/ژ/g, 'زی')
return 1;
.replace(/چ/g, 'جی')
}
.replace(/پ/g, 'بی');
return 0;
}
}).join('\n');
}
 
function persianSortText(text) {
persianPastVerbs = '(' +
return text.split('\n').sort(function (x, y) {
'ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد' +
var keyX = dePersian(x),
'|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند' +
keyY = dePersian(y);
'|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید' +
if (keyX < keyY) {
'|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید' +
return -1;
'|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت' +
}
'|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست' +
if (keyX > keyY) {
'|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید' +
return 1;
'|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خشکاند' +
}
'|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست' +
return 0;
'|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست' +
}).join('\n');
'|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید' +
}
'|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید' +
'|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت' +
'|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت' +
'|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید' +
'|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست' +
'|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید' +
'|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید' +
'|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت' +
'|ورزید|وزاند|وزید|یارست|یازید|یافت' +
')';
 
persianPresentVerbspersianPastVerbs = '(' +
'ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد' +
'ارز|افت|افراز|افروز|افزا|افزای|افسر|افشان|افکن|انبار|انباز|انجام|انداز|اندای|اندوز|اندیش|انگار|انگیز|انگیزان' +
'|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند' +
'|اوبار|ایست|آرا|آرام|آرامان|آرای|آزار|آزما|آزمای|آسا|آسای|آشام|آشوب|آغار|آغاز|آفرین|آکن|آگن|آلا|آلای' +
'|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید' +
'|آمرز|آموز|آموزان|آمیز|آهنج|آور|آویز|آی|بار|باران|باز|باش|باف|بال|باوران|بای|باید|بخش|بخشا|بخشای' +
'|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید' +
'|بر|بَر|بُر|براز|بساو|بسیج|بلع|بند|بو|بوس|بوی|بیز|بین|پا|پاش|پاشان|پالا|پالای|پذیر|پذیران' +
'|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت' +
'|پر|پراکن|پران|پرداز|پرس|پرست|پرهیز|پرور|پروران|پز|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوشان' +
'|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست' +
'|پوی|پیچ|پیچان|پیرا|پیرای|پیما|پیمای|پیوند|تاب|تابان|تاران|تاز|تازان|تپ|تپان|تراش|تراشان|تراو|ترس|ترسان' +
'|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید' +
'|ترش|ترک|ترکان|تکان|تن|توان|توپ|جنب|جنبان|جنگ|جه|جهان|جو|جوش|جوشان|جوی|چاپ|چای|چپ|چپان' +
'|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خشکاند' +
'|چر|چران|چرب|چرخ|چرخان|چسب|چسبان|چش|چشان|چک|چکان|چل|چلان|چم|چین|خار|خاران|خای|خر|خراش' +
'|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست' +
'|خراشان|خرام|خروش|خز|خشک|خشکان|خل|خم|خند|خندان|خواب|خوابان|خوان|خواه|خور|خوران|خوف|خیز|خیس' +
'|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست' +
'|خیسان|دار|درخش|درخشان|درو|دزد|دم|ده|دو|دوان|دوز|دوش|ران|ربا|ربای|رخش|رس|رسان' +
'|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید' +
'|رشت|رقص|رقصان|رم|رنج|رنجان|رند|ره|رهان|رو|روب|روی|رویان|ریز|ریس|رین|زا|زار|زای|زدا' +
'|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید' +
'|زدای|زن|زی|ساب|ساز|سای|سپار|سپر|سپوز|ستا|ستان|ستر|ستیز|سر|سرا|سرای|سرشت|سز|سگال|سنب' +
'|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت' +
'|سنج|سوز|سوزان|شاش|شای|شتاب|شکاف|شکف|شکن|شکوف|شکیب|شمار|شمر|شناس|شناسان|شنو|شو|شور|شوران|شوی' +
'|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت' +
'|طپ|طلب|طوف|غارت|غر|غلت|غلتان|غلط|غلطان|غنو|فرسا|فرسای|فرست|فرما|فرمای|فروش|فریب|فشار|فشان|فشر' +
'|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید' +
'|فهم|فهمان|قاپ|قبولان|کار|کاه|کاو|کش|کَش|کُش|کِش|کشان|کف|کن|کوب|کوچ|کوش|گا|گای|گداز' +
'|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست' +
'|گذار|گذر|گذران|گرا|گراز|گرای|گرد|گردان|گرو|گری|گریان|گریز|گز|گزار|گزین|گسار|گستر|گستران|گسل|گشا' +
'|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید' +
'|گشای|گمار|گنج|گنجان|گند|گو|گوار|گوز|گوی|گیر|لرز|لرزان|لغز|لغزان|لم|لمبان|لند|لنگ|له|لول' +
'|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید' +
'|لیس|ماس|مال|مان|مک|مول|موی|میر|ناز|نال|نام|نشان|نشین|نکوه|نگار|نگر|نما|نمای|نمایان|نه' +
'|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت' +
'|نهنب|نواز|نورد|نوش|نوشان|نویس|نیوش|هراس|هست|هل|ورز|وز|وزان|یاب|یار|یاز' +
'|ورزید|وزاند|وزید|یارست|یازید|یافت' +
')';
')';
 
persianPresentVerbs = '(' +
persianComplexPastVerbs={
'ارز|افت|افراز|افروز|افزا|افزای|افسر|افشان|افکن|انبار|انباز|انجام|انداز|اندای|اندوز|اندیش|انگار|انگیز|انگیزان' +
'باز':'آفرید|آمد|آموخت|آورد|ایستاد|تابید|جست|خواند|داشت|رساند|ستاند|شمرد|ماند|نمایاند|نهاد|نگریست|پرسید|گذارد'+
'|اوبار|ایست|آرا|آرام|آرامان|آرای|آزار|آزما|آزمای|آسا|آسای|آشام|آشوب|آغار|آغاز|آفرین|آکن|آگن|آلا|آلای' +
'|گرداند|گردید|گرفت|گشت|گشود|گفت|یافت',
'|آمرز|آموز|آموزان|آمیز|آهنج|آور|آویز|آی|بار|باران|باز|باش|باف|بال|باوران|بای|باید|بخش|بخشا|بخشای' +
'در':'بر ?داشت|بر ?گرفت|آمد|آمیخت|آورد|آویخت|افتاد|افکند|انداخت|رفت|ماند|نوردید|کشید|گرفت',//bug: در گذشته
'|بر|بَر|بُر|براز|بساو|بسیج|بلع|بند|بو|بوس|بوی|بیز|بین|پا|پاش|پاشان|پالا|پالای|پذیر|پذیران' +
'بر':'آشفت|آمد|آورد|افتاد|افراشت|افروخت|افشاند|افکند|انداخت|انگیخت|تاباند|تابید|تافت|تنید|جهید|خاست|خواست|خورد'+
'|پر|پراکن|پران|پرداز|پرس|پرست|پرهیز|پرور|پروران|پز|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوشان' +
'|داشت|دمید|شمرد|نهاد|چید|کرد|کشید|گرداند|گردانید|گردید|گزید|گشت|گشود|گمارد|گماشت',
'|پوی|پیچ|پیچان|پیرا|پیرای|پیما|پیمای|پیوند|تاب|تابان|تاران|تاز|تازان|تپ|تپان|تراش|تراشان|تراو|ترس|ترسان' +
'فرو':'آمد|خورد|داد|رفت|نشاند|کرد|گذارد|گذاشت',
'|ترش|ترک|ترکان|تکان|تن|توان|توپ|جنب|جنبان|جنگ|جه|جهان|جو|جوش|جوشان|جوی|چاپ|چای|چپ|چپان' +
'وا':'داشت|رهاند|ماند|نهاد|کرد',
'|چر|چران|چرب|چرخ|چرخان|چسب|چسبان|چش|چشان|چک|چکان|چل|چلان|چم|چین|خار|خاران|خای|خر|خراش' +
'ور':'آمد|افتاد|رفت',
'|خراشان|خرام|خروش|خز|خشک|خشکان|خل|خم|خند|خندان|خواب|خوابان|خوان|خواه|خور|خوران|خوف|خیز|خیس' +
'یاد':'گرفت',
'|خیسان|دار|درخش|درخشان|درو|دزد|دم|ده|دو|دوان|دوز|دوش|ران|ربا|ربای|رخش|رس|رسان' +
'پدید':'آورد',
'|رشت|رقص|رقصان|رم|رنج|رنجان|رند|ره|رهان|رو|روب|روی|رویان|ریز|ریس|رین|زا|زار|زای|زدا' +
'پراکنده':'ساخت',
'|زدای|زن|زی|ساب|ساز|سای|سپار|سپر|سپوز|ستا|ستان|ستر|ستیز|سر|سرا|سرای|سرشت|سز|سگال|سنب' +
'زمین':'خورد',
'|سنج|سوز|سوزان|شاش|شای|شتاب|شکاف|شکف|شکن|شکوف|شکیب|شمار|شمر|شناس|شناسان|شنو|شو|شور|شوران|شوی' +
'گول':'زد',
'|طپ|طلب|طوف|غارت|غر|غلت|غلتان|غلط|غلطان|غنو|فرسا|فرسای|فرست|فرما|فرمای|فروش|فریب|فشار|فشان|فشر' +
'لخت':'کرد'
'|فهم|فهمان|قاپ|قبولان|کار|کاه|کاو|کش|کَش|کُش|کِش|کشان|کف|کن|کوب|کوچ|کوش|گا|گای|گداز' +
}
'|گذار|گذر|گذران|گرا|گراز|گرای|گرد|گردان|گرو|گری|گریان|گریز|گز|گزار|گزین|گسار|گستر|گستران|گسل|گشا' +
'|گشای|گمار|گنج|گنجان|گند|گو|گوار|گوز|گوی|گیر|لرز|لرزان|لغز|لغزان|لم|لمبان|لند|لنگ|له|لول' +
'|لیس|ماس|مال|مان|مک|مول|موی|میر|ناز|نال|نام|نشان|نشین|نکوه|نگار|نگر|نما|نمای|نمایان|نه' +
'|نهنب|نواز|نورد|نوش|نوشان|نویس|نیوش|هراس|هست|هل|ورز|وز|وزان|یاب|یار|یاز' +
')';
 
persianComplexPastVerbs={
persianComplexPresentVerbs={
'باز':'آفرید|آمد|آموخت|آورد|ایستاد|تابید|جست|خواند|داشت|رساند|ستاند|شمرد|ماند|نمایاند|نهاد|نگریست|پرسید|گذارد'+
'باز':'آفرین|آموز|آور|ایست|تاب|جو|خوان|دار|رس|ستان|شمار|مان|نمایان|نه|نگر|پرس|گذار|گردان|گرد|گشا|گو|گیر|یاب',
'|گرداند|گردید|گرفت|گشت|گشود|گفت|یافت',
'در':'بر ?دار|بر ?گیر|آمیز|آور|آویز|افت|افکن|انداز|مان|نورد|کش|گذر|گیر',//مشکل با: در روم باستان، در ده
'در':'بر ?داشت|بر ?گرفت|آمد|آمیخت|آورد|آویخت|افتاد|افکند|انداخت|رفت|ماند|نوردید|کشید|گرفت',//bug: در گذشته
'بر':'آشوب|آور|افت|افراز|افروز|افشان|افکن|انداز|انگیز|تابان|تاب|تن|جه|خواه|خور|خیز|دار|دم|شمار|نه|چین|کش|کن'+
'بر':'آشفت|آمد|آورد|افتاد|افراشت|افروخت|افشاند|افکند|انداخت|انگیخت|تاباند|تابید|تافت|تنید|جهید|خاست|خواست|خورد'+
'|گردان|گزین|گشا|گمار',
'|داشت|دمید|شمرد|نهاد|چید|کرد|کشید|گرداند|گردانید|گردید|گزید|گشت|گشود|گمارد|گماشت',
//مشکل با : بر گردن
'فرو':'آمد|خورد|داد|رفت|نشاند|کرد|گذارد|گذاشت',
'فرو':'خور|ده|رو|نشین|کن|گذار',
'وا':'دارداشت|رهانرهاند|مانماند|نهنهاد|کنکرد',
'ور':'افتآمد|روافتاد|رفت',
'یاد':'گیرگرفت',
'پدید':'آورآورد',
'پراکنده':'سازساخت',
'زمین':'خورخورد',
'گول':'زنزد',
'لخت':'کنکرد'
}
 
persianComplexPresentVerbs={
function complexVerbsApplyZwnj(text) {
'باز':'آفرین|آموز|آور|ایست|تاب|جو|خوان|دار|رس|ستان|شمار|مان|نمایان|نه|نگر|پرس|گذار|گردان|گرد|گشا|گو|گیر|یاب',
for (var x in persianComplexPastVerbs) {
'در':'بر ?دار|بر ?گیر|آمیز|آور|آویز|افت|افکن|انداز|مان|نورد|کش|گذر|گیر',//مشکل با: در روم باستان، در ده
var y = persianComplexPastVerbs[x]
'بر':'آشوب|آور|افت|افراز|افروز|افشان|افکن|انداز|انگیز|تابان|تاب|تن|جه|خواه|خور|خیز|دار|دم|شمار|نه|چین|کش|کن'+
text = text.replace(new RegExp(
'|گردان|گزین|گشا|گمار',
'(^|[^' + persianCharacters + '])(' + x + ') ?(می|نمی|)( |\u200c|)(ن|)('
//مشکل با : بر گردن
+ y + ')(م|ی|یم|ید|ند|ه|ن|)($|[^' + persianCharacters + '])', 'g'),
'فرو':'خور|ده|رو|نشین|کن|گذار',
'$1$2\u200c$3\u200c$5$6$7$8');
'وا':'دار|رهان|مان|نه|کن',
}
'ور':'افت|رو',
for (var x in persianComplexPresentVerbs) {
'یاد':'گیر',
var y = persianComplexPresentVerbs[x]
'پدید':'آور',
text = text.replace(new RegExp(
'پراکنده':'ساز',
'(^|[^' + persianCharacters + '])(' + x + ') ?(می|نمی|)( |\u200c|)(ن|)('
'زمین':'خور',
+ y + ')(م|ی|د|یم|ید|ند|ن)($|[^' + persianCharacters + '])', 'g'),
'گول':'زن',
'$1$2\u200c$3\u200c$5$6$7$8');
'لخت':'کن'
}
}
return text;
}
 
function applyZwnjcomplexVerbsApplyZwnj(text) {
for (var x in persianComplexPastVerbs) {
text=complexVerbsApplyZwnj(text);
var y = persianComplexPastVerbs[x]
return normalizeZwnj(text)
text = text.replace(new RegExp(
new RegExp( '(^|[^' + persianCharacters + '])(می|نمی) ?' + persianPastVerbsx + ') ?(می|نمی|)( |\u200c|)(ن|)('
+ y + ')(م|ی|یم|ید|ند|ه|)($|[^' + persianCharacters + '])', 'g'),
'$1$2\u200c$3$4\u200c$5$6$7$8');
}
)
for (var x in persianComplexPresentVerbs) {
.replace(
var y = persianComplexPresentVerbs[x]
new RegExp('(^|[^' + persianCharacters + '])(می|نمی) ?' + persianPresentVerbs +
text = text.replace(new RegExp(
'(م|ی|د|یم|ید|ند)($|[^' + persianCharacters + '])', 'g'),
'(^|[^' + persianCharacters + '])(' + x + ') ?(می|نمی|)( |\u200c|)(ن|)('
'$1$2\u200c$3$4$5'
+ y + ')(م|ی|د|یم|ید|ند|ن)($|[^' + persianCharacters + '])', 'g'),
)
'$1$2\u200c$3\u200c$5$6$7$8');
// ماضی نقلی
}
.replace(
return text;
new RegExp('(^|[^' + persianCharacters + '])(ن|)' + persianPastVerbs +
}
'ه (ام|ای|ایم|اید|اند|است)($|[^' + persianCharacters + '])', 'g'),
'$1$2$3ه\u200c$4$5'
)
// بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت
.replace(
new RegExp('(^|[^' + persianCharacters + '])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^' + persianCharacters + '])', '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('([' + persianCharacters + ']ی) تبار([^' + persianCharacters + '])', 'g'),
'$1\u200cتبار$2'
)
// چسباندن تمام «شناس»ها با فاصلهٔ مجازی
.replace(
new RegExp('([' + persianCharacters + ']ی) شناس([^' + persianCharacters + '])', '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('ه +(ایم|اید|اند)($|[^' + persianCharacters + '\u200c])', 'g'), 'ه\u200c$1$2')// به بخش ماضی نقلی منتقل شد
// موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود
.replace(/ا\sً/g, 'اً')
// رفع اشکال که\u200cای
.replace(/ که\u200cای /g, ' که ای ')
//رفع اشکال میستری (Mystery)
.replace(/می\u200cستری/g, 'میستری')
.replace(new RegExp('می\u200cگوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میگوی$1') // for میگوی دریایی
.replace(new RegExp('می\u200cدوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میدوی$1');// for [[میدوی (ابهام‌زدایی)]]
}
 
function punctuationapplyZwnj(text) {
text=complexVerbsApplyZwnj(text);
return text
return normalizeZwnj(text)
/// سجاوندی غیرفارسی
.replace(
.replace(/ː/g, ':') // Replace incorrect : character
new RegExp('(^|[^' + persianCharacters + '])(می|نمی) ?' + persianPastVerbs +
// استفاده از ؟ فارسی
.replace'(new RegExp('م|ی|یم|ید|ند|ه|)($|[^' + persianCharacters + '])[ ]*[?]', 'g'), '$1؟')
'$1$2\u200c$3$4$5'
// استفاده از ; فارسی
)
.replace(new RegExp('([' + persianCharacters + '])[ ]*[;]', 'g'), '$1؛ ')
.replace(
// استفاده از ، فارسی
.replace(new RegExp('(^|[^' + persianCharacters + '])(\]\]|»می|نمی)[ ]*[,]?', 'g'),+ '$1$2،persianPresentVerbs ')+
'(م|ی|د|یم|ید|ند)($|[^' + persianCharacters + '])', 'g'),
//حذف دو فاصله بعد از سجاوندی
'$1$2\u200c$3$4$5'
.replace(/(،|؛|؟|\.) /g, '$1 ')
)
.replace(/\r/g, '')
// ماضی نقلی
// افزودن یا حذف فاصله
.replace(
// حذف فاصله‌های تکراری میان واژه‌ها، به جز بین نام پارامتر و علامت مساوی
new RegExp('(^|[^' + persianCharacters + '])(ن|)' + persianPastVerbs +
.replace(/(. ) +(?=[^= ])/g, '$1')
'ه (ام|ای|ایم|اید|اند|است)($|[^' + persianCharacters + '])', 'g'),
//فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)
'$1$2$3ه\u200c$4$5'
.replace(/([،\.\؛\؟»])([^\s\.\(\)«»\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])/g, '$1 $2')
)
// افزودن فاصله به بعد از سجاوندی
 
.replace(new RegExp('([' + persianCharacters + ']+|\\]|\\)|»)([؟،؛\\!\\.])([' + persianCharacters +persianDigits + ']+|\\[|\\(|«)', 'g'), '$1$2 $3')
// بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت
// حذف فاصله بعد از گیومه، پرانتز، براکت باز
.replace(/([\(«\[]) /g, '$1')
new RegExp('(^|[^' + persianCharacters + '])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^' + persianCharacters + '])', 'g'),
// حذف فاصله قبل از گیومه، پرانتز، براکت بسته
'$1$2\u200c$3$4$5'
.replace(/ ([\)»\]])/g, '$1')
)
// افزودن فاصله قبل از گیومه باز
// ای «توان» ناقلا!
.replace(/([^ \(\[\|\r\n>'])(«)/g, '$1 $2')
.replace(/ +(\s)(می|نمی) +?توان/g, ' ($1$2\u200cتوان')
// چسباندن تمام «ها»ها با فاصلهٔ مجازی
.replace(new RegExp('([' + persianCharacters + ']|\\]|») *\\( *(?=[' + persianCharacters + '])(?!ها\\)|ان\\))', 'g'), '$1 (')
.replace(new/ RegExp('ها([' + persianCharacters + '\]) *\.،\:»\) *(?=[' + persianCharacters + '\s]|\'{2,3}|\[|«={2,})', '/g'), '\u200cها$1) ')
.replace(/ ها(ی|یی|یم|یت|یش|ی?مان|ی?تان|ی?شان)([\]\.،\:»\)\s])/g, '\u200cها$1$2')
// خط جدید
.replace(/\n\s{1,}\nه‌ها/g, '\n\nه‌ها')
// چسباندن تمام «ترین»ها با فاصلهٔ مجازی
// Removes extra line between two items list
.replace(/ ترین([\n]\*.*?،\:»\)\n+(?=s]|\n'{2,3}|\*={2,})/g, '\u200cترین$1')
// چسباندن تمام «تبار»ها با فاصلهٔ مجازی
// Removes extra line between two items list
.replace(/(\n#.*?)\n+(?=\n#)/g, '$1')
new RegExp('([' + persianCharacters + ']ی) تبار([^' + persianCharacters + '])', 'g'),
// Convert , to ، if there are Persian characters on both sides of it
'$1\u200cتبار$2'
.replace(new RegExp('([' + persianCharacters + ']), ?(?=[' + persianCharacters + "])", 'g'), '$1$2، ')
)
// بعد از نقطه‌ویرگول فارسی علامتی قرار نمی‌گیرد
// چسباندن تمام «شناس»ها با فاصلهٔ مجازی
.replace(/(؛)(([\s]+)?[\.،؛:!؟\-…])/g, '$1')
.replace(
// در انتهای پاراگراف نقطه‌ویرگول فارسی نمی‌آید
new RegExp('([' + persianCharacters + ']ی) شناس([^' + persianCharacters + '])', 'g'),
.replace(/(؛)(\s|)\n\n/g, '.\n\n')
'$1\u200cشناس$2'
// سجاوندی در ابتدای علامت باز قرار نمی‌گیرد
)
.replace(/([\(«])[\s]([؛\.،])/g, '$1')
// برای حذف علامت ستاره اضافی قبل از عنوان‌ها
// ویرگول فارسی
.replace(/\n\*\s*(\=+.+?\=+\n)/g, '\n$1')
// بعد از ویرگول فارسی این علامت‌ها قرار نمی‌گیرد
// عضو علامت‌های نقل قول تکی از عنوان‌ها
.replace(/(،)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))/g, '$1')
.replace(/(\n=+)(.*?)(?:'+)(.*?)(?:'+)(.*?)(=+\n)/g, '$1$2$3$4$5')
// نقطه
// اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود
// باید سه نقطه باشد
.replace(/(^\u200c|\u200c$)/mg, '')
.replace(new RegExp('([' + persianCharacters + '])( *)(\\.{3,})', 'g'), '$1$2…')
// شناسه‌ها
.replace(/ \.\.\. /g, ' … ')
// توجه: «است» تعدماً از شناسه‌ها حذف شده چون به عنوان فعل مستقل هم کاربرد دارد و در آن موارد باید جدا نوشته شود
// بعد از نقطه این علایم نمی‌آیند
// مثال: «این یک خانه است» که است در آن باید از خانه جدا نوشته شود
.replace(new RegExp('([' + persianCharacters + '])\\.( *[،؛:!؟\\?]+)', 'g'), '$1.')
// حروف «ام» و «ای» هم به دلیل تشابه با حرف ندا «اِی» و ام انگلیسی و ای انگلیسی حذف شدند.
// سجاوندی در ابتدای پرانتز و گیومه باز قرار نمی‌گیرد
//.replace(new RegExp('ه +(\\(ایم|«)[\\.،؛](\\sاید|اند)($|[^' + persianCharacters + '\u200c])', 'g'), 'ه\u200c$1$32')// به بخش ماضی نقلی منتقل شد
// موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود
// سجاوندی در داخل پرانتز
.replace(/ا\sً/g, 'اً')
.replace(new RegExp('([' + persianCharacters + '])(\\s|)[\\.،؛](\\s|)(\\))', 'g'), '$1$2$3$4')
// رفع اشکال که\u200cای
// در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد
.replace(/ که\u200cای /g, ' که ای ')
.replace(new RegExp('([' + persianCharacters + '])(\\s|)(\\.)(\\s|)(ولی|که\\s|و\\s|بنابراین|لذا)', 'g'), '$1؛ $5')
//رفع اشکال میستری (Mystery)
/// Question & exclamation mark
.replace(/می\u200cستری/g, 'میستری')
// علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
.replace(new RegExp('می\u200cگوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میگوی$1') // for میگوی دریایی
// تكرار علامت سوال فارسی
.replace(new RegExp('می\u200cدوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میدوی$1');// for [[میدوی (ابهام‌زدایی)]]
.replace(/(؟(\s|)){2,}/g, '؟')
}
// علامت‌گذاری نادرست
 
.replace('؟ !', '؟!').replace('! ؟', '!؟')
// Remove space precedingfunction punctuation, except for(text) ellipses{
return text
.replace(/([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|<|$)/g, '$1$2$3')
/// سجاوندی غیرفارسی
// تبدیل نیم‌خط به تمام خط بین اعداد فارسی (وپ:خط تیره)
.replace(/ː/g, ':') // Replace incorrect : character
.replace(new RegExp('([' + persianDigits + ']+\\s?(?:\\_\\_|\\-|ـ+)\\s?)*([' + persianDigits + ']+)\\s?(?:\\_\\_|\\-|ـ+)\\s?([' + persianDigits + ']+)(?!\\s?(?:\\_\\_|\\-|ـ+)\\s?[' + persianDigits + ']+)', 'g'), function ($0, $1, $2, $3) { return ($1 ? $0 : $2 + '–' + $3) })
// استفاده از ؟ فارسی
// عبارت «ها» درون پرانتز می‌تواند به کلمه قبلی خود بچسبد
.replace(/new \RegExp(ها\'([' + persianCharacters + '])/g[ ]*[?]', '(هاg'), '$1؟')
// استفاده از ; فارسی
.replace(/ه‍\. (ق|خ|ش)([\n ])/g, 'ه‍.$1$2')//iاصلاح تاریخ هجری
.replace(new RegExp('([' + persianCharacters + '])[ ]*[;]', 'g'), '$1؛ ')
// حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند
// استفاده از ، فارسی
.replace(new RegExp('(\^|\\||\\(|«|\\}|"|\\s|\\*|\\#)(([' + persianCharacters + ']\{1,2\})\\. \?)\{2,6\}', 'g'), function (m) { return m.replace(/\. (.)/g, '.$1'); });
.replace(new RegExp('([' + persianCharacters + '])(\]\]|»|)[ ]*[,]', 'g'), '$1$2، ')
}
//حذف دو فاصله بعد از سجاوندی
return {
.replace(/(،|؛|؟|\.) /g, '$1 ')
applyOrthography: applyOrthography,
.replace(/\r/g, '')
applyZwnj: applyZwnj,
// افزودن یا حذف فاصله
normalizeZwnj: normalizeZwnj,
// حذف فاصله‌های تکراری میان واژه‌ها، به جز بین نام پارامتر و علامت مساوی
persianSortText: persianSortText,
.replace(/(. ) +(?=[^=])/g, '$1')
punctuation: punctuation,
//فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)
toPersianDigits: toPersianDigits,
.replace(/([،\.\؛\؟»])([^\s\.\(\)""\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])/g, '$1 $2')
toStandardPersianCharacters: toStandardPersianCharacters,
// افزودن فاصله به بعد از سجاوندی
vowels: vowels,
.replace(new RegExp('([' + persianCharacters: + ']+|\\]|\\)|»)([؟،؛\\!\\.])([' + persianCharacters +persianDigits + ']+|\\[|\\(|«)', 'g'), '$1$2 $3')
// حذف فاصله بعد از گیومه، پرانتز، براکت باز
persianCharactersNoVowels: persianCharactersNoVowels
.replace(/([\("\[]) /g, '$1')
};
// حذف فاصله قبل از گیومه، پرانتز، براکت بسته
.replace(/ ([\)"\]])/g, '$1')
// افزودن فاصله قبل از گیومه باز
.replace(/([^ \(\[\|\r\n>'])(«)/g, '$1 $2')
.replace(/ +\( +/g, ' (')
.replace(new RegExp('([' + persianCharacters + ']|\\]|») *\\( *(?=[' + persianCharacters + '])(?!ها\\)|ان\\))', 'g'), '$1 (')
.replace(new RegExp('([' + persianCharacters + ']) *\\) *(?=[' + persianCharacters + ']|\\[|«)', 'g'), '$1) ')
// خط جدید
.replace(/\n\s{1,}\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 Persian characters on both sides of it
.replace(new RegExp('([' + persianCharacters + ']), ?(?=[' + persianCharacters + "])", 'g'), '$1$2، ')
// بعد از نقطه‌ویرگول فارسی علامتی قرار نمی‌گیرد
.replace(/(;)(([\s]+)?[\.،؛:!؟\-…])/g, '$1')
// در انتهای پاراگراف نقطه‌ویرگول فارسی نمی‌آید
.replace(/(;)(\s|)\n\n/g, '.\n\n')
// سجاوندی در ابتدای علامت باز قرار نمی‌گیرد
.replace(/([\("])[\s]([؛\.،])/g, '$1')
// ویرگول فارسی
// بعد از ویرگول فارسی این علامت‌ها قرار نمی‌گیرد
.replace(/(,)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))/g, '$1')
// نقطه
// باید سه نقطه باشد
.replace(new RegExp('([' + persianCharacters + '])( *)(\\.{3,})', 'g'), '$1$2…')
.replace(/ \.\.\. /g, ' … ')
// بعد از نقطه این علایم نمی‌آیند
.replace(new RegExp('([' + persianCharacters + '])\\.( *[،؛:!؟\\?]+)', 'g'), '$1.')
// سجاوندی در ابتدای پرانتز و گیومه باز قرار نمی‌گیرد
.replace(new RegExp('(\\(|«)[\\.،؛](\\s|)([' + persianCharacters + '])', 'g'), '$1$3')
// سجاوندی در داخل پرانتز
.replace(new RegExp('([' + persianCharacters + '])(\\s|)[\\.،؛](\\s|)(\\))', 'g'), '$1$2$3$4')
// در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد
.replace(new RegExp('([' + persianCharacters + '])(\\s|)(\\.)(\\s|)(ولی|که\\s|و\\s|بنابراین|لذا)', 'g'), '$1؛ $5')
/// Question & exclamation mark
// علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
// تکرار علامت سؤال فارسی
.replace(/(؟(\s|)){2,}/g, '؟')
// علامت‌گذاری نادرست
.replace('؟ !', '؟!').replace('! ؟', '!؟')
// Remove space preceding punctuation, except for ellipses
.replace(/([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|<|$)/g, '$1$2$3')
// تبدیل نیم‌خط به تمام خط بین اعداد فارسی (وپ:خط تیره)
.replace(new RegExp('([' + persianDigits + ']+\\s?(?:\\_\\_|\\-|ـ+)\\s?)*([' + persianDigits + ']+)\\s?(?:\\_\\_|\\-|ـ+)\\s?([' + persianDigits + ']+)(?!\\s?(?:\\_\\_|\\-|ـ+)\\s?[' + persianDigits + ']+)', 'g'), function ($0, $1, $2, $3) { return ($1 ? $0 : $2 + '–' + $3) })
// عبارت «ها» درون پرانتز می‌تواند به کلمه قبلی خود بچسبد
.replace(/ \(ها\)/g, '(ها)')
.replace(/ه‍\. (ق|خ|ش)([\n])/g, 'ه‍.$1$2')//iاصلاح تاریخ هجری
// حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند
.replace(new RegExp('(\^|\\||\\(|«|\\}|"|\\s|\\*|\\#)(([' + persianCharacters + ']\{1,2\})\\. \?)\{2,6\}', 'g'), function (m) { return m.replace(/\. (.)/g, '.$1'); });
}
return {
applyOrthography: applyOrthography,
applyZwnj: applyZwnj,
normalizeZwnj: normalizeZwnj,
persianSortText: persianSortText,
punctuation: punctuation,
toPersianDigits: toPersianDigits,
toStandardPersianCharacters: toStandardPersianCharacters,
vowels: vowels,
persianCharacters: persianCharacters,
persianCharactersNoVowels: persianCharactersNoVowels
};
}());
if (typeof window !== 'undefined') {
window.persianTools = persianTools;
}
// </nowiki>
/*global persianTools, persianToolsDictionary, autoEd*/
var persianWikiTools = (function () {
'use strict';
//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: /\{\{(?:چپ چین|چپ‌چین)\}\}([\s\S]*?)\{\{(?:پایان چپ‌چین|پایان چپ چین|پایان)\}\}/g,
argumentsBlacklist: /(?:accessdate|namespace|legend1start|image|تصویر|doi|style|شابک|عرض|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)\/[^\|\]]*/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: /\[\[ویژه:مشارکت\u200cها.*?\]\]/g,
isbn: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: /\{\{(?:به .+?|پم|به انگلیسی|انگلیسی|عربی|متن عربی|عبارت عربی|حدیث|به عربی|به اردو|اردو|lang\-[au]r|پینگ|ping)[\s\S]*?\}\}/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):)?(?:start\-date)[ \_]*\|.*?\}\}/gi,
templateParameterName: /\|\s*(?=[a-z_]*\d)[a-z_\d]*\s*\=/gi,
globalExceptionTag: /(<nowiki>.+?<\/nowiki>|<!--[\s]*ابر[\s]*-->.+?<!--[\s]*\/[\s]*ابر[\s]*-->)/gi,
translatedUrl: /.(کام|نت|آی‌آر)/g,
boxVar: /([a-zA-Z][۱۲۳۴۵۶۷۸۹۰]+) *\=/g,
url: /\/\/.*?(?=[\s\n\|\}\]<]|$)/gi, // بدون https?: هم ممکن است
mediawikiFunctions: /\{\{\#(?:\{\{.*?\}\}|[^\}])*\}\}/gi
};
 
function escapeRE( s ) {
return s.replace( /([$()*+\-.?[\\\]^{|}])/g, '\\$1' );
}
 
function descendingFromComparetor(x, y) {
return x.from - y.from;
}
 
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 wikiConvertToPersianCharacters(text) {
return replaceExcept(
text,
persianTools.toStandardPersianCharacters,
[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 />'
);
//ویکی‌پدیای فارسی منبع برای ارجاع نیست
str = str.replace(/\<ref[^>]*\>\[?(?:https?:)?\/\/fa.(?: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/gi, '<ref' ).replace( /\<\/ref\> *\<\/small\>/gi, '</ref>' );
}
 
function autoFormatCleanTags(str) {
str = str.replace( /(<\/?s)trike\b/gi, '$1' );
str = str.replace(
/\<u\>([^\<]+)\<\/u\>/gi,
"''$1''"
);
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"];
 
/* 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('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.\\)]+)"((?:\\[\\[|).*?[' + persianTools.persianCharacters + '؛\\n،]+?(?:\\]\\]|\\.|\\<|\\:|…|))"([' + persianTools.persianCharacters + '،«؛\\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('ا\\"([ ]*[' +persianTools.persianCharacters + '])', 'g'), 'اً$1')
// ”“ تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)“((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))”([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
//وارونه ”“ تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)”((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))“([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
// ‘’ تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)‘((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))’([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
//وارونه ‘’ تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)’((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))‘([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
// ‚’ تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)‚((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))’([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
// „” تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)„((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))”([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
// << >> تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)\\<\\<((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))\\>\\>([' + persianTools.persianCharacters + '،«؛\\s\\n\\.\\[\\{]|$)', 'g'),
'$1«$2»$3'
);
// (()) تبدیل
line = line.replace(
new RegExp('(^|[' + persianTools.persianCharacters + '\\:>،»؛\\s\\n\\}\\]\\.]+)\\(\\(((?:\\[\\[|).*?[' + persianTools.persianCharacters + '\\n]+?(?:\\]\\]|\\.|\\<|\\:|\\{|\\[|…|))\\)\\)([' + persianTools.persianCharacters + '،«؛\\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('عرض') > -1) {
needChange = true;
break;
}
}
}
}
}
}
if (refTemplate[1] === undefined || !needChange) {
return text.replace(refTemplate[0], refTemplate[0].replace('}}', '|۲}}'));
}
}
}
}else{
}
return text;
}
/**
* اصلاح پیوندها
* @param {string} text محتوا
* @return {string}
*/
function fixBadLinks(text) {
// حذف متن جایگزین پیوند اگر با نشانی پیوند برابر باشد؛ مانند [[سلام|سلام]]
text = text.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, '[[$1]]');
 
/**
// حذف پیوند سال و روز ماه
* اصلاح پیوندها
text = text.replace(/\[{2}([۰-۹]+|[۰-۹]+ [\)\(\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2]+)(?:\|([^\]\|\[]+))?\]{2}/g, function (match, p1, p2) {
* @param {string} text محتوا
// اگر فقط سال پیوند شده‌باشد یا به شکل [[سال|همان سال]] باشد فقط سال را می‌گرداند.
* @return {string}
if (p1 !== p2 && p1.replace(/ \((میلادی|قمری|خورشیدی|شمسی)\)/g,'') === p2){
*/
return p2;
function fixBadLinks(text) {
}//[[Special:Permalink/19908981#حذف پیوند تاریخ‌ها]]
// حذف متن جایگزین پیوند اگر با نشانی پیوند برابر باشد؛ مانند [[سلام]]
if (p2 === undefined || p1 === p2) {
text = text.replace(/\[{2}([^\|]+)\|\1\]{2}/gi, '[[$1]]');
// اگر پیوند به روز و ماه بود، برای جلوگیری از اشتباه و تداخل، بررسی می‌شوند که حتما یکی از ماه‌ها داخل رشته باشد.
if (p1.indexOf(" ") > -1) {
var
months = ["فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند",
"ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر",
"محرم", "صفر", "ربیع‌الاول", "ربیع‌الثانی", "جمادی‌الاول", "جمادی‌الثانی", "رجب", "شعبان", "رمضان", "شوال", "ذیقعده", "ذیحجه"],
i;
for (i = months.length - 1; i >= 0; i--) {
if (p1.indexOf(months[i]) > -1) {
return p1;
}
}
return "[[" + p1 + "]]";
}
return p1;
}
// اگر متن جایگزین پیوند مخالف پیوند سال بود، متن جایگزین را برمی‌گرداند.
return p2;
});
 
// حذف پیوند سال و روز ماه
return text;
text = text.replace(/\[{2}([۰-۹]+|[۰-۹]+ [\)\(\u0621-\u0655\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;
}
}
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]
);
 
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('([' + persianTools.persianCharactersNoVowels + '])ـ+([' + persianTools.persianCharactersNoVowels + '])', 'g'),
'$1$2'
);
return text.replace(new RegExp('([' + persianTools.persianCharacters + '])(\\]\\]|), (\\[\\[|)?(?=[' + persianTools.persianCharacters + "])", '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 persianTools.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('([' + persianTools.persianCharacters + '\]])٬', 'g'), '$1،')
.replace(new RegExp('([' + persianTools.persianCharacters + '])(\]\]|»|)[ ]*[,]', 'g'), '$1$2، ')
.replace(/\[\[([^\|\]]+)\|(\'{2,3})\1'{2,3}\]\]/g,'$2[[$1]]$2')// for [[foo|'''[[foo]]''']] > '''[[foo]]'''
//برگرفته از 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]]
//مشکل در نشانی اینترنتی
.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();
})
// پیوند به بیرون‌هایی که در میان پیوند نویسهٔ رفتن به خط بعد، وجود داشته باشد
.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(/\[\[([^\]]+)< *small *\{/ *\{>|\!< *\}/ *small *\}([^/ *\]]+>)\]\]/ggi, '[[$1|$2]]</small>')//وجود {{!}} درون پیوند
.replace(/\[\[([^\]]+)\{2\{\!\}\}([^\|]]+)\|\1]\]{2}/gig, '[[$1|$2]]')//زمانیوجود که{{!}} بخش هدف و نمایهدرون پیوند یکی باشند
.replace(/\[\{2}([(.+)^\|(']+)(.+\b)('+)|\]1\]{2}/gi, '$2[[$1|$3]]$4')//زمانی انتقالکه '''بخش بههدف بیرونو نمایه پیوند یکی باشند
.replace(/\[\[(.+)\|('+)(.+\b)('+)\]\]/gi, '$2[[$1|$3]]$4')// انتقال ''' به بیرون پیوند
// تمیزکاری autoFormatter.js > CleanGalleries
// تمیزکاری autoFormatter.js > CleanGalleries
.replace(/<gallery\b([^<>]*)>([^<>]+)<\/gallery\b[^<>]*>/gi,
.replace(/<gallery\b([^<>]*)>([^<>]+)<\/gallery\b[^<>]*>/gi,
function( $0, $1, $2 ) {
function( $0, $1, $2 ) {
return '<gallery' + $1 + '>' + $2
return '<gallery' + $1 + '>' + $2
.replace( /^(\s*)\[+([^[\]]*)\]\]?\s*$/gm, '$1$2' )
.replace( /^(\s*)\[+([^[\]]*)\]\]?\s*$/gm, '$1$2' ) + '<\/gallery>';
.replace( /^(\s*)\[+/gm, '$1' ) + '<\/gallery>';
}
}
)
)
// تمیزکاری پرونده‌ها
// تمیزکاری پرونده‌ها
// زمانی که برچسب کوچک در توضیحات تصویر می‌آید برای دستگاه‌های با مانیتور کوچک خواندن متن مشکل می‌شود
// زمانی که برچسب کوچک در توضیحات تصویر می‌آید برای دستگاه‌های با مانیتور کوچک خواندن متن مشکل می‌شود
//https://tools.wmflabs.org/checkwiki/cgi-bin/checkwiki.cgi?project=fawiki&view=only&id=77
//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[Ff]ile)\:((?:\[\[.*?\]\]|small[^\]])>*)\]\]/g,'' function ($0, $1, $2); {
$2 = $2.replace(/\<\/?(big|center|small)>/g,'');
return '[['+$1+':'+$2+']]'
return '[['+$1+':'+$2+']]'
})
})
.replace( /\[\[ *تصو[يی]ر\:/gi, '[[پرونده:' )
.replace( /\[\[ *تصو[یی]ر\:/gi, '[[پرونده:' )
// تمیزکاری الگو autoFormater.js > cleanTemplates
// تمیزکاری الگو autoFormater.js > cleanTemplates
.replace( /\{\{\s*:?\s*(?:الگو|Template)\s*:\s*/gi, '{\{' )
.replace( /\{\{\s*:?\s*(?:الگو|Template)\s*:\s*/gi, '{\{' )
// حذف خط زیر از عنوان الگو
// حذف خط زیر از عنوان الگو
.replace(/(?:^|[^{])\{\{[ 0-9a-z\xC0-\u024F-]*_[ \w\xC0-\u024F-]*/gi,
.replace(/(?:^|[^{])\{\{[0-9a-z\xC0-\u024F-]*_[\w\xC0-\u024F-]*/gi,
function( $0 ) {
function( $0 ) {
return $0.replace( /_+$/, '' ).replace( /[ _]+/g, ' ' ).replace( /\{ +/, '{' );
return $0.replace( /_+$/, '' ).replace( /[_]+/g, ' ' ).replace( /\{ +/, '{' );
}
}
)
)
//سایر موارد
//سایر موارد
.replace(/\[\[(رده|الگو|ویکی\u200cپدیا)\: +/g, '[[$1:')
.replace(/\[\n\s]*\{\{[•·ن](w?رده|الگو|ویکی\u200cپدیا)\}\}\s*: +/g, '{{•[[$1}} :')
.replace(/[\=n\s]*\{\{[•·ن](w?)\}\}\s*/g, '=\n{{•$1}} ')//رفع باگ [[Special:Diff/14799178/16387261]] در خط بالا
.replace(/ *(<\/? ?br ?\/?>|=\{\{بر[•·ن](w?)\}\}) \s*/g, '=\n{{سخ•$1}} ')//رفع باگ [[Special:Diff/14799178/16387261]] در خط بالا
.replace(/ *(<\/? ?br ?\/?>|\{\{سخبر\}\}\n\n) */g, '\n\n{{سخ}}')
.replace(/\n\n\{\{سخ\}\}\n\n/g, '\n\n')
.replace(/\n\n\{\{سخ\}\}\]/g, ']\n\n')
.replace(/\[\{\{سخ\}\}\]/g, '[]')
.replace(/\n[\n({\*|{سخ\#)}\}/g, '\n$1[')
.replace(/\n\n(\#*|\*#)( |)\n/g,'\n$1')
.replace(/\n(\*#|\#*)( |)(\={2,})n/g,'\n$31')
.replace(/(\n?)(\s+?<*|\/ref>#)( |)(\={2,})/g, '\n$1</ref>3')
.replace(/(\{ *n?)\s+?<\|/ref>/g, '{|$1</ref>')
.replace(/\|{ *\}|/g, '{|}')
.replace(/\{\| *\{\|}/g, '{|}')
.replace(/\|{\}| *\|{\}|/g, '{|}')
.replace(/\|\} /^=.*&nbsp;.*=$\|\}/gimg, function( $0 '|}') {
return $0 .replace( /(?:^=.*&nbsp;|\s)+.*=$/gigim, 'function( '$0 ); {
return $0.replace( /(?:&nbsp;|\s)+/gi, ' ' );
})
})
.replace(/([^=])\n+(\=.*?\=\n+)/g, '$1\n\n$2')
.replace(/^(=+([^=])\n+(\=.*?)\=+)[\t\s]{1,}\n+)/g, '$1\n\n$2')
.replace(/^(\={2,}+([^=].*?) =+)[\:,;>&t\^#@•→←↔↑↓—–…~٫،؛ٔs]{1,}\n/mgg, '$1\n') // Cleanup headers
.replace(/^(\={2,}) +[\:,;<>&\^#@•→←↔↑↓—–…~٫،؛ٔ] +(\={2,})$/mg, '$1') // Cleanup headers
.replace(/^([\={2:,};<&\s*)(«)([^\n«»#@•→←↔↑↓—–…~٫،؛ٔ]*?) +(»)(\s*\={2,})$/mg, '$1 $3 $5')
.replace(/^(\={2,}\s*) *'+(.«)([^\n«»]*?)'+ *(»)(\s*\={2,})/mg, '$1 $23 $35')
.replace(/^[•●⚫⬤]/mg(\={2,}) '*'+(.*?)'+ *(\={2,})//mg, Wikify bullets'$1 in$2 start of lines$3')
.replace(/^[•●⚫⬤]/mg, '*') // Wikify bullets in start of lines
.replace(/^#\s*(REDIRECT|تغییر[ _]?مسیر)/gi, '#تغییرمسیر')
.replace(/^#تغییرمسیر\s*(REDIRECT|تغییر[_]?=\Sمسیر)/ggi, '#تغییرمسیر ') // Adds a space after #REDIRECT
.replace(/^#تغییرمسیر(\?={2,}) *([^\n\r]*?) *(\={2,}S)/g, '$1#تغییرمسیر $2 $3') // Format headingsAdds levela 2space andafter above#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')
.replace(/(\=+) \<(?:small|big)\>([^\=\n\r]+)\<\/(?:small|big)\> (\=+)/g, '$1 $2 $3')
// فاصله‌های اضافی را از داخل پیوند به بیرون منتقل کند تا اگر اضافه بودند در کدهای دیگر حذف شوند
// فاصله‌های اضافی را از داخل پیوند به بیرون منتقل کند تا اگر اضافه بودند در کدهای دیگر حذف شوند
.replace(/\[\[(\s*)(.*?)(\s*)\]\]/g, '$1[[$2]]$3')
.replace(/\[\[(\s*)(.*?)(\s*)\]\]/g, '$1[[$2]]$3')
//حذف فاصلهٔ اضافی درون {{}}
//حذف فاصلهٔ اضافی درون {{}}
.replace(/\{\{(\s*)(.*?)(\s*)\}\}/g, '{{$2}}')
.replace(/\{\{(\s*)(.*?)(\s*)\}\}/g, '{{$2}}')
// تبدیل به نویسه / یکی کردن فاصله های مجازی پشت سرهم
// تبدیل به نویسه / یکی کردن فاصله های مجازی پشت سرهم
.replace(/(\{\{فم\}\}|\&zwnj\;|\u200c+)/g, '\u200c')
.replace(/(\{\{فم\}\}|\&zwnj\;|\u200c+)/g, '\u200c')
// Full stop and comma should be before citation. See en:WP:REFPUNC
// 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$31')
.replace(/ *([^.])([\.،,:]){2}((?:<ref[^\/]*?>.*?<\/ref>)+)([\.،,:])/g, '$1$2$13')
.replace(/([^.])([\.،,:]){2}( *((?:<ref[^\/]*?\/>)+)+([\.،,:])/g, '$1$2$31')
.replace(/([^.])([\.،,:]){2}(((?:<ref[^\/]*?\/>)+)+)/g, '$1$2$3')
/* هر رده در یک خط */
/* هر رده در یک خط */
.replace( /([^\s>-]) *(\[\[رده:[^\n[\]]*\]\])/gi, '$1\n$2' )
.replace( /([^\s>-]) *(\[\[رده:[^\n[\]]*\]\]) *(?![\s<-]|$)/gi, '$1\n$2' )
.replace( /(\[\[رده:[^\n[\]]*\]\]\n) *(?!\[\[رده:|[\s<-]|$)/gi, '$1\n' )
.replace( /(\[\[رده:[^\n[\]]*\]\]\n) *(?!\[\[رده:|[\s<-]|$)/gi,'$1\n')
//ترتیب‌پیش‌فرض
.replace(/\{\{(?:DEFAULTSORT|[Dd]efaultsort|ترتیب|ترتیب[‌ ]پیش[‌ ]?فرض) *[|:] *(?=.*?}})/g, '{{/ترتیب‌پیش‌فرض:')
.replace(/\{\{(?:DEFAULTSORT|[Dd]efaultsort|ترتیب|ترتیب[ ]پیش[ ]?فرض) *[|:] *(?=.*?}})/g, '{{ترتیب‌پیش‌فرض:')
.replace(/\{\{(ترتیب‌پیش‌فرض|DEFAULTSORT)\:[-\w,\s\(\)]+\}\}\n?/g, '')
.replace(/(\{\{(?:ترتیب‌پیش‌فرض|DEFAULTDEFAULTSORT)\:[-\w*SORT,\s\(\w*):[^\n{}]*+\}\})\s*(n?=\[\[رده:)/gig, '$1\n')
.replace(/(\{\{(?:ترتیب‌پیش‌فرض|DEFAULT\w*SORT\w*):[^\n{}]*\}\})\s*(?=\[\[رده:)/ggi, '$1\n')
.replace( /(==\n){\n+(?=<references[^{ترتیب‌پیش‌فرض\n<>]*:)\s/>\n\n)/gig, '$1' )
.replace( /(==\n)\n+(?=<references[^\n<>]*\/>\n\n)/gi, '$1' )
//نچسبیدن و+فاصله به براکت که محصول اشتباه در تایپ کردن است
//نچسبیدن و+فاصله به براکت که محصول اشتباه در تایپ کردن است
.replace(/\]\]و /g, ']] و ')
.replace(/\]\]و /g, ']] و ')
.replace(/(\s|^)\'\'\'(\s|)(.*?)(\s|)\'\'\'(\s)/g, "$1'''$3'''$5") // حذف فاصلهٔ اضافی درون ویکی کد
.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,}\s)\=+\s+\=+(?:\s+|)\n)/g, '"\n\n'")
.replace(/(\[{1,2})([^\[\]\n]+) +(\]{13,2})/g, "$1$2$3"'\n\n')
.replace(/(\[{1,2}) +([^\[\]\n]+) +(\]{1,2})/g, "$1$2$3")
.replace(/(\[{1,2}) +([^\[\]\n]+)(\]{1,2})/g, "$1$2$3")
.trim();
.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 ==');
}
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) { }
}
}
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(/\[\[\:fa\:/g,'[[').replace(/\%20/g,' ').replace(/٪۲۰٪20/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')
return text;
};
function wikiTextDigitsToPersian(text) {
text = replaceExcept(
text,
toEnglishDigits,
[patterns.argumentsBlacklist,patterns.fileNames,patterns.fileParameter]);
text = replaceExcept(
text,
persianTools.toPersianDigits,
[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]
);
return text
// Decimal point, and thousands' separator
.replace(/([۱۲۳۴۵۶۷۸۹۰])\.([۱۲۳۴۵۶۷۸۹۰])/g, '$1٫$2')
.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(
'(^|[^' + persianTools.persianCharacters + '])(\\s|\u200c|_|)(' + x + ')(\\s|_)(' + y + ')(\\s|\u200c|_|)(' +
extensions + ')($|[^' + persianTools.persianCharacters + '])',
'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 = persianToolsDictionary,
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(
'(^|[^' + persianTools.persianCharacters + ']|\\s|_)(' + i + ')(\\s|_)(' +
dictionary.firstNameComplex[i] + ')(\\s|_)($|[^' + persianTools.persianCharacters + ']|[^' +
persianTools.persianCharacters + '])',
'g'
),
'$1$2\u200c$4$5$6'
);
}
}
// for colors
text = dictationReplace(
dictionary.colorsNames,
'فام|گون',
'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|ی\u200cها|یها|هایم|هایت|هایش|هایمان|هایتان|هایشان|',
text
);
// for numbers
text = dictationReplace(
dictionary.persianNumbers,
'گانه|ماهه',
'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|',
text
);
// wrong dictation
for (i in dictionary.forReplace) {
if (dictionary.forReplace.hasOwnProperty(i)) {
text = text.replace(
new RegExp(
'(^|[^' + persianTools.persianCharacters + '])(\\s|\u200c|_|)(' + i + ')(\\s|\u200c|_|)($|[^' +
persianTools.persianCharacters + '])',
'g'
),
'$1$2' + dictionary.forReplace[i] + '$4$5'
);
}
}
 
// کلماتی که آ دارند
text = text.replace(
new RegExp("(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + 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("(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + 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("(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + 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(
"(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + i + ')(| )(' + dictionary.HamzehAtInside[i] + ")(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)",
'g'
), '$1$2ء$4');
}
 
// در مورد افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.
/* text = text.replace(new RegExp("(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + dictionary.HamzehAtEnd + ")(?= |«|»|\\.|،|_|\\s|\\]|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),'$1$2ء'); */
 
//الف مقصوره
text = text.replace(
new RegExp("(^|\\s|_|«|»|\\[|\\(|\\<|\\>|\\')(" + 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("(^|\\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 = persianTools.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) {
text = text.replace(new RegExp("(^|\\s|_|«|»|\\]|\\[|\\(|\\<|\\>|\\')(" + dictionary.colorsNames + ")( |_)تر(?= |«|»|\\.|\\[|\\]|،|_|\\s|\\:|\\)|\\<|\\>|؟|\\!|\\'|$)", 'g'),'$1$2\u200cتر');
return replaceExcept(
text,
dictation,
[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.insideQuote, patterns.argumentsBlacklist]
);
}
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,'')
 
text = text.replace(/به دست\u200cآورد/g, 'به دست آورد'); // Solving a bug!
//حذف برچسب‌های خالی نرم‌افزار مدیاویکی
text = persianTools.normalizeZwnj(text);
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]]
return text.replace(new RegExp("(^|[؛\\s\\n\\.,""\'\\<\\>؟])(" + dictionary.needsNasb + ')[' + NASB + ZAMM + ']?([؛؟\\s\\n\\.,""\'"\\<\\>]|$)', 'g'), function (match) {
text = replaceExcept(
return match
text,
.replace(new RegExp('ا([\\s\\n\\.،«»؟؛"\'\\>\\<' + ZAMM + '])', 'i'), 'ا' + NASB + '$1')
function (text) {
.replace(new RegExp(NASB + '["' + NASB + ZAMM + ']'), NASB);
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
text = text.replace(new RegExp('(\<' + tags[i] + '\>){2,}', 'g'), '$1')
.replace(new RegExp('(\<\\/' + tags[i] + '\>){2,}', 'g'), '$1');
}
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,
persianTools.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 + persianTools.applyOrthography(z);
});
});
}
// probably should be exactly same above but for applyZwnj
function wikiApplyZwnj(text) {
return replaceExcept(
text,
persianTools.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 + persianTools.applyZwnj(z);
});
});
}
 
function replaceEnMonthwikiDictation(text) {
return replaceExcept(
var enMonth = {
text,
'آگست':'اوت',
dictation,
'آگوست':'اوت',
[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.insideQuote, patterns.argumentsBlacklist]
'جولای':'ژوئیه',
);
'مارچ':'مارس',
}
'آپریل':'آوریل',
function wikiApplyOrthography(text) {
'فوریوری':'فوریه',
text=text //en:Wikipedia:HTML5
'january': 'ژانویه',
//big
'jan': 'ژانویه',
.replace(/((?:\<big\>){5})([^<]+)((?:\<\/big\>){5})/g,'<span style="font-size: 56px;">$2</span>')
'february': 'فوریه',
.replace(/((?:\<big\>){4})([^<]+)((?:\<\/big\>){4})/g,'<span style="font-size: 38px;">$2</span>')
'feb': 'فوریه',
.replace(/((?:\<big\>){3})([^<]+)((?:\<\/big\>){3})/g,'{{خیلی بزرگ|$2}}')
'march': 'مارس',
.replace(/((?:\<big\>){2})([^<]+)((?:\<\/big\>){2})/g,'{{بزرگ|$2}}')
'mar': 'مارس',
.replace(/((?:\<big\>){1})([^<]+|[\s\S]+)((?:\<\/big\>){1})/g,'{{درشت|$2}}')
'april': 'آوریل',
//center
'apr': 'آوریل',
.replace(/{{وسط‌چین}}<gallery>([\S\s]+?)\<\/gallery><\/center>/g,'<gallery class="center">$1</gallery>')
'may': 'مه',
//.replace(/{{وسط‌چین}}([\S\s]+?)<\/center>/g,'{{وسط|$1}}')
'june': 'ژوئن',
//empty tag
'jun': 'ژوئن',
.replace(/<span style="font-size: [^>]+"><\/span>/g,'')
'july': 'ژوئیه',
.replace(/{{(?:درشت|خیلی بزرگ|بزرگ|وسط)\|}}/g,'')
'august': 'اوت',
 
'aug': 'اوت',
//حذف برچسب‌های خالی نرم‌افزار مدیاویکی
'september': 'سپتامبر',
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]]
'sept': 'سپتامبر',
text = replaceExcept(
'sep': 'سپتامبر',
text,
'october': 'اکتبر',
function (text) {
'oct': 'اکتبر',
for (var i = 0; i < tags.length; ++i) {
'november': 'نوامبر',
for (var b = 0; b < 5; ++b) {//خیلی از برچسب‌های خالی تو در تو هستند مانند [[Special:PermaLink/19223877]]
'nov': 'نوامبر',
text = text.replace(new RegExp('\<' + tags[i] + '[^\>]*\>(\\n|\\s|\u200c)*?\<\\/' + tags[i] + '\>', 'g'), '');
'december': 'دسامبر',
}
'dec': 'دسامبر'
// remove the tags if they occurred multiple times consequently
};
text = text.replace(new RegExp('(\<' + tags[i] + '\>){2,}', 'g'), '$1')
for (var i in enMonth) {
var text_new = text.replace(new RegExp('(\<\\/' + tags[i] + '\>){2,}', 'igg'), enMonth[i]'$1');
}
if (text_new != text) {
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_new
return text
}
},
[patterns.insideHtmlComment]
return text
});
return replaceExcept(
function autoFormatCleanDatesException (text) {
text,
return replaceExcept(
persianTools.applyOrthography,
text,
[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag, patterns.wikilinkTargets]
autoFormatCleanDates,
).replace(patterns.galleryTag, function (gallery) {
[patterns.globalExceptionTag, patterns.fileNames, patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist]
// apply `applyOrthography` on gallery descriptions separately
)
return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {
}
return y + persianTools.applyOrthography(z);
function wikitranslateEnMonth(text) {
});
text=autoFormatCleanDatesException(text)
});
return replaceExcept(
}
text,
 
function translateEnMonth(text) {
// probably should be exactly same above but for applyZwnj
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)';
function wikiApplyZwnj(text) {
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'),
return replaceExcept(
function (x) {
text,
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'),
persianTools.applyZwnj,
'$1$2$4 $3 $5$6$7')
[patterns.globalExceptionTag, patterns.fileNames, patterns.signatures, patterns.url, patterns.galleryTag]
x = persianTools.toPersianDigits(x);
).replace(patterns.galleryTag, function (gallery) {
x = replaceEnMonth(x);
// apply `applyOrthography` on gallery descriptions separatly
return x;
return gallery.replace(/^([^\|]*?\|)(.*)$/mg, function (x, y, z) {
})
return y + persianTools.applyZwnj(z);
.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 = persianTools.toPersianDigits(x);
}
x = replaceEnMonth(x);
 
return x;
function replaceEnMonth(text) {
}
var enMonth = {
);
'آگست':'اوت',
}, [patterns.globalExceptionTag, patterns.fileNames, patterns.ref, patterns.fileParameter, patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist]
'آگوست':'اوت',
)
'جولای':'ژوئیه',
}
'مارچ':'مارس',
'آپریل':'آوریل',
var arabicDigits = '0123456789', persianDigits = '۰۱۲۳۴۵۶۷۸۹';
'فوریوری':'فوریه',
function robustToEnglishDigits(text) {
'january': 'ژانویه',
var i = 0;
'jan': 'ژانویه',
for (i = 0; i <= 9; i = i + 1) {
'february': 'فوریه',
text = text.replace(new RegExp('[' + persianDigits[i] + ']', 'g'), arabicDigits[i]);
'feb': 'فوریه',
}
'march': 'مارس',
return text;
'mar': 'مارس',
}
'april': 'آوریل',
'apr': 'آوریل',
function toEnglishDigits(text) {
'may': 'مه',
text = text.replace(/[a-zA-Z]([\_\s\:\.\,\;\]\[\"\'\)\(\}\{\/\\ ]+|)([۱۲۳۴۵۶۷۸۹۰٪\.٫\-\—\–°÷×\+\,\s\_\:،»«؛]+)([\_\s\:\.\,\;\]\[\"\'\)\(\}\{\/\\\<\> ]+|)([a-zA-Z\>]|$)/g, function (x) {
'june': 'ژوئن',
var i = 0;
'jun': 'ژوئن',
for (i = 0; i <= 9; i = i + 1) {
'july': 'ژوئیه',
x = x.replace(new RegExp('[' + persianDigits[i] + ']', 'g'), arabicDigits[i]);
'august': 'اوت',
}
'aug': 'اوت',
return x.replace(/،/g,',').replace(/»/g,'"').replace(/«/g,'"').replace(/؛/g,';');
'september': 'سپتامبر',
});
'sept': 'سپتامبر',
// bug [[Special:Diff/17760890/17760898]]
'sep': 'سپتامبر',
text = text.replace(/([a-zA-Z][۱۲۳۴۵۶۷۸۹۰]+) *\=/g, function (x) {
'october': 'اکتبر',
var i = 0;
'oct': 'اکتبر',
for (i = 0; i <= 9; i = i + 1) {
'november': 'نوامبر',
x = x.replace(new RegExp('[' + persianDigits[i] + ']', 'g'), arabicDigits[i]);
'nov': 'نوامبر',
}
'december': 'دسامبر',
return x;
'dec': 'دسامبر'
});
};
// ISBN, ISSN and PMID's numbers should in english
for (var i in enMonth) {
text = text.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([۱۲۳۴۵۶۷۸۹۰0-9–—−ـ_\-]+)([^۱۲۳۴۵۶۷۸۹۰0-9–—−ـ_\-]|$)/gi, function (x) {
xvar text_new =x text.replace(/[–—−ـ_\-]+/gnew RegExp(i, '-ig'), enMonth[i])
if (text_new != text) {
var i = 0;
return text_new
for (i = 0; i <= 9; i = i + 1) {
}
x = x.replace(new RegExp('[' + persianDigits[i] + ']', 'g'), arabicDigits[i]);
}
return text
x = x.replace(/\b(ISBN|ISSN|PMID|PubMed) *:? *([۱۲۳۴۵۶۷۸۹۰\-0-9]+)([^۱۲۳۴۵۶۷۸۹۰\-0-9]|$)/gi,'$1 $2$3')
};
x = x.replace('PubMed','PMID')
function autoFormatCleanDatesException (text) {
return x;
return replaceExcept(
});
text,
text = text.replace(/ISBN \-note/g,'ISBN-note');
autoFormatCleanDates,
// تبدیل عددهای فارسی در عدد ترتیبی انگلیسی
[patterns.globalExceptionTag, patterns.fileNames, patterns.galleryTag, patterns.mathTag, patterns.sourceTag, patterns.templateWithEnglishName, patterns.citation, patterns.argumentsBlacklist]
text = text.replace(/(?:^|["\'\s_«\(\[\{])([۱۲۳۴۵۶۷۸۹۰]+)(st|nd|rd|th)[\s_\.,»"\'\)\]\}]/g, function (x) {
)
var i = 0;
}
for (i = 0; i <= 9; i = i + 1) {
function wikitranslateEnMonth(text) {
x = x.replace(new RegExp('[' + persianDigits[i] + ']', 'g'), arabicDigits[i]);
text=autoFormatCleanDatesException(text)
}
return x;replaceExcept(
text,
});
function translateEnMonth(text) {
return 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)';
.replace(new RegExp('([' + arabicDigits + ']) ?٪', 'g'), '$1%')
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'),
.replace(new RegExp('([' + arabicDigits + '])٫(?=[' + arabicDigits + '])', 'g'), '$1.') // English decimal separator
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'),
function cleanTemplateBracesFromArticle (text) {// like [[Special:Diff/18828723]]
'$1$2$4 $3 $5$6$7')
x = persianTools.toPersianDigits(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 = persianTools.toPersianDigits(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', persianDigits = '۰۱۲۳۴۵۶۷۸۹';
function robustToEnglishDigits(text) {
var i = 0;
for (i = 0; i <= 9; i = i + 1) {
text = text.replace(new RegExp('[' + persianDigits[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('[' + persianDigits[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('[' + persianDigits[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('[' + persianDigits[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('[' + persianDigits[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) {// like [[Special:Diff/18828723]]
var i =0
for (i = 0; i <= 5; i = i + 1) {
text = text.replace(/\{\{\{[^\|\}]+\|([^\}]+)\}\}\}/g, '$1')
.replace(/\{\{\{[^\|\}]+\| *\}\}\}/g, '')
}
 
return text.replace(/\{\{\#/g, '{{جا:#')
.replace(/\{\{ *(PAGENAME|FULLPAGENAMEE|SITENAME|NAMESPACE) *\}\}/g, '{{جا:$1}}')
.replace('{{ترتیب‌پیش‌فرض:}}', '');
}
function decodeHTMLSymbolEntitiesCodes (text) {
//&copy; > ©
return replaceExcept(
text,
function decodeEntitiesCodes (text) {
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 = persianWikiTools.wikiConvertToPersianCharacters(text);
text = persianWikiTools.wikiApplyZwnj(text);
text = persianWikiTools.wikiApplyOrthography(text);
text = persianWikiTools.wikitranslateEnMonth(text);
text = persianWikiTools.wikiTextDigitsToPersian(text);
text = persianWikiTools.wikiUrlMinifier(text);
text = persianWikiTools.wikiDictation(text);
text = persianWikiTools.wikiPunctuation(text);
text = persianWikiTools.wikiSubsection(text);
text = persianWikiTools.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 = persianWikiTools.addColumnToRefTemplate(text);
return text;
}
 
function superToolMove(text) {
text = ' ' + text + ' '; // بعضی از کدها اگر فاصله در انتها یا اول نباشد عمل نمی‌کنند مانند افزودن تنوین به کلمه بعدابعداً
text = persianWikiTools.wikiConvertToPersianCharacters(text);
text = persianTools.applyZwnj(text);
text = persianWikiTools.wikiApplyOrthography(text);
text = persianWikiTools.wikiTextDigitsToPersian(text);
text = persianWikiTools.wikiUrlMinifier(text);
text = persianWikiTools.wikiDictation(text);
text = persianWikiTools.wikiPunctuation(text);
return text.trim();
}
 
return {
removeWikiSigne: removeWikiSigne,
superTool: superTool,
superToolMove: superToolMove,
dictation: dictation,
wikiApplyOrthography: wikiApplyOrthography,
wikiApplyZwnj: wikiApplyZwnj,
wikiConvertToPersianCharacters: wikiConvertToPersianCharacters,
wikiDictation: wikiDictation,
wikiPunctuation: wikiPunctuation,
wikiSubsection:wikiSubsection,
SubSectionLeveling:SubSectionLeveling,
wikiUrlMinifier: wikiUrlMinifier,
wikiTextDigitsToPersian: wikiTextDigitsToPersian,
wikitranslateEnMonth: wikitranslateEnMonth,
addColumnToRefTemplate: addColumnToRefTemplate,
fixBadLinks: fixBadLinks,
robustToEnglishDigits: robustToEnglishDigits,
toEnglishDigits: toEnglishDigits
};
}());
if (typeof window !== "undefined") {
window.persianWikiTools = persianWikiTools;
}
// </nowiki>
//To find repeated regex run [[مدیاویکی:Gadget-Extra-Editbuttons-RegexTest.js]] at console
//Check regex parameters at excel
var persianToolsDictionary = (function () {
 
dictionary.adjective = 'اخمو|ارزان|ارغه|الکن|الکی|انبوه|آبدار|(نا)?آرام|آرغنده|(نا)?آشکار|(نا)?آماده|آهسته|(بی\u200c|با)انضباط|باریک|بد|بدحساب|بددل|بدریخت' +
'|بر|براق|برخوردار|برومند|بزدل|بلند|بی‌آلایش|بی دستبی‌دست و پا|بیچاره|بیدار|بیمار|پخ|پخش|پخمه|پرت|پرنور|پست|پشمالو|پلید|پوچ|(سر|نا)?پوشیده|پوک' +
'|پیر|پیروز|تار|تپل|ترد|ترسو|تفت|تلخ|تنبل|تندرو|تنک|تنگ|تنها|تهی|تیره|جلو|چابک|چاپلوس|چالاک|چپ|چرند|چسبان|چفته|چیره|خام|خانم|خراب' +
'|خرم|خسته|خشک|(نا)?خفته|خفن|خل|خنگ|(نا)?خوانا|خوب|خوشکل|خوش‌گوار|خیراندیش|دراز|درخور|درستکار|دلباخته|دلیر|دوست|دون|رحیم|رسمی|روانی|روشن' +
'|ماخذ|مابی|لس‌انجلس|گل‌اذین|گزنداور|گرداوری|گرداوردن|گرداورد|گردامدن|کنداور|کفرامیز|فرودامدن|عطراگین|طنزامیز' +
'|شیرابه|شهرا[یئ]ین|شهراشوب|سوداور|سراوردن|سرامدن|سرامد|سراشپز|سحرامیز|زیرابی|زوراور|زهرالود|زهراگین|زردالو|دوداهنگ|دواتشه' +
'|دژاهنگ|دژالود|درداور|دردالود|درایند|دراید|دراویختن|دراوری|دراورنده|دراورند|دراوردن|درامده|درامدن|درامد|خیزاب|خشم‌الودخشم‌آلود' +
'|چندش‌اور|جگراور|تیراهن|تهورامیز|تنفراور|تنداب|پسندامدن|پرنداور|پردرامد|پراشوب|پراب|بی‌اب|بوا|بنداوردن' +
'|بنداور|سرامدن|برایند|براورده|براوردن|براورد|برامده|برامدن|برامدگی|برامد|براشفته|براشفتن|براشفتگی|براسودن|بداهنگ' +
'|اتش‌گون|اتش‌گرفتن|اتش‌گاه|اتشکده|اتش‌کار|اتش‌فشان|اتش‌زنه|اتش‌زدن|اتش‌زا|اتش‌دان|اتش‌خوار|اتش‌خانه|اتش‌پاره|اتش‌بان|اتش‌بازی|اتش‌بار' +
'|اتش|اتریوم|اتروپین|اتابای|اپولو|اپوستروف|اپاندیسیت|اپاندیس|اپارتمان|اپارتاید|اپارات|ابیار|ابونه|ابونمان' +
'|ابها|ابنوس|اب‌نمک|اب‌نما|اب‌اب[ن]شدنی|ابنبات|ابمیوه‌گیر|اب‌میوه|اب‌لیمو|ابله‌کوب|ابله‌رو|ابگینه|ابگیر|ابگونه|ابگون‌ساز' +
'|اب‌گوشت|اب‌گرمکن|اب‌گردان|اب‌گذر|اب‌گاه|اب‌کش|اب‌کانه|اب‌کامه|اب‌کار|اب‌فشان|ابغوره|ابشی|ابشور|اب‌شنگولی|ابشش|اب‌شدنی' +
'|ابش‌خور|ابشتگاه|ابشار|ابسوار|ابسه|ابسکون|ابستن|ابسالان|اب‌سال|ابزی‌گاه|ابزی‌دان|ابزی|ابریزگاه|ابریزگان|ابریزش' +
//removed ان for [[ان بی سی]]
// match ZWNJ also as a space or optional
dictionary.wordsWithA = dictionary.wordsWithA.replace(/\u200c/g, '[\u200c ]?');
 
dictionary.PresentVerbsWithA = 'ارا|ارام|ارامان|ارای|ازار|ازما|ازمای|اسا|اسای|اشام|اشوب|اغار|اغاز|افرین|اکن|اگن|الای' +
dictionary.needsNasb = 'اتفاقا|الزاما|لزوما|یقینا|قطعا|حتما|قاعدتا|طبیعتا|طبعا|قهرا|جدّا|حقیقتا|واقعا|مطمئنا|واضحا|مسلما|تماما|کاملا' +
'|عینا|اکیدا|مطلقا|دقیقا|مستقیما|اصولا|اصلا|اصالتا|نسبا|نسبتا|تقریبا|حدودا|معمولا|قانونا|شرعا|اخلاقا|خلقا|احتمالا' +
'|استثنائا|اساسا|کلّا|جزئا|مجموعا|جمعا|اجماعا|شدیدا|نهایتا|اقلا|اکثرا|غالبا|عمدتا|ندرتا|بعضا|گاهاگاهی|صریحا|صراحتا|عموما' +
'|اختصاصا|خصوصا|مجملا|اجمالا|اختصارا|مختصرا|مشروحا|ظاهرا|باطنا|عمیقا|ذاتا|فطرتا|جسما|ابتدائا|مقدمتا|بدوا|بعدا|قبلا' +
'|جدیدا|سابقا|اخیرا|ابدا|عمرا|تلویحا|علنا|حضورا|غیابا|نیابتا|لطفا|اجبارا|اختیارا|عالما|عمدا|عامدا|تعمدا|متعمدا|عادتا' +
'|کرارا|مکررا|مجددا|مرتبا|مستمرا|متواترا|تدریجا|تصادفا|عملا|فعلا|موقتا|ضمنا|نتیجتا|نوعا|اصطلاحا|جسارتا|بالا ?غیرتا|م[وؤ]کدا' +
'|ذیلا|شخصا|مشترکا|مفصلا|رسما|ترجیحا|قلبا|ر[اأ]سا|تو[اأ]ما|متناوبا|متوالیا|متقابلا|متعاقبا|متّ?فقا|مثلا|فرضا|ایضا|مضافا' +
'|مصرّ?ا|ارفاقا|انصافا|جهارا|متدرجا|غانما|احتراما|ناچارابه‌ناچار|سفارشاسفارشی|تلفنا|زبانازبانی|کتبا|شفاها|چهارماچهارم|ثانیا|ثالثا' +
'|رابعا|خامسا|سادسا|سابعا|ثامنا|تاسعا|عاشرا|مخصوصا';//اولا و سوما می‌تواند یک نام خاص باشد.
 
dictionary.HamzehZam ='امیرالمومنین|مومن|رویا|فواد|موذن|مودب|موخر|موتمن|مواخذه|مولف|موثر|مونث|موکد|موسس(?! خورناتسی)|سوال|موسسه';//for[[ران مودی]]removedمودی
dictionary.HamzehZam = dictionary.HamzehZam.replace(/و/g, 'وء?');
 
dictionary.HamzehNasb ='تاکید|تالیف|تاسیس|تاسیسات|تامل|تفال|تاهل|تامین|تا[یئ]ید|تادیب|تاثیر|تاثر|تاثیرات|تاثیرگذار|تاجیل'+
'|تاخر|تاخیر|توام|ماوا|مستاجر|مبدا|منشا|متاسفانه|متاسف|متاثر|مسالهمسئله|متاهل|خلا|ملا عام|رافت|ماخذ|مایوس|ماخوذ'+
'|مامور|مامورین|ماموران|ماموریت|مامون|مانوس';//removed راس، تالم
 
dictionary.HamzehAtEnd ='اجزا|احشا|ارتجا|ارتقا|ازا|استثنا|استغنا|استقرا|استمنا|استهزا|اشبا|اشقیا|اشیا|اطبا|اطفا|اعتلا'+
'|اغوا|افترا|اقتضا|امنا|انبیا|انقضا|اولیا|ماورا';//re املا-انشا-اعضا-امضا-انزوا-ابتلا-استعفا-اعلا-اعتنا بدون همزه متداولترند، ابداابداً می‌تواند با همزه یا نتوین باشد در نتیجه برداشته شد
 
dictionary.HamzehAtInside ={'سو':'استفاده|تعبیر|تفاهم|برداشت','ما':'الشعیر','ماورا':'الطبیعه|النهر'};
//'با': 'پرستیژ|ابهت|احساس|اخلاق|ادب|ارزش|استعداد|استقامت|اصالت|اقتدار|اهمیت|تدبیر|تربیت|تسلط|تعصب|تقوی',
'باب': 'الحوائج',
//'باقی|ته': 'مانده', bug > باقی مانده بود- ته ماندهته‌مانده بود.
'باد': 'نشسته|گرفته',
'بار': 'خاطر',
'ضد': 'اسلام|یهودی|انقلاب|حال|هوایی|زنگ|آفتاب|بارداری|سرمایه‌داری|آب|یخ|اطلاعات|شوره',
//طبق بندهای شماره ..
//'طبق|زمان': 'بند',
'طبقه|زمان|درجه|رده|گروه|رتبه|دسته|جمله|تقسیم|بسته|آرماتور|اسکلت|امتیاز|بخش|جدول|جمع|جناح|رنگ|ساز|سایز|سرهم|سطح|شرط|شکم|فاز|فصل|قاب|پارتیشن|چشم|کادر|کمر|گاو|نیم|آب|جیره|خالی|ماست|سیل': 'بند',
'طوطی|عیال': 'وار',
//----------------------------------------Wrong dictations-----------------------
dictionary.forReplace = {
'آندرویداندروید': 'اندروید',
'ایده‌آل': 'ایدئال',
'واشنگتنواشینگتن': 'واشینگتن',
'واشنگتونواشینگتن': 'واشینگتن',
'واشینگتونواشینگتن': 'واشینگتن',
'زیمباوهزیمبابوه': 'زیمبابوه',
'به شخصهبشخصه': 'بشخصه',
'به‌شخصهبشخصه': 'بشخصه',
'به عینهبعینه': 'بعینه',
'به‌عینهبعینه': 'بعینه',
'احمدی نژاداحمدی‌نژاد': 'احمدی‌نژاد',
'جابه جاجابه‌جا': 'جابه‌جا',
'جا به جاجابه‌جا': 'جابه‌جا',
'جا به‌جاجابه‌جا': 'جابه‌جا',
'بیت المقدسبیت‌المقدس': 'بیت‌المقدس',
'بی بی سیبی‌بی‌سی': 'بی‌بی‌سی',
'پی دی افپی‌دی‌اف': 'پی‌دی‌اف',
'اس ام اساس‌ام‌اس': 'اس‌ام‌اس',
'اف بی آیاف‌بی‌آی': 'اف‌بی‌آی',
'می سی سی پیمی‌سی‌سی‌پی': 'می‌سی‌سی‌پی',
//'میسیسیپی': 'می‌سی‌سی‌پی',
'ویژه‌گیویژگی': 'ویژگی',
'دبیر کلدبیرکل': 'دبیرکل',
'دایره‌المعارفدایرةالمعارف': 'دایرةالمعارف',
'دایره المعارفدایرةالمعارف': 'دایرةالمعارف',
'تأئیدتأیید': 'تأیید',
'تائیدتأیید': 'تأیید',
'بقیه‌اللهبقیةالله': 'بقیةالله',
'بقیه اللهبقیةالله': 'بقیةالله',
'بقیة اللهبقیةالله': 'بقیةالله',
'دگمهدکمه': 'دکمه',
'وحلهوهله': 'وهله',
//'هاوی': 'حاوی', ممکن است اسم خاص باشد
'نقطه‌نظردیدگاه': 'دیدگاه',
'ناچاراًبه‌ناچار': 'به‌ناچار',
'ناچارابه‌ناچار': 'به‌ناچار',
'منیتمنی': 'منی',
'منیٔتمنی': 'منی',
'فرآیندفرایند': 'فرایند',
'فرآیندهافرایندها': 'فرایندها',
'کارآییکارایی': 'کارایی',
'ملاحضهملاحظه': 'ملاحظه',
'ملیونمیلیون': 'میلیون',
'ملیاردمیلیارد': 'میلیارد',
'مطمعنمطمئن': 'مطمئن',
'مرهمتمرحمت': 'مرحمت',
'مرحممرهم': 'مرهم',
'مونته نگرومونته‌نگرو': 'مونته‌نگرو',
'محصوبمحسوب': 'محسوب',
'مذبورمزبور': 'مزبور',
'متعصفانهمتأسفانه|متاصفانه': 'متأسفانه',
'متغییرمتغیر': 'متغیر',
'لشگرلشکر': 'لشکر',
'لحجهلهجه': 'لهجه',
'گاهاًگاهی': 'گاهی',
'گاهاگاهی': 'گاهی',
'کهکیلویهکهگیلویه': 'کهگیلویه',
'قائلهغائله': 'غائله',
'فارق‌التحصیلفارغ‌التحصیل': 'فارغ‌التحصیل',
'علاالدینعلاءالدین': 'علاءالدین',
'علم‌شنگهالم‌شنگه': 'الم‌شنگه',
'غلطاندنغلتاندن': 'غلتاندن',
'ظبطضبط': 'ضبط',
'طنبورتنبور': 'تنبور',
'طپشتپش': 'تپش',
'ضمینهزمینه': 'زمینه',
'زخامتضخامت|ذخامت': 'ضخامت',
'زخیمضخیم|ذخیم': 'ضخیم',
'صحفهصفحه': 'صفحه',
//'سوماً': 'سوم',
//'سوما': 'سوم',
'سفارشاًسفارشی': 'سفارشی',
'سفارشاسفارشی': 'سفارشی',
'سرلشگرسرلشکر': 'سرلشکر',
'سپاسگذارسپاسگزار': 'سپاسگزار',
'خبرگذارخبرگزار': 'خبرگزار',
'ساتعساطع': 'ساطع',
'زنده‌گیزندگی': 'زندگی',
'زباناًزبانی': 'زبانی',
'زبانازبانی': 'زبانی',
'رهبریترهبری': 'رهبری',
'در بارهدرباره': 'درباره',
'دوئیتدوگانگی': 'دوگانگی',
//'دوماً': 'دوم',
//'دوما': 'دوم',
'داوطلبینداوطلبان': 'داوطلبان',
'خوشنودخشنود': 'خشنود',
'خوبیتخوبی': 'خوبی',
'خوانوادهخانواده': 'خانواده',
'خواستگاهخاستگاه': 'خاستگاه',
'خرشیدخورشید': 'خورشید',
'خردنخوردن': 'خوردن',
'خانندخوانند': 'خوانند',
'خابیدنخوابیدن': 'خوابیدن',
'حظورحضور': 'حضور',
'حظرتحضرت': 'حضرت',
'حدلامکانحتی‌الامکان': 'حتی‌الامکان',
'حاظرحاضر': 'حاضر',
'چهارماًچهارم': 'چهارم',
'چهارماچهارم': 'چهارم',
'چارشنبهچهارشنبه': 'چهارشنبه',
'جاناًجانی': 'جانی',
//'جانا': 'جانی', باگ در [[جانا رودین]]
'توجیحتوجیه': 'توجیه',
'توضیعتوزیع': 'توزیع',
'تلوزیونتلویزیون': 'تلویزیون',
'تضاهرتظاهر': 'تظاهر',
'ترجیهترجیح': 'ترجیح',
'پنچپنج': 'پنج',
'پزشگیپزشکی': 'پزشکی',
//'پرفسور': 'پروفسور', //[[Special:Permalink/20573389#professeur]]
'پاتوغپاتوق': 'پاتوق',
'بی‌مهابابی‌محابا': 'بی‌محابا',
'بنیانگزاربنیانگذار': 'بنیانگذار',
'بلقوربلغور': 'بلغور',
'بلاخرهبالاخره': 'بالاخره',
'برخواستنبرخاستن': 'برخاستن',
'برعلیهعلیه': 'علیه',
'برخواستبرخاست': 'برخاست',
'بدیتبدی': 'بدی',
'باطلاقباتلاق': 'باتلاق',
'بازرسینبازرسان': 'بازرسان',
'بارگزاربارگذار': 'بارگذار',
'باجناقباجناغ': 'باجناغ',
'باباقوریباباغوری': 'باباغوری',
'آروقآروغ': 'آروغ',
'انظباطانضباط': 'انضباط',
'التفاطالتفات': 'التفات',
'افضل‌تربهتر': 'بهتر',
'افسنطینافسنتین': 'افسنتین',
'اعلم‌ترداناتر': 'داناتر',
'اطواتو': 'اتو',
'اطراقاتراق': 'اتراق',
'اطاقاتاق': 'اتاق',
'اصطرلاباسطرلاب': 'اسطرلاب',
'ارتقاعارتقا': 'ارتقا',
'اختاپوثاختاپوس': 'اختاپوس',
'ابولفضلابوالفضل': 'ابوالفضل',
'امپراطورامپراتور': 'امپراتور',
//'طوسی': 'توسی', خواجه نصیرالدین طوسی را به تبدیل می کردمی‌کرد
'آزوقهآذوقه': 'آذوقه',
'ذکامزکام': 'زکام',
'بگیر و ببند': 'بگیر ببند',
'ساز و کارسازوکار': 'سازوکار',
'جر و بحثجربحث': 'جربحث',
'خوار و بارخواربار': 'خواربار',
'احجامحجم‌ها': 'حجم‌ها',
'اقشارقشرها': 'قشرها',
'لازم بهاست ذکر استشود': 'لازم است ذکر شود',
'بدلیلبه دلیل':'به دلیل',
//برپایه http://www.persianacademy.ir/fa/pishvand.aspx
'آن‌راآن را': 'آن را',
'این‌رااین را': 'این را',
'هیاتهیئت': 'هیئت',
'هیأتهیئت': 'هیئت',
'رییسهرئیسه': 'رئیسه',
'رییسرئیس': 'رئیس',
'مسالهمسئله': 'مسئله',
'مسألهمسئله': 'مسئله',
'همین جاهمین‌جا': 'همین‌جا',
'همینجاهمین‌جا': 'همین‌جا',
'همینطورهمین‌طور': 'همین‌طور',
'همین طورهمین‌طور': 'همین‌طور',
'همان جاهمان‌جا': 'همان‌جا',
'همانجاهمان‌جا': 'همان‌جا',
'همان طورهمان‌طور': 'همان‌طور',
'همانطورهمان‌طور': 'همان‌طور',
'هیچکدامهیچ‌کدام': 'هیچ‌کدام',
'هیچ کدامهیچ‌کدام': 'هیچ‌کدام',
'هیچکسهیچ‌کس': 'هیچ‌کس',
'هیچ کسهیچ‌کس': 'هیچ‌کس',
'هیچیکهیچ‌یک': 'هیچ‌یک',
'هیچ یکهیچ‌یک': 'هیچ‌یک',
'هم‌دیگرهمدیگر': 'همدیگر',
'عبدالهیعبداللهی': 'عبداللهی',
'آن چهآنچه': 'آنچه',
'آن‌چهآنچه': 'آنچه',
'چنان چه': 'چنانچه',
'چنانچه': 'چنانچه',
'چنان کهچنانچه': 'چنان‌کهچنانچه',
'چنانکهچنان‌که': 'چنان‌که',
'ئیدروژنچنان‌که': 'هیدروژنچنان‌که',
'هیدروژن': 'هیدروژن',
//بدل از تنوین
'بعضنبعضاً': 'بعضاً',
'غالبنغالباً': 'غالباً',
'کاملنکاملاً': 'کاملاً',
'احتمالناحتمالاً': 'احتمالاً',
'اصلناصلاً': 'اصلاً',
'اشتباهناشتباهاً': 'اشتباهاً',
'منشاءمنشأ': 'منشأ',
'مبداءمبدأ': 'مبدأ',
//وپ:کوته‌نوشت
//رجوع کنید
'ر\\. ?ک\\.?': 'ر.ک.',
//هجری خورشیدی
'[هﻫﻩه‌هه]\\u200D?\\. ?خ\\.?': 'ه‍.خ',
'[هﻫﻩه‌هه]\\u200D?[\\u200C ]خ': 'ه‍.خ',
//هجری قمری
'[هﻫﻩه‌هه]\\u200D?\\. ?ق\\.?': 'ه‍.ق',
'[هﻫﻩه‌هه]\\u200D?[\\u200C ]ق': 'ه‍.ق',
//هجری شمسی
'[هﻫﻩه‌هه]\\u200D?\\. ?ش\\.?': 'ه‍.ش',
'[هﻫﻩه‌هه]\\u200D?[\u200C ]ش': 'ه‍.ش',
//الی آخر
'الخ\\.': 'الخ'
 
//Allows WikiMagic to work with ISBNs
str = str.replace(/ISBN *\-10:|ISBN *\-13:|ISBN *\-10|ISBN *\-13|ISBN:/gi, "ISBN");
//ISSN regexs from [[:en:Wikipedia:AutoWikiBrowser/Settings/ISSN]]
str = str.replace(/ISSN\s*(\d)/gi,"ISSN $1");
str = str.replace(/ISSN (\d)(\d)(\d)(\d)\-(\d)(\d)(\d)x/gi,"ISSN $1$2$3$4-$5$6$7X");
 
//ISBN regexs from [[:Wikipedia:AutoWikiBrowser/Settings/ISBN -hyph]]
str = str.replace(/ISBN(\d)/gi,"ISBN $1");
str = str.replace(/\[\[ *(ISBN [\d\-x]{10,13}) *\]\]/gi,"$1");
str = str.replace(/\[\[ISBN\|(ISBN\s*[^\]]*)\]\]/gi,"$1");
str = str.replace(/\[*ISBN\]*\:*[ \t]+([0-9X\-]+)/gi,"ISBN $1");
str = str.replace(/ISBN +([\d-]{1,9}) (\d+|X\W)/gi,"ISBN $1$2");
str = str.replace(/\[*ISBN\]*\:* *\[\[Special\:Booksources\/\d*\|([\dxX\- ]+)\]\]/gi,"ISBN $1");
str = str.replace(/\[isbn\]\:* *(\d)/gi,"ISBN $1");
str = str.replace(/ISBN (\d{10,10}) - *(\d)/gi,"ISBN $1 ,$2");
str = str.replace(/ISBN ([\d-]{12,12}) (\d|x)/gi,"ISBN $1-$2");
/* broken ISBNs with hyphens */
// autoFormatter.js > cleanISBNs
str = str.replace(
/(^|[\s#'(*>|])(?:(ISBN\d?\s*=\s*)|ISBN(?:-?1[03]\b| *1[03]:)?:?\s*)(9-?7-?[89]-?)?([013][\d\u2010-\u2012\u2212-]{8,}[\dX]\b)/gim,
str = str.replace(/^ ? ? \n/gm, "\n");
str = str.replace(/(\n\n)\n+/g, "$1");
str = str.replace(/== ? ?\n\n ==/g, "== \n ==");
str = str.replace(/\n\n(\* ?\[?http)/g, "\n$1");
 
str = str.replace(/^ ? ? \n/gm, "\n");
str = str.replace(/\n\n\*/g, "\n*");
// str = str.replace(/[ \t][ \t]+/g, " ");
str = str.replace(/([=\n]\n)\n+/g, "$1");
str = str.replace(/ \n/g, "\n");
 
//== Headings ==
str = str.replace(/^(={1,4} )[ ]*([^= ][^=]*[^= ])[ ]*( ={1,4})$/gm, "$1$2$3");
str = str.replace(/^(={1,4})([^= ][^=]*[^= ])[ ]+(={1,4})$/gm, "$1$2$3");
str = str.replace(/^(={1,4})[ ]+([^= ][^=]*[^= ])(={1,4})$/gm, "$1$2$3");
 
return str;
str = str.replace(/<(B|STRONG)[ ]*>((?:[^<>]|<[a-z][^<>]*\/>|<([a-z]+)(?:| [^<>]*)>[^<>]*<\/\3>)*?)<\/\1[ ]*>/gi, "'''$2'''");
str = str.replace(/<(I|EM)[ ]*>((?:[^<>]|<[a-z][^<>]*\/>|<([a-z]+)(?:| [^<>]*)>[^<>]*<\/\3>)*?)<\/\1[ ]*>/gi, "''$2''");
// </br>{{سخ}}, <\br>{{سخ}}, <br\>{{سخ}}, <BR />{{سخ}}, ...
str = str.replace(/<[\\\/]+BR[\\\/\s]*>/gim, "<br />{{سخ}}");
str = str.replace(/<[\\\/\s]*BR[\s]*[\\\/]+[\s]*>/gim, "<br />{{سخ}}");
// <.br>, <br.>{{سخ}}, <Br>{{سخ}}, ...
str = str.replace(/<[\s\.]*BR[\s\.]*>/gim, "<br>{{سخ}}");
// <br>{{سخ}}>, <<br />{{سخ}}, <<br >{{سخ}}> ...
str = str.replace(/<[\s]*(<br[\s\/]*>)/gim, "$1");
str = str.replace(/(<br[\s\/]*>)[\s]*>/gim, "$1");
 
str = str.replace(/<[\\\/\s]*REFERENCES[\\\/\s]*>/gim, "<references />{{پانویس}}");
// Repeated references tag
str = str.replace(/(<references \/>)[\s]*\1/gim, "$1");
// Make sure <H1>, ..., <H6> is after a newline
str = str.replace(/([^\r\n ])[\t ]*(<H[1-6][^<>]*>)/gim, "$1\n$2");
// Make sure </H1>, ..., </H6> is before a newline
str = str.replace(/(<\/H[1-6][^<>]*>)[\t ]*([^\r\n ])/gim, "$1\n$2");
// Remove newlines from inside <H1>, ..., <H6>
var loopcount = 0;
}
// Replace <H1>, ..., <H6> with wikified section headings
str = str.replace(/(^|[\r\n])[\t ]*<H1[^<>]*>([^\r\n]*?)<\/H1[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1=$2=$3');
str = str.replace(/(^|[\r\n])[\t ]*<H2[^<>]*>([^\r\n]*?)<\/H2[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1== $2 ==$3');
str = str.replace(/(^|[\r\n])[\t ]*<H3[^<>]*>([^\r\n]*?)<\/H3[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1=== $2 ===$3');
str = str.replace(/(^|[\r\n])[\t ]*<H4[^<>]*>([^\r\n]*?)<\/H4[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1==== $2 ====$3');
str = str.replace(/(^|[\r\n])[\t ]*<H5[^<>]*>([^\r\n]*?)<\/H5[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1===== $2 =====$3');
str = str.replace(/(^|[\r\n])[\t ]*<H6[^<>]*>([^\r\n]*?)<\/H6[\r\n\t ]*>[\t ]*([\r\n]|$)/gim, '$1====== $2 ======$3');
//Replace <ol><li> with #
str = str.replace(
var loopcount = 0;
while (str.search(/^[=]{1,5}[^=\r\n]*'''[^=\r\n]*[=]{1,5}/gim) >= 0 && loopcount <= 10) { //'
str = str.replace(/(^[=]{1,5}[^=\r\n]*)'''([^=\r\n]*[=]{1,5})[\t ]*/gim, "$1$2"); //'
loopcount++;
}
 
// Remove trailing colon from section headings
str = str.replace(/(^[=]{1,5}[^=\r\n]*)[:]([\t ]*[=]{1,5})[\t ]*/gim, "$1$2");
 
// Correct caps in "See also" section
str = str.replace(/(== [\t ]*)see also([\t ]* ==)/gi, "$1See also$2");
 
// Change common synonyms for "See also" to "See also", but only if "See also" doesn't exist
if (!str.match(/=[\t ]*See also[\t ]*=/gi)) {
str = str.replace(/(== [\t ]*)(?:related topics|related articles|internal links|also see)([\t ]* ==)/gi, "$1See also$2");
}
// Common synonyms for "External links"
str = str.replace(/(== [\t ]*)(?:external links?|outside links?|web ?links?|exterior links?)([\t ]* ==)/gi, "$1External links$2");
 
// Capitalization and/or plural of "References", "Sources", "Further reading"
str = str.replace(/(== [\t ]*)references([\t ]* ==)/gi, "$1References$2");
str = str.replace(/(== [\t ]*)sources([\t ]* ==)/gi, "$1Sources$2");
str = str.replace(/(== [\t ]*)further readings?([\t ]* ==)/gi, "$1Further reading$2");
 
return str;
}
 
 
//---------------------tablestowikitext.js--------------------------------
str = str.replace(/(<table|<tr|<td|<th)([^<>]*?)[\s]+(>)/gim, "$1$2$3");
str = str.replace(/(<table|<tr|<td|<th)([^<>]*?)[\s][\s]+/gim, "$1$2 ");
// Remove any extra junk </tr>, </td>, </th>, </table>
,
,
,
|}
str = str.replace(/(<\/table|<\/tr|<\/td|<\/th)[^<>]+(>)/gim, "$1$2");
// Remove space whitespace after </tr>, </td>, </th>, <table>
,
str = str.replace(/(<\/tr>|<\/td>|<\/th>|<table[^<>]*>)[\s]+/gim, "$1");
,
// Remove space before <tr>, <td>, <th>, </table>
, {|
str = str.replace(/(<\/tr>|<\/td>|<\/th>|<table[^<>]*>)[\s]+/gim, "$1");
// Remove space before
|-
,
| ,
! ,
|}
str = str.replace(/[\s]+(<\/table>|<tr[^<>]*>|<td[^<>]*>|<th[^<>]*>)/gim, "$1");
// Replace '<table>' with '{|'
' with '{|'
str = str.replace(/<table( [^<>]*|)>[\s]*/gim, "{|$1\n");
// Replace '</table>' with '|}'
|}' with '|}'
str = str.replace(/[\s]*<\/table>/gi, "\n|}");
// Replace '</td><td>||' with '||'
str = str.replace(/<\/td[\s]*>[\s]*<td[\s]*>/gim, "||");
| [\s]* | /gim, "||");
str = str.replace(/<\/td[\s]*>[\s]*<td ([^<>]+)>/gim, "|| $1 |");
// Replace '</th><th>!!' with '!!'
str = str.replace(/<\/th[\s]*>[\s]*<th[\s]*>/gim, "!!");
! [\s]* | /gim, "!!");
str = str.replace(/<\/th[\s]*>[\s]*<th ([^<>]+)>/gim, "!! $1 |");
// Replace '</td></tr>' and '</th></tr>' with EOL
 
' and '
 
' with EOL
str = str.replace(/<\/(?:td|th)>[\s]*<\/tr>[\s]/gim, "\n");
// Replace '</td>', '</th>', '</tr>' with EOL
', '
', '
' with EOL
str = str.replace(/<\/(?:td|th|tr)>[\s]*/gim, "\n");
// Replace '<tr>' with '|-'
|-
str = str.replace(/[\s]*<tr>[\s]*/gim, "\n|-\n");
' with '|-'
str = str.replace(/[\s]*
|-
[\s]*/gim, "\n|-\n");
str = str.replace(/[\s]*<tr ([^<>]*)>[\s]*/gim, "\n|- $1\n");
// Replace '<td>' with "|"
| ' with "|"
str = str.replace(/[\s]*<td>([^\s])/gim, "\n| $1");
str = str.replace(/[\s]*<td>([\s])/gim, "\n|$1");
| ([^\s])/gim, "\n| $1");
str = str.replace(/[\s]*
| ([\s])/gim, "\n|$1");
str = str.replace(/[\s]*<td[\s]*([^<>]*?)[\s]*>([^\s])/gim, "\n| $1 | $2");
str = str.replace(/[\s]*<td[\s]*([^<>]*?)[\s]*>([\s])/gim, "\n| $1 |$2");
// Replace '<th>' with '!'
! ' with '!'
str = str.replace(/[\s]*<th>([^\s])/gim, "\n! $1");
str = str.replace(/[\s]*<th>([\s])/gim, "\n!$1");
! ([^\s])/gim, "\n! $1");
str = str.replace(/[\s]*
! ([\s])/gim, "\n!$1");
str = str.replace(/[\s]*<th[\s]*([^<>]*?)[\s]*>([^\s])/gim, "\n! $1 | $2");
str = str.replace(/[\s]*<th[\s]*([^<>]*?)[\s]*>([^\s])/gim, "\n! $1 |$2");
 
//Usually unneeded BR tags from ends of image descriptions and wikilinks (]]), templates (}}), template parameters (|)
str = str.replace(/[\t ]*<[\s\/\.]*br[\s\/\.]*>[\t ]*([\t\n ]*?)(\]\]|}}|\|)/gim, "$1$2");
//BR tag before a list item
str = str.replace(/[\t ]*<[\s\/\.]*br[\s\/\.]*>[\t ]*([\s]*?[\n]\*)/gim, "$1");
//BR tag followed by at least two newlines
str = str.replace(/[\t ]*<[\s\/\.]*br[\s\/\.]*>[\t ]*([\n])[\t ]*([\n])/gim, "$1$2");
 
return str;
}
 
return {
autoEdISBN: autoEdISBN,
autoEdWhitespace: autoEdWhitespace,
autoEdHTMLtoWikitext: autoEdHTMLtoWikitext,