import wrpylib.mwmarkup
WRMAP_POINT_TYPES = ['gasthaus', 'haltestelle', 'parkplatz', 'achtung', 'punkt']
-WRMAP_LINE_TYPE = ['rodelbahn', 'gehweg', 'alternative', 'lift', 'linie']
+WRMAP_LINE_TYPES = ['rodelbahn', 'gehweg', 'alternative', 'lift', 'anfahrt', 'linie']
class ParseError(RuntimeError):
return results
-def parse_googlemap(wikitext):
- """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.
- If the googlemap contains invalid formatted lines, a ParseError is raised.
-
- :param wikitext: wikitext containing the template. Example:
-
- wikitext = '''
- <googlemap version="0.9" lat="47.113291" lon="11.272337" zoom="15">
- (Parkplatz)47.114958,11.266026
- Parkplatz
-
- (Gasthaus) 47.114715, 11.266262, Alt Bärnbad (Gasthaus)
- 6#FF014E9A
- 47.114715,11.266262
- 47.114135,11.268381
- 47.113421,11.269322
- 47.11277,11.269979
- 47.112408,11.271119
- </googlemap>
- '''
+def googlemap_to_wrmap(center, zoom, coords, paths):
+ """Converts the output of parse_googlemap to the GeoJSON format wrmap uses.
:returns: (GeoJSON as nested Python datatypes)
"""
- center, zoom, coords, paths = wrpylib.mwmarkup.parse_googlemap(wikitext)
json_features = []
# point
for point in coords:
lon, lat, symbol, title = point
- properties = {'type': symbol.lower()}
- if title: properties['name'] = title
+ properties = {'type': 'punkt' if symbol is None else symbol.lower()}
+ if title is not None: properties['name'] = title
json_features.append({
'type': 'Feature',
'geometry': {'type': 'Point', 'coordinates': [lon, lat]},
# path
for path in paths:
style, entries = path
- properties = {'type': 'line'}
+ style = style.lower()
+ PATH_TYPES = {u'6#ff014e9a': u'rodelbahn', u'6#ffe98401': u'gehweg', u'6#ff7f7fff': u'alternative', u'3#ff000000': u'lift', u'3#ffe1e100': u'anfahrt'}
+ if PATH_TYPES.has_key(style):
+ properties = {'type': PATH_TYPES[style]}
+ else:
+ properties = {'type': 'line'}
+ properties['dicke'] = style[0]
+ properties['farbe'] = style[4:]
json_features.append({
'type': 'Feature',
'geometry': {
def parse_wrmap(wikitext):
- """Parses the (unicode) u'<wrmap ...>content</wrmap>' of the Winterrodeln wrmap extension
- out of a page. If wikitext does not contain the wrmap extension text None is returned.
- If the wrmap contains invalid formatted lines, a ParseError is raised.
+ """Parses the (unicode) u'<wrmap ...>content</wrmap>' of the Winterrodeln wrmap extension.
+ If wikitext does not contain the <wrmap> tag or if the <wrmap> tag contains
+ invalid formatted lines, a ParseError is raised.
+ Use wrpylib.mwmarkup.find_tag(wikitext, 'wrmap') to find the wrmap tag within an arbitrary
+ wikitext before using this function.
- :param wikitext: wikitext containing the template. Example:
+ :param wikitext: wikitext containing only the template. Example:
wikitext = u'''
<wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
json_features = []
for feature in wrmap_xml:
# determine feature type
- is_point = feature.tag in WRMAP_POINT_TYPE
- is_line = feature.tag in WRMAP_LINE_TYPE
+ is_point = feature.tag in WRMAP_POINT_TYPES
+ is_line = feature.tag in WRMAP_LINE_TYPES
if (not is_point and not is_line):
raise ParseError('Unknown element <{}>.'.format(feature.tag))
return '\n'.join(result)
-def create_wrmap(attributes, geojson):
+def create_wrmap(geojson):
"""Creates a <wrmap> wikitext from geojson (as python types)."""
wrmap_xml = xml.etree.ElementTree.Element('wrmap')
- for k, v in attributes.iteritems():
+ wrmap_xml.text = '\n\n'
+ for k, v in geojson['properties'].iteritems():
wrmap_xml.attrib[k] = str(v)
assert geojson['type'] == 'FeatureCollection'
json_features = geojson['features']
+ last_json_feature = None
for json_feature in json_features:
+ feature_xml = xml.etree.ElementTree.SubElement(wrmap_xml, json_feature['properties']['type'])
geo = json_feature['geometry']
if geo['type'] == 'Point':
- wrmap_type = dict(zip(WRMAP_POINT_TYPE.values(), WRMAP_POINT_TYPE.keys()))
- feature_xml = xml.etree.ElementTree.SubElement(wrmap_xml, wrmap_type[json_feature['properties']['type']])
feature_xml.text = create_wrmap_coordinates([geo['coordinates']])
- feature_xml.attrib = json_feature['properties']
- if geo['type'] == 'LineString':
- wrmap_type = dict(zip(WRMAP_LINE_TYPE.values(), WRMAP_LINE_TYPE.keys()))
- feature_xml = xml.etree.ElementTree.SubElement(wrmap_xml, wrmap_type[json_feature['properties']['type']])
- feature_xml.text = create_wrmap_coordinates(geo['coordinates'])
- feature_xml.attrib = json_feature['properties']
-
- return xml.etree.ElementTree.tostring(wrmap_xml)
+ if last_json_feature is not None:
+ last_json_feature.tail = '\n'
+ else:
+ if last_json_feature is not None:
+ last_json_feature.tail = '\n\n'
+ feature_xml.text = '\n' + create_wrmap_coordinates(geo['coordinates']) + '\n'
+ last_json_feature = feature_xml
+ feature_xml.attrib = json_feature['properties']
+ del feature_xml.attrib['type']
+
+ if last_json_feature is not None:
+ last_json_feature.tail = '\n\n'
+ return xml.etree.ElementTree.tostring(wrmap_xml, encoding='utf-8').decode('utf-8')