home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Inkscape / Inkscape-0.48.2-1-win32.exe / share / extensions / jessyInk_video.py < prev    next >
Text File  |  2011-07-08  |  4KB  |  124 lines

  1. #!/usr/bin/env python
  2. # Copyright 2008, 2009 Hannes Hochreiner
  3. # This program is free software: you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation, either version 3 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program.  If not, see http://www.gnu.org/licenses/.
  15.  
  16. # These lines are only needed if you don't put the script directly into
  17. # the installation directory
  18. import sys
  19. # Unix
  20. sys.path.append('/usr/share/inkscape/extensions')
  21. # OS X
  22. sys.path.append('/Applications/Inkscape.app/Contents/Resources/extensions')
  23. # Windows
  24. sys.path.append('C:\Program Files\Inkscape\share\extensions')
  25.  
  26. # We will use the inkex module with the predefined Effect base class.
  27. import inkex
  28. import os
  29. import re
  30. from lxml import etree
  31. from copy import deepcopy
  32. import gettext
  33. _ = gettext.gettext
  34.  
  35. class JessyInk_Effects(inkex.Effect):
  36.     def __init__(self):
  37.         # Call the base class constructor.
  38.         inkex.Effect.__init__(self)
  39.  
  40.         self.OptionParser.add_option('--tab', action = 'store', type = 'string', dest = 'what')
  41.  
  42.         inkex.NSS[u"jessyink"] = u"https://launchpad.net/jessyink"
  43.  
  44.     def effect(self):
  45.         # Check version.
  46.         scriptNodes = self.document.xpath("//svg:script[@jessyink:version='1.5.5']", namespaces=inkex.NSS)
  47.  
  48.         if len(scriptNodes) != 1:
  49.             inkex.errormsg(_("The JessyInk script is not installed in this SVG file or has a different version than the JessyInk extensions. Please select \"install/update...\" from the \"JessyInk\" sub-menu of the \"Extensions\" menu to install or update the JessyInk script.\n\n"))
  50.  
  51.         baseView = self.document.xpath("//sodipodi:namedview[@id='base']", namespaces=inkex.NSS)
  52.  
  53.         if len(baseView) != 1:
  54.             inkex.errormsg(_("Could not obtain the selected layer for inclusion of the video element.\n\n"))
  55.  
  56.         layer = self.document.xpath("//svg:g[@id='" + baseView[0].attrib["{" + inkex.NSS["inkscape"] + "}current-layer"] + "']", namespaces=inkex.NSS)
  57.  
  58.         if (len(layer) != 1):
  59.             inkex.errormsg(_("Could not obtain the selected layer for inclusion of the video element.\n\n"))
  60.  
  61.         # Parse template file.
  62.         tmplFile = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'jessyInk_video.svg'), 'r')
  63.         tmplRoot = etree.fromstring(tmplFile.read())
  64.         tmplFile.close()
  65.  
  66.         elem = deepcopy(tmplRoot.xpath("//svg:g[@jessyink:element='core.video']", namespaces=inkex.NSS)[0])
  67.         nodeDict = findInternalLinks(elem, tmplRoot)
  68.  
  69.         deleteIds(elem)
  70.  
  71.         idSubst = {}
  72.  
  73.         for key in nodeDict:
  74.             idSubst[key] = getNewId("jessyink.core.video", self.document)
  75.             deleteIds(nodeDict[key])
  76.             nodeDict[key].attrib['id'] = idSubst[key]
  77.             elem.insert(0, nodeDict[key])
  78.  
  79.         for ndIter in elem.iter():
  80.             for attrIter in ndIter.attrib:
  81.                 for entryIter in idSubst:
  82.                     ndIter.attrib[attrIter] = ndIter.attrib[attrIter].replace("#" + entryIter, "#" + idSubst[entryIter])
  83.  
  84.         # Append element.
  85.         layer[0].append(elem)
  86.  
  87. def findInternalLinks(node, docRoot, nodeDict = {}):
  88.     for entry in re.findall("url\(#.*\)", etree.tostring(node)):
  89.         linkId = entry[5:len(entry) - 1]
  90.  
  91.         if not nodeDict.has_key(linkId):
  92.             nodeDict[linkId] = deepcopy(docRoot.xpath("//*[@id='" + linkId + "']", namespaces=inkex.NSS)[0])
  93.             nodeDict = findInternalLinks(nodeDict[linkId], docRoot, nodeDict)
  94.  
  95.     for entry in node.iter():
  96.         if entry.attrib.has_key('{' + inkex.NSS['xlink'] + '}href'):
  97.             linkId = entry.attrib['{' + inkex.NSS['xlink'] + '}href'][1:len(entry.attrib['{' + inkex.NSS['xlink'] + '}href'])]
  98.     
  99.             if not nodeDict.has_key(linkId):
  100.                 nodeDict[linkId] = deepcopy(docRoot.xpath("//*[@id='" + linkId + "']", namespaces=inkex.NSS)[0])
  101.                 nodeDict = findInternalLinks(nodeDict[linkId], docRoot, nodeDict)
  102.  
  103.     return nodeDict
  104.  
  105. def getNewId(prefix, docRoot):
  106.     import datetime
  107.  
  108.     number = datetime.datetime.now().microsecond
  109.  
  110.     while len(docRoot.xpath("//*[@id='" + prefix + str(number) + "']", namespaces=inkex.NSS)) > 0:
  111.         number += 1
  112.  
  113.     return prefix + str(number)
  114.  
  115. def deleteIds(node):
  116.     for entry in node.iter():
  117.         if entry.attrib.has_key('id'):
  118.             del entry.attrib['id']
  119.  
  120. # Create effect instance
  121. effect = JessyInk_Effects()
  122. effect.affect()
  123.  
  124.