3 getRightmostChild(const DOM::Element& p)
7 if (DOM::Element last = g.get_lastChild())
8 if (last.get_nodeName() == "g" && last.get_firstChild())
9 return getRightmostChild(last);
20 prevLinearSibling(const DOM::Element& p)
24 DOM::Element prev = p.get_prevSibling();
26 else if (prev.get_nodeName() != "g" && prev.get_firstChild()) return prev;
27 else return prevLinearSibling(prev.get_lastChild());
34 getCore(const DOM::Element& p)
38 if (p.get_nodeName() == "sb" || p.get_nodeName() == "sp")
39 return getCore(p.get_firstChild());
47 replace(const DOM::Element& p0, const DOM::Element& p1)
49 if (DOM::Element parent = p0.get_parentNode())
50 parent.replaceChild(p0, p1);
54 isInferred(const DOM::Element& p)
56 if (p) return p.hasAttribute("id");
61 isMacro(const DOM::Element& p, const TString& s)
63 return p && p.get_nodeName() == "m" && p.getAttribute("name") == s;
67 isGroup(const DOM::Element& p)
69 return p && p.get_nodeName() == "g";
73 isSb(const DOM::Element& p)
75 return p && p.get_nodeName() == "sb";
79 isSp(const DOM::Element& p)
81 return p && p.get_nodeName() == "sp";
85 isPrimes(const DOM::Element& p)
87 return isGroup(p) && isMacro(p.get_lastChild, "prime");
91 isOperator(const DOM::Element& p)
93 if (DOM::Element core = getCore(p))
94 return dictionary.isOperator(core.get_nodeName());
100 isDelimiter(const DOM::Element& p)
102 if (DOM::Element core = getCore(p))
103 return dictionary.isDelimiter(core.get_nodeName());
109 isFunction(const DOM::Element& p)
111 if (DOM::Element core = getCore(p))
112 return dictionary.isFunction(core.get_nodeName());