Now the width and height of the map are parsed from <googlemap> as well.
[philipp/winterrodeln/wrpylib.git] / wrpylib / mwmarkup.py
index 735610c8ba6cc8d9c3fcf8e2167b50c000545c79..ace7362f78bd0322fa3d8eddbf6b8bb74bf6b962 100644 (file)
@@ -112,13 +112,12 @@ def create_template(template_title, anonym_params=[], named_param_keys=[], named
 
 
 def find_tag(wikitext, tagname, pos=0):
-    """Returns the tuple (start, end) of the first occurence of the tag '<tag ...>...</tag>'
+    """Returns position information of the first occurence of the tag '<tag ...>...</tag>'
     or '<tag ... />'.
-    (None, None) is returned if the tag is not found.
     If you are sure that the wikitext contains the tag, the tag could be extracted like follows:
 
     >>> wikitext = u'This is a <tag>mytag</tag> tag.'
-    >>> start, end = find_template(wikitext, u'tag')
+    >>> start, content, endtag, end = find_template(wikitext, u'tag')
     >>> print wikitext[start:end]
     <tag>mytag</tag>
 
@@ -176,12 +175,12 @@ def parse_googlemap(wikitext):
     47.112408,11.271119
     </googlemap>
     '''
-    :returns: the tuple (center, zoom, coords, paths).
-        center is the tuple (lon, lat) of the google maps or (None, None) if not provided
-        zoom is the google zoom level as integer or None if not provided
+    :returns: The tuple (attributes, coords, paths) is returned.
+        attributes is a dict that contains the attribues that are present
+        (e.g. lon, lat, zoom, width, height) converted to float (lon, lat) or int.
         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 (lon, lat, symbol, title) tuples."""
 
     def is_coord(line):
         """Returns True if the line contains a coordinate."""
@@ -207,7 +206,7 @@ def parse_googlemap(wikitext):
 
     start, content, endtag, end = find_tag(wikitext, 'googlemap')
     if start is None:
-        raise ParseError('<googlemap> tag not found.')
+        raise ParseError(u'<googlemap> tag not found.')
     if content is None:
         xml_only = wikitext[start:endtag]
     else:
@@ -217,15 +216,21 @@ def parse_googlemap(wikitext):
         gm = xml.etree.ElementTree.XML(xml_only.encode('UTF8'))
     except xml.etree.ElementTree.ParseError as e:
         row, column = e.position
-        raise ParseError("XML parse error in <googlemap ...>.")
-    zoom = gm.get('zoom')
-    lon = gm.get('lon')
-    lat = gm.get('lat')
-    if not zoom is None: zoom = int(zoom)
-    if not lon is None: lon = float(lon)
-    if not lat is None: lat = float(lat)
-    center = (lon, lat)
+        raise ParseError(u"XML parse error in <googlemap ...>.")
 
+    # parse attributes
+    attributes = {}
+    try:
+        for key in ['lon', 'lat']:
+            if gm.get(key) is not None:
+                attributes[key] = float(gm.get(key))
+        for key in ['zoom', 'width', 'height']:
+            if gm.get(key) is not None:
+                attributes[key] = int(gm.get(key))
+    except ValueError as error:
+        raise ParseError(u'Error at parsing attribute {0} of <googlemap>: {1}'.format(key, unicode(error)))
+
+    # parse points and lines
     coords = []
     paths = []
     lines = wikitext[content:endtag].split("\n")
@@ -268,5 +273,6 @@ def parse_googlemap(wikitext):
             continue
 
         raise ParseError(u'Unknown line syntax: ' + line)
-    return (center, zoom, coords, paths)
+
+    return (attributes, coords, paths)