Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pywikibot
- from pywikibot import pagegenerators
- templateStart = u"{{U\u017cytkownik:Expert3222/self"
- replacedTemplateStart = "{{self2"
- # returns page list for testing or real work
- def getPageList(testing):
- if testing:
- return pagegenerators.TextfilePageGenerator("lista.txt")
- else:
- return pagegenerators.ReferringPageGenerator(pywikibot.Page(pywikibot.Site("pl"), "Szablon:Self"))
- # name should be self-explanatory :P
- def doWork():
- string = raw_input("Testujemy? ")
- testing = string.lower() == "tak"
- for page in getPageList(testing):
- processPage(page)
- def processPage(page):
- text = page.text
- pos = 0
- while True:
- pos = text.find(templateStart, pos)
- if pos == -1:
- break
- ret = getNearestSelf(text, pos)
- pos = ret[0]
- posEnd = ret[1]
- arguments = ret[2]
- ret = replaceSelf(text, pos, posEnd, arguments)
- replacedText = ret[0]
- replacement = ret[1]
- # template is already converted to new version
- if replacement == templateStart + "}}":
- pos = posEnd + 1
- continue
- sizeDelta = len(text) - len(replacedText)
- text = replacedText
- pos = posEnd - sizeDelta + 1
- #if raw_input("Zapisac strone? ").lower() == "tak":
- page.text = text
- page.save("Test")
- return text
- # processes argument of form abc=def and inserts it into argument array, returns unnamedParameterCounter, incremented if needed
- def processArgument(text, arguments, unnamedParameterCounter):
- equalsPos = text.find("=")
- if equalsPos == -1:
- arguments[str(unnamedParameterCounter)] = text[equalsPos + 1 : len(text)]
- unnamedParameterCounter = unnamedParameterCounter + 1
- else:
- arguments[text[0 : equalsPos]] = text[equalsPos + 1 : len(text)]
- return unnamedParameterCounter
- # replaces one instance of self template with new one based on arguments array
- def replaceSelf(text, pos, posEnd, arguments):
- leftHalf = text[0 : pos]
- rightHalf = text[posEnd + 1 : len(text)]
- replacement = replacedTemplateStart
- for i in range(1, 4):
- if not str(i) in arguments:
- break
- name = arguments[str(i)]
- if not "param" + str(i) in arguments:
- break
- value = arguments["param" + str(i)]
- replacement = replacement + "|{{" + name + "|" + value + "}}"
- replacement = replacement + "}}"
- print (text[pos : posEnd + 1] + "\t" + replacement)
- return (leftHalf + replacement + rightHalf, replacement)
- # returns tuple with starting, ending positions and arguments of self template nearest to pos
- def getNearestSelf(text, pos):
- openedBraces = 1
- argumentStart = -1
- arguments = {}
- posEnd = -1
- unnamedParameterCounter = 1
- for i in range(pos + len(templateStart), len(text)):
- if text[i : i + 2] == "{{":
- openedBraces = openedBraces + 1
- elif text[i : i + 2] == "}}":
- openedBraces = openedBraces - 1
- if openedBraces == 0:
- processArgument(text[argumentStart : i], arguments, unnamedParameterCounter)
- elif text[i] == "|" and openedBraces == 1:
- if argumentStart != -1:
- unnamedParameterCounter = processArgument(text[argumentStart : i], arguments, unnamedParameterCounter)
- argumentStart = i + 1
- else:
- argumentStart = i + 1
- if openedBraces == 0:
- posEnd = i + 1
- break
- print pos, posEnd, arguments
- return (pos, posEnd, arguments)
- doWork()
- #print("abcd{{self|PD|param1=test|PD|param2=abc}}dcba")
- #print(processText("abcd{{self|PD|param1=test|PD|param2=abc}}dcba"))
- #
- # get list of all pages which use template self or reference it (few pages testing too)
- # for each page:
- ## extract all self template uses
- ## for each use:
- ### parse it and replace with changed version
- ## save page text
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement