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

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

کد به روش‌های مختلف و به کمک اطلاعات موجود در جعبه اطلاعات و متن بخش آغازین و میان‌ویکی‌ها و بعضاً حتی زیربخش‌های مقالهٔ انگلیسی مرتبط با فرودگاه یا پایگاه هوایی، مقالهٔ فارسی را (با جعبهٔ اطلاعات و رده‌های مناسب و میان‌ویکی و الگوی خرد مرتبط و الخ) می‌سازد (مثلاً نام بومی فرودگاه را نخست بر اساس اطلاعات infobox و اگر نبود/نشد از بخش آغازین باز هم اگر نشد از عنوان میان‌ویکی به زبان کشور مربوطه می‌گیرد). ( نمونه)

بسته به نوع کشور متغیرهای بخش SETTING را تغییر دهید. (مثلاً تنظیمات این کد برای کشور قزاقستان است)

برای گذاشتن روی حالت تست (صفحه ذخیره نمی‌شود ولی صفحهٔ تولیدشده بر روی نمایشگر چاپ می‌شود)، علامت کامنت (#) پیش از test = False را بردارید و به آن مقدار True دهید.

جا دارد بگویم ایدهٔ ساخت مقاله از روی ویکی‌های دیگر از امیر (Ladsgroup) بود و اولین کد به این سبک را وی ساخت که کدش در ویکی هم موجود است.

#!/usr/bin/python
# -*- coding: utf-8  -*-

__version__ = '$Id: airbases.py, v1.0 2010/04/15$'

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

# SETTING
#test = False
cntName = u'قزاقستان'
cntNameEn = u'Kazakhstan'
cntNameEnAlt = u'Kazakhstan'
langName = u'قزاقی'
langCode = u'kk' # کد ایزو ۶۳۹ زبان رسمی کشور موردنظر
dName = u'аэропорт|аэродром|авиабаза' ###
artDic = {u'Almaty International Airport': u'فرودگاه بین‌المللی آلماآتی',
u'Boraldai Airport|Almaty-Burundai Airport': u'فرودگاه برولدای',
u'Aktau Airport': u'فرودگاه آقتائو',
u'Aktobe Airport': u'فرودگاه آقتوبه',
u'Arkalyk Airport': u'فرودگاه آرقالیق',
u'Astana International Airport': u'فرودگاه بین‌المللی آستانه',
u'Atbasar Airport': u'فرودگاه آتباسار',
u'Atyrau Airport': u'فرودگاه آتیرائو',
u'Balkhash Airport': u'فرودگاه بالقاش',
u'Zhezkazgan Airport': u'فرودگاه جزقازغان',
u'Ekibastuz Airport': u'فرودگاه اکیباستوز',
u'Sary-Arka Airport': u'فرودگاه ساری-آرقا',
u'Kokshetau Airport': u'فرودگاه کوکشتائو',
u'Kostanay Airport': u'فرودگاه قوستانای',
u'Oral Ak Zhol Airport': u'فرودگاه آق ژول',
u'Oskemen Airport': u'فرودگاه اوسکمن',
u'Pavlodar Airport': u'فرودگاه پاولودار',
u'Petropavlovsk Airport': u'فرودگاه پتروپاولوفسک',
u'Kyzylorda Airport': u'فرودگاه قیزیل‌اوردا',
u'Semey Airport': u'فرودگاه سمیی',
u'Shymkent Airport': u'فرودگاه شیمکنت',
u'Taldykorgan Airport': u'فرودگاه تالدیقورغان',
u'Taraz Airport': u'فرودگاه تاراز',
u'Zaysan Airport': u'فرودگاه زایسان',
u'Ush Tobe': u'اوش توبه'
}
#locDic = {u'Vaskovo':u'وسکوف'}

enSite = wikipedia.getSite('en')
text = ''
info = dict()
faNums = u'۰۱۲۳۴۵۶۷۸۹'
enNums = u'0123456789'
bLA = u'(?![\w\-])'
bLB = u'(?<![\w\-])'
R = re.compile(ur'\[\[(.+?)(?:\]\]|\|)')
keyTpl = ('nativename-a', 'image', 'caption', 'type', 'owner', 'operator', 'owner-oper', 'location', 'coordinates', 'built', 'used', 'occupants', 'IATA', 'ICAO', 'FAA', 'TC', 'GPS')

def translate(trnsTxt):
  trnsTxt = re.sub(u'[Cc]oncrete ?(?:raod|\(material\)|)', u'بتن', trnsTxt)
  trnsTxt = re.sub(u'[Aa]sphalt', u'آسفالت', trnsTxt)
  trnsTxt = re.sub(u'[Gg]ravel', u'شن‌وماسه', trnsTxt)
  trnsTxt = re.sub(u'(?:[Gg]reen|[Tt]urf ?(?:/|&|and) ?[Ll]awn|[Tt]urf|[Ll]awn|[Gg]rassy?)(?: ?[Gg]rass(?:es|)|)', u'چمن', trnsTxt)
  trnsTxt = re.sub(u'[Dd]irt', u'خاکی', trnsTxt)
  trnsTxt = re.sub(u'[Ww]ater', u'آب', trnsTxt)
  trnsTxt = re.sub(u'[Pp]aved', u'صاف‌شده', trnsTxt)
  trnsTxt = re.sub(u'[Pp]assengers', u'مسافران', trnsTxt)
  trnsTxt = re.sub(u'[Mm]ovements', u'تحرکات', trnsTxt)
  trnsTxt = re.sub(u'[Mm]ilitary ?(?:/|-|&|and) ?[Pp]ublic', u'نظامی/عمومی', trnsTxt)
  trnsTxt = re.sub(u'[Pp]ublic ?(?:/|-|&|and) ?[Mm]ilitary', u'نظامی/عمومی', trnsTxt)
  trnsTxt = re.sub(u'[Mm]ilitary', u'نظامی', trnsTxt)
  trnsTxt = re.sub(u'(?:[Pp]ublic|[Cc]ivilian|[Cc]ivil)', u'عمومی', trnsTxt)
  trnsTxt = re.sub(u'[Pp]rivate', u'خصوصی', trnsTxt)
  trnsTxt = re.sub(u'[Jj]oint', u'مشترک', trnsTxt)
  trnsTxt = re.sub(u'(?:%s |%s )[Gg]overnment' % (cntNameEn, cntNameEnAlt), u'دولت '+cntName, trnsTxt)
  trnsTxt = re.sub(bLB+u'[Yy]es', u'بله', trnsTxt)
  trnsTxt = re.sub(bLB+u'[Nn]o'+bLA, u'خیر', trnsTxt)
  trnsTxt = re.sub(u'[Ss]tatistics?', u'آمار و ارقام', trnsTxt)
  trnsTxt = re.sub(u'[Ss]ources?: ?', u'منبع: ', trnsTxt)
  trnsTxt = re.sub(u'[Uu]nknown', u'نامعلوم', trnsTxt)
  trnsTxt = re.sub(u'[Aa]irport "?(.*?)"?(?: [Ll]td\.?| [Cc]ompany)', ur'شرکت هواپیمایی \1', trnsTxt)
  trnsTxt = re.sub(u'"?(.*?)"?(?: [Ll]td\.?| [Cc]ompany)', ur'شرکت \1', trnsTxt)
  trnsTxt = re.sub(cntNameEn+u' ?[Aa]ir ?[Ff]orce', u'نیروی هوایی '+cntName, trnsTxt)
  trnsTxt = re.sub(u'(?:\[\[|)'+cntNameEnAlt+u'(?:\]\]|)', u'[['+cntName+u']]', trnsTxt)
  trnsTxt = re.sub(u'[Aa]bandoned', u'رهاشده', trnsTxt)
  trnsTxt = re.sub(u'[Pp]resent', u'اکنون', trnsTxt)
  for i in range(0, 10):
    trnsTxt = trnsTxt.replace(enNums[i], faNums[i])
  for i in range(0, 10):
    trnsTxt = trnsTxt.replace('r'+faNums[i], 'r'+enNums[i])
    trnsTxt = trnsTxt.replace('h'+faNums[i], 'h'+enNums[i])
    trnsTxt = trnsTxt.replace('t'+faNums[i], 't'+enNums[i])
  return trnsTxt

def extpar(mstr):
 template = re.search(u'\{\{\s*[Ii]nfobox[^|]*?(\|(?:[^\}\{]|\{\{.*?\}\})*?)\}\}', mstr, re.S)
 try:
  #tplText = translate(template.group(0)) # redunant
   m = re.split(u'\|((?:[^\|\}\{]|\{\{.*?\}\}|\[\[.*?\]\])*)', template.group(1), re.S)
   for n in m:
     if n.strip() != "":
       tplSrp = re.search(ur'\s*?(.*?)\s*?=\s*?(.*)\s*?', n, re.S)#([^\=]*?)###\s
       tplSrpOne = tplSrp.group(1).strip()
      #tplSrpTwo = tplSrp.group(2)
       tplSrpTwo = translate(tplSrp.group(2)).strip()#(tplSrpTwo)
       if re.sub(ur'[\s\n]*', u'', tplSrpTwo, re.S) != '':
         info[tplSrpOne] = tplSrpTwo
       else:
         info[tplSrpOne] = 'NV'
   for i in range(0, len(keyTpl)):
     if not info.has_key(keyTpl[i]):
       info[keyTpl[i]] = 'NK'
   return info
 except AttributeError:
   print 'ERROR: Infobox'
   return False

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

def faFinder(a):
    apage = wikipedia.Page(enSite, a)
    try:
       atext = apage.get()
    except wikipedia.IsRedirectPage:
       apage = apage.getRedirectTarget()
       atext = apage.get()
    except wikipedia.NoPage:
       return 'False'
    try:
       return re.search(ur'\[\[fa:(.+?)]]', atext).group(1)
    except AttributeError:
       return 'False'

def main():
  for enName in artDic.keys():
      print u'[[%s]]' % enName
      enpage = wikipedia.Page(enSite, enName)
      try:
        enText = enpage.get()
      except wikipedia.IsRedirectPage:
        enpage = enpage.getRedirectTarget()
        enText = enpage.get()
      except wikipedia.NoPage:
        print u'ERROR: NoPage: ' + enName
        continue
      datadict = extpar(enText) ###
      if datadict is False:
        continue
      faName = artDic[enName]
      enPagePermalink = enpage.permalink()
      enPagePermalink = enPagePermalink.replace(u'&redirect=no&useskin=monobook', u'')
      bazbini = False
      cats = u''
      stubs = u'\n{{فرودگاه-%s-خرد}}\n' % cntName
      if artDic.has_key(enName):
          # Name in Lang.
          nameInLang = u''
          try:
            nameInLang = re.search(u'{{[Ll]ang-'+langCode+ur'\|(.*?)}}', enText).group(1)
          except AttributeError:
            try:
              nameInLang = re.search(u'\[\['+langCode+u':(.*?)\]\]', enText).group(1)
            except AttributeError:
              nameInLang = False

          if nameInLang is not False:
            nameInLang = re.sub(u' \((?:'+dName+u')\)', u'', nameInLang)
            inLang = u'{{به ' + langName + u'|' + nameInLang + u'}} '
          else:
            inLang = u''

          location = u''
          if info['location'] != u'NK' and info['location'] != u'NV':
            location = re.sub(u'\s*?\[\[(.*?)\]\]\s*?', ur'\1', info['location'])#info['location'] = re.sub(u'\s*?\[\[(.*?)\]\]\s*?', ur'\1', info['location'])
           #try:
             #location = locDic[info['location']]
           #except KeyError:
             #location = faFinder(info['location'])
             #if location == 'False':
               #location = info['location']
               #cats += u'[[رده:مقاله‌های نیازمند به فارسی‌سازی]]\n'
               #bazbini = True
          else:
            bazbini = True

          infobox = re.search(u'\{\{ ?[Ii]nfobox ?[Aa]ir.*?(?:[^\}\{]|\{\{.*?\}\})*?\}\}', enText, re.S)
          if not infobox:
            continue
          infobox = translate(infobox.group(0))
          infobox = re.sub(u'\|\s*?name(\s*?)=\s*?.+\s*?', ur'| name\1= '+faName, infobox)
          infobox = re.sub(u'\|\s*?location(\s*?)=\s*?.+\s*?', ur'| location\1= [['+location+u']]', infobox)
          infobox = infobox.replace(u'[[]]', u'')

          if re.search(u'{{[Aa]irport codes.*?}}', enText):
            codeTpl = ('IATA', 'ICAO', 'FAA', 'TC', 'GPS')
            temp = False
            for i in range(0, 4):
              if info[codeTpl[i]] != u'NK' and info[codeTpl[i]] != u'NV':
                temp = True
            if temp is False:
              bazbini = True

          international = False
          if re.search(bLB+u'(?:is|was) an? .*?international air', enText):
              international = True
          text = infobox + u"\n'''" + faName + u"''' " + inLang
          if re.search(bLB+u'(?:is|was) an? .*?air ?(?:port|field)', enText):
              text += u'فرودگاهی '
              if international is True:
                 text += u'بین‌المللی '
                 cats += u'[[رده:فرودگاه‌های بین‌المللی ' + cntName + u']]\n' % cntName
          elif re.search(bLB+u'(?:is|was) an? .*?air ?base', enText):
              text += u'یک [[پایگاه هوایی]] '
              if international is True:
                 text += u'بین‌المللی '
                 cats += u'[[رده:پایگاه‌های هوایی بین‌المللی %s]]\n' % cntName
          elif re.search(bLB+u'(?:is|was) an? .*?air ?line', enText):
              text += u'یک [[شرکت هواپیمایی]] '
              if international is True:
                 text += u'بین‌المللی '
                 cats += u'[[رده:شرکت‌های هواپیمایی بین‌المللی %s]]\n' % cntName
              else:
                 cats += u'[[رده:شرکت‌های هواپیمایی %s]]\n' % cntName
          else:
              bazbini = True

          if u'عمومی' in info['type']:
              text += u'عمومی '
          if u'خصوصی' in info['type']:
              text += u'خصوصی '
              cats += u'[[رده:فرودگاه‌های خصوصی %s]]\n' % cntName
          if u'نظامی' in info['type']:
              text += u'نظامی '
              cats += u'[[رده:فرودگاه‌های نظامی %s]]\n' % cntName
              stubs += u'{{%s-نظامی-خرد}}' % cntName
          text = re.sub(u'بین‌المللی (عمومی|خصوصی|نظامی)', ur'بین‌المللی و \1', text)

          if u'نیروی هوایی' in info['operator']:
              cats += u'[[رده:پایگاه‌های نیروی هوایی %s]]\n' % cntName
              if not u'نظامی' in stubs:
                stubs += u'{{%s-نظامی-خرد}}' % cntName

          text += u'واقع'
          if location == u'':
             try:
               location = re.search(bLB+u'(?:located|situated)(?: within| about) [0-9]+(?: ?[Kk]ms?| kilomete?re?s?)(?: ?\(.*?\))(?: outside| (?:south|north|)(?:east|west|))(?: from| of|) .*?\[\[(.*?)(?:\|.*?)\]\]', enText).group(1)
             except AttributeError:
                try:
                  location = re.search(bLB+u'(?:is|was) an? .*?air ?(?:port|field|line|base)(?: located| situated|) in \[\[(.*?)(?:\|.*?)\]\]', enText).group(1)
                except AttributeError:
                  pass
          if location != u'':
              text += u' در [[%s]]' % location
          else:
              bazbini = True
          text += u' در کشور [[%s]] است' % cntName

          if info['operator'] != u'NK' and info['operator'] != u'NV':
            if info['operator'] == u'رهاشده':
              text += u' که رهاشده‌است و هم‌اکنون مورد استفاده قرار نمی‌گیرد'
              cats += u'[[رده:فرودگاه‌های رهاشده %s]]\n' % cntName
            else:
              text += u' که توسط %s اداره می‌شود' % info['operator']

          text += u'.\n'

          if re.search(u'\n=+.*?(?:[Aa]ccident|[Ii]ncident).*?=+\n', enText):
              text += u'\n== سوانح ==\n{{بخش-خرد}}\n'

          if re.search(u'= *[Gg]allery *=', enText):
              text += u'\n== نگارخانه ==\n' + re.sub(ur'= *[Gg]allery *=+\n(.*?)\n=', ur'\1', enText, re.S) + u'\n'
              bazbini = True

          text += u'''
== جستارهای وابسته ==
{{ جستارهای وابسته
| درگاه = هوانوردی | درگاه۲ = %s
| فهرست فرودگاه‌های %s | 
}}
''' % (cntName, cntName)
          text += u'\n== منابع ==\n'
          if u'<ref' in text:
              text += u'{{پانویس|چپ‌چین=بله}}\n'
          text += u'* {{یادکرد-ویکی | پیوند = %s | عنوان = %s | زبان = انگلیسی |بازیابی = {{جا:الان|پیوند=نه}}}}\n' % (enPagePermalink, enName)
          if re.search(u'= *[Ee]xternal [Ll]inks? *=', enText):
              text += u'\n== پیوند به بیرون ==\n' + re.sub(ur'= *[Ee]xternal [Ll]inks? *=+\n(.*?\n.*?)(?=\{\{|\[\[[Cc]ategory:)', ur'\1', enText, re.S)

          navbox = u'\n\n{{فرودگاه‌های %s}}\n' % cntName

          RF = re.compile(ur'\[\[[Cc]ategory:(.+?)(?:\]\]|\|)')

          for ahah in RF.findall(enText):
             pagename = u'Category:'+ahah
             if not englishdictionry(pagename) == 'False':
                cats += u'\n[['+englishdictionry(pagename)+u']]'

          if cats == u'':
             bazbini = True
          else:
             cats = u'\n' + cats

          if bazbini is True:
             cats += u'\n[[رده:برای بازبینی انسان (فرودگاه)]]\n'

          text += stubs + navbox + cats + u'\n\n[[en:'+enName+u']]\n'

          text = text.replace(u'\n\n\n', u'\n\n').replace(u']]\n\n[[رده:', u']]\n[[رده:').replace(u'\n\n\n', u'\n\n')

          page = wikipedia.Page(wikipedia.getSite(), faName)

         #if test is True:
           #print text
           #wikipedia.stopme()

          try:
            pagetext = page.get()
          except:
            page.put(text, u'ربات: ایجاد مقاله ([[وپ:درخواست‌های ربات/مقاله‌ساز/فرودگاه‌ها|کد]])')
            f = codecs.open(u'wb.txt', 'a', 'utf-8')
            f.write(u'[['+page.title()+u']]')            
          else:
            if not u'[[en' in pagetext:
              page.put(pagetext + u'\n\n[[en:'+enName+u']]\n', u'ربات: افزودن معادل انگلیسی')
              f = codecs.open(u'wb.txt', 'a', 'utf-8')
              f.write(u'[['+page.title()+u']]')

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