# HG changeset patch # User Paul Boddie # Date 1493509413 -7200 # Node ID 70b10d6aaad3151bb26112c3cd1b1e97ccce00a6 # Parent 7825ca4d035797bc70a829e16112667858ef6085 Added support for other list node types, breaking the pattern for list items up into specific patterns. diff -r 7825ca4d0357 -r 70b10d6aaad3 moinformat/__init__.py --- a/moinformat/__init__.py Sat Apr 29 23:04:30 2017 +0200 +++ b/moinformat/__init__.py Sun Apr 30 01:43:33 2017 +0200 @@ -32,9 +32,16 @@ # Region contents: # Line-oriented patterns: - "break" : r"^(\s*?)\n", # blank line - "heading" : r"^(\s*)(?P=+)(\s+)(?=.*?\s+(?P=x)\s*\n)", # [ws...] =... ws... expecting headingend - "listitem" : r"^((\s+)([*]|\d+[.]))", # indent (list-item or number-item) + # blank line + "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) + "listitem" : r"^(\s+)(\*)(\s*)", + "listitem_num" : r"^(\s+)(\d+\.)(\s+)", + "listitem_alpha": r"^(\s+)([aA]\.)(\s+)", + "listitem_roman": r"^(\s+)([iI]\.)(\s+)", + "listitem_dot" : r"^(\s+)(\.)(\s*)", # Region contents: # Inline patterns: @@ -164,7 +171,9 @@ "Parse the data provided by 'items' to populate a wiki 'region'." new_block(region) - parse_region_details(items, region, ["break", "heading", "listitem", "regionstart", "regionend", "rule"]) + parse_region_details(items, region, [ + "break", "heading", "listitem", "listitem_num", "listitem_alpha", + "listitem_roman", "listitem_dot", "regionstart", "regionend", "rule"]) def parse_region_opaque(items, region): @@ -219,8 +228,9 @@ # Mark any previous block as not being the final one in a sequence. - block = region.nodes[-1] - block.final = False + block = region.last() + if isinstance(block, Block): + block.final = False new_block(region) def parse_heading(items, region): @@ -249,7 +259,10 @@ "Handle a list item marker within 'region'." - item = ListItem([]) + indent = len(items.read_match(1)) + marker = items.read_match(2) + space = items.read_match(3) + item = ListItem([], indent, marker, space) parse_region_details(items, item, ["listitemend"]) region.append(item) new_block(region) @@ -299,6 +312,10 @@ "headingend" : parse_heading_end, "listitemend" : parse_listitem_end, "listitem" : parse_listitem, + "listitem_alpha" : parse_listitem, + "listitem_dot" : parse_listitem, + "listitem_num" : parse_listitem, + "listitem_roman" : parse_listitem, "regionstart" : parse_section, "regionend" : parse_section_end, "rule" : parse_rule, diff -r 7825ca4d0357 -r 70b10d6aaad3 moinformat/serialisers.py --- a/moinformat/serialisers.py Sat Apr 29 23:04:30 2017 +0200 +++ b/moinformat/serialisers.py Sun Apr 30 01:43:33 2017 +0200 @@ -57,10 +57,10 @@ def end_heading(self, level, pad, extra): self.out(pad + "=" * level + extra) - def start_listitem(self): - self.out(" *") + def start_listitem(self, indent, marker, space): + self.out("%s%s%s" % (indent * " ", marker, space)) - def end_listitem(self): + def end_listitem(self, indent, marker): pass def rule(self, length): @@ -104,10 +104,10 @@ def end_heading(self, level, pad, extra): self.out("" % level) - def start_listitem(self): + def start_listitem(self, indent, marker, space): self.out("
  • ") - def end_listitem(self): + def end_listitem(self, indent, marker): self.out("
  • ") def rule(self, length): diff -r 7825ca4d0357 -r 70b10d6aaad3 moinformat/tree.py --- a/moinformat/tree.py Sat Apr 29 23:04:30 2017 +0200 +++ b/moinformat/tree.py Sun Apr 30 01:43:33 2017 +0200 @@ -34,6 +34,9 @@ def empty(self): return not self.nodes + def last(self): + return self.nodes and self.nodes[-1] or None + def normalise(self): "Combine adjacent text nodes." @@ -84,7 +87,7 @@ self.type = type def append(self, node): - last = self.nodes and self.nodes[-1] + last = self.last() if last and last.empty(): self.nodes[-1] = node else: @@ -173,20 +176,26 @@ "A list item." + def __init__(self, nodes, indent, marker, space): + Container.__init__(self, nodes) + self.indent = indent + self.marker = marker + self.space = space + def __repr__(self): - return "ListItem(%r)" % self.nodes + return "ListItem(%r, %r, %r, %r)" % (self.nodes, self.indent, self.marker, self.space) def prettyprint(self, indent=""): - l = ["%sListItem:" % indent] + l = ["%sListItem: indent=%d marker=%r space=%r" % (indent, self.indent, self.marker, self.space)] for node in self.nodes: l.append(node.prettyprint(indent + " ")) return "\n".join(l) def to_string(self, out): - out.start_listitem() + out.start_listitem(self.indent, self.marker, self.space) for node in self.nodes: node.to_string(out) - out.end_listitem() + out.end_listitem(self.indent, self.marker) diff -r 7825ca4d0357 -r 70b10d6aaad3 tests/test_parser.py --- a/tests/test_parser.py Sat Apr 29 23:04:30 2017 +0200 +++ b/tests/test_parser.py Sun Apr 30 01:43:33 2017 +0200 @@ -15,10 +15,20 @@ End }}}} XXX +""") +sl.append("""\ +XXX * Item 1 + * Item 1.1 * Item 2 + . Item 3 + . Item 3.1 XXX + a. Appendix + + i. Romanus eunt domus! + I. What did they do for us? """) sl.append("""\