# HG changeset patch # User Paul Boddie # Date 1531657182 -7200 # Node ID d517824d2df556585a60b5eee7b9469aaf0055cf # Parent 7295b36f0b15d8636873b91ad63b56d3069a7e63 Renamed read_matching to matching_pattern, read_match to match_group, and changed match_groups to update the stream position. diff -r 7295b36f0b15 -r d517824d2df5 moinformat/parsers/common.py --- a/moinformat/parsers/common.py Sun Jul 15 14:18:57 2018 +0200 +++ b/moinformat/parsers/common.py Sun Jul 15 14:19:42 2018 +0200 @@ -118,7 +118,7 @@ else: return self.s[self.pos:self.start] - def read_match(self, group=1): + def match_group(self, group=1): """ Return the matched text, updating the position in the stream. If 'group' @@ -127,25 +127,39 @@ within group 1 can provide sections of the data. """ + self.update_pos() + if self.match: - _start, self.pos = self.match.span() try: return self.match.group(group) except IndexError: return "" else: - self.pos = len(self.s) return None - def match_groups(self): + def match_groups(self, groups=None): - "Return the match groups." + "Return the match 'groups', or all groups if unspecified." + + self.update_pos() if self.match: - return self.match.groups() + if groups is None: + return self.match.groups() + else: + return self.match.groups(groups) else: return [] + def update_pos(self): + + "Update the position in the stream." + + if self.match: + _start, self.pos = self.match.span() + else: + self.pos = len(self.s) + # Parser abstractions. @@ -209,15 +223,15 @@ return self.items.read_until(self.get_patterns(pattern_names)) - def read_match(self, group=1): + def match_group(self, group=1): """ Return the group of the matching pattern with the given 'group' number. """ - return self.items.read_match(group) + return self.items.match_group(group) - def read_matching(self): + def matching_pattern(self): "Return the name of the matching pattern." @@ -303,7 +317,7 @@ """ if self.read_until(["header"], False) == "": # None means no header - region.type = self.read_match() + region.type = self.match_group() def parse_region_opaque(self, region): @@ -349,13 +363,13 @@ # End of input. - if not self.read_matching(): + if not self.matching_pattern(): break # Obtain any feature. - feature = self.read_match() - handler = self.handlers.get(self.read_matching()) + feature = self.match_group() + handler = self.handlers.get(self.matching_pattern()) # Handle each feature or add text to the region. diff -r 7295b36f0b15 -r d517824d2df5 moinformat/parsers/moin.py --- a/moinformat/parsers/moin.py Sun Jul 15 14:18:57 2018 +0200 +++ b/moinformat/parsers/moin.py Sun Jul 15 14:19:42 2018 +0200 @@ -82,13 +82,13 @@ "Handle an attribute name within 'attrs'." - name = self.read_match() + name = self.match_group() attr = TableAttr(name) preceding = self.read_until(["attrvalue"], False) if preceding == "": - attr.quote = self.read_match(1) - attr.value = self.read_match(2) + attr.quote = self.match_group(1) + attr.value = self.match_group(2) attrs.append(attr) @@ -103,7 +103,7 @@ "Handle a definition item within 'region'." - pad = self.read_match(1) + pad = self.match_group(1) item = DefItem([], pad, extra) self.parse_region_details(item, ["listitemend"]) self.add_node(region, item) @@ -113,18 +113,18 @@ "Handle a definition term within 'region'." - pad = self.read_match(1) + pad = self.match_group(1) term = DefTerm([], pad) self.parse_region_details(term, ["deftermend", "deftermsep"]) self.add_node(region, term) - if self.read_matching() == "deftermsep": + if self.matching_pattern() == "deftermsep": self.parse_defitem(region) def parse_defterm_empty(self, region): "Handle an empty definition term within 'region'." - extra = self.read_match(1) + extra = self.match_group(1) self.parse_region_details(region, ["deftermsep"]) self.parse_defitem(region, extra) @@ -132,7 +132,7 @@ "Handle emphasis and strong styles." - n = len(self.read_match(1)) + n = len(self.match_group(1)) # Handle endings. @@ -171,7 +171,7 @@ "Handle horizontal alignment within 'attrs'." - value = self.read_match() + value = self.match_group() attr = TableAttr("halign", value == "(" and "left" or value == ")" and "right" or "center", True) attrs.append(attr) @@ -179,9 +179,9 @@ "Handle a heading." - start_extra = self.read_match(1) - level = len(self.read_match(2)) - start_pad = self.read_match(3) + start_extra = self.match_group(1) + level = len(self.match_group(2)) + start_pad = self.match_group(3) heading = Heading([], level, start_extra, start_pad) self.parse_region_details(heading, ["headingend"] + self.inline_pattern_names) self.add_node(region, heading) @@ -191,10 +191,10 @@ "Handle the end of a heading." - level = len(self.read_match(2)) + level = len(self.match_group(2)) if heading.level == level: - heading.end_pad = self.read_match(1) - heading.end_extra = self.read_match(3) + heading.end_pad = self.match_group(1) + heading.end_extra = self.match_group(3) raise StopIteration def parse_list(self, item): @@ -211,12 +211,12 @@ final = len(self.match_groups()) - indent = len(self.read_match(1)) - marker = self.read_match(2) - space = self.read_match(final) + indent = len(self.match_group(1)) + marker = self.match_group(2) + space = self.match_group(final) if final > 3: - num = self.read_match(3) + num = self.match_group(3) else: num = None @@ -265,7 +265,7 @@ "Handle a horizontal rule within 'region'." - length = len(self.read_match(1)) + length = len(self.match_group(1)) rule = Rule(length) self.add_node(region, rule) self.new_block(region) @@ -276,8 +276,8 @@ # Parse the section and start a new block after the section. - indent = len(self.read_match(2)) - level = len(self.read_match(3)) + indent = len(self.match_group(2)) + level = len(self.match_group(3)) self.add_node(region, self.parse_region(level, indent, "inline")) self.new_block(region) @@ -285,7 +285,7 @@ "Handle the end of a new section within 'region'." - feature = self.read_match() + feature = self.match_group() if region.have_end(feature): raise StopIteration else: @@ -349,8 +349,8 @@ # Handle the end of the row. - if self.read_matching() == "tableend": - trailing = self.read_match() + if self.matching_pattern() == "tableend": + trailing = self.match_group() # If the cell was started but not finished, convert the row into text. @@ -388,7 +388,7 @@ "Handle vertical alignment within 'attrs'." - value = self.read_match() + value = self.match_group() attr = TableAttr("valign", value == "^" and "top" or "bottom", True) attrs.append(attr) @@ -408,8 +408,8 @@ self.parse_inline(region, Larger, "larger") def parse_link(self, region): - target = self.read_match(1) - text = self.read_match(2) + target = self.match_group(1) + text = self.match_group(2) link = Link(text and [Text(text)], target) region.append_inline(link) @@ -439,7 +439,7 @@ "Handle a table attribute." - attrs.append(TableAttr(pattern_name, self.read_match(), True)) + attrs.append(TableAttr(pattern_name, self.match_group(), True)) def parse_colour(self, cell): self.parse_table_attr(cell, "colour") diff -r 7295b36f0b15 -r d517824d2df5 moinformat/parsers/table.py --- a/moinformat/parsers/table.py Sun Jul 15 14:18:57 2018 +0200 +++ b/moinformat/parsers/table.py Sun Jul 15 14:19:42 2018 +0200 @@ -3,7 +3,7 @@ """ Moin wiki table parser. -Copyright (C) 2017 Paul Boddie +Copyright (C) 2017, 2018 Paul Boddie This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -54,14 +54,16 @@ # Detect the end of the table. - if self.read_matching() == "regionend": + pattern = self.matching_pattern() + + if pattern == "regionend": break - if self.read_matching() == "columnsep": + elif pattern == "columnsep": cell = TableCell([]) row.append(cell) - elif self.read_matching() == "rowsep": + elif pattern == "rowsep": row = TableRow([]) table.append(row) cell = TableCell([]) @@ -76,7 +78,7 @@ "Handle the end of a region within 'cell'." - feature = self.read_match() + feature = self.match_group() if self.region.have_end(feature): raise StopIteration else: