[Sugar-devel] [PATCH] TurtleArt - SVG text wrapping #sl1856

Tim McNamara paperless at timmcnamara.co.nz
Sat Jul 3 07:44:00 EDT 2010


Hi Walter, et all,

This patch should go most of the way to fixing the bug. However, I haven't
tested it locally & it contains a few assumptions about what the SVG files
look like that that it's processing. I'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.

diff --git a/taexporthtml.py b/taexporthtml.py
index 5a0d163..daad983 100644
--- a/taexporthtml.py
+++ b/taexporthtml.py
@@ -25,6 +25,78 @@ import os.path
 from tautils import data_to_string, save_picture, image_to_base64
 from gettext import gettext as _

+try: import xml.etree.cElementTree as ET
+except ImportError:
+    try: import cElementTree as ET # python <2.5
+    except ImportError:
+        try: import lxml.etree as ET
+        except ImportError:
+            try: import xml.etree.ElementTree as ET
+            except ImportError:
+                import elementtree.ElementTree as ET
+
+def split_at_len(s, max_len=50, delimiter=None):
+    """
+    Returns a list of strings, that are split from an
+    input string. Delimits on whitespace by default.
+    """
+    if delimiter is None:
+        s = s.split()
+    else:
+        s = s.split(delimiter)
+
+    lines = []
+    current_line = ''
+    for word in s:
+        if len(current_line) >= max_len:
+            short.append(current_line)
+            current_line = word
+        else:
+            current_line = '%s %s' % (current_line, word);
+    lines[0] = lines[0][1:] #hack required by string formatting
+    lines.append(current_line)
+    return lines
+
+def process_svg_text_element(el, max_len=50, line_height='1.1em'):
+    """
+    Turns
+      <text>long ... content</text>
+    into
+      <text>
+        <tspan>long</tspan><tspan>...</tspan><tspan>content</tspan>
+     </text>
+    """
+    # NOTE Assumes that there are no subelements this
+    #      should be safe because TurtleArt shouldn't
+    #      generate any
+    data = split_at_len(el.text, max_len=max_len)
+
+    for line in data:
+        ET.SubElement(el, 'tspan')
+
+    i = 0
+    while i < len(data):
+        el[i].text = data[i]
+        el[i].attrib['dy'] = (i*line_height)
+        i = i+1
+    return el
+
+def process_text_in_svg(svg, max_len=50, line_height='1.1em'):
+    """
+    Takes an SVG as a string or file-like object
+    and returns a string with text elements split
+    into multiple lines surrounded by <tspan>.
+    """
+    tree = ET.parse(svg)
+    svg_text = tree.findall('text')
+    if len(svg_text) > 0:
+        for el in svg_text:
+            # TODO check if this actually replaces the element in tree
+            el = process_svg_text_element(el,
+                     max_len=max_len,
+                     line_height=line_height)
+    return ET.tostring(tree)
+
 def save_html(self, tw, embed_flag=True):
     """ Either: Save canvas and code or pictures to HTML """
     self.embed_images = embed_flag
@@ -85,7 +157,7 @@ def save_html(self, tw, embed_flag=True):
                 imgdata = f.read()
                 f.close()
                 if p.endswith(('.svg')):
-                    tmp = imgdata
+                    tmp = process_text_in_svg(imgdata)
                 else:
                     pixbuf = gtk.gdk.pixbuf_new_from_file(p)
                     imgdata = image_to_base64(pixbuf, tw.activity)
@@ -97,7 +169,7 @@ def save_html(self, tw, embed_flag=True):
                     f = open(p, "r")
                     imgdata = f.read()
                     f.close()
-                    tmp = imgdata
+                    tmp = process_text_in_svg(imgdata)
                 else:
                     tmp = self.html_glue['img3'][0]
                     tmp += p
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.sugarlabs.org/archive/sugar-devel/attachments/20100703/896c8e7d/attachment.htm 


More information about the Sugar-devel mailing list