1.1 --- a/moinformat/__init__.py Mon May 01 22:02:52 2017 +0200
1.2 +++ b/moinformat/__init__.py Mon May 01 22:38:40 2017 +0200
1.3 @@ -20,7 +20,8 @@
1.4 """
1.5
1.6 from moinformat.tree import Block, Break, DefItem, DefTerm, FontStyle, Heading, \
1.7 - ListItem, Monospace, Region, Rule, Text, Underline
1.8 + ListItem, Monospace, Region, Rule, Subscript, \
1.9 + Superscript, Text, Underline
1.10 import re
1.11
1.12 # Regular expressions.
1.13 @@ -57,10 +58,14 @@
1.14 "fontstyle" : r"('{2,6})",
1.15 "monospace" : r"`",
1.16 "rule" : r"(-----*)", # ----...
1.17 + "sub" : r",,",
1.18 + "super" : r"\^",
1.19 "underline" : r"__",
1.20
1.21 # Inline contents:
1.22 "monospaceend" : r"`",
1.23 + "subend" : r",,",
1.24 + "superend" : r"\^",
1.25 "underlineend" : r"__",
1.26
1.27 # Heading contents:
1.28 @@ -78,6 +83,13 @@
1.29 for name, value in syntax.items():
1.30 patterns[name] = re.compile(value, re.UNICODE | re.MULTILINE)
1.31
1.32 +inline_pattern_names = ["fontstyle", "monospace", "sub", "super", "underline"]
1.33 +
1.34 +def inline_patterns_for(name):
1.35 + names = inline_pattern_names[:]
1.36 + names[names.index(name)] = "%send" % name
1.37 + return names
1.38 +
1.39
1.40
1.41 # Tokenising functions.
1.42 @@ -195,16 +207,13 @@
1.43 "Parse the data provided by 'items' to populate a wiki 'region'."
1.44
1.45 new_block(region)
1.46 - parse_region_details(items, region, [
1.47 + parse_region_details(items, region, inline_pattern_names + [
1.48 "break", "heading",
1.49 "defterm", "defterm_empty",
1.50 - "fontstyle",
1.51 "listitem", "listitem_alpha", "listitem_dot", "listitem_num",
1.52 "listitem_roman",
1.53 - "monospace",
1.54 "regionstart", "regionend",
1.55 "rule",
1.56 - "underline",
1.57 ])
1.58
1.59 def parse_region_opaque(items, region):
1.60 @@ -326,7 +335,7 @@
1.61
1.62 span = FontStyle([], emphasis, strong)
1.63 if not double:
1.64 - parse_region_details(items, span, ["fontstyle", "monospace", "underline"])
1.65 + parse_region_details(items, span, inline_pattern_names)
1.66 region.append_inline(span)
1.67
1.68 def parse_heading(items, region):
1.69 @@ -337,7 +346,7 @@
1.70 level = len(items.read_match(2))
1.71 start_pad = items.read_match(3)
1.72 heading = Heading([], level, start_extra, start_pad)
1.73 - parse_region_details(items, heading, ["fontstyle", "headingend", "monospace", "underline"])
1.74 + parse_region_details(items, heading, ["headingend"] + inline_pattern_names)
1.75 region.append(heading)
1.76 new_block(region)
1.77
1.78 @@ -368,7 +377,7 @@
1.79 "Handle monospace."
1.80
1.81 span = Monospace([])
1.82 - parse_region_details(items, span, ["fontstyle", "monospaceend", "underline"])
1.83 + parse_region_details(items, span, inline_patterns_for("monospace"))
1.84 region.append_inline(span)
1.85
1.86 def parse_rule(items, region):
1.87 @@ -401,12 +410,28 @@
1.88 else:
1.89 region.append_inline(Text(feature))
1.90
1.91 +def parse_sub(items, region):
1.92 +
1.93 + "Handle subscript."
1.94 +
1.95 + span = Subscript([])
1.96 + parse_region_details(items, span, inline_patterns_for("sub"))
1.97 + region.append_inline(span)
1.98 +
1.99 +def parse_super(items, region):
1.100 +
1.101 + "Handle superscript."
1.102 +
1.103 + span = Superscript([])
1.104 + parse_region_details(items, span, inline_patterns_for("super"))
1.105 + region.append_inline(span)
1.106 +
1.107 def parse_underline(items, region):
1.108
1.109 "Handle underline."
1.110
1.111 span = Underline([])
1.112 - parse_region_details(items, span, ["fontstyle", "monospace", "underlineend"])
1.113 + parse_region_details(items, span, inline_patterns_for("underline"))
1.114 region.append_inline(span)
1.115
1.116 # Pattern handlers.
1.117 @@ -432,6 +457,10 @@
1.118 "regionstart" : parse_section,
1.119 "regionend" : parse_section_end,
1.120 "rule" : parse_rule,
1.121 + "sub" : parse_sub,
1.122 + "subend" : end_region,
1.123 + "super" : parse_super,
1.124 + "superend" : end_region,
1.125 "underline" : parse_underline,
1.126 "underlineend" : end_region,
1.127 }