start, end, inn = wrpylib.wrmwmarkup.gasthausbox_to_inn(wikitext)
wrpylib.wrmwmarkup.inn_to_gasthausbox(inn)
+
+def test_parse_googlemap():
+ wikitext = u'''
+ <googlemap version="0.9" lat="47.113291" lon="11.272337" zoom="15">
+ (Parkplatz)47.114958,11.266026
+ Erster 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>
+ '''
+ attributes, json = wrpylib.wrmwmarkup.parse_googlemap(wikitext)
+ assert attributes['lon'] == 11.272337
+ assert attributes['lat'] == 47.113291
+ assert attributes['zoom'] == 15
+ assert json['features'][0]['properties']['type'] == 'carpark'
+ assert json['features'][0]['properties']['name'] == 'Erster Parkplatz'
+ assert json['features'][0]['geometry']['coordinates'] == [11.266026, 47.114958]
+ assert json['features'][1]['properties']['type'] == 'inn'
+ assert json['features'][1]['properties']['name'] == u'Alt Bärnbad (Gasthaus)'
+ assert json['features'][1]['geometry']['coordinates'] == [11.266262, 47.114715]
+ assert json['features'][2]['properties']['type'] == 'sledrun'
+ assert json['features'][2]['geometry']['coordinates'] == [
+ [11.266262, 47.114715],
+ [11.268381, 47.114135],
+ [11.269322, 47.113421],
+ [11.269979, 47.11277],
+ [11.271119, 47.112408]]
+
+
+def test_parse_wrmap():
+ wikitext = u'''
+ <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
+ <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
+ <parkplatz>47.245789 11.238971</parkplatz>
+ <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
+ <rodelbahn>
+ 47.238587 11.203360
+ 47.244951 11.230868
+ 47.245470 11.237853
+ </rodelbahn>
+ </wrmap>
+ '''
+ attributes, json = wrpylib.wrmwmarkup.parse_wrmap(wikitext)
+ assert attributes['lon'] == 11.21408895
+ assert attributes['lat'] == 47.2417134
+ assert attributes['zoom'] == 14
+ assert attributes['width'] == 700
+ assert attributes['height'] == 400
+ assert json['features'][0]['properties']['type'] == 'inn'
+ assert json['features'][0]['properties']['name'] == u'Rosskogelhütte'
+ assert json['features'][0]['properties']['wiki'] == u'Rosskogelhütte'
+ assert json['features'][0]['geometry']['coordinates'] == [11.190454, 47.240689]
+ assert json['features'][1]['properties']['type'] == 'carpark'
+ assert json['features'][1]['geometry']['coordinates'] == [11.238971, 47.245789]
+ assert json['features'][2]['properties']['type'] == 'busstop'
+ assert json['features'][2]['properties']['name'] == u'Oberperfuss Rangger Köpfl Lift'
+ assert json['features'][2]['geometry']['coordinates'] == [11.238283, 47.245711]
+ assert json['features'][3]['properties']['type'] == 'sledrun'
+ assert json['features'][3]['geometry']['coordinates'] == [
+ [47.238587, 11.203360],
+ [47.244951, 11.230868],
+ [47.245470, 11.237853]]
+
+
+
+def test_create_wrmap():
+ pass
+
"""This module contains winterrodeln specific functions that are prcocessing the MediaWiki markup.
"""
import re
+import xml.etree.ElementTree
import formencode
import wrpylib.wrvalidators
import wrpylib.mwmarkup
result = (start, end) + result[2:]
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 RuntimeError 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>
+ '''
+ :returns: (attributes, GeoJSON as 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}
+ if title: properties['name'] = title
+ json_features.append({
+ 'type': 'feature',
+ 'geometry': {'type': 'Point', 'coordinates': [lon, lat]},
+ 'properties': properties})
+
+ # path
+ for path in paths:
+ style, entries = path
+ properties = {'type': 'line'}
+ json_features.append({
+ 'type': 'feature',
+ 'geometry': {
+ 'type': 'LineString',
+ 'coordinates': [[lon, lat] for lon, lat, symbol, title in entries]},
+ 'properties': properties})
+
+ json = {'type': 'FeatureCollection', 'features': json_features}
+ return {'lon': center[0], 'lat': center[1], 'zoom': zoom}, json
+
+
+def parse_wrmap_coordinates(coordinates_str):
+ return [[0, 0]] # TODO
+
+
+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 googlemaps extension text None is returned.
+ If the googlemap contains invalid formatted lines, a RuntimeError is raised.
+
+ :param wikitext: wikitext containing the template. Example:
+
+ wikitext = u'''
+ <wrmap lat="47.2417134" lon="11.21408895" zoom="14" width="700" height="400">
+ <gasthaus name="Rosskogelhütte" wiki="Rosskogelhütte">47.240689 11.190454</gasthaus>
+ <parkplatz>47.245789 11.238971</parkplatz>
+ <haltestelle name="Oberperfuss Rangger Köpfl Lift">47.245711 11.238283</haltestelle>
+ <rodelbahn>
+ 47.238587 11.203360
+ 47.244951 11.230868
+ 47.245470 11.237853
+ </rodelbahn>
+ </wrmap>
+ '''
+ :returns: (attributes, GeoJSON as Python datatypes)
+ """
+ # parse XML
+ try:
+ wrmap_xml = xml.etree.ElementTree.fromstring(wikitext.encode('utf-8'))
+ except xml.etree.ElementTree.ParseError as e:
+ row, column = e.position
+ raise RuntimeError("XML parse error on row {}, column {}: {}".format(row, column, e))
+ # assert(in_array($tagname, array('wrmap', 'wrgmap'))); # TODO
+
+ # convert XML to geojson (http://www.geojson.org/geojson-spec.html)
+ json_features = []
+ point_type = {'gasthaus': 'inn', 'haltestelle': 'busstop', 'parkplatz': 'carpark', 'achtung': 'attention', 'punkt': 'point'}
+ line_type = {'rodelbahn': 'sledrun', 'gehweg': 'walk', 'alternative': 'alternative', 'lift': 'lift', 'linie': 'line'}
+ for feature in wrmap_xml:
+ # determine feature type
+ is_point = point_type.has_key(feature.tag)
+ is_line = line_type.has_key(feature.tag)
+ if (not is_point and not is_line):
+ raise RuntimeError('Unknown element <{}>.'.format(feature.tag))
+
+ # point
+ if is_point:
+ properties = {'type': point_type[feature.tag]}
+ allowed_properties = set(['name', 'wiki'])
+ wrong_properties = set(feature.attrib.keys()) - allowed_properties
+ if len(wrong_properties) > 0:
+ raise RuntimeError("The attribute '{}' is not allowed at <{}>.".format(list(wrong_properties)[0], feature.tag))
+ properties.update(feature.attrib)
+ coordinates = parse_wrmap_coordinates(feature.text)
+ if len(coordinates) != 1:
+ raise RuntimeError('The element <{}> has to have exactly one coordinate pair.'.format(feature.tag))
+ json_features.append({
+ 'type': 'feature',
+ 'geometry': {'type': 'Point', 'coordinates': coordinates[0]},
+ 'properties': properties})
+
+ # line
+ if is_line:
+ properties = {'type': line_type[feature.tag]}
+ allowed_properties = set(['farbe', 'dicke'])
+ wrong_properties = set(feature.attrib.keys()) - allowed_properties
+ if len(wrong_properties) > 0:
+ raise RuntimeError("The attribute '{}' is not allowed at <{}>.".format(list(wrong_properties)[0], feature.tag))
+ if feature.attrib.has_key('farbe'):
+ # TODO: check value
+ properties['strokeColor'] = feature.attrib['farbe'] # e.g. #a200b7
+ if feature.attrib.has_key('dicke'):
+ try:
+ properties['strokeWidth'] = int(feature.attrib['dicke']) # e.g. 6
+ except ValueError:
+ raise RuntimeError('The attribute "farbe" has to be an integer.')
+ json_features.append({
+ 'type': 'feature',
+ 'geometry': {'type': 'LineString', 'coordinates': parse_wrmap_coordinates(feature.text)},
+ 'properties': properties})
+
+ json = {
+ 'type': 'FeatureCollection',
+ 'features': json_features}
+
+ # attributes # TODO: check
+ attributes = {}
+ attributes['latitude'] = float(wrmap_xml.attrib.get('lat', 47.267648)) # center lat
+ attributes['longitude'] = float(wrmap_xml.attrib.get('lon', 11.404655)) # center lon
+ attributes['zoom'] = int(wrmap_xml.attrib.get('zoom', 10)) # Google Zoom Level
+ attributes['width'] = int(wrmap_xml.attrib['width']) if wrmap_xml.attrib.has_key('width') else None # None corresponds to 100%
+ attributes['height'] = int(wrmap_xml.attrib.get('height', 450)) # map height in px
+ # show_sledruns = (wrmap_xml.tag == 'wrgmap')
+
+ return attributes, json
+
+
+def create_wrmap(geojson):
+ """Creates a <wrmap> wikitext from geojson."""
+ pass
+
+