Hi Walter, et all,<div><br></div><div>This patch should go most of the way to fixing the bug. However, I haven&#39;t tested it locally &amp; it contains a few assumptions about what the SVG files look like that that it&#39;s processing. I&#39;m also not 100% sure about the elementtree implementation of ElementTree (am used to lxml). That said, I would like your feedback about whether you consider this to be an appropriate way to approach the problem.</div>
<div><br></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">diff --git a/taexporthtml.py b/taexporthtml.py</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">index 5a0d163..daad983 100644</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">--- a/taexporthtml.py</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+++ b/taexporthtml.py</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">@@ -25,6 +25,78 @@ import os.path</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"> from tautils import data_to_string, save_picture, image_to_base64</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"> from gettext import gettext as _</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"> </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+try: import xml.etree.cElementTree as ET</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+except ImportError:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    try: import cElementTree as ET # python &lt;2.5</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    except ImportError:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        try: import lxml.etree as ET</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        except ImportError:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            try: import xml.etree.ElementTree as ET</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            except ImportError:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+                import elementtree.ElementTree as ET</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+def split_at_len(s, max_len=50, delimiter=None):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    Returns a list of strings, that are split from an</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    input string. Delimits on whitespace by default.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    if delimiter is None:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        s = s.split()</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    else:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        s = s.split(delimiter)</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    lines = []</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    current_line = &#39;&#39;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    for word in s:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        if len(current_line) &gt;= max_len:</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            short.append(current_line)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            current_line = word</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        else:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            current_line = &#39;%s %s&#39; % (current_line, word);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    lines[0] = lines[0][1:] #hack required by string formatting</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    lines.append(current_line)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    return lines</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+def process_svg_text_element(el, max_len=50, line_height=&#39;1.1em&#39;):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    Turns </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+      &lt;text&gt;long ... content&lt;/text&gt;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    into </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+      &lt;text&gt;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        &lt;tspan&gt;long&lt;/tspan&gt;&lt;tspan&gt;...&lt;/tspan&gt;&lt;tspan&gt;content&lt;/tspan&gt;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+     &lt;/text&gt;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    # NOTE Assumes that there are no subelements this</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    #      should be safe because TurtleArt shouldn&#39;t</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    #      generate any</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    data = split_at_len(el.text, max_len=max_len)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    for line in data:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        ET.SubElement(el, &#39;tspan&#39;)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    i = 0</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    while i &lt; len(data):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        el[i].text = data[i]</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        el[i].attrib[&#39;dy&#39;] = (i*line_height)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        i = i+1</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    return el</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+def process_text_in_svg(svg, max_len=50, line_height=&#39;1.1em&#39;):</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    Takes an SVG as a string or file-like object</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    and returns a string with text elements split</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    into multiple lines surrounded by &lt;tspan&gt;.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    &quot;&quot;&quot;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    tree = ET.parse(svg)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    svg_text = tree.findall(&#39;text&#39;)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    if len(svg_text) &gt; 0:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+        for el in svg_text:</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            # TODO check if this actually replaces the element in tree</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+            el = process_svg_text_element(el, </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+                     max_len=max_len, </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+                     line_height=line_height)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+    return ET.tostring(tree)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"> def save_html(self, tw, embed_flag=True):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">     &quot;&quot;&quot; Either: Save canvas and code or pictures to HTML &quot;&quot;&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">     self.embed_images = embed_flag</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">@@ -85,7 +157,7 @@ def save_html(self, tw, embed_flag=True):</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                 imgdata = f.read()</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                 f.close()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                 if p.endswith((&#39;.svg&#39;)):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">-                    tmp = imgdata</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+                    tmp = process_text_in_svg(imgdata)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                 else:</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     pixbuf = gtk.gdk.pixbuf_new_from_file(p)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     imgdata = image_to_base64(pixbuf, tw.activity)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">@@ -97,7 +169,7 @@ def save_html(self, tw, embed_flag=True):</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     f = open(p, &quot;r&quot;)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     imgdata = f.read()</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     f.close()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">-                    tmp = imgdata</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+                    tmp = process_text_in_svg(imgdata)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                 else:</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     tmp = self.html_glue[&#39;img3&#39;][0]</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     tmp += p</font></div>
</div>