1.1 --- a/moinformat/parsers/moin.py Mon Jul 23 16:03:34 2018 +0200
1.2 +++ b/moinformat/parsers/moin.py Mon Jul 23 23:50:04 2018 +0200
1.3 @@ -23,8 +23,8 @@
1.4 excl, expect, group, optional, recur, repeat
1.5 from moinformat.serialisers import serialise
1.6 from moinformat.tree import Break, DefItem, DefTerm, FontStyle, Heading, \
1.7 - Larger, Link, List, ListItem, Monospace, Region, \
1.8 - Rule, Smaller, Strikethrough, Subscript, \
1.9 + Larger, Link, List, ListItem, Macro, Monospace, \
1.10 + Region, Rule, Smaller, Strikethrough, Subscript, \
1.11 Superscript, Table, TableAttr, TableAttrs, \
1.12 TableCell, TableRow, Text, Underline
1.13
1.14 @@ -421,12 +421,6 @@
1.15 def parse_larger(self, region):
1.16 self.parse_inline(region, Larger, "larger")
1.17
1.18 - def parse_link(self, region):
1.19 - target = self.match_group("target")
1.20 - text = self.match_group("text")
1.21 - link = Link(text and [Text(text)], target)
1.22 - region.append_inline(link)
1.23 -
1.24 def parse_monospace(self, region):
1.25 span = Monospace([])
1.26 self.parse_region_details(span, ["monospaceend"])
1.27 @@ -449,6 +443,27 @@
1.28
1.29
1.30
1.31 + # Complete inline pattern handlers.
1.32 +
1.33 + def parse_link(self, region):
1.34 + target = self.match_group("target")
1.35 + text = self.match_group("text")
1.36 + link = Link(text and [Text(text)], target)
1.37 + region.append_inline(link)
1.38 +
1.39 + def parse_macro(self, region):
1.40 + name = self.match_group("name")
1.41 + args = self.match_group("args")
1.42 +
1.43 + # Obtain the raw arguments. Moin usually leaves it to the macro to
1.44 + # interpret the individual arguments.
1.45 +
1.46 + arglist = args and args.split(",") or []
1.47 + macro = Macro(name, arglist)
1.48 + region.append_inline(macro)
1.49 +
1.50 +
1.51 +
1.52 # Table attribute handlers.
1.53
1.54 def parse_table_attr(self, attrs, pattern_name):
1.55 @@ -566,6 +581,13 @@
1.56 optional(join((r"\|", group("text", ".*?")))), # | text (optional)
1.57 "]]")), # ]]
1.58
1.59 + "macro" : join(("<<", # <<
1.60 + group("name", "\w+?"), # digit-letter...
1.61 + optional(join((r"\(", # ( (optional)
1.62 + group("args", ".*?"), # not-)...
1.63 + r"\)"))), # ) (optional)
1.64 + ">>")), # >>
1.65 +
1.66 # Ending patterns for inline features:
1.67
1.68 "largerend" : r"\+~", # +~
1.69 @@ -637,8 +659,8 @@
1.70 ]
1.71
1.72 inline_pattern_names = [
1.73 - "fontstyle", "larger", "link", "monospace", "regionstart", "smaller",
1.74 - "strike", "sub", "super", "underline",
1.75 + "fontstyle", "larger", "link", "macro", "monospace", "regionstart",
1.76 + "smaller", "strike", "sub", "super", "underline",
1.77 ]
1.78
1.79 list_pattern_names = [
1.80 @@ -687,6 +709,7 @@
1.81 "larger" : parse_larger,
1.82 "largerend" : end_region,
1.83 "link" : parse_link,
1.84 + "macro" : parse_macro,
1.85 "listitemend" : end_region,
1.86 "listitem" : parse_listitem,
1.87 "listitem_alpha" : parse_listitem,