FreeCAD

Форк
0
/
project_utility.py 
77 строк · 2.2 Кб
1
# (c) 2023 Werner Mayer LGPL
2

3
__title__="Document handling module"
4
__author__ = "Werner Mayer"
5
__url__ = "https://www.freecad.org"
6
__doc__ = "Tools for extracting or creating project files"
7

8

9
import os
10
import xml.sax
11
import xml.sax.handler
12
import xml.sax.xmlreader
13
import zipfile
14

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):
19
        """ Init parser """
20
        super().__init__()
21
        self.files = []
22
        self.dirname = dirname
23

24
    def startElement(self, name, attrs):
25
        item = attrs.get("file")
26
        if item is not None:
27
            self.files.append(os.path.join(self.dirname, str(item)))
28

29
    def characters(self, content):
30
        return
31

32
    def endElement(self, name):
33
        return
34

35
def extractDocument(filename, outpath):
36
    """ Extract files from project archive """
37
    zfile = zipfile.ZipFile(filename)
38
    files = zfile.namelist()
39

40
    for i in files:
41
        data = zfile.read(i)
42
        dirs = i.split("/")
43
        if len(dirs) > 1:
44
            dirs.pop()
45
            curpath = outpath
46
            for j in dirs:
47
                curpath = curpath + "/" + j
48
                os.mkdir(curpath)
49
        output = open(outpath + "/"+i, 'wb')
50
        output.write(data)
51
        output.close()
52

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)
61
    for i in files:
62
        dirs = os.path.split(i)
63
        compress.write(i, dirs[-1], zipfile.ZIP_DEFLATED)
64
    compress.close()
65

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)
73

74
    files = []
75
    files.append(filename)
76
    files.extend(iter(handler.files))
77
    return files
78

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.