# HG changeset patch # User Paul Boddie # Date 1533135029 -7200 # Node ID f68644e49ec2cf5b03df2de0df41c489d86206aa # Parent 4899f4480aea5f3d5f97ff2f14ba6ad614097c31# Parent 8874a2ac2c6dae1a1763d297cf01285b7a0cb898 Merged changes from the default branch. diff -r 4899f4480aea -r f68644e49ec2 moinformat/macros/toc.py --- a/moinformat/macros/toc.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/macros/toc.py Wed Aug 01 16:50:29 2018 +0200 @@ -80,30 +80,46 @@ while level < new_level: level += 1 + # Ignore levels outside the range of interest. + if not (min_level <= level <= max_level): continue # Determine whether the heading should be generated at this - # level. + # level or whether there are intermediate levels being + # produced. nodes = level == new_level and heading.nodes[:] + nl or [] indent = level - 1 - # Make a list and add an item to it. + # Create a new item for the heading or sublists. + + new_item = ListItem(nodes, indent, marker, space, None) + + # Either revive an existing list. - new_items = [] - new_list = List(new_items, indent, marker, num) - new_item = ListItem(nodes, indent, marker, space, None) - new_items.append(new_item) + if level == min_level and lists: + new_list = lists[-1] + new_items = new_list.nodes + + # Or make a list and add an item to it. - # Add the list to the current item, if any. + else: + new_items = [] + new_list = List(new_items, indent, marker, num) + + # Add the list to the current item, if any. - if item: - item.nodes.append(new_list) + if item: + item.nodes.append(new_list) + + # Record the new list. - # Record the new list. + lists.append(new_list) - lists.append(new_list) + # Add the item to the new or revived list. + + new_items.append(new_item) # Reference the new list's items and current item. @@ -115,8 +131,12 @@ if new_level < level: while level > new_level: - if min_level <= level <= max_level: + + # Retain a list at the minimum level. + + if min_level < level <= max_level: lists.pop() + level -= 1 # Obtain the existing list and the current item. @@ -136,7 +156,7 @@ # Replace the macro node's children with the top-level list. # The macro cannot be replaced because it will be appearing inline. - self.node.nodes = [lists[0]] + self.node.nodes = lists and [lists[0]] or [] def find_headings(self, node, headings): diff -r 4899f4480aea -r f68644e49ec2 moinformat/parsers/common.py --- a/moinformat/parsers/common.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/parsers/common.py Wed Aug 01 16:50:29 2018 +0200 @@ -28,6 +28,12 @@ ws_excl_nl = r"[ \f\r\t\v]" quotes = "['" '"]' # ['"] +def choice(l): + + "Return a pattern matching a choice of patterns in 'l'." + + return "(%s)" % "|".join(l) + def excl(s): "Return a non-matching pattern for 's'." @@ -409,7 +415,8 @@ """ if self.read_until(["header"], False) == "": # None means no header - region.type = self.match_group("args") + region.args = self.match_group("args") + region.type = region.args.split(" ", 1)[0] # Parsing utilities. diff -r 4899f4480aea -r f68644e49ec2 moinformat/parsers/moin.py --- a/moinformat/parsers/moin.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/parsers/moin.py Wed Aug 01 16:50:29 2018 +0200 @@ -25,7 +25,7 @@ # Parser functionality and pattern definition. -from moinformat.parsers.common import ParserBase, get_patterns, \ +from moinformat.parsers.common import ParserBase, get_patterns, choice, \ excl, expect, group, optional, recur, \ repeat @@ -150,7 +150,7 @@ pad = self.match_group("pad") item = DefItem([], pad, extra) - self.parse_region_details(item, ["listitemend"]) + self.parse_region_details(item, self.listitem_pattern_names) self.add_node(region, item) self.new_block(region) @@ -162,9 +162,15 @@ term = DefTerm([], pad) self.parse_region_details(term, ["deftermend", "deftermsep"]) self.add_node(region, term) + if self.matching_pattern() == "deftermsep": self.parse_defitem(region) + # Add padding from the separator to the term, there being no item. + + else: + term.extra = self.match_group("pad") + def parse_defterm_empty(self, region): "Handle an empty definition term within 'region'." @@ -564,8 +570,7 @@ "defterm_empty" : join(("^", group("pad", r"\N+"), # ws... - expect("::\s+"))), # :: - # ws... (optional) + expect("::\s+"))), # :: ws... "heading" : join(("^", group("extra", r"\N*"), # ws... (optional) @@ -665,9 +670,17 @@ # nl "deftermsep" : join(("::", group("pad", r"\s+"))), # :: - # ws... (optional) + # ws... - "listitemend" : r"^", # next line + "listitemend" : join((r"^", # next line + choice((excl(r"\N"), # without indent + expect(r"\N+\*"), # or with ws... list-marker + expect(r"\N+\d\."), # or with ws... decimal-marker + expect(r"\N+[aA]\."), # or with ws... alpha-marker + expect(r"\N+[iI]\."), # or with ws... roman-marker + expect(r"\N+\."), # or with ws... dot-marker + expect(r"\N+.+?::\s"), # or with ws... text :: ws (next defterm) + expect(r"\N+::\s"))))), # or with ws... :: ws (next defitem) # Table contents: diff -r 4899f4480aea -r f68644e49ec2 moinformat/serialisers/html/moin.py --- a/moinformat/serialisers/html/moin.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/serialisers/html/moin.py Wed Aug 01 16:50:29 2018 +0200 @@ -77,10 +77,10 @@ def end_defitem(self, pad, extra): self.out("") - def start_defterm(self, pad): + def start_defterm(self, pad, extra): self.out("
") - def end_defterm(self, pad): + def end_defterm(self, pad, extra): self.out("
") def start_emphasis(self): diff -r 4899f4480aea -r f68644e49ec2 moinformat/serialisers/moin/moin.py --- a/moinformat/serialisers/moin/moin.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/serialisers/moin/moin.py Wed Aug 01 16:50:29 2018 +0200 @@ -49,16 +49,16 @@ pass def start_defitem(self, pad, extra): - self.out((extra and "\n" + extra + "::" or "") + pad) + self.out((extra and extra + "::" or "") + pad) def end_defitem(self, pad, extra): pass - def start_defterm(self, pad): + def start_defterm(self, pad, extra): self.out(pad) - def end_defterm(self, pad): - self.out("::") + def end_defterm(self, pad, extra): + self.out("::" + extra) def start_emphasis(self): self.out("''") diff -r 4899f4480aea -r f68644e49ec2 moinformat/tree/moin.py --- a/moinformat/tree/moin.py Tue Jul 31 21:39:35 2018 +0200 +++ b/moinformat/tree/moin.py Wed Aug 01 16:50:29 2018 +0200 @@ -146,11 +146,13 @@ "A region of the page." - def __init__(self, nodes, level=0, indent=0, type=None, transparent=True, extra=None): + def __init__(self, nodes, level=0, indent=0, type=None, args=None, + transparent=True, extra=None): Container.__init__(self, nodes) self.level = level self.indent = indent self.type = type + self.args = args self.transparent = transparent self.extra = extra @@ -174,12 +176,12 @@ return self.level and s.startswith("}") and self.level == len(s) def __repr__(self): - return "Region(%r, %r, %r, %r, %r, %r)" % (self.nodes, self.level, - self.indent, self.type, self.transparent, self.extra) + return "Region(%r, %r, %r, %r, %r, %r, %r)" % (self.nodes, self.level, + self.indent, self.type, self.args, self.transparent, self.extra) def prettyprint(self, indent=""): - l = ["%sRegion: level=%d indent=%d type=%s extra=%r" % (indent, - self.level, self.indent, self.type, self.extra)] + l = ["%sRegion: level=%d indent=%d type=%s args=%r extra=%r" % (indent, + self.level, self.indent, self.type, self.args, self.extra)] return self._prettyprint(l, indent) def to_string(self, out): @@ -245,21 +247,22 @@ "A definition term." - def __init__(self, nodes, pad): + def __init__(self, nodes, pad, extra=""): Container.__init__(self, nodes) self.pad = pad + self.extra = extra def __repr__(self): - return "DefTerm(%r, %r)" % (self.nodes, self.pad) + return "DefTerm(%r, %r, %r)" % (self.nodes, self.pad, self.extra) def prettyprint(self, indent=""): - l = ["%sDefTerm: pad=%r" % (indent, self.pad)] + l = ["%sDefTerm: pad=%r extra=%r" % (indent, self.pad, self.extra)] return self._prettyprint(l, indent) def to_string(self, out): - out.start_defterm(self.pad) + out.start_defterm(self.pad, self.extra) self._to_string(out) - out.end_defterm(self.pad) + out.end_defterm(self.pad, self.extra) class FontStyle(Container): diff -r 4899f4480aea -r f68644e49ec2 tests/test_deflists.tree --- a/tests/test_deflists.tree Tue Jul 31 21:39:35 2018 +0200 +++ b/tests/test_deflists.tree Wed Aug 01 16:50:29 2018 +0200 @@ -9,5 +9,15 @@ Text DefItem Text + DefItem + Text + DefItem + Text + List + ListItem + Text + DefTerm + Text + DefItem + Text Block - Text diff -r 4899f4480aea -r f68644e49ec2 tests/test_deflists.txt --- a/tests/test_deflists.txt Tue Jul 31 21:39:35 2018 +0200 +++ b/tests/test_deflists.txt Wed Aug 01 16:50:29 2018 +0200 @@ -1,5 +1,10 @@ term:: item not a term:: nor an item term:: + :: first item :: item - ::non-item + continued + :: item + ::also continued + * List! + defterm:: defitem diff -r 4899f4480aea -r f68644e49ec2 tests/test_lists.tree --- a/tests/test_lists.tree Tue Jul 31 21:39:35 2018 +0200 +++ b/tests/test_lists.tree Wed Aug 01 16:50:29 2018 +0200 @@ -32,3 +32,10 @@ Text Block Text + List + ListItem + Text + ListItem + Text + Block + Text diff -r 4899f4480aea -r f68644e49ec2 tests/test_lists.txt --- a/tests/test_lists.txt Tue Jul 31 21:39:35 2018 +0200 +++ b/tests/test_lists.txt Wed Aug 01 16:50:29 2018 +0200 @@ -11,3 +11,8 @@ * Flat * List XXX + * List with + continuation + * Continuing... + again +And stop. diff -r 4899f4480aea -r f68644e49ec2 tests/test_parser.py --- a/tests/test_parser.py Tue Jul 31 21:39:35 2018 +0200 +++ b/tests/test_parser.py Wed Aug 01 16:50:29 2018 +0200 @@ -41,6 +41,10 @@ print "-" * 60 print expected print "-" * 60 + + # Show HTML serialisation. + + output = make_output("standalone") print serialise(d, make_serialiser("html", output)) print "-" * 60 print