ویکی‌پدیا:درخواست‌های ربات/افزودن صفحه توضیحات به الگوها

از ویکی‌پدیا، دانشنامهٔ آزاد
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Reza1615
 
__version__ = '$Id: $'
 
import wikipedia,pagegenerators
import re, os, codecs, catlib, sys,query
global site,ensite
wikipedia.config.put_throttle = 0
wikipedia.put_throttle.setDelay()
faChars = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیًٌٍَُِّْٓيك' + u'۰۱۲۳۴۵۶۷۸۹' + u'‌'
site = wikipedia.getSite('fa')
ensite = wikipedia.getSite('en')
#titles = ['template1', 'template2', 'etc.']
def namespacefinder( 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.replace(u' ',u'_')
    site = wikipedia.getSite(firstsite)
    params = {
        'action': 'query',
        'prop': 'revisions',
        'titles': enlink,
        'rvprop': 'user',
        'lllimit':500,
    }
    a=1    
    try:
        categoryname = query.GetData(params,site, encodeTitle = True)
        for item in categoryname[u'query'][u'pages']:
            users=categoryname[u'query'][u'pages'][item]['revisions']
        return users
    except: 
        return False
def englishdictionry( enlink ,firstsite,secondsite):
    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'')
    if enlink.find('#')!=-1:
        return False
    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, encodeTitle = True)  
        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
        result=intersec
        if result.find('#')!=-1:
            return False
        return result
    except: 
        return False
def linktranslation(text):
        linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
        counter=0
        for item in linken:
                counter+=1
                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')
                    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(u'\03{lightred}----'+str(counter)+u'/'+str(len(linken))+u'----\03{default}')
                wikipedia.output(itemen)    
        text=text.replace(u'@1@',u'[[').replace(u'@2@',u']]')
        return text
def encondition(title):
    item=False
    itemsub=False
    ensubtext=u' '
    subpages=[u'documentation',u'template documentation',u'template doc',u'doc',u'documentation, template',u'Documentation',u'Doc']
 
    try:
        enpage = wikipedia.Page(ensite, title)
        texten=enpage.get()
        if texten:
            item=True
    except wikipedia.IsRedirectPage:
            enpage = enpage.getRedirectTarget()
            title=enpage.title()
            try:
                enpage = wikipedia.Page(ensite, title)    
                texten=enpage.get()
                if texten:
                    item=True
            except:
                return False,False,ensubtext
    except:
        return False,False,ensubtext

    for subp in subpages:
        try:
            title2=title+u'/'+subp
            enpage = wikipedia.Page(ensite, title2)
            texten=enpage.get()
            if texten:
                itemsub=True
                ensubtext=texten
        except:
            continue
    m = re.search(ur'\[\[([a-z]{2,3}|[a-z]{2,3}\-[a-z\-]{2,}|simple):.*?\]\]', texten)    
    try:
        items= m.group(0)
    except:
        if not englishdictionry(title ,'fa','en'):
            if ensubtext.find(u'<includeonly>')!=-1 and ensubtext.find(u'</includeonly>')!=-1:
                ensubtext=ensubtext.replace(u'<includeonly>',u'<includeonly>\n[[en:'+title+u']]\n')
            else:
                ensubtext+=u'<includeonly>\n[[en:'+title+u']]\n</includeonly>'    
    return item,itemsub,ensubtext
 
