comparison python/libs/project.py @ 67:99bf4f7d47f4

Changed project storage
author windel
date Fri, 12 Oct 2012 16:11:31 +0200
parents 32078200cdd6
children 654c5ac4f2c5
comparison
equal deleted inserted replaced
66:bcd55a341512 67:99bf4f7d47f4
1 """ 1 """
2 Project that can be stored to and loaded from XML. 2 source project
3 contains:
4 - modules
5 - primitives like functions, types and variables
6 - other modules
7
3 """ 8 """
4 9
5 from xml.sax import ContentHandler, make_parser 10 import json
6 import xml.dom.minidom as md
7 import os.path
8
9 class ProjectContentHandler(ContentHandler):
10 def __init__(self, project):
11 self.project = project
12 self.inFiles = False
13 def startElement(self, name, attrs):
14 if name == 'Project':
15 self.project.name = attrs['name']
16 if name == 'Files':
17 self.inFiles = True
18 if name == 'File' and self.inFiles:
19 self.project.files.append(attrs['Filename'])
20 def endElement(self, name):
21 if name == 'Files':
22 self.inFiles = False
23
24 class ProjectFile:
25 def __init__(self, filename):
26 self.filename = filename
27 11
28 class Project: 12 class Project:
29 def __init__(self, filename, isnew=False): 13 def __init__(self, filename=None):
30 self.name = "" 14 self.name = ""
31 self.files = [] 15 self.modules = []
16 self.elements = []
32 self.settings = {} 17 self.settings = {}
33 self.filename = filename 18 self.filename = filename
34 19
35 if not isnew: 20 if self.filename:
36 """ Load the project from the XML file """ 21 """ Load the project from the XML file """
37 parser = make_parser() 22 with open(self.filename, 'r') as f:
38 handler = ProjectContentHandler(self) 23 d = json.load(f)
39 parser.setContentHandler(handler) 24 self.elements = d['elements']
40 parser.parse(filename)
41 25
42 def save(self, filename): 26 def save(self):
43 """ Save the project in XML format """ 27 if self.filename:
44 # Create document: 28 d = {'elements': self.elements}
45 doc = md.Document() 29 print(d)
46 # Add project: 30 with open(self.filename, 'w') as f:
47 project = doc.createElement("Project") 31 json.dump(d, f)
48 project.setAttribute("name", self.name)
49 doc.appendChild(project)
50 32
51 # Add project files:
52 filesNode = doc.createElement("Files")
53 project.appendChild(filesNode)
54 for f in self.files:
55 fe = doc.createElement("File")
56 fe.setAttribute("Filename", f)
57 filesNode.appendChild(fe)
58
59 # Write the XML file:
60 xml = doc.toprettyxml()
61 with open(filename, 'w') as f:
62 f.write(xml)
63
64 def loadProjectFile(self, filename):
65 basedir = os.path.dirname(self.filename)
66 filename = os.path.join(basedir, filename)
67 with open(filename, 'r') as f:
68 src = f.read()
69 return src
70