ویکی‌پدیا:درخواست‌های ربات/ربات استخراج جعبه از درون مقاله/استخراج و ترجمه جعبه و فایل اکسل از مجموعه مقاله‌ها

ربات استخراج جعبه از درون مقاله
این کاربر یک ربات است
وظیفه(ها)استخراج جعبه از مقالات ویکی انگلیسی و ذخیره در کامپیوتر یا زیر صفحه ویکی
موافق محرومیت؟خیر
موافق خاموش‌شدن اضطراری؟بله
اجازه‌نامهCC-BY-SA 3.0
تست شده؟بله به عنوان نمونه جعبه شهرهای آلمان

به علت استفاده از sql این کد بر روی تول سرور با سرعت بیشتری اجرا می‌شود با این وجود قابل استفاده بر روی رایانه شخصی نیز می‌باشد.

کد زیر رباتی برای جمع‌آوری و ترجمه جعبه اطلاعات مقالات انگلیسی و ذخیره آنها در زیر صفحه کاربری ربات برای اعمال خرده ویرایش‌ها هست.

محل ذخیره شدن جعبه‌ها ویرایش

کار کردن با این ربات بسیار آسان است. باید فقط موارد زیر را برای ربات تعریف نمایید.

دخیره در کامپیوتر

به صورت پیش فرض ربات نتایج را در فایل result.txt ذخیره خواهد کرد

مثال:
python findbox.py  -page:iran

این دستور جعبه مقاله iran را در فایل result.txt ذخیره می‌کند.که این فایل در همان فولدر pywikipedia خواهد بود.


ذخیره مواردی که در ویکی‌فا مقاله ندارند ویرایش

این ربات به صورت پیش فرض مقاله‌هایی که در ویکی‌فا مقاله ندارند را جعبه‌هایشان را انتقال نمی‌دهد. برای اینکه بتوان جعبه همه مقالات را گرفته (موجود . ناموجود در ویکی‌فا) باید آرگومان -nofa:onlyen را در جلوی ربات بنویسید.

مثال:
python findbox.py -ref:"Template:Football League Cup seasons" -nofa:onlyen -ns:0

این ربات مقاله‌های مرتبط با الگوی Template:Football League Cup seasons را جستجو می‌کند و همه آنهایی که جعبه دارند را انتقال می‌دهند حتی آنهایی که در ویکی‌فا مقاله ندارند.

مقالاتی که در ویکی‌فا مقاله دارند

برای اینکه بتوان جعبه همه مقالات را گرفته (موجود در ویکی‌فا) باید آرگومان -nofa:onlyfa را در جلوی ربات بنویسید.

مثال:
python findbox.py -ref:"Template:Football League Cup seasons" -nofa:onlyfa -ns:0

شروع به کار ویرایش

برای شروع شما می‌توانید از آرگومان‌های استاندارد یا یکی از روش‌های زیر عمل کنید.

تذکر
در صورتی که عبارت جلوی آرگومان بیش از یک کلمه است یا باید برای فاصله از خط زیر (ـ) استفاده کنید یا کل عبارت را در میان "" قرار دهید مثال "Template:Infobox school"

آرگومان‌های پرکاربرد ویرایش

نام صفحه

با استفاده از آرگومان -page: می‌توانید نام صفحه مورد نظر در ویکی‌انگلیسی را مشخص کنید تا الگویش را برای شما ترجمه و انتقال دهد. مثال:

python boxfinder.py -page:Iran

این مثال فایل boxfinder.py که همین کد زیر هست را اجرا می‌کند و از ویکی انگلیسی صفحه ایران را فرا می‌خواند و جعبه‌اش را ذخیره می‌کند.

نام الگو جعبه

با استفاده از آرگومان -ref: می‌توانید نام الگو مورد نظر در ویکی‌انگلیسی را مشخص کنید تا جعبه‌های موجود در مقالات استفاده کننده از این الگو را برای شما ترجمه و انتقال دهد. مثال:

python boxfinder.py -ref:"Template:Infobox school"

این مثال فایل boxfinder.py که همین کد زیر هست را اجرا می‌کند و از ویکی انگلیسی صفحه‌های استفاده کننده از الگو Template:Infobox school را فرا می‌خواند و جعبه‌هایشان را ذخیره می‌کند.

نام الگو ناوباکس

با استفاده از آرگومان -links: می‌توانید نام الگو مورد نظر در ویکی‌انگلیسی را مشخص کنید تا جعبه‌های موجود در مقالات استفاده کننده از این الگو ناوباکس را برای شما ترجمه و انتقال دهد. مثال:

python boxfinder.py -links:"Template:school Novebox"

این مثال فایل boxfinder.py که همین کد زیر هست را اجرا می‌کند و از ویکی انگلیسی پیوندهای موجود در ناوباکس Template:schoolNavbox را فرا می‌خواند و جعبه‌هایشان را ذخیره می‌کند.

نام رده

با استفاده از آرگومان -cat: می‌توانید نام رده مورد نظر در ویکی‌انگلیسی را مشخص کنید تا جعبه‌های موجود در مقالات استفاده کننده از این رده را برای شما ترجمه و انتقال دهد. مثال:

python boxfinder.py -cat:"Category:Municipalities of Germany"

این مثال فایل boxfinder.py که همین کد زیر هست را اجرا می‌کند و از ویکی انگلیسی صفحه‌های استفاده کننده از رده Category:Municipalities of Germany را فرا می‌خواند و جعبه‌هایشان را ذخیره می‌کند.

تذکر

فایل boxfinder.py را باید با فرمت UTF-8 ذخیره کرده باشید. این کار به وسیله nodepade++ مقدور است.

فایل متنی

برای استخراج تعدادی صفحه که فقط نامش را داریم می‌توان نام انگلیسی آنها را در [[]] قرار داد و در یک فایل متنی ذخیره کرد و با دستور زیر جعبه آنها را استخراج کرد.

python boxfinder.py -file:input.txt
نکته۱
در مثال بالا فایل متنی input.txt را در کنار فایل ربات قرار دادیم و به صورت utf-8 ذخیره کرده‌ایم که این فایل محتوی نام چند صفحه مورد نظر می‌باشد.
نکته۲
در صورتی که تهیه نام صفحه‌ها به انگلیسی دشوار هست می توان ابزار کمک مترجم را در common.js حساب کاربری خود در ویکی‌فا نصب کنید (به جای ویکی‌انگلیسی در ویکی‌فا نصب کنید) آنگاه در ویکی‌فا هم می‌توان از این ابزار استفاده کرد و با کلیک کردن بر روی عبارت fa آن را به en تغییر دهید تا ترجمه‌ها به انگلیسی باشند.به راحتی پیوندهای موجود در یک فهرست در ویکی‌فا را می‌توان به انگلیسی ترجمه کرد و آنها را برای استخراج جعبه در فایل متنی قرار داد.

دستورالعمل استخراج جعبه‌ها و افزودن به مقالات ویرایش

برای استخراج جعبه‌های مقالات مشخص، اسامی انگلیسی مقالات را در یک فایل (مثلا jabe.txt) قرار داده به صورت زیر :

[[Article example 1]]
[[Article example 2]]
[[Article example 3]]
.
.
.

سپس فایل تکست را در کنار ربات قرار دهید و دستور زیر را به ربات بدهید :

python boxfinder.py -file:jabe.txt -nofa:onlyfa -lang:en

با این کار ربات جعبه مواردی را که در ویکیفا مقاله دارند را ترجمه می کند و در فایل NeededBoxes.txt قرار می دهد.پس از اطمینان از اینکه همه موارد جعبه ها ترجمه شده اند، (اگر همه ترجمه نشده بود دستی ترجمه کنید) نوبت به افزودن جعبه به مقالات می رسد.برای این کار از کد pagefromfile.py اصلاح شده استفاده می کنیم.کد را با نام مثلا pg.py ذخیره می کنیم و به ربات دستور زیر را می دهیم و جعبه ها به مقالات افزوده می شوند.

python pg.py -file:NeededBoxes.txt -nocontent:Infobox -start:@@@ -end:@@@ -appendtop -notitle

خروجی برای اکسل به صورت table ویرایش

کد به صورت پیش‌فرض در فایل resultexcel.txt تمام جعبه‌ها را به صورت فایل متنی (txt) و آمادهٔ درون‌ریزی import به اکسل ارائه می‌دهد تا کاربر بتواند به وسیلهٔ این جعبه‌ها موارد موجود در آنها را استخراج نماید و مقاله رباتیک بسازد. برای اطلاعات بیشتر مقدمه‌ای بر ساخت مقالات رباتیک را مطالعه نمائید. (این خروجی برای فایل اکسل درخواست شده در آنجا کاربرد دارد)

تذکر۱

برای اینکه خروجی به فایل resultexcel.txt قابل استفاده باشد باید متغییرهای جعبه (بر گرفته از توضیحات الگو در ویکی‌انگلیسی متغییرهای الگو) را در بخش items (خط ۵۸۲) از نو تعریف نمائید.

مثال: به عنوان مثال اگر این متغییرها برای en:Template:Infobox_UN_resolution
items=(u'number',u'organ',u'date',u'year',u'meeting',u'code',u'document',u'for',u'abstention',u'against',u'subject',u'result',u'image',u'caption')

باشد فایل resultexcel.txt فقط متغییرهای ذکر شده را برای اکسل دسته‌بندی و آماده می‌کند. شما می‌توانید همه متغییرهای الگو یی که استخراج کرده‌اید، را در این بخش قرار دهید تا در صورت موجود بودن آنها را استخراج نماید در صورت عدم تغییر این بخش (متغییر items) فایل متن خالی خواهد بود یا محدود به مواردی که بر حسب اتفاق مشترک هستند، خواهد بود.

تذکر۲

برای آنکه فایل متن در برنامه اکسل به صورت utf-8 باز گردد قبل از باز کردن آن لطفا فایل را در برنامه‌های ویرایش متن مانند nodepad++ باز نمائید و encoding آن را به utf8 تغییر دهید و آن را ذخیره نمائید. پس از آن فایل متنی به صورت utf-8 در اکسل قابل درون‌ریزی import است.

تذکر برای اکسل

در اکسل بر روی ستون اول کلیک کرده و گزینهٔ text to column را انتخاب نمائید و پس از چند بار کلیک کردن بر روی next متن در ستون‌های متفاوت قرار می‌گیرد که هر ستون نمایندهٔ یک متغییر است و می‌توانید این فایل را به کمک روش بیان شده در مقدمه‌ای بر ساخت مقالات رباتیک به مقاله تبدیل نمائید.

تذکر۳
(جداسازی مواردی که مقاله‌شان در ویکی‌فا موجود است وجلوگیری از ساخت مجدد آنها توسط ربات)

برای عدم بارگذاری مقاله‌هایی که در ویکی‌فا موجود هستند دو روش وجود دارد.

  1. می‌توان پارامتر -safe را در هنگام اجرای ربات pagefromfile.py در جلوی فرمان‌ها نوشت تا ربات مقاله‌های موجود را بارگذاری نکند و نیاز به روش پایین (روش ۲) نیست!
  2. در برنامه اکسل ستون name را به کمک عبارت & و [[]] در ستون دیگر به نحوی کپی‌کنید که همهٔ nameها مانند پیوندهای ویکی‌پدیا گردند و در نهایت ستونی از پیوندها داریم که آن ستون را در زیر صفحهٔ تست در کاربریمان در ویکی انگلیسی کپی می‌کنیم با ابزار کمک مترجم پیوندها را ترجمه و بعد آنها را دوباره در برنامه اکسل در ستون جدیدی کپی می‌کنیم حال تعدادی فارسی تعدادی انگلیسی هستند با دستور sort همه ستون‌ها را بر اساس ستون کپی‌شده مرتب کرده و ردیف‌هایی که نام فارسی دارند در انتها قرار می‌گیرند آن ردیف‌ها را حذف می‌کنیم. خلاصه کار در یک نگاه: ۱- تبدیل اسم مقاله‌ها به پیوند ویکی(در اکسل) ۲- ترجمه پیوند به کمک ابزار کمک مترجم در صفحهٔ تست ویکی‌انگلیسی ۳- کپی ستون ترجمه شده و مرتب سازی ردیف‌ها بر اساس آنها در اکسل۴- حذف ردیف‌هایی که فارسی دارند (در اکسل) ۵- نتیجه مانده ردیف‌هایی هستند که نام مقاله شان انگلیسی است و نیاز به ترجمه نام دارند بعد از ترجمهٔ نام می‌توان از آنها برای ربات ساخت مقاله استفاده کرد. با این روش فقط مقاله‌هایی را که در ویکی‌فا وجود ندارند باقی می‌مانند

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

برای رده‌دهی به صورت رده‌همسنگ به مقالات (بعد از ساخت آنها) نیاز به ترجمه و موجود بودن رده‌های همسنگ است. برای راحتی کار ربات فایل NeededCategories.txt را تولید می‌کند که این فایل تمام رده‌های به کار رفته در مقالات را فهرست می‌کند. ربات فقط رده‌هایی کهدر ویکی‌فا نیستند را همراه با تعداد استفاده در مقالات مورد نظر در جدولی فهرست می‌کند تا کاربرها آن رده‌ها را بسازند و ربات‌های رده همسنگ بتوانند آن مقالات را رده‌دهی کنند.

تولید فایل NeededCategories.txt به صورت خودکار هست و نیاز به هیچ آرگومان یا کد خاصی نیست.

فهرست مقاله‌های مورد نیاز برای آبی کردن پیوندهای درون جعبه‌های مقاله‌ها ویرایش

برای ساخت مقالات جعبه‌ها دارای پیوندهایی هستند که فهرست آنهایی که در ویکی‌فا موجود نیستند و پر کاربرد هستند در فایل NeededArticles.txt ذخیره می‌شود.تولید فایل NeededArticles.txt به صورت خودکار هست و نیاز به هیچ آرگومان یا کد خاصی نیست.

در صورتی که این مقالات بعدا هم ساخته شوند ربات جایگزین‌کننده پیوندهای لاتین با معادل فارسی آنها را با معادل فارسی‌شان جایگزین خواهد کرد.

مشکلات در اجرای کد ویرایش

نکته ۱:در صورتی که برای اجرای کد سیستم خطای unicode می‌دهد مطمئن شوید که کد را در فایلی که دارای encoding utif-8 هست ذخیره کرده‌اید، برای این‌کار در نرم‌افزار nodepad++ می‌توانید encoding را تغییر دهید.
نکته ۲:در صورتی که در مقاله‌ها از جعبه‌ای دیگر به جز infobox و Geobox استفاده شده‌بود (مثلا Chembox) باید نام الگو را در خط ۶۹ به متغییر boxes بیافزائید.

امکانات پیشرفته ویرایش

این ربات به صورت پیش فرض کارهای زیر را انجام می‌دهد.

  1. استخراج الگو (ذخیره در فایل tempresult.txt)
  2. ترجمه پیوندها به وسیله میان‌ویکی (ذخیره در NeededBoxes.txt)
  3. استخراج فایل متنی برای اکسل و مقاله سازی (ذخیره در فایل resultexcelc.txt)
  4. استخراج فهرست رده‌های استفاده شده در مقالات (ذخیره رده‌ها در فایل encats.txt و بعد از مرتب‌سازی و ساخت جدول در فایل NeededCategories.txt ذخیره می‌شود)
  5. استخراج پرکاربردترین مقالاتی که در صورت ساخت آنها پیوندشان در مقالات آینده آبی خواهند شد در فایل NeededArticles.txt

مورد ۱ برای موارد بعدی پیش‌نیاز است اما بقیه موارد می‌توانند بدون اجرای موارد قبلی و بعدی اجرا شوند. همچنین این ربات انتهای هر مرحله نتیجه کارش را در یک فایل متنی ذخیره می‌کند.

نتیجه ویرایش

در صورتی که ربات را رها کنید به ترتیب موارد ذکر شده را انجام دهد فایل‌های زیر برای کارهای شما قابل استفاده خواهند بود

  1. NeededBoxes.txt جعبه‌های (الگوهای) استخراج شده و ترجمه شده و آماده بارگذاری توسط pagefromfile.py
  2. resultexcelc.txt فایل متنی برای درون ریزی به اکسل و ساخت مقاله
  3. NeededCategories.txt جدول از رده‌های پر استفاده در مقالات استخراج شده (رده‌های موجود در ویکی‌فا در این جدول نیستند)
  4. NeededArticles.txt جدول از مقاله‌های پر استفاده در جعبه‌های استخراج شده (مقاله‌های موجود در ویکی‌فا در این جدول نیستند)

ترفند ویرایش

می توانید با قرار دادن عبارت # قبل از دستورهای موجود در زیر if __name__ == "__main__" مواردی را که دوست ندارید اجرا شوند را لغو نمائید.

مثال:قصد داریم رده‌های استفاده شده در مقالات مواد شیمیایی را استخراج کنیم تا به کمک کاربرها بتوان آن رده ها را ساخت برای سرعت در کار می‌توانید دستورهای زیر if __name__ == "__main__": را به این صورت تغییر دهید.

if __name__ == "__main__":
    try:
        main(savewiki,adressfa,nofa)
        #linktranslation()
        #exceleporter()
        catenlist()
        mainarticles()
    finally:
        wikipedia.stopme()

با این ترفند ربات ابتدا الگوها را استخراج می کند و به صورت همزمان رده‌ها و مقالات مرتبط و مورد نیاز که در ویکی‌فا نیستند را در فایل‌های NeededCategories.txt و NeededArticles.txt فهرست می‌کند.

#!/usr/bin/python
#!/usr/bin/python
# -*- coding: utf-8 -*-
# BY: رضا (User:reza1615 on fa.wikipedia)
# BY: Z (User:ZxxZxxZ on fa.wikipedia)
# Distributed under the terms of the CC-BY-SA 3.0 .    
"""
 
You can run the bot with the following commandline parameters:
 
-file        - Work on all pages given in a local text file.
               Will read any [[wiki link]] and use these articles.
               Argument can also be given as "-file:filename".
-cat         - Work on all pages which are in a specific category.
               Argument can also be given as "-cat:categoryname".
-page        - Only edit a specific page.
               Argument can also be given as "-page:pagetitle". You can give this
               parameter multiple times to edit multiple pages.
-ref         - Work on all pages that link to a certain page.
               Argument can also be given as "-ref:referredpagetitle".
-filelinks   - Works on all pages that link to a certain image.
               Argument can also be given as "-filelinks:ImageName".
-links       - Work on all pages that are linked to from a certain page.
               Argument can also be given as "-links:linkingpagetitle".
-start       - Work on all pages in the wiki, starting at a given page. Choose
               "-start:!" to start at the beginning.
               NOTE: You are advised to use -xml instead of this option; this is
               meant for cases where there is no recent XML dump.
               i.e. "-start:Category:!" or "-start:template:a"
-except:XYZ  - Ignore pages which contain XYZ. If the -regex argument is given,
               XYZ will be regarded as a regular expression.
-summary:XYZ - Set the summary message text for the edit to XYZ, bypassing the
               predefined message texts with original and replacements inserted.
-template:XYZ- 
-namespace:n - Number of namespace to process. The parameter can be used
               multiple times. It works in combination with all other
               parameters, except for the -start parameter. If you e.g. want to
               iterate over all user pages starting at User:M, use
               -start:User:M.
-always      - Don't prompt you for each replacement
-save          save on wikifa
-nofa          save infobaxs that they don't have any article in fa.wiki
other:       - 
 
NOTE: Only use either -xml or -file or -cat or -template or-page, but don't mix them.
 
Examples:
        behsaz.py -ref:Template:Infobox school  برای تمام صفحاتی که از این الگو استفاده می‌کنند
 
"""
try:
    import MySQLdb
except:
    pass    
import wikipedia,sys
import pagegenerators
import re, os, codecs, catlib,string
import query
from collections import defaultdict
wikipedia.config.put_throttle = 0
wikipedia.put_throttle.setDelay()
faSite = wikipedia.getSite('fa')
enSite = wikipedia.getSite('en')
txtTmp=' '
adressfa=u' '
msg = u'ربات:انتقال جعبه'
savewiki= False    
nofa='onlyen'
boxes=[u'infobox',u'Geobox']
def englishdictionry( enlink ,firstsite,secondsite,check):
    try:
        enlink=unicode(str(enlink),'UTF-8').replace(u'[[',u'').replace(u']]',u'').replace(u'en:',u'').replace(u'fa:',u'')
    except:
        enlink=enlink.replace(u'[[',u'').replace(u']]',u'').replace(u'en:',u'').replace(u'fa:',u'')
    enlink=enlink.split(u'#')[0].strip()
    if enlink==u'':
        return False    
    enlink=enlink.replace(u' ',u'_')
    site = wikipedia.getSite(firstsite)
    sitesecond= wikipedia.getSite(secondsite)
    params = {
        'action': 'query',
        'prop': 'langlinks',
        'titles': enlink,
        'redirects': 1,
        'lllimit':500,
    }
    try:
        categoryname = query.GetData(params,site)  
        for item in categoryname[u'query'][u'pages']:
            case=categoryname[u'query'][u'pages'][item][u'langlinks']
        for item in case:
            if item[u'lang']==secondsite:
                intersec=item[u'*']
                break
        if check==True:
            secondsitep = wikipedia.Page( sitesecond,intersec)
            try:
                text = secondsitep.get()    
            except wikipedia.NoPage:
                    wikipedia.output(u"%s doesn't exist, skip!" % page.title())
                    return False
            except wikipedia.IsRedirectPage:
                    wikipedia.output(u"%s is a redirect, skip!" % page.title())
                    newpage = secondsitep.getRedirectTarget()
                    intersec=newpage.title()
        result=intersec    
        return result
    except: 
        return False
def redirectquery( enlink,firstsite):
    try:
        enlink=unicode(str(enlink),'UTF-8').replace(u'[[',u'').replace(u']]',u'').replace(u'en:',u'').replace(u'fa:',u'')
    except:
        enlink=enlink.replace(u'[[',u'').replace(u']]',u'').replace(u'en:',u'').replace(u'fa:',u'')
    enlink=enlink.split(u'#')[0].strip()
    if enlink==u'':
        return False    
    enlink=enlink.replace(u' ',u'_')
    site = wikipedia.getSite(firstsite)
    params = {
        'action': 'query',
        'titles': enlink,
        'redirects':1}
    try:
        redirectname = query.GetData(params,site)
        redirectname=redirectname[u'query'][u'redirects'][0]['to'].replace(u'_',u' ')
        return redirectname
    except:
        enlink=enlink.replace(u'_',u' ')
        return enlink
        
def categorydown(listacategory):
    wikipedia.config.put_throttle = 0
    wikipedia.put_throttle.setDelay()
    count=1
    for catname in listacategory:
        count+=1
        if count==200:
            break
        gencat = pagegenerators.SubCategoriesPageGenerator(catname, recurse=False)
        try:
            for subcat in gencat:
                try:
                   wikipedia.output(str(subcat))
                except:    
                    wikipedia.output(subcat)
                if subcat in listacategory:
                    continue
                else:
                    listacategory.append(subcat)
        except:
            continue
    return listacategory
def pagefafinder(encatTitle):

    cats=[]
    try:    
        item=unicode(str(encatTitle),'Ascii').replace('[[en:','').replace(']]','').replace(' ','_').replace('Category:','')
    except:
        item=str(encatTitle).replace('[[en:','').replace(']]','').replace(' ','_').replace('Category:','')
    #-----------------start sql---------------------------------------
    queries ='SELECT /* SLOW_OK */ ll_title  FROM page JOIN categorylinks JOIN langlinks WHERE cl_to = "'+item+'" AND cl_from=page_id AND page_namespace = 0 AND page_id =ll_from AND ll_lang = "fa" AND page_namespace = 0 GROUP BY ll_title ;' 
    site1 = wikipedia.getSite('en')
    TS_DB_HOST = 'sql-s3'
    MY_CNF = '~/.my.cnf'
    cn = MySQLdb.connect("enwiki-p.db.toolserver.org", db = site1.dbName(), read_default_file = '~/.my.cnf')
    cur = cn.cursor()    
    cur.execute(queries)
    results = cur.fetchall()
    cn.close()
    #------------------end of sql--------------------------------------------
    for raw in results:
       cats.append(raw)
    if cats!=[]:
       return cats
    else:
       return False
       
