Revision: 4989
Author: rotem
Date: 2008-02-09 13:19:02 +0000 (Sat, 09 Feb 2008)
Log Message:
-----------
(bug 1887935) Problems with links in templatesWithParams
Modified Paths:
--------------
trunk/pywikipedia/wikipedia.py
Modified: trunk/pywikipedia/wikipedia.py
===================================================================
--- trunk/pywikipedia/wikipedia.py 2008-02-09 13:01:56 UTC (rev 4988)
+++ trunk/pywikipedia/wikipedia.py 2008-02-09 13:19:02 UTC (rev 4989)
@@ -1558,19 +1558,17 @@
def templates(self):
"""Return a list of Page objects for templates used on this Page.
-
+
Template parameters are ignored.
-
"""
return [template for (template, param) in self.templatesWithParams()]
def templatesWithParams(self):
"""Return a list of templates used on this Page.
-
+
Return value is a list of tuples. There is one tuple for each use of
a template in the page, with the template Page as the first entry
and a list of parameters as the second entry.
-
"""
try:
thistxt = self.get()
@@ -1580,16 +1578,23 @@
# remove commented-out stuff etc.
thistxt = removeDisabledParts(thistxt)
- # marker for inside template
+ # marker for inside templates or parameters
marker = '@@'
while marker in thistxt:
marker += '@'
+ # marker for links
+ marker2 = '##'
+ while marker2 in thistxt:
+ marker2 += '#'
+
result = []
- markers = {}
+ inside = {}
count = 0
Rtemplate =
re.compile(r'{{(msg:)?(?P<name>[^{\|]+?)(\|(?P<params>[^{]+?))?}}')
+ Rlink = re.compile(r'\[\[[^\]]+\]\]')
Rmarker = re.compile('%s(\\d+)%s' % (marker, marker))
+ Rmarker2 = re.compile('%s(\\d+)%s' % (marker2, marker2))
while Rtemplate.search(thistxt) is not None:
for m in Rtemplate.finditer(thistxt):
# Make sure it is not detected again
@@ -1597,9 +1602,9 @@
text = m.group()
thistxt = thistxt.replace(text, '%s%d%s' % (marker, count,
marker))
for m2 in Rmarker.finditer(text):
- # Make sure markers don't contain other markers
- text = text.replace(m2.group(), markers[int(m2.group(1))])
- markers[count] = text
+ # Make sure stored templates don't contain markers
+ text = text.replace(m2.group(), inside[int(m2.group(1))])
+ inside[count] = text
# Name
name = m.group('name')
@@ -1620,12 +1625,22 @@
paramString = m.group('params')
params = []
if paramString:
+ # Replace links to markers
+ links = {}
+ count2 = 0
+ for m2 in Rlink.finditer(paramString):
+ count2 += 1
+ text = m2.group()
+ paramString = paramString.replace(text, '%s%d%s' %
(marker2, count, marker2))
+ links[count2] = text
# 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))])
+ param = param.replace(m2.group(), inside[int(m2.group(1))])
+ for m2 in Rmarker2.finditer(param):
+ param = param.replace(m2.group(), links[int(m2.group(1))])
params.append(param)
# Add it to the result
Show replies by date