src/cm/converters/old_converters.py
changeset 0 40c8f766c9b8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/converters/old_converters.py	Mon Nov 23 15:14:29 2009 +0100
@@ -0,0 +1,136 @@
+########## converters
+from django.core.cache import cache
+
+# adapted [to django] from http://code.activestate.com/recipes/325205/
+def memoize(f):
+    def g(*args, **kwargs):
+        key = ( f.__name__, f, tuple(args), frozenset(kwargs.items()) )
+        val = cache.get(key)
+        if not val:
+            val = f(*args, **kwargs)
+            cache.set(key,val)
+        return val
+    return g
+
+
+def to_unicode(string):
+    if type(string) != 'unicode':
+        return string.decode('utf8')
+    else:
+        return string 
+
+def to_utf8(string):
+    if type(string) != 'str':
+        return string.encode('utf8')
+    else:
+        return string
+ 
+#@memoize
+def rst_to_html(rst):
+    from docutils import core, io
+    html, pub = _get_html_and_pub(rst)
+    parts = pub.writer.parts
+    return parts['stylesheet']+parts['body']
+
+#@memoize
+def rst_to_fullhtml(rst):
+    html, pub = _get_html_and_pub(rst)
+    parts = pub.writer.parts
+    return html 
+    #return '<html><head>' + parts['stylesheet'] + '</head><body>' + parts['body'] + '</body></html>' 
+
+def markdown_to_html(markdown):
+    return _markdown_to_html(markdown)
+
+def markdown_to_fullhtml(markdown):
+    return '<html><body>'+_markdown_to_html(markdown) + '</body></html>'
+
+def _markdown_to_html(markdown):
+    from markdown import Markdown
+    md = Markdown()
+    html = md.convert(markdown)
+    return html
+    
+def _get_html_and_pub(rst):
+    from docutils import core, io
+    html, pub = core.publish_programmatically(
+            source_class=io.StringInput, source=rst,
+            source_path=None,
+            destination_class=io.StringOutput, destination=None,
+            destination_path=None,
+            reader=None, reader_name='standalone',
+            parser=None, parser_name='restructuredtext',
+            writer=None, writer_name='HTML',
+            settings=None, settings_spec=None, settings_overrides=None,
+            config_section=None, enable_exit_status=None)
+    return html, pub
+
+#@memoize
+def html_to_pdf(html):
+    html = to_utf8(html)
+    
+    import sx.pisa3 as pisa
+    import StringIO
+    dst = StringIO.StringIO()
+    result = pisa.CreatePDF(html, dst)
+    if not result.err:    
+        pdf = dst.getvalue()
+        dst.close()
+        return pdf
+    else:
+        return None
+
+# http://www.aaronsw.com/2002/html2text/
+#@memoize    
+def html_to_markdown(html):
+    from com.ext.html2text import html2text
+    return html2text(html)
+
+########## formats
+
+FORMATS = {
+           'HTML' : {'name': 'HTML', 
+                     'to_format' : {'Markdown' : html_to_markdown, }
+                     },
+           'FULLHTML' : {'name': 'FULLHTML', 
+                     'to_format' : {'PDF' : html_to_pdf, }
+                     },
+           'RST' : {'name': 'reStructuredText', 
+                     'to_format' : {'HTML' : rst_to_html,
+                                    'FULLHTML' : rst_to_fullhtml,
+                                    }
+                     },
+                     
+           'Markdown' : {'name': 'Markdown', 
+                     'to_format' : {'HTML' : markdown_to_html,
+                                    'FULLHTML' : markdown_to_fullhtml,
+                                    }
+                     },
+           'Textile' : {'name': 'Textile', 
+                     },
+           'PDF' : {'name': 'PDF', 
+                     },
+            }            
+
+CHOICES_FORMATS = [ (k,v.get('name')) for k,v in FORMATS.items()]
+
+INPUT_FORMATS = ['RST','Markdown']
+
+DEFAULT_INPUT_FORMAT = 'Markdown'
+
+CHOICES_INPUT_FORMATS = [ (k,v.get('name')) for k,v in FORMATS.items() if k in INPUT_FORMATS]
+
+def get_supported_conversions(from_format):
+    return FORMATS[from_format]['to_format'].keys()
+
+def is_supported_conversion(from_format, to_format):
+    infos = FORMATS.get(from_format)
+    return infos.get('to_format') and infos.get('to_format').get(to_format)
+ 
+def convert(content, from_format, to_format):
+    if is_supported_conversion(from_format, to_format):
+        infos = FORMATS.get(from_format)
+        conv_fun = infos.get('to_format').get(to_format)
+        return conv_fun(content)
+    else:
+        pass        
\ No newline at end of file