def encatlist(encat):
    encat=encat.replace(u'Category:Category:',u'Category:')
    wikipedia.config.put_throttle = 0
    wikipedia.put_throttle.setDelay()
    count=0
    listenpageTitle=[]
    PageTitle=encat.replace(u'[[',u'').replace(u']]',u'').strip()
    language='en'
    PageTitles =[PageTitle]  
    for PageTitle in PageTitles:
        cat = catlib.Category( wikipedia.getSite(language),PageTitle )
        if str(cat).find('stubs')!=-1:
            continue
        listacategory=[cat]
        listacategory=categorydown(listacategory)
        for enpageTitle in listacategory:
                try:
                   fapages=pagefafinder(enpageTitle)
                   for pages in fapages:
                              pages=unicode(pages[0],'UTF-8')
                              wikipedia.output(u'\03{lightgreen}Adding '+pages+u' to fapage lists\03{default}')
                              listenpageTitle.append(pages)
                except:
                   
                   try:    
                        enpageTitle=unicode(str(enpageTitle),'UTF-8').split(u'|')[0].split(u']]')[0].replace(u'[[',u'').strip()
                   except:
                        enpageTitle=enpageTitle.split(u'|')[0].split(u']]')[0].replace(u'[[',u'').strip()
                   cat = catlib.Category( wikipedia.getSite(language),enpageTitle )
                   gent = pagegenerators.CategorizedPageGenerator( cat )
                   for pagework in gent:
                      count+=1
                      try:
                          link=str(pagework).split(u'|')[0].split(u']]')[0].replace(u'[[',u'').strip()
                      except:
                          pagework=unicode(str(pagework),'UTF-8')
                          link=pagework.split(u'|')[0].split(u']]')[0].replace(u'[[',u'').strip()
                      listenpageTitle.append(link)
    if listenpageTitle==[]:
        return False
    return listenpageTitle
def boxfind(text_en):
    text_en=re.sub("(\{\{(?:[Tt]emplate:|)Infobox ship begin.*?)(\}\})(\s*?\{\{)","\1\3",text_en,re.IGNORECASE)
    text_en=re.sub("(\}\}\r?\n?\{\{(?:[Tt]emplate:|)Infobox ship (?:career|characteristics|class overview|image)\r?\n)","",text_en,re.IGNORECASE)
    text_en=text_en.replace(u'{{ ',u'{{').replace(u'{{ ',u'{{').replace(u'{{template:',u'{{').replace(u'{{Template:',u'{{')
    lines=text_en.split('\n')
    start=False    
    box=u'\n'
    diff=1
    linebaz,linebasteh=0,0
    for our_box in boxes:
        our_box=our_box.strip()
        up_our_box=our_box[0].upper()+our_box[1:]
        lower_our_box=our_box[0].lower()+our_box[1:]
        for line in lines:
            if line==u'':
                continue
            if line.find(u'{{'+lower_our_box)!=-1 :# lower case    
                start=True
                linebaz,linebasteh=0,0
                box+=u'{{'+lower_our_box+line.split(u'{{'+lower_our_box)[1]+'\n'
                linebaz += string.count( line,"{{" )
                linebasteh += string.count( line,"}}" )    
                diff=linebaz-linebasteh
                continue
            if line.find(u'{{'+up_our_box)!=-1 :# upper case
                start=True
                linebaz,linebasteh=0,0
                box+=u'{{'+up_our_box+line.split(u'{{'+up_our_box)[1]+'\n'
                linebaz += string.count( line,"{{" )
                linebasteh += string.count( line,"}}" )
                diff=linebaz-linebasteh
                continue
            if start==True and diff!=0:
                linebaz += string.count( line,"{{" )
                linebasteh += string.count( line,"}}" )
                diff=linebaz-linebasteh
                box+=line+'\n'
            if diff==0 and start==True:
                break
    return box
def BotRun(page,text_en,nofa,counting):
    wikipedia.output(u'------Artcile Number \03{lightblue}'+unicode(str(counting),'UTF-8')+u'\03{default} ----'+unicode(str(page),'UTF-8')+u'------------')
    faresult=englishdictionry( page ,'en','fa',False)
    if faresult==False and nofa=='onlyfa':
        wikipedia.output( u'\03{lightpurple}===>'+unicode(str(page),'UTF-8')+u' in fawiki has no article \03{default}')
        return False
    if faresult!=False and nofa=='onlyen':
        wikipedia.output( u'\03{lightpurple}===>'+unicode(str(page),'UTF-8')+u' in fawiki has article \03{default}')
        return False
    lines=text_en.split('\n')
    matn=' '
    for line in lines:
        linebaz=string.count(line,'{{')
        linebaste=string.count(line,'}}')
        diff=linebaz-linebaste
        if diff==0:
            line=line.replace('{{','$AAAA$').replace('}}','!BBBB!')
        linebaz=0
        linebaste=0
        matn+=line+u'\n'
    newtext=''
    for our_box in boxes:
        our_box=our_box.strip()
        try:
            newtext= re.search(ur'(\{\{\s*['+our_box[0].lower()+our_box[0].upper()+ur']'+our_box[1:]+ur'[_\s](?:\{\{.*?\}\}|[^\}])*\}\})',matn, re.S).group(1)# if Template box has other name please chang this regex
            newtext=newtext.replace(u'$AAAA$',u'{{').replace(u'!BBBB!',u'}}')
            break
        except:
            continue
    if not newtext.strip():
        newtext=boxfind(text_en)
    if not newtext.strip():
        wikipedia.output( u'===>'+unicode(str(page),'UTF-8')+u' Without Templatebox' )
        return False   
    wikipedia.output( u'\03{lightgreen}'+unicode(str(page),'UTF-8')+u" added to list \03{default}")
    newtext=u'\n@@@\n$$$'+unicode(str(page),'UTF-8')+u'$$$\n'+newtext+u'\n@@@\n'
    return newtext
def templatefinder(linkingPageTitle,nofa):
    articles=[]
    
    try:    
        item=unicode(str(linkingPageTitle),'Ascii').replace('[[en:','').replace(']]','').replace(' ','_').replace('Template:','').replace('template:','').replace('الگو:','')
    except:
        item=str(linkingPageTitle).replace('[[en:','').replace(']]','').replace(' ','_').replace('Template:','').replace('template:','').replace('الگو:','')
    #-----------------start sql---------------------------------------
    if nofa=='onlyfa':
        queries ='SELECT /* SLOW_OK */ page_title FROM page JOIN langlinks WHERE page_namespace = 0 AND page_is_redirect = 0 AND page_id IN (SELECT tl_from FROM templatelinks WHERE tl_title = "'+linkingPageTitle+'" AND tl_namespace = 10) AND  ll_lang = "fa"  GROUP BY page_title LIMIT 10;'
    else:
        a=1
    #some thing
    wikipedia.output(queries)
    site1 = wikipedia.getSite('en')
    TS_DB_HOST = 'sql-s3'
    MY_CNF = '~/.my.cnf'
    cn = MySQLdb.connect("enwiki-p.db.toolserver.org", db = site1.dbName(), read_default_file = '~/.my.cnf')
    cur = cn.cursor()    
    cur.execute(queries)
    results = cur.fetchall()
    cn.close()
    #------------------end of sql--------------------------------------------
    for raw in results:
       articles.append(raw)
    if articles!=[]:
       return articles
    else:
       return False
def run(generator,savewiki,adressfa,nofa):
        wikipedia.config.put_throttle = 0
        wikipedia.put_throttle.setDelay()
        site = wikipedia.getSite( 'en' )
        with codecs.open( u'tempresult.txt',mode = 'w',encoding = 'utf8' ) as fars:
                    fars.write( u'\n' )
        with codecs.open( u'encats.txt',mode = 'w',encoding = 'utf8' ) as fars2:
                    fars2.write( u'\n' )
        new_text='\n'
        counting=0
        for pageen in generator:
            try:
                enlink=unicode(str(pageen),'UTF-8').replace(u'[[',u'').replace(u']]',u'')
            except:
                enlink=pageen.replace(u'[[',u'').replace(u']]',u'')
            if enlink.find(u'talk:')!=-1 or enlink.find(u'Talk:')!=-1 or enlink.find(u'User:')!=-1 or enlink.find(u'Template:')!=-1 or enlink.find(u'Wikipedia:')!=-1 or enlink.find(u'Category:')!=-1:  
                continue
            page = wikipedia.Page( site,enlink )
            try:
                text_fa = page.get()
                catsen=page.categories()
            except wikipedia.NoPage:
                wikipedia.output( u'Page %s not found' % page.title() )
                continue
            except wikipedia.IsRedirectPage:
                 pageRedirect = page.getRedirectTarget()
                 text_fa = pageRedirect.get()
                 catsen=pageRedirect.categories()
                 wikipedia.output( u'Page %s was Redirect but edited!' %  pageRedirect )                
            except:
                 continue
            counting+=1
            new_text=BotRun(page,text_fa,nofa,counting)
            
            if new_text==False or new_text=='\n':
                 continue
            with codecs.open( u'tempresult.txt',mode = 'a',encoding = 'utf8' ) as fars:
                    fars.write( new_text )
            catsen=unicode(str(catsen),'UTF-8').replace(u'[Category{',u'').replace(u'}, Category{',u'\n').replace(u']]}]',u']]').replace(u'[[en:',u'[[:en:')+u'\n'
            with codecs.open( u'encats.txt',mode = 'a',encoding = 'utf8' ) as encatfile:
                    encatfile.write( catsen )
def linktranslation():
        farsichar=u'ابضصثقفغعهخحجچشسیلتنمکگظطزرذدپو۱۲۳۴۵۶۷۸۹۰'
        wikipedia.output(u'\03{lightgreen} Translating Links .... \03{default}')
        text2 = codecs.open( u'tempresult.txt','r' ,'utf8' )
        text = text2.read()
        linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
        for item in linken:
                passport=True
                if not item in text:
                    continue
                if item.find(u'File:')!=-1 or item.find(u'file:')!=-1 or item.find(u'Image:')!=-1 or item.find(u'image:')!=-1 or item.find(u'Category:')!=-1 or item.find(u'category:')!=-1:
                    continue
                for i in farsichar:
                        if i in item:
                            passport=False
                            break
                if not passport:
                    continue    
    
                itemmain=item
                item=item.replace(u'en:',u'')
                if item.find('user:')!=-1 or item.find('User:')!=-1 or item.find('template:')!=-1 or item.find('Template:')!=-1 or item.find('category:')!=-1 or item.find('Category:')!=-1 or item.find('Wikipedia:')!=-1 or item.find('wikipedia:')!=-1 or item.find('Talk:')!=-1 or item.find('talk:')!=-1 or item.find('Help:')!=-1 or item.find('help:')!=-1:
                    continue
                itemen=item.split(u'|')[0].replace(u'[[',u'').replace(u']]',u'').strip()
                if text.find(itemmain)!=-1:
                    itemfa=englishdictionry(itemen ,'en','fa',False)
                    wikipedia.output(itemen)
                else:
                    continue
                if itemfa==False:
                    itemen=item.replace(u'[[',u'').replace(u']]',u'').strip()
                    itemen=itemen.replace(u'[[',u'').replace(u']]',u'')
                    text=text.replace(u'[['+itemen+u']]',u'@1@'+itemen+u'@2@')
                    continue
                else:
                    text=text.replace(itemmain,u'@1@'+itemfa+u'@2@')
                linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
                wikipedia.output(str(len(linken))+u' is remained')
        text=text.replace(u'@1@',u'[[').replace(u'@2@',u']]')
        text=text.replace(u'$$$[[',u"'''").replace(u']]$$$',u"'''")
        text=text.replace(u'@@@\n\n@@@',u'@@@\n@@@').strip()
        with codecs.open( u'NeededBoxes.txt',mode = 'w',encoding = 'utf8' ) as f:
                    f.write(text)    
        wikipedia.output(u'\03{lightblue} Translated Boxes are copied in NeededBoxes.txt \03{default}')
