"""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
+from typing import Tuple, Optional, List, OrderedDict, Union, Dict, Any
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_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_no_or_str_from_str, opt_tristate_german_from_str
def split_lon_lat(value: Optional[LonLat]) -> Union[LonLat, Tuple[None, None]]:
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))
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
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.
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:
return xml.etree.ElementTree.tostring(wrmap_xml, encoding='utf-8').decode('utf-8')
-def markdown_to_mediawiki(markdown: str) -> str:
- return subprocess.check_output(['pandoc', '--to', 'mediawiki'], input=markdown, encoding='utf-8')
-
-
def german_bool(value: Union[bool, jinja2.Undefined]) -> Union[str, jinja2.Undefined]:
if jinja2.is_undefined(value):
return value
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))
+ def key_value_template(self, name: str, value: Dict[str, Any], keep_empty: bool = False) -> str:
+ value = {k: str(v) for k, v in value.items()
+ if keep_empty or (v is not None and not isinstance(v, jinja2.Undefined) and str(v).strip() != '')}
+ return str(wrpylib.mwmarkup.create_template(name, [], value))
+
def json_template(self, value) -> str:
args = []
kwargs = {}
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(),
)
- env.filters["from_markdown"] = markdown_to_mediawiki
env.filters["german_bool"] = german_bool
- template = env.get_template("sledrun_wiki.txt")
+ template = env.get_template("sledrun_wikitext.txt")
def position_to_lon_lat(value: Optional[dict]) -> Optional[LonLat]:
if value is not None:
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')
('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')),
rodelbahnbox = rodelbahnbox_to_str(sledrun_rbb_json)
- return template.render(sledrun_json=sledrun_json,
+ text = template.render(sledrun_json=sledrun_json,
rodelbahnbox=rodelbahnbox,
- map_json=map_json, h=Jinja2Tools(), **sledrun_json)
+ map_json=map_json, impressions_title=impressions_title,
+ h=Jinja2Tools(), **sledrun_json)
+ return strip_eol(text)