ویکی‌پدیا:درخواست‌های ربات/cat generator.py

از ویکی‌پدیا، دانشنامهٔ آزاد
#!/usr/bin/python
# -*- coding: utf-8  -*-

__version__ = '$Id: cat_generator.py, v1.0 2011/06/03$'

from BeautifulSoup import UnicodeDammit
import sys, re, urllib2, httplib, socket, codecs, ftplib
import wikipedia, catlib, pagegenerators, noreferences,category
import subprocess, tempfile, os ,config

# SETTINGS
locDic = {u'Angola':u'آنگولا',
u'France':u'فرانسه',
u'Honduras':u'هندوراس',
u'Denmark':u'دانمارک',
u'Venezuela':u'ونزوئلا',
u'Vietnam':u'ویتنام',
u'Romania':u'رومانی',
u'Jamaica':u'جامائیکا',
u'Japan':u'هندوراس',
u'Jordan':u'اردن',
u'Kenya':u'کنیا',
u'Kuwait':u'کویت',
u'Laos':u'لائوس',
u'Lebanon':u'لبنان',
u'Lithuania':u'لیتوانی',
u'Ecuador':u'اکوادور',
u'Egypt':u'مصر',
u'Ethiopia':u'اتیوپی',
u'Germany':u'آلمان',
u'Ghana':u'غنا',
u'Greece':u'یونان',
u'Guatemala':u'گواتمالا',
u'Iceland':u'ایسلند',
u'India':u'هند',
u'Indonesia':u'اندونزی',
u'Ireland':u'ایرلند',
u'Italy':u'ایتالیا',
u'Uganda':u'اوگاندا',
u'Ukraine':u'اوکراین',
u'the United Kingdom':u'بریتانیا',
u'the United States':u'آمریکا',
u'Uruguay':u'اوروگوئه',
u'Uzbekistan':u'ازبکستان',
u'Thailand':u'تایلند',
u'Tunisia':u'تونس',
u'Turkey':u'ترکیه',
u'Malaysia':u'مالزی',
u'Mongolia':u'مغولستان',
u'Morocco':u'مراکش',
u'Nepal':u'نپال',
u'the Netherlands':u'هلند',
u'Nicaragua':u'نیکاراگوئه',
u'Nigeria':u'نیجریه',
u'Norway':u'نروژ',
u'Mexico':u'مکزیک',
u'Chile':u'شیلی',
u'Colombia':u'کلمبیا',
u'Cuba':u'کوبا',
u'the Czech Republic':u'جمهوری چک',
u'Peru':u'پرو',
u'the Philippines':u'فیلیپین',
u'Poland':u'لهستان',
u'Bangladesh':u'بنگلادش',
u'Bahrain':u'بحرین',
u'Belarus':u'بلاروس',
u'Belgium':u'بلژیک',
u'Brazil':u'برزیل',
u'Bulgaria':u'بلغارستان',
u'Saudi Arabia':u'عربستان سعودی',
u'Senegal':u'سنگال',
u'Singapore':u'سنگاپور',
u'Slovakia':u'اسلوواکی',
u'Slovenia':u'اسلوونی',
u'South Africa':u'آفریقای جنوبی',
u'Spain':u'اسپانیا',
u'Sweden':u'سوئد',
u'Switzerland':u'سوئیس',
u'South Korea':u'کره جنوبی',
u'Greenland':u'گرینلند',
u'Syria':u'سوریه',
u'Kazakhstan':u'قزاقستان',
u'Kyrgyzstan':u'قرقیزستان',
u'Tajikistan':u'تاجیکستان',
u'Somalia':u'سومالی',
u'Libya':u'لیبی',
u'Serbia':u'صربستان',
u'Hong Kong':u'هنگ کنگ',
u'Portugal':u'پرتغال',
u'the United Arab Emirates':u'امارات متحده عربی'}

# vars.
faChrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی'
text = ''
R = re.compile(ur'\[\[(.+?)(?:\]\]|\|)')
enSite = wikipedia.getSite('en')

def catFinder(a):
    apage = wikipedia.Page(enSite, a)
    NOPAGE = False
    try:
       atext = apage.get()
    except wikipedia.NoPage:
       NOPAGE = True
    except wikipedia.IsRedirectPage:
       apage = apage.getRedirectTarget()
       atext = apage.get()
    if not NOPAGE == True:
       if re.search(ur'\[\[fa:(.+?)(?:\]\]|\|)',atext):
          R = re.compile(ur'\[\[fa:(.+?)(?:\]\]|\|)')
          for aaa in R.findall(atext):
              return aaa
       else:
          return u'shar'
    else:
       return u'shar'

def main():
  for enLoc in locDic:
      faLoc = locDic[enLoc]
      enName = u'Airports in ' + enLoc
      faName = u'فرودگاه‌های ' + faLoc
      faName = u'رده:' + faName
      enpage = wikipedia.Page(enSite, u'Category:'+enName)
      try:
        enText = enpage.get()
      except:
        print u'ERROR: enpage.get()'
        continue
      enPagePermalink = enpage.permalink()
      enPagePermalink = enPagePermalink.replace(u'&redirect=no&useskin=monobook', u'')
      text = enText
      if u'[[fa:' in text:
         print u"ERROR: u'[[fa:' in text"
         continue

      # Delete English text
      text = re.sub(u'(?<=\n)[^\{\[]+.*?(?=\n)', u'', text)

      # Templates
      text = re.sub(ur'{{ ?(?:[Cc]ommons?|انبار|ویکی انبار) ?\|', u'{{ویکی‌انبار|', text)
      text = re.sub(ur'{{ ?(?:[Cc]ommons?[\- ]?(?:[Cc]ats?|[Cc]ategory)|(?:ویکی[‌ ]?|)انبار[\- ]?رده) ?\|', u'{{ویکی‌انبار-رده|', text)
      text = re.sub(u'{{Airports[_ ]by[_ ]country[_ ]category[_ ]description ?\| ?'+enLoc+u'}}', u'{{توضیحات رده فرودگاه‌ها بر پایه کشور|'+enLoc+u'|'+faLoc+u'}}', text)
      if u'{{توضیحات رده فرودگاه‌ها بر پایه کشور|' in text:
         text = re.sub(u'{{(?:ویکی‌انبار.*?|GeoGroupTemplate|[Kk][Mm][Ll])}}', u'', text)

      # Categories
      RF = re.compile(ur'\[\[[Cc]ategory:(.+?)(?:\]\]|\|)')
      for enCatNameTmp in RF.findall(enText):
         enCatName = u'Category:' + enCatNameTmp
         if not catFinder(enCatName) == u'shar':
            text = text.replace(u'[['+enCatName, u'[['+catFinder(enCatName))
      # prefix
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Aa]irports in (?=.*?\]\])', u'فرودگاه‌های ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Tt]ransport(?: infrastructure)? in (?=.*?\]\])', u'ترابری در ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Tt]ourism in (?=.*?\]\])', u'گردشگری در ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Aa]viation in (?=.*?\]\])', u'هوانوردی در ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Bb]uildings? and [Ss]tructures? in (?=.*?\]\])', u'بناها و سازه‌ها در ', text)
      # suffix
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)'+enLoc+u'(?=(?:\W.*?)?\]\])', ur'\1'+faLoc, text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Europe(?=(?:\W.*?)?\]\])', ur'\1اروپا', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Asia(?=(?:\W.*?)?\]\])', ur'\1آسیا', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Africa(?=(?:\W.*?)?\]\])', ur'\1آفریقا', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)North America(?=(?:\W.*?)?\]\])', ur'\1آمریکای شمالی', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)South America(?=(?:\W.*?)?\]\])', ur'\1آمریکای جنوبی', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Central America(?=(?:\W.*?)?\]\])', ur'\1آمریکای مرکزی', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Oceania(?=(?:\W.*?)?\]\])', ur'\1اقیانوسیه', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)Caribbean(?=(?:\W.*?)?\]\])', ur'\1کارائیب', text)
      # prefix
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Aa]irports (?=.*?\]\])', u'فرودگاه‌ها ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Tt]ransport(?: infrastructure)? (?=.*?\]\])', u'ترابری ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Tt]ourism (?=.*?\]\])', u'گردشگری ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Aa]viation (?=.*?\]\])', u'هوانوردی ', text)
      text = re.sub(u'(?<=\[\[[Cc]ategory:)[Bb]uildings? and [Ss]tructures? (?=.*?\]\])', u'بناها و سازه‌ها ', text)
      # suffix
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)by continent(?=(?:\W.*?)?\]\])', ur'\1بر پایه قاره', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)by country(?=(?:\W.*?)?\]\])', ur'\1بر پایه کشور', text)
      text = re.sub(u'(\[\[[Cc]ategory:(?:.*?\W)?)by city(?=(?:\W.*?)?\]\])', ur'\1بر پایه شهر', text)
      # after "|"
      text = re.sub(u'(\[\[[Cc]ategory:.*?\| ?)'+enLoc+'(?= ?\]\])', ur'\1'+faLoc, text)
      if u'|'+enLoc+u']]' in text:
         text = text.replace(u'|'+enLoc+u']]', u'|'+faLoc+u']]')
      text = re.sub(u'(\[\[[Cc]ategory:.*?\| ?)[Aa]irports(?= ?\]\])', ur'\1فرودگاه‌ها', text)
      text = re.sub(u'(\[\[[Cc]ategory:.*?\| ?)[Ll]ists(?= ?\]\])', ur'\1فهرست‌ها', text)
      # other
      text = re.sub(u'(\[\[[Cc]ategory:.*?) \(country\)(?=.*?\]\])', ur'\1 (کشور)', text)
      text = re.sub(u'(\[\[[Cc]ategory:.*?) the (?=.*?\]\])', ur'\1', text)
      # category -> رده
      text = re.sub(u'(?<=\[\[)[Cc]ategory:(?=['+faChrs+u'‌ \|\-]*?\]\])', u'رده:', text)

      text += u'\n[[en:Category:' + enName + u']]\n'

      if not u'[[رده:' in text:
         text = u'[[رده:برای بازبینی انسان (رده)]]\n\n' + text
         print u'bazbini'
      elif u'[[Category:' in text or u'[[category:' in text:
         text = u'[[رده:برای بازبینی انسان (رده)]]\n\n' + text
         print u'bazbini'

      # Submit the page
      page = wikipedia.Page(wikipedia.getSite(), faName)
      try:
        pagetext = page.get()
      except:
        page.put(text, u'ربات: ایجاد خودکار رده، برگرفته از: %s ([[وپ:درخواست‌های ربات/cat generator.py|کد]])' % enPagePermalink)
        f = codecs.open(u'cats.txt', 'a', 'utf-8')
        f.write(u'\n[['+page.title()+u']]')

try:
  main()
except KeyboardInterrupt:
  pywikibot.stopme()