6 #include "TDocument.hh"
10 DOM::DOMImplementation di;
12 doc = di.createDocument(TML_NS_URI, "tml:tex", dt);
13 DOM::Element root = doc.get_documentElement();
15 root.setAttributeNS(XMLNS_NS_URI, "xmlns:tml", TML_NS_URI);
17 DOM::EventTarget et(doc);
19 et.addEventListener("DOMSubtreeModified", *this, false);
22 TDocument::~TDocument()
24 //DOM::Element root = doc.get_documentElement();
25 DOM::EventTarget et(doc);
27 et.removeEventListener("DOMSubtreeModified", *this, false);
31 TDocument::serialize(const char* filename) const
33 DOM::DOMImplementation di;
34 di.saveDocumentToFile(doc, filename, GDOME_SAVE_LIBXML_INDENT);
38 TDocument::makeId(unsigned id)
46 TDocument::create(const std::string& name, unsigned id) const
48 DOM::Element elem = doc.createElementNS(TML_NS_URI, "tml:" + name);
49 if (id > 0) elem.setAttribute("id", makeId(id));
54 TDocument::createC(const std::string& name, unsigned id) const
56 TNode m = create("c", id);
62 TDocument::createT(const std::string& name, const std::string& text, unsigned id) const
64 TNode t = create(name, id);
70 TDocument::nodeDepth(const DOM::Node& node)
78 n = n.get_parentNode();
84 TDocument::findCommonAncestor(const DOM::Node& node1, const DOM::Node& node2)
89 unsigned d1 = nodeDepth(n1);
90 unsigned d2 = nodeDepth(n2);
92 cout << "finding common ancestor " << d1 << " " << d2 << endl;
97 n2 = n2.get_parentNode();
104 n1 = n1.get_parentNode();
112 n1 = n1.get_parentNode();
113 n2 = n2.get_parentNode();
120 TDocument::findIdNode(const DOM::Node& node)
125 if (n.get_nodeType() == DOM::Node::ELEMENT_NODE)
128 if (el.hasAttribute("id")) return el;
130 n = n.get_parentNode();
137 TDocument::getNodeByIdAux(const TNode& node, const std::string& id)
139 if (node.hasId(id)) return node;
141 for (TNode p = node.first(); p; p = p.next())
142 if (TNode res = getNodeByIdAux(p, id)) return res;
147 TDocument::getNodeById(unsigned id) const
149 DOM::Element root = doc.get_documentElement();
151 return getNodeByIdAux(root, makeId(id));
155 TDocument::handleEvent(const DOM::Event& ev)
157 DOM::MutationEvent me(ev);
161 cout << "TDocument::handleEvent DIRTY BEFORE = " << dirty.getAttribute("id") << endl;
163 cout << "TDocument::handleEvent DIRTY BEFORE = (nil)" << endl;
165 if (DOM::Node node = me.get_target())
167 dirty = findIdNode(findCommonAncestor(dirty, node));
169 dirty = findIdNode(node);
173 cout << "TDocument::handleEvent target = " << DOM::Node(me.get_target()).get_nodeName() << " DIRTY AFTER = "
174 << dirty.getAttribute("id") << " ME = " << DOM::Node(me.get_target()).get_nodeName() << endl;