[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&oacute;:</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&amp;dos">el texto</a>'), 
-      ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&amp;dos">el &amp; texto</a>'), 
-      ('[url="http://example.org/uno&dos"]el &amp; texto[/url]', '<a href="http://example.org/uno&amp;dos">el &amp;amp; texto</a>'), 
-      ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&amp;dos">el "" texto</a>'), 
-      ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&amp;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&amp;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&amp;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&oacute;:</h4>Hola</blockquote>'), 
+            ('antes [quote=paco]Hola[/quote]', 'antes <blockquote title="paco"><h4>paco escribi&oacute;:</h4>Hola</blockquote>'), 
+            ('[quote=paco]Hola[/quote] despues', '<blockquote title="paco"><h4>paco escribi&oacute;:</h4>Hola</blockquote> despues'), 
+            ('antes [quote=paco]Hola[/quote] despues', 'antes <blockquote title="paco"><h4>paco escribi&oacute;:</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&amp;dos">el texto</a>'), 
+            ('[url="http://example.org/uno&dos"]el & texto[/url]', '<a href="http://example.org/uno&amp;dos">el &amp; texto</a>'), 
+            ('[url="http://example.org/uno&dos"]el &amp; texto[/url]', '<a href="http://example.org/uno&amp;dos">el &amp;amp; texto</a>'), 
+            ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&amp;dos">el &quot;&quot; texto</a>'), 
+            ('[url="http://example.org/uno&dos"]el "" texto[/url]', '<a href="http://example.org/uno&amp;dos">el &quot;&quot; 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&amp;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