Advertisement
Guest User

Bot

a guest
Jun 22nd, 2020
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.02 KB | None | 0 0
  1. import pywikibot
  2. from pywikibot import pagegenerators
  3.  
  4. templateStart = u"{{U\u017cytkownik:Expert3222/self"
  5. replacedTemplateStart = "{{self2"
  6.  
  7. # returns page list for testing or real work
  8. def getPageList(testing):
  9.     if testing:
  10.         return pagegenerators.TextfilePageGenerator("lista.txt")
  11.     else:
  12.         return pagegenerators.ReferringPageGenerator(pywikibot.Page(pywikibot.Site("pl"), "Szablon:Self"))
  13.  
  14. # name should be self-explanatory :P
  15. def doWork():
  16.     string = raw_input("Testujemy? ")
  17.     testing = string.lower() == "tak"
  18.     for page in getPageList(testing):
  19.         processPage(page)
  20.  
  21. def processPage(page):
  22.     text = page.text
  23.     pos = 0
  24.     while True:
  25.         pos = text.find(templateStart, pos)
  26.         if pos == -1:
  27.             break
  28.  
  29.         ret = getNearestSelf(text, pos)
  30.         pos = ret[0]
  31.         posEnd = ret[1]
  32.         arguments = ret[2]
  33.  
  34.         ret = replaceSelf(text, pos, posEnd, arguments)
  35.         replacedText = ret[0]
  36.         replacement = ret[1]
  37.  
  38.         # template is already converted to new version
  39.         if replacement == templateStart + "}}":
  40.             pos = posEnd + 1
  41.             continue
  42.        
  43.         sizeDelta = len(text) - len(replacedText)
  44.         text = replacedText
  45.         pos = posEnd - sizeDelta + 1
  46.  
  47.    
  48.     #if raw_input("Zapisac strone? ").lower() == "tak":
  49.     page.text = text
  50.     page.save("Test")
  51.     return text
  52.  
  53. # processes argument of form abc=def and inserts it into argument array, returns unnamedParameterCounter, incremented if needed
  54. def processArgument(text, arguments, unnamedParameterCounter):
  55.     equalsPos = text.find("=")
  56.     if equalsPos == -1:
  57.         arguments[str(unnamedParameterCounter)] = text[equalsPos + 1 : len(text)]
  58.         unnamedParameterCounter = unnamedParameterCounter + 1
  59.     else:
  60.         arguments[text[0 : equalsPos]] = text[equalsPos + 1 : len(text)]
  61.    
  62.     return unnamedParameterCounter
  63.  
  64. # replaces one instance of self template with new one based on arguments array
  65. def replaceSelf(text, pos, posEnd, arguments):
  66.     leftHalf = text[0 : pos]
  67.     rightHalf = text[posEnd + 1 : len(text)]
  68.     replacement = replacedTemplateStart
  69.     for i in range(1, 4):
  70.         if not str(i) in arguments:
  71.             break
  72.  
  73.         name = arguments[str(i)]
  74.         if not "param" + str(i) in arguments:
  75.             break
  76.         value = arguments["param" + str(i)]
  77.         replacement = replacement + "|{{" + name + "|" + value + "}}"
  78.     replacement = replacement + "}}"
  79.  
  80.     print (text[pos : posEnd + 1] + "\t" + replacement)
  81.  
  82.     return (leftHalf + replacement + rightHalf, replacement)
  83.  
  84. # returns tuple with starting, ending positions and arguments of self template nearest to pos
  85. def getNearestSelf(text, pos):
  86.     openedBraces = 1
  87.     argumentStart = -1
  88.     arguments = {}
  89.     posEnd = -1
  90.     unnamedParameterCounter = 1
  91.     for i in range(pos + len(templateStart), len(text)):
  92.         if text[i : i + 2] == "{{":
  93.             openedBraces = openedBraces + 1
  94.         elif text[i : i + 2] == "}}":
  95.             openedBraces = openedBraces - 1
  96.             if openedBraces == 0:
  97.                 processArgument(text[argumentStart : i], arguments, unnamedParameterCounter)
  98.         elif text[i] == "|" and openedBraces == 1:
  99.             if argumentStart != -1:
  100.                 unnamedParameterCounter = processArgument(text[argumentStart : i], arguments, unnamedParameterCounter)
  101.                 argumentStart = i + 1
  102.             else:
  103.                 argumentStart = i + 1
  104.        
  105.         if openedBraces == 0:
  106.             posEnd = i + 1
  107.             break
  108.    
  109.     print pos, posEnd, arguments
  110.     return (pos, posEnd, arguments)
  111.  
  112. doWork()
  113. #print("abcd{{self|PD|param1=test|PD|param2=abc}}dcba")
  114. #print(processText("abcd{{self|PD|param1=test|PD|param2=abc}}dcba"))
  115. #
  116.  
  117. # get list of all pages which use template self or reference it (few pages testing too)
  118. # for each page:
  119. ## extract all self template uses
  120. ## for each use:
  121. ### parse it and replace with changed version
  122. ## save page text
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement