1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
########################################################################
#
# File Name: RtfWriter.py
#
#
"""
A special, simple writer for capturing result-tree fragments
WWW: http://4suite.com/4XSLT e-mail: support@4suite.com
Copyright (c) 1999-2001 Fourthought Inc., USA. All Rights Reserved.
See http://4suite.com/COPYRIGHT for license and copyright information
"""
import string, os
import NullWriter
from xml.dom import EMPTY_NAMESPACE
from xml.xslt import XSL_NAMESPACE
from xml.xpath import Util
from xml.dom.ext import SplitQName
from xml.dom import XMLNS_NAMESPACE, Node
class RtfWriter(NullWriter.NullWriter):
def __init__(self, outputParams, ownerDoc):
self._ownerDoc = ownerDoc
self._root = ownerDoc.createDocumentFragment()
self._root.stringValue = ""
self._nodeStack = [self._root]
self._currElement = None
self._outputParams = outputParams
def getResult(self):
return self._root
def startElement(self, name, namespace=EMPTY_NAMESPACE, extraNss=None):
extraNss = extraNss or {}
prefix, localName = SplitQName(name)
new_element = self._ownerDoc.createElementNS(namespace, name)
self._nodeStack.append(new_element)
for prefix in extraNss.keys():
if prefix:
new_element.setAttributeNS(XMLNS_NAMESPACE, 'xmlns:'+prefix,
extraNss[prefix])
else:
new_element.setAttributeNS(XMLNS_NAMESPACE, 'xmlns',
extraNss[prefix])
new_element.stringValue = ""
return
def endElement(self, name):
new_element = self._nodeStack[-1]
del self._nodeStack[-1]
self._nodeStack[-1].appendChild(new_element)
return
def text(self, text, escapeOutput=1):
new_text = self._ownerDoc.createTextNode(text)
top_node = self._nodeStack[-1]
top_node.appendChild(new_text)
top_node.stringValue = top_node.stringValue + text
return
def attribute(self, name, value, namespace=EMPTY_NAMESPACE):
prefix, localName = SplitQName(name)
attr = self._ownerDoc.createAttributeNS(namespace, name)
attr.value = value
if self._nodeStack[-1].nodeType == Node.ELEMENT_NODE:
self._nodeStack[-1].attributes[(namespace, localName)] = attr
else:
#Document-fragment parent
self._nodeStack[-1].appendChild(attr)
return
def processingInstruction(self, target, data):
pi = self._ownerDoc.createProcessingInstruction(target, data)
self._nodeStack[-1].appendChild(pi)
return
def comment(self, data):
comment = self._ownerDoc.createComment(data)
self._nodeStack[-1].appendChild(comment)
return
|