changeset 22:173702c38d36

move link rules out of the html emitter
author Radomir Dopieralski <creole@sheep.art.pl>
date Tue, 01 Jun 2010 22:12:46 +0200
parents cb1ca7fd2f76
children 2347b60b96ea
files creole/html_emitter.py creole/rules.py
diffstat 2 files changed, 161 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/creole/html_emitter.py	Tue Jun 01 21:59:03 2010 +0200
+++ b/creole/html_emitter.py	Tue Jun 01 22:12:46 2010 +0200
@@ -1,20 +1,149 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+ur"""
+WikiCreole to HTML converter
+This program is an example of how the creole.py WikiCreole parser
+can be used.
+
+@copyright: 2007 MoinMoin:RadomirDopieralski
+@license: BSD, see COPYING for details.
+
+Test cases contributed by Jan Klopper (janklopper@underdark.nl),
+modified by Radomir Dopieralski (MoinMoin:RadomirDopieralski).
+
+>>> import lxml.html.usedoctest
+>>> import creole
+>>> def parse(text):
+...     print HtmlEmitter(creole.Parser(text).parse()).emit()
+>>> def wiki_parse(text):
+...     rules = creole.Rules(wiki_words=True)
+...     print HtmlEmitter(creole.Parser(text, rules).parse()).emit()
+
+>>> parse(u'test')
+<p>test</p>
+
+>>> parse(u'test\ntest')
+<p>test test</p>
+
+>>> HtmlEmitter(Parser(u'test\ntest').parse()).emit()
+u'<p>test test</p>\n'
+
+>>> parse(u'test\n\ntest')
+<p>test</p><p>test</p>
+
+>>> parse(u'test\\\\test')
+<p>test<br>test</p>
+
+>>> parse(u'ÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿŒœ%0A')
+<p>ÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿŒœ%0A</p>
+
+>>> parse(u'----')
+<hr>
+
+>>> parse(u'==test==')
+<h2>test</h2>
+
+>>> parse(u'== test')
+<h2>test</h2>
+
+>>> parse(u'==test====')
+<h2>test</h2>
+
+>>> parse(u'=====test')
+<h5>test</h5>
+
+>>> parse(u'==test==\ntest\n===test===')
+<h2>test</h2>
+<p>test</p>
+<h3>test</h3>
+
+>>> parse(u'test\n* test line one\n * test line two\ntest\n\ntest')
+<p>test</p>
+<ul>
+    <li>test line one</li>
+    <li>test line two test</li>
+</ul>
+<p>test</p>
+
+>>> parse(u'* test line one\n* test line two\n** Nested item')
+<ul>
+    <li>test line one</li>
+    <li>test line two<ul>
+        <li>Nested item</li>
+    </ul></li>
+</ul>
+
+>>> parse(u'* test line one\n* test line two\n# Nested item')
+<ul>
+    <li>test line one</li>
+    <li>test line two<ol>
+        <li>Nested item</li>
+    </ol></li>
+</ul>
+
+>>> parse(u'test //test test// test **test test** test')
+<p>test <i>test test</i> test <b>test test</b> test</p>
+
+>>> parse(u'test //test **test// test** test')
+<p>test <i>test <b>test<i> test<b> test</b></i></b></i></p>
+
+>>> parse(u'**test')
+<p><b>test</b></p>
+
+>>> parse(u'|x|y|z|\n|a|b|c|\n|d|e|f|\ntest')
+<table>
+    <tr><td>x</td><td>y</td><td>z</td></tr>
+    <tr><td>a</td><td>b</td><td>c</td></tr>
+    <tr><td>d</td><td>e</td><td>f</td></tr>
+</table>
+<p>test</p>
+
+>>> parse(u'|=x|y|=z=|\n|a|b|c|\n|d|e|f|')
+<table>
+    <tr><th>x</th><td>y</td><th>z</th></tr>
+    <tr><td>a</td><td>b</td><td>c</td></tr>
+    <tr><td>d</td><td>e</td><td>f</td></tr>
+</table>
+
+>>> parse(u'test http://example.com/test test')
+<p>test <a href="http://example.com/test">http://example.com/test</a> test</p>
+
+>>> parse(u'http://example.com/,test, test')
+<p><a href="http://example.com/,test">http://example.com/,test</a>, test</p>
+
+>>> parse(u'(http://example.com/test)')
+<p>(<a href="http://example.com/test">http://example.com/test</a>)</p>
+
+XXX This might be considered a bug, but it's impossible to detect in general.
+>>> parse(u'http://example.com/(test)')
+<p><a href="http://example.com/(test">http://example.com/(test</a>)</p>
+
+>>> parse(u'http://example.com/test?test&test=1')
+<p><a href="http://example.com/test?test&amp;test=1">http://example.com/test?test&amp;test=1</a></p>
+
+>>> parse(u'~http://example.com/test')
+<p>http://example.com/test</p>
+
+>>> parse(u'http://example.com/~test')
+<p><a href="http://example.com/~test">http://example.com/~test</a></p>
+
+>>> parse(u'[[test]] [[tset|test]]')
+<p><a href="test">test</a> <a href="tset">test</a></p>
+
+>>> parse(u'[[http://example.com|test]]')
+<p><a href="http://example.com">test</a></p>
+
+>>> wiki_parse(u'Lorem WikiWord iPsum sit ameT.')
+<p>Lorem <a href="WikiWord">WikiWord</a> iPsum sit ameT.</p>
+
+"""
 
 import re
 
 from creole.parser import Parser
