summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/tools/sgmlconv/esistools.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/Doc/tools/sgmlconv/esistools.py b/Doc/tools/sgmlconv/esistools.py
new file mode 100644
index 0000000..f44c13c
--- /dev/null
+++ b/Doc/tools/sgmlconv/esistools.py
@@ -0,0 +1,80 @@
+"""Miscellaneous utility functions useful for dealing with ESIS streams."""
+__version__ = '$Revision$'
+
+import re
+import string
+import sys
+
+
+_data_rx = re.compile(r"[^\\][^\\]*")
+
+def decode(s):
+ r = ''
+ while s:
+ m = _data_rx.match(s)
+ if m:
+ r = r + m.group()
+ s = s[len(m.group()):]
+ elif s[1] == "\\":
+ r = r + "\\"
+ s = s[2:]
+ elif s[1] == "n":
+ r = r + "\n"
+ s = s[2:]
+ else:
+ raise ValueError, "can't handle " + `s`
+ return r
+
+
+_charmap = {}
+for c in map(chr, range(256)):
+ _charmap[c] = c
+_charmap["\n"] = r"\n"
+_charmap["\\"] = r"\\"
+del c
+
+def encode(s):
+ return string.join(map(_charmap.get, s), '')
+
+
+import xml.dom.esis_builder
+
+
+class ExtendedEsisBuilder(xml.dom.esis_builder.EsisBuilder):
+ def __init__(self, *args, **kw):
+ self.__empties = {}
+ self.__is_empty = 0
+ apply(xml.dom.esis_builder.EsisBuilder.__init__, (self,) + args, kw)
+
+ def feed(self, data):
+ for line in string.split(data, '\n'):
+ if not line:
+ break
+ event = line[0]
+ text = line[1:]
+ if event == '(':
+ element = self.document.createElement(text, self.attr_store)
+ self.attr_store = {}
+ self.push(element)
+ if self.__is_empty:
+ self.__empties[text] = text
+ self.__is_empty = 0
+ elif event == ')':
+ self.pop()
+ elif event == 'A':
+ l = re.split(' ', text, 2)
+ name = l[0]
+ value = decode(l[2])
+ self.attr_store[name] = value
+ elif event == '-':
+ text = self.document.createText(decode(text))
+ self.push(text)
+ elif event == 'C':
+ return
+ elif event == 'e':
+ self.__is_empty = 1
+ else:
+ sys.stderr.write('Unknown event: %s\n' % line)
+
+ def get_empties(self):
+ return self.__empties.keys()