1.1 --- a/moinformat/__init__.py Sat Apr 29 17:47:03 2017 +0200
1.2 +++ b/moinformat/__init__.py Sat Apr 29 18:20:55 2017 +0200
1.3 @@ -19,7 +19,7 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from moinformat.tree import Region, Block, ListItem, Text
1.8 +from moinformat.tree import Block, ListItem, Region, Rule, Text
1.9 import re
1.10
1.11 # Regular expressions.
1.12 @@ -33,6 +33,7 @@
1.13 # Region contents:
1.14 "break" : (r"^(\s*?)\n", re.MULTILINE), # blank line
1.15 "listitem" : (r"^((\s+)([*]|\d+[.]))", re.MULTILINE), # indent (list-item or number-item)
1.16 + "rule" : (r"(-----*)", 0), # ----...
1.17
1.18 # List contents:
1.19 "listitemend" : (r"^", re.MULTILINE), # next line
1.20 @@ -155,7 +156,7 @@
1.21 "Parse the data provided by 'items' to populate a wiki 'region'."
1.22
1.23 new_block(region)
1.24 - parse_region_details(items, region, ["break", "listitem", "regionstart", "regionend"])
1.25 + parse_region_details(items, region, ["break", "listitem", "regionstart", "regionend", "rule"])
1.26
1.27 def parse_region_opaque(items, region):
1.28
1.29 @@ -229,6 +230,15 @@
1.30 region.append(item)
1.31 new_block(region)
1.32
1.33 +def parse_rule(items, region):
1.34 +
1.35 + "Handle a horizontal rule within 'region'."
1.36 +
1.37 + length = len(items.read_match(1))
1.38 + rule = Rule(length)
1.39 + region.append(rule)
1.40 + new_block(region)
1.41 +
1.42 def parse_section(items, region):
1.43
1.44 "Handle the start of a new section within 'region'."
1.45 @@ -259,6 +269,7 @@
1.46 "listitem" : parse_listitem,
1.47 "regionstart" : parse_section,
1.48 "regionend" : parse_section_end,
1.49 + "rule" : parse_rule,
1.50 }
1.51
1.52 def new_block(region):
2.1 --- a/moinformat/serialisers.py Sat Apr 29 17:47:03 2017 +0200
2.2 +++ b/moinformat/serialisers.py Sat Apr 29 18:20:55 2017 +0200
2.3 @@ -57,6 +57,9 @@
2.4 def end_listitem(self):
2.5 pass
2.6
2.7 + def rule(self, length):
2.8 + self.out("-" * length)
2.9 +
2.10 def text(self, s):
2.11 self.out(s)
2.12
2.13 @@ -95,6 +98,9 @@
2.14 def end_listitem(self):
2.15 self.out("</li>")
2.16
2.17 + def rule(self, length):
2.18 + self.out("<hr style='height: %dpt' />" % min(length, 10))
2.19 +
2.20 def text(self, s):
2.21 self.out(escape(s))
2.22
3.1 --- a/moinformat/tree.py Sat Apr 29 17:47:03 2017 +0200
3.2 +++ b/moinformat/tree.py Sat Apr 29 18:20:55 2017 +0200
3.3 @@ -159,7 +159,32 @@
3.4 node.to_string(out)
3.5 out.end_listitem()
3.6
3.7 -class Text:
3.8 +
3.9 +
3.10 +class Node:
3.11 +
3.12 + "A document node without children."
3.13 +
3.14 + def empty(self):
3.15 + return False
3.16 +
3.17 +class Rule(Node):
3.18 +
3.19 + "A horizontal rule."
3.20 +
3.21 + def __init__(self, length):
3.22 + self.length = length
3.23 +
3.24 + def __repr__(self):
3.25 + return "Rule(%d)" % self.length
3.26 +
3.27 + def prettyprint(self, indent=""):
3.28 + return "%sRule: %d" % (indent, self.length)
3.29 +
3.30 + def to_string(self, out):
3.31 + out.rule(self.length)
3.32 +
3.33 +class Text(Node):
3.34
3.35 "A text node."
3.36
4.1 --- a/tests/test_parser.py Sat Apr 29 17:47:03 2017 +0200
4.2 +++ b/tests/test_parser.py Sat Apr 29 18:20:55 2017 +0200
4.3 @@ -3,7 +3,9 @@
4.4 from moinformat import parse
4.5 from moinformat.serialisers import serialise, HTMLSerialiser
4.6
4.7 -s0 = """\
4.8 +sl = []
4.9 +
4.10 +sl.append("""\
4.11 Hello
4.12 {{{{#!wiki
4.13 A region
4.14 @@ -17,9 +19,9 @@
4.15 * Item 1
4.16 * Item 2
4.17 XXX
4.18 -"""
4.19 +""")
4.20
4.21 -s1 = """\
4.22 +sl.append("""\
4.23 Hello
4.24 {{{{#!xxx
4.25 A region
4.26 @@ -29,9 +31,9 @@
4.27 End
4.28 }}}}
4.29 XXX
4.30 -"""
4.31 +""")
4.32
4.33 -s2 = """\
4.34 +sl.append("""\
4.35 Hello
4.36 {{{{
4.37 Start
4.38 @@ -39,34 +41,40 @@
4.39 Still in region
4.40 }}}}
4.41 End
4.42 -"""
4.43 +""")
4.44 +
4.45 +sl.append("""\
4.46 +Hello {{{world}}} again""")
4.47
4.48 -s3 = """\
4.49 -Hello {{{world}}} again"""
4.50 +sl.append("""\
4.51 +XXX
4.52 +
4.53 +YYY""")
4.54
4.55 -d0 = parse(s0)
4.56 -d1 = parse(s1)
4.57 -d2 = parse(s2)
4.58 -d3 = parse(s3)
4.59 +sl.append("""\
4.60 +XXX
4.61 +----
4.62 +YYY
4.63 + ----still a rule
4.64 +also still a rule----
4.65 +EOF""")
4.66
4.67 -ns0 = serialise(d0)
4.68 -ns1 = serialise(d1)
4.69 -ns2 = serialise(d2)
4.70 -ns3 = serialise(d3)
4.71 +dl = map(parse, sl)
4.72 +nl = map(serialise, dl)
4.73
4.74 -for s, n in zip([s0, s1, s2, s3], [ns0, ns1, ns2, ns3]):
4.75 +for s, n in zip(sl, nl):
4.76 print n == s
4.77 print "----"
4.78 print n
4.79 print "----"
4.80
4.81 -for d in [d0, d1, d2, d3]:
4.82 +for d in dl:
4.83 print
4.84 print "----"
4.85 print serialise(d, HTMLSerialiser)
4.86 print "----"
4.87
4.88 -for d in [d0, d1, d2, d3]:
4.89 +for d in dl:
4.90 print
4.91 print "----"
4.92 print d.prettyprint()