# HG changeset patch # User Paul Boddie # Date 1532382604 -7200 # Node ID d1ff325fc3f97bac69ba25095c1497337571677b # Parent 04558a6a6219ce9028c89d848add6aac05aef23f Added initial support for macro elements. diff -r 04558a6a6219 -r d1ff325fc3f9 moinformat/parsers/moin.py --- a/moinformat/parsers/moin.py Mon Jul 23 16:03:34 2018 +0200 +++ b/moinformat/parsers/moin.py Mon Jul 23 23:50:04 2018 +0200 @@ -23,8 +23,8 @@ excl, expect, group, optional, recur, repeat from moinformat.serialisers import serialise from moinformat.tree import Break, DefItem, DefTerm, FontStyle, Heading, \ - Larger, Link, List, ListItem, Monospace, Region, \ - Rule, Smaller, Strikethrough, Subscript, \ + Larger, Link, List, ListItem, Macro, Monospace, \ + Region, Rule, Smaller, Strikethrough, Subscript, \ Superscript, Table, TableAttr, TableAttrs, \ TableCell, TableRow, Text, Underline @@ -421,12 +421,6 @@ def parse_larger(self, region): self.parse_inline(region, Larger, "larger") - def parse_link(self, region): - target = self.match_group("target") - text = self.match_group("text") - link = Link(text and [Text(text)], target) - region.append_inline(link) - def parse_monospace(self, region): span = Monospace([]) self.parse_region_details(span, ["monospaceend"]) @@ -449,6 +443,27 @@ + # Complete inline pattern handlers. + + def parse_link(self, region): + target = self.match_group("target") + text = self.match_group("text") + link = Link(text and [Text(text)], target) + region.append_inline(link) + + def parse_macro(self, region): + name = self.match_group("name") + args = self.match_group("args") + + # Obtain the raw arguments. Moin usually leaves it to the macro to + # interpret the individual arguments. + + arglist = args and args.split(",") or [] + macro = Macro(name, arglist) + region.append_inline(macro) + + + # Table attribute handlers. def parse_table_attr(self, attrs, pattern_name): @@ -566,6 +581,13 @@ optional(join((r"\|", group("text", ".*?")))), # | text (optional) "]]")), # ]] + "macro" : join(("<<", # << + group("name", "\w+?"), # digit-letter... + optional(join((r"\(", # ( (optional) + group("args", ".*?"), # not-)... + r"\)"))), # ) (optional) + ">>")), # >> + # Ending patterns for inline features: "largerend" : r"\+~", # +~ @@ -637,8 +659,8 @@ ] inline_pattern_names = [ - "fontstyle", "larger", "link", "monospace", "regionstart", "smaller", - "strike", "sub", "super", "underline", + "fontstyle", "larger", "link", "macro", "monospace", "regionstart", + "smaller", "strike", "sub", "super", "underline", ] list_pattern_names = [ @@ -687,6 +709,7 @@ "larger" : parse_larger, "largerend" : end_region, "link" : parse_link, + "macro" : parse_macro, "listitemend" : end_region, "listitem" : parse_listitem, "listitem_alpha" : parse_listitem, diff -r 04558a6a6219 -r d1ff325fc3f9 moinformat/serialisers/html.py --- a/moinformat/serialisers/html.py Mon Jul 23 16:03:34 2018 +0200 +++ b/moinformat/serialisers/html.py Mon Jul 23 23:50:04 2018 +0200 @@ -214,6 +214,32 @@ def continuation(self, text): pass + def macro(self, name, args): + + # NOTE: Special case. + + if name == "BR": + self.out("
") + return + + # Fallback case. + + self.out("") + self.out(escape_text("<<")) + self.out("%s" % escape_text(name)) + if args: + self.out("(") + first = True + for arg in args: + if not first: + self.out(",") + self.out("%s" % escape_text(arg)) + first = False + if args: + self.out(")") + self.out(escape_text(">>")) + self.out("") + def rule(self, length): self.out("
" % min(length, 10)) diff -r 04558a6a6219 -r d1ff325fc3f9 moinformat/serialisers/moin.py --- a/moinformat/serialisers/moin.py Mon Jul 23 16:03:34 2018 +0200 +++ b/moinformat/serialisers/moin.py Mon Jul 23 23:50:04 2018 +0200 @@ -175,6 +175,9 @@ def continuation(self, text): self.out(text) + def macro(self, name, args): + self.out("<<%s%s>>" % (name, args and "(%s)" % ",".join(args) or "")) + def rule(self, length): self.out("-" * length) diff -r 04558a6a6219 -r d1ff325fc3f9 moinformat/tree.py --- a/moinformat/tree.py Mon Jul 23 16:03:34 2018 +0200 +++ b/moinformat/tree.py Mon Jul 23 23:50:04 2018 +0200 @@ -402,7 +402,7 @@ -# Inline nodes. +# Inline nodes with children. class Inline(Container): @@ -541,6 +541,23 @@ def to_string(self, out): out.continuation(self.text) +class Macro(Node): + + "Macro details." + + def __init__(self, name, args): + self.name = name + self.args = args + + def __repr__(self): + return "Macro(%r, %r)" % (self.name, self.args) + + def prettyprint(self, indent=""): + return "%sMacro: name=%r args=%r" % (indent, self.name, self.args) + + def to_string(self, out): + out.macro(self.name, self.args) + class Rule(Node): "A horizontal rule."