# HG changeset patch # User Paul Boddie # Date 1493567992 -7200 # Node ID 81089c4cb6ebbf21bce4387d61523751b048be95 # Parent 70b10d6aaad3151bb26112c3cd1b1e97ccce00a6 Introduced an explicit paragraph break node, removing the final indicator from block nodes. Distinguished between node appending and node adding, the latter incorporating the replacement of empty nodes by new nodes. diff -r 70b10d6aaad3 -r 81089c4cb6eb moinformat/__init__.py --- a/moinformat/__init__.py Sun Apr 30 01:43:33 2017 +0200 +++ b/moinformat/__init__.py Sun Apr 30 17:59:52 2017 +0200 @@ -19,7 +19,7 @@ this program. If not, see . """ -from moinformat.tree import Block, Heading, ListItem, Region, Rule, Text +from moinformat.tree import Block, Break, Heading, ListItem, Region, Rule, Text import re # Regular expressions. @@ -36,11 +36,15 @@ "break" : r"^(\s*?)\n", # [ws...] =... ws... expecting headingend "heading" : r"^(\s*)(?P=+)(\s+)(?=.*?\s+(?P=x)\s*\n)", - # indent (list-item or number-item or alpha-item or roman-item or dot-item) + # indent list-item [ws...] "listitem" : r"^(\s+)(\*)(\s*)", + # indent number-item ws... "listitem_num" : r"^(\s+)(\d+\.)(\s+)", + # indent alpha-item ws... "listitem_alpha": r"^(\s+)([aA]\.)(\s+)", + # indent roman-item ws... "listitem_roman": r"^(\s+)([iI]\.)(\s+)", + # indent dot-item [ws...] "listitem_dot" : r"^(\s+)(\.)(\s*)", # Region contents: @@ -226,11 +230,7 @@ "Handle a paragraph break within 'region'." - # Mark any previous block as not being the final one in a sequence. - - block = region.last() - if isinstance(block, Block): - block.final = False + region.add(Break()) new_block(region) def parse_heading(items, region): @@ -326,7 +326,7 @@ "Start a new block in 'region'." block = Block([]) - region.append(block) + region.add(block) diff -r 70b10d6aaad3 -r 81089c4cb6eb moinformat/serialisers.py --- a/moinformat/serialisers.py Sun Apr 30 01:43:33 2017 +0200 +++ b/moinformat/serialisers.py Sun Apr 30 17:59:52 2017 +0200 @@ -44,12 +44,11 @@ if level: out("}" * level) - def start_block(self, final): + def start_block(self): pass - def end_block(self, final): - if not final: - self.out("\n") + def end_block(self): + pass def start_heading(self, level, extra, pad): self.out(extra + "=" * level + pad) @@ -63,6 +62,9 @@ def end_listitem(self, indent, marker): pass + def break_(self): + self.out("\n") + def rule(self, length): self.out("-" * length) @@ -92,10 +94,10 @@ def end_region(self, level, indent, type): self.out("") - def start_block(self, final): + def start_block(self): self.out("

") - def end_block(self, final): + def end_block(self): self.out("

") def start_heading(self, level, extra, pad): @@ -110,6 +112,9 @@ def end_listitem(self, indent, marker): self.out("") + def break_(self): + pass + def rule(self, length): self.out("
" % min(length, 10)) diff -r 70b10d6aaad3 -r 81089c4cb6eb moinformat/tree.py --- a/moinformat/tree.py Sun Apr 30 01:43:33 2017 +0200 +++ b/moinformat/tree.py Sun Apr 30 17:59:52 2017 +0200 @@ -29,13 +29,18 @@ def append(self, node): self.nodes.append(node) + add = append + append_text = append def empty(self): return not self.nodes - def last(self): - return self.nodes and self.nodes[-1] or None + def node(self, index): + try: + return self.nodes[index] + except IndexError: + return None def normalise(self): @@ -86,8 +91,8 @@ self.indent = indent self.type = type - def append(self, node): - last = self.last() + def add(self, node): + last = self.node(-1) if last and last.empty(): self.nodes[-1] = node else: @@ -124,24 +129,20 @@ "A block in the page." - def __init__(self, nodes, final=True): - Container.__init__(self, nodes) - self.final = final - def __repr__(self): return "Block(%r)" % self.nodes def prettyprint(self, indent=""): - l = ["%sBlock: final=%s" % (indent, self.final)] + l = ["%sBlock" % indent] for node in self.nodes: l.append(node.prettyprint(indent + " ")) return "\n".join(l) def to_string(self, out): - out.start_block(self.final) + out.start_block() for node in self.nodes: node.to_string(out) - out.end_block(self.final) + out.end_block() class Heading(Container): @@ -206,6 +207,19 @@ def empty(self): return False +class Break(Node): + + "A paragraph break." + + def __repr__(self): + return "Break()" + + def prettyprint(self, indent=""): + return "%sBreak" % indent + + def to_string(self, out): + out.break_() + class Rule(Node): "A horizontal rule."