class BasicBot:
    def run(self,preloadingGen):
        for title in preloadingGen:
            if u'/توضیحات' in title.title():
                continue    
            wikipedia.output(title.title())
            namespace=namespacefinder( title.title()+u'/توضیحات' ,'fa')
            if namespace:
                  #wikipedia.output(str(namespace))
                  continue
            title=title.title().replace(u'الگو:',u'')
            title = 'Template:' + title
            if title == re.sub(u'[%s]' % faChars, '', title):
                  main,sumain,ensubtext=encondition(title)
                  try:
                      page = wikipedia.Page(site, title)
                      text = page.get()
                      if  text.find(u'{{Flag template documentation')!=-1 or text.find(u'{{flag template documentation')!=-1:    
                          continue    
                  except:
                      continue
                  if sumain:
                          pageDoc = wikipedia.Page(site, title+u'/توضیحات')
                          if ensubtext!=' ':
                              ensubtext=linktranslation(ensubtext)
                              pageDoc.put(ensubtext, comment=u'ربات: افزودن توضیحات ([[وپ:درخواست‌های ربات/افزودن صفحه توضیحات به الگوها|کد]])', minorEdit=True)
                              if text.find(u'{{توضیحات}}')!=-1 :
                                   continue
                              if text.find(u'{{documentation}}')==-1 and text.find(u'{{template documentation}}')==-1 and text.find(u'{{template doc}}')==-1 and text.find(u'{{doc}}')==-1 and text.find(u'{{Doc}}')==-1 and text.find(u'{{documentation, template}}')==-1 and text.find(u'{{Documentation}}')==-1:
                                  if text.find(u'</noinclude>')!=-1 :
                                        text = text.replace(u'</noinclude>', u'\n{{توضیحات}}\n</noinclude>')
                                  elif text.find(u'<noinclude>')!=-1 :
                                      text = text.replace(u'<noinclude>', u'<noinclude>\n{{توضیحات}}\n</noinclude>')
                                  else:
                                      text += u'\n<noinclude>{{توضیحات}}</noinclude>'    
                                      
                                  try:
                                      page.put(text, comment=u'ربات:افزودن توضیحات ([[وپ:درخواست‌های ربات/افزودن صفحه توضیحات به الگوها|کد]])', minorEdit=True)
                                  except:
                                      continue
                              else:
                                  text=text.replace(u'{{documentation}}',u'{{توضیحات}}').replace(u'{{template documentation}}',u'{{توضیحات}}').replace(u'{{template doc}}',u'{{توضیحات}}').replace(u'{{doc}}',u'{{توضیحات}}').replace(u'{{documentation, template}}',u'{{توضیحات}}').replace(u'{{Documentation}}',u'{{توضیحات}}').replace(u'{{Doc}}',u'{{توضیحات}}')
                                  try:
                                      page.put(text, comment=u'ربات: افزودن توضیحات ([[وپ:درخواست‌های ربات/افزودن صفحه توضیحات به الگوها|کد]])', minorEdit=True)
                                  except:
                                      continue    
                              continue
'''
          text = page.get()
          textDoc = pageDoc.get()
          if text.find('[[en:') == -1:
            if textDoc.find('[[en:') == -1:
              if wikipedia.Page(ensite, title).exists():
                text = text.replace(u'</noinclude>', u'\n[[en:%s]]\n</noinclude>' % title)
                if text.find('[[en:') == -1:
                  text += u'<noinclude>\n[[en:%s]]\n</noinclude>' % title
                self.add_iw(page, text)
 
    def add_iw(self, text, page):
      try:
        page.put(text, comment=u'ربات: تشخیص و افزودن میان‌ویکی انگلیسی ([[وپ:درخواست‌های ربات/افزودن صفحه توضیحات به الگوها|کد]])', minorEdit=True, botflag=True)
      except wikipedia.LockedPage:
        wikipedia.output(u"Page %s is locked; skipping." % page.title(asLink=True))
      except wikipedia.EditConflict:
        wikipedia.output(u'Skipping %s because of edit conflict' % page.title())
      except wikipedia.SpamfilterError, error:
        wikipedia.output(u'Cannot change %s because of spam blacklist entry %s' % (page.title(), error.url))
 
'''
def main():
    wikipedia.config.put_throttle = 0
    wikipedia.put_throttle.setDelay()
    gen = None
    summary_commandline = None
    exceptions = []
    namespaces = []
    template = None
    PageTitles = []
    autoText = False
    autoTitle = False
    genFactory = pagegenerators.GeneratorFactory()
    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 chage?' ) )
            else:
                PageTitles.append( arg[6:] )
        elif arg.startswith( '-except:' ):
            exceptions.append( arg[8:] )
        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.stopme()
        sys.exit()
    if namespaces != []:
        gen = pagegenerators.NamespaceFilterPageGenerator( gen,namespaces )
#    gen = pagegenerators.RedirectFilterPageGenerator(gen)
    preloadingGen = pagegenerators.PreloadingGenerator( gen,pageNumber = 60 )
    bot = BasicBot()
    bot.run(preloadingGen)
 
 
if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()