]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/blobdiff - wrpylib/wrmwmarkup.py
Show notes for public transport and parking.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrmwmarkup.py
index def51f1a74ddbe2f09d57ad82b178fc723c901f2..7ac2c98a3efe4b9ae0786571bc98f09d07d413ac 100644 (file)
@@ -1,22 +1,23 @@
 """This module contains winterrodeln specific functions that are processing the MediaWiki markup.
 """
 import re
-import subprocess
 import xml.etree.ElementTree
 import collections
 from typing import Tuple, Optional, List, OrderedDict, Union, Dict
 
 import jinja2
-from mwparserfromhell.nodes import Template
+from mwparserfromhell.nodes import Template, Wikilink
 
 import wrpylib.wrvalidators
 import wrpylib.mwmarkup
 import wrpylib.wrmwdb
+from wrpylib.lib_sledrun_wikitext_from_json import strip_eol
 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, GASTHAUSBOX_DICT, opt_difficulty_german_from_str, \
-    opt_avalanches_german_from_str, nightlightdays_from_str, opt_public_transport_german_from_str, \
-    opt_tristate_german_comment_from_str, rodelbahnbox_to_str, lonlat_to_str
+    opt_avalanches_german_from_str, opt_public_transport_german_from_str, \
+    opt_tristate_german_comment_from_str, rodelbahnbox_to_str, lonlat_to_str, opt_no_or_str_to_str, \
+    opt_no_or_str_from_str, opt_tristate_german_from_str
 
 
 def split_lon_lat(value: Optional[LonLat]) -> Union[LonLat, Tuple[None, None]]:
@@ -46,7 +47,7 @@ def sledrun_from_rodelbahnbox(value: OrderedDict, sledrun: object):
     sledrun.length = value['Länge']
     sledrun.difficulty = value['Schwierigkeit']
     sledrun.avalanches = value['Lawinen']
-    sledrun.operator = value['Betreiber']
+    sledrun.operator = opt_no_or_str_to_str(value['Betreiber'])
     sledrun.public_transport = value['Öffentliche Anreise']
     sledrun.walkup_possible = value['Aufstieg möglich']
     sledrun.walkup_time = value['Gehzeit']
@@ -79,7 +80,7 @@ def sledrun_to_rodelbahnbox(sledrun) -> collections.OrderedDict:
     value['Länge'] = sledrun.length
     value['Schwierigkeit'] = sledrun.difficulty
     value['Lawinen'] = sledrun.avalanches
-    value['Betreiber'] = sledrun.operator
+    value['Betreiber'] = opt_no_or_str_from_str(sledrun.operator)
     value['Öffentliche Anreise'] = sledrun.public_transport
     value['Aufstieg möglich'] = sledrun.walkup_possible
     value['Gehzeit'] = sledrun.walkup_time
@@ -148,14 +149,14 @@ def inn_to_gasthausbox(inn) -> collections.OrderedDict:
     return value
 
 
-def lonlat_ele_from_template(template) -> Tuple[LonLat, Optional[int]]:
+def lonlat_ele_from_template(template) -> Tuple[Optional[LonLat], Optional[int]]:
     """Template is a `mwparserfromhell.nodes.template.Template` instance. Returns (lonlat, ele)."""
     lonlat = opt_lonlat_from_str(template.params[0].strip())
     ele = opt_uint_from_str(template.params[1].strip())
     return lonlat, ele
 
 
-def latlon_ele_to_template(lonlat_ele, name) -> Template:
+def latlon_ele_to_template(lonlat_ele: Tuple[Optional[LonLat], Optional[int]], name: str) -> Template:
     lonlat, ele = lonlat_ele
     template = Template(name)
     template.add(1, opt_lonlat_to_str(lonlat))
@@ -164,6 +165,19 @@ def latlon_ele_to_template(lonlat_ele, name) -> Template:
     return template
 
 
+def lonlat_to_json(lonlat: LonLat) -> dict:
+    return {'longitude': lonlat.lon, 'latitude': lonlat.lat}
+
+
+def lonlat_ele_to_json(lonlat: Optional[LonLat], ele: Optional[int]) -> dict:
+    result = {}
+    if lonlat is not None:
+        result['position'] = lonlat_to_json(lonlat)
+    if ele is not None:
+        result['elevation'] = ele
+    return result
+
+
 class ParseError(RuntimeError):
     """Exception used by some of the functions"""
     pass
@@ -192,7 +206,7 @@ WRMAP_POINT_TYPES = ['gasthaus', 'haltestelle', 'parkplatz', 'achtung', 'foto',
 WRMAP_LINE_TYPES = ['rodelbahn', 'gehweg', 'alternative', 'lift', 'anfahrt', 'linie']
 
 
-def parse_wrmap(wikitext):
+def parse_wrmap(wikitext: str) -> dict:
     """Parses the '<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.
@@ -326,7 +340,7 @@ def create_wrmap(geojson: Dict) -> str:
                 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']
+        feature_xml.attrib = json_feature['properties'].copy()
         del feature_xml.attrib['type']
 
     if last_json_feature is not None:
@@ -334,6 +348,12 @@ def create_wrmap(geojson: Dict) -> str:
     return xml.etree.ElementTree.tostring(wrmap_xml, encoding='utf-8').decode('utf-8')
 
 
+def german_bool(value: Union[bool, jinja2.Undefined]) -> Union[str, jinja2.Undefined]:
+    if jinja2.is_undefined(value):
+        return value
+    return wrpylib.wrvalidators.bool_german_to_str(value)
+
+
 class Jinja2Tools:
     def create_wrmap(self, geojson: Dict) -> str:
         return create_wrmap(geojson)
@@ -351,6 +371,9 @@ class Jinja2Tools:
     def json_pos_ele_elevation(self, value: dict) -> str:
         return value.get('elevation', '')
 
+    def json_wr_page(self, value: dict) -> str:
+        return str(Wikilink(value['title'], value.get('text')))
+
     def list_template(self, name: str, value: List[str]) -> str:
         return str(wrpylib.mwmarkup.create_template(name, value))
 
@@ -366,15 +389,13 @@ class Jinja2Tools:
         return str(wrpylib.mwmarkup.create_template(value['name'], args, kwargs))
 
 
-def create_sledrun_wiki(sledrun_json: Dict, map_json: Optional[Dict]) -> str:
+def create_sledrun_wiki(sledrun_json: Dict, map_json: Optional[Dict], impressions_title: Optional[str] = None) -> str:
     env = jinja2.Environment(
         loader=jinja2.PackageLoader("wrpylib"),
-        autoescape=jinja2.select_autoescape()
+        autoescape=jinja2.select_autoescape(),
     )
-    template = env.get_template("sledrun_wiki.txt")
-
-    def markdown_to_mediawiki(markdown: str) -> str:
-        return subprocess.check_output(['pandoc', '--to', 'mediawiki'], input=markdown, encoding='utf-8')
+    env.filters["german_bool"] = german_bool
+    template = env.get_template("sledrun_wikitext.txt")
 
     def position_to_lon_lat(value: Optional[dict]) -> Optional[LonLat]:
         if value is not None:
@@ -400,13 +421,28 @@ def create_sledrun_wiki(sledrun_json: Dict, map_json: Optional[Dict]) -> str:
         ws = sledrun_json.get('walkup_supports')
         if ws is None:
             return None
-        return [(w['type'], w.get('comment')) for w in ws]
+        return [(w['type'], w.get('note')) for w in ws]
 
     def rodelverleih() -> Optional[List[Tuple[str, Optional[str]]]]:
-        sr = sledrun_json.get('sled_rental_direct')
-        if sr is None:
+        v = sledrun_json.get('sled_rental')
+        if v is None:
             return None
-        return [('Ja', None)] if sr else []
+        w = []
+        for x in v:
+            n = x.get('name')
+            c = x.get('note')
+            p = x.get('wr_page')
+            if p is not None:
+                n = Jinja2Tools().json_wr_page(p)
+            w.append((n, c))
+        return w
+
+    def cachet() -> Optional[List]:
+        v = sledrun_json.get('cachet')
+        if v is not None:
+            if not v:
+                return []
+        return None
 
     def webauskunft() -> Tuple[Optional[bool], Optional[str]]:
         info_web = sledrun_json.get('info_web')
@@ -439,16 +475,18 @@ def create_sledrun_wiki(sledrun_json: Dict, map_json: Optional[Dict]) -> str:
         ('Länge', sledrun_json.get('length')),
         ('Schwierigkeit', opt_difficulty_german_from_str(sledrun_json.get('difficulty', ''))),
         ('Lawinen', opt_avalanches_german_from_str(sledrun_json.get('avalanches', ''))),
-        ('Betreiber', betreiber()),
+        ('Betreiber', (sledrun_json.get('has_operator'), sledrun_json.get('operator'))),
         ('Öffentliche Anreise', opt_public_transport_german_from_str(sledrun_json.get('public_transport', ''))),
         ('Aufstieg möglich', sledrun_json.get('walkup_possible')),
         ('Aufstieg getrennt', opt_tristate_german_comment_from_str(sledrun_json.get('walkup_separate', ''))),
         ('Gehzeit', sledrun_json.get('walkup_time')),
         ('Aufstiegshilfe', aufstiegshilfe()),
-        ('Beleuchtungsanlage', opt_tristate_german_comment_from_str(sledrun_json.get('nightlight_possible', ''))),
-        ('Beleuchtungstage', nightlightdays_from_str(sledrun_json.get('nightlight_weekdays', ''))),
+        ('Beleuchtungsanlage', (opt_tristate_german_from_str(sledrun_json.get('nightlight_possible', '')),
+                                sledrun_json.get('nightlight_possible_note'))),
+        ('Beleuchtungstage', (sledrun_json.get('nightlight_weekdays_count'),
+                              sledrun_json.get('nightlight_weekdays_note'))),
         ('Rodelverleih', rodelverleih()),
-        ('Gütesiegel', None),
+        ('Gütesiegel', cachet()),
         ('Webauskunft', webauskunft()),
         ('Telefonauskunft', telefonauskunft()),
         ('Bild', sledrun_json.get('image')),
@@ -456,18 +494,10 @@ def create_sledrun_wiki(sledrun_json: Dict, map_json: Optional[Dict]) -> str:
         ('Forumid', sledrun_json.get('forum_id'))
     ])
 
-    def get_markdown_field(key: str) -> str:
-        if key in sledrun_json:
-            return markdown_to_mediawiki(sledrun_json[key])
-        return ''
-
-    description = get_markdown_field('description').strip()
-    night_light = get_markdown_field('night_light').strip()
-    sled_rental_description = get_markdown_field('sled_rental_description').strip()
-
     rodelbahnbox = rodelbahnbox_to_str(sledrun_rbb_json)
 
-    return template.render(sledrun_json=sledrun_json,
-                           rodelbahnbox=rodelbahnbox, description=description, night_light=night_light,
-                           sled_rental_description=sled_rental_description, operator=betreiber(),
-                           map_json=map_json, h=Jinja2Tools())
+    text = template.render(sledrun_json=sledrun_json,
+                           rodelbahnbox=rodelbahnbox,
+                           map_json=map_json, impressions_title=impressions_title,
+                           h=Jinja2Tools(), **sledrun_json)
+    return strip_eol(text)