# HG changeset patch # User Paul Boddie # Date 1493674591 -7200 # Node ID 3630b0946d2fb4f779449202c70ff7310dca3e67 # Parent 0cf4cde9abfe468cbb00934b7a748048941b651a Added larger and smaller text formatting. Simplified inline pattern handling and document nodes somewhat. diff -r 0cf4cde9abfe -r 3630b0946d2f moinformat/__init__.py --- a/moinformat/__init__.py Mon May 01 22:51:12 2017 +0200 +++ b/moinformat/__init__.py Mon May 01 23:36:31 2017 +0200 @@ -20,8 +20,8 @@ """ from moinformat.tree import Block, Break, DefItem, DefTerm, FontStyle, Heading, \ - ListItem, Monospace, Region, Rule, Subscript, \ - Superscript, Text, Underline + Larger, ListItem, Monospace, Region, Rule, Smaller, \ + Subscript, Superscript, Text, Underline import re # Regular expressions. @@ -56,14 +56,18 @@ # Region contents: # Inline patterns: "fontstyle" : r"('{2,6})", + "larger" : r"~\+", "monospace" : r"`", "rule" : r"(-----*)", # ----... + "smaller" : r"~-", "sub" : r",,", "super" : r"\^", "underline" : r"__", # Inline contents: + "largerend" : r"\+~", "monospaceend" : r"`", + "smallerend" : r"-~", "subend" : r",,", "superend" : r"\^", "underlineend" : r"__", @@ -77,19 +81,21 @@ "listitemend" : r"^", # next line } +# Define inline pattern details. + +inline_pattern_names = ["fontstyle", "larger", "monospace", "smaller", "sub", "super", "underline"] + +def inline_patterns_for(name): + names = inline_pattern_names[:] + names[names.index(name)] = "%send" % name + return names + # Define patterns for the regular expressions. patterns = {} for name, value in syntax.items(): patterns[name] = re.compile(value, re.UNICODE | re.MULTILINE) -inline_pattern_names = ["fontstyle", "monospace", "sub", "super", "underline"] - -def inline_patterns_for(name): - names = inline_pattern_names[:] - names[names.index(name)] = "%send" % name - return names - # Tokenising functions. @@ -372,14 +378,6 @@ region.add(item) new_block(region) -def parse_monospace(items, region): - - "Handle monospace." - - span = Monospace([]) - parse_region_details(items, span, inline_patterns_for("monospace")) - region.append_inline(span) - def parse_rule(items, region): "Handle a horizontal rule within 'region'." @@ -410,29 +408,22 @@ else: region.append_inline(Text(feature)) -def parse_sub(items, region): +# Inline formatting handlers. + +def parse_inline(items, region, cls, pattern_name): - "Handle subscript." + "Handle an inline region." - span = Subscript([]) - parse_region_details(items, span, inline_patterns_for("sub")) + span = cls([]) + parse_region_details(items, span, inline_patterns_for(pattern_name)) region.append_inline(span) -def parse_super(items, region): - - "Handle superscript." - - span = Superscript([]) - parse_region_details(items, span, inline_patterns_for("super")) - region.append_inline(span) - -def parse_underline(items, region): - - "Handle underline." - - span = Underline([]) - parse_region_details(items, span, inline_patterns_for("underline")) - region.append_inline(span) +parse_larger = lambda items, region: parse_inline(items, region, Larger, "larger") +parse_monospace = lambda items, region: parse_inline(items, region, Monospace, "monospace") +parse_smaller = lambda items, region: parse_inline(items, region, Smaller, "smaller") +parse_sub = lambda items, region: parse_inline(items, region, Subscript, "sub") +parse_super = lambda items, region: parse_inline(items, region, Superscript, "super") +parse_underline = lambda items, region: parse_inline(items, region, Underline, "underline") # Pattern handlers. @@ -446,6 +437,8 @@ "fontstyle" : parse_fontstyle, "heading" : parse_heading, "headingend" : parse_heading_end, + "larger" : parse_larger, + "largerend" : end_region, "listitemend" : end_region, "listitem" : parse_listitem, "listitem_alpha" : parse_listitem, @@ -457,6 +450,8 @@ "regionstart" : parse_section, "regionend" : parse_section_end, "rule" : parse_rule, + "smaller" : parse_smaller, + "smallerend" : end_region, "sub" : parse_sub, "subend" : end_region, "super" : parse_super, diff -r 0cf4cde9abfe -r 3630b0946d2f moinformat/serialisers.py --- a/moinformat/serialisers.py Mon May 01 22:51:12 2017 +0200 +++ b/moinformat/serialisers.py Mon May 01 23:36:31 2017 +0200 @@ -74,6 +74,12 @@ def end_heading(self, level, pad, extra): self.out(pad + "=" * level + extra) + def start_larger(self): + self.out("~+") + + def end_larger(self): + self.out("+~") + def start_listitem(self, indent, marker, space): self.out("%s%s%s" % (indent * " ", marker, space)) @@ -86,6 +92,12 @@ def end_monospace(self): self.out("`") + def start_smaller(self): + self.out("~-") + + def end_smaller(self): + self.out("-~") + def start_strong(self): self.out("'''") @@ -172,6 +184,12 @@ def end_heading(self, level, pad, extra): self.out("" % level) + def start_larger(self): + self.out("") + + def end_larger(self): + self.out("") + def start_listitem(self, indent, marker, space): self.out("
  • ") @@ -184,6 +202,12 @@ def end_monospace(self): self.out("") + def start_smaller(self): + self.out("") + + def end_smaller(self): + self.out("") + def start_strong(self): self.out("") diff -r 0cf4cde9abfe -r 3630b0946d2f moinformat/tree.py --- a/moinformat/tree.py Mon May 01 22:51:12 2017 +0200 +++ b/moinformat/tree.py Mon May 01 23:36:31 2017 +0200 @@ -276,65 +276,68 @@ self._to_string(out) out.end_listitem(self.indent, self.marker) -class Monospace(Container): + - "Monospaced text." +class Inline(Container): + + "Generic inline formatting." def __repr__(self): - return "Monospace(%r)" % self.nodes + return "%s(%r)" % (self.__class__.__name__, self.nodes) def prettyprint(self, indent=""): - l = ["%sMonospace" % indent] + l = ["%s%s" % (indent, self.__class__.__name__)] return self._prettyprint(l, indent) +class Larger(Inline): + + "Larger text." + + def to_string(self, out): + out.start_larger() + self._to_string(out) + out.end_larger() + +class Monospace(Inline): + + "Monospaced text." + def to_string(self, out): out.start_monospace() self._to_string(out) out.end_monospace() -class Subscript(Container): +class Smaller(Inline): + + "Smaller text." + + def to_string(self, out): + out.start_smaller() + self._to_string(out) + out.end_smaller() + +class Subscript(Inline): "Subscripted text." - def __repr__(self): - return "Subscript(%r)" % self.nodes - - def prettyprint(self, indent=""): - l = ["%sSubscript" % indent] - return self._prettyprint(l, indent) - def to_string(self, out): out.start_subscript() self._to_string(out) out.end_subscript() -class Superscript(Container): +class Superscript(Inline): "Superscripted text." - def __repr__(self): - return "Superscript(%r)" % self.nodes - - def prettyprint(self, indent=""): - l = ["%sSuperscript" % indent] - return self._prettyprint(l, indent) - def to_string(self, out): out.start_superscript() self._to_string(out) out.end_superscript() -class Underline(Container): +class Underline(Inline): "Underlined text." - def __repr__(self): - return "Underline(%r)" % self.nodes - - def prettyprint(self, indent=""): - l = ["%sUnderline" % indent] - return self._prettyprint(l, indent) - def to_string(self, out): out.start_underline() self._to_string(out) diff -r 0cf4cde9abfe -r 3630b0946d2f tests/test_parser.py --- a/tests/test_parser.py Mon May 01 22:51:12 2017 +0200 +++ b/tests/test_parser.py Mon May 01 23:36:31 2017 +0200 @@ -107,6 +107,8 @@ H,,2,,O + CO,,2,, == e = mc^2^ == + +~+Larger...+~ and ~-smaller-~ """) dl = map(parse, sl)