#!/usr/bin/env python2.7

# Distributed under the terms of MIT License (MIT)

# Based on fa.wikipedia's AbarAbzar tool
##https://fa.wikipedia.org/wiki/Mediawiki:Gadget-Extra-Editbuttons-persianwikitools.js
##https://fa.wikipedia.org/wiki/Mediawiki:Gadget-Extra-Editbuttons-persiantools.js
##https://fa.wikipedia.org/wiki/Mediawiki:Gadget-Extra-Editbuttons-dictionary.js

# This tool edits Persian texts and solve some of the wrong dictation, typo and ZWNJ problems
# It is not suitable for Mediawiki's syntax for editing in Mediawiki environment use fa_cosmetic_changes_core.py

import re

arabicDigits = ur'0123456789'
arabicIndicDigits = ur'٠١٢٣٤٥٦٧٨٩'

# نویسه\u200cهای غیرفارسی ي-ك-ە و موارد مشابه پیش از تبدیل به نویسهٔ فارسی در سایر ریجکس\u200cها باید به عنوان کاراکتر فارسی شناخته شوند.

similarPersianCharacters = ur'\u0643\uFB91\uFB90\uFB8F\uFB8E\uFEDC\uFEDB\uFEDA\uFED9\u0649\uFEEF\u064A\u06C1\u06D5\u06BE\uFEF0-\uFEF4'
vowels = ur'\u064B-\u0650\u0652\u0670'
persianCharacters = ur'\u0621-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters
persianCharactersNoVowels = ur'\u0621-\u064A\u0653-\u0655\u067E\u0686\u0698\u06AF\u06A9\u0643\u06AA\uFED9\uFEDA\u06CC\uFEF1\uFEF2' + similarPersianCharacters
persianDigits = ur'۰۱۲۳۴۵۶۷۸۹'
hamza = ur'\u0654'
NASB = u'\u064b'
ZAMM = u'\u064c'
persianPastVerbs = ur'(' \
                   + ur'ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افکند|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|انگیزاند|اوباشت|ایستاد' \
                   + ur'|آراست|آراماند|آرامید|آرمید|آزرد|آزمود|آسود|آشامید|آشفت|آشوبید|آغازید|آغشت|آفرید|آکند|آگند|آلود|آمد|آمرزید|آموخت|آموزاند' \
                   + ur'|آمیخت|آهیخت|آورد|آویخت|باخت|باراند|بارید|بافت|بالید|باوراند|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید' \
                   + ur'|بود|بوسید|بویید|بیخت|پاشاند|پاشید|پالود|پایید|پخت|پذیراند|پذیرفت|پراکند|پراند|پرداخت|پرستید|پرسید|پرهیزید|پروراند|پرورد|پرید' \
                   + ur'|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشاند|پوشید|پویید|پیچاند|پیچانید|پیچید|پیراست|پیمود|پیوست|تاباند|تابید|تاخت' \
                   + ur'|تاراند|تازاند|تازید|تافت|تپاند|تپید|تراشاند|تراشید|تراوید|ترساند|ترسید|ترشید|ترکاند|ترکید|تکاند|تکانید|تنید|توانست|جَست|جُست' \
                   + ur'|جست|جنباند|جنبید|جنگید|جهاند|جهید|جوشاند|جوشید|جوید|چاپید|چایید|چپاند|چپید|چراند|چربید|چرخاند|چرخید|چرید|چسباند|چسبید' \
                   + ur'|چشاند|چشید|چکاند|چکید|چلاند|چلانید|چمید|چید|خاراند|خارید|خاست|خایید|خراشاند|خراشید|خرامید|خروشید|خرید|خزید|خست|خشکاند' \
                   + ur'|خشکید|خفت|خلید|خمید|خنداند|خندانید|خندید|خواباند|خوابانید|خوابید|خواست|خواند|خوراند|خورد|خوفید|خیساند|خیسید|داد|داشت|دانست' \
                   + ur'|درخشانید|درخشید|دروید|درید|دزدید|دمید|دواند|دوخت|دوشید|دوید|دید|دیدم|راند|ربود|رخشید|رساند|رسانید|رست|رَست|رُست' \
                   + ur'|رسید|رشت|رفت|رُفت|رقصاند|رقصید|رمید|رنجاند|رنجید|رندید|رهاند|رهانید|رهید|روبید|روفت|رویاند|رویید|ریخت|رید|ریسید' \
                   + ur'|زاد|زارید|زایید|زد|زدود|زیست|سابید|ساخت|سپارد|سپرد|سپوخت|ستاند|ستد|سترد|ستود|ستیزید|سرایید|سرشت|سرود|سرید' \
                   + ur'|سزید|سفت|سگالید|سنجید|سوخت|سود|سوزاند|شاشید|شایست|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمارد|شمرد|شناخت' \
                   + ur'|شناساند|شنید|شوراند|شورید|طپید|طلبید|طوفید|غارتید|غرید|غلتاند|غلتانید|غلتید|غلطاند|غلطانید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت' \
                   + ur'|فریفت|فشاند|فشرد|فهماند|فهمید|قاپید|قبولاند|کاست|کاشت|کاوید|کرد|کشاند|کشانید|کشت|کشید|کفت|کفید|کند|کوبید|کوچید' \
                   + ur'|کوشید|کوفت|گَزید|گُزید|گایید|گداخت|گذارد|گذاشت|گذراند|گذشت|گرازید|گرایید|گرداند|گردانید|گردید|گرفت|گروید|گریاند|گریخت|گریست' \
                   + ur'|گزارد|گزید|گسارد|گستراند|گسترد|گسست|گسیخت|گشت|گشود|گفت|گمارد|گماشت|گنجاند|گنجانید|گنجید|گندید|گوارید|گوزید|لرزاند|لرزید' \
                   + ur'|لغزاند|لغزید|لمباند|لمدنی|لمید|لندید|لنگید|لهید|لولید|لیسید|ماسید|مالاند|مالید|ماند|مانست|مرد|مکشید|مکید|مولید|مویید' \
                   + ur'|نازید|نالید|نامید|نشاند|نشست|نکوهید|نگاشت|نگریست|نمایاند|نمود|نهاد|نهفت|نواخت|نوردید|نوشاند|نوشت|نوشید|نیوشید|هراسید|هشت' \
                   + ur'|ورزید|وزاند|وزید|یارست|یازید|یافت' + ur')'

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

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

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

adjective = \
    ur'اخمو|ارزان|ارغه|الکن|الکی|انبوه|آبدار|(نا)?آرام|آرغنده|(نا)?آشکار|(نا)?آماده|آهسته|(بی\u200c|با)انضباط|باریک|بد|بدحساب|بددل|بدریخت' \
    + ur'|بر|براق|برخوردار|برومند|بزدل|بلند|بی‌آلایش|بی دست و پا|بیچاره|بیدار|بیمار|پخ|پخش|پخمه|پرت|پرنور|پست|پشمالو|پلید|پوچ|(سر|نا)?پوشیده|پوک' \
    + ur'|پیر|پیروز|تار|تپل|ترد|ترسو|تفت|تلخ|تنبل|تندرو|تنک|تنگ|تنها|تهی|تیره|جلو|چابک|چاپلوس|چالاک|چپ|چرند|چسبان|چفته|چیره|خام|خانم|خراب' \
    + ur'|خرم|خسته|خشک|(نا)?خفته|خفن|خل|خنگ|(نا)?خوانا|خوب|خوشکل|خوش‌گوار|خیراندیش|دراز|درخور|درستکار|دلباخته|دلیر|دوست|دون|رحیم|رسمی|روانی|روشن' \
    + ur'|ریغو|زبر|زبردست|زبل|زشت|زیبا|زیرک|ژرف|ژنده|ساده|(نا)?سالم|ساکت|سبک|سخاوتمند|سر|سرکش|سفت|سوسول|شایسته|شکیبا|شل|شور|طولانی|عالم|فراوان|فرز' \
    + ur'|فنی|قرتی|قشنگ|قلنبه|قهرمان|کارکن|کال|کبود|کج|کچل|کر|کلان|کلفت|کم|کند|کنس|کوتاه|کوتوله|کوچک|کوچولو|کودن|گدا|گران|گرسنه|گشاد' \
    + ur'|گنگ|گود|گیج|لاغر|لبریز|لخت|لغزنده|له|مات|مچاله|مچل|(نا)?مرد|مردمی|مردنی|مست|مشکوک|مفید|ناپدید|ناپسند|ناتوان|ناجنس|ناجور|ناچیز|ناخوش' \
    + ur'|نادان|(نا)?درست|نازک|ناسپاس|نافرمان|ناگوار|نامرد|نرم|نیازمند|نیرومند|هشیار|هیز|واژگون|ول|ولرم|ولنگار|یکپارچه|یکدست|یکرنگ|(نا)?پیدا' \
    + ur'|گناهکار|ریز|دانا|کثیف|آقا|(با|بی\u200c)سواد|عاشق|(با|بی\u200c)محبت|صاف|زمخت|فریبنده|پیچیده|سخت|دشوار|تمیز|(نا)?پاکیزه|بزرگ|پهن|پخته|بی‌مورد' \
    + ur'|بی‌نیاز|(بی\u200c|با|)تجربه'

personNames = \
    ur'الله|محمد|علی|حسن|حسین|جواد|باقر|مهدی|تقی|نقی|نازی|نجم|' \
    + ur'اکرم|کاظم|عباس|منصور|خسرو|محمود|شمس|ملک|شوکت|' \
    + ur'نصر|همت|جهان|جلال|موسی|ابراهیم|جعفر|احمد|قاسم|کمال|هاشم|' \
    + ur'شفیع|صمد|شیخ|اسماعیل|ربیع|سلیمان|رستم|شاهرخ|فرخ|شریف|نعمت|' \
    + ur'امیر|خلیل|جلیل|مجید|اسد|شوکت|رضا|عجل|ید|عبد|سهیل|معصوم|عظیم' \
    + ur'اکبر|اصغر|بهمن|قلی'

