1.1 --- a/moinformat/__init__.py Sun Apr 30 23:15:22 2017 +0200
1.2 +++ b/moinformat/__init__.py Mon May 01 00:29:59 2017 +0200
1.3 @@ -19,7 +19,8 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from moinformat.tree import Block, Break, DefItem, DefTerm, Heading, ListItem, Region, Rule, Text
1.8 +from moinformat.tree import Block, Break, DefItem, DefTerm, Emphasis, Heading, \
1.9 + ListItem, Region, Rule, Strong, Text
1.10 import re
1.11
1.12 # Regular expressions.
1.13 @@ -53,7 +54,13 @@
1.14
1.15 # Region contents:
1.16 # Inline patterns:
1.17 + "em" : r"''(?!')", # '' expecting not '
1.18 "rule" : r"(-----*)", # ----...
1.19 + "strong" : r"'''", # '''
1.20 +
1.21 + # Inline contents:
1.22 + "emend" : r"''(?!')|''(?='')",
1.23 + "strongend" : r"'''",
1.24
1.25 # Heading contents:
1.26 "headingend" : r"(\s+)(=+)(\s*\n)", # ws... =... [ws...] nl
1.27 @@ -184,9 +191,12 @@
1.28 parse_region_details(items, region, [
1.29 "break", "heading",
1.30 "defterm", "defterm_empty",
1.31 + "em",
1.32 "listitem", "listitem_alpha", "listitem_dot", "listitem_num",
1.33 "listitem_roman",
1.34 - "regionstart", "regionend", "rule"])
1.35 + "regionstart", "regionend",
1.36 + "rule",
1.37 + "strong"])
1.38
1.39 def parse_region_opaque(items, region):
1.40
1.41 @@ -205,7 +215,7 @@
1.42
1.43 preceding = items.read_until(pattern_names)
1.44 if preceding:
1.45 - region.append_text(Text(preceding))
1.46 + region.append_inline(Text(preceding))
1.47
1.48 # End of input.
1.49
1.50 @@ -222,7 +232,7 @@
1.51 if handler:
1.52 handler(items, region)
1.53 else:
1.54 - region.append_text(Text(feature))
1.55 + region.append_inline(Text(feature))
1.56
1.57 except StopIteration:
1.58 pass
1.59 @@ -271,8 +281,13 @@
1.60 parse_region_details(items, region, ["deftermsep"])
1.61 parse_defitem(items, region, extra)
1.62
1.63 -parse_defterm_end = end_region
1.64 -parse_defterm_sep = end_region
1.65 +def parse_em(items, region):
1.66 +
1.67 + "Handle emphasis."
1.68 +
1.69 + span = Emphasis([])
1.70 + parse_region_details(items, span, ["emend", "strong"])
1.71 + region.append_inline(span)
1.72
1.73 def parse_heading(items, region):
1.74
1.75 @@ -308,8 +323,6 @@
1.76 region.append(item)
1.77 new_block(region)
1.78
1.79 -parse_listitem_end = end_region
1.80 -
1.81 def parse_rule(items, region):
1.82
1.83 "Handle a horizontal rule within 'region'."
1.84 @@ -338,7 +351,15 @@
1.85 if region.have_end(feature):
1.86 raise StopIteration
1.87 else:
1.88 - region.append_text(Text(feature))
1.89 + region.append_inline(Text(feature))
1.90 +
1.91 +def parse_strong(items, region):
1.92 +
1.93 + "Handle emboldened text."
1.94 +
1.95 + span = Strong([])
1.96 + parse_region_details(items, span, ["em", "strongend"])
1.97 + region.append_inline(span)
1.98
1.99 # Pattern handlers.
1.100
1.101 @@ -347,11 +368,13 @@
1.102 "break" : parse_break,
1.103 "defterm" : parse_defterm,
1.104 "defterm_empty" : parse_defterm_empty,
1.105 - "deftermend" : parse_defterm_end,
1.106 - "deftermsep" : parse_defterm_sep,
1.107 + "deftermend" : end_region,
1.108 + "deftermsep" : end_region,
1.109 + "em" : parse_em,
1.110 + "emend" : end_region,
1.111 "heading" : parse_heading,
1.112 "headingend" : parse_heading_end,
1.113 - "listitemend" : parse_listitem_end,
1.114 + "listitemend" : end_region,
1.115 "listitem" : parse_listitem,
1.116 "listitem_alpha" : parse_listitem,
1.117 "listitem_dot" : parse_listitem,
1.118 @@ -360,6 +383,8 @@
1.119 "regionstart" : parse_section,
1.120 "regionend" : parse_section_end,
1.121 "rule" : parse_rule,
1.122 + "strong" : parse_strong,
1.123 + "strongend" : end_region,
1.124 }
1.125
1.126 def new_block(region):
2.1 --- a/moinformat/serialisers.py Sun Apr 30 23:15:22 2017 +0200
2.2 +++ b/moinformat/serialisers.py Mon May 01 00:29:59 2017 +0200
2.3 @@ -62,6 +62,12 @@
2.4 def end_defterm(self, pad):
2.5 self.out("::")
2.6
2.7 + def start_emphasis(self):
2.8 + self.out("''")
2.9 +
2.10 + def end_emphasis(self):
2.11 + self.out("''")
2.12 +
2.13 def start_heading(self, level, extra, pad):
2.14 self.out(extra + "=" * level + pad)
2.15
2.16 @@ -74,6 +80,12 @@
2.17 def end_listitem(self, indent, marker):
2.18 pass
2.19
2.20 + def start_strong(self):
2.21 + self.out("'''")
2.22 +
2.23 + def end_strong(self):
2.24 + self.out("'''")
2.25 +
2.26 def break_(self):
2.27 self.out("\n")
2.28
2.29 @@ -124,6 +136,12 @@
2.30 def end_defterm(self, pad):
2.31 self.out("</dt>")
2.32
2.33 + def start_emphasis(self):
2.34 + self.out("<em>")
2.35 +
2.36 + def end_emphasis(self):
2.37 + self.out("</em>")
2.38 +
2.39 def start_heading(self, level, extra, pad):
2.40 self.out("<h%d>" % level)
2.41
2.42 @@ -136,6 +154,12 @@
2.43 def end_listitem(self, indent, marker):
2.44 self.out("</li>")
2.45
2.46 + def start_strong(self):
2.47 + self.out("<strong>")
2.48 +
2.49 + def end_strong(self):
2.50 + self.out("</strong>")
2.51 +
2.52 def break_(self):
2.53 pass
2.54
3.1 --- a/moinformat/tree.py Sun Apr 30 23:15:22 2017 +0200
3.2 +++ b/moinformat/tree.py Mon May 01 00:29:59 2017 +0200
3.3 @@ -31,7 +31,7 @@
3.4
3.5 add = append
3.6
3.7 - append_text = append
3.8 + append_inline = append
3.9
3.10 def empty(self):
3.11 return not self.nodes
3.12 @@ -104,7 +104,7 @@
3.13 else:
3.14 self.nodes.append(node)
3.15
3.16 - def append_text(self, s):
3.17 + def append_inline(self, s):
3.18 if self.is_transparent():
3.19 self.nodes[-1].append(s)
3.20 else:
3.21 @@ -128,6 +128,8 @@
3.22 self._to_string(out)
3.23 out.end_region(self.level, self.indent, self.type)
3.24
3.25 +
3.26 +
3.27 class Block(Container):
3.28
3.29 "A block in the page."
3.30 @@ -185,6 +187,22 @@
3.31 self._to_string(out)
3.32 out.end_defterm(self.pad)
3.33
3.34 +class Emphasis(Container):
3.35 +
3.36 + "Emphasised text."
3.37 +
3.38 + def __repr__(self):
3.39 + return "Emphasis(%r)" % self.nodes
3.40 +
3.41 + def prettyprint(self, indent=""):
3.42 + l = ["%sEmphasis" % indent]
3.43 + return self._prettyprint(l, indent)
3.44 +
3.45 + def to_string(self, out):
3.46 + out.start_emphasis()
3.47 + self._to_string(out)
3.48 + out.end_emphasis()
3.49 +
3.50 class Heading(Container):
3.51
3.52 "A heading."
3.53 @@ -233,6 +251,22 @@
3.54 self._to_string(out)
3.55 out.end_listitem(self.indent, self.marker)
3.56
3.57 +class Strong(Container):
3.58 +
3.59 + "Emboldened text."
3.60 +
3.61 + def __repr__(self):
3.62 + return "Strong(%r)" % self.nodes
3.63 +
3.64 + def prettyprint(self, indent=""):
3.65 + l = ["%sStrong" % indent]
3.66 + return self._prettyprint(l, indent)
3.67 +
3.68 + def to_string(self, out):
3.69 + out.start_strong()
3.70 + self._to_string(out)
3.71 + out.end_strong()
3.72 +
3.73
3.74
3.75 class Node: