root/branches/Carsten_PtrWork2/Tools/fcd2code/FCDReader.py

Revision 458, 2.7 kB (checked in by cneumann, 2 years ago)

- base templates to generate full set of access methods

for non-ptr mfields (including clear())
(full regeneration of base files in follow up commit)

- indented control statements in template files.
- do not screw up preformatted documentation from fcd files

in generated output.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1
2 import xml.sax.handler;
3 import logging;
4
5 from ListStack import ListStack;
6 from FieldContainer import FieldContainer;
7 from Field import Field;
8
9 class FCDContentHandler(xml.sax.handler.ContentHandler):
10     """A SAX-parser content handler class for .fcd files
11     """
12    
13     def __init__(self, reader):
14         self.m_log       = logging.getLogger("FCDContentHandler");
15         self.m_reader    = reader;
16         self.m_container = None;
17         self.m_elemStack = ListStack();
18    
19     def startDocument(self):
20         self.m_log.debug("startDocument");
21         self.m_elemStack.clear();
22    
23     def endDocument(self):
24         self.m_log.debug("endDocument");
25         self.m_container.finalize();
26         self.m_reader.setFieldContainer(self.m_container);
27    
28     def startElement(self, name, attr):
29         self.m_log.debug("startElement: %s", name);
30         if name == "FieldContainer":
31             container = FieldContainer();
32             self.m_container = container;
33             self.m_elemStack.push(container);
34         elif name == "Field":
35             field = Field();
36             self.m_elemStack.top().addField(field);
37             self.m_elemStack.push(field);
38         else:
39             self.m_log.error("startElement: unknown element: %s", name);
40             return;
41        
42         for i, attrName in enumerate(attr.getNames()):
43             self.m_log.debug("%s attr: %d - %s - %s", name, i, attrName, attr[attrName]);
44             self.m_elemStack.top().setFCD(attrName, attr[attrName]);
45        
46     def endElement(self, name):
47         self.m_log.debug("endElement: %s", name);
48        
49         self.m_elemStack.pop();
50    
51     def characters(self, content):
52         self.m_log.debug("characters: |%s|", content);
53        
54         currDesc = self.m_elemStack.top().getFCD("description");
55         if currDesc == None:
56             self.m_elemStack.top().setFCD("description", content.lstrip(" \t"));
57         else:
58             currDesc += content.lstrip(" \t");
59             self.m_elemStack.top().setFCD("description", currDesc);
60        
61
62 class FCDReader:
63     """Reader for .fcd files - calls a SAX parser with the FCDContentHandler
64     """
65    
66     def read(self, fileName):
67        
68         self.m_container = None;
69        
70         self.m_fcdCH = FCDContentHandler(self);
71         self.m_parser = xml.sax.make_parser();
72         self.m_parser.setContentHandler(self.m_fcdCH);
73        
74         self.m_parser.parse(fileName);
75        
76         fcdFile     = open(fileName, "r");
77         fcdContents = fcdFile.readlines();
78         fcdFile.close();
79        
80         self.m_container.setFCDContents(fcdContents);
81    
82     def setFieldContainer(self, fc):
83         self.m_container = fc;
84    
85     def getFieldContainer(self):
86         return self.m_container;
87    
Note: See TracBrowser for help on using the browser.