[cpif] r428 - branches/alvaro/frontend-web
svn at argo.es
svn at argo.es
Thu Oct 25 18:15:21 CEST 2007
Author: alvaro
Date: Thu Oct 25 18:15:20 2007
New Revision: 428
Log:
Seguimos adelante
Modified:
branches/alvaro/frontend-web/parsers.py
Modified: branches/alvaro/frontend-web/parsers.py
==============================================================================
--- branches/alvaro/frontend-web/parsers.py (original)
+++ branches/alvaro/frontend-web/parsers.py Thu Oct 25 18:15:20 2007
@@ -1,80 +1,182 @@
# $Id$
import parser_bbcode
-import parser_html
-import parser_urls
-import parser_smileys
-import parser_eol
-import parser_entities
+
+def gimme_the_tag(tag,args):
+
+ mapping = {
+ "url": ('<a href="%s">%s</a>'),
+ "b": ('<strong>%s</strong>'),
+ "u": ('<span style="text-decoration:underline">%s</span>'),
+ "s": ('<strile>%s</strike>'),
+ "size": ('<span style="font-size:%s">%s</span>'),
+ "code": ('<code>%s</code>'),
+ "i": ('<em>%s</em>'),
+ "quote*": ('<blockquote>%s</blockquote>'),
+ "quote": ('<blockquote title="%s"><h4>%s escribió:</h4>%s</blockquote>'),
+ "img": ('<img src="%s" />')
+ }
+
+ if tag == "url" and len(args) < 2:
+ args.append(args[-1])
+ elif tag == "quote" and len(args) == 1:
+ tag = "quote*"
+ elif tag == "quote" and len(args) == 2:
+ args.insert(0,args[0])
+ return mapping[tag] % tuple(args)
def convert_to_html(text):
- """Converts the text into valid HTML."""
- from globales import allow_bbcode, allow_html
-
- tokens = [(True, text, None)]
+ """Converts the text into valid HTML."""
+
+ parsers = [
+ (True, parser_bbcode),
+ ]
+
+ control = True
+
+ stack = []
+
+ while control:
+ results = {9999999: "foobar"}
+ for allow, parser in parsers:
+ ret = parser.parse(text)
+ results[ret[0]] = ret[1:]
+
+ before, tag, args, after = results[min(results.keys())]
+
+ stack.append(('TEXT',before))
+
+ # Tag has the format: (type, true if is an opening, the tag)
+ if tag and not tag[1]: # It is a closing
+ args = []
+ while True:
+ try:
+ el = stack.pop()
+ except:
+ print 'Texto mal formateado'
+ print tag
+ print stack
+ return None
+ if el[0] == 'TEXT':
+ args.insert(-1,el[1])
+ elif el[0] == tag[0] and el[2] == tag[2]:
+ stack.append(('TEXT',gimme_the_tag(el[2],args)))
+ break
+ elif tag:
+ stack.append(tag)
+ if args:
+ stack.append(('TEXT',args))
+
+ if after:
+ text = after
+ else:
+ control = False
+ break
+# print stack
+ text = []
+ while True:
+ try:
+ el = stack.pop(0)
+ if el[0] == 'TEXT':
+ text.append(el[1])
+ else:
+ return True, None
+ except:
+ return False, "".join(text)
- parsers = [
- (allow_html, parser_html),
- (allow_bbcode, parser_bbcode),
- (True, parser_urls),
- (True, parser_smileys),
- (True, parser_eol),
-# Salvo que sepas muy bien que estas haciendo,
-# este parser debe ser el ultimo de todos.
- (True, parser_entities)
- ]
-
- for allow, parser in parsers:
- if allow:
- aux = []
- for token in tokens:
- token_list=[token]
- must_reparse, fragment, curr_context=token
- if must_reparse :
- retval, token_list= parser.parse(fragment, curr_context)
- if retval :
- return retval, None
- aux+=token_list
- tokens = aux
-
- return False, "".join([text for dummy, text, dummy in tokens])
+
+# return False, "".join([text for dummy, text, dummy in tokens])
import unittest
class TestBBCodeHTML(unittest.TestCase):
- """Test Case for the BBCode and HTML parser together"""
- correct_code = (
- ('[url="http://example.org/uno&dos"]el texto[/url]', '<a href="http://example.org/uno&dos">el texto</a>'),
- ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&dos">el & texto</a>'),
- ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&dos">el &amp; texto</a>'),
- ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&dos">el "" texto</a>'),
- ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&dos">el "" texto</a>'),
- ('http://example.com [url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.com" title="http://example.com">http://example.com</a> <a href="http://example.org/uno&dos">el "" texto</a>'),
- )
- incorrect = (
- '<a>paco<a>luis</a>manolo</a>ringesvinto',
- '<a>paco[url]luis[/url]>manolo</a>ringesvinto',
- '[url]paco<a>luis</a>manolo[/url]ringesvinto',
- )
-
- def testIncorrectCode(self):
- """Test if the translation goes well."""
- global allow_errors
- allow_errors = False
- for code in self.incorrect:
- retval, dummy = convert_to_html(code)
- assert retval
-
- def testCorrectCode(self):
- """Test if the translation goes well."""
- global allow_errors
- allow_errors = False
- for code, html in self.correct_code:
- retval, result = convert_to_html(code)
- assert not retval
- self.assertEqual(html, result)
+ """Test Case for the BBCode and HTML parser together"""
+ correct_bbcode = (
+
+# FIXME: Deal w/ whitespace
+# ('[ b]hola[/b]', '<strong>hola</strong>'),
+# ('[b ]hola[/b]', '<strong>hola</strong>'),
+# ('[ b ]hola[/b]', '<strong>hola</strong>'),
+#
+# ('[b]hola[ /b]', '<strong>hola</strong>'),
+# ('[b]hola[/b ]', '<strong>hola</strong>'),
+# ('[b]hola[ /b ]', '<strong>hola</strong>'),
+
+ ('[b]hola[/b]', '<strong>hola</strong>'),
+ ('antes [b]hola[/b]', 'antes <strong>hola</strong>'),
+ ('[b]hola[/b] despues', '<strong>hola</strong> despues'),
+ ('antes [b]hola[/b] despues', 'antes <strong>hola</strong> despues'),
+
+ ('[url]la direccion[/url]', '<a href="la direccion">la direccion</a>'),
+ ('antes [url]la direccion[/url]', 'antes <a href="la direccion">la direccion</a>'),
+ ('[url]la direccion[/url] despues', '<a href="la direccion">la direccion</a> despues'),
+ ('antes [url]la direccion[/url] despues', 'antes <a href="la direccion">la direccion</a> despues'),
+
+ ('[url="la direccion"]el texto[/url]', '<a href="la direccion">el texto</a>'),
+ ('antes [url="la direccion"]el texto[/url]', 'antes <a href="la direccion">el texto</a>'),
+ ('[url="la direccion"]el texto[/url] despues', '<a href="la direccion">el texto</a> despues'),
+ ('antes [url="la direccion"]el texto[/url] despues', 'antes <a href="la direccion">el texto</a> despues'),
+
+ ('[url="la direccion"]el texto[/url]', '<a href="la direccion">el texto</a>'),
+
+ ('[url="http://example.org/uno&dos"]el texto[/url]', '<a href="http://example.org/uno&dos">el texto</a>'),
+
+ ('[url=la direccion]el texto[/url]', '<a href="la direccion">el texto</a>'),
+ ('antes [url=la direccion]el texto[/url]', 'antes <a href="la direccion">el texto</a>'),
+# ('[url =la direccion]el texto[/url] despues', '<a href="la direccion">el texto</a> despues'),
+ ('antes [url=la direccion]el texto[/url] despues', 'antes <a href="la direccion">el texto</a> despues'),
+
+ ('[quote=paco]Hola[/quote]', '<blockquote title="paco"><h4>paco escribió:</h4>Hola</blockquote>'),
+ ('antes [quote=paco]Hola[/quote]', 'antes <blockquote title="paco"><h4>paco escribió:</h4>Hola</blockquote>'),
+ ('[quote=paco]Hola[/quote] despues', '<blockquote title="paco"><h4>paco escribió:</h4>Hola</blockquote> despues'),
+ ('antes [quote=paco]Hola[/quote] despues', 'antes <blockquote title="paco"><h4>paco escribió:</h4>Hola</blockquote> despues'),
+
+ ('[quote]Hola[/quote]', '<blockquote>Hola</blockquote>'),
+ ('antes [quote]Hola[/quote]', 'antes <blockquote>Hola</blockquote>'),
+ ('[quote]Hola[/quote] despues', '<blockquote>Hola</blockquote> despues'),
+ ('antes [quote]Hola[/quote] despues', 'antes <blockquote>Hola</blockquote> despues'),
+
+ ('[u]hola[/u]', '<span style="text-decoration:underline">hola</span>'),
+
+ ('[size=20px]hola[/size]', '<span style="font-size:20px">hola</span>'),
+
+ ('[n]hola[/n]', '[n]hola[/n]'),
+
+ ("[img]laimagen1[/img]", '<img src="laimagen1" />'),
+ ("antes [img]laimagen2[/img]", 'antes <img src="laimagen2" />'),
+ ("[img]laimagen3[/img] despues", '<img src="laimagen3" /> despues'),
+ ("antes [img]laimagen4[/img] despues", 'antes <img src="laimagen4" /> despues'),
+ ('[url="http://example.org/uno&dos"]el texto[/url]', '<a href="http://example.org/uno&dos">el texto</a>'),
+ ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&dos">el & texto</a>'),
+ ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&dos">el &amp; texto</a>'),
+ ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&dos">el "" texto</a>'),
+ ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&dos">el "" texto</a>'),
+# ('http://example.com [url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.com" title="http://example.com">http://example.com</a> <a href="http://example.org/uno&dos">el "" texto</a>'),
+ )
+ incorrect = (
+ '<a>paco<a>luis</a>manolo</a>ringesvinto',
+ '<a>paco[url]luis[/url]>manolo</a>ringesvinto',
+ '[url]paco<a>luis</a>manolo[/url]ringesvinto',
+ )
+
+# def testIncorrectCode(self):
+# """Test if the translation goes well."""
+# global allow_errors
+# allow_errors = False
+# for code in self.incorrect:
+# retval, dummy = convert_to_html(code)
+# assert retval
+#
+ def testCorrectBBCode(self):
+ """Test if the translation goes well."""
+ global allow_errors
+ allow_errors = False
+ for code, html in self.correct_bbcode:
+# print "..."
+# print "->",code
+ retval, result = convert_to_html(code)
+ assert not retval
+ self.assertEqual(html, result)
if __name__ == "__main__":
- test1 = parser_html.TestHTML
- test2 = parser_bbcode.TestBBCode
- import unittest
- unittest.main()
+ import unittest
+ unittest.main()
More information about the cpif
mailing list