Revision: 4763 Author: rotem Date: 2007-12-27 18:41:24 +0000 (Thu, 27 Dec 2007)
Log Message: ----------- Making Page.templatesWithParams work for nested templates (in parameters): It was used to see the end of the nested template as the end of the main template. Now using markers to avoid that.
Modified Paths: -------------- trunk/pywikipedia/wikipedia.py
Modified: trunk/pywikipedia/wikipedia.py =================================================================== --- trunk/pywikipedia/wikipedia.py 2007-12-27 13:51:12 UTC (rev 4762) +++ trunk/pywikipedia/wikipedia.py 2007-12-27 18:41:24 UTC (rev 4763) @@ -1546,23 +1546,53 @@ # remove commented-out stuff etc. thistxt = removeDisabledParts(thistxt)
+ # marker for inside template + marker = '@@' + while marker in thistxt: + marker += '@' + result = [] - Rtemplate = re.compile(r'{{(msg:)?(?P<name>[^{|]+?)(|(?P<params>.+?))?}}', re.DOTALL) - for m in Rtemplate.finditer(thistxt): - paramString = m.group('params') - params = [] - if paramString: - params = paramString.split('|') - name = m.group('name') - if self.site().isInterwikiLink(name): - continue - try: - name = Page(self.site(), name).title() - except Error: - output(u"Page %s contains invalid template name %s." - % (self.title(), name)) - continue - result.append((name, params)) + markers = {} + count = 0 + Rtemplate = re.compile(r'{{(msg:)?(?P<name>[^{|]+?)(|(?P<params>[^{]+?))?}}') + Rmarker = re.compile('%s(\d+)%s' % (marker, marker)) + while Rtemplate.search(thistxt) is not None: + for m in Rtemplate.finditer(thistxt): + # Make sure it is not detected again + count += 1 + text = m.group() + markers[count] = text + thistxt = thistxt.replace(text, '%s%d%s' % (marker, count, marker)) + + # Name + name = m.group('name') + m2 = Rmarker.search(name) + if m2 is not None: + # Doesn't detect templates whose name is changing + continue + if self.site().isInterwikiLink(name): + continue + try: + name = Page(self.site(), name).title() + except Error: + output(u"Page %s contains invalid template name %s." + % (self.title(), name)) + continue + + # Parameters + paramString = m.group('params') + params = [] + if paramString: + # Parse string + markedParams = paramString.split('|') + # Replace markers + for param in markedParams: + for m2 in Rmarker.finditer(param): + param = param.replace(m2.group(), markers[int(m2.group(1))]) + params.append(param) + + # Add it to the result + result.append((name, params)) return result
def getRedirectTarget(self):