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.py452
1 files changed, 243 insertions, 209 deletions
diff --git a/taexporthtml.py b/taexporthtml.py
index f2fce3b..eb63bfd 100644
--- a/taexporthtml.py
+++ b/taexporthtml.py
@@ -30,20 +30,21 @@ from gettext import gettext as _
def save_html(self, tw, embed_flag=True):
+ self.embed_images = embed_flag
try:
- datapath = os.path.join(activity.get_activity_root(), "instance")
+ self.datapath = os.path.join(activity.get_activity_root(), "instance")
except:
# early versions of Sugar (656) didn't support get_activity_root()
- datapath = os.path.join( \
+ 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
- html_glue = {
+ self.html_glue = {
'doctype': ("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 \
Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n", ""),
- 'html': ("<http>\n", "</http>\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; \
@@ -61,181 +62,193 @@ charset=UTF-8\">\n", ""),
'img': ("<img width=\"400\" height=\"300\" alt=\"Image\" src=\"image",\
".png\" />\n"),
'img2': ("<img alt=\"Image\" src=\"image", ".png\" />\n"),
- 'ul': ("<ul>\n", "</ul>\n"),
- 'li': ("<li>", "</li>\n") }
+ 'ul': ("<table>\n", "</table>\n"),
+ 'li': ("<tr><td>", "</td></tr>\n") }
- if embed_flag == True:
+ if self.embed_images == True:
# store images in-line as base64
- html_glue['img'] = ("<img width=\"400\" height=\"300\" alt=\"Image\" \
-src=\"data:image/png;base64,\n", " \"/>\n")
- html_glue['img2'] = ("<img alt=\"Image\" \
-src=\"data:image/png;base64,\n", " \"/>\n")
+ 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 = ""
- imagecount = 0
- slidecount = 0
+ 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
- onepic = 0
- twopic = 0
- fourpic = 0
- sevenbullets = 0
- title = 0
- picture = 0
+ tp1, tp2, tp3, tp8, tp6, tp7 = 0,0,0,0,0,0
for d in data:
- if type(d) is float:
- continue
- else:
- # transalate some Turtle Art blocks into HTML
- # show and template blocks
- # ignores most turtle graphics
- if d == "show":
- show = 1
- elif d == "container":
- show = 2
- elif show > 0:
- if show == 1:
- try: # is it media or a string?
- tmp = d[0:8]
- except:
- tmp = ""
- if tmp == '#smedia_': # show media
- show = 2
- else: # show a string
- this_stack += d[2:]
- show = 0
- if show == 2:
- # show an image
- if d[8:] != None:
- try:
- dsobject = datastore.get(d[8:])
- pixbuf = \
- get_pixbuf_from_journal(dsobject,400,300)
- except:
- pixbuf = None
- if pixbuf != None:
- filename = os.path.join(datapath, 'image' + \
- str(imagecount) + ".png")
- pixbuf.save(filename, "png")
- # if the embed flag is True
- # embed base64 into the html
- if embed_flag == True:
- base64 = \
- os.path.join(datapath, 'base64tmp')
- cmd = "base64 <" + filename + " >" + base64
- subprocess.check_call(cmd, shell=True)
- f = open( base64, 'r')
- imgdata = f.read()
- f.close()
- tmp = html_glue['img2'][0]
- if embed_flag == True:
- tmp = tmp + imgdata
- else:
- tmp = tmp + str(imagecount)
- imagecount += 1
- tmp = tmp + html_glue['img2'][1]
- this_stack += tmp
+ 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
- elif d == "tp1" or d == 'tp8':
- onepic = 1
- elif d == "tp2" or d == 'tp6':
- twopic = 1
- elif d == "tp7":
- fourpic = 1
- elif d == "tp3":
- sevenbullets = 8
- elif sevenbullets > 0:
- if sevenbullets == 8:
- tmp = html_glue['slide'][0] + str(slidecount) +\
- html_glue['slide'][1] + \
- html_glue['div'][0] + html_glue['h1'][0] + \
- d[2:] + html_glue['h1'][1] + html_glue['ul'][0]
- elif d[2:] != "":
- tmp = html_glue['li'][0] + d[2:] + html_glue['li'][1]
- this_stack += tmp
- tmp = ""
- sevenbullets -= 1
- if sevenbullets == 0:
- this_stack += html_glue['ul'][1]
- elif onepic == 1 or twopic == 1 or fourpic == 1:
- tmp = html_glue['slide'][0] + str(slidecount) + \
- html_glue['slide'][1] + \
- html_glue['div'][0] + html_glue['h1'][0] + d[2:] + \
- html_glue['h1'][1] + html_glue['table'][0]
- this_stack += tmp
- if onepic > 0: onepic += 1
- elif twopic > 0: twopic += 1
- elif fourpic > 0: fourpic += 1
+ 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]
slidecount += 1
- elif onepic > 1 or twopic > 1 or fourpic > 1:
- # Need filename to copy it into instance directory
- # if it is not an image, save the preview
- # save the description too.
- if d[8:] != None:
- try:
- dsobject = datastore.get(d[8:])
- pixbuf = get_pixbuf_from_journal(dsobject,400,300)
- except:
- pixbuf = None
- if pixbuf != None:
- filename = os.path.join(datapath, 'image' + \
- str(imagecount) + ".png")
- pixbuf.save(filename, "png")
- # if the embed flag is True
- # embed base64 into the html
- if embed_flag == True:
- base64 = os.path.join(datapath, 'base64tmp')
- cmd = "base64 <" + filename + " >" + base64
- subprocess.check_call(cmd, shell=True)
- f = open( base64, 'r')
- imgdata = f.read()
- f.close()
- if onepic == 2 or twopic == 2 or twopic == 4 or\
- fourpic == 2 or fourpic == 4:
- tmp = html_glue['tr'][0]
- else:
- tmp = ""
- if pixbuf != None:
- tmp = tmp + html_glue['td'][0] + \
- html_glue['img'][0]
- if embed_flag == True:
- tmp = tmp + imgdata
- else:
- tmp = tmp + str(imagecount)
- tmp = tmp + html_glue['img'][1] + \
- html_glue['td'][1]
- if fourpic == 0:
- try:
- description = dsobject.metadata['description']
- except:
- description = ""
- tmp = tmp + html_glue['td'][0] + description + \
- html_glue['td'][1]
- if onepic == 2 or twopic == 3 or fourpic == 3 or \
- fourpic == 5:
- tmp = tmp + html_glue['tr'][1]
- imagecount += 1
- this_stack += tmp
- if onepic > 1:
- this_stack += html_glue['table'][1] + \
- html_glue['div'][1]
- onepic = 0
- elif twopic > 1:
- if twopic == 3:
- this_stack += html_glue['table'][1] + \
- html_glue['div'][1]
- twopic = 0
- else: twopic += 1
- elif fourpic > 1:
- if fourpic == 5:
- this_stack += html_glue['table'][1] + \
- html_glue['div'][1]
- fourpic = 0
- else: fourpic += 1
- this_stack += " "
+ 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
@@ -245,55 +258,38 @@ src=\"data:image/png;base64,\n", " \"/>\n")
"""
if slidecount == 0:
# save a screen dump instead
- filename = os.path.join(datapath, 'image.png')
+ filename = os.path.join(self.datapath, 'image.png')
tawindow.save_pict(tw,filename)
- # if the embed flag is True
- # embed base64 into the html
- if embed_flag == True:
- base64 = os.path.join(datapath, 'base64tmp')
+ # 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()
- code = html_glue['img'][0] + \
- imgdata + \
- html_glue['img'][1]
- for b in bs: # "show me the code"
- code = code + html_glue['div'][0]
- data = walk_stack(self, tw, b)
- for d in data:
- if type(d) is not float:
- if d[0:2] == "#s":
- d = d[2:]
- elif d[0:3] == "nop":
- stack = {"nop" :"",\
- "nop1":"stack1",\
- "nop2":"stack2",\
- "nop3":"stack"}
- d = stack[d]
- # translate block name if it is in the dictionary
- if d in blocks_dict:
- d = _(blocks_dict[d])
- else:
- d = _(d)
- code = code + str(d) + " "
- code = code + html_glue['div'][1]
-
- code = html_glue['doctype'][0] + \
- html_glue['html'][0] + \
- html_glue['head'][0] + \
- html_glue['meta'][0] + \
- html_glue['title'][0] + \
- _("Turtle Art") + \
- html_glue['title'][1] + \
- html_glue['style'][0] + \
- html_glue['style'][1] + \
- html_glue['head'][1] + \
- html_glue['body'][0] + \
+ 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] + \
+ self.html_glue['head'][0] + \
+ self.html_glue['meta'][0] + \
+ self.html_glue['title'][0] + \
+ _("Turtle Art") + " " + tw.activity.metadata['title'] + \
+ self.html_glue['title'][1] + \
+ self.html_glue['style'][0] + \
+ self.html_glue['style'][1] + \
+ self.html_glue['head'][1] + \
+ self.html_glue['body'][0] + \
code + \
- html_glue['body'][1] + \
- html_glue['html'][1]
+ self.html_glue['body'][1] + \
+ self.html_glue['html'][1]
return code
def walk_stack(self, tw, spr):
@@ -305,3 +301,41 @@ def walk_stack(self, tw, spr):
# 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 ""