23#include <tqvaluelist.h>
26#include "kformuladefs.h"
27#include "kformulacompatibility.h"
29KFORMULA_NAMESPACE_BEGIN
31const int SYMBOL_ABOVE = 20000;
32const int UNUSED_OFFSET = 1000;
39const BoxType OF_DIVIDE =
'\\' + UNUSED_OFFSET;
40const BoxType OF_POWER =
'^' + UNUSED_OFFSET;
41const BoxType OF_SQRT =
'@' + UNUSED_OFFSET;
44const BoxType OF_SUB =
'_' + UNUSED_OFFSET;
45const BoxType OF_LSUP =
'6' + UNUSED_OFFSET;
46const BoxType OF_LSUB =
'%' + UNUSED_OFFSET;
54const BoxType OF_MATRIX =
'm' + UNUSED_OFFSET;
55const BoxType OF_SEPARATOR =
'&' + UNUSED_OFFSET;
56const BoxType OF_ABOVE =
')' + UNUSED_OFFSET;
57const BoxType OF_BELOW =
']' + UNUSED_OFFSET;
58const BoxType OF_SYMBOL =
's' + UNUSED_OFFSET;
62const int INTEGRAL = SYMBOL_ABOVE + 0;
63const int SUM = SYMBOL_ABOVE + 1;
64const int PRODUCT = SYMBOL_ABOVE + 2;
65const int ARROW = SYMBOL_ABOVE + 3;
69Compatibility::Compatibility()
76 TQDomDocument doc(
"KFORMULA");
79 TQDomElement formula = readSequence(doc);
80 formula.setTagName(
"FORMULA");
81 doc.appendChild(formula);
86void Compatibility::appendNextSequence(
const TQDomDocument& doc, TQDomElement element)
88 if (hasNext() && nextToken() ==
'{') {
89 element.appendChild(readSequence(doc));
93 element.appendChild(doc.createElement(
"SEQUENCE"));
98TQDomElement Compatibility::getLastSequence(
const TQDomDocument& doc, TQDomElement sequence)
100 if (sequence.lastChild().nodeName() ==
"SEQUENCE") {
101 TQDomNode child = sequence.removeChild(sequence.lastChild());
102 return child.toElement();
105 TQDomElement newSeq = doc.createElement(
"SEQUENCE");
106 if (!sequence.lastChild().isNull()) {
107 TQDomNode child = sequence.removeChild(sequence.lastChild());
108 newSeq.appendChild(child);
115TQDomElement Compatibility::findIndexNode(
const TQDomDocument& doc, TQDomElement sequence)
117 TQDomElement element;
118 if (sequence.lastChild().nodeName() ==
"INDEX") {
119 element = sequence.lastChild().toElement();
122 element = doc.createElement(
"INDEX");
123 TQDomElement con = doc.createElement(
"CONTENT");
124 element.appendChild(con);
125 con.appendChild(getLastSequence(doc, sequence));
126 sequence.appendChild(element);
132void Compatibility::appendToSequence(TQDomElement sequence, TQDomElement element,
int leftIndexSeen)
134 if (leftIndexSeen > 0) {
135 if (sequence.lastChild().nodeName() ==
"INDEX") {
136 TQDomElement index = sequence.lastChild().toElement();
137 if ((index.firstChild().nodeName() ==
"CONTENT") &&
138 (index.firstChild().firstChild().nodeName() ==
"SEQUENCE")) {
139 TQDomElement seq = index.firstChild().firstChild().toElement();
140 if (element.nodeName() ==
"SEQUENCE") {
141 index.firstChild().replaceChild(element, seq);
144 seq.appendChild(element);
150 sequence.appendChild(element);
154TQDomElement Compatibility::readMatrix(
const TQDomDocument& doc)
156 TQDomElement element = doc.createElement(
"MATRIX");
158 uint cols = nextToken();
160 uint rows = nextToken();
162 element.setAttribute(
"ROWS", rows);
163 element.setAttribute(
"COLUMNS", cols);
165 if ((nextToken() ==
'}') && (nextToken() == OF_MATRIX) && (nextToken() ==
'{')) {
166 TQValueList<TQDomElement> matrix;
167 for (uint c = 0; c < cols; c++) {
168 for (uint r = 0; r < rows; r++) {
169 if (hasNext() && (nextToken() ==
'{')) {
170 TQDomElement tmp = readSequence(doc);
173 if (hasNext() && (nextToken() != OF_SEPARATOR)) {
178 if (hasNext() && (nextToken() !=
'}')) {
182 if (matrix.count() == rows*cols) {
183 for (uint r = 0; r < rows; r++) {
184 for (uint c = 0; c < cols; c++) {
185 element.appendChild(matrix[c*rows+r]);
198TQDomElement Compatibility::readSequence(
const TQDomDocument& doc)
201 if ((tokenLeft() > 6) && (lookAhead(1) == OF_SEPARATOR)) {
202 return readMatrix(doc);
205 int leftIndexSeen = 0;
206 TQDomElement sequence = doc.createElement(
"SEQUENCE");
209 ushort ch = nextToken();
214 if (leftIndexSeen > 0) leftIndexSeen--;
218 appendToSequence(sequence, readSequence(doc), leftIndexSeen);
226 if (!sequence.lastChild().isNull()) {
227 sequence.removeChild(sequence.lastChild());
230 TQDomElement element = doc.createElement(
"BRACKET");
231 appendToSequence(sequence, element, leftIndexSeen);
232 element.setAttribute(
"LEFT", ch);
233 element.setAttribute(
"RIGHT", (ch==
'(') ?
')' : ((ch==
'[') ?
']' :
'|'));
235 TQDomElement con = doc.createElement(
"CONTENT");
236 element.appendChild(con);
237 appendNextSequence(doc, con);
241 TQDomElement element = doc.createElement(
"FRACTION");
243 TQDomElement num = doc.createElement(
"NUMERATOR");
244 element.appendChild(num);
245 num.appendChild(getLastSequence(doc, sequence));
247 TQDomElement den = doc.createElement(
"DENOMINATOR");
248 element.appendChild(den);
249 appendNextSequence(doc, den);
251 appendToSequence(sequence, element, leftIndexSeen);
255 TQDomElement element = doc.createElement(
"ROOT");
256 TQDomElement con = doc.createElement(
"CONTENT");
257 element.appendChild(con);
258 appendNextSequence(doc, con);
260 TQDomElement ind = doc.createElement(
"INDEX");
261 element.appendChild(ind);
262 ind.appendChild(getLastSequence(doc, sequence));
264 appendToSequence(sequence, element, leftIndexSeen);
268 TQDomElement element = findIndexNode(doc, sequence);
269 TQDomElement upperRight = doc.createElement(
"UPPERRIGHT");
270 element.appendChild(upperRight);
271 appendNextSequence(doc, upperRight);
275 TQDomElement element = findIndexNode(doc, sequence);
276 TQDomElement lowerRight = doc.createElement(
"LOWERRIGHT");
277 element.appendChild(lowerRight);
278 appendNextSequence(doc, lowerRight);
282 TQDomElement upperLeft = doc.createElement(
"UPPERLEFT");
283 upperLeft.appendChild(getLastSequence(doc, sequence));
284 TQDomElement element;
285 if (sequence.lastChild().nodeName() ==
"INDEX") {
286 element = sequence.lastChild().toElement();
289 element = doc.createElement(
"INDEX");
290 TQDomElement con = doc.createElement(
"CONTENT");
291 element.appendChild(con);
292 TQDomElement seq = doc.createElement(
"SEQUENCE");
293 con.appendChild(seq);
294 appendToSequence(sequence, element, leftIndexSeen);
296 element.appendChild(upperLeft);
301 TQDomElement lowerLeft = doc.createElement(
"LOWERLEFT");
302 lowerLeft.appendChild(getLastSequence(doc, sequence));
303 TQDomElement element;
304 if (sequence.lastChild().nodeName() ==
"INDEX") {
305 element = sequence.lastChild().toElement();
308 element = doc.createElement(
"INDEX");
309 TQDomElement con = doc.createElement(
"CONTENT");
310 element.appendChild(con);
311 TQDomElement seq = doc.createElement(
"SEQUENCE");
312 con.appendChild(seq);
313 appendToSequence(sequence, element, leftIndexSeen);
315 element.appendChild(lowerLeft);
320 if (sequence.lastChild().nodeName() ==
"SEQUENCE") {
321 TQDomElement seq = sequence.lastChild().toElement();
322 if ((seq.childNodes().count() == 1) &&
323 ((seq.lastChild().nodeName() ==
"SYMBOL") ||
324 (seq.lastChild().nodeName() ==
"INDEX"))) {
325 sequence.removeChild(seq);
327 TQDomElement element = seq.lastChild().toElement();
328 TQDomElement upper = (element.nodeName() ==
"SYMBOL") ?
329 doc.createElement(
"UPPER") :
330 doc.createElement(
"UPPERMIDDLE");
331 element.appendChild(upper);
332 appendNextSequence(doc, upper);
333 appendToSequence(sequence, element, leftIndexSeen);
337 TQDomElement element = findIndexNode(doc, sequence);
338 TQDomElement upper = doc.createElement(
"UPPERMIDDLE");
339 element.appendChild(upper);
340 appendNextSequence(doc, upper);
344 if (sequence.lastChild().nodeName() ==
"SEQUENCE") {
345 TQDomElement seq = sequence.lastChild().toElement();
346 if ((seq.childNodes().count() == 1) &&
347 ((seq.lastChild().nodeName() ==
"SYMBOL") ||
348 (seq.lastChild().nodeName() ==
"INDEX"))) {
349 sequence.removeChild(seq);
351 TQDomElement element = seq.lastChild().toElement();
352 TQDomElement lower = (element.nodeName() ==
"SYMBOL") ?
353 doc.createElement(
"LOWER") :
354 doc.createElement(
"LOWERMIDDLE");
355 element.appendChild(lower);
356 appendNextSequence(doc, lower);
357 appendToSequence(sequence, element, leftIndexSeen);
361 TQDomElement element = findIndexNode(doc, sequence);
362 TQDomElement lower = doc.createElement(
"LOWERMIDDLE");
363 element.appendChild(lower);
364 appendNextSequence(doc, lower);
368 kdDebug() <<
"OF_SYMBOL" << endl;
373 TQDomElement element = doc.createElement(
"SYMBOL");
374 element.setAttribute(
"TYPE",
375 (ch==INTEGRAL) ? Integral :
376 ((ch==SUM) ? Sum : Product));
378 TQDomElement con = doc.createElement(
"CONTENT");
379 element.appendChild(con);
380 con.appendChild(readSequence(doc));
382 appendToSequence(sequence, element, leftIndexSeen);
386 TQDomElement element = doc.createElement(
"TEXT");
387 element.setAttribute(
"CHAR", TQString(TQChar(
static_cast<char>(174))));
388 element.setAttribute(
"SYMBOL",
"1");
389 appendToSequence(sequence, element, leftIndexSeen);
393 TQDomElement element = doc.createElement(
"TEXT");
394 element.setAttribute(
"CHAR", TQString(formulaString[pos-1]));
395 appendToSequence(sequence, element, leftIndexSeen);
402KFORMULA_NAMESPACE_END
TQDomDocument buildDOM(TQString text)
Builds a kformula DOM from a old formula string.