<link href="../fonts/font.css" rel="stylesheet" type="text/css">

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
		<id>https://wiki.imaroof.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-Extra-Editbuttons-persiantools.js</id>
		<title>مدیاویکی:Gadget-Extra-Editbuttons-persiantools.js - تاریخچهٔ ویرایش‌ها</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.imaroof.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-Extra-Editbuttons-persiantools.js"/>
		<link rel="alternate" type="text/html" href="https://wiki.imaroof.ir/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-Extra-Editbuttons-persiantools.js&amp;action=history"/>
		<updated>2026-08-01T20:52:12Z</updated>
		<subtitle>تاریخچهٔ ویرایش‌های این صفحه در ویکی</subtitle>
		<generator>MediaWiki 1.26.2</generator>

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

	</feed>