# HG changeset patch # User Paul Boddie # Date 1531859933 -7200 # Node ID ab7b40f5af6d47d2badbeb4867fa68a3af463710 # Parent 0402e78f1fa51d5f7aa15a596fd1d299de167b8c Attempt to fix and simplify opaque region handling. diff -r 0402e78f1fa5 -r ab7b40f5af6d moinformat/parsers/common.py --- a/moinformat/parsers/common.py Tue Jul 17 19:21:38 2018 +0200 +++ b/moinformat/parsers/common.py Tue Jul 17 22:38:53 2018 +0200 @@ -300,12 +300,28 @@ self.set_region(items, region) - # Define a block to hold text and start parsing. + # Parse inline and opaque regions. + + if not region.transparent: + pattern_names = ["regionend"] + + # Define a block to hold text. + + else: + self.new_block(region) + pattern_names = self.region_pattern_names - self.new_block(region) + # Start parsing. + + if pattern_names: + self.parse_region_details(region, pattern_names) - if self.region_pattern_names: - self.parse_region_details(region, self.region_pattern_names) + # Reset the type if the region was not inline. + + if region.type == "inline": + first = region.nodes and region.nodes[0] + if first and isinstance(first, Text) and first.multiline(): + region.type = None # Top-level parser handler methods. @@ -331,23 +347,13 @@ Use configured parsers to parse 'region' based on its type. """ - # Handle potentially inline regions. - - if region.type == "inline": - self.parse_region_inline(region) - return - # Find an appropriate parser given the type. parser = self.get_parser(region.type) - - if parser: - parser.parse_region_content(self.items, region) - - # Otherwise, treat the section as opaque. - - else: - self.parse_region_opaque(region) + if not parser: + region.transparent = False + parser = parser or self.get_parser("moin") + parser.parse_region_content(self.items, region) def parse_region_header(self, region): @@ -358,27 +364,6 @@ if self.read_until(["header"], False) == "": # None means no header region.type = self.match_group("args") - def parse_region_opaque(self, region): - - "Parse the data to populate an opaque 'region'." - - region.transparent = False - self.parse_region_details(region, ["regionend"]) - - def parse_region_inline(self, region): - - "Parse the data to populate an inline 'region'." - - region.transparent = False - self.parse_region_details(region, ["regionend"]) - - # Reset the type if the region was not inline. - - if region.type == "inline": - first = region.nodes and region.nodes[0] - if first and isinstance(first, Text) and first.multiline(): - region.type = None - # Parsing utilities. def parse_region_details(self, region, pattern_names, strict=False):