OSDN Git Service

Merge 2013.1.
[nvdajp/nvdajp.git] / source / XMLFormatting.py
1 from xml.parsers import expat\r
2 import textInfos\r
3 from logHandler import log\r
4 \r
5 class XMLTextParser(object): \r
6 \r
7         def __init__(self):\r
8                 self.parser=expat.ParserCreate('utf-8')\r
9                 self.parser.StartElementHandler=self._startElementHandler\r
10                 self.parser.EndElementHandler=self._EndElementHandler\r
11                 self.parser.CharacterDataHandler=self._CharacterDataHandler\r
12                 self._commandList=[]\r
13 \r
14         def _startElementHandler(self,tagName,attrs):\r
15                 if tagName=='unich':\r
16                         data=attrs.get('value',None)\r
17                         if data is not None:\r
18                                 try:\r
19                                         data=unichr(int(data))\r
20                                 except ValueError:\r
21                                         data=u'\ufffd'\r
22                                 self._CharacterDataHandler(data)\r
23                         return\r
24                 elif tagName=='control':\r
25                         newAttrs=textInfos.ControlField(attrs)\r
26                         self._commandList.append(textInfos.FieldCommand("controlStart",newAttrs))\r
27                 elif tagName=='text':\r
28                         newAttrs=textInfos.FormatField(attrs)\r
29                         self._commandList.append(textInfos.FieldCommand("formatChange",newAttrs))\r
30                 else:\r
31                         raise ValueError("Unknown tag name: %s"%tagName)\r
32 \r
33                 # Normalise attributes common to both field types.\r
34                 try:\r
35                         newAttrs["_startOfNode"] = newAttrs["_startOfNode"] == "1"\r
36                 except KeyError:\r
37                         pass\r
38                 try:\r
39                         newAttrs["_endOfNode"] = newAttrs["_endOfNode"] == "1"\r
40                 except KeyError:\r
41                         pass\r
42 \r
43         def _EndElementHandler(self,tagName):\r
44                 if tagName=="control":\r
45                         self._commandList.append(textInfos.FieldCommand("controlEnd",None))\r
46                 elif tagName in ("text","unich"):\r
47                         pass\r
48                 else:\r
49                         raise ValueError("unknown tag name: %s"%tagName)\r
50 \r
51         def _CharacterDataHandler(self,data):\r
52                 cmdList=self._commandList\r
53                 if cmdList and isinstance(cmdList[-1],basestring):\r
54                         cmdList[-1]+=data\r
55                 else:\r
56                         cmdList.append(data)\r
57 \r
58         def parse(self,XMLText):\r
59                 try:\r
60                         self.parser.Parse(XMLText.encode('utf-8'))\r
61                 except:\r
62                         log.error("XML: %s"%XMLText,exc_info=True)\r
63                 return self._commandList\r