# HG changeset patch # User Paul Boddie # Date 1493668972 -7200 # Node ID af408406865564c8ba0936c7064ebe5c3139e67f # Parent ca3330f1c2342ab8c828f5db727b90447da24b24 Added underlined text support and, unlike Moin, formatting within headings. diff -r ca3330f1c234 -r af4084068655 moinformat/__init__.py --- a/moinformat/__init__.py Mon May 01 18:24:22 2017 +0200 +++ b/moinformat/__init__.py Mon May 01 22:02:52 2017 +0200 @@ -20,7 +20,7 @@ """ from moinformat.tree import Block, Break, DefItem, DefTerm, FontStyle, Heading, \ - ListItem, Monospace, Region, Rule, Text + ListItem, Monospace, Region, Rule, Text, Underline import re # Regular expressions. @@ -57,9 +57,11 @@ "fontstyle" : r"('{2,6})", "monospace" : r"`", "rule" : r"(-----*)", # ----... + "underline" : r"__", # Inline contents: "monospaceend" : r"`", + "underlineend" : r"__", # Heading contents: "headingend" : r"(\s+)(=+)(\s*\n)", # ws... =... [ws...] nl @@ -202,6 +204,7 @@ "monospace", "regionstart", "regionend", "rule", + "underline", ]) def parse_region_opaque(items, region): @@ -323,7 +326,7 @@ span = FontStyle([], emphasis, strong) if not double: - parse_region_details(items, span, ["fontstyle", "monospace"]) + parse_region_details(items, span, ["fontstyle", "monospace", "underline"]) region.append_inline(span) def parse_heading(items, region): @@ -334,7 +337,7 @@ level = len(items.read_match(2)) start_pad = items.read_match(3) heading = Heading([], level, start_extra, start_pad) - parse_region_details(items, heading, ["headingend"]) + parse_region_details(items, heading, ["fontstyle", "headingend", "monospace", "underline"]) region.append(heading) new_block(region) @@ -365,7 +368,7 @@ "Handle monospace." span = Monospace([]) - parse_region_details(items, span, ["fontstyle", "monospaceend"]) + parse_region_details(items, span, ["fontstyle", "monospaceend", "underline"]) region.append_inline(span) def parse_rule(items, region): @@ -398,6 +401,14 @@ else: region.append_inline(Text(feature)) +def parse_underline(items, region): + + "Handle underline." + + span = Underline([]) + parse_region_details(items, span, ["fontstyle", "monospace", "underlineend"]) + region.append_inline(span) + # Pattern handlers. handlers = { @@ -421,6 +432,8 @@ "regionstart" : parse_section, "regionend" : parse_section_end, "rule" : parse_rule, + "underline" : parse_underline, + "underlineend" : end_region, } def new_block(region): diff -r ca3330f1c234 -r af4084068655 moinformat/serialisers.py --- a/moinformat/serialisers.py Mon May 01 18:24:22 2017 +0200 +++ b/moinformat/serialisers.py Mon May 01 22:02:52 2017 +0200 @@ -92,6 +92,12 @@ def end_strong(self): self.out("'''") + def start_underline(self): + self.out("__") + + def end_underline(self): + self.out("__") + def break_(self): self.out("\n") @@ -172,6 +178,12 @@ def end_strong(self): self.out("") + def start_underline(self): + self.out("") + + def end_underline(self): + self.out("") + def break_(self): pass diff -r ca3330f1c234 -r af4084068655 moinformat/tree.py --- a/moinformat/tree.py Mon May 01 18:24:22 2017 +0200 +++ b/moinformat/tree.py Mon May 01 22:02:52 2017 +0200 @@ -278,7 +278,7 @@ class Monospace(Container): - "Monospace text." + "Monospaced text." def __repr__(self): return "Monospace(%r)" % self.nodes @@ -292,6 +292,22 @@ self._to_string(out) out.end_monospace() +class Underline(Container): + + "Underlined text." + + def __repr__(self): + return "Underline(%r)" % self.nodes + + def prettyprint(self, indent=""): + l = ["%sUnderline" % indent] + return self._prettyprint(l, indent) + + def to_string(self, out): + out.start_underline() + self._to_string(out) + out.end_underline() + class Node: diff -r ca3330f1c234 -r af4084068655 tests/test_parser.py --- a/tests/test_parser.py Mon May 01 18:24:22 2017 +0200 +++ b/tests/test_parser.py Mon May 01 22:02:52 2017 +0200 @@ -90,6 +90,7 @@ == Not a heading == either = Mismatched heading == == Another mismatched heading = +=== Heading __Underlined__ === """) sl.append("""\ @@ -101,7 +102,7 @@ '''Strong''''''text'''. -Some `monospace` text. '''`Mono`, strong'''. +Some `monospace` text. `Mono, '''strong'''`, __underlined__, __''under''lined__. """) dl = map(parse, sl)