2.1 --- a/moinformat/parsers/moin.py Mon Jul 30 17:18:52 2018 +0200
2.2 +++ b/moinformat/parsers/moin.py Mon Jul 30 23:19:20 2018 +0200
2.3 @@ -36,8 +36,8 @@
2.4 # Document tree nodes.
2.5
2.6 from moinformat.tree.moin import Break, DefItem, DefTerm, FontStyle, Heading, \
2.7 - Larger, Link, List, ListItem, Macro, \
2.8 - Monospace, Region, Rule, Smaller, \
2.9 + Larger, LineBreak, Link, List, ListItem, \
2.10 + Macro, Monospace, Region, Rule, Smaller, \
2.11 Strikethrough, Subscript, Superscript, Table, \
2.12 TableAttr, TableAttrs, TableCell, TableRow, \
2.13 Text, Underline
2.14 @@ -479,6 +479,9 @@
2.15
2.16 # Complete inline pattern handlers.
2.17
2.18 + def parse_linebreak(self, region):
2.19 + region.append_inline(LineBreak())
2.20 +
2.21 def parse_link(self, region):
2.22 target = self.match_group("target")
2.23 text = self.match_group("text")
2.24 @@ -493,7 +496,7 @@
2.25 # interpret the individual arguments.
2.26
2.27 arglist = args and args.split(",") or []
2.28 - macro = Macro(name, arglist)
2.29 + macro = Macro(name, arglist, region.append_point())
2.30 region.append_inline(macro)
2.31
2.32 # Record the macro for later processing.
2.33 @@ -614,6 +617,8 @@
2.34 # Complete inline patterns are for markup features that do not support
2.35 # arbitrary content within them:
2.36
2.37 + "linebreak" : r"\\\\", # \\
2.38 +
2.39 "link" : join((r"\[\[", # [[
2.40 group("target", ".*?"), # target
2.41 optional(join((r"\|", group("text", ".*?")))), # | text (optional)
2.42 @@ -697,8 +702,8 @@
2.43 ]
2.44
2.45 inline_pattern_names = [
2.46 - "fontstyle", "larger", "link", "macro", "monospace", "regionstart",
2.47 - "smaller", "strike", "sub", "super", "underline",
2.48 + "fontstyle", "larger", "linebreak", "link", "macro", "monospace",
2.49 + "regionstart", "smaller", "strike", "sub", "super", "underline",
2.50 ]
2.51
2.52 list_pattern_names = [
2.53 @@ -745,6 +750,7 @@
2.54 "headingend" : parse_heading_end,
2.55 "larger" : parse_larger,
2.56 "largerend" : end_region,
2.57 + "linebreak" : parse_linebreak,
2.58 "link" : parse_link,
2.59 "macro" : parse_macro,
2.60 "listitemend" : end_region,
5.1 --- a/moinformat/tree/moin.py Mon Jul 30 17:18:52 2018 +0200
5.2 +++ b/moinformat/tree/moin.py Mon Jul 30 23:19:20 2018 +0200
5.3 @@ -40,12 +40,32 @@
5.4
5.5 add = append
5.6
5.7 - append_inline = append
5.8 + def append_inline(self, node):
5.9 +
5.10 + "Append 'node' inline within the appropriate container."
5.11 +
5.12 + n = self.append_point()
5.13 +
5.14 + # Redirect the addition if another container is to accept the node.
5.15 +
5.16 + if n is not self:
5.17 + n.append_inline(node)
5.18 +
5.19 + # Otherwise, append within this container.
5.20 +
5.21 + else:
5.22 + n.append(node)
5.23
5.24 def append_inline_many(self, nodes):
5.25 for node in nodes:
5.26 self.append_inline(node)
5.27
5.28 + def append_point(self):
5.29 +
5.30 + "Return the container to which inline nodes are added."
5.31 +
5.32 + return self
5.33 +
5.34 def empty(self):
5.35 return not self.nodes
5.36
5.37 @@ -117,11 +137,14 @@
5.38 else:
5.39 self.append(node)
5.40
5.41 - def append_inline(self, node):
5.42 + def append_point(self):
5.43 +
5.44 + "Return the container to which inline nodes are added."
5.45 +
5.46 if self.transparent:
5.47 - self.nodes[-1].append(node)
5.48 + return self.nodes[-1]
5.49 else:
5.50 - self.append(node)
5.51 + return self
5.52
5.53 def have_end(self, s):
5.54 return self.level and s.startswith("}") and self.level == len(s)
5.55 @@ -453,13 +476,14 @@
5.56
5.57 "Macro details."
5.58
5.59 - def __init__(self, name, args, nodes=None):
5.60 + def __init__(self, name, args, parent, nodes=None):
5.61 Container.__init__(self, nodes or [])
5.62 self.name = name
5.63 + self.parent = parent
5.64 self.args = args
5.65
5.66 def __repr__(self):
5.67 - return "Macro(%r, %r, %r)" % (self.name, self.args, self.nodes)
5.68 + return "Macro(%r, %r, %r, %r)" % (self.name, self.args, self.parent, self.nodes)
5.69
5.70 def prettyprint(self, indent=""):
5.71 l = ["%sMacro: name=%r args=%r" % (indent, self.name, self.args)]
5.72 @@ -549,6 +573,19 @@
5.73 def to_string(self, out):
5.74 out.break_()
5.75
5.76 +class LineBreak(Node):
5.77 +
5.78 + "A line break within a block."
5.79 +
5.80 + def __repr__(self):
5.81 + return "LineBreak()"
5.82 +
5.83 + def prettyprint(self, indent=""):
5.84 + return "%sLineBreak" % indent
5.85 +
5.86 + def to_string(self, out):
5.87 + out.linebreak()
5.88 +
5.89 class Rule(Node):
5.90
5.91 "A horizontal rule."