FreeCAD / src /Tools /doctools.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
985c397 verified
#! python
# SPDX-License-Identifier: LGPL-2.1-or-later
# (c) 2010 Werner Mayer LGPL
# FreeCAD Python script to work with the FCStd file format.
import os
from defusedxml import sax as defused_sax
from xml.sax.handler import ContentHandler
import zipfile
# SAX handler to parse the Document.xml
class DocumentHandler(ContentHandler):
def __init__(self, dirname):
super().__init__()
self.files = []
self.dirname = dirname
def startElement(self, name, attributes):
item = attributes.get("file")
if item is not None:
self.files.append(os.path.join(self.dirname, str(item)))
def characters(self, data):
return
def endElement(self, name):
return
def extractDocument(filename, outpath):
zfile = zipfile.ZipFile(filename)
files = zfile.namelist()
for i in files:
data = zfile.read(i)
dirs = i.split("/")
if len(dirs) > 1:
dirs.pop()
curpath = outpath
for j in dirs:
curpath = curpath + "/" + j
os.mkdir(curpath)
output = open(outpath + "/" + i, "wb")
output.write(data)
output.close()
def createDocument(filename, outpath):
files = getFilesList(filename)
compress = zipfile.ZipFile(outpath, "w", zipfile.ZIP_DEFLATED)
for i in files:
dirs = os.path.split(i)
# print i, dirs[-1]
compress.write(i, dirs[-1], zipfile.ZIP_DEFLATED)
compress.close()
def getFilesList(filename):
dirname = os.path.dirname(filename)
handler = DocumentHandler(dirname)
parser = defused_sax.make_parser()
parser.setContentHandler(handler)
parser.parse(filename)
files = []
files.append(filename)
files.extend(iter(handler.files))
dirname = os.path.join(dirname, "GuiDocument.xml")
if os.path.exists(dirname):
files.append(dirname)
return files