1.1 --- a/moinformat/parsers/moin.py Fri Jul 13 18:53:55 2018 +0200
1.2 +++ b/moinformat/parsers/moin.py Fri Jul 13 22:58:45 2018 +0200
1.3 @@ -22,9 +22,10 @@
1.4 from moinformat.parsers.common import ParserBase, get_patterns, get_subset
1.5 from moinformat.serialisers import serialise
1.6 from moinformat.tree import Break, DefItem, DefTerm, FontStyle, Heading, \
1.7 - Larger, List, ListItem, Monospace, Region, Rule, \
1.8 - Smaller, Subscript, Superscript, Table, TableAttr, \
1.9 - TableAttrs, TableCell, TableRow, Text, Underline
1.10 + Larger, Link, List, ListItem, Monospace, Region, \
1.11 + Rule, Smaller, Subscript, Superscript, Table, \
1.12 + TableAttr, TableAttrs, TableCell, TableRow, Text, \
1.13 + Underline
1.14
1.15 class MoinParser(ParserBase):
1.16
1.17 @@ -391,6 +392,12 @@
1.18 def parse_larger(self, region):
1.19 self.parse_inline(region, Larger, "larger")
1.20
1.21 + def parse_link(self, region):
1.22 + target = self.read_match(1)
1.23 + text = self.read_match(2)
1.24 + link = Link(text and [Text(text)], target)
1.25 + region.append_inline(link)
1.26 +
1.27 def parse_monospace(self, region):
1.28 self.parse_inline(region, Monospace, "monospace")
1.29
1.30 @@ -472,6 +479,9 @@
1.31 "super" : r"\^",
1.32 "underline" : r"__",
1.33
1.34 + # Complete inline patterns:
1.35 + "link" : r"\[\[(.*?)(?:\|(.*?))?]]", # [[target]] or [[target|text]]
1.36 +
1.37 # Inline contents:
1.38 "largerend" : r"\+~",
1.39 "monospaceend" : r"`",
1.40 @@ -517,7 +527,8 @@
1.41 ]
1.42
1.43 inline_pattern_names = [
1.44 - "fontstyle", "larger", "monospace", "smaller", "sub", "super", "underline",
1.45 + "fontstyle", "larger", "link", "monospace", "smaller", "sub", "super",
1.46 + "underline",
1.47 ]
1.48
1.49 list_pattern_names = [
1.50 @@ -563,6 +574,7 @@
1.51 "headingend" : parse_heading_end,
1.52 "larger" : parse_larger,
1.53 "largerend" : end_region,
1.54 + "link" : parse_link,
1.55 "listitemend" : end_region,
1.56 "listitem" : parse_listitem,
1.57 "listitem_alpha" : parse_listitem,
4.1 --- a/moinformat/tree.py Fri Jul 13 18:53:55 2018 +0200
4.2 +++ b/moinformat/tree.py Fri Jul 13 22:58:45 2018 +0200
4.3 @@ -406,6 +406,29 @@
4.4 self._to_string(out)
4.5 out.end_larger()
4.6
4.7 +class Link(Container):
4.8 +
4.9 + "Link details."
4.10 +
4.11 + def __init__(self, nodes, target):
4.12 + Container.__init__(self, nodes)
4.13 + self.target = target
4.14 +
4.15 + def __repr__(self):
4.16 + return "Link(%r, %r)" % (self.nodes, self.target)
4.17 +
4.18 + def prettyprint(self, indent=""):
4.19 + l = ["%sLink: target=%r" % (indent, self.target)]
4.20 + return self._prettyprint(l, indent)
4.21 +
4.22 + def to_string(self, out):
4.23 + out.start_link(self.target)
4.24 + if self.nodes:
4.25 + out.start_linktext()
4.26 + self._to_string(out)
4.27 + out.end_linktext()
4.28 + out.end_link()
4.29 +
4.30 class Monospace(Inline):
4.31
4.32 "Monospaced text."