def main(savewiki,adressfa,nofa):
    summary_commandline,template,gen = None,None,None
    exceptions,PageTitles,namespaces = [],[],[]
    linkingPageTitle=''
    encat=''
    autoText,autoTitle = False,False
    genFactory = pagegenerators.GeneratorFactory()
    wikipedia.setAction( msg )
    for arg in wikipedia.handleArgs():    
            if arg == '-autotitle':
                autoTitle = True
            elif arg == '-autotext':
                autoText = True
            elif arg.startswith( '-page:' ):
                if len(arg) == 6:
                    PageTitles.append(wikipedia.input( u'Which page do you want to chage?' ))
                else:
                    PageTitles.append(arg[6:])
            elif arg.startswith( '-cat:' ):
                if len(arg) == 5:
                    encat=wikipedia.input( u'Which Category do you want to chage?' )
                else:
                    encat='Category:'+arg[5:]
            elif arg.startswith('-except:'):
                exceptions.append(arg[8:])
            elif arg.startswith( '-namespace:' ):
                namespaces.append( int( arg[11:] ) )
            elif arg.startswith( '-ns:' ):
                namespaces.append( int( arg[4:] ) )
            elif arg.startswith( '-ref:' ):
                linkingPageTitle= arg[5:]
                
            elif arg.startswith('-file:'):
                textfilename = arg[6:]
                if not textfilename:
                    textfilename = wikipedia.input(
                        u'Please enter the local file name:')
                gen = pagegenerators.TextfilePageGenerator(textfilename,'en')
            
            elif arg.startswith( '-nofa:' ):
                nofa=arg[6:].strip()
                nofa=nofa.replace(u'faonly',u'onlyfa').replace(u'enonly',u'onlyen')
                if nofa!='onlyfa':
                    nofa='onlyen'
            elif arg.startswith( '-onlyfa' ):
                nofa='onlyfa'
            elif arg.startswith( '-onlyen' ):    
                nofa='onlyen'
            elif arg.startswith( '-save' ):
                savewiki= True
                adressfa= wikipedia.input(u'Write you wiki subpage like (User:yourusername/findbox) :> ').decode('utf-8')
            else:
                generator = genFactory.handleArg(arg)
                if generator:
                    gen = generator
    #--------------------------------------------------------------------the template name----------------
    #linkingPageTitle=u'Template:Infobox school'
    #--------------------------------------------------------------------------------------------------------
    if encat!='':
        encatfalist=encatlist(encat)    
        if encatfalist!=False:
            run(encatfalist,savewiki,adressfa,nofa)
    if PageTitles:
        pages = [wikipedia.Page(enSite,PageTitle) for PageTitle in PageTitles]
        gen = iter( pages )
    
    if linkingPageTitle:
            linkingPage = wikipedia.Page(enSite, linkingPageTitle)
            pages=pagegenerators.ReferringPageGenerator(linkingPage)
            gen = iter(pages)
            wikipedia.output(linkingPageTitle)
    if namespaces != []:
        gen = pagegenerators.NamespaceFilterPageGenerator( gen,namespaces )
    preloadingGen = pagegenerators.PreloadingGenerator( gen,pageNumber = 60 )
    run(preloadingGen,savewiki,adressfa,nofa)
def catenlist():
        wikipedia.output(u'\03{lightgreen} Listing Needed categories.... \03{default}')
        text2 = codecs.open( u'encats.txt','r' ,'utf8' )
        text = text2.read()
        linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
        for item in linken:
                itemmain=item
                item=item.replace(u':en:',u'').replace(u'en:',u'')
                itemen=item.split(u'|')[0].replace(u'[[',u'').replace(u']]',u'').strip()
                if text.find(itemmain)!=-1:
                    itemfa=englishdictionry(itemen ,'en','fa',False)
                    wikipedia.output(itemen)
                else:
                    continue
                if itemfa==False:
                    itemen=item.replace(u'[[',u'').replace(u']]',u'').strip()
                    itemen=itemen.replace(u'[[',u'').replace(u']]',u'')
                    text=text.replace(u'[['+itemen+u']]',u'@1@'+itemen+u'@2@')
                    continue
                else:
                    text=text.replace(itemmain,u'')
                text=text.replace(u'[[]]',u'').replace(u'@1@@2@',u'')
                linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
                wikipedia.output(str(len(linken))+u' is remained')
        text=text.replace(u'@1@',u'[[').replace(u'@2@',u']]')
        textup=u"رده‌های پرکاربرد که باید ساخته شوند تا توسط ربات رده‌همسنگ به مقالات افزوده شوند.\n"
        textup+=u'{| class="wikitable sortable"\n!ردیف!!نام رده!!تعداد استفاده\n'
        linken = re.findall(ur'\[\[.*?\]\]',text, re.S)    
        counters=0
        dict={}
        for item in linken:
            if text.lower().count(item.lower())==0:
                continue
            dict[item]=text.count(item)
        counters=0
        for key, value in sorted(dict.iteritems(), key=lambda (k,v): (v,k), reverse=True):    
            counters+=1
            textup+=u'|-\n|'+str(counters)+u'||'+key+u'||'+str(value)+u'\n'
            text=text.replace(item,u'').replace(u'[[]]',u'').replace(u'[[',u'[[:en:')
        textup+=u'|-\n|}'
        savefile='NeededCategories.txt'
        with codecs.open(savefile ,mode = 'w',encoding = 'utf8' ) as f:
                    f.write(textup)
        wikipedia.output(u"\03{lightblue} Needed Category's File is made and it's name is "+unicode(savefile,'UTF-8')+u" \03{default}")
def mainarticles():
        wikipedia.output(u'\03{lightgreen} Listing Needed Articles....\03{default}')
        farsichar=u'ابضصثقفغعهخحجچشسیلتنمکگظطزرذدپو۱۲۳۴۵۶۷۸۹۰'
        filesample = 'NeededBoxes.txt'
        text2 = codecs.open( filesample,'r' ,'utf8' )
        text = text2.read()
        linken =re.findall(ur'\[\[.*?\]\]',text, re.S)
        enlinks=[]
        for item in linken:
            passport=True
            if not item in text:
                continue
            if item.find(u'File:')!=-1 or item.find(u'file:')!=-1 or item.find(u'Image:')!=-1 or item.find(u'image:')!=-1 or item.find(u'Category:')!=-1 or item.find(u'category:')!=-1:
                continue
            for i in farsichar:
                    if i in item:
                        passport=False
                        break
            if passport:        
                itemnew=item.split(u'|')[0].replace(u'[[',u'').replace(u']]',u'').replace(u':en:',u'').replace(u'en:',u'').strip()
                redirect=redirectquery(itemnew,'en')
                if redirect:
                    enlink=u'AAA'+redirect+u'$$$'
                else:
                    continue    
                text=text.replace(item,enlink)
                linken =re.findall(ur'\[\[.*?\]\]',text, re.S)
                wikipedia.output(item)
                wikipedia.output(str(len(linken))+u' is remained')                
        text=text.replace(u'AAA',u'[[').replace(u'$$$',u']]')
        linken =re.findall(ur'\[\[.*?\]\]',text, re.S)
        for item in linken:
                passport=True    
                itemmain=item
                item=item.replace(u':en:',u'').replace(u'en:',u'')
                item=item.split(u'|')[0].replace(u'[[',u'').replace(u']]',u'').strip()
                for i in farsichar:
                    if i in item:
                        passport=False
                        break
                if item.find(u'File:')!=-1 or item.find(u'file:')!=-1 or item.find(u'Image:')!=-1 or item.find(u'image:')!=-1 or item.find(u'Category:')!=-1 or item.find(u'category:')!=-1:
                    continue
                if text.find(u'[['+item)!=-1 and passport:            
                    if not item in enlinks:      
                        enlinks.append(item)    
        textup=u"مقاله‌های کلیدی و پرکاربر بر پایهٔ تعداد پیونددهی در مقالات که برای آبی‌شدن پیوندشان باید در ابتدا ساخته شوند.\n"
        textup+=u'{|class="wikitable sortable"\n!ردیف!!نام مقاله!!تعداد استفاده\n'
        dict={}
        for item in enlinks:
            if text.count(u'[['+item)==0:
                continue    
            dict[item]=text.count(u'[['+item)
        counters=0
        for key, value in sorted(dict.iteritems(), key=lambda (k,v): (v,k), reverse=True):    
            counters+=1
            textup+=u'|-\n|'+str(counters)+u'||[[:en:'+key+u']]||'+str(value)+u'\n'
        textup+=u'|-\n|}'
        savefile='NeededArticles.txt'
        with codecs.open( savefile,mode = 'w',encoding = 'utf8' ) as f:
                    f.write( textup )
        wikipedia.output(u"\03{lightblue} Needed Article's File is made and it's name is "+unicode(savefile,'UTF-8')+u" \03{default}")
def exceleporter():
    wikipedia.output(u'\03{lightgreen} Making excel File.... \03{default}')
    count = 0    
    filesample = 'NeededBoxes.txt'
    text2 = codecs.open( filesample,'r' ,'utf8' )
    text = text2.read()
    #-------------------------------------------------------
    # در این بخش متغییرهایی را که قصد دارید در فایل اکسل به صورت ستونی باشند را ذکر نمائید
    #items=(u'number',u'organ',u'date',u'year',u'meeting',u'code',u'document',u'for',u'abstention',u'against',u'subject',u'result',u'image',u'caption')
    #items=(u'name',u'image',u'caption',u'fullname',u'birth_date',u'birth_place',u'death_date',u'death_place',u'height',u'position',u'currentclub',u'youthyears1',u'youthclubs1',u'collegeyears1',u'collegeclubs1',u'collegecaps1',u'collegegoals1',u'years1',u'clubs1',u'caps1',u'goals1',u'totalcaps',u'totalgoals',u'nationalyears1',u'nationalteam1',u'nationalcaps1',u'nationalgoals1',u'medaltemplates',u'manageryears1',u'managerclubs1',u'club-update',u'nationalteam-update')
    items=(u'name',u'official_name',u'image',u'image_size',u'image_caption',u'image_alt',u'location_map',u'location_map_width',u'location_map_text',u'lat_d',u'lat_m',u'lat_s',u'lat_NS',u'long_d',u'long_m',u'long_s',u'long_EW',u'coordinates_type',u'coordinates_display',u'coordinates_ref',u'country',u'location',u'status',u'construction_began',u'commissioned',u'licence_expires',u'decommissioned',u'cost',u'owner',u'operator',u'developer',u'constructor',u'reactors_operate_mw',u'reactors_const_mw',u'reactors_planned_mw',u'reactors_decom_mw',u'reactors_cancel_mw',u'reactor_type',u'reactor_supplier',u'turbine_manu_npp',u'installed_capacity',u'max_planned_cap',u'capacity_factor',u'average_annual_gen',u'net_generation',u'website',u'as_of',u'extra')
    #-------------------------------------------------------
    text=re.sub(ur'(\s|)+(\||\=)(\s|)+','\2',text)
    text=text.replace(u'@@@\n\n@@@',u'@@@').replace(u'\t',u'')
    dict={}
    count=-1
    text=re.sub(ur'\<ref(.*?)\/ref\>',ur"", text, re.S)
    text=re.sub(ur'\<ref(.*?)\/>',ur"", text, re.S)
    count=-1
    for item in items:    
        count+=1
        dict[count]=[item]
    dict[count+1]=[u'names']
    for pag in text.split(u'@@@' ):
        pag=pag.replace(u'\r',u'')
        if pag.strip()==u'':
            continue
        try:    
           onvan=pag.split("'''")[1].strip()
        except:
               continue
        count=-1
        for item in items:
            count+=1
            try:
                im = re.search(ur'\|'+item+u'\=.*?\\n\|', pag)
                itema=im.group(0).split(item+u'=')[1].replace(u'\n|',u'').replace(u'\n',u'').replace(u"''",u"").strip()
                itema=itema.split(u'<')[0].strip()
                if itema==u'N/A' or itema==u'*' or itema==u'':
                    itema=u' '  
            except:
                itema=u' '
            dict[count].append(itema)
        onvan=pag.split("'''")[1].replace(u'en:',u'').strip()
        dict[count+1].append(onvan)
    number=len(items)+1
    total=len(dict[0])-1
    text=u'\n'
    for b in range(0,total):
        for a in range(0,number):
            text+=dict[a][b]+u'\t'    
        text+=u'\n'
    savefile='resultexcelc.txt'
    with codecs.open(savefile ,mode = 'w',encoding = 'utf8' ) as f:
                    f.write( text.strip() )
    f.close() 
    wikipedia.output(u"\03{lightblue} Excel File is made and it's name is "+unicode(savefile,'UTF-8')+u"\03{default}")
if __name__ == "__main__":
    try:
        main(savewiki,adressfa,nofa)
    except:
        pass
    linktranslation()
    exceleporter()
    catenlist()
    mainarticles()