-
+from creole.rules import LinkRules
 
-class Rules(object):
-    # For the link targets:
-    proto = r'http|https|ftp|nntp|news|mailto|telnet|file|irc'
-    extern = r'(?P<extern_addr>(?P<extern_proto>%s):.*)' % proto
-    interwiki = r'''
-            (?P<inter_wiki> [A-Z][a-zA-Z]+ ) :
-            (?P<inter_page> .* )
-        '''
 
 class HtmlEmitter(object):
     """
@@ -22,12 +151,9 @@
     tree consisting of DocNodes.
     """
 
-    addr_re = re.compile('|'.join([
-            Rules.extern,
-            Rules.interwiki,
-        ]), re.X | re.U) # for addresses
-
-    def __init__(self, root):
+    def __init__(self, root, link_rules=None):
+        self.root = root
+        self.link_rules = link_rules or LinkRules()
         self.root = root
 
     def get_text(self, node):
@@ -98,7 +224,7 @@
             inside = self.emit_children(node)
         else:
             inside = self.html_escape(target)
-        m = self.addr_re.match(target)
+        m = self.link_rules.addr_re.match(target)
         if m:
             if m.group('extern_addr'):
                 return u'<a href="%s">%s</a>' % (
@@ -111,7 +237,7 @@
     def image_emit(self, node):
         target = node.content
         text = self.get_text(node)
-        m = self.addr_re.match(target)
+        m = self.link_rules.addr_re.match(target)
         if m:
             if m.group('extern_addr'):
                 return u'<img src="%s" alt="%s">' % (
--- a/creole/rules.py	Tue Jun 01 21:59:03 2010 +0200
+++ b/creole/rules.py	Tue Jun 01 22:12:46 2010 +0200
@@ -5,6 +5,24 @@
 import sys
 
 
+class LinkRules(object):
+    """Rules for recognizing external links."""
+
+    # For the link targets:
+    proto = r'http|https|ftp|nntp|news|mailto|telnet|file|irc'
+    extern = r'(?P<extern_addr>(?P<extern_proto>%s):.*)' % proto
+    interwiki = r'''
+            (?P<inter_wiki> [A-Z][a-zA-Z]+ ) :
+            (?P<inter_page> .* )
+        '''
+
+    def __init__(self):
+        self.addr_re = re.compile('|'.join([
+                self.extern,
+                self.interwiki,
+            ]), re.X | re.U) # for addresses
+
+
 class Rules(object):
     """Hold all the rules for generating regular expressions."""