Mercurial > lcfOS
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 |