Updated parse_wrmap to accept normal strings.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrvalidators.py
index 09bba89071858b01ccd4f88e260420ad551ea584..c827d5e48f5a2400f92e1133158518b95232eec3 100644 (file)
@@ -1,5 +1,4 @@
 #!/usr/bin/python3.4
-# -*- coding: utf-8 -*-
 # $Id$
 # $HeadURL$
 """
@@ -16,7 +15,7 @@ import urllib.parse
 import re
 from collections import OrderedDict, namedtuple
 
-import mwparserfromhell
+import mwparserfromhell  # https://github.com/earwig/mwparserfromhell
 
 from wrpylib.mwmarkup import format_template_table
 
@@ -305,7 +304,7 @@ opt_tristate_german_converter = FromToConverter(opt_tristate_german_from_str, op
 # -------------------------------
 
 def opt_tristate_german_comment_from_str(value):
-    """Ja, Nein or Vielleicht, optionally with comment in parenthesis."""
+    """Ja, Nein or Teilweise, optionally with comment in parenthesis."""
     return value_comment_from_str(value, opt_tristate_german_from_str, opt_str_from_str, True)
 
 
@@ -336,6 +335,14 @@ def url_to_str(value):
 # ---------------------
 
 def webauskunft_from_str(value):
+    """Converts a URL or 'Nein' to a tuple
+    'http://www.example.com/' -> (True, 'http://www.example.com/')
+    'Nein' -> (False, None)
+    '' -> (None, None)
+
+    :param value: URL or 'Nein'
+    :return: tuple
+    """
     return opt_no_german_from_str(value, url_from_str)
 
 
@@ -351,11 +358,11 @@ webauskunft_converter = FromToConverter(webauskunft_from_str, webauskunft_to_str
 
 def wikipage_from_str(value):
     """Validates wiki page name like '[[Birgitzer Alm]]'.
-    The page is not checked for existance.
+    The page is not checked for existence.
     An empty string is an error.
     '[[Birgitzer Alm]]' => '[[Birgitzer Alm]]'
     """
-    if not value.startswith('[[') or not value.endswith(']]'):
+    if re.match(r'\[\[[^\[\]]+\]\]$', value) is None:
         raise ValueError('No valid wiki page name "{}"'.format(value))
     return value
 
@@ -670,9 +677,8 @@ class ValueErrorList(ValueError):
     pass
 
 
-def wikibox_from_template(template, name, converter_dict):
-    if template.name.strip() != name:
-        raise ValueError('Box name has to be "{}"'.format(name))
+def wikibox_from_template(template, converter_dict):
+    """Returns an ordered dict."""
     result = OrderedDict()
     exceptions_dict = OrderedDict()
     # check values
@@ -701,8 +707,8 @@ def wikibox_to_template(value, name, converter_dict):
 
 def template_from_str(value, name):
     wikicode = mwparserfromhell.parse(value)
-    template_list = wikicode.filter_templates(name)
-    if len(name) == 0:
+    template_list = wikicode.filter_templates(recursive=False, matches=lambda t: t.name.strip() == name)
+    if len(template_list) == 0:
         raise ValueError('No "{}" template was found'.format(name))
     if len(template_list) > 1:
         raise ValueError('{} "{}" templates were found'.format(len(template_list), name))
@@ -711,7 +717,7 @@ def template_from_str(value, name):
 
 def wikibox_from_str(value, name, converter_dict):
     template = template_from_str(value, name)
-    return wikibox_from_template(template, name, converter_dict)
+    return wikibox_from_template(template, converter_dict)
 
 
 def wikibox_to_str(value, name, converter_dict):
@@ -752,7 +758,8 @@ RODELBAHNBOX_DICT = OrderedDict([
 
 
 def rodelbahnbox_from_template(template):
-    return wikibox_from_template(template, RODELBAHNBOX_TEMPLATE_NAME, RODELBAHNBOX_DICT)
+    """Returns an ordered dict."""
+    return wikibox_from_template(template, RODELBAHNBOX_DICT)
 
 
 def rodelbahnbox_to_template(value):
@@ -760,6 +767,7 @@ def rodelbahnbox_to_template(value):
 
 
 def rodelbahnbox_from_str(value):
+    """Returns an ordered dict."""
     return wikibox_from_str(value, RODELBAHNBOX_TEMPLATE_NAME, RODELBAHNBOX_DICT)
 
 
@@ -792,6 +800,7 @@ GASTHAUSBOX_DICT = OrderedDict([
 
 
 def gasthausbox_from_template(template):
+    """Returns an ordered dict."""
     return wikibox_from_template(template, GASTHAUSBOX_TEMPLATE_NAME, GASTHAUSBOX_DICT)
 
 
@@ -800,6 +809,7 @@ def gasthausbox_to_template(value):
 
 
 def gasthausbox_from_str(value):
+    """Returns an ordered dict."""
     return wikibox_from_str(value, GASTHAUSBOX_TEMPLATE_NAME, GASTHAUSBOX_DICT)