summaryrefslogtreecommitdiffstats
path: root/share/extensions/extractimage.py
blob: fe70de433ec27aa2f8849753d5a2ed4128767ed0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/env python 
'''
Copyright (C) 2005 Aaron Spike, aaron@ekips.org

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
'''
# standard library
import base64
import os
# local library
import inkex

class MyEffect(inkex.Effect):
    def __init__(self):
        inkex.Effect.__init__(self)
        self.OptionParser.add_option("--desc")
        self.OptionParser.add_option("-s", "--selectedonly",
            action="store", type="inkbool", 
            dest="selectedonly", default=True,
            help="extract only selected images")
        self.OptionParser.add_option("--filepath",
                        action="store", type="string", 
                        dest="filepath", default=None,
                        help="")

    def effect(self):
        # if slectedonly is enabled and there is a selection only extractselected
        # images. otherwise extract all images
        if (self.options.selectedonly):
            self.extractSelected(self.document, self.selected)
        else:
            self.extractAll(self.document)

    def extractSelected(self, document, selected):
        self.document=document
        self.selected=selected
        if (self.options.ids):
            for id, node in selected.iteritems():
                if node.tag == inkex.addNS('image','svg'):
                    self.extractImage(node)

    def extractAll(self, document):
        self.document=document #not that nice... oh well
        path = '//svg:image'
        for node in self.document.getroot().xpath(path, namespaces=inkex.NSS):
            self.extractImage(node)
    
    def extractImage(self, node):
        mimesubext={
            'png'     : '.png',
            'svg+xml' : '.svg',
            'bmp'     : '.bmp',
            'jpeg'    : '.jpg',
            'jpg'     : '.jpg', #bogus mime
            'icon'    : '.ico',
            'gif'     : '.gif'
        }
        
        # exbed the first embedded image
        path = self.options.filepath
        if (path != ''):
            if node.tag == inkex.addNS('image','svg'):
                xlink = node.get(inkex.addNS('href','xlink'))
                if (xlink[:4]=='data'):
                    comma = xlink.find(',')
                    if comma>0:
                        #get extension
                        fileext=''
                        semicolon = xlink.find(';')
                        if semicolon>0:
                            for sub in mimesubext.keys():
                                if sub in xlink[5:semicolon].lower():
                                    fileext=mimesubext[sub]
                                    pathwext=path+fileext
                                    if os.path.isfile(pathwext):
                                        pathwext=path + "_" + node.get("id") +fileext
                                    if (not os.path.isabs(pathwext)):
                                        if os.name == 'nt':
                                            pathwext = os.path.join(os.environ['USERPROFILE'],pathwext)
                                        else:
                                            pathwext = os.path.join(os.path.expanduser("~"),pathwext)
                                    inkex.errormsg(_('Image extracted to: %s') % pathwext)
                                    break 
                        #save
                        data = base64.decodestring(xlink[comma:])
                        open(pathwext,'wb').write(data)
                        node.set(inkex.addNS('href','xlink'),os.path.realpath(pathwext)) #absolute for making in-mem cycles work
                    else:
                        inkex.errormsg(_('Unable to find image data.'))

if __name__ == '__main__':
    e = MyEffect()
    e.affect()


# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99