1. #!/usr/bin/python
  2. # -*- coding: utf-8  -*-
  3. # Wikipedia:Bots/Requests_for_approval/Mobius_Bot_3
  4. # Fixing reflist errors
  5.  
  6. import wikipedia
  7. import re
  8. import pagegenerators
  9. import catlib
  10.  
  11. from optparse import OptionParser
  12. parser = OptionParser()
  13. parser.add_option("-d", action="store_true", dest="debugmode", default = False)
  14. parser.add_option("-s", dest="singlepage", default = "")
  15. parser.add_option("-p", dest="fromlinks", default = "")
  16. parser.add_option("-c", action="store_true", dest="fromcat", default = False)
  17. parser.add_option("-t", dest="fromtemplate", default = "")
  18. (options, args) = parser.parse_args()
  19.  
  20. site = wikipedia.getSite()
  21. starsList = [
  22. u'bueno',
  23. u'cyswllt[ _]erthygl[ _]ddethol', u'dolen[ _]ed',
  24. u'destacado', u'destaca[tu]',
  25. u'enllaç[ _]ad',
  26. u'enllaz[ _]ad',
  27. u'leam[ _]vdc',
  28. u'legătură[ _]a[bcf]',
  29. u'liamm[ _]pub',
  30. u'lien[ _]adq',
  31. u'lien[ _]ba',
  32. u'liên[ _]kết[ _]bài[ _]chất[ _]lượng[ _]tốt',
  33. u'liên[ _]kết[ _]chọn[ _]lọc',
  34. u'ligam[ _]adq',
  35. u'ligoelstara',
  36. u'ligoleginda',
  37. u'link[ _][afgu]a', u'link[ _]adq', u'link[ _]f[lm]', u'link[ _]km',
  38. u'link[ _]sm', u'linkfa',
  39. u'na[ _]lotura',
  40. u'nasc[ _]ar',
  41. u'tengill[ _][úg]g',
  42. u'ua',
  43. u'yüm yg',
  44. u'רא',
  45. u'وصلة مقالة جيدة',
  46. u'وصلة مقالة مختارة',
  47. ]
  48. def main():
  49.     Rparam = re.compile(ur'\|Gemeindeschlüssel[\s]*=([\s]*[0-9]+[\s]*)+\|', re.I)
  50.     Rreflist = re.compile(ur'(\{\{reflist[|}]|<references\/>)', re.I)
  51.     Rrefcomment = re.compile(ur'<!--(.*?)<ref[^>]*>.+?</ref>', re.I)
  52.     Rrefs = re.compile(ur'<ref[^>]*>.+?</ref>', re.I)
  53.     if options.debugmode:
  54.         wikipedia.output('\03{purple}Debug mode activated: no changes will be made\03{default}')
  55.     for page in generator():
  56.         if ((not page.isRedirectPage()) and not Rreflist.search(page.get()) and (Rrefs.search(page.get()) or Rparam.search(page.get())) and (len(re.findall(ur'<!--(.*?)<ref>.+?</ref>', page.get())) != len(re.findall('<ref>.+?</ref>', page.get())) or len(re.findall(ur'<!--(.*?)<ref>.+?</ref>', page.get())) == 0)):
  57.             newtext = page.get()
  58.             categoriesInside = wikipedia.getCategoryLinks(newtext, site)
  59.             newtext = wikipedia.removeCategoryLinks(newtext, site)
  60.             interwikiInside = wikipedia.getLanguageLinks(newtext, site)
  61.             newtext = wikipedia.removeLanguageLinks(newtext, site)
  62.            
  63.             if (site.language()==u'nn'):
  64.                 newtext = newtext.replace(nn_iw_msg, '')
  65.            
  66.             newtext += u"\n%s" % '\n==References==\n{{reflist}}'
  67.             newtext = wikipedia.replaceCategoryLinks(newtext, categoriesInside, site, True)
  68.             if (site.language()==u'nn'):
  69.                 newtext = newtext + u'\n' + nn_iw_msg
  70.            
  71.             allstars = []
  72.             starstext = wikipedia.removeDisabledParts(page.get())
  73.             for star in starsList:
  74.                 regex = re.compile('(\{\{(?:template:|)%s\|.*?\}\}[\s]*)' % star,
  75.                                                    re.I)
  76.                 found = regex.findall(starstext)
  77.                 if found != []:
  78.                     newtext = regex.sub('', newtext)
  79.                     allstars += found
  80.             if allstars != []:
  81.                 newtext = newtext.strip()+'\r\n\r\n'
  82.                 allstars.sort()
  83.                 for element in allstars:
  84.                     newtext += '%s\r\n' % element.strip()
  85.            
  86.             newtext = wikipedia.replaceLanguageLinks(newtext, interwikiInside, site)
  87.             while (re.search(ur'({{[^}]*}})[\s]*(==References==\n\{\{reflist\}\})', newtext) and not re.search(ur'(\][ ]*|[*:]+[ ]*)({{[^}]*}})[\s]*(==References==\n\{\{reflist\}\})', newtext)):
  88.                 newtext = re.sub(ur'({{[^}]*}})[\s]*(==References==\n\{\{reflist\}\})',ur'\2\n\1', newtext)
  89.            
  90.             if not options.debugmode:
  91.                 page.put(newtext, 'Bot: Adding {{reflist}}, article has references but no corresponding display tag/template')
  92.            
  93.             else:
  94.                 wikipedia.output('\03{lightgreen}' + page.title() + '\03{default} \n')
  95.                 wikipedia.showDiff(page.get(), newtext)
  96.         else:
  97.             wikipedia.output('\03{lightblue}' + page.title() + ': Page already has reflist, or has no references\03{default}')
  98. def generator():
  99.     if options.singlepage: return [wikipedia.Page(site, options.singlepage),]
  100.     elif options.fromlinks: return pagegenerators.LinkedPageGenerator(wikipedia.Page(site, options.fromlinks))
  101.     elif options.fromcat: return pagegenerators.CategorizedPageGenerator(catlib.Category(site, 'Category:Pages_with_missing_references_list'))
  102.     elif options.fromtemplate: return wikipedia.Page(site, options.fromtemplate).getReferences(True, True, True)
  103. if __name__ == '__main__':
  104.     try:
  105.         main()
  106.     finally:
  107.         wikipedia.stopme()