X-Git-Url: https://git.toastfreeware.priv.at/philipp/winterrodeln/wrpylib.git/blobdiff_plain/f6c4fcdf278c631e8900c06845eebfe36aa5dc51..3a70956408c5dc9e999bb3600b509d60b866118d:/wrpylib/wrmwmarkup.py diff --git a/wrpylib/wrmwmarkup.py b/wrpylib/wrmwmarkup.py index 264c7e2..b6b55e6 100644 --- a/wrpylib/wrmwmarkup.py +++ b/wrpylib/wrmwmarkup.py @@ -12,7 +12,7 @@ import wrpylib.mwmarkup import wrpylib.wrmwdb from wrpylib.wrvalidators import LonLat, opt_lonlat_from_str, opt_lonlat_to_str, opt_uint_from_str, opt_uint_to_str, \ opt_str_opt_comment_enum_to_str, lift_german_to_str, webauskunft_to_str, cachet_german_to_str, \ - opt_phone_comment_enum_to_str, lift_german_from_str + opt_phone_comment_enum_to_str, lift_german_from_str, GASTHAUSBOX_DICT def sledrun_from_rodelbahnbox(value, sledrun): @@ -84,38 +84,50 @@ def sledrun_to_rodelbahnbox(sledrun): def inn_from_gasthausbox(value, inn): """Converts a dict with Gasthausbox properties to a Inn class. Does no validation. value is a dict of properties as returned by gasthausbox_from_str.""" + # page_id = None # this field is not updated because it is not present in the Gasthausbox + # page_title = None # this field is not updated because it is not present in the Gasthausbox + def convtodb(value, key): + v = GASTHAUSBOX_DICT[key].to_str(value[key]) + if v == '': + return None + return v inn.position_longitude, inn.position_latitude = value['Position'] inn.position_elevation = value['Höhe'] inn.operator = value['Betreiber'] inn.seats = value['Sitzplätze'] inn.overnight, inn.overnight_comment = value['Übernachtung'] - inn.nonsmoker_area, inn.smoker_area = value['Rauchfrei'] + inn.smoker_area = None if value['Rauchfrei'] is None else value['Rauchfrei'] < 0.9 + inn.nonsmoker_area = None if value['Rauchfrei'] is None else value['Rauchfrei'] > 0.1 inn.sled_rental, inn.sled_rental_comment = value['Rodelverleih'] - inn.mobile_provider = value['Handyempfang'] - inn.homepage = value['Homepage'] - inn.email_list = value['E-Mail'] - inn.phone_list = value['Telefon'] + inn.mobile_provider = convtodb(value, 'Handyempfang') + inn.homepage = convtodb(value, 'Homepage') + inn.email_list = convtodb(value, 'E-Mail') + inn.phone_list = convtodb(value, 'Telefon') inn.image = value['Bild'] - inn.sledding_list = value['Rodelbahnen'] + inn.sledding_list = convtodb(value, 'Rodelbahnen') + # under_construction = None # this field is not updated because it is not present in the GasthausBox return inn def inn_to_gasthausbox(inn): """Converts an inn class to a dict of Gasthausbox properties. value is an Inn instance.""" + def convfromdb(value, key): + v = '' if value is None else value + return GASTHAUSBOX_DICT[key].from_str(v) value = collections.OrderedDict() value['Position'] = LonLat(inn.position_longitude, inn.position_latitude) value['Höhe'] = inn.position_elevation value['Betreiber'] = inn.operator value['Sitzplätze'] = inn.seats value['Übernachtung'] = (inn.overnight, inn.overnight_comment) - value['Rauchfrei'] = (inn.nonsmoker_area, inn.smoker_area) + value['Rauchfrei'] = {(False, True): 0.0, (True, True): 0.5, (True, False): 1.0}.get((inn.nonsmoker_area, inn.smoker_area), None) value['Rodelverleih'] = (inn.sled_rental, inn.sled_rental_comment) - value['Handyempfang'] = inn.mobile_provider - value['Homepage'] = inn.homepage - value['E-Mail'] = inn.email_list - value['Telefon'] = inn.phone_list + value['Handyempfang'] = convfromdb(inn.mobile_provider, 'Handyempfang') + value['Homepage'] = convfromdb(inn.homepage, 'Homepage') + value['E-Mail'] = convfromdb(inn.email_list, 'E-Mail') + value['Telefon'] = convfromdb(inn.phone_list, 'Telefon') value['Bild'] = inn.image - value['Rodelbahnen'] = inn.sledding_list + value['Rodelbahnen'] = convfromdb(inn.sledding_list, 'Rodelbahnen') return value @@ -140,102 +152,12 @@ class ParseError(RuntimeError): pass - -def find_template_PositionOben(wikitext): - """Same as find_template_latlon_ele with template '{{Position oben|47.076207 N 11.453553 E|1890}}'""" - return find_template_latlon_ele(wikitext, 'Position oben') - - -def create_template_PositionOben(lat, lon, ele): - return create_template_latlon_ele('Position, oben', lat, lon, ele) - - -def find_template_PositionUnten(wikitext): - """Same as find_template_latlon_ele with template '{{Position unten|47.076207 N 11.453553 E|1890}}'""" - return find_template_latlon_ele(wikitext, 'Position unten') - - -def find_template_unsigned(wikitext, template_title): - """Finds the first occurance of the '{{template_title|1890}}' template - and returns the tuple (start, end, unsigned_value) or (None, None, None) if the - template was not found. If the template has no valid format, an exception is thrown.""" - start, end = wrpylib.mwmarkup.find_template(wikitext, template_title) - if start is None: return (None,) * 3 - title, params = wrpylib.mwmarkup.split_template(wikitext[start:end]) - unsigned_value = wrpylib.wrvalidators.UnsignedNone().to_python(params['1'].strip()) - return start, end, unsigned_value - - -def create_template_unsigned(template_title, unsigned): - unsigned = wrpylib.wrvalidators.UnsignedNone().from_python(unsigned) - if len(unsigned) == 0: unsigned = ' ' - return wrpylib.mwmarkup.create_template(template_title, [unsigned]) - - -def find_template_Hoehenunterschied(wikitext): - """Same as find_template_unsigned with template '{{Höhenunterschied|350}}'""" - return find_template_unsigned(wikitext, 'Höhenunterschied') - - -def create_template_Hoehenunterschied(ele_diff): - return create_template_unsigned('Höhenunterschied', ele_diff) - - -def find_template_Bahnlaenge(wikitext): - """Same as find_template_unsigned with template '{{Bahnlänge|4500}}'""" - return find_template_unsigned(wikitext, 'Bahnlänge') - - -def create_template_Bahnlaenge(length): - return create_template_unsigned('Bahnlänge', length) - - -def find_template_Gehzeit(wikitext): - """Same as find_template_unsigned with template '{{Gehzeit|60}}'""" - return find_template_unsigned(wikitext, 'Gehzeit') - - -def create_template_Gehzeit(walkup_time): - return create_template_unsigned('Gehzeit', walkup_time) - - -def find_template_Forumlink(wikitext): - """Same as find_template_unsigned with template '{{Forumlink|26}}'""" - start, end = wrpylib.mwmarkup.find_template(wikitext, 'Forumlink') - if start is None: return (None,) * 3 - title, params = wrpylib.mwmarkup.split_template(wikitext[start:end]) - forumid = params['1'].strip() - if forumid == '': unsigned_value = None - else: unsigned_value = wrpylib.wrvalidators.UnsignedNone().to_python(forumid) - return start, end, unsigned_value - # return find_template_unsigned(wikitext, u'Forumlink') - - -def find_template_Parkplatz(wikitext): - """Same as find_template_latlon_ele with template '{{Parkplatz|47.076207 N 11.453553 E|1890}}'""" - return find_template_latlon_ele(wikitext, 'Parkplatz') - - -def find_template_Haltestelle(wikitext): - """Finds the first occurance of the '{{Haltestelle|Ortsname|Haltestellenname|47.076207 N 11.453553 E|1890}}' template - and returns the tuple (start, end, city, stop, lat, lon, ele) or (None, None, None, None, None, None, None) if the - template was not found. If the template has no valid format, an exception is thrown.""" - start, end = wrpylib.mwmarkup.find_template(wikitext, 'Haltestelle') - if start is None: return (None,) * 7 - title, params = wrpylib.mwmarkup.split_template(wikitext[start:end]) - city = wrpylib.wrvalidators.UnicodeNone().to_python(params['1'].strip()) - stop = wrpylib.wrvalidators.UnicodeNone().to_python(params['2'].strip()) - lat, lon = wrpylib.wrvalidators.GeoNone().to_python(params['3'].strip()) - ele = wrpylib.wrvalidators.UnsignedNone().to_python(params['4'].strip()) - return start, end, city, stop, lat, lon, ele - - def parse_wrmap_coordinates(coords): - '''gets a string coordinates and returns an array of lon/lat coordinate pairs, e.g. + """gets a string coordinates and returns an array of lon/lat coordinate pairs, e.g. 47.12 N 11.87 E 47.13 N 11.70 E -> - [[11.87, 47.12], [11.70, 47.13]]''' + [[11.87, 47.12], [11.70, 47.13]]""" result = [] pos = 0 for match in re.finditer(r'\s*(\d+\.?\d*)\s*N?\s+(\d+\.?\d*)\s*E?\s*', coords): @@ -254,7 +176,7 @@ WRMAP_LINE_TYPES = ['rodelbahn', 'gehweg', 'alternative', 'lift', 'anfahrt', 'li def parse_wrmap(wikitext): - """Parses the (unicode) u'content' of the Winterrodeln wrmap extension. + """Parses the 'content' of the Winterrodeln wrmap extension. If wikitext does not contain the tag or if the tag contains invalid formatted lines, a ParseError is raised. Use wrpylib.mwmarkup.find_tag(wikitext, 'wrmap') to find the wrmap tag within an arbitrary @@ -262,7 +184,7 @@ def parse_wrmap(wikitext): :param wikitext: wikitext containing only the template. Example: - wikitext = u''' + wikitext = ''' 47.240689 11.190454 47.245789 11.238971 @@ -278,7 +200,7 @@ def parse_wrmap(wikitext): """ # parse XML try: - wrmap_xml = xml.etree.ElementTree.fromstring(wikitext.encode('utf-8')) + wrmap_xml = xml.etree.ElementTree.fromstring(wikitext) except xml.etree.ElementTree.ParseError as e: row, column = e.position raise ParseError("XML parse error on row {}, column {}: {}".format(row, column, e))