1
# (c) 2023 Werner Mayer LGPL
3
__title__="Document handling module"
4
__author__ = "Werner Mayer"
5
__url__ = "https://www.freecad.org"
6
__doc__ = "Tools for extracting or creating project files"
12
import xml.sax.xmlreader
15
# SAX handler to parse the Document.xml
16
class DocumentHandler(xml.sax.handler.ContentHandler):
17
""" Parse content of Document.xml or GuiDocument.xml """
18
def __init__(self, dirname):
22
self.dirname = dirname
24
def startElement(self, name, attrs):
25
item = attrs.get("file")
27
self.files.append(os.path.join(self.dirname, str(item)))
29
def characters(self, content):
32
def endElement(self, name):
35
def extractDocument(filename, outpath):
36
""" Extract files from project archive """
37
zfile = zipfile.ZipFile(filename)
38
files = zfile.namelist()
47
curpath = curpath + "/" + j
49
output = open(outpath + "/"+i, 'wb')
53
def createDocument(filename, outpath):
54
""" Create project archive """
55
files = getFilesList(filename)
56
dirname = os.path.dirname(filename)
57
guixml = os.path.join(dirname, "GuiDocument.xml")
58
if os.path.exists(guixml):
59
files.extend(getFilesList(guixml))
60
compress = zipfile.ZipFile(outpath, 'w', zipfile.ZIP_DEFLATED)
62
dirs = os.path.split(i)
63
compress.write(i, dirs[-1], zipfile.ZIP_DEFLATED)
66
def getFilesList(filename):
67
""" Determine list of files referenced in a Document.xml or GuiDocument.xml """
68
dirname = os.path.dirname(filename)
69
handler = DocumentHandler(dirname)
70
parser = xml.sax.make_parser()
71
parser.setContentHandler(handler)
72
parser.parse(filename)
75
files.append(filename)
76
files.extend(iter(handler.files))