1.1 --- a/moinformat/__init__.py Thu May 04 22:39:00 2017 +0200
1.2 +++ b/moinformat/__init__.py Fri May 05 00:10:27 2017 +0200
1.3 @@ -19,15 +19,13 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from moinformat.parsing import ParserBase, TokenStream, new_block
1.8 +from moinformat.parsing import ParserBase, TokenStream, get_patterns, new_block
1.9 from moinformat.serialisers import serialise
1.10 from moinformat.tree import Break, DefItem, DefTerm, FontStyle, Heading, \
1.11 Larger, ListItem, Monospace, Region, Rule, Smaller, \
1.12 Subscript, Superscript, TableAttr, TableAttrs, \
1.13 TableCell, TableRow, Text, Underline
1.14
1.15 -import re
1.16 -
1.17 # Regular expressions.
1.18
1.19 syntax = {
1.20 @@ -103,23 +101,6 @@
1.21 "attrvalue" : r"""=(?P<x>['"])(.*?)(?P=x)""",
1.22 }
1.23
1.24 -# Define pattern details.
1.25 -
1.26 -table_pattern_names = ["attrname", "colour", "colspan", "halign", "rowspan", "tableattrsend", "valign", "width"]
1.27 -
1.28 -inline_pattern_names = ["fontstyle", "larger", "monospace", "smaller", "sub", "super", "underline"]
1.29 -
1.30 -def inline_patterns_for(name):
1.31 - names = inline_pattern_names[:]
1.32 - names[names.index(name)] = "%send" % name
1.33 - return names
1.34 -
1.35 -# Define patterns for the regular expressions.
1.36 -
1.37 -patterns = {}
1.38 -for name, value in syntax.items():
1.39 - patterns[name] = re.compile(value, re.UNICODE | re.MULTILINE)
1.40 -
1.41
1.42
1.43 class Parser(ParserBase):
1.44 @@ -139,13 +120,37 @@
1.45
1.46 ParserBase.__init__(self, formats)
1.47
1.48 + # Pattern details.
1.49 +
1.50 + patterns = get_patterns(syntax)
1.51 +
1.52 + table_pattern_names = [
1.53 + "attrname", "colour", "colspan", "halign", "rowspan", "tableattrsend",
1.54 + "valign", "width"
1.55 + ]
1.56 +
1.57 + inline_pattern_names = [
1.58 + "fontstyle", "larger", "monospace", "smaller", "sub", "super", "underline",
1.59 + ]
1.60 +
1.61 + region_pattern_names = inline_pattern_names + [
1.62 + "break", "heading", "defterm", "defterm_empty", "listitem",
1.63 + "listitem_alpha", "listitem_dot", "listitem_num", "listitem_roman",
1.64 + "regionstart", "regionend", "rule", "tablerow",
1.65 + ]
1.66 +
1.67 + def inline_patterns_for(self, name):
1.68 + names = self.inline_pattern_names[:]
1.69 + names[names.index(name)] = "%send" % name
1.70 + return names
1.71 +
1.72 + # Principal parser methods.
1.73 +
1.74 def get_items(self, s):
1.75
1.76 "Return a sequence of token items for 's'."
1.77
1.78 - return TokenStream(s, patterns)
1.79 -
1.80 - # Principal parser methods.
1.81 + return TokenStream(s, self.patterns)
1.82
1.83 def parse(self, s):
1.84
1.85 @@ -175,16 +180,7 @@
1.86 "Parse the data provided by 'items' to populate a wiki 'region'."
1.87
1.88 new_block(region)
1.89 -
1.90 - self.parse_region_details(items, region, inline_pattern_names + [
1.91 - "break", "heading",
1.92 - "defterm", "defterm_empty",
1.93 - "listitem", "listitem_alpha", "listitem_dot", "listitem_num",
1.94 - "listitem_roman",
1.95 - "regionstart", "regionend",
1.96 - "rule",
1.97 - "tablerow",
1.98 - ])
1.99 + self.parse_region_details(items, region, self.region_pattern_names)
1.100
1.101 # Parser methods supporting different page features.
1.102
1.103 @@ -274,7 +270,7 @@
1.104
1.105 span = FontStyle([], emphasis, strong)
1.106 if not double:
1.107 - self.parse_region_details(items, span, inline_pattern_names)
1.108 + self.parse_region_details(items, span, self.inline_pattern_names)
1.109 region.append_inline(span)
1.110
1.111 def parse_halign(self, items, attrs):
1.112 @@ -293,7 +289,7 @@
1.113 level = len(items.read_match(2))
1.114 start_pad = items.read_match(3)
1.115 heading = Heading([], level, start_extra, start_pad)
1.116 - self.parse_region_details(items, heading, ["headingend"] + inline_pattern_names)
1.117 + self.parse_region_details(items, heading, ["headingend"] + self.inline_pattern_names)
1.118 region.add(heading)
1.119 new_block(region)
1.120
1.121 @@ -354,7 +350,7 @@
1.122 "Handle the start of table attributes within 'cell'."
1.123
1.124 attrs = TableAttrs([])
1.125 - self.parse_region_details(items, attrs, table_pattern_names)
1.126 + self.parse_region_details(items, attrs, self.table_pattern_names)
1.127
1.128 # Test the validity of the attributes.
1.129
1.130 @@ -444,7 +440,7 @@
1.131 "Handle an inline region."
1.132
1.133 span = cls([])
1.134 - self.parse_region_details(items, span, inline_patterns_for(pattern_name))
1.135 + self.parse_region_details(items, span, self.inline_patterns_for(pattern_name))
1.136 region.append_inline(span)
1.137
1.138 def parse_larger(self, items, region):