changeset 26:8c0536801979

Use re.finditer instead of re.sub
author Radomir Dopieralski <creole@sheep.art.pl>
date Sun, 25 Jul 2010 21:11:12 +0200
parents 1280ae101f2a
children 0d35507ae04e
files creole/parser.py
diffstat 1 files changed, 14 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/creole/parser.py	Sun Jul 25 12:48:21 2010 +0200
+++ b/creole/parser.py	Sun Jul 25 21:11:12 2010 +0200
@@ -54,9 +54,6 @@
             if self.text is None:
                 self.text = DocNode('text', self.cur, u'')
             self.text.content += groups.get('url_target')
-    _url_target_repl = _url_repl
-    _url_proto_repl = _url_repl
-    _escaped_url = _url_repl
 
     def _link_repl(self, groups):
         """Handle all kinds of links."""
@@ -67,11 +64,9 @@
         self.cur = DocNode('link', self.cur)
         self.cur.content = target
         self.text = None
-        re.sub(self.rules.link_re, self._replace, text)
+        self.parse_re(text, self.rules.link_re)
         self.cur = parent
         self.text = None
-    _link_target_repl = _link_repl
-    _link_text_repl = _link_repl
 
     def _wiki_repl(self, groups):
         """Handle WikiWord links, if enabled."""
@@ -91,9 +86,6 @@
         node.args = groups.get('macro_args', '') or ''
         DocNode('text', node, text or name)
         self.text = None
-    _macro_name_repl = _macro_repl
-    _macro_args_repl = _macro_repl
-    _macro_text_repl = _macro_repl
 
     def _image_repl(self, groups):
         """Handles images and attachemnts included in the page."""
@@ -103,8 +95,6 @@
         node = DocNode("image", self.cur, target)
         DocNode('text', node, text or node.content)
         self.text = None
-    _image_target_repl = _image_repl
-    _image_text_repl = _image_repl
 
     def _separator_repl(self, groups):
         self.cur = self._upto(self.cur, ('document', 'section', 'blockquote'))
@@ -136,19 +126,15 @@
         self.cur = DocNode('list_item', self.cur)
         self.parse_inline(text)
         self.text = None
-    _item_text_repl = _item_repl
-    _item_head_repl = _item_repl
 
     def _list_repl(self, groups):
         text = groups.get('list', u'')
-        self.rules.item_re.sub(self._replace, text)
+        self.parse_re(text, self.rules.item_re)
 
     def _head_repl(self, groups):
         self.cur = self._upto(self.cur, ('document', 'section', 'blockquote'))
         node = DocNode('header', self.cur, groups.get('head_text', '').strip())
         node.level = len(groups.get('head_head', ' '))
-    _head_head_repl = _head_repl
-    _head_text_repl = _head_repl
 
     def _text_repl(self, groups):
         text = groups.get('text', '')
@@ -201,9 +187,6 @@
         node = DocNode('preformatted', self.cur, text)
         node.sect = kind or ''
         self.text = None
-    _pre_text_repl = _pre_repl
-    _pre_head_repl = _pre_repl
-    _pre_kind_repl = _pre_repl
 
     def _line_repl(self, groups):
         self.cur = self._upto(self.cur, ('document', 'section', 'blockquote'))
@@ -211,8 +194,6 @@
     def _code_repl(self, groups):
         DocNode('code', self.cur, groups.get('code_text', u'').strip())
         self.text = None
-    _code_text_repl = _code_repl
-    _code_head_repl = _code_repl
 
     def _emph_repl(self, groups):
         if self.cur.kind != 'emphasis':
@@ -242,29 +223,25 @@
             self.text = DocNode('text', self.cur, u'')
         self.text.content += groups.get('char', u'')
 
-    def _replace(self, match):
-        """Invoke appropriate _*_repl method. Called for every matched group."""
-
-        groups = match.groupdict()
-        for name, text in groups.iteritems():
-            if text is not None:
-                replace = getattr(self, '_%s_repl' % name)
-                replace(groups)
-                return
-
     def parse_inline(self, raw):
         """Recognize inline elements inside blocks."""
 
-        re.sub(self.rules.inline_re, self._replace, raw)
+        self.parse_re(raw, self.rules.inline_re)
+
+    def parse_re(self, raw, rules_re):
+        """Parse a fragment according to the compiled rules."""
 
-    def parse_block(self, raw):
-        """Recognize block elements."""
-
-        re.sub(self.rules.block_re, self._replace, raw)
+        for match in rules_re.finditer(raw):
+            groups = dict((k, v) for (k, v)
+                          in match.groupdict().iteritems()
+                          if v is not None)
+            name = match.lastgroup
+            function = getattr(self, '_%s_repl' % name)
+            function(groups)
 
     def parse(self):
         """Parse the text given as self.raw and return DOM tree."""
 
-        self.parse_block(self.raw)
+        self.parse_re(self.raw, self.rules.block_re)
         return self.root