wordsWithA = \
    ur'ورامدن|هرزاب|هراینه|هجوامیز|نوش‌اذر|نواوری|نواموز|نهراب|میراخور|میراب|می‌اید|می‌اورند|مرات' \
    + ur'|ماخذ|مابی|لس‌انجلس|گل‌اذین|گزنداور|گرداوری|گرداوردن|گرداورد|گردامدن|کنداور|کفرامیز|فرودامدن|عطراگین|طنزامیز' \
    + ur'|شیرابه|شهرا[یئ]ین|شهراشوب|سوداور|سراوردن|سرامدن|سرامد|سراشپز|سحرامیز|زیرابی|زوراور|زهرالود|زهراگین|زردالو|دوداهنگ|دواتشه' \
    + ur'|دژاهنگ|دژالود|درداور|دردالود|درایند|دراید|دراویختن|دراوری|دراورنده|دراورند|دراوردن|درامده|درامدن|درامد|خیزاب|خشم‌الود' \
    + ur'|چندش‌اور|جگراور|تیراهن|تهورامیز|تنفراور|تنداب|پسندامدن|پرنداور|پردرامد|پراشوب|پراب|بی‌اب|بوا|بنداوردن' \
    + ur'|بنداور|سرامدن|برایند|براورده|براوردن|براورد|برامده|برامدن|برامدگی|برامد|براشفته|براشفتن|براشفتگی|براسودن|بداهنگ' \
    + ur'|بداموزی|بدامدن|بدامد|ائورت|ائسه|ا[یئ]ینه|ا[یئ]ین‌نامه|ا[یئ]ین|ایه‌یاب|ایه|اینه‌دار|اینده|ایندگان|ایفون' \
    + ur'|ایروپلن|ایدین|ایتم|ایت‌الله|ایت|ایات|اویشن|اویسا|اویژه|اویزون|اویزه|اویزند|اویزگر|اویزش' \
    + ur'|اویزدار|اویزان|اویز|اویخته|اویختنی|اویختن|اویختگی|اویخت|اویتخه|اووکادو|اونگون|اونگان|اونگ|اوند|اوریل' \
    + ur'|اوریدن|اورنده|اورند|اورنجن|اوردیدن|اورده|اوردنی|اوردن|اوردگه|اوردگاه|اوردجو|اورد' \
    + ur'|اوایش|اوانویس|اوانگارد|اوانتاژ|اواکس|اواشناس|اوازه‌خوان|اوازهای|اوازه|اوازخوان|اواز|اواره|اوارگی|اوارگان' \
    + ur'|اوار|اهو|اهنین|اهنگ‌ساز|اهنگرخانه|اهنگر|اهنگ|اهن‌فروش|اهن‌ربا' \
    + ur'|اهن‌پاره|اهن‌بر|اهن‌الات|اهن|اهک‌سازی|اهک‌پزی|اهک‌پز|اهک|اهسته|اهستگی|اهای|اهان' \
    + ur'|انیون|انوقت|انود|انها|ان‌گه|ان‌گاه|ان‌که|ان‌کس|انکارا|ان‌قدر|انفولانزا|انفلوانزا' \
    + ur'|انفارکتوس|ان‌طور|ان‌طرف|ان‌سو|انژیوگرافی|انژین|انزیم|ان‌روی|ان‌روز|ان‌رو|اندوسکوپی|ان‌چه|ان‌جا|انتیل|انتیک' \
    + ur'|انتی|انتن|انتریک|انتراکت|انتراسیت|انتالیا|اناهیتا|اناناس|انان|انالیز|انالوگ|انارشیسم|اناتومی|اناتولی' \
    + ur'|انابولیسم|امینه|امیغه|امیغ|امیزه|امیزگار|امیزش|امیز|امیخته|امیختن|امیختگی|امیب|امونیوم|امونیت|امونیاک|امون' \
    + ur'|اموکسی|اموزه|اموزنده|اموزگان|اموزگار|اموزش‌یار|اموزشگاه|اموزشکده|اموزش|اموزانه|اموزاندن|اموز|اموده|امودن|امودریا' \
    + ur'|اموخته|اموختن|اموختگی|اموختار|امله|امریکا|امرزیده|امرزیدن|امرزیدگی|امرزنده|امرزگار|امرزش|امرز|امرانه' \
    + ur'|امدید|امدوشد|امدورفت|امده|امدن|امدگی|امدکردن|امد|امخته|امپلی|امپرسنج|امپر|امبولی|امبولانس|امایه|امایش|امال' \
    + ur'|اماسیده|اماسیدن|اماسانیدن|اماس|امازون|امارگیر|امارگر|امارشناسی|امارشناس|اماده‌کردن|اماده|امادگی|امادگاه' \
    + ur'|اماج‌گاه|اماج|اماتور|الیداد|الیاژهای|الیاژ|الونک|الومینیوم|الومینیم|الوزرد|الوده|الودن|الودگی|الودگر|الود|الوچه' \
    + ur'|الوبخارا|الما|الفرد|الفا|الرژی|التو|الترناتیو|الت|الپ|البومین|البوم|البانی|البالوئی|البالو|الا[یئ]یدن' \
    + ur'|الایشی|الایش|الای|الاسکا|الاخون|الاچیق|الات|الاباما|اگنه|اگنده|اگندن|اگاهی‌نامه|اگاهی‌دادن|اگاهی|اگاهگان' \
    + ur'|اگاهانیدن|اگاهانه|اگاهاندن|اگاه|اکوستیک|اکوردئون|اکواریوم|اکنه|اکنش|اکنده|اکندن|اکله|اکسفورد|اکروبات|اکتئون' \
    + ur'|اکتینیوم|اکانتاسه|اکادمیک|اکادمی|اق‌بانو|اقائی|اقایان|اقامنشانه|اقامنش|اقاسی|اقازاده|اقاجان|اقا' \
    + ur'|افریننده|افرینش|افرین|افریکانس|افریقا|افریده|افریدن|افریدگار|افتومات|افتابه|افتاب‌مهتاب|افتاب‌گیر' \
    + ur'|افتاب‌گردان|افتاب‌زده|افتاب‌زدگی|افتاب‌رو|افتاب‌خورده|افتاب‌پرست|افتاب|افاقی|افاق|افات|اغول|اغوشیدن|اغوش|اغل' \
    + ur'|اغشته|اغشتن|اغشتگی|اغش|اغالش|اغاسی|اغازین|اغازیدن|اغازیان|اغازی|اغازه|اغازگر|اغاز|اغاجی|اغا|اشیل|اشیانی|اشیانه' \
    + ur'|اشیان‌بندی|اشیان|اشور|اشوبیدن|اشوب‌ناک|اشوب‌گرانه|اشوب‌گر|اشوب‌کن|اشوب‌طلب|اشوب‌انگیز|اشوب|اشنایان|اشناوری' \
    + ur'|اشناگر|اشناسازی|اشنا|اشکوخیدن|اشکاره|اشکارگر|اشکارساز|اشکارا|اشکار|اشفته|اشفتن|اشفتگی|اشغالدان|اشتی' \
    + ur'|اشفتگی|اشپزخانه|اشپز|اشامیدنی|اشامیدن|اشامه|اشامنده|اشام|اشاب|اسیمه|اسیمگی|اسیب‌زدن' \
    + ur'|اسیب‌دیده|اسیب|اسیاکردن|اسیاسنگ|اسیازنه|اسیاچرخ|اسیابان|اسیاب|اسیا|اسوده‌خاطر|اسوده‌حال|اسوده|اسودن' \
    + ur'|اسودگی|اسمون|اسمانه|اسمان‌سنجی|اسمان‌خراش|اسمانخانه|اسمان|اسکاریس|اسفالت|استینه|استرکاری' \
    + ur'|استردوز|استانه|اسپیرین|اسپرین|اسائی|اسا[یئ]یدن|اساینده|اسایشگاه|اسایش|اسان‌گیری|اسانسورچی' \
    + ur'|اسانسور|اسان|اژیرهوائی|اژیر|اژیانه|اژنگ|اژند|اژفنداک|اژدار|اژانس|ازیدن|ازیتا|ازوقه|ازمون‌گر|ازمون‌گاه|ازمون|ازموده' \
    + ur'|ازمودن|ازمودگی|ازمندی|ازمند|ازمائی|ازمایه|ازماینده|ازمایشی|ازمایشو|ازمایشگاه|ازمایشات|ازمایش|ازمابنده|ازما|ازگار' \
    + ur'|ازرده|ازردن|ازردگی|ازرد|ازاریدن|ازارنده|ازاررسان|ازاردهنده|ازار|ازادی‌خواه|ازادوار' \
    + ur'|ازاده|ازادمنش|ازادمرد|ازادگی|ازادگان|ازادکامی|ازادانه|ازاد|اریانا|اریان|اریا|ار[و]غ' \
    + ur'|ارواره|ارنولد|ارنگ|ارنج|ارنائوت|ارمینا|ارمین|ارمیس|ارمیده|ارمیدن|ارمیدگی|ارمیچر|ارمه|ارمان‌شهر|ارماگدون|ارگون' \
    + ur'|ارکاد|ارشیو|ارشیتکت|ارشه|ارشام|ارش|ارستن|ارسان|ارژانتین|ارزومندانه|ارزومند|ارزوخواه|ارزو|ارتین|ارتیشو|ارتیست' \
    + ur'|ارتور|ارتمیس|ارتروز|ارا[یئ]یدن|ارایه‌گر|ارایشی|ارایشگر|ارایشگاه|ارایش|ارامیدن|ارامگاه|ارامگان|ارام‌کردن' \
    + ur'|ارامش|ارامانیدن|ارام|اراسته|اراستن|اراستگی|ارارات|اراء|اذین|اذرین|اذرنوش|اذرنگ|اذرگون|اذرشهر|اذرسنجی' \
    + ur'|اذرروز|اذرخش|اذربرزین|اذربایجان|اذر|ادینه|ادیس|ادونیس|ادنیس|ادمی‌گرا|ادمیزاد' \
    + ur'|ادمیرال|ادمیت|ادم‌گرا|ادم‌کش|ادمک|ادم‌فروش|ادم‌ربا|ادم‌خوار|ادرنالین|ادرس|ادامس|اداب|اخوندک|اخوند' \
    + ur'|اخور|اخرین|اخرسالار|اخرزمان|اخرت‌شناسی|اخرت|اخرالدواء|اخرالامر|اخر|اختن|احاد|اچمز|اچارکشی|اچاردار|اچار|اجیل|اجودان' \
    + ur'|اجرنما|اجرکاری|اجرچین|اجرپز|اجان|اثار|اتیه|اتیکا|اتیسا|اتلیه|اتشین|اتش‌ناک|اتش‌گیره|اتش‌گیر' \
    + ur'|اتش‌گون|اتش‌گرفتن|اتش‌گاه|اتشکده|اتش‌کار|اتش‌فشان|اتش‌زنه|اتش‌زدن|اتش‌زا|اتش‌دان|اتش‌خوار|اتش‌خانه|اتش‌پاره|اتش‌بان|اتش‌بازی|اتش‌بار' \
    + ur'|اتش|اتریوم|اتروپین|اتابای|اپولو|اپوستروف|اپاندیسیت|اپاندیس|اپارتمان|اپارتاید|اپارات|ابیار|ابونه|ابونمان' \
    + ur'|ابها|ابنوس|اب‌نمک|اب‌نما|اب‌[ن]شدنی|ابنبات|ابمیوه‌گیر|اب‌میوه|اب‌لیمو|ابله‌کوب|ابله‌رو|ابگینه|ابگیر|ابگونه|ابگون‌ساز' \
    + ur'|اب‌گوشت|اب‌گرمکن|اب‌گردان|اب‌گذر|اب‌گاه|اب‌کش|اب‌کانه|اب‌کامه|اب‌کار|اب‌فشان|ابغوره|ابشی|ابشور|اب‌شنگولی|ابشش|اب‌شدنی' \
    + ur'|ابش‌خور|ابشتگاه|ابشار|ابسوار|ابسه|ابسکون|ابستن|ابسالان|اب‌سال|ابزی‌گاه|ابزی‌دان|ابزی|ابریزگاه|ابریزگان|ابریزش' \
    + ur'|ابریز|ابرومند|ابروریزی|ابرنگ|ابرفت|ابراهه|ابراهک|ابراه|ابدیده|ابدزدک|ابدانک|ابدان|ابداری|ابدارخانه|ابدارچی' \
    + ur'|ابدارباشی|ابدار|اب‌خیز|ابخوری|ابجی|ابجوفروشی|ابجوساز|ابجوساختن|ابجو|ابتین|ابتنی|اب‌پنیر|اگهی' \
    + ur'|اب‌پاش|اب‌بها|اب‌بند|اب‌باز|اب‌انبار|ابان|اباژور|اباده|ابادکردن|ابادسازی|ابادان|اباد|اباء'  # first charcter should be آ

# removed ان for [[ان بی سی]]
# match ZWNJ also as a space or optional

wordsWithA = wordsWithA.replace(ur"\u200c", u'[\u200c ]?')

PresentVerbsWithA = \
    ur'ارا|ارام|ارامان|ارای|ازار|ازما|ازمای|اسا|اسای|اشام|اشوب|اغار|اغاز|افرین|اکن|اگن|الای' \
    + ur'|امرز|اموز|اموزان|امیز|اهنج|اور|اویز'

PastVerbsWithA = \
    ur'اراماند|ارامید|ارمید|ازرد|ازمود|اشامید|اشفت|اشوبید|اغازید|اغشت|افرید|اکند|اگند|الود' \
    + ur'|امد|امرزید|اموخت|اموزاند|امیخت|اهیخت|اورد|اویخت'

needsNasb = \
    ur'اتفاقا|الزاما|لزوما|یقینا|قطعا|حتما|قاعدتا|طبیعتا|طبعا|قهرا|جدّا|حقیقتا|واقعا|مطمئنا|واضحا|مسلما|تماما|کاملا' \
    + ur'|عینا|اکیدا|مطلقا|دقیقا|مستقیما|اصولا|اصلا|اصالتا|نسبا|نسبتا|تقریبا|حدودا|معمولا|قانونا|شرعا|اخلاقا|خلقا|احتمالا' \
    + ur'|استثنائا|اساسا|کلّ?ا|جزئا|مجموعا|جمعا|اجماعا|شدیدا|نهایتا|اقلا|اکثرا|غالبا|عمدتا|ندرتا|بعضا|گاها|صریحا|صراحتا|عموما' \
    + ur'|اختصاصا|خصوصا|مجملا|اجمالا|اختصارا|مختصرا|مشروحا|ظاهرا|باطنا|عمیقا|ذاتا|فطرتا|جسما|ابتدائا|مقدمتا|بدوا|بعدا|قبلا' \
    + ur'|جدیدا|سابقا|اخیرا|ابدا|عمرا|تلویحا|علنا|حضورا|غیابا|نیابتا|لطفا|اجبارا|اختیارا|عالما|عمدا|عامدا|تعمدا|متعمدا|عادتا' \
    + ur'|مستقلا|احتیاطا|احیانا|غفلتا|سهوا|اشتباها|عاجلا|عجالتا|مرتجلا|ارتجالا|سریعا|فورا|دا[یئ]ما|ضرورتا|نقدا|منحصرا|صرفا|دفعتا' \
    + ur'|کرارا|مکررا|مجددا|مرتبا|مستمرا|متواترا|تدریجا|تصادفا|عملا|فعلا|موقتا|ضمنا|نتیجتا|نوعا|اصطلاحا|جسارتا|بالا ?غیرتا|م[وؤ]کدا' \
    + ur'|ذیلا|شخصا|مشترکا|مفصلا|رسما|ترجیحا|قلبا|ر[اأ]سا|تو[اأ]ما|متناوبا|متوالیا|متقابلا|متعاقبا|متّ?فقا|مثلا|فرضا|ایضا|مضافا' \
    + ur'|مصرّ?ا|ارفاقا|انصافا|جهارا|طولا|متدرجا|غانما|احتراما|ناچارا|سفارشا|تلفنا|زبانا|کتبا|شفاها|چهارما|ثانیا|ثالثا' \
    + ur'|رابعا|خامسا|سادسا|سابعا|ثامنا|تاسعا|عاشرا|مخصوصا'  # اولا و سوما می‌تواند یک نام خاص باشد.

HamzehZam = \
    ur'امیرالمومنین|مومن|رویا|فواد|موذن|مودب|موخر|مواخذه|مولف|موثر|مونث|موکد|موسس(?! خورناتسی)|سوال|موسسه'  # for[[ران مودی]]removedمودی
HamzehZam = HamzehZam.replace(ur'\u0648', ur'وء?')

HamzehNasb = \
    ur'تاکید|تالیف|تاسیس|تاسیسات|تامل|تفال|تاهل|تامین|تا[یئ]ید|تادیب|تاثیر|تاثر|تاثیرات|تاثیرگذار|تاجیل' \
    + ur'|تاخر|تاخیر|توام|ماوا|مستاجر|مبدا|منشا|متاسفانه|متاسف|متاثر|مساله|متاهل|خلا|ملا عام|رافت|ماخذ|مایوس|ماخوذ' \
    + ur'|مامور|مامورین|ماموران|ماموریت|مامون|مانوس'  # removed راس، تالم

HamzehAtEnd = \
    ur'اجزا|احشا|ارتجا|ارتقا|ازا|استثنا|استغنا|استقرا|استمنا|استهزا|اشبا|اشقیا|اشیا|اطبا|اطفا|اعتلا' \
    + ur'|اغوا|افترا|اقتضا|امنا|انبیا|انقضا|اولیا|ماورا'  # re املا-انشا-اعضا-امضا-انزوا-ابتلا-استعفا-اعلا-اعتنا بدون همزه متداولترند، ابدا می‌تواند با همزه یا نتوین باشد در نتیجه برداشته شد

HamzehAtInside = {ur'سو': u'استفاده|تعبیر|تفاهم|برداشت',
                  ur'ما': u'الشعیر', ur'ماورا': u'الطبیعه|النهر'}

AlefMaghsooreh = \
    ur'یحیا|حتا|خنثا|مبرا|مرتضا|مصطفا|موسا|مجتبا|عیسا|عظما|علارغم'  # removed اولا- الا

colorsNames = \
    ur'زرد|قرمز|آبی|سفید|سیاه|بنفش|سرخ|گلگون|ازرق|ابیض|نارنجی|توسی|کبود|ارغوانی|سورمه‌ای|سپید|مشکی|کرم|قهوه‌ای|سبز|طلا[یئ]ی'

persianNumbers = \
    ur'یک|دو|سه|چهار|پنج|شش|هفت|هشت|نه|ده|یازده|دوازده|سیزده|چهارده|' \
    + ur'پانزده|شانزده|هفده|هجده|نوزده|بیست|سی|چهل|پنجاه|شصت|هفتاد|هشتاد|نود|صد|هزار'

addToAbad = ur'گلون|افضل|رقی|خیر|دل|حاجی|سید|مبارک|گنج|نهنگ|چنگ|' \
            + ur'سرخ|جنگل|خرم|خونی|دولت|به|نیاز|حفظ|عیش|نجم|بلاش|شیار|' \
            + ur'فتح|فضل|خدر|ساق|کج|زین|اسلام|بالش|پارس|اسکل|یاخچی|مهندس|قوژد'

firstNameComplex = {
    ur'حمید|احمد|محمود': u'رضا',
    ur'خدا': ur'بنده|داد',
    ur'امیر': ur'علی|حسین|محمد|رضا|مهدی|عباس',
    ur'محمد': ur'حسین|رضا|مهدی|جواد|باقر|کاظم|حسن|علی|امیر|طاها|هادی|وحید|حمید',
    ur'علی': ur'رضا|محمد|اصغر|اکبر|قلی',
}

complexes = {  # اسم خاص
    # اسم مرکب
    # فعل
    # صفت مرکب
    # 'با': u'پرستیژ|ابهت|احساس|اخلاق|ادب|ارزش|استعداد|استقامت|اصالت|اقتدار|اهمیت|تدبیر|تربیت|تسلط|تعصب|تقوی',
    # 'باقی|ته': u'مانده', bug > باقی مانده بود- ته مانده بود.
    # طبق بندهای    شماره ..
    # 'طبق|زمان': u'بند',
    # 'مادر|خواهر|برادر|فرزند|پدر': u'خوانده', # bug > وی پدر خوانده شد.(پدر صدا زده شد)
    ur'ویکی': u'پدیا|مدیا|انبار|واژه|نبشته|خبر|کتاب|داده|دیتا|سفر|تراول|دانشگاه',
    ur'ایده': u'آل',
    ur'سخت|نرم|پای|جنگ|نوشت|بد|ماشین': u'افزار',
    ur'جنگ': u'افروز',
    ur'پیاده': u'روی|رو|نظام',
    ur'انسان|روان|گیاه|زیست|جانور|نماد|زمین|هوا|ریخت|خدا|جامعه|رفتار|فرهنگ|معرفت|زبان|کتاب|ستاره|اختر|شرق|اسلام|ریشه|آسیب|باستان|حق': u'شناس',
    ur'بهره|نتیجه|فاصله|اندازه|مچ|رونق|دست|پا|پاچه|آبمیوه|آتش|آمار|اوج|کشتی|رأی|رای|یار|تصمیم': u'گیر',
    ur'بهره': u'مند|کشی|دهی',
    ur'اوج': u'دهی',
    ur'آزاد|بد|نیک|مثبت|مصلحت': u'اندیش',
    ur'هم': u'اندیشی|ارزی|راهی|سانی|رزم|خانه|نشین|سان|بند|مرز|سایه|مسلک|زمان|معنی|گام',
    ur'گرم|نرم|سرد|جمع|خنک|خشک|مرطوب|ضرب|تقسیم|کم|سرگرم|خوشحال|ناراحت|سخت|روان|باز|زیبا|زشت|مصرف|تولید': u'کننده|کنندگی|کنندگان',
    ur'خود|درون|پیه': u'سوز|خواه',
    ur'دل': u'افروز|آزار|آرا|آزرده|بریده|افسرده|ربا|سوز|خواه|گشا',
    ur'تفریق|افزایش|کاهش|ویرایش|کوزه|سفال|غارت|چپاول|صنعت|امداد|توطئه|حساب|افسون|ریخته': u'گر',
    ur'آهن': u'ربا',
    ur'طیف|امکان|اقتصاد|نور|زمان|عمق|گرما|فشار|قطر': u'سنج',
    ur'فیزیک|شیمی|ریاضی|تاریخ|قلم|کتاب': u'دان',
    ur'نام|اسم|سیاهه|خود|فیلم‌نامه|فیلمنامه|کتاب|روان|نسخه': u'نویس',
    ur'بار|سرمایه|تخم|کتاب|خواب': u'گذار',
    ur'شهر': u'بانو|زاد|ناز|نوش',
    ur'اسد|اسماء?|اسم|امان|امر|امیر|امین|انصار|انعام|اهل|اولیاء?|اکرم|باب|بدیع|برات|بقیة|بهاء?|جار|جند|حبیب|حجت|حزب|حفظ|حمد|خلق|خلیل|خیر|ذبیح|ذکر|رام|رحمت|رحم|رسول|روح|سیف|شمس|شکر|صدق|صدیق|عبد|عزت|عزیز|عین|فتح|فرج|فضل|قدرت|لطف|لعنت|نصرت|نصر|نظیر|نعمت|نور|هیبت|ولی|کلام|کلیم|ید|یوم': u'الله|اللهی',
    ur'مستند|هوا|روان|جریان|کار|مجسمه|ایمن|پیاده|مقاوم|امن|ساده|بهینه|مرتب|شبیه|ویکی|پل|جاده|راه': u'ساز',
    ur'احترام|اختلاف|اضطراب|اعجاب|افتخار|بحث|بر|تحسین|ترحم|تعجب|تعصب|تنفر|ت[اأ]ثر|ت[اأ]سف|ت[اأ]مل|جالب|جدل|جنجال|حزن|حیرت|خفت|خوف|خیال|چالش|دل|رعب|رقت|روح|شهوت|شور|شوق|شگفت|طرب|عبرت|غرور|غم|فرح|ملال|مهر|نشاط|نفرت|هراس|هوس|وحشت|ی[اأ]س': u'برانگیز|انگیز',
    ur'چهره|دور|تاریخ|خبر|روزنامه|روز|لرزه': u'نگار',
    ur'خود|روان|پاک|چرک|دست|پشت|زیر|پا|داستان': u'نویس',
    ur'زود|آرام|آب|کله|آش|بخار': u'پز',
    ur'مه|پیمان|یخ|سنگ|بت|صف': u'شکن',
    ur'خون': u'آشام|خوار|بار|گرم|سرد|بها',
    ur'شیطان|خدا|بت|خورشید|مهر|آتش|یزدان|ایزد|گاو|خود|آفتاب|یکتا|پول|حق|مال|میهن|نژاد': u'پرست',
    ur'پا[یئ]ین|بالا|عقب|جلو|کنار|ساده|بزرگ|کوچک|عمیق|رقیق|ضخیم|فهیم|گسترده': u'تر',
    ur'برگشت|انحنا|برش|انعطاف|مهمان|امکان|تفکیک|تغییر|آسیب|تأثیر|دل|سازش|مهاجر': u'پذیر|ناپذیر',
    ur'دانش': u'آموخته|پژوه|آموختگی',
    ur'بی': u'آلایش|ابهت|احترام|احساس|اختیار|اخلاق|ادب|اراده|ارزش|استعداد|استقامت|اصالت|اعتماد|اعتبار|اقتدار|امان|امنیت|انتها|اهمیت|بها|بو|تدبیر|تربیت|تسلط|تعصب|تقوی|توجه|ثبات|جنبه|حس|دریغ|دست و پا|دین|رنگ|روح|رویه|سابقه|سیم|شرف|شعور|لیاقت|مایه|مبالات|مزد|مزه|مصرف|معرفت|معنی|مقدار|مورد|نتیجه|نزاکت|نهایت|نیاز|وجدان|پایه|پرستیژ|پناه|پول|چاره|چیز|کار|دلیل|خبر',
    ur'می': u'دانم',
    ur'عرضه': u'کننده|کنندگان',
    ur'ابرو': u'کمان|قیطان',
    ur'ابله': u'گونه',
    ur'ابن': u'الیوم|الوقت|السبیل|عباس',
    ur'اغراق|خشونت': u'آمیز',
    ur'اجاق': u'کور|زاده|سوز',
    ur'اجل': u'برگشته',
    ur'اسفل': u'السافلین',
    ur'اطلاع': u'رسان|رسانی|دهی',
    ur'انگشت': u'نما|نشان|پیچ',
    ur'سپاس|نام': u'گزار',
    ur'گوشت|گیاه|علف|شیر': u'خوار',
    ur'آدم': u'برفی|فروش|ربا|خوار',
    ur'آب': u'لمبو|تنی',
    ur'آتشین': u'پنجه',
    ur'ریش|سنگ|قلم': u'تراش',
    ur'آزرده': u'جان',
    ur'آسوده': u'خاطر|وجدان',
    ur'آسیمه': u'سر',
    ur'آش': u'دهن|خور|پز',
    ur'آشفته': u'سامان|دماغ|روز',
    ur'آکنده': u'گوش|پهلو',
    ur'آلاخون': u'والاخون',
    ur'آمد': u'نیامد|شد',
    ur'باب': u'الحوائج',
    ur'باد': u'نشسته|گرفته',
    ur'بار': u'خاطر',
    ur'بالا|پایین|پائین': u'تنه',
    ur'برنامه': u'نویس',
    ur'برنامه|طرح|بتون': u'ریز',
    ur'بزرگ': u'سال|مرد',
    ur'بزن': u'دررو|بهادر',
    ur'بد|خوش': u'سیرت|اخلاق|تراش|ترکیب|ریخت|ادا|استیل|اندام|بو|بینانه|بینی|پخت|برخورد|یمن|خوراک|خیم|رکاب|حال|مزه|حساب|پوش|اقبال|قلق|منظر|نام|نما',
    ur'بد': u'انجام|پیله|خوی|عنق|کاره|گمان|گوهر|لگام|مسب|مست|مهر',
    ur'بن': u'بست',
    ur'به': u'غایت',
    ur'حمله|بهره|پیشه|شعله|طاعت|طالع': u'ور',
    ur'بین': u'النهرین|الملل|الممالک',
    ur'پاچه': u'ورمالیده',
    ur'تکه|پاره|آتش|آهن|جگر|چهار': u'پاره',
    ur'ترویج|امداد|جهاد': u'گران|گر',
    ur'جهان|خدا|سود|شفا|نیرو|گرما|سرما': u'بخش',
    ur'پاک': u'نفس|سرشت|دامن|سیرت|منش|دیده',
    ur'پالان': u'سا[یئ]یده|دوز',
    ur'پراگنده|تاریک|شکسته|آشفته|آزرده|آسوده|بد|خوش|خونین|سیاه|نازک': u'دل',
    ur'پری': u'نژاد|چهر',
    ur'نیک|پست': u'فطرت',
    ur'پی': u'گم|گرد|فراخ|سپید|نوشت',
    ur'پیچ': u'واپیچ|پیچ',
    ur'سفید|سیاه|قهوه‌ای|قرمز|زرد|سبز|بنفش|گلگون|سرخ|پیروزه|مشک|نیل|مشکین': u'فام',
    ur'پیش': u'مرگ|کسوت',
    ur'تازه': u'وارد|خط|نفس|کار',
    ur'تام': u'الاختیار',
    ur'خوش|زشت|ترش': u'رو',
    ur'ترگل': u'ور گل',
    ur'تکه': u'تکه',
    ur'تن': u'فروش|آسان|آرا|تن|پرور',
    ur'تند': u'خو|خوی',
    ur'تنگ': u'چشم',
    ur'تی': u'تیش',
    ur'پا|تن|زیر|سبز|سرخ|قرمز': u'پوش',
    ur'تیره': u'روز',
    ur'جامع': u'الشرایط|الاطراف',
    ur'جان': u'سخت|جانی',
    ur'یدک|فرو|نسل|آدم|ویروس|نقشه|سر|آب|آچار': u'کش',
    ur'کشتی|گرده|دشت|نگه|دید|زمین|جنگل|دروازه': u'بان',
    ur'چابک': u'سوار|دست',
    ur'نقاره|چاپ': u'چی',
    ur'چرب': u'زبان|ترازو',
    ur'چشمه': u'چشمه',
    ur'چل': u'کلید|تاج|تکه',
    ur'ناقاره|چوبک|دف|دمبک|ساز|نی|سنتور|تار|گیتار|ارگ': u'زن',
    ur'چیره': u'دست',
    ur'پول|فنگ|قالی|ظرف|خشک|لباس': u'شو[ئی]ی',
    ur'چیز': u'فهم',
    ur'حرف': u'شنو',
    ur'حق': u'السکوت|التدریس|الزحمه',
    ur'حکیم': u'باشی',
    ur'حرام|حلال': u'زاده',
    ur'حیرت': u'زده',
    ur'حیرت|نام|مقام|یاد|خواب|درد|شگفت|جمع': u'آور',
    ur'خاله': u'زنک',
    ur'خام': u'طمع|طبع',
    ur'خشک': u'سر',
    ur'خنده': u'رو|خریش',
    ur'خواجه': u'سرا|تاش',
    ur'سگ|مرغ|خوک': u'دانی',
    ur'خونین': u'جگر|چشم|شهر',
    ur'دایم': u'الخمر',
    ur'دائم': u'الصوم|الخمر',
    ur'درشت': u'خو',
    ur'دست': u'نویس|خوش|پاچه|چین|آورد',
    ur'دم': u'کلفت',
    ur'دندان': u'گرد',
    ur'دودوزه': u'باز',
    ur'ذوات': u'الارحام|الاذناب',
    ur'ذوی': u'القربی|الاوتار|العقول',
    ur'ذی': u'نفع|صلاحیت|فقار|ربط|قیمت|شعور|علاقه|حیات|فن|روح|عقل|حق',
    ur'چشم|بار|بر|پس|تیر|رو|زیر|غلط': u'انداز',
    ur'رای': u'دهنده|دهندگان',
    ur'راست': u'راستکی',
    ur'رحمت': u'العالمین',
    ur'رسم': u'الخط',
    ur'رقیق': u'القلب|الفکر',
    ur'رنگ': u'وارنگ',
    ur'اندود': u'کاری',
    ur'سنگ|ریز|دانه|تک|یک|بزرگ|رنگ': u'دانه',
    ur'رو[یئ]ین|پاد|نرم|سخت': u'تن',
    ur'ریش': u'ریش',
    ur'رئیس': u'الوزراء|الرؤسا',
    ur'تصویب|کار|اجازه|تکذیب|شب|پایان|اساس|آ[یئ]ین': u'نامه',
    ur'زنگی': u'مزاج',
    ur'زوار': u'دررفته',
    ur'زیست': u'محیط|بوم',
    ur'سابق|اخیر|فوق|لازم': u'الذکر',
    ur'سابقه': u'سالار',
    ur'سبک': u'مغز|سنگ|عنان|روح|لقا|سایه|سنگین|دست',
    ur'سربه': u'مهر',
    ur'سریع': u'السیر|الانتقال',
    ur'سست': u'زخم|رگ|ریش|عنصر',
    ur'سنگ': u'فرش',
    ur'دو|سه|چهار': u'پایه',
    ur'سیاه': u'مست|سوخته|چرده',
    ur'سینه': u'چاک',
    ur'شب': u'رنگ|پره|اداری',
    ur'شبانه': u'روزی',
    ur'شکسته': u'ناخن|مزاج',
    ur'شلم': u'شوربا',
    ur'شوخ': u'طبع|رو|دیده|چشم',
    ur'شوم|نیک|بلند|بد': u'اختر|اقبال',
    ur'شوی': u'دیده',
    ur'شیرین': u'عقل|دهن',
    ur'صد': u'شاخ',
    ur'قتل|بار': u'عام',
    ur'صف': u'آوار',
    ur'ضرب': u'المثل|العجل',
    ur'طبقه|زمان|درجه|رده|رتبه|دسته|جمله|تقسیم|بسته|آرماتور|اسکلت|امتیاز|بخش|جدول|جمع|جناح|رنگ|ساز|سایز|سرهم|سطح|شرط|شکم|فاز|فصل|قاب|پارتیشن|چشم|کادر|کمر|گاو|نیم': u'بند',
    ur'طوطی': u'وار',
    ur'طویل': u'المدت',
    ur'طی': u'الارض',
    ur'هنر|عاشق': u'پیشه',
    ur'عالی': u'نسب',
    ur'عام': u'المنفعه',
    ur'عدیم': u'النظیر',
    ur'عقب': u'گرد|نشینی',
    ur'علی': u'البدل',
    ur'عیال': u'وار',
    ur'غلط': u'غلوط',
    ur'فارغ': u'الاکناف|التحصیل',
    ur'فراخ': u'رو|شکم|بال|کام|دیده|سخن|آهنگ|دست|آستین|ابرو|روزی',
    ur'فرخ': u'لقا|دیم|فال|پی',
    ur'فرمان': u'روا|بر',
    ur'فرنگی': u'مآب',
    ur'غیر': u'قابل|متعهد|اخلاقی|شرعی|انسانی|اصولی|مجاز|حضوری|دولتی|نظامی|انتفاعی|منتظره|قانونی|معمولی|ممکن|رسمی|فعال|نفتی|منقول|ارادی|جایز|طبیعی|عادی|عمد|لازم|مسئول|عادلانه|خودی|عاقلانه|کافی',
    ur'وفا|فره|نیاز|جفا|خرد|غیرت|باور|ارزش|نعل|درد|علاقه': u'مند',
    ur'فرو': u'نهادن|داشت|گذاشت|مایه|بست|پاشی|پاشیده',
    ur'فوق': u'الذکر',
    ur'خارق|فوق': u'العاده',
    ur'کیلو|سانتی|میلی|دسی|نانو|ولت': u'متر|آمپر|گرم',
    ur'قاچ': u'قاچ',
    ur'قافله': u'سالار',
    ur'قایم': u'الزاویه',
    ur'قدسی': u'مآب',
    ur'قره': u'قاطی',
    ur'قریب': u'الوقوع',
    ur'کاه|قطره|دله|آفتابه': u'دزد',
    ur'قوی': u'پنجه',
    ur'قیمه': u'قیمه',
    ur'کاسه': u'یکی|سیاه|لیس',
    ur'کج': u'نهاد|خلق|کلاه',
    ur'کلاه': u'گوشه|گذار',
    ur'کله': u'معلق|خشک|گنده|خر|شق|پوک',
    ur'زبانه|زمین|ماشین|فرمان|کمان|کنگره|گوشه|دامنه|خانه|پول|مقام|آ[یئ]ینه': u'دار',
    ur'کهن': u'سال|دیار',
    ur'کینه': u'توز|ورز',
    ur'گران': u'مغز|سایه|قدر|رکاب|سرشت|پایه|قیمت|روح|سنگ|جان|سر|فروش',
    ur'گربه': u'گون|کوره',
    ur'گشاده': u'رو|دست',
    ur'گل': u'چهره|ریزان|ریز|گون|باران|آرا|اندام|برگ',
    ur'گلوله': u'باران',
    ur'ناهم|هم|گندم': u'گون',
    ur'لازم': u'الوصول|الاجراء',
    ur'مشکوک|معلوم|مجهول|فارغ': u'الحال',
    ur'لت': u'لت|انبان|انبار',
    ur'لسان': u'الغیب',
    ur'مالک': u'الرقاب',
    ur'ماه': u'طلعت',
    ur'مشغول': u'الذمه',
    ur'معظم': u'له|القدر',
    ur'ملی|همجنس|زمینه': u'گرا',
    ur'میرزا': u'قلمدان|قشمشم|بنویس',
    ur'ناخن': u'خشک',
    ur'نازک': u'نی|نارنجی|خیال',
    ur'جهان|نافه': u'گشا',
    ur'ندید': u'بدید',
    ur'نظریه|رویا|رؤیا': u'پرداز',
    ur'نقشه|وزنه|بهره|کلاه': u'بردار',
    ur'نق': u'نقو',
    ur'نگون': u'طشت|بخت',
    ur'نیک': u'روز|انجام|پی|اختر|بخت',
    ur'نیم': u'ته|بسمل',
    ur'هرکن': u'پرکن',
    ur'همایون': u'فال|آثار|بخت',
    ur'همه': u'کاره|جانبه',
    ur'هیچ': u'کاره|گاه|یک|کس|کدام',
    ur'ول': u'خرج|معطل',
    ur'یکه': u'شناس|بزن|سوار|تاز',
    ur'ابجد': u'خوان',
    ur'ابر': u'آلود|قدرت|ابزار',
    ur'ابو': u'العجب|الکلام|الهول',
    ur'اولو': u'الالباب|الامر|العزم',
    ur'حسب|صاحب|واجب': u'الامر',
    ur'گل|آذر': u'گون',
    ur'آزاد': u'مرد|وار',
    ur'باز': u'خرید|خواست|دید|بین',
    ur'بر': u'هم|آشفتگی|آشفته|پایی',
    ur'بلند': u'آوازه|پایه',
    ur'آتش': u'بس|نشان|سوزی|افروز|افکن|افزار',
    ur'پا': u'برجا|برهنه|بست|پتی|کار',
    ur'پایه|بنیان': u'گذار|گذاری',
    ur'پر': u'ابهام|ابهت|اتلاف|ادا|ادویه|ازدحام|استرس|استقامت|اشک|برخورد|ترانه|تردد|ترشح|تشبیه|تصادف|تعصب|تقلب|تلاش|تملق|شور',
    ur'کم': u'محل|بضاعت|کم|یاب',
    ur'پر|کم': u'نظیر|کار|تعداد|اشتباه|اشکال|اهمیت|تحرک|تحول|ترافیک|تراکم|تقاضا|تکرار|تنش|تنوع|رو|آب',
    ur'تنگا': u'تنگ',
    ur'تیز': u'پا|دست|دندان|هوش|بین',
    ur'چادر|تخت|زاغه|شهر|ته|آب|کاخ|پایتخت|یکجا|ییلاق': u'نشین',
    ur'چهار': u'شانه',
    ur'ویروس': u'شناس|یاب',
    ur'یاد': u'داشت|دهی',
    ur'یار': u'کشی',
    ur'ی[اأ]س': u'آلود',
    ur'حاضر': u'جواب|یراق',
    ur'خرد': u'سال',
    ur'دو': u'برجی|تخمه|سره|قلو|به‌شک',
    ur'ذو': u'الجلال|العرش|القدر|القوافی|اللسانین|المجد|المکارم|المن|المناقب|المنن|النور|الوجهین|جسدین',
    ur'رنگا': u'رنگ',
    ur'رو': u'سفید|سیاه|باز',
    ur'قهوه|نگار|آبدار|گل|کتاب': u'خانه',
    ur'روز': u'افزون|انه',
    ur'زود': u'باور',
    ur'شاد': u'روان|کام|مان|مانه',
    ur'فرا': u'خور|روی',
    ur'کد': u'خدا|بانو',
    ur'گردا': u'گرد',
    ur'لا': u'ابالی|جون|کردار|مذهب|مروت|یتغیر|یتناهی|یزال|یعقل',
    ur'نا': u'جوانمرد|خودآگاه|نجیب|امید|آزموده|آشنا|آگاه|برابر|تمام',
    ur'ایمن|پیاده|مقاوم|امن|ساده|بهینه|مرتب|آماده|رها|آگاه|زیبا|یکسان|روان|ذخیره|استاندار|متمایز|جدا|شخصی|انبوه|خصوصی': u'سازی',
}

# ----------------------------------------Wrong dictations-----------------------

forReplace = {  # 'میسیسیپی': u'می‌سی‌سی‌پی',
    # 'هاوی': u'حاوی', ممکن است اسم خاص باشد
    # 'سوماً': u'سوم',
    # 'سوما': u'سوم',
    # 'دوماً': u'دوم',
    # 'دوما': u'دوم',
    # 'جانا': u'جانی', باگ در [[جانا رودین]]
    # 'طوسی': u'توسی', خواجه نصیرالدین طوسی را به تبدیل می کرد
    # برپایه http:#www.persianacademy.ir/fa/pishvand.aspx
    # بدل از تنوین
    ur'به شخصه': u'بشخصه',
    ur'به‌شخصه': u'بشخصه',
    ur'به عینه': u'بعینه',
    ur'به‌عینه': u'بعینه',
    ur'احمدی نژاد': u'احمدی‌نژاد',
    ur'جابه جا': u'جابه‌جا',
    ur'جا به جا': u'جابه‌جا',
    ur'جا به‌جا': u'جابه‌جا',
    ur'بی بی سی': u'بی‌بی‌سی',
    ur'اف بی آی': u'اف‌بی‌آی',
    ur'می سی سی پی': u'می‌سی‌سی‌پی',
    ur'ویژه‌گی': u'ویژگی',
    ur'دایره‌المعارف': u'دایرةالمعارف',
    ur'دایره المعارف': u'دایرةالمعارف',
    ur'تأئید': u'تأیید',
    ur'تائید': u'تأیید',
    ur'بقیه‌الله': u'بقیةالله',
    ur'بقیه الله': u'بقیةالله',
    ur'بقیة الله': u'بقیةالله',
    ur'دگمه': u'دکمه',
    ur'وحله': u'وهله',
    ur'نقطه‌نظر': u'دیدگاه',
    ur'ناچاراً': u'به‌ناچار',
    ur'ناچارا': u'به‌ناچار',
    ur'منیت': u'منی',
    ur'منیٔت': u'منی',
    ur'فرآیند': u'فرایند',
    ur'فرآیندها': u'فرایندها',
    ur'کارآیی': u'کارایی',
    ur'ملاحضه': u'ملاحظه',
    ur'ملیون': u'میلیون',
    ur'ملیارد': u'میلیارد',
    ur'مطمعن': u'مطمئن',
    ur'مرهمت': u'مرحمت',
    ur'مرحم': u'مرهم',
    ur'محصوب': u'محسوب',
    ur'مذبور': u'مزبور',
    ur'متعصفانه|متاصفانه': u'متأسفانه',
    ur'متغییر': u'متغیر',
    ur'لشگر': u'لشکر',
    ur'لحجه': u'لهجه',
    ur'گاهاً': u'گاهی',
    ur'گاها': u'گاهی',
    ur'کهکیلویه': u'کهگیلویه',
    ur'قائله': u'غائله',
    ur'فارق‌التحصیل': u'فارغ‌التحصیل',
    ur'علاالدین': u'علاءالدین',
    ur'علم‌شنگه': u'الم‌شنگه',
    ur'غلطاندن': u'غلتاندن',
    ur'ظبط': u'ضبط',
    ur'طنبور': u'تنبور',
    ur'طپش': u'تپش',
    ur'ضمینه': u'زمینه',
    ur'زخامت|ذخامت': u'ضخامت',
    ur'زخیم|ذخیم': u'ضخیم',
    ur'صحفه': u'صفحه',
    ur'سفارشاً': u'سفارشی',
    ur'سفارشا': u'سفارشی',
    ur'سرلشگر': u'سرلشکر',
    ur'سپاسگذار': u'سپاسگزار',
    ur'خبرگذار': u'خبرگزار',
    ur'ساتع': u'ساطع',
    ur'زنده‌گی': u'زندگی',
    ur'زباناً': u'زبانی',
    ur'زبانا': u'زبانی',
    ur'رهبریت': u'رهبری',
    ur'در باره': u'درباره',
    ur'دوئیت': u'دوگانگی',
    ur'داوطلبین': u'داوطلبان',
    ur'خوشنود': u'خشنود',
    ur'خوبیت': u'خوبی',
    ur'خوانواده': u'خانواده',
    ur'خواستگاه': u'خاستگاه',
    ur'خرشید': u'خورشید',
    ur'خردن': u'خوردن',
    ur'خانند': u'خوانند',
    ur'خابیدن': u'خوابیدن',
    ur'حظور': u'حضور',
    ur'حظرت': u'حضرت',
    ur'حدلامکان': u'حتی‌الامکان',
    ur'حاظر': u'حاضر',
    ur'چهارماً': u'چهارم',
    ur'چهارما': u'چهارم',
    ur'چارشنبه': u'چهارشنبه',
    ur'جاناً': u'جانی',
    ur'توجیح': u'توجیه',
    ur'توضیع': u'توزیع',
    ur'تلوزیون': u'تلویزیون',
    ur'تضاهر': u'تظاهر',
    ur'ترجیه': u'ترجیح',
    ur'پنچ': u'پنج',
    ur'پزشگی': u'پزشکی',
    ur'پرفسور': u'پروفسور',
    ur'پاتوغ': u'پاتوق',
    ur'بی‌مهابا': u'بی‌محابا',
    ur'بنیانگزار': u'بنیانگذار',
    ur'بلقور': u'بلغور',
    ur'بلاخره': u'بالاخره',
    ur'برخواستن': u'برخاستن',
    ur'برعلیه': u'علیه',
    ur'برخواست': u'برخاست',
    ur'بدیت': u'بدی',
    ur'باطلاق': u'باتلاق',
    ur'بازرسین': u'بازرسان',
    ur'بارگزار': u'بارگذار',
    ur'باجناق': u'باجناغ',
    ur'باباقوری': u'باباغوری',
    ur'آروق': u'آروغ',
    ur'انظباط': u'انضباط',
    ur'التفاط': u'التفات',
    ur'افضل‌تر': u'بهتر',
    ur'افسنطین': u'افسنتین',
    ur'اعلم‌تر': u'داناتر',
    ur'اطو': u'اتو',
    ur'اطراق': u'اتراق',
    ur'اطاق': u'اتاق',
    ur'اصطرلاب': u'اسطرلاب',
    ur'ارتقاع': u'ارتقا',
    ur'اختاپوث': u'اختاپوس',
    ur'ابولفضل': u'ابوالفضل',
    ur'امپراطور': u'امپراتور',
    ur'آزوقه': u'آذوقه',
    ur'ذکام': u'زکام',
    ur'بگیر و ببند': u'بگیر ببند',
    ur'ساز و کار': u'سازوکار',
    ur'جر و بحث': u'جربحث',
    ur'خوار و بار': u'خواربار',
    ur'احجام': u'حجم‌ها',
    ur'اقشار': u'قشرها',
    ur'لازم به ذکر است': u'لازم است ذکر شود',
    ur'بدلیل': u'به دلیل',
    ur'آن‌را': u'آن را',
    ur'این‌را': u'این را',
    ur'هیات': u'هیئت',
    ur'هیأت': u'هیئت',
    ur'رییسه': u'رئیسه',
    ur'رییس': u'رئیس',
    ur'مساله': u'مسئله',
    ur'مسأله': u'مسئله',
    ur'همین جا': u'همین‌جا',
    ur'همینجا': u'همین‌جا',
    ur'همینطور': u'همین‌طور',
    ur'همین طور': u'همین‌طور',
    ur'همان جا': u'همان‌جا',
    ur'همانجا': u'همان‌جا',
    ur'همان طور': u'همان‌طور',
    ur'همانطور': u'همان‌طور',
    ur'هیچکدام': u'هیچ‌کدام',
    ur'هیچ کدام': u'هیچ‌کدام',
    ur'هیچکس': u'هیچ‌کس',
    ur'هیچ کس': u'هیچ‌کس',
    ur'هیچیک': u'هیچ‌یک',
    ur'هیچ یک': u'هیچ‌یک',
    ur'هم‌دیگر': u'همدیگر',
    ur'آن چه': u'آنچه',
    ur'آن‌چه': u'آنچه',
    ur'چنان چه': u'چنانچه',
    ur'چنانچه': u'چنانچه',
    ur'چنان که': u'چنان‌که',
    ur'چنانکه': u'چنان‌که',
    ur'ئیدروژن': u'هیدروژن',
    ur'بعضن': u'بعضاً',
    ur'غالبن': u'غالباً',
    ur'کاملن': u'کاملاً',
    ur'احتمالن': u'احتمالاً',
    ur'اصلن': u'اصلاً',
    ur'اشتباهن': u'اشتباهاً',
    ur'منشاء': u'منشأ',
    ur'مبداء': u'مبدأ',
}

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


def my_replace(match, word1, word2):
    match = match.group()
    return match.replace(word1, word2)


def quotation(text):
    # این تابع زمانی گیومه را به فارسی تیدیل می‌کند که در پاراگراف مورد نظر تعداد گیومهٔ لاتین زوج باشد.

    lines = text.split(ur'\n')
    result = []
    for i in range(0,len(lines)):
        line = lines[i]

        # رفع مشکل استفاده از ـً به جای گیومه لاتین در متن فارسی

        line = re.sub(ur'ا\"([ ]*[' + persianCharacters + ur'])', u'اً\\1',line)

        # ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters+ ur'\:>،»؛\s\n\}\]\.]+)“((?:\[\[|).*?['+ persianCharacters+ ur'\n]+?(?:\]\]|\.|\<|\:|))”(['+ persianCharacters+ ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)
        # وارونه ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)"((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))"(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # وارونه ”“ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)”((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))“(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # ‘’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)‘((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))’(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # وارونه ‘’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)’((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))‘(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # ‚’ تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)‚((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|\{|\[|))’(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # „” تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)„((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))”(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # << >> تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)\<\<((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))\>\>(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)

        # (()) تبدیل

        line = re.sub(ur'(^|[' + persianCharacters
                            + ur'\:>،»؛\s\n\}\]\.]+)\(\(((?:\[\[|).*?['
                            + persianCharacters
                            + ur'\n]+?(?:\]\]|\.|\<|\:|))\)\)(['
                            + persianCharacters
                            + ur'،«؛\s\n\.\[\{]|$)', u'\\1«\\2»\\3',line)
        result.append(line)
    return ur'\n'.join(result)


def dictationReplace(x,y,extensions,text):
    Regex=ur'(^|[^' + persianCharacters + ur'])(\s|\u200c|_|)(' + x + ur')(\s|_)('+ y + ur')(\s|\u200c|_|)(' + extensions + ur')(\n|[^' + persianCharacters + ur'])'
    text = re.sub(Regex,u'\\1\\2\\3\u200c\\5\\6\\7\\8',text)
    return text


def complex_replace(txt, pat, w1, w2):
    def function(s):
        return s.group(1)+s.group(2).replace(w1, w2,1)+s.group(3)+s.group(4)
    txt=re.sub(re.compile(pat),function,txt)
    return txt


def dictation(text):
    for i in complexes:
        if complexes.has_key(i):
            text = dictationReplace(i, complexes[i],
                                    ur'ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # for last name

    text = dictationReplace(personNames,
                            ur'ی|یی|زاده|نیا|گان|فر|نژاد|یان|ی\u200cها|یها'
                            , ur'ی|', text)

    # for 'آباد's

    text = dictationReplace(personNames + ur'|' + addToAbad, ur'آباد',
                            ur'زاده|نیا|پور|گان|فر|نژاد|ی|یان|ها|های|یی|هایی|ی\u200cها|یها|'
                            , text)

    # for first names

    for i in firstNameComplex:
        if firstNameComplex.has_key(i):
            text = re.sub(ur'(^|[^' + persianCharacters
                                + ur']|\s|_)(' + i + ur')(\s|_)('
                                + firstNameComplex[i]
                                + ur')(\s|_)($|[^' + persianCharacters
                                + ur']|[' + persianCharacters + ur'])',
                                u'\\1\\2\u200c\\4\\5\\6',text)

    # for colors

    text = dictationReplace(colorsNames, ur'فام|گون', ur'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|ی\u200cها|یها|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # for numbers

    text = dictationReplace(persianNumbers, ur'گانه|ماهه', ur'زاده|نیا|پور|گان|فر|نژاد|ی|یی|ها|های|هایی|هایم|هایت|هایش|هایمان|هایتان|هایشان|', text)

    # wrong dictation

    for i in forReplace:
        if forReplace.has_key(i):
            text = re.sub(ur'(^|[^' + persianCharacters
                                + ur'])(\s|\u200c|_|)(' + i
                                + ur')(\s|\u200c|_|)($|[^'
                                + persianCharacters + ur'])', u'\\1\\2'
                                + forReplace[i] + u'\\4\\5',text)

    # کلماتی که آ دارند

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("+ wordsWithA+ ur")(ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\]|\s|\:|\)|\<|\>|؟|\'|\!|$)", u'\u0627', ur'آ')

    # بن مضارع که آ دارند

    text = complex_replace(text,
                           ur"(^|\u200c|\s|_|«|»|\[|\(|\<|\>|\')("
                           + PresentVerbsWithA
                           + ur")(م|ی|د|یم|ید|ند)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'آ')

    # بن ماضی که آ دارند

    text = complex_replace(text,
                           ur"(^|\u200c|\s|_|«|»|\[|\(|\<|\>|\')("
                           + PastVerbsWithA
                           + ur")(م|ی|د|یم|ید|ند)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'آ')

    # همزه ضم

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                           + HamzehZam
                           + ur")(‌ها|ها|ین|ان|ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0648', ur'ؤ')

    # همزه نصب

    text = complex_replace(text, ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                           + HamzehNasb
                           + ur")(ی|ئی|یی|ٔ|)( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                           , u'\u0627', ur'أ')

    # همزه وسط کلمه

    for i in HamzehAtInside:
        if HamzehAtInside.has_key(i):
            text = re.sub(ur"(^|\s|_|«|»|\[|\(|\<|\>|\')(" + i
                                + ur')(| )(' + HamzehAtInside[i]
                                + ur")(?= |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2ء\\4',text)  # در مورد افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.

            # الف مقصوره
            text = re.sub(ur"(^|\s|_|«|»|\[|\(|\<|\>|\')(" + HamzehAtEnd + ur")(?= |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)",u'\\1\\2ء',text)

            text = complex_replace(text,
                                   ur"(^|\s|_|«|»|\[|\(|\<|\>|\')("
                                   + AlefMaghsooreh
                                   + ur")(| )( |«|»|\.|،|_|\s|\]|\:|\)|\<|\>|؟|\!|\'|$)"
                                   , u'\u0627', ur'ی')

            # صفت+تر

            text = re.sub(ur"(^|\s|_|«|»|\]|\[|\(|\<|\>|\')("
                                + adjective
                                + ur")( |_)تر(?= |«|»|\.|\[|\]|،|_|\s|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2\u200cتر',text)

            # اسامی رنگ‌ها (به‌عنوان صفت)+تر

            text = re.sub(ur"(^|\s|_|«|»|\]|\[|\(|\<|\>|\')("
                                + colorsNames
                                + ur")( |_)تر(?= |«|»|\.|\[|\]|،|_|\s|\:|\)|\<|\>|؟|\!|\'|$)"
                                , u'\\1\\2\u200cتر',text)

            text = re.sub(ur"به دست\u200cآورد", u'به دست آورد',text)  # Solving a bug!
    def function(s):
        return s.group(1)+s.group(2)[:-1]+u'اً'+s.group(3)
    regex=ur"(^|[؛\s\n\.،«»\'\"\<\>؟])(" + needsNasb + ur')[' + NASB + ZAMM + ur']?([؛؟\s\n\.،«»\'\"\<\>]|$)'
    text=re.sub(regex,function,text, re.UNICODE)
    return text


def normalizeZwnj(text):
    text = re.sub(ur"\u200c{2,}", ur"\u200c",text)

    # Clean ZWNJs after characters that don't conncet to the next letter

    text = \
        re.sub(ur"([۰-۹0-9إأةؤورزژاآدذ،؛,\:«»\\/@#$٪×\*\(\)ـ\-=\|ء])\u200c"
                     , u'\\1',text)

    # Clean ZWNJs before and after English characters

    text = re.sub(ur"\u200c([\w])", u'\\1',text)
    text = re.sub(ur"([\w])\u200c", u'\\1',text)

    # Clean ZWNJs before and after Persian characters

    text = re.sub(ur'\u200c([' + vowels + arabicIndicDigits
                        + persianDigits + hamza + '])', u'\\1',text)
    text = re.sub(ur'([' + arabicIndicDigits + '])\u200c', u'\\1',text)
    text = re.sub(ur"([\w])\u200c", u'\\1',text)

    # Clean ZWNJs after and before punctuation

    text = re.sub(ur"\u200c([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\|])", u'\\1',text)
    text = re.sub(ur"([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\|])\u200c", u'\\1',text)

    # Clean ZWNJs before brakets which have sapce after\before them

    text = re.sub(ur"\u200c(\][\s\n])", u'\\1',text)
    text = re.sub(ur"([\n\s]\[)\u200c", u'\\1',text)
    return text


def toStandardPersianCharacters(text):
    for i in persianGlyphs:
        text = re.sub(ur'[' + persianGlyphs[i] + ur']', i,text)
    text = normalizeZwnj(text)
    text = text.replace(ur"ك", ur'ک')  # Arabic
    text = text.replace(ur"ڪ", ur'ک')  # Urdu
    text = text.replace(ur"ﻙ", ur'ک')  # Pushtu
    text = text.replace(ur"ﻚ", ur'ک')  # Uyghur
    text = text.replace(ur"ي", ur'ی')  # Arabic
    text = text.replace(ur"ى", ur'ی')  # Urdu
    text = text.replace(ur"ے", ur'ی')  # Urdu
    text = text.replace(ur"ۍ", ur'ی')  # Pushtu
    text = text.replace(ur"ې", ur'ی')  # Uyghur
    text = text.replace(ur"ہ", ur'ه')  # Convert &#x06C1; to &#x0647; ہہہہ to ههه
    text = re.sub(ur"ە", u'ه\u200c',text)  # Kurdish
    text = text.replace(ur"ھ", ur'ه')  # Kurdish
    return text


def applyOrthography(text):
    text = text.replace(ur"\r", ur'')

    # تمیزکاری autoFormatter.js

    text = re.sub(ur"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF]+", u'',text)
    text = re.sub(ur"[ \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n", u'\n',text)

    # تبدیل تب و فاصله نشکن اول خط به هیچ چون مدیاویکی آن را در نظر نمی‌گیرد

    #text = re.sub(ur"\n[\t\u00A0]+", u'\n',text)

    # تبدیل انواع فاصله‌ها به فاصله ساده

    text = re.sub(ur"[\u0020\u0085\u00A0\u180E\u2000-\u200A\u202F\u205F\u3000]", u' ',text)
    text = re.sub(ur"[\u0085]", u'',text)

    # http:#kb.mozillazine.org/Network.IDN.blacklist_chars

    text = re.sub(ur"[\u01C3\uFE15]", u'!',text)
    text = re.sub(ur"[\u02D0\u0589\u05C3\uA789]", u': ',text)
    text = re.sub(ur"[\u0338\u2044\u2215\u2571\u29F8\u3033\uFF0F]", u'/',text)
    text = re.sub(ur"[\u05F4]", u'"',text)
    text = re.sub(ur"[\u06D4\u0701\uFF0E\uFF61]", u'.',text)
    text = re.sub(ur"\u3014", u'(',text)
    text = re.sub(ur"\u3015", u')',text)

    # جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله

    text = re.sub(ur"ۀ(?![\s\n])", u'هٔ ',text)

    # Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ

    text = re.sub(ur"ه[\u200c\u200e\s]+ی([\s\n])", u'هٔ\\1',text)

    # Replace ه followed by (space|ZWNJ|lrm|nothing) follow by ء or with هٔ

    text = re.sub(ur"ه[\u200c\u200e\s]*[ءٔ]([\s\n])", u'هٔ\\1',text)

    # Replace هٓ or single-character ۀ with the standard هٔ

    text = re.sub(ur"(ۀ|هٓ)", u'هٔ',text)

    # Replace ه followed by ئ or ی, and then by ی, with ه\u200cای, example: خانهئی becomes خانه\u200cای

    text = re.sub(ur"ه\u200c[ئی]ی", u'ه\u200cای',text)

    # def for removing incorrect ZWNJs

    text = re.sub(ur"([\u200c\u200e])([\s\n])", u'\\2',text)
    text = re.sub(ur"([\s\n])([\u200c\u200e])", u'\\1',text)

    # فاصلهٔ پیش از واکه\u200cهای کوتاه اشتباه است و برای جلوگیر از به هم چسبیدن کلمات فاصله و واکه جابجا باید گردند.

    text = re.sub(ur'([' + persianCharacters + vowels + hamza+ ur'])(\s)([' + vowels + hamza + ur'])',u'\\1\\3\\2',text)

    # واکه\u200cهای کوتاه پشت سرهم نمی\u200cآیند و یک حرف باید بینشان فاصله باشد

    text = re.sub(ur'([' + vowels + hamza + ur']){2,}', u'\\1',text)
    text = re.sub(ur"ئء", ur'یء',text)  # two hamzes after each other
    text = re.sub(ur"أء", ur'اء',text)  # two hamzes after each other
    text = re.sub(ur"ؤء", ur'ؤ',text)  # two hamzes after each other

    # .replace(ur"وء", ur'ؤ')#bug on  سوء

    text = re.sub(ur"سؤ ?استفاده", ur'سوءاستفاده',text)  # bug on سوءاستفاده و سوء

    # افزودن همزه

    text = re.sub(ur"درباره (ام|ات|اش|مان|تان|شان|ای)( |$)",u'درباره‌\\1\\2',text)  # i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
    text = re.sub(ur"درباره ", ur'دربارهٔ ',text)
    text = re.sub(ur'صفحه( |)([' + persianDigits + ']+)(\n|\.|\,|\||\<)', u'صفحهٔ \\2\\3',text)  # [[Special:PermaLink/15326391#افزودن همزه]]
    return text


def complexVerbsApplyZwnj(text):
    for x in persianComplexPastVerbs:
        y = persianComplexPastVerbs[x]
        text = re.sub(ur'(^|[^' + persianCharacters + ur'])(' + x
                            + ur') ?(می|نمی|)( |\u200c|)(ن|)(' + y
                            + ur')(م|ی|یم|ید|ند|ه|ن|)($|[^'
                            + persianCharacters + ur'])',
                            u'\\1\\2\u200c\\3\u200c\\5\\6\\7\\8',text)

    for x in persianComplexPresentVerbs:
        y = persianComplexPresentVerbs[x]
        text = re.sub(ur'(^|[^' + persianCharacters + ur'])(' + x
                            + ur') ?(می|نمی|)( |\u200c|)(ن|)(' + y
                            + ur')(م|ی|د|یم|ید|ند|ن)($|[^'
                            + persianCharacters + ur'])',
                            u'\\1\\2\u200c\\3\u200c\\5\\6\\7\\8',text)

    return text


def applyZwnj(text):
    text = re.sub(ur'(^|[^' + persianCharacters + ur'])(می|نمی) ?'
                        + persianPastVerbs + ur'(م|ی|یم|ید|ند|ه|)($|[^'
                        + persianCharacters + u'])', u'\\1\\2\u200c\\3\\4\\5',text
                        )
    text = re.sub(ur'(^|[^' + persianCharacters + ur'])(می|نمی) ?'
                        + persianPresentVerbs
                        + ur'(م|ی|د|یم|ید|ند)($|[^' + persianCharacters
                        + ur'])', u'\\1\\2\u200c\\3\\4\\5',text)

    # بن فعل مضارع «دان» جدا آمد چون پسوند «ی» با عبارت «میدانی» تداخل داشت

    text = re.sub(ur'(^|[^' + persianCharacters
                        + ur'])(می|نمی) ?(دان)(م|د|یم|ید|ند)($|[^'
                        + persianCharacters + ur'])', u'\\1\\2\u200c\\3\\4\\5',text
                        )

    # ای «توان» ناقلا!

    text = re.sub(ur"(\s)(می|نمی) ?توان", u'\\1\\2\u200cتوان',text)

    # چسباندن تمام «ها»ها با فاصلهٔ مجازی

    text = re.sub(ur" ها([\]\.،\:»\)\s]|\'{2,3}|\={2,})",u'\u200cها\\1',text)
    text = re.sub(ur" ها(ی|یی|یم|یت|یش|مان|تان|شان)([\]\.،\:»\)\s])", u'\u200cها\\1\\2',text)
    text = re.sub(ur"هها", u'ه‌ها',text)

    # چسباندن تمام «ترین»ها با فاصلهٔ مجازی

    text = re.sub(ur" ترین([\]\.،\:»\)\s]|\'{2,3}|\={2,})",u'\u200cترین\\1',text)

    # برای حذف علامت ستاره اضافی قبل از عنوان ها

    text = re.sub(ur"\n\*\s*(\=+.+?\=+\n)", u'\n\\1',text)

    # عضو علامت های نقل قول تکی از عنوان ها

    text = re.sub(ur"(\n=+)(.*?)(?:'+)(.*?)(?:'+)(.*?)(=+\n)", u'\\1\\2\\3\\4\\5',text)

    # اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود

    text = re.sub(ur"(^\u200c|\u200c$)", u'',text)

    # شناسه ها
    # توجه: «است» تعدماً از شناسه ها حذف شده چون به عنوان فعل مستقل هم کاربرد دارد و در آن موارد باید جدا نوشته شود
    # مثال: «این یک خانه است» که است در آن باید از خانه جدا نوشته شود

    text = re.sub(ur'ه +(ام|ای|ایم|اید|اند)($|[^' + persianCharacters + ur'\u200c])', u'ه\u200c\\1\\2',text)

    # موارد جزئی دیگر و بی ربط به فاصلهٔ مجازی، باید منتقل شود

    text = re.sub(ur"ا\sً", u'اً',text)

    # رفع اشکال که\u200cای

    text = re.sub(ur" که\u200cای ", u' که ای ',text)

    # رفع اشکال میستری (Mystery)

    text = re.sub(ur"می\u200cستری", u'میستری',text)
    text = re.sub(ur'می\u200cگوی($|[^' + persianCharacters
                        + ur'\u200c])', u'میگوی\\1',text)  # for میگوی دریایی
    text = re.sub(ur'می\u200cدوی($|[^' + persianCharacters
                        + ur'\u200c])', u'میدوی\\1',text)  # for [[میدوی (ابهام‌زدایی)]]
    return text


def punctuation(text):
    # / سجاوندی غیرفارسی

    text = re.sub(ur"ː", u': ',text)  # Replace incorrect : character

    # استفاده از ؟ فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])[ ]*[?]',u'\\1؟',text)

    # استفاده از ; فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])[ ]*[;]',u'\\1؛ ',text)

    # استفاده از ، فارسی

    text = re.sub(ur'([' + persianCharacters + ur'])(\]\]|»|)[ ]*[,]', u'\\1\\2، ',text)

    # حذف دو فاصله بعد از سجاوندی

    text = re.sub(ur"(،|؛|؟|\.)  ", u'\\1 ',text)
    text = re.sub(ur"\r", u'',text)

    # افزودن یا حذف فاصله
    # حذف فاصله‌های تکراری میان واژه‌ها، به جز بین نام پارامتر و علامت مساوی

    text = re.sub(ur"(. ) +(?=[^= ])", u'\\1',text)

    # فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)

    text = \
        re.sub(ur"([،\.\؛\؟»])([^\s\.\(\)«»\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])"
                     , u'\\1 \\2',text)

    # افزودن فاصله به بعد از سجاوندی

    text = re.sub(ur'([' + persianCharacters
                        + ur']+|\]|\)|»)([؟،؛\!\.])(['
                        + persianCharacters + persianDigits
                        + ur']+|\[|\(|«)', u'\\1\\2 \\3',text)

    # حذف فاصله بعد از گیومه، پرانتز، براکت باز

    text = re.sub(ur"([\(«\[]) ", u'\\1',text)

    # حذف فاصله قبل از گیومه، پرانتز، براکت بسته

    text = re.sub(ur" ([\)»\]])", u'\\1',text)

    # افزودن فاصله قبل از گیومه باز

    text = re.sub(ur"([^ \(\[\|\r\n>'])(«)", u'\\1 \\2',text)
    text = re.sub(ur" +\( +", u' (',text)
    text = re.sub(ur'([' + persianCharacters
                        + ur']|\]|») *\( *(?=[' + persianCharacters
                        + ur'])(?!ها\)|ان\))', u'\\1 (',text)
    text = re.sub(ur'([' + persianCharacters + ur']) *\) *(?=['
                        + persianCharacters + ur']|\[|«)', u'\\1) ',text)

    # Removes extra line between two items list

    text = re.sub(ur"(\n\*.*?)\n+(?=\n\*)", u'\\1',text)

    # Removes extra line between two items list

    text = re.sub(ur"(\n#.*?)\n+(?=\n#)", u'\\1',text)

    # Convert , to ، if there are Persian characters on both sides of it

    text = re.sub(ur'([' + persianCharacters + ur']), ?(?=['
                        + persianCharacters + ur'])', u'\\1\\2، ',text)

    # بعد از نقطه‌ویرگول فارسی علامتی قرار نمی‌گیرد

    text = re.sub(ur"(؛)(([\s]+)?[\.،؛:!؟\-…])", u'\\1',text)

    # در انتهای پاراگراف نقطه‌ویرگول فارسی نمی‌آید

    text = re.sub(ur"(؛)(\s|)\n", u'.\n',text)

    # سجاوندی در ابتدای علامت باز قرار نمی‌گیرد

    text = re.sub(ur"([\(«])[\s]([؛\.،])", ur'\\1',text)

    # ویرگول فارسی
    # بعد از ویرگول فارسی این علامت‌ها قرار نمی‌گیرد

    text = re.sub(ur"(،)([\s]+)?([،؛!؟\-][\.،؛!؟\-]*|\.(?!\.))",
                        u'\\1',text)

    # نقطه
    # باید سه نقطه باشد

    text = re.sub(ur'([' + persianCharacters + ur'])( *)(\.{3,})'
                        , u'\\1\\2…',text)
    text = re.sub(ur" \.\.\. ", ur' … ',text)

    # بعد از نقطه این علایم نمی‌آیند

    text = re.sub(ur'([' + persianCharacters
                        + ur'])\.( *[،؛:!؟\?]+)', u'\\1.',text)

    # سجاوندی در ابتدای پرانتز و گیومه باز قرار نمی‌گیرد

    text = re.sub(ur'(\(|«)[\.،؛](\s|)([' + persianCharacters
                        + ur'])', u'\\1\\3',text)

    # سجاوندی در داخل پرانتز

    text = re.sub(ur'([' + persianCharacters
                        + ur'])(\s|)[\.،؛](\s|)(\))', u'\\1\\2\\3\\4',text)

    # در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد

    text = re.sub(ur'([' + persianCharacters
                        + ur'])(\s|)(\.)(\s|)(ولی|که\s|و\s|بنابراین|لذا)'
                        , u'\\1؛ \\5',text)

    # / Question & exclamation mark
    # علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
    # تكرار علامت سوال فارسی

    text = re.sub(ur"(؟(\s|)){2,}", u'؟',text)

    # علامت‌گذاری نادرست

    text = text.replace(ur'؟ !', ur'؟!').replace(ur'! ؟', u'!؟')

    # Remove space preceding punctuation, except for ellipses

    text = re.sub(ur"([^ \.]) +([؟،\:؛!\.])(\s[^ \.]|<|$)",
                        u'\\1\\2\\3',text)
    return text

def run (text):
    text = normalizeZwnj (text)
    text = quotation (text)
    text = dictation (text)
    text = toStandardPersianCharacters (text)
    text = applyOrthography (text)
    text = complexVerbsApplyZwnj (text)
    text = applyZwnj (text)
    text = punctuation (text)
    text = normalizeZwnj (text)
    return text

def test(num,txt,txt2):
    result=run (txt)
    if result!=txt2:
        print u'Case >' + txt
        print u'Expected >' + txt2
        print u'Result >'+ result
        print u'---------'
    else:
        print u'Test '+str(num)+u' > '+txt2+u' is OK!'

test (1,u'من نرم افزار را می گزاریم . متن',u'من نرم‌افزار را می‌گزاریم. متن')
test (2,u'متن '+ u'می انباشتم'+u' متن',u'متن '+ u'می‌انباشتم'+u' متن')
test (3,u'متن '+ u'می چسبم'+u' متن',u'متن '+ u'می‌چسبم'+u' متن')
test (4,u'متن '+ u'باز آفریدم'+u' متن',u'متن '+ u'بازآفریدم'+u' متن')
test (5,u'متن '+ u'باز آفرینم'+u' متن',u'متن '+ u'بازآفرینم'+u' متن')
test (6,u'متن '+ u'محمد زاده'+u' متن',u'متن '+ u'محمدزاده'+u' متن')
test (7,u'متن '+ u'هجوامیز'+u' متن',u'متن '+ u'هجوآمیز'+u' متن')
test (8,u'متن '+ u'ارام'+u' متن',u'متن '+ u'آرام'+u' متن')
test (9,u'متن '+ u'می ارامم'+u' متن',u'متن '+ u'می‌آرامم'+u' متن')
test (10,u'متن '+ u'می اشامید'+u' متن',u'متن '+ u'می‌آشامید'+u' متن')
test (11,u'متن '+ u'اتفاقا'+u' متن',u'متن '+ u'اتفاقاً'+u' متن')
test (12,u'متن '+ u'مودب'+u' متن',u'متن '+ u'مؤدب'+u' متن')
test (13,u'متن '+ u'تالیف'+u' متن',u'متن '+ u'تألیف'+u' متن')
test (14,u'متن '+ u'استثنا'+u' متن',u'متن '+ u'استثناء'+u' متن')
test (15,u'متن '+ u'سواستفاده'+u' متن',u'متن '+ u'سوءاستفاده'+u' متن')
test (16,u'متن '+ u'حتا'+u' متن',u'متن '+ u'حتی'+u' متن')
test (17,u'متن '+ u'زرد فام'+u' متن',u'متن '+ u'زردفام'+u' متن')
test (18,u'متن '+ u'دو گانه'+u' متن',u'متن '+ u'دوگانه'+u' متن')
test (19,u'متن '+ u'عیش آباد'+u' متن',u'متن '+ u'عیش‌آباد'+u' متن')
test (20,u'متن '+ u'ویکی پدیا'+u' متن',u'متن '+ u'ویکی‌پدیا'+u' متن')
test (21,u'متن '+ u'ﭖﭗﭘﭙ'+u' متن',u'متن '+ u'پپپپ'+u' متن')
test (22,u'متن '+ u'علی "گفت" من'+u' متن',u'متن '+ u'علی «گفت» من'+u' متن')
test (23,u'متن '+ u'علی <<گفت>> من'+u' متن',u'متن '+ u'علی «گفت» من'+u' متن')
test (24,u'متن '+ u'حمید رضا'+u' متن',u'متن '+ u'حمیدرضا'+u' متن')
test (25,u'متن '+ u'بزرگ تر'+u' متن',u'متن '+ u'بزرگ‌تر'+u' متن')
test (26,u'متن '+ u'کوچک ترین'+u' متن',u'متن '+ u'کوچک‌ترین'+u' متن')
test (27,u'متن '+ u'کتاب ها'+u' متن',u'متن '+ u'کتاب‌ها'+u' متن')
test (28,u'متن '+ u'نیم‌‌‌فاصله اضافی'+u' متن',u'متن '+ u'نیم‌فاصله اضافی'+u' متن')
test (29,u'متن '+ u'بعد از ر‌فاصله'+u' متن',u'متن '+ u'بعد از رفاصله'+u' متن')
test (30,u'متن '+ u'A‌B فاصله مجازی'+u' متن',u'متن '+ u'AB فاصله مجازی'+u' متن')
test (31,u'متن '+ u'ك عربی'+u' متن',u'متن '+ u'ک عربی'+u' متن')
test (32,u'متن '+ u'ي عربی'+u' متن',u'متن '+ u'ی عربی'+u' متن')
test (33,u'متن '+ u'ۀ غیر استاندارد'+u' متن',u'متن '+ u'هٔ غیر استاندارد'+u' متن')
test (34,u'متن '+ u'متن . نقطه'+u' متن',u'متن '+ u'متن. نقطه'+u' متن')
