Sozi

From assela Pathirana
Jump to navigationJump to search

Sozi] is an Inkscape plugin that makes the vector editing program into a powerful presentation maker. The tool makes non-linear (a bit like Prezi) in SVG format. A main advantage is that the user does not have to have any special software to play them -- A good web browser will do. I have had great success with Firefox and Google Chrome (or Chromium).

Sozi on Steroids

Due to limitations imposed by Inkscape plugin mechanism (?) registering frames with sozi need to be done one at a time. This makes the user impatient. Following is a script that helps to automate adding a bunch of Sozi frames to a presentation. See the header for information on usage.

#!/usr/bin/python

#######################################################################
### Assela Pathirana 2012 
#######################################################################
### Automates adding number of frames to sozi
### How to: 
### 1. Make a frame in inkscape, give it an easy id,  and add it to sozi. 
### 2. Make copies of that frame to all other places where needed. 
### 3. Run this script with the svg file and that id as arguments. It will 
###    add all the copied frames to sozi
### 4. Do the fine tuning of labels with sozi. 
######################################################################
import sys

if (len(sys.argv) > 2):
	rectid=sys.argv[2]
	file=sys.argv[1]
else:
	print "Usage: $0 <svg file> <\"id\">\n"
        exit(5)
print "Using parent id: ", rectid , "\n"

SVG_NAMESPACE = "http://www.w3.org/2000/svg"
SVG= "{%s}" % SVG_NAMESPACE
ns1= "{%s}" % "http://sozi.baierouge.fr" 
from lxml import etree
tree=etree.parse(file)
rects=tree.findall("//%srect" % SVG)
sozis=tree.findall("//%sframe" % ns1 )
import re
def choose(x,y):
	return re.search(y,x)
parent=filter(lambda x: rectid==x.attrib['id'] , rects)
if  len(parent)!=1 : 
	print "Can't find the parent id!!"
	exit(0)

target=filter(lambda x: rectid==x.attrib['%srefid' % ns1 ] , sozis)
if  len(target)!=1 : 
	print "Can't find the parent in sozi!!"
	exit(0)
root=tree.getroot()
myrects=filter(lambda x: re.search(rectid,x.attrib['id'])!=None , rects) 
#myrects=list(set(myrects)-set(parent))
myrects=myrects[1:]
# now deepcopy target with attribute changed to id of myrects
from copy import deepcopy
for item in myrects:
	print "Doing: " , item.attrib['id']
        newitem=deepcopy(target[0])
        newitem.attrib['%srefid' % ns1]=item.attrib['id']
        root.append(newitem)        
tree.write(file+"_.svg", pretty_print=True)