[Erp5-report] r21869 - /erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jun 25 16:09:19 CEST 2008


Author: nicolas
Date: Wed Jun 25 16:09:16 2008
New Revision: 21869

URL: http://svn.erp5.org?rev=21869&view=rev
Log:
Add support of Image & Css inclusions in Html conversion

Modified:
    erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py

Modified: erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py?rev=21869&r1=21868&r2=21869&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py (original)
+++ erp5/trunk/products/ERP5OOo/transforms/oood_commandtransform.py Wed Jun 25 16:09:16 2008
@@ -1,7 +1,17 @@
 from Products.PortalTransforms.libtransforms.commandtransform import commandtransform
 from Products.PortalTransforms.interfaces import idatastream
 from Products.ERP5Type.Document import newTempOOoDocument
+from Products.CMFCore.utils import getToolByName
+try:
+  from Products.ERP5OOo.OOoUtils import OOoBuilder
+  import re
+  from libxml2 import parseDoc, parserError
+  import_succeed = 1
+except ImportError:
+  import_succeed = 0
 from zLOG import LOG
+
+REMOTE_URL_PATTERN = '^((?P<protocol>http(s)?://)(?P<domain>[.a-zA-Z0-9]+)+)?(?P<port>:\d{4})?(?P<path>/?\S*)'
 
 class TransformError(Exception):
   pass
@@ -46,12 +56,101 @@
     commandtransform.__init__(self, name)
     if name:
       self.__name__ = name
+    self.mimetype = mimetype
+    self.context = context
+    if import_succeed and self.mimetype == 'text/html':
+      data = self.includeExternalCssList(data)
     self.data = data
-    self.context = context
-    self.mimetype = mimetype
 
   def name(self):
     return self.__name__
+
+  def includeImageList(self, data):
+    """
+      Include Images in ODF archive
+    """
+    builder = OOoBuilder(data)
+    content = builder.extract('content.xml')
+    xml_doc = parseDoc(content)
+    image_tag_list = xml_doc.xpathEval('//*[name() = "draw:image"]')
+    svg_ns = xml_doc.getRootElement().searchNs(xml_doc, 'svg')
+    ratio_px_cm = 2.54 / 100.
+    for image_tag in image_tag_list:
+      frame = image_tag.parent
+      #Try to get image file from ZODB
+      href_attribute_list = image_tag.xpathEval('.//@*[name() = "xlink:href"]')
+      href_attribute = href_attribute_list[0]
+      url = href_attribute.get_content()
+      matching = re.match(REMOTE_URL_PATTERN, url)
+      if matching is not None:
+        path = matching.groupdict().get('path')
+        try:
+          image = self.context.restrictedTraverse(path)
+        except AttributeError:
+          #Image not found, this image is probably not hosted by ZODB. Do nothing
+          image = None
+        if image is not None:
+          content_type = image.getContentType()
+          mimetype_list = getToolByName(self.context,
+                                        'mimetypes_registry').lookup(content_type)
+          #Need to improve default format handling
+          format = 'png'
+          if mimetype_list:
+            format = mimetype_list[0].minor()
+          try:
+            #ERP5 API
+            data = image.getData()
+            height = image.getHeight()
+            width = image.getWidth()
+          except AttributeError:
+            #OFS API
+            data = image.data
+            height = image.height
+            width = image.width
+          if height:
+            frame.setNsProp(svg_ns, 'height', '%.3fcm' % (height * ratio_px_cm))
+          if width:
+            frame.setNsProp(svg_ns, 'width', '%.3fcm' % (width * ratio_px_cm))
+          new_path = builder.addImage(data, format=format)
+          href_attribute.setContent(new_path)
+    builder.replace('content.xml', xml_doc.serialize('utf-8', 0))
+    xml_doc.freeDoc()
+    return builder.render()
+
+  def includeExternalCssList(self, data):
+    """
+      Replace external Css link by style Element
+    """
+    try:
+      xml_doc = parseDoc(data)
+    except parserError:
+      #If not valid xhtml do nothing
+      return data
+    xpath = '//*[local-name() = "link"][@type = "text/css"]'
+    css_link_tag_list = xml_doc.xpathEval(xpath)
+    for css_link_tag in css_link_tag_list:
+      #Try to get css from ZODB
+      href_attribute_list = css_link_tag.xpathEval('.//@href')
+      href_attribute = href_attribute_list[0]
+      url = href_attribute.get_content()
+      matching = re.match(REMOTE_URL_PATTERN, url)
+      if matching is not None:
+        path = matching.groupdict().get('path')
+        try:
+          css = self.context.restrictedTraverse(path)
+        except AttributeError:
+          #Image not found, this image is probably not hosted by ZODB. Do nothing
+          css = None
+        if css is not None:
+          css_as_text = css(client=self.context.getPortalObject())
+          style_node = xml_doc.newChild(None, 'style', css_as_text)
+          style_node.setProp('type', 'text/css')
+          css_link_tag.replaceNode(style_node)
+    #omit xml-declaration
+    data = xml_doc.serialize('utf-8', 0)\
+                     .replace('<?xml version="1.0" encoding="utf-8"?>\n', '')
+    xml_doc.freeDoc()
+    return data
 
   def convert(self):
     tmp_ooo = newTempOOoDocument(self.context, self.name)
@@ -65,6 +164,11 @@
   def convertTo(self, format):
     if self.ooo.isTargetFormatAllowed(format):
       mime, data = self.ooo.convert(format)
+      if import_succeed and self.mimetype == 'text/html':
+        builder = OOoBuilder(data)
+        content = builder.extract('content.xml')
+        xml_doc = parseDoc(content)
+        data = self.includeImageList(data)
       return data
     else:
-      raise TransformError
+      raise TransformError




More information about the Erp5-report mailing list