1.1 --- a/moinformat/macros/toc.py Tue Jul 31 21:39:35 2018 +0200
1.2 +++ b/moinformat/macros/toc.py Wed Aug 01 16:50:29 2018 +0200
1.3 @@ -80,30 +80,46 @@
1.4 while level < new_level:
1.5 level += 1
1.6
1.7 + # Ignore levels outside the range of interest.
1.8 +
1.9 if not (min_level <= level <= max_level):
1.10 continue
1.11
1.12 # Determine whether the heading should be generated at this
1.13 - # level.
1.14 + # level or whether there are intermediate levels being
1.15 + # produced.
1.16
1.17 nodes = level == new_level and heading.nodes[:] + nl or []
1.18 indent = level - 1
1.19
1.20 - # Make a list and add an item to it.
1.21 + # Create a new item for the heading or sublists.
1.22 +
1.23 + new_item = ListItem(nodes, indent, marker, space, None)
1.24 +
1.25 + # Either revive an existing list.
1.26
1.27 - new_items = []
1.28 - new_list = List(new_items, indent, marker, num)
1.29 - new_item = ListItem(nodes, indent, marker, space, None)
1.30 - new_items.append(new_item)
1.31 + if level == min_level and lists:
1.32 + new_list = lists[-1]
1.33 + new_items = new_list.nodes
1.34 +
1.35 + # Or make a list and add an item to it.
1.36
1.37 - # Add the list to the current item, if any.
1.38 + else:
1.39 + new_items = []
1.40 + new_list = List(new_items, indent, marker, num)
1.41 +
1.42 + # Add the list to the current item, if any.
1.43
1.44 - if item:
1.45 - item.nodes.append(new_list)
1.46 + if item:
1.47 + item.nodes.append(new_list)
1.48 +
1.49 + # Record the new list.
1.50
1.51 - # Record the new list.
1.52 + lists.append(new_list)
1.53
1.54 - lists.append(new_list)
1.55 + # Add the item to the new or revived list.
1.56 +
1.57 + new_items.append(new_item)
1.58
1.59 # Reference the new list's items and current item.
1.60
1.61 @@ -115,8 +131,12 @@
1.62
1.63 if new_level < level:
1.64 while level > new_level:
1.65 - if min_level <= level <= max_level:
1.66 +
1.67 + # Retain a list at the minimum level.
1.68 +
1.69 + if min_level < level <= max_level:
1.70 lists.pop()
1.71 +
1.72 level -= 1
1.73
1.74 # Obtain the existing list and the current item.
1.75 @@ -136,7 +156,7 @@
1.76 # Replace the macro node's children with the top-level list.
1.77 # The macro cannot be replaced because it will be appearing inline.
1.78
1.79 - self.node.nodes = [lists[0]]
1.80 + self.node.nodes = lists and [lists[0]] or []
1.81
1.82 def find_headings(self, node, headings):
1.83
2.1 --- a/moinformat/parsers/common.py Tue Jul 31 21:39:35 2018 +0200
2.2 +++ b/moinformat/parsers/common.py Wed Aug 01 16:50:29 2018 +0200
2.3 @@ -28,6 +28,12 @@
2.4 ws_excl_nl = r"[ \f\r\t\v]"
2.5 quotes = "['" '"]' # ['"]
2.6
2.7 +def choice(l):
2.8 +
2.9 + "Return a pattern matching a choice of patterns in 'l'."
2.10 +
2.11 + return "(%s)" % "|".join(l)
2.12 +
2.13 def excl(s):
2.14
2.15 "Return a non-matching pattern for 's'."
2.16 @@ -409,7 +415,8 @@
2.17 """
2.18
2.19 if self.read_until(["header"], False) == "": # None means no header
2.20 - region.type = self.match_group("args")
2.21 + region.args = self.match_group("args")
2.22 + region.type = region.args.split(" ", 1)[0]
2.23
2.24 # Parsing utilities.
2.25
3.1 --- a/moinformat/parsers/moin.py Tue Jul 31 21:39:35 2018 +0200
3.2 +++ b/moinformat/parsers/moin.py Wed Aug 01 16:50:29 2018 +0200
3.3 @@ -25,7 +25,7 @@
3.4
3.5 # Parser functionality and pattern definition.
3.6
3.7 -from moinformat.parsers.common import ParserBase, get_patterns, \
3.8 +from moinformat.parsers.common import ParserBase, get_patterns, choice, \
3.9 excl, expect, group, optional, recur, \
3.10 repeat
3.11
3.12 @@ -150,7 +150,7 @@
3.13
3.14 pad = self.match_group("pad")
3.15 item = DefItem([], pad, extra)
3.16 - self.parse_region_details(item, ["listitemend"])
3.17 + self.parse_region_details(item, self.listitem_pattern_names)
3.18 self.add_node(region, item)
3.19 self.new_block(region)
3.20
3.21 @@ -162,9 +162,15 @@
3.22 term = DefTerm([], pad)
3.23 self.parse_region_details(term, ["deftermend", "deftermsep"])
3.24 self.add_node(region, term)
3.25 +
3.26 if self.matching_pattern() == "deftermsep":
3.27 self.parse_defitem(region)
3.28
3.29 + # Add padding from the separator to the term, there being no item.
3.30 +
3.31 + else:
3.32 + term.extra = self.match_group("pad")
3.33 +
3.34 def parse_defterm_empty(self, region):
3.35
3.36 "Handle an empty definition term within 'region'."
3.37 @@ -564,8 +570,7 @@
3.38
3.39 "defterm_empty" : join(("^",
3.40 group("pad", r"\N+"), # ws...
3.41 - expect("::\s+"))), # ::
3.42 - # ws... (optional)
3.43 + expect("::\s+"))), # :: ws...
3.44
3.45 "heading" : join(("^",
3.46 group("extra", r"\N*"), # ws... (optional)
3.47 @@ -665,9 +670,17 @@
3.48 # nl
3.49
3.50 "deftermsep" : join(("::", group("pad", r"\s+"))), # ::
3.51 - # ws... (optional)
3.52 + # ws...
3.53
3.54 - "listitemend" : r"^", # next line
3.55 + "listitemend" : join((r"^", # next line
3.56 + choice((excl(r"\N"), # without indent
3.57 + expect(r"\N+\*"), # or with ws... list-marker
3.58 + expect(r"\N+\d\."), # or with ws... decimal-marker
3.59 + expect(r"\N+[aA]\."), # or with ws... alpha-marker
3.60 + expect(r"\N+[iI]\."), # or with ws... roman-marker
3.61 + expect(r"\N+\."), # or with ws... dot-marker
3.62 + expect(r"\N+.+?::\s"), # or with ws... text :: ws (next defterm)
3.63 + expect(r"\N+::\s"))))), # or with ws... :: ws (next defitem)
3.64
3.65 # Table contents:
3.66
4.1 --- a/moinformat/serialisers/html/moin.py Tue Jul 31 21:39:35 2018 +0200
4.2 +++ b/moinformat/serialisers/html/moin.py Wed Aug 01 16:50:29 2018 +0200
4.3 @@ -77,10 +77,10 @@
4.4 def end_defitem(self, pad, extra):
4.5 self.out("</dd>")
4.6
4.7 - def start_defterm(self, pad):
4.8 + def start_defterm(self, pad, extra):
4.9 self.out("<dt>")
4.10
4.11 - def end_defterm(self, pad):
4.12 + def end_defterm(self, pad, extra):
4.13 self.out("</dt>")
4.14
4.15 def start_emphasis(self):
5.1 --- a/moinformat/serialisers/moin/moin.py Tue Jul 31 21:39:35 2018 +0200
5.2 +++ b/moinformat/serialisers/moin/moin.py Wed Aug 01 16:50:29 2018 +0200
5.3 @@ -49,16 +49,16 @@
5.4 pass
5.5
5.6 def start_defitem(self, pad, extra):
5.7 - self.out((extra and "\n" + extra + "::" or "") + pad)
5.8 + self.out((extra and extra + "::" or "") + pad)
5.9
5.10 def end_defitem(self, pad, extra):
5.11 pass
5.12
5.13 - def start_defterm(self, pad):
5.14 + def start_defterm(self, pad, extra):
5.15 self.out(pad)
5.16
5.17 - def end_defterm(self, pad):
5.18 - self.out("::")
5.19 + def end_defterm(self, pad, extra):
5.20 + self.out("::" + extra)
5.21
5.22 def start_emphasis(self):
5.23 self.out("''")
6.1 --- a/moinformat/tree/moin.py Tue Jul 31 21:39:35 2018 +0200
6.2 +++ b/moinformat/tree/moin.py Wed Aug 01 16:50:29 2018 +0200
6.3 @@ -146,11 +146,13 @@
6.4
6.5 "A region of the page."
6.6
6.7 - def __init__(self, nodes, level=0, indent=0, type=None, transparent=True, extra=None):
6.8 + def __init__(self, nodes, level=0, indent=0, type=None, args=None,
6.9 + transparent=True, extra=None):
6.10 Container.__init__(self, nodes)
6.11 self.level = level
6.12 self.indent = indent
6.13 self.type = type
6.14 + self.args = args
6.15 self.transparent = transparent
6.16 self.extra = extra
6.17
6.18 @@ -174,12 +176,12 @@
6.19 return self.level and s.startswith("}") and self.level == len(s)
6.20
6.21 def __repr__(self):
6.22 - return "Region(%r, %r, %r, %r, %r, %r)" % (self.nodes, self.level,
6.23 - self.indent, self.type, self.transparent, self.extra)
6.24 + return "Region(%r, %r, %r, %r, %r, %r, %r)" % (self.nodes, self.level,
6.25 + self.indent, self.type, self.args, self.transparent, self.extra)
6.26
6.27 def prettyprint(self, indent=""):
6.28 - l = ["%sRegion: level=%d indent=%d type=%s extra=%r" % (indent,
6.29 - self.level, self.indent, self.type, self.extra)]
6.30 + l = ["%sRegion: level=%d indent=%d type=%s args=%r extra=%r" % (indent,
6.31 + self.level, self.indent, self.type, self.args, self.extra)]
6.32 return self._prettyprint(l, indent)
6.33
6.34 def to_string(self, out):
6.35 @@ -245,21 +247,22 @@
6.36
6.37 "A definition term."
6.38
6.39 - def __init__(self, nodes, pad):
6.40 + def __init__(self, nodes, pad, extra=""):
6.41 Container.__init__(self, nodes)
6.42 self.pad = pad
6.43 + self.extra = extra
6.44
6.45 def __repr__(self):
6.46 - return "DefTerm(%r, %r)" % (self.nodes, self.pad)
6.47 + return "DefTerm(%r, %r, %r)" % (self.nodes, self.pad, self.extra)
6.48
6.49 def prettyprint(self, indent=""):
6.50 - l = ["%sDefTerm: pad=%r" % (indent, self.pad)]
6.51 + l = ["%sDefTerm: pad=%r extra=%r" % (indent, self.pad, self.extra)]
6.52 return self._prettyprint(l, indent)
6.53
6.54 def to_string(self, out):
6.55 - out.start_defterm(self.pad)
6.56 + out.start_defterm(self.pad, self.extra)
6.57 self._to_string(out)
6.58 - out.end_defterm(self.pad)
6.59 + out.end_defterm(self.pad, self.extra)
6.60
6.61 class FontStyle(Container):
6.62
7.1 --- a/tests/test_deflists.tree Tue Jul 31 21:39:35 2018 +0200
7.2 +++ b/tests/test_deflists.tree Wed Aug 01 16:50:29 2018 +0200
7.3 @@ -9,5 +9,15 @@
7.4 Text
7.5 DefItem
7.6 Text
7.7 + DefItem
7.8 + Text
7.9 + DefItem
7.10 + Text
7.11 + List
7.12 + ListItem
7.13 + Text
7.14 + DefTerm
7.15 + Text
7.16 + DefItem
7.17 + Text
7.18 Block
7.19 - Text
8.1 --- a/tests/test_deflists.txt Tue Jul 31 21:39:35 2018 +0200
8.2 +++ b/tests/test_deflists.txt Wed Aug 01 16:50:29 2018 +0200
8.3 @@ -1,5 +1,10 @@
8.4 term:: item
8.5 not a term:: nor an item
8.6 term::
8.7 + :: first item
8.8 :: item
8.9 - ::non-item
8.10 + continued
8.11 + :: item
8.12 + ::also continued
8.13 + * List!
8.14 + defterm:: defitem
9.1 --- a/tests/test_lists.tree Tue Jul 31 21:39:35 2018 +0200
9.2 +++ b/tests/test_lists.tree Wed Aug 01 16:50:29 2018 +0200
9.3 @@ -32,3 +32,10 @@
9.4 Text
9.5 Block
9.6 Text
9.7 + List
9.8 + ListItem
9.9 + Text
9.10 + ListItem
9.11 + Text
9.12 + Block
9.13 + Text
10.1 --- a/tests/test_lists.txt Tue Jul 31 21:39:35 2018 +0200
10.2 +++ b/tests/test_lists.txt Wed Aug 01 16:50:29 2018 +0200
10.3 @@ -11,3 +11,8 @@
10.4 * Flat
10.5 * List
10.6 XXX
10.7 + * List with
10.8 + continuation
10.9 + * Continuing...
10.10 + again
10.11 +And stop.
11.1 --- a/tests/test_parser.py Tue Jul 31 21:39:35 2018 +0200
11.2 +++ b/tests/test_parser.py Wed Aug 01 16:50:29 2018 +0200
11.3 @@ -41,6 +41,10 @@
11.4 print "-" * 60
11.5 print expected
11.6 print "-" * 60
11.7 +
11.8 + # Show HTML serialisation.
11.9 +
11.10 + output = make_output("standalone")
11.11 print serialise(d, make_serialiser("html", output))
11.12 print "-" * 60
11.13 print