Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/taexporthtml.py
diff options
context:
space:
mode:
Diffstat (limited to 'taexporthtml.py')
-rw-r--r--taexporthtml.py382
1 files changed, 93 insertions, 289 deletions
diff --git a/taexporthtml.py b/taexporthtml.py
index 972f406..5a0d163 100644
--- a/taexporthtml.py
+++ b/taexporthtml.py
@@ -18,325 +18,129 @@
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.
-import tawindow
-import talogo
-from sugar.activity import activity
-from sugar.datastore import datastore
+import pygtk
+pygtk.require('2.0')
+import gtk
import os.path
-import subprocess
-from talogo import get_pixbuf_from_journal
-from tahoverhelp import *
+from tautils import data_to_string, save_picture, image_to_base64
from gettext import gettext as _
def save_html(self, tw, embed_flag=True):
-
+ """ Either: Save canvas and code or pictures to HTML """
self.embed_images = embed_flag
- try:
- self.datapath = os.path.join(activity.get_activity_root(), "instance")
- except:
- # early versions of Sugar (656) didn't support get_activity_root()
- self.datapath = os.path.join( \
- os.environ['HOME'], \
- ".sugar/default/org.laptop.TurtleArtActivity/instance")
- # dictionary defines the html wrappers around template elements
- # start of block, end of block
+ # A dictionary to define the HTML wrappers around template elements
self.html_glue = {
- 'doctype': ("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 \
-Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n", ""),
+ 'doctype': "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " + \
+ "Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n",
'html': ("<html>\n", "</html>\n"),
- 'head': ("<head>\n<!-- Created by Turtle Art -->\n", \
- "</head>\n"),
- 'meta': ("<meta http-equiv=\"content-type\" content=\"text/html; \
-charset=UTF-8\">\n", ""),
+ 'html_svg': ("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n",
+ "</html>\n"),
+ 'head': ("<head>\n<!-- Created by Turtle Art -->\n", "</head>\n"),
+ 'meta': "<meta http-equiv=\"content-type\" content=\"text/html; " + \
+ "charset=UTF-8\"/>\n",
'title': ("<title>", "</title>\n"),
- 'style': ("<style type=\"text/css\">\n<!--\n","-->\n</style>\n"),
+ 'style': ("<style type=\"text/css\">\n<!--\n", "-->\n</style>\n"),
'body': ("<body>\n", "\n</body>\n"),
'div': ("<div>\n", "</div>\n"),
'slide': ("\n<a name=\"slide", "\"></a>\n"),
'h1': ("<h1>", "</h1>\n"),
'table': ("<table cellpadding=\"10\">\n", "</table>\n"),
'tr': ("<tr>\n", "</tr>\n"),
- 'td': ("<td valign=\"top\" width=\"400\" height=\"300\">\n", \
- "\n</td>\n"),
- 'img': ("<img width=\"400\" height=\"300\" alt=\"Image\" src=\"image",\
- ".png\" />\n"),
+ 'td': ("<td valign=\"top\" width=\"400\" height=\"300\">\n",
+ "\n</td>\n"),
+ 'img': ("<img width=\"400\" height=\"300\" alt=\"Image\" " + \
+ "src=\"file://", ".png\" />\n"),
'img2': ("<img alt=\"Image\" src=\"image", ".png\" />\n"),
+ 'img3': ("<img alt=\"Image\" src=\"file://", "\" />\n"),
'ul': ("<table>\n", "</table>\n"),
'li': ("<tr><td>", "</td></tr>\n") }
+ comment = "<!--\n\
+<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" [\n\
+ <!ENTITY ns_svg \"http://www.w3.org/2000/svg\">\n\
+ <!ENTITY ns_xlink \"http://www.w3.org/1999/xlink\">\n\
+]>\n\
+-->\n"
if self.embed_images == True:
- # store images in-line as base64
- self.html_glue['img'] = ("<img width=\"400\" height=\"300\" alt=\"Image\" src=\"data:image/png;base64,\n", " \"/>\n")
- self.html_glue['img2'] = ("<img alt=\"Image\" src=\"data:image/png;base64,\n", " \"/>\n")
-
- bs = tawindow.blocks(tw)
- code = ""
- self.imagecount = 0 # incremented for each image
- slidecount = 0 # incremented for each template (slide)
- for b in bs:
- this_stack = ""
- data = walk_stack(self, tw, b)
- show = 0
- tp1, tp2, tp3, tp8, tp6, tp7 = 0,0,0,0,0,0
- for d in data:
- if type(d) is float or type(d) is int:
- d = str(d) # convert floats and ints to strings
- # transalate some Turtle Art blocks into HTML
- # show and template blocks
- # ignores most turtle graphics
- if d == "show": # show bricks take one argument
- show = 1
- elif d == "container": # containers hold a media block
- show = 2
- elif show > 0: # process the argument to show or container
- if show == 1: # could be media or a string
- if d[0:8] == '#smedia_': # show media
- this_stack += add_image(self,d)
- elif d[0:8] == '#sdescr_': # show description
- this_stack += add_description(self,d)
- elif d[0:2] == '#s': # show a string
- this_stack += d[2:]
- show = 0
- else:
- this_stack += d
- show = 0
- # process slide templates
- elif d == "tp1":
- tp1 = 1
- elif d == "tp2":
- tp2 = 1
- elif d == "tp3":
- tp3 = 8
- elif d == 'tp8':
- tp8 = 1
- elif d == "tp6":
- tp6 = 1
- elif d == "tp7":
- tp7 = 1
- elif tp3 > 0: # bullets
- if tp3 == 8: # title comes first
- tmp = self.html_glue['slide'][0] + \
- str(slidecount) + \
- self.html_glue['slide'][1] + \
- self.html_glue['div'][0] + \
- self.html_glue['h1'][0] + \
- d[2:] + \
- self.html_glue['h1'][1] + \
- self.html_glue['ul'][0]
- bullets = 6
- slidecount += 1
- elif d[2:] != "": # process bullets
- tmp = self.html_glue['li'][0] + d[2:] + \
- self.html_glue['li'][1]
- this_stack += tmp
- tmp = ""
- bullets -= 1
- if bullets == 0:
- this_stack += (self.html_glue['ul'][1] + \
- self.html_glue['div'][1])
- elif tp1 == 1 or tp2 == 1 or tp8 == 1 or\
- tp6 == 1 or tp7 == 1:
- # first time through, process title
- this_stack += (self.html_glue['slide'][0] + \
- str(slidecount) + \
- self.html_glue['slide'][1] + \
- self.html_glue['div'][0] + \
- self.html_glue['h1'][0] + d[2:] + \
- self.html_glue['h1'][1] + \
- self.html_glue['table'][0])
- if tp1 > 0: tp1 += 1
- elif tp2 > 0: tp2 += 1
- elif tp8 > 0: tp8 += 1
- elif tp6 > 0: tp6 += 1
- elif tp7 > 0: tp7 += 1
- slidecount += 1
- elif tp1 > 1 or tp6 > 1:
- tmp = self.html_glue['tr'][0] + \
- self.html_glue['td'][0]
- if d[0:8] == '#smedia_':
- tmp += (add_image(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['td'][0] + \
- add_description(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- elif d[0:8] == '#sdescr_':
- tmp += (add_description(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- if tp1 > 1 or tp6 > 2:
- this_stack += (tmp + self.html_glue['table'][1] + \
- self.html_glue['div'][1])
- tp1 = 0
- tp6 = 0
- else:
- this_stack += tmp
- tp6 += 1
- elif tp8 > 1:
- tmp = self.html_glue['tr'][0] + \
- self.html_glue['td'][0]
- if d[0:8] == '#smedia_':
- tmp += (add_image(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- elif d[0:8] == '#sdescr_':
- tmp += (add_description(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- this_stack += (tmp + self.html_glue['table'][1] + \
- self.html_glue['div'][1])
- tp8 = 0
- elif tp2 > 1 or tp7 > 1:
- if tp2 == 2 or tp7 == 2:
- tmp = self.html_glue['tr'][0] + \
- self.html_glue['td'][0]
- else:
- tmp += self.html_glue['td'][0]
- if tp2 == 2:
- saved_description = add_description(self,d)
- if tp2 == 2 or tp7 == 2:
- if d[0:8] == '#smedia_':
- tmp += (add_image(self,d) + \
- self.html_glue['td'][1])
- elif d[0:8] == '#sdescr_':
- tmp += (add_description(self,d) + \
- self.html_glue['td'][1])
- if tp2 > 1: tp2 += 1
- elif tp7 > 1: tp7 += 1
- elif tp2 == 3:
- if d[0:8] == '#smedia_':
- tmp += add_image(self,d)
- elif d[0:8] == '#sdescr_':
- tmp += add_description(self,d)
- tmp += (self.html_glue['td'][1] + \
- self.html_glue['tr'][1] + \
- self.html_glue['tr'][0] + \
- self.html_glue['td'][0])
- tmp += saved_description
- saved_desciption = ""
- tmp += (self.html_glue['td'][1] + \
- self.html_glue['td'][0])
- tmp += (add_description(self,d) + \
- self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- this_stack += (tmp + self.html_glue['table'][1] + \
- self.html_glue['div'][1])
- tp2 = 0
- elif tp7 == 3:
- if d[0:8] == '#smedia_':
- tmp += add_image(self,d)
- elif d[0:8] == '#sdescr_':
- tmp += add_description(self,d)
- tmp += (self.html_glue['td'][1] + \
- self.html_glue['tr'][1] + \
- self.html_glue['tr'][0])
- tp7 += 1
- elif tp7 == 4:
- if d[0:8] == '#smedia_':
- tmp += add_image(self,d)
- elif d[0:8] == '#sdescr_':
- tmp += add_description(self,d)
- tmp += (self.html_glue['td'][1])
- tp7 += 1
- elif tp7 == 5:
- if d[0:8] == '#smedia_':
- tmp += add_image(self,d)
- elif d[0:8] == '#sdescr_':
- tmp += add_description(self,d)
- tmp += (self.html_glue['td'][1] + \
- self.html_glue['tr'][1])
- this_stack += (tmp + self.html_glue['table'][1] + \
- self.html_glue['div'][1])
- tp7 = 0
-
- if len(data) > 0:
- code += this_stack
+ self.html_glue['img'] = ("<img width=\"400\" height=\"300\" alt="+ \
+ "\"Image\" src=\"data:image/png;base64,\n",
+ " \"/>\n")
+ self.html_glue['img2'] = ("<img alt=\"Image\" src=\"data:image/png;"+ \
+ "base64,\n", " \"/>\n")
"""
- if no show or template blocks were present, we've got no slides,
- so save a screendump instead
+ If there are saved_pictures, put them into a .html; otherwise, save a
+ screendump and the turtle project code.
"""
- if slidecount == 0:
- # save a screen dump instead
- filename = os.path.join(self.datapath, 'image.png')
- tawindow.save_pict(tw,filename)
- # if the embed_images flag is True
- # embed_images base64 into the html
+ code = ""
+ if len(tw.saved_pictures) > 0:
+ for i, p in enumerate(tw.saved_pictures):
+ code += self.html_glue['slide'][0] + str(i)
+ code += self.html_glue['slide'][1] + \
+ self.html_glue['div'][0] + \
+ self.html_glue['h1'][0]
+ if self.embed_images == True:
+ f = open(p, "r")
+ imgdata = f.read()
+ f.close()
+ if p.endswith(('.svg')):
+ tmp = imgdata
+ else:
+ pixbuf = gtk.gdk.pixbuf_new_from_file(p)
+ imgdata = image_to_base64(pixbuf, tw.activity)
+ tmp = self.html_glue['img2'][0]
+ tmp += imgdata
+ tmp += self.html_glue['img2'][1]
+ else:
+ if p.endswith(('.svg')):
+ f = open(p, "r")
+ imgdata = f.read()
+ f.close()
+ tmp = imgdata
+ else:
+ tmp = self.html_glue['img3'][0]
+ tmp += p
+ tmp += self.html_glue['img3'][1]
+ code += tmp + \
+ self.html_glue['h1'][1] + \
+ self.html_glue['div'][1]
+ else:
if self.embed_images == True:
- base64 = os.path.join(self.datapath, 'base64tmp')
- cmd = "base64 <" + filename + " >" + base64
- subprocess.check_call(cmd, shell=True)
- f = open( base64, 'r')
- imgdata = f.read()
- f.close()
- code += (self.html_glue['img'][0] + \
- imgdata + \
- self.html_glue['img'][1])
- code += (self.html_glue['div'][0])
- # get a json dump of the code
- code += (tawindow.save_string(tw,False))
- code += (self.html_glue['div'][1])
- code = self.html_glue['doctype'][0] + \
- self.html_glue['html'][0] + \
+ imgdata = image_to_base64(save_picture(self.tw.canvas), tw.activity)
+ else:
+ imgdata = os.path.join(self.tw.load_save_folder, 'image')
+ self.tw.save_as_image(imgdata)
+ code += (self.html_glue['img'][0] + imgdata + \
+ self.html_glue['img'][1])
+ code += self.html_glue['div'][0]
+ code += data_to_string(tw.assemble_data_to_save(False, True))
+ code += self.html_glue['div'][1]
+
+ if tw.running_sugar:
+ title = _("Turtle Art") + " " + tw.activity.metadata['title']
+ else:
+ title = _("Turtle Art")
+
+ header = self.html_glue['doctype'] + \
+ self.html_glue['html'][0]
+ style = self.html_glue['style'][0] + \
+ self.html_glue['style'][1]
+ if len(tw.saved_pictures) > 0:
+ if tw.saved_pictures[0].endswith(('.svg')):
+ header = self.html_glue['html_svg'][0]
+ style = comment
+
+ code = header + \
self.html_glue['head'][0] + \
- self.html_glue['meta'][0] + \
+ self.html_glue['meta'] + \
self.html_glue['title'][0] + \
- _("Turtle Art") + " " + tw.activity.metadata['title'] + \
+ title + \
self.html_glue['title'][1] + \
- self.html_glue['style'][0] + \
- self.html_glue['style'][1] + \
+ style + \
self.html_glue['head'][1] + \
self.html_glue['body'][0] + \
code + \
self.html_glue['body'][1] + \
self.html_glue['html'][1]
return code
-
-def walk_stack(self, tw, spr):
- top = tawindow.find_top_block(spr)
- if spr == top:
- # only walk the stack if the block is the top block
- return talogo.run_blocks(tw.lc, top, tawindow.blocks(tw), False)
- else:
- # not top of stack, then return empty list
- return []
-
-def add_image(self, d):
- if d[8:] != "None":
- try:
- dsobject = datastore.get(d[8:])
- pixbuf = get_pixbuf_from_journal(dsobject,400,300)
- filename = os.path.join(self.datapath, 'image' + \
- str(self.imagecount) + ".png")
- pixbuf.save(filename, "png")
- # if the embed_images flag is True
- # embed images base64 into the html
- if self.embed_images == True:
- base64 = os.path.join(self.datapath, 'base64tmp')
- cmd = "base64 <" + filename + " >" + base64
- subprocess.check_call(cmd, shell=True)
- f = open( base64, 'r')
- imgdata = f.read()
- f.close()
- tmp = self.html_glue['img2'][0]
- if self.embed_images == True:
- tmp += imgdata
- else:
- tmp += str(self.imagecount)
- self.imagecount += 1
- tmp += self.html_glue['img2'][1]
- return tmp
- except:
- return ""
- return ""
-
-def add_description(self, d):
- # show description
- if d[8:] != "None":
- try:
- dsobject = datastore.get(d[8:])
- return dsobject.metadata['description']
- except:
- return ""
- return ""