The googlemap extension tag is googlemap, not googlemaps.
[philipp/winterrodeln/wrpylib.git] / wrpylib / mwmarkup.py
index b43050253a8c8cfc9cd2092e75da9348f89f738d..30b2f654fa4236190a17fb3b631a116a2c304365 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.6
+#!/usr/bin/python2.7
 # -*- coding: iso-8859-15 -*-
 # $Id$
 # $HeadURL$
@@ -106,12 +106,14 @@ def create_template(template_title, anonym_params=[], named_param_keys=[], named
     return pipe_char.join(parts) + end_char
 
 
-def parse_googlemap(wikitext):
+def parse_googlemap(wikitext, detail=False):
     """Parses the (unicode) u'<googlemap ...>content</googlemap>' of the googlemap extension
-    out of a page. If wikitext does not contain the googlemaps extension text None is returned.
+    out of a page. If wikitext does not contain the googlemap extension text None is returned.
     If the googlemap contains invalid formatted lines, a RuntimeError is raised.
 
     :param wikitext: wikitext containing the template. Example:
+    :param detail: bool. If True, start and end position of <googlemap>...</googlemap> is
+        returned additionally.
 
     wikitext = '''
     <googlemap version="0.9" lat="47.113291" lon="11.272337" zoom="15">
@@ -132,7 +134,8 @@ def parse_googlemap(wikitext):
         zoom is the google zoom level as integer or None if not provided
         coords is a list of (lon, lat, symbol, title) tuples.
         paths is a list of (style, coords) tuples.
-        coords is again a list of (lot, lat, symbol, title) tuples."""
+        coords is again a list of (lot, lat, symbol, title) tuples.
+        If detail is True, (center, zoom, coords, paths, start, end) is returned."""
 
     def is_coord(line):
         """Returns True if the line contains a coordinate."""
@@ -146,19 +149,21 @@ def parse_googlemap(wikitext):
 
     def parse_coord(line):
         """Returns (lon, lat, symbol, title). If symbol or text is not present, None is returned."""
-        match = re.match(u'\(([^)]+)\) ?([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+),(.*)', line)
+        match = re.match(u'\(([^)]+)\) ?([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+), ?(.*)', line)
         if not match is None: return (float(match.group(3)), float(match.group(2)), match.group(1), match.group(4))
         match = re.match(u'\(([^)]+)\) ?([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+)', line)
         if not match is None: return (float(match.group(3)), float(match.group(2)), match.group(1), None)
-        match = re.match(u'([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+),(.*)', line)
+        match = re.match(u'([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+), ?(.*)', line)
         if not match is None: return (float(match.group(2)), float(match.group(1)), None, match.group(3))
         match = re.match(u'([0-9]{1,2}\.[0-9]+), ?([0-9]{1,2}\.[0-9]+)', line)
         if not match is None: return (float(match.group(2)), float(match.group(1)), None, None)
         return RuntimeError(u'Could not parse line ' + line)
 
-    regexp = re.compile(u"(<googlemap[^>]*>)(.*)(</googlemap>)", re.DOTALL)
+    regexp = re.compile(u"(<googlemap[^>]*>)(.*?)(</googlemap>)", re.DOTALL)
     match = regexp.search(wikitext)
     if match is None: return None
+    start = match.start()
+    end = match.end()
     content = match.group(2)
     gm = xml.etree.ElementTree.XML((match.group(1)+match.group(3)).encode('UTF8'))
     zoom = gm.get('zoom')
@@ -211,5 +216,7 @@ def parse_googlemap(wikitext):
             continue
 
         raise RuntimeError(u'Unknown line syntax: ' + line)
+    if detail:
+        return (center, zoom, coords, paths, start, end)
     return (center, zoom, coords, paths)