# HG changeset patch # User Paul Boddie # Date 1493482855 -7200 # Node ID 575c7b5d97ac7e0c6f249e7fd1c92eda6661be21 # Parent e1ed135d019fa20910d6000d3f986ac53b151419 Added horizontal rule support. diff -r e1ed135d019f -r 575c7b5d97ac moinformat/__init__.py --- a/moinformat/__init__.py Sat Apr 29 17:47:03 2017 +0200 +++ b/moinformat/__init__.py Sat Apr 29 18:20:55 2017 +0200 @@ -19,7 +19,7 @@ this program. If not, see . """ -from moinformat.tree import Region, Block, ListItem, Text +from moinformat.tree import Block, ListItem, Region, Rule, Text import re # Regular expressions. @@ -33,6 +33,7 @@ # Region contents: "break" : (r"^(\s*?)\n", re.MULTILINE), # blank line "listitem" : (r"^((\s+)([*]|\d+[.]))", re.MULTILINE), # indent (list-item or number-item) + "rule" : (r"(-----*)", 0), # ----... # List contents: "listitemend" : (r"^", re.MULTILINE), # next line @@ -155,7 +156,7 @@ "Parse the data provided by 'items' to populate a wiki 'region'." new_block(region) - parse_region_details(items, region, ["break", "listitem", "regionstart", "regionend"]) + parse_region_details(items, region, ["break", "listitem", "regionstart", "regionend", "rule"]) def parse_region_opaque(items, region): @@ -229,6 +230,15 @@ region.append(item) new_block(region) +def parse_rule(items, region): + + "Handle a horizontal rule within 'region'." + + length = len(items.read_match(1)) + rule = Rule(length) + region.append(rule) + new_block(region) + def parse_section(items, region): "Handle the start of a new section within 'region'." @@ -259,6 +269,7 @@ "listitem" : parse_listitem, "regionstart" : parse_section, "regionend" : parse_section_end, + "rule" : parse_rule, } def new_block(region): diff -r e1ed135d019f -r 575c7b5d97ac moinformat/serialisers.py --- a/moinformat/serialisers.py Sat Apr 29 17:47:03 2017 +0200 +++ b/moinformat/serialisers.py Sat Apr 29 18:20:55 2017 +0200 @@ -57,6 +57,9 @@ def end_listitem(self): pass + def rule(self, length): + self.out("-" * length) + def text(self, s): self.out(s) @@ -95,6 +98,9 @@ def end_listitem(self): self.out("") + def rule(self, length): + self.out("
" % min(length, 10)) + def text(self, s): self.out(escape(s)) diff -r e1ed135d019f -r 575c7b5d97ac moinformat/tree.py --- a/moinformat/tree.py Sat Apr 29 17:47:03 2017 +0200 +++ b/moinformat/tree.py Sat Apr 29 18:20:55 2017 +0200 @@ -159,7 +159,32 @@ node.to_string(out) out.end_listitem() -class Text: + + +class Node: + + "A document node without children." + + def empty(self): + return False + +class Rule(Node): + + "A horizontal rule." + + def __init__(self, length): + self.length = length + + def __repr__(self): + return "Rule(%d)" % self.length + + def prettyprint(self, indent=""): + return "%sRule: %d" % (indent, self.length) + + def to_string(self, out): + out.rule(self.length) + +class Text(Node): "A text node." diff -r e1ed135d019f -r 575c7b5d97ac tests/test_parser.py --- a/tests/test_parser.py Sat Apr 29 17:47:03 2017 +0200 +++ b/tests/test_parser.py Sat Apr 29 18:20:55 2017 +0200 @@ -3,7 +3,9 @@ from moinformat import parse from moinformat.serialisers import serialise, HTMLSerialiser -s0 = """\ +sl = [] + +sl.append("""\ Hello {{{{#!wiki A region @@ -17,9 +19,9 @@ * Item 1 * Item 2 XXX -""" +""") -s1 = """\ +sl.append("""\ Hello {{{{#!xxx A region @@ -29,9 +31,9 @@ End }}}} XXX -""" +""") -s2 = """\ +sl.append("""\ Hello {{{{ Start @@ -39,34 +41,40 @@ Still in region }}}} End -""" +""") + +sl.append("""\ +Hello {{{world}}} again""") -s3 = """\ -Hello {{{world}}} again""" +sl.append("""\ +XXX + +YYY""") -d0 = parse(s0) -d1 = parse(s1) -d2 = parse(s2) -d3 = parse(s3) +sl.append("""\ +XXX +---- +YYY + ----still a rule +also still a rule---- +EOF""") -ns0 = serialise(d0) -ns1 = serialise(d1) -ns2 = serialise(d2) -ns3 = serialise(d3) +dl = map(parse, sl) +nl = map(serialise, dl) -for s, n in zip([s0, s1, s2, s3], [ns0, ns1, ns2, ns3]): +for s, n in zip(sl, nl): print n == s print "----" print n print "----" -for d in [d0, d1, d2, d3]: +for d in dl: print print "----" print serialise(d, HTMLSerialiser) print "----" -for d in [d0, d1, d2, d3]: +for d in dl: print print "----" print d.prettyprint()