ویکی‌پدیا:درخواست‌های ربات/ربات تصحیح غلط نگارشی/ویرایش ششم

از ویکی‌پدیا، دانشنامهٔ آزاد

<syntaxhighlight lang="python" line start="100">

  1. !/usr/bin/python
  2. -*- coding: utf-8 -*-
  3. BOT
  4. Copyright (C) 2011 ...
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License
  7. as published by the Free Software Foundation version 2.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

__version__ = '$Id: bot.py$'

import wikipedia, sys, pywikibot import pagegenerators import re, os, codecs, catlib

global txt msg = u'ربات: تصحیح‌کنندهٔ اشتباهات نگارشی' faChrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیيك' + u'\ ًٌٍَُِّْٓٔ' faNums = u'۰۱۲۳۴۵۶۷۸۹' arNums = u'٠١٢٣٤٥٦٧٨٩' enNums = u'0123456789' bnMazi = u'[آا]راست|[آا]را?مید|[آا]زرد|[آا]زمود|[آا]سود|[آا]شامید|[آا]شفت|[آا]فرید|[آا]لا[یئ]ید|[آا]لود|[آا]ما[هس]ید|[آا]مد|[آا]مرزید|[آا]م[یو]خت|آورد|[آا][هو]یخت|[آا]غ[شس]ت|ارزید|افتاد|افراشت|ا?فروخت|افزود|افسرد|ا?فشاند|اف[کگ]ند|انجامید|اند[او]خت|اندیشید|ان[بگ]اشت|نگاشت|انگیخت|ایستاد|با[خف]ت|با[لر]ید|[شب]ایست|بخش[یو]د|برازید|ب[ور]د|[چبپ]رید|[رجشب]ست|بلعید|پ[وا]شید|پخت|پذیرفت|پرا[کگ]ند|پرداخت|پرست?ید|پرورد|پرید|پژمرد|پژوهید|پسندید|پنداشت|[بپ]و[سشی]ید|پیچید|پیراست|پیمود|پیوست|تا[فخ]ت|تپید|ترا[وش]ید|تر[سشک]ید|تکانی?د|تنید|توانست|جن[بگ]ید|[جد]وش?ید|چرخید|چسبید|چ[مکشر]?ید|خر[او]شید|خ[مرز]ید|خشکید|خوابید|خو?است|خواند|خورد|خیسید|داد|داشت|[مد]انست|درخشید|دزدید|دوخت|ربود|راند|ر[مس]ید|رو?فت|رنجید|رو[یئ]ید|ریخت|زد|زدود|زیست|س[وا]خت|سپرد|س[تر]ود|ستیزید|سرشت|سزید|سنجید|ش[تکگ]افت|شد|شک?ست|ش[کگ]فت|شمرد|شناخت|شنید|شورید|طلبید|غلطید|فرستاد|فر[مس]ود|فریفت|فشرد|فهمید|قبولاند|کا[سش]ت|کاوید|ک[نر]د|کشت|کشید|کو[چش]ید|کوفت|گداخت|گذا?شت|گرا[یئ]ید|گردید|گرفت|گروید|گری[خس]ت|گزارد|گزید|گس[تا]رد|گسست|گ[فش]ت|گشود|گماشت|گنجید|ل[رغ]زید|ما[لس]ید|ماند|مرد|نا[مل]ید|نشست|نکوهید|نگاشت|ن?گریست|نمود|نواخت|نوردید|نوشت|نهاد|نهفت|نی?وشید|ور?زید|هراسید|هلید|یازید|یافت' bnMzare = u'[آا]را[یم]|[آا]زار|[آا]ماس|[آا]ز?مای|[آا]سای|[آا]شام|[آا]شوب|[آا]غا[رز]|[آا]فرین|[آا]گن|[آا]لای|[آا]ی|[آا]م[یور]ز|[آا]و?ر|[آا]ویز|[آا]هنج|ارز|افت|افر[او]ز|افزای|افسر|ا?فشان|اف[کگ]ن|انبار|انجام|اندا[یز]|اندوز|اندیش|ا?نگار|انگیز|اوبار|ایست|با[فلیشرز]|بخشای|بخش|براز|ب[َُ]?ر|بند|بساو|بسیج|بلع|بو[یس]?|بیز|پاش|پالای|پ[رز]|پذیر|پرا[کگ]ن|پرداز|پرست?|پرور|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پو[سشیک]|پیچ|پی[مر]ای|پیوند|تا[پز]|تو?پ|ترا[شو]|تر[سشک]|تکان|تن|توان|[نلجد]ه|جن[بگ]|جو[یش]?|چا[یپ]|چ[مکپشفر]|چر[خب]?|چسب?|چلان|چین|خا[یر]|خرا[مش]|خس[بت]|خشک|خروش|خ[ملرز]|خوا[نبه]|خو[فر]|خی[سز]|دا[نر]|درخش|درو?|دزد|[لد]م|دو[شز]?|ربای|ران|رخش|ر[سمه]|رو[یب]?|رشت|رقص|رنج|[بر]ی[نز]|زا[یر]|ز[ین]|زدای|ساز|سپا?ر|سپ؟وز|ستان|ستر|ستیز|سرای|سرشت|س[رز]|سنب|سگال|سنج|سای|شا[شی]|شتاب|شوی?|شک[او]ف|شکن|شکیب|ش[مو]ر|شناس|شنو|طلب|طوف|غارت|غرّ?|غلط|غنو|فرست|فر[سم]ای|فروش|فریب|فشر|فهم|قاپ|قبولان|کا[هرو]|ک[َُِ]?ش|ک[نف]|کو[چشب]|گای|گداز|گذا?ر|گرا[یز]|گرد|گیر|گرو|گریز?|گزار|گز|گزین|گس[تا]ر|گسی?ل|گشای|گو[یز]|گن[جد]|گ[مو]ار|ل[غر]ز|لن[گد]|لیس|ما[سلن]|میر|مک|مو[یل]|نا[زلم]|ن?شین|نکوه|نگا?ر|نمای|نواز|نورد|نویس|نهنب|نی?وش|ور?ز|هراس|هل|یا[برز]' noAlef = u'باجی|بادانی?|بادی?|بار|باژور|بافت|با[لن]|بانگا[نه]|بتاب|بجی?|بچین|بخس[بت]|بخواره|بخور[دشی]?|بخوست|بخیز|بدارچی|بدارخانه|بدار[وکی]?|بدستان|بدستی?|بدندان|بدنگ|بده|بدیده|براهه?|برفت|برو[دن]|بریز|بریزگان|بزن|بز[یه]|بژ|بسال|بسالان|بست|بستره|بست[نه]|بسکون|بسه|بسوار|بشار|بشتگاه|بشتن?|بشخور|بش[نیش]|بشنگ|بغوره|بفت|بک|بکار|ب‌?کافت|بکا[نم]ه|بکش|بکشین|بکند|بکوهه|بکی|بگاه|بگرد|بگردان|بگز|بگوشت|بگون|بگیر|بگینه|بلوج|بنوس|بوند|بونمان|بونه|بیار|پارات|پارتاید|پارتمان|پاراتی|پاندیس|پاندیسیت|تربان|ترمه|تروپین|تریاد|تشبار|تشبان|تشپا|تشخوار|تشدان|تشفشان|تشک|تشکده|تشگاه|تش[هی]?|تشیزه|تشین|تلیه|ته|تورپات|تیه|ثار|ثام|جاردن|جان|جودان|جید[نه]|جیل|جین|چار|چاردن|چارکشی|چمز|حاد|خال|خت[نه]|خر|خرالامر|خرالزمان|خرت|خردست|خرزمان|خریا؟ن|خ[سش]مه|خشیج|خشیجان|خشیگ|خور|خورچرب|خورخشک|خورسنگین|خوندبازی|خوندک?|دا[بشک]|دامس|دخ|درس|درمه?|درنگ|دمک|دمیت|دمیرال|دمیزاد|دنیس|دیش|دیند?ه|ذار|ذری?|ذربایجانی?|ذربو|ذرجشن|ذرخش|ذریو?ن|ذوقه|ذین|را[یء]|راستن|راسته|رام|رامانیدن|رامش|رامگاه|رامی|رامیدن|رایش|رایشگاه|رایشگر|راییدن|رتروز|رتزین|رتیست|رتیشو|رخالق|ردبیز|رده|ردینه|رزم|رزو|رزوخواه|رزومندی?|رشه|رشیتکت|رشیو|رغ|رغده|رگون|رمان|رمان‌?شهر|رمیچر|رمید[هن]|رن|رنائوت|رنج|رنگ|رواره|روبند|روغ|ری|ریا|ریستوکرات|ریستوکراسی|ریغ|زادگان|زادگی|زادمرد|زاد[یه]?|زادوار|زادی‌?خواه|زار|زارتلخه|زا?رد[نه]|زارنده|زاریدن|زال|زجوی|زخ|زدن|زرد|زردگی|زرم|زرمجو|زرمگین|زری|زغ|زفنداک|زگار|زما|زمایش|زمایشگاه|زماینده|زمایه|زمندی?|زمودگی|زمود[نه]|زمون|زناک|زور|زوغ|زوقه|زیدن|زیر|ژان|ژانس|ژخ|ژدار|ژده|ژغ|ژفنداک|ژگن|ژن[دگ]|ژندن|ژندیدن|ژیانه|ژید[نه]|ژیر|ژیرنده|ژیریدن|ژینه|سان|سانسور|سانی|سایش|سایشگاه|ساینده|ساییدن|سبان|سپیرین|ستانه|ستر|ستیگماتیسم|ستی[من]ه?|سدست|سغده|سفالت|سکاریس|سمانخانه|سمانخراش|سمان[هی]?|سموغ|سه|سودگی|سود[نه]|سیابان|سیاچرخ|سیازنه|سیاکردن|سیا[وب]?|سیایی|سیب|سیل|سی[من]ه|سیون|شا[بم]|شامیدن|شانه|شپز|شپزخانه|شتالنگ|شت[می]|شخال|شخانه|شردن|شرمه|شفتگی|شفت[نه]?|شکار|شکارساز|شکاره|شکوبه|شکو[بخ]?|شکوخیدن|شگر|شمالی?|شموغ|شنا|شناگر|شنا[هو]|شناوری|شنایی|شوب|شوب‌?گر|شوبیدن?|شور|شوردن|شوریده|شوغ|شوفتن|شیانه|شیهه|صال|غُش|غا|غاجی|غار|غاردن|غاری|غاریدن|غازگر|غاز[هی]?|غازیدن|غالش?|غالنده|غالید[نه]|غچه|غردن|غری?|غز|غ[سش]ت[نه]|غل|غندن|غنده|غو[زشل]|غوشیدن|غیل|فا[تق]|فاقی|فتاب[هی]?|فتومات|فدم|فرنگ|فروشه|فریدگار|فرید[نه]|فرین|فرینگان|فریننده|فگانه|فل|فند|فندیدن|فیش|ق|قا|قازاده|قاسی|ق‌?بانو|قچه|قسنقر|قشام|قطی|قورایی|قوش|کادمیک?|کاردئون|کام|ک[بپج]|کبند|کتریس|کتور|کروبات|کروباسی|کستن|ککرا|کله|کند[نه]|کنش|کنه|کنیدن|کواریوم|کوستیک|کولاد|کومولاتور|گاهاندن|گاهی?|گ[پج]|گراندیسمان|گرمان|گشتن|گفت|گنج|گنده|گهی|گو|گور|گورگر|گو[شن]|گیشیدن|گی[من]|لاپلنگی|لات|لاچیق|لاخون|لاس|لاسکا|لاگارسون|لامد?|لاوه?|لایش|لاییدن|لبالو|لبوم|لبومین|لپر|لت|لترناتیو|لر|لرژی|ل[شغ]|لغده|لفا|لفت[نه]|لکالویید|لگرو|لگونه|لوچه|لودگی|لود[نه]|لوسن|لومین|لومینیوم|لو[ئن]ک|لیاژ|لیداد|لیزیدن|ماتور|ماج|ماجگاه|مادگی|ماده|مار|مارگر|ماریدن|ماریلیس|ماس|ماسانیدن|ماسیدن|ماق|مال|مانی|ماهانیدن|ماهیدن|مبولانس|مپر|مپرسنج|مپلی|مپول|مپی|مخته|مدگان|مدن?|مرانه|مرزش|مرزگار|مرزنده|مرزیدن|مرزیده|مرغ|مریکا|مریکایی?|مفی|مفیبول|مه|موت|موخت[نه]|مود[نه]|موزانه|موزشی?|موزشیار|موزگا[رن]|موزنده|موزه|موق|موکسی|مولن|مون|مونیاک|میب|میختگی|میخت[نه]|میز[شه]?|میزگاری?|میغه?|نابولیسم|نات?|ناتومی|نارشی|نارشیس[تم]ی?|ناس|نالوگ|نالیز|نام|ناناس|نتراکت|نتریک|نت[نی]|نتیک|نجا|نچت?|ندوتوکسین|ندودرم|ندوسپرم|ندوسکوپی|ندون|نرمال|نزیم|نژین|نژیوکت|نژیوگرافی|نسه|نسیلین|نک|نگلوفیل|نوریسم|نیلین|نین|نیه|نیون|هار|هاردن|هازیدن|هستگی|هسته|هک|همند|هنج|هنجیدن|هنگ[ری]?|هنگساز|هنین|هو|هوانگیز|هوپا|هوتک|هوچشم|هودل|هوفغند|هومند|هون|هیانه|هیختن|واخ|وارگی|وا[رز]ه?|واشناسی|واکس|وام|وانتاژ|وانس|وانگارد|وانویسی|وردجو|وردگا؟ه|وردن|وردیدن|ورک|ورنجن|وری|وریدن|وریل|ونگ|ونگان|ونگون|ویخت[نه]|ویزش?|ویزگ?ان|وی[زژ]ه|ویزون|ویشن|یا[تن]?|یبک|یتم?|یزنه|یژ|یفت|یفون|ینده|یه|ییژ|یین|[یئ]?ینه|ئورت' tnvindar = u'(الزاما|لزوما|یقینا|قطعا|حتما|قاعدتا|طبیعتا|طبعا|قهرا|جدّا|حقیقتا|واقعا|مطمئنا|واضحا|مسلما|تماما|کاملا|عینا|اکیدا|مطلقا|دقیقا|مستقیما|اصولا|اصلا|اصالتا|نسبا|نسبتا|تقریبا|حدودا|معمولا|عرفا|قانونا|شرعا|اخلاقا|خلقا|احتمالا|استثنائا|اساسا|کلّ?ا|جزئا|مجموعا|جمعا|اجماعا|شدیدا|نهایتا|اقلا|اکثرا|غالبا|عمدتا|ندرتا|بعضا|گاها|صریحا|صراحتا|عموما|اختصاصا|خصوصا|مجملا|اجمالا|اختصارا|مختصرا|مشروحا|ظاهرا|باطنا|عمیقا|ذاتا|فطرتا|روحا|جسما|ابتدائا|مقدمتا|بدوا|بعدا|قبلا|جدیدا|سابقا|اخیرا|ابدا|عمرا|تلویحا|علنا|حضورا|غیابا|نیابتا|لطفا|اجبارا|اختیارا|عالما|عمدا|عامدا|تعمدا|متعمدا|عادتا|مستقلا|احتیاطا|احیانا|غفلتا|سهوا|اشتباها|عاجلا|عجالتا|مرتجلا|ارتجالا|سریعا|فورا|دا[یئ]ما|ضرورتا|نقدا|منحصرا|صرفا|دفعتا|کرارا|مکررا|مجددا|مرتبا|مستمرا|متواترا|تدریجا|تصادفا|عملا|فعلا|موقتا|ضمنا|نتیجتا|نوعا|اصطلاحا|جسارتا|بالا ?غیرتا|م[وؤ]کدا|ذیلا|شخصا|مشترکا|مفصلا|رسما|ترجیحا|قلبا|ر[اأ]سا|تو[اأ]ما|متناوبا|متوالیا|متقابلا|متعاقبا|متّ?فقا|مثلا|فرضا|ایضا|مضافا|مصرّ?ا|ارفاقا|انصافا|جهارا|طولا|متدرجا|غانما|احتراما|ناچارا|سفارشا|تلفنا|زبانا|کتبا|شفاها|اولا|دوما|سوما|چهارما|ثانیا|ثالثا|رابعا|خامسا|سادسا|سابعا|ثامنا|تاسعا|عاشرا)' langs = u'انگلیسی|آلمانی|اسپانیایی|فرانسوی|روسی|ایتالیایی|لاتین|اسکاتلندی|هلندی|هندی|اردو|پشتو|مصری|تاجیکستانی|قرقیزستانی|ازبکستانی|ترکی|یونانی|چینی|ژاپنی|کره‌ای|تایلندی|[فپ]ارسی'

zaed = ur"متن مورب|متن ضخیم|\[\[پرونده:مثال\.jpg]]|=+ متن عنوان =+|:خط تو رفته\n?|اینجا متن قالب‌بندی‌نشده وارد شود|\# مورد فهرست شماره‌ای\n?|\* مورد فهرست گلوله‌ای|متن زیرنویس|متن بالانویس|متن کوچک|متن بزرگ|#(؟:تغییرمسیر|REDIRECT) \[\[(?:نام صفحه مقصد|نام صفحه)]]|\{\| class=\.wikitable\.\n\|-\n! متن عنوان !! متن عنوان !! متن عنوان\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|-\n\| مثال \|\| مثال \|\| مثال\n\|}|

|[۱]|[۲]|[۳]|\[\[رده:]]|\[\[en:]]|\[\[fa:.*?]]|\[\[عنوان پیوند]]|\{\{\s*}}|\[\[\s*\|?\s*]]|"

tags = ur'b|big|blockquote|charinsert|code|comment|del|div|em|gallery|hyperlink|i|includeonly|imagemap|inputbox|link|math|noinclude|nowiki|pre|ref|s|small|source|startspace|strong|sub|sup|template|timeline' sametH = ur'فرمانده|زره|کوه|گره|گنه|سپه|مکروه|م?ت?وجّ?ه|منزّ?ه|نزه|ابله|مرفّ?ه|شبیه|مت?شابه|کریه|پادشه|اللّ?ه|اله|[آکبتدرزشلم]ه' #e: صامت هـ spcBfre = u'.،,:؛;؟٫)}]»》”,·。一ー・、:()「」〜?!ء' spcAftr = u'({[«《“,·。一ー٫・、:()「」〜?!' bLA = u'(?!['+faChrs+u'])' bLB = u'(?<!['+faChrs+u'])'

def fixChars():

   exceptions = ['gallery', 'hyperlink', 'interwiki', 'math', 'pre', 'template', 'timeline', 'ref', 'source', 'startspace', 'inputbox']
   namespaces = list(self.site.namespace(6, all = True))
   pattern = re.compile(u'\[\[(' + '|'.join(namespaces) + '):.+?\..+?]]', re.UNICODE)
   exceptions.append(pattern)
  #txt = pywikibot.replaceExcept(txt, u'ه‌', u'ە', exceptions)
  #txt = pywikibot.replaceExcept(txt, u'ه', u'ھ', exceptions)
   txt = pywikibot.replaceExcept(txt, u'ك', u'ک', exceptions)
   txt = pywikibot.replaceExcept(txt, ur'[ىي]', u'ی', exceptions)
   for i in range(0,10):
     txt = re.sub(u'(?P<enChrs>[A-Za-z0-9][^'+faChrs+faNums+u'٫﷼٪×،؛؟«»\{}\|=]*|<math>.*?)'+faNums[i]+u'(?=[^'+faChrs+u'٫﷼٪×،؛؟«»\{}\|=]*?[A-Za-z0-9]|.*?</\s*math>)',
                  ur'\g<enChrs>'+enNums[i], txt, re.S)
   for i in range(0,10):
     txt = re.sub(u'(?P<faChrs>['+faChrs+u'][^A-Za-z0-9\{}\|=]*)'+enNums[i]+u'(?=[^A-Za-z\{}\|=]*?['+faChrs+faNums+u'])',
                  ur'\g<faChrs>'+faNums[i], txt)
   for i in range(0,10):
     txt = re.sub(ur'(?P<isbn>(?:\|\s*(?:ISBN|isbn)\s*=\s*|\WISBN +)['+enNums+u' -]*)'+faNums[i],
                  ur'\g<isbn>'+enNums[i], txt)
   for i in range(0,10):
      txt = pywikibot.replaceExcept(txt, arNums[i], faNums[i], exceptions)

def fixCsmtc():

   # ZWNJ
   txt = re.sub(u'‌{2,}', u'‌', txtTmp) # پشت‌سرهم
   txt = re.sub(u'\[\[([^\]\|]*?)‌]](%s+)' % faChrs, ur'\1‌\2', txt) # Piping
   txt = re.sub(u'‌(?![ئاآأإژزرذدوؤةبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|ֹ)', , txt) # در پس
   txt = re.sub(u'(?<![ئبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|f|ֹ)‌', , txt) # در پیش
   # Cats
   txt = re.sub(ur'\[\[ *(رده|[Cc]ategory) *: *(.*?) *]]', ur' ', txt)
   # Files
   txt = re.sub(ur'\[\[ *[Ii]mage *: *', u'[[پرونده:', txt)
   txt = re.sub(ur'\[\[ *[Ff]ile *: *', u'[[پرونده:', txt)
  #txt = re.sub(ur'\[\[ *(?:[Ii]mage|[Ff]ile|پرونده|تصویر) *: *', u'[[پرونده:', txt)
   txt = re.sub(ur'(\[\[پرونده:.*?\|) *thumb *(?=\|.*?]])', ur'\1بندانگشتی', txt)
   txt = re.sub(ur'(\[\[پرونده:.*?\|) *left *(?=\|.*?]])', ur'\1چپ', txt)
   txt = re.sub(ur'(\[\[پرونده:.*?\|) *right *(?=\|.*?]])', ur'\1راست', txt)
   txt = re.sub(ur'(\[\[پرونده:.*?\|) *center *(?=\|.*?]])', ur'\1وسط', txt)
   txt = re.sub(ur'(\[\[پرونده:.*?\|) *link *= *(?=.*?]])', ur'\1پیوند=', txt)
   #e: نام الگوها
   txt = re.sub(u'الگو:(?:الگو:', ur'{{\1', txt, re.S)
   txt = re.sub(u'الگو:(?:جا:', u'‌', txt)
   txt = re.sub(u'الگو:(?:جا:', u'–', txt)
   txt = re.sub(u'الگو:(?:جا:', u'—', txt)
   txt = re.sub(u'الگو:(?:DEFAULTSORT)', u'{{ترتیب پیش‌فرض:', txt)

txt = re.sub(ur'{{(?:[Cc]ommons?|انبار|ویکی انبار) ?\|', u'

)', ur'ص=\1', txt)

   txt = re.sub(ur'(pages ?= ?|pp ?[\.=] ?)(\d*?)(1?)(\d)–\2\3(\d) *(?=}})', ur'\1\2\3\4–\3\5', txt)
  #txt = re.sub(ur'(pages ?= ?|pp ?[\.=] ?)([023456789]+|\d*1)(\d+)–\2(\d+) ?(?=}})', ur'\1\2\3–\4', txt)
   txt = re.sub(ur'(صفحه ?= ?|صفحات ?= ?|صص ?[\.=] ?)(|\=)(['+faNums+u']+)(['+faNums+ur']+)–\2(['+faNums+u']+) ?(?=}})', ur'صص\1\2\3–\4', txt)

def fixText():

   exceptions = ['comment', 'math', 'nowiki', 'pre', 'source', 'timeline']
   text = pywikibot.replaceExcept(text, r'(?m)^(?P<bullet>[:;]*(\*+|#+)[:;\*#]*)(?P<char>[^\s\*#:;].+?)', '\g<bullet> \g<char>', exceptions)
   # Remove wikilinks
   exceptions = ['template', 'source']
   txt = pywikibot.replaceExcept(txt, ur'\[\[([^\|\]]*?)]]([^\{}]{2,800})\[\[\1]]', ur'\1\2\1', exceptions)
   #s: به
   txt = re.sub(bLB+u'(?:ب|به‌)(دست|شکلی?|گونه|طوری?|صورتی؟|قدری؟|نظر|دلا?یلی؟|سبب|عل[تل]ی؟|وسیله|واسطه|گفته|شمار|حساب|عنوان|عبارتی؟|هم[یا]ن|وجود|دنبال|نوبه|دنیا)'+bLA, ur'به \1', txt)
   txt = re.sub(bLB+u'(?:ب|به)(تندی|کندی|ویژه|خاطر|ناچار|خوبی|نیکی|تدریج|زودی|تازگی|سادگی|آسانی|سهولت|راحتی|دشواری|زیبایی|راستی|درستی|روشنی|وضوح|صراحت|تلویح|تفصیل|اجمال|اختصار|تنها[یئ]ی|مرور|نرمی|سختی|آرامی|آهستگی|سرعت|شدت|غایت|مراتب|ضرورت|دقت|کرّات|تواتر|ندرت|وفور|فراوانی|اصطلاح|اجبار|اختیار|اشتباه|تصادف|طبع|یقین|واقع)'+bLA, ur'به‌\1', txt)
   txt = re.sub(ur'(رو|منزل|جا|یک|دو|سه)[‌ ]?(ب|به)\1', ur'\1به‌\1', txt)
   txt = re.sub(bLB+u'به[‌ ](ذاته|حمداللّ?ه|شخصه|سزایی|عینه|نفسه)'+bLA, ur'ب\1', txt)
   txt = re.sub(bLB+u'(نا(?: ?)|)(?:ب|به[‌ ])حق(ی?)'+bLA, ur'\1بحق\2', txt)
   txt = re.sub(bLB+u'(?:ب|به[‌ ]?)لا ?(استفاده|استثنا|تشبیه|تکلیف|شرط|شک|فاصله|شبهه|عوض|مانع|منا[ضز]ع|نسبت)', ur'بلا\1', txt)
   #s: بر
   txt = re.sub(bLB+u'بر(?=اساس|پایه|طبق|روی|خلاف|ضد|دست)', u'بر ', txt)
   #s: بی
   txt = re.sub(bLB+u'بی[‌ ](?=هوده|چاره|نوا|جا|خود|زار|عار|دل|قرار|راه)', u'بی', txt)
   txt = re.sub(bLB+u'بی[‌ ](?=اساس|پایه|چیز|رحم|نشان|کار)', u'بی‌', txt)
   #s: هم
   txt = re.sub(bLB+u'هم[‌ ](چن[یا]ن|دیگر|شهری|شیره|زاد|درس|سنگ|سر|راز|وار|کار[ی ]|نوع[ی ]|راه[ی ]|دل[ی ])'+bLA, ur'هم\1', txt)
   txt = re.sub(bLB+u'هم ?(تیم[ی ]|صنف|صوت|آرزو|آرمان|اسم|مسلک|مرز)'+bLA, ur'هم‌\1', txt)
   txt = re.sub(bLB+u'هم[‌ ]?آ(?=هنگ|ورد)', u'هما', txt)
   #s: هیچ
   txt = re.sub(u'هیچ ?(?=یک|کدام|کس)', u'هیچ‌', txt)
   #s: چه
   txt = re.sub(u'چه[‌ ](?=قدر|گونه|طور)', u'چ', txt)
   txt = re.sub(u'(ا?گر|هر|آن|بدان|چنان) چه ', ur'\1چه ', txt)
   txt = txt.replace(u'‌چه ', u'چه ')
   #s: که
   txt = re.sub(bLB+u'(هر|آن|چنان) که ', ur'\1که ', txt)
   txt = txt.replace(u'طوریکه', u'طوری که').replace(u'‌ایکه', u'‌ای که')
   txt = re.sub(bLB+u'(هم[یا]ن|این|آن|بد[یا]ن|چن[یا]ن) ?(?=گونه|[جط]ور|که|جا)', ur'\1‌', txt)
   txt = re.sub(bLB+u'(این|آن)‌(?=که|جا)', ur'\1', txt)
   #s: ها
   txt = re.sub(u' ها(ی|[یئ]ی|)'+bLA, ur'‌ها\1', txt)
   txt = re.sub(bLB+u'(آن|این)[‌ ]?ها(|[یئ]ی)'+bLA, ur'\1‌ها\2', txt)
   txt = txt.replace(u'‌هائی', u'‌هایی')
   #s: تر
   txt = re.sub(u'(کم|بیش)[‌ ]تر', ur'\1تر', txt)
   txt = txt.replace(u' ترین ', u'‌ترین ')
   #s: است
   txt = re.sub(u'(گونه|اندازه|یده|نده) ای '+bLA, ur'\1‌ای', txt)
   txt = re.sub(u'ی است'+bLA, u'ی‌است', txt)
   txt = re.sub(u'ه است'+bLA, u'ه‌است', txt)
     #e: صامت هـ
   txt = re.sub(bLB+u'('+sametH+u')‌است'+bLA, ur'\1 است', txt)
   txt = re.sub(bLB+u'('+sametH+u')[‌ ]ای'+bLA, ur'\1ی', txt)
   txt = re.sub(u'اه‌است'+bLA, u'اه است', txt) # ...اه
   #s: شبه‌ساده‌ها  ####### مشارٌ‌اليه، مضاف‌ٌاليه، منقولٌ‌عنه، مختلفٌ‌فيه، متفق‌ٌعليه، بعبارةٍاُخرى، اباًعن‌جدٍ، اىّ‌نحوٍكان.
   txt = re.sub(bLB+u'من ?(باب|جمله)'+bLA, ur'من‌\1', txt)
   txt = re.sub(u'مع ?(هذا|ذلک|الفار[غق]|الوصف|ال[اأ]سف)', ur'مع‌\1', txt)
   txt = re.sub(u'علی ?(هذا|حده|رغم|الاصول|الحساب|الخصوص|البدل|الدوام|السویه|الطلوع|الله|القاعده)', ur'علی‌\1', txt)
   txt = re.sub(bLB+u'ذو ال', u'ذوال', txt)
   txt = re.sub(u'ذی ?(ال|نفع|امر|جود|حساب|حق|حیات|ربط|روح|شعور|صلاح|صلاحیّ?ت|عقل|علاقه|فقار|فن|قیمت|نفوذ)'+bLA, ur'ذی‌\1', txt)
   txt = re.sub(bLB+u'حقّ? (?=البوق|العبور|الت[اأ]لیف|التدریس|الزحمه|اللّ?ه|النّ?اس|تعالی)', u'حق‌', txt)
   txt = re.sub(u'عن ?[قغ]ریب', u'عن‌قریب', txt)
   txt = re.sub(u'قتل ?عام', u'قتل‌عام', txt)
   txt = re.sub(u'علی[‌ ][اأ]یّ?[‌ ]?حال', u'علی‌أی‌حال', txt)
   txt = re.sub(u'من[‌ ]?حیث[‌ ]?المجموع', u'من‌حیث‌المجموع', txt)
   txt = re.sub(u'ب(?:|ه[‌ ])ر[اأ]ی[‌ ]العین', u'برأی‌العین', txt)
   txt = re.sub(u'ما ?ب(?:|ه[‌ ])ازا', u'مابازا', txt)
   txt = re.sub(u'متقابل[‌ ](?:ب|به[‌ ])ر[اأ]س', u'متقابل‌به‌رأس', txt)
   txt = re.sub(u'منحصر ?(?:ب|به[‌ ])فرد', u'منحصربه‌فرد', txt)
   txt = re.sub(bLB+u'فی[‌ ]?ما ?بین', u'فی‌مابین', txt)
   txt = re.sub(u'[اآ]ی[ةت][‌ ]?اللّ?ه', u'آیت‌الله', txt)
   txt = re.sub(u'حج[ةته][‌ ]?ال[اإ]سلام', u'حجت‌الاسلام', txt)
   txt = re.sub(u'ثق[ةته][‌ ]?ال[اإ]سلام', u'ثقةالاسلام', txt)
   txt = re.sub(u'امیر ?الم[وؤ]منین', u'امیرالمؤمنین', txt)
   txt = re.sub(u'(متوازی|مختلف)[‌ ]?ال[اأ]ضلاع', ur'\1‌الأضلاع', txt)
   txt = re.sub(u'متساوی[‌ ]?السّ?اقین', u'متساوی‌الساقین', txt)
   txt = re.sub(u'قا[یئ]م[‌ ]الزّاوی[ةه]', u'قائم‌الزاویه', txt)
   txt = re.sub(u'دا[یئ]ر[ةته][‌ ]?(البروج|المعارف|العلوم)', ur'دائرة\1', txt)
   txt = re.sub(u'دا[یئ]م[‌ ](الخمر|الصوم|الذّ?[کك]ر)', ur'دائم‌\1', txt)
   txt = re.sub(u'ر[اأإ]س[‌ ](الجدی|السّ?رطان|المال)', ur'رأس‌\1', txt)
   txt = re.sub(u'(مجنی|مجنی)[‌ ][عا]لیه', ur'\1‌علیه', txt)
   txt = re.sub(u'(مضاف|مسند|مرجوع|مشار|منتقل)ٌ?[‌ ]?[عا]لیه', ur'\1ٌ‌الیه', txt)
   txt = re.sub(u'منته[ای][‌ ]?[عا]لیه', u'منتهی‌الیه', txt)
   txt = txt.replace(u'بین الملل', u'بین‌الملل')
   txt = txt.replace(u'حزب الل', u'حزب‌الل')
   txt = txt.replace(u'جدید الاحداث', u'جدیدالاحداث')
   txt = txt.replace(u'کثیر الانتشار', u'کثیرالانتشار')
   txt = txt.replace(u'سریع السیر', u'سریع‌السیر')
   txt = txt.replace(u'لازم الاجرا', u'لازم‌الاجرا')
   txt = txt.replace(u'فوق الذکر', u'فوق‌الذکر')
   txt = txt.replace(u'مرضی الطرف', u'مرضی‌الطرف')
   txt = txt.replace(u'خاتم الانبیا', u'خاتم‌الانبیا')
   txt = txt.replace(u'متفق القول', u'متفق‌القول')
   txt = txt.replace(u'قریب الوقوع', u'قریب‌الوقوع')
   txt = txt.replace(u'سوق الجیشی', u'سوق‌الجیشی')
   txt = txt.replace(u'چاه ورز', u'چاه‌ورز')
   txt = txt.replace(u'محیر العق', u'محیرالعق')
   txt = txt.replace(u'عظیم الجث', u'عظیم‌الجث')
   txt = txt.replace(u'لطایف الحیل', u'لطایف‌الحیل')
   txt = txt.replace(u'موقوف المعانی', u'موقوف‌المعانی')
   txt = txt.replace(u'سلیم النفس', u'سلیم‌النفس')
   txt = txt.replace(u'موثق الصدور', u'موثق‌الصدور')
   txt = txt.replace(u'شمس العمار', u'شمس‌العمار')
   txt = txt.replace(u'حسب الامر', u'حسب‌الامر')
   txt = txt.replace(u'مسلوب الاراده', u'مسلوب‌الاراده')
   txt = txt.replace(u'مستجاب الدعو', u'مستجاب‌الدعو')
   txt = re.sub(bLB+u'(دار|مشترک|ممنوع|قدیم|قلیل|ناقص|ضعیف|قوی|تحت|ر[یئ]یس|ربّ?|امّ?|حقّ?|ماء|ماوراء|باب) (?=ال)', ur'\1‌', txt)
  #txt = re.sub(u'‌(?=الهام|الصاق|الزام|القا|الکتریک|الکتریسیته)', u, txt)
   #e: اً
   txt = re.sub(bLB+tnvindar+bLA, ur'\1ً', txt)
   txt = re.sub(u'اصلاً? ?و ?ابداً?', u'اصلا و ابدا', txt)
   txt = re.sub(u'اهلاً? ?و ?سهلاً?', u'اهلاً وسهلاً', txt)
   #e: آ
   txt = re.sub(bLB+u'(ا|أ)('+noAlef+u')'+bLA, ur"آ\2", txt)
   txt = txt.replace(u' راکتور', u' رآکتور').replace(u'فرآیند', u'فرایند').replace(u'فرآورده', u'فراورده')#.replace(u' الان', u' الآن') # e: ا <-> آ
   txt = re.sub(bLB+u'ایده?[‌ ][اآ]ل', u'ایده‌آل', txt)
   #e: همزه
     #e: أ
   txt = re.sub(bLB+u'ر[اأإ]ی[‌ ](گیر|العین)', ur'رأی‌\1', txt)
   txt = re.sub(bLB+u'ما(بون|ثر|ثو[رم]|جو?ر|خو?|دبه|ذنه?|ذون|ربه|کو?ل|لوف|منه?|مور|موریّ?ت|مو[لمن]|نوس|وا|هول|یوس)'+bLA, ur'مأ\1', txt)
   txt = re.sub(bLB+u'نا ?ما(ذون|لوف|نوس)'+bLA, ur'نامأ\1', txt)
   txt = re.sub(bLB+u'ت[اإ](ثّ?[رلم]|ثی[رلم]|ثیرات|جیل|خّ?[ری]|خیر|دّ?ب|دی[به]|ذّ?[نی]|سّ?ف|سّی|سیس|سیسات|صّ?ل|کّ?د|کید|لّ?[فمه]|لیف|لیفات|مّ?[رل]|مّ?لات|می[رلن]|مینات|نّ?[سقی]|نی[سث]|ویل|هّ?[بل]|هیل|[یئ]ید|[یئ]یدیّ?ه)ی?'+bLA, ur'تأ\1', txt)
   txt = re.sub(bLB+u'متا(ثّ?ر|خّ?ر|دّ?ب|سّ?ف|سّ?فانه|سّ?ی|کّ?د|لّ?[مه]|مّ?ل|نّ?ی|هّ?ل)'+bLA, ur'متأ\1', txt)
   txt = re.sub(bLB+u'مستا(ثر|جر|صل|من|نس|نف)'+bLA, ur'مستأ\1', txt)
   txt = re.sub(bLB+u'(خل|مبد|ملج|منش|مخب|لایقر)[اأإ]ء?'+bLA, ur'\1أ', txt)
   txt = re.sub(bLB+u'مل[اأإ](ء|)'+bLA, ur'ملأ\1', txt)
   txt = re.sub(u'مل[اأإ]ء?[‌ ]?عام'+bLA, u'ملأعام', txt)
   txt = re.sub(bLB+u'(خل|مبد|ملج|منش|مخب)[أإء]ی'+bLA, ur'\1ئی', txt)
   txt = re.sub(bLB+u'تو[اأإ]م(ان|اً|)'+bLA, ur'توأم\1', txt)
   txt = txt.replace(u'طمانینه', u'طمأنینه')
   txt = txt.replace(u' رافت ', u' رأفت ')
   txt = txt.replace(u' راساً', u' رأساً')
   txt = re.sub(u'ی[اأإ]جوج([‌ ]و?)[‌ ]?م[اأإ]جوج', ur'یأجوج\1 مأجوج', txt)
   txt = re.sub(u'متل[اأإ]ل[یئ][ٔء]?', u'متلألئ', txt)
     #e: ؤ
   txt = re.sub(u'سئ?[ؤو]ء?[اآ]ل', u'سؤال', txt)
   txt = re.sub(bLB+u'مو(یّ?د|کّ?د|من|من[ویا]ن|لّ?ف|لّ?ف[یا]ن|سّ?سه?|سّ?سات|سّ?س[یا]ن|خّ?ر|ثّ?ر|نّ?ث|ذّ?ن|دّ?ب|تمر|تمن|انست|الفت|امره|اخذه|تلفه)ی?'+bLA, ur'مؤ\1', txt)
   txt = re.sub(bLB+u'روء?(سا[یء]?ی?|یا[یء]?ی?|یت)'+bLA, ur'رؤ\1', txt)
   txt = re.sub(bLB+u'(تواط|تهی|توض)وء?'+bLA, ur'\1ؤ', txt)
   txt = re.sub(bLB+u'فواد'+bLA, u'فؤاد', txt)
   txt = re.sub(bLB+u'ذوء?ابه'+bLA, u'ذؤابه', txt)
   txt = re.sub(bLB+u'ثولول', u'ثؤلول', txt)
   txt = re.sub(bLB+u'ل[وؤ]ل[وؤ]'+bLA, ur'لؤلؤ', txt)
   txt = re.sub(bLB+u'تل[اأإ]ل[وؤ](ی{,2})'+bLA, ur'تلألؤ\1', txt)
     #e: یء
   txt = re.sub(bLB+u'ش(?:ی[ئءٔ]|ئ)'+bLA, u'شیء', txt)
     #e: ئ
   txt = re.sub(bLB+u'(شی|جز|سو|مر)[ءی]ی'+bLA, ur'\1ئی', txt)
   txt = re.sub(bLB+u'(نش|جر|هی|قرا)[اأإ]ت'+bLA, ur'\1ئت', txt)
   txt = re.sub(u'مس[ؤو]{1,2}ل', u'مسئول', txt)
   txt = re.sub(u'مس[اأإ]له', u'مسئله', txt)
   txt = re.sub(bLB+u'دایم(اً|)'+bLA, ur'دائم\1', txt)
   txt = txt.replace(u'رییس', u'رئیس')
   txt = txt.replace(u' مسایل', u' مسائل')
   txt = txt.replace(u' ملایک', u' ملائک')
   txt = txt.replace(u'طایر', u'طائر')
   txt = txt.replace(u' تآتر', u' تئاتر')
   #e: هٔ
   txt = re.sub(u'(?:هٓ|ۀ|ه‌ٔ|هٔٔ|هء|ه[‌ ]ی)'+bLA, u'هٔ', txt) ### BUG: replaceExcept()
   txt = re.sub(u'(?<=به )(گفته|وسیله|نوشته|واسطه|منزله|اندازه|گونه|نوبه)'+bLA, ur'\1ٔ ', txt)
   txt = txt.replace(u'درباره ', u'دربارهٔ ')
   txt = txt.replace(u'هٔٔ', u'هٔ')
   txt = re.sub(bLB+u'(فرمانده|زره|گره|متوجه)ٔ', ur'\1ِ', txt) # هٔ -> هِ
   #s: افعال
   txt = re.sub(bLB+u'([هن]?می) ?([نب]ی؟|)('+bnMzare+u'|'+bnMazi+u')(ان|)(م|ی|د|یم|ید|ا?ند)'+bLA, ur'\1‌\2\3\4\5', txt) # می
   txt = re.sub(bLB+u'(باز|فر[او]|وا|[بد]ر) ?([هن]?می‌|)([منب]ی?|)('+bnMzare+u'|'+bnMazi+u')(م|ی|د|یم|ید|ا?ند)'+bLA, ur'\1\2\3\4\5', txt) # پیشوند فعل ### BUG
   txt = re.sub(bLB+u'(باز|فر[او]|وا|[بد]ر) ?([منب]ی?|)('+bnMazi+u')ن'+bLA, ur'\1\2\3ن', txt)
   txt = re.sub(bLB+u'('+bnMazi+u')ه (ام|ای|است|ایم|اید|اند)'+bLA, ur'\1ه‌\2', txt) # فم بین «ه» و شناسه
   txt = re.sub(u'([منب])یا(رزید|فتاد|فتد|فراشت|فروخت|فزود|فسرد|فشاند|ف[کگ]ند|نجامید|ند[او]خت|ندیشید|ن[بگ]اشت|نگیخت)(م|ی|یم|ید|ند|[^'+faChrs+u'])', ur'\1ی\2', txt) # نیافتاد -> نیفتاد
   txt = re.sub(u'([منب])یا(رز|فر[او]ز|فزای|فسر|فشان|ف[کگ]ن|نبار|نجام|ندا[یز]|ندوز|ندیش|نگار|نگیز)(م|ی|د|یم|ید|ا?ند|[^'+faChrs+u'])', ur'\1ی\2\3', txt) # بیاندیش -> بیندیش
   #s: ضمایر ملکی
   txt = re.sub(u'(?:ه|هٔ)[‌ ](مان|تان|شان)'+bLA, ur'هٔ‌\1', txt)
   txt = re.sub(u'(?<=ه)[‌ ](ام|ات|اش)'+bLA, ur'‌\1', txt)
   #s: و
   txt = re.sub(u'رفت[‌ ]?و ?[اآ]مد', u'رفت‌وآمد', txt)
   txt = re.sub(u'گفت[‌ ]?و ?گو', u'گفتگو', txt)
   txt = re.sub(u'جست[‌ ]?و ?جو', u'جستجو', txt)
   txt = re.sub(u'پخت[‌ ]?و ?پز', u'پخت‌وپز', txt)
   txt = re.sub(u'شست[‌ ]?و ?شو', u'شست‌وشو', txt)
   txt = re.sub(u'خفت[‌ ]?و ?خیز', u'خقت‌وخیز', txt)
   txt = re.sub(bLB+u'کند ?و ?کا?و'+bLA, u'کندوکاو', txt)
   txt = re.sub(bLB+u'کم[‌ ]و ?کاست', u'کم‌وکاست', txt)
   #s: بسیط
   txt = re.sub(u'(فن|دل)ّ?[‌ ]?[آا]وری', ur'\1اوری', txt)
   txt = re.sub(bLB+u'دل[‌ ](سوزی?|تنگی?|بری?)'+bLA, ur'دل\1', txt)
   txt = re.sub(bLB+u'یک[‌ ]دلی'+bLA, u'یکدلی', txt)
   txt = re.sub(u'گاه[‌ ]و ?بی[‌ ]?گاه', u'گاه‌و‌بیگاه', txt)
   #e: دیگر غلط‌های املایی
   txt = re.sub(u'(سپاس|شکر| بر)[‌ ]?گ[ذز]ار', ur'\1‌گزار', txt)
   txt = re.sub(u'(پایه|بنیان)[‌ ]?گ[ذز]ار', ur'\1‌گذار', txt)
   txt = re.sub(bLB+u'بی[‌ ]?م[حه]ابا', u'بی‌محابا', txt)
   txt = re.sub(bLB+u'بر ?خو?است', u'برخاست', txt)
   txt = re.sub(u'خوانواد(?=ه|گی)', u'خانواد', txt)
   txt = re.sub(u'[آا]نفو?لو? ?[آا]نزا', u'آنفلوآنزا', txt)
   txt = re.sub(bLB+u'غری[ضظ]ه'+bLA, u'غریزه', txt)
   txt = txt.replace(u'خواستگاه', u'خاستگاه')
   txt = txt.replace(u'اطاق', u'اتاق')
   txt = txt.replace(u'باطری', u'باتری')
   txt = txt.replace(u'باطلاق', u'باتلاق')
   txt = txt.replace(u'ضمینه', u'زمینه')
   txt = txt.replace(u'انظباط', u'انضباط')
   txt = txt.replace(u'حاظر', u'حاضر')
   txt = txt.replace(u'نفوظ', u'نفوذ') ###
   txt = txt.replace(u'مذبور', u'مزبور')
   txt = txt.replace(u'قائله', u'غائله')
   txt = txt.replace(u' وحله', u' وهله')
   txt = txt.replace(u' انهنا', u' انحنا')
   txt = txt.replace(u'پزشگی', u'پزشکی')
   txt = txt.replace(u'تضاهرات', u'تظاهرات')
   txt = txt.replace(u'تلوزیون', u'تلویزیون')
   txt = txt.replace(u'پرفسور', u'پروفسور')
   txt = txt.replace(u' خوشنود', u' خشنود')
   txt = txt.replace(u' الویت', u' اولویت')
   txt = re.sub(u'ه‌(گی|گانی?)'+bLA, ur'\1', txt)
   txt = re.sub(bLB+u'وب[‌ ]?(سایت|گاه)', u'وبگاه', txt) ###
   txt = re.sub(u'ویکی ?(?=سازی|فا |[مپ]دیا)', u'ویکی‌', txt)
   txt = re.sub(u'ویکی‌پدیا ?(?='+langs+u')', u'ویکی‌پدیای ', txt)
   txt = re.sub(u'علاقه?[‌ ]?مند', u'علاقه‌مند', txt)
   txt = re.sub(u'باقی ?ماند', u'باقی‌ماند', txt)
   txt = re.sub(u'مت[عاأ][سص]ّ?فانه', u'متأسفانه', txt)
   txt = re.sub(bLB+u'من[‌ ]را'+bLA, u'مرا', txt)
   txt = re.sub(u'عدم وجود'+bLA, u'نبودِ', txt)
   txt = txt.replace(u'عدم حضور', u'غیاب')
   txt = re.sub(u'اقدامات لازمه?'+bLA, u'اقدام‌های لازم', txt)
   #e: ماه‌ها
   txt = re.sub(bLB+u'مارچ'+bLA, u'مارس', txt)
   txt = re.sub(bLB+u'[اآ]ی?پریل'+bLA, u'آوریل', txt)
   txt = re.sub(bLB+u'(?:جولای|ژوییه)'+bLA, u'ژوئیه', txt)
   txt = re.sub(bLB+u'[اآ]گوست'+bLA, u'اوت', txt)
   txt = re.sub(bLB+u'دی?سا?مبر'+bLA, u'دسامبر', txt)
   txt = re.sub(u'(ربیع|جمادی)[‌ ]?(?:الثانی|ال[اأإ]خر)', ur'\1‌الثانی', txt)
   txt = re.sub(u'(ربیع|جمادی)[‌ ]?ال[اأإ]ول', ur'\1‌الاول', txt)
   txt = re.sub(u'ذ[وی][‌ ]?(?:ال|)(حج|قعد)[ةه]', ur'ذی‌ال\1ه', txt) ###
   #monthNum = re.sub(ur'(۲۰[۰۱][۰۱۲۳۴۵۶۷۸۹] ?- ?(۰?[۱۲۳۴۵۶۷۸۹]|۱[۰۱۲]) ?- ?(۰?[۱۲۳۴۵۶۷۸۹]|[۱۲][۰۱۲۳۴۵۶۷۸۹]|۳[۰۱])', ur'\1'+monthName+ur'\3', txt)
   #e: جمع‌الجمع
   txt = re.sub(u'(مدارک)[‌ ]?های?'+bLA, u'مدارک', txt)
   txt = re.sub(bLB+u'رسومات'+bLA, u'رسوم', txt)
   #e: حشو
   txt = re.sub(bLB+u'بر ?علیه', u'علیه', txt) # بر علیه
   txt = re.sub(u'اعلم[‌ ]?تر', u'اعلم', txt) # تر
   #e: طبق قاعدهٔ فارسی
   txt = re.sub(u'(آزمایش|پژوهش|پیشنهاد|نمایش|دستور|فرمایش|گزارش|گرایش|باغ|کوهستان)اتی ', ur'\1‌هایی ', txt) # اتی -> هایی
   txt = txt.replace(u'بازرسین', u'بازرسان').replace(u'داوطلبین', u'داوطلبان') #e: ین -> ان
   txt = re.sub(bLB+u'(رهبر|خوب|بد|[مز]ن)یّ?ت', ur'\1ی', txt) # یّت -> ی
   txt = re.sub(bLB+u'دو[یئ]یت', u'دوگانگی', txt) # یّت
   txt = txt.replace(u'زباناً', u'زبانی').replace(u'تلفناً', u'تلفنی').replace(u'ناچاراً', u'به‌ناچار').replace(u'گاهاً', u'گاهی') #e: اً
   #e: ؛
   txt = txt.replace(u'. زیرا ', u'؛ زیرا ')
   #e: عنوان‌ها
   txt = re.sub(ur'\=\s*پانویس[‌ ]?(?:ها)?\s*\=', u'= پانویس =', txt)
   txt = re.sub(ur'\=\s*جُ?ستار(?:های)? (?:وابسته|دیگر|مرتبط|مشابه)\s*\=', u'= جستارهای وابسته =', txt)
   txt = re.sub(ur'\=\s*منبع[‌ ]?(?:ها)\s*\=', u'= منابع =', txt)
   txt = re.sub(ur'\=\s*(?:پیوند|لین[کك])[‌ ]?(?:های)? (?:به بیرون|بیرونی|خارجی)\s*\=', u'= پیوند به بیرون =', txt)
   #e: پارسی‌سازی
   txt = re.sub(bLB+u'لیست(ی?)'+bLA, ur'فهرست\1', txt)
   txt = re.sub(bLB+u'توریسم'+bLA, u'گردشگری', txt)
   #a: الگوافزایی
   if txt.find(u'{{پانویس') is -1:
       if txt.find(u'= منابع =') is 1:

txt = re.sub(ur'(= منابع =+\n)', ur'\1

\n', txt, re.S)

       else:
         bazbini = True
   fixCsmtc()

def fixRedir(): ####

 txt = re.sub(ur'\s*#\s*(?:REDIRECT|تغییرمسیر)\s*\s*(.*?)\s*\s*', ur'#تغییرمسیر \1', txt)
 if txt.find(u'نام صفحه') is 1:
   bazbini = True
 if txt.find(u'تغییرمسیر از نویسه‌های خاص') is -1 and not re.search(u'[A-Za-z0-9'+faChrs+faNums+arNums+u']', faName):
   txt += u'\n\n \n'

def faToEn(faTxt, type):

 faChrsToFrcRplc = u'۰۱۲۳۴۵۶۷۸۹«»٬٫٪،؛؟'
 enChrsToFrcRplc = u'0123456789""`.%,;?'
 if type is 'force':
   for i in range(0,18):
     enTxt = faTxt.replace(faChrsToFrcRplc[i], enChrsToFrcRplc[i])
 elif type is 'safe':
   ###
 return enTxt

def fixNavbox():

 try:
   nbTxt = re.search(u'\{\{\s*[Nn]avbox(?:\{\{.*?}}|.*?)*}})'.group(0)
 except AttributeError:
   nbNames = {u'[Nn]avbox *[Ss]ubgroup': u'nbFA', u'[Nn]avbox': u, u: u, u'[Nn]avbox': u'nbFA'}
   nbPars = {u'name': u, u'title': u, u'state': u, u'above': u, u'image': u, u'imageright': u, u'basestyle': u, u'titlestyle': u, u'abovestyle': u, u'groupstyle': u, u'liststyle': u, u'belowstyle': u, u'below': u}
   for enNbName, faNbName in nbNames.iteritems():
     nbTxt = re.sub(u'\{\{\s*%s\s*\|' % enNbName, ur'{{ %s\n|' % faNbName, nbTxt)
   for enPar, faPar in nbPars.iteritems():
     nbTxt = re.sub(u'\s*\|\s*%s(\d*)\s*=\s*' % enPar, ur'\n| %s\1 = ' % faPar, nbTxt)
   nbTxt = nbTxt.replace(u'| group', u'| groupFA').replace(u'| list', u'| listFA')
   for i in range(0,10):
     nbTxt = re.sub(ur'(?<=\n\| groupFA)%s(?= = )' % enNums[i], faNums[i], nbTxt)
     nbTxt = re.sub(ur'(?<=\n\| listFA)%s(?= = )' % enNums[i], faNums[i], nbTxt)
     nbTxt = re.sub(ur'(?<=\n\| )((?:groupFA|listFA)[%s])style(?= = )' % faNums, ur'styleFA \1', nbTxt)

def fixInterwiki():

 txt = re.sub(u'\[\[\s*(?:[a-z]{2,3}(?:-[a-z]{1,5})*|simple)\s*:\s*]]', , txt)
 txt = re.sub(u'\s*\[\[\s*([a-z]{2,3}(?:-[a-z]{1,5})*|simple)\s*:\s*(.*?)\s*]]\s*', ur'\n\1:\2\n', txt)
 txt = re.sub(ur'(?<=\n)\[\[fa:.*?]]\n', , txt)
 txt = re.sub(ur'(\[\[(?:[a-z]{2,3}(?:-[a-z]{1,5})*|simple):.*?]])\n(?=\1\n)', , txt)
 # Sort interwikis
 dictIW = wikipedia.getLanguageLinks(txt)
 listIWsrtd = wikipedia.interwikiSort(dictIW.keys())
 for siteCode in listIWsrtd:
   ###

def fixSpamming(): ### بررسی وبلاگ بودن یا نبودن ارجاعات و پیوندها

def fixPageName(): ### انتقال صفحه‌ها به عنوان درست


  1. ------------------------------------------------------------------------------ در تابع اصلی بررسی می‌شود فضای نام صفحه چیست و بعد یکی از توابع زیر این خط اجرا می‌شود و هریک از این توابع خود یک یا چندتا از توابع بالای این خط را اجرا می‌کنند

def inArticle():

 fixChars()
 fixCsmtc()
 fixDash()
 fixText()
 fixInterwiki()

def inTemplate():

 fixChars()
 fixCsmtc()
 fixDash()
 fixNavbox()
 fixText()
#fixInterwiki()

def inCategory():

 fixChars()
 fixCsmtc()
 fixDash()
 fixText()
 fixInterwiki()

def inRedirect():

 fixCsmtc()
 fixRedir() ### + fixing_redirect.py 

def inTalk():

 fixCsmtc()

def inTemplateUser():

 fixCsmtc()
 fixUsrCats() ### if "user" not in cat

def inUser():

 fixCsmtc()
 fixUsrCats() ### if "user" not in cat
  ### if NoUser is True: remove the page

def inUserSandbox():

 fixCsmtc()
 fixUsrCats() ### if 'user' not in cat

def inFile():

 fixCsmtc()

def inPortal():

 fixCsmtc()
 fixInterwiki()

def inProject(): ###

 fixCsmtc()
 fixInterwiki()

def inHelp(): ###

 fixCsmtc()
 fixInterwiki()

def inBook():

 fixCsmtc()
  1. ------------------------------------------------------------------------------

def alarmblog():

   alarmlink = u'کاربر:Reza1615/test10'
   blogs = 'blogfa', 'mihanblog', 'persianblog', 'parsiblog', 'blogspot', 'wordpress', 'blogsky'
   for blog in blogs:
       if text_fa.find(blog) != -1:
           sitea = wikipedia.getSite('fa')
           pagealarm = wikipedia.Page(sitea, alarmlink)
           blogalarmtext = pagealarm.get()
           blogalarmtext = blogalarmtext + u'
\n' + str(page) commentb = u'ربات: در مقاله پیوند وبلاگ موجود است.' pagealarm.put(blogalarmtext, commentb, watchArticle = None, minorEdit = True) break

def alarmsource():

   alarmlink = u'کاربر:Reza1615/test9'
   if text_fa.find(u'= منابع =') is -1:
       sitea = wikipedia.getSite('fa')
       pagealarm = wikipedia.Page(sitea, alarmlink)
       blogalarmtext = pagealarm.get()
       blogalarmtext = blogalarmtext + u'
\n' + str(page) comments = u'ربات: مقاله بدون منبع است.' pagealarm.put(blogalarmtext, comments, watchArticle = None, minorEdit = True)

def run(self):

       trovato_en = False
       sen = wikipedia.Site('fa')
       interwiki_list = []
       for page in self.generator: 
           try:
               if not page.canBeEdited():
                   wikipedia.output(u'Skipping locked page %s' % page.title())
                   continue
               text_fa = page.get()
           except wikipedia.NoPage:
               wikipedia.output(u'Page %s not found' % page.title())
               continue
           except wikipedia.IsRedirectPage:
                pageRedirect = page.getRedirectTarget()
                text_fa = pageRedirect.get()
                page = page.getRedirectTarget()
               #wikipedia.output(u'Page %s was Redirect but edited!' % page)                
           except:
                continue
           new_text = fixArticle(text_fa)
           if bloga == True:
               alarmblog(new_text, str(page))
           if sourcea == True:
               alarmsource(new_text, str(page))
           wikipedia.setAction(msg % page)
           self.change(page, new_text)

class Boteditor:

   def __init__(self, generator, autoTitle = False, autoText = False):
       self.generator = generator
   def change(self, page, new_text):
       if new_text != page.get():
          #pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
           pywikibot.showDiff(page.get(), new_text)
           if raw_input(u'Edit? ') == u'y':
                  try:
                      page.put(new_text, msg, watchArticle = None, minorEdit = True)
                  except wikipedia.EditConflict:
                      wikipedia.output(u'Skipping %s because of edit conflict' % page.title())
                  except wikipedia.SpamfilterError, url:
                      wikipedia.output(u'Cannot change %s because of blacklist entry %s' % (page.title(), url))

def main():

   gen = None
   # summary message
   summary_commandline = None
   # Don't edit pages which contain certain texts.
   exceptions = []
   # commandline paramater.
   # Which namespaces should be processed?
   # default to [] which means all namespaces will be processed
   namespaces = []
   template = None
   PageTitles = [raw_input(u'Page: ').decode('utf-8')]
   autoText = False
   autoTitle = False
   bloga = False
   sourcea = False
   # This factory is responsible for processing command line arguments
   # that are also used by other scripts and that determine on which pages
   # to work on.
   genFactory = pagegenerators.GeneratorFactory()
   # Load default summary message.
   # BUG WARNING: This is probably incompatible with the -lang parameter.
   wikipedia.setAction(msg)
   # Read commandline parameters.
   #-------------------------------------------------------------------------------------------------
   for arg in wikipedia.handleArgs():
       if arg == '-autotitle':
           autoTitle = True
       elif arg == '-autotext':
           autoText = True
       elif arg.startswith('-page'):
           if len(arg) == 5:
               PageTitles.append(wikipedia.input(u'Which page do you want to change?'))
           else:
               PageTitles.append(arg[6:])
       elif arg.startswith('-except:'):
           exceptions.append(arg[8:])
       elif arg.startswith('-blog:'):
           bloga = True
       elif arg.startswith('-source:'):
           sourcea = True
       elif arg.startswith('-template:'):
           template = arg[10:]
       elif arg.startswith('-namespace:'):
           namespaces.append(int(arg[11:]))
       elif arg.startswith('-summary:'):
           wikipedia.setAction(arg[9:])
           summary_commandline = True
       else:
           generator = genFactory.handleArg(arg)
           if generator:
               gen = generator
   print namespaces
   if PageTitles:
       pages = [wikipedia.Page(wikipedia.getSite(), PageTitle) for PageTitle in PageTitles]
       gen = iter(pages)
   if not gen:
       # syntax error, show help text from the top of this file
       wikipedia.showHelp('behsaz')
       wikipedia.stopme()
       sys.exit()
   if namespaces != []:
       gen = pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
  1. gen = pagegenerators.RedirectFilterPageGenerator(gen)
   preloadingGen = pagegenerators.PreloadingGenerator(gen, pageNumber = 20)
   preloadingGen = pagegenerators.PreloadingGenerator(gen, pageNumber = 1)
   bot = Boteditor(preloadingGen, autoTitle, autoText)
   run(bot)

if __name__ == "__main__":

   bloga = False
   sourcea = False
   main()