You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/filters/kword/latex/export/formula.cc

183 lines
5.6 KiB

/*
** A program to convert the XML rendered by KWord into LATEX.
**
** Copyright (C) 2000 Robert JACOLIN
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Library General Public
** License as published by the Free Software Foundation; either
** version 2 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Library General Public License for more details.
**
** To receive a copy of the GNU Library General Public License, write to the
** Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**
*/
#include <stdlib.h> /* for atoi function */
#include <kdebug.h> /* for kdDebug() stream */
#include <tqptrstack.h> /* for getFormula() */
#include <tqdom.h>
#include "formula.h"
#include <tdeapplication.h>
#include <kformuladocument.h>
#include <kformulamimesource.h>
/*******************************************/
/* Constructor */
/*******************************************/
Formula::Formula()
{
_left = 0;
_right = 0;
_top = 0;
_bottom = 0;
_runaround = TA_NONE;
_runaroundGap = 0;
_autoCreate = TC_EXTEND;
_newFrameBehaviour = TF_RECONNECT;
}
/*******************************************/
/* analyse */
/*******************************************/
void Formula::analyse(const TQDomNode balise)
{
/* MARKUP TYPE : FRAMESET INFO = TEXTE, ENTETE CONNUE */
/* Parameters Analyse */
Element::analyse(balise);
kdDebug(30522) << "FRAME ANALYSE (Formula)" << endl;
/* Chlidren markups Analyse */
for(int index= 0; index < getNbChild(balise); index++)
{
if(getChildName(balise, index).compare("FRAME")== 0)
{
analyseParamFrame(balise);
}
else if(getChildName(balise, index).compare("FORMULA")== 0)
{
getFormula(getChild(getChild(balise, "FORMULA"), "FORMULA"), 0);
kdDebug(30522) << _formula << endl;
}
}
kdDebug(30522) << "END OF A FRAME" << endl;
}
/*******************************************/
/* getFormula */
/*******************************************/
/* Get back the xml markup tree. */
/*******************************************/
void Formula::getFormula(TQDomNode p, int indent)
{
switch( p.nodeType() )
{
case TQDomNode::TextNode:
_formula = _formula + TQString(p.toText().data()) + " ";
break;
/* case TT_Space:
_formula = _formula + p->zText;
//printf("%*s\"%s\"\n", indent, "", p->zText);
break;
case TT_EOL:
_formula = _formula + "\n";
//printf("%*s\n", indent, "");
break;*/
case TQDomNode::ElementNode:
_formula = _formula + "<" + p.nodeName();
TQDomNamedNodeMap attr = p.attributes();
for(unsigned int index = 0; index < attr.length(); index++)
{ // The attributes
_formula = _formula + " " + attr.item(index).nodeName();
_formula = _formula + "=\"" + attr.item(index).nodeValue() + "\"";
}
if(p.childNodes().length() == 0)
_formula = _formula + "/>\n";
else
{
_formula = _formula + ">\n";
TQDomNodeList child = p.childNodes();
for(unsigned int index = 0; index < child.length(); index++)
{
getFormula(child.item(index), indent + 3); // The child elements
}
_formula = _formula + "</" + p.nodeName() + ">\n";
}
break;
/*case TQDomNode::AttributeNode:
case TQDomNode::CDATASectionNode:
case TQDomNode::EntityReferenceNode:
case TQDomNode::EntityNode:
case TQDomNode::ProcessingInstructionNode:
case TQDomNode::CommentNode:
case TQDomNode::DocumentNode:
case TQDomNode::DocumentTypeNode:
case TQDomNode::DocumentFragmentNode:
case TQDomNode::NotationNode:
case TQDomNode::BaseNode:
case TQDomNode::CharacterDataNode:
break;*/
//default:
//kdError(30522) << "Can't happen" << endl;
//break;
}
}
/*******************************************/
/* analyseParamFrame */
/*******************************************/
void Formula::analyseParamFrame(const TQDomNode balise)
{
/*<FRAME left="28" top="42" right="566" bottom="798" runaround="1" />*/
_left = getAttr(balise, "left").toInt();
_top = getAttr(balise, "top").toInt();
_right = getAttr(balise, "right").toInt();
_bottom = getAttr(balise, "bottom").toInt();
setRunAround(getAttr(balise, "runaround").toInt());
setAroundGap(getAttr(balise, "runaroundGap").toInt());
setAutoCreate(getAttr(balise, "autoCreateNewFrame").toInt());
setNewFrame(getAttr(balise, "newFrameBehaviour").toInt());
setSheetSide(getAttr(balise, "sheetside").toInt());
}
/*******************************************/
/* generate */
/*******************************************/
void Formula::generate(TQTextStream &out)
{
kdDebug(30522) << "FORMULA GENERATION" << endl;
TQDomDocument doc;
doc.setContent(_formula);
// a new KFormula::Document for every formula is not the best idea.
// better to have only one such beast for the whole document.
KFormula::DocumentWrapper* wrapper = new KFormula::DocumentWrapper( kapp->config(), 0 );
KFormula::Document* formulaDoc = new KFormula::Document;
wrapper->document( formulaDoc );
KFormula::Container* formula = formulaDoc->createFormula();
if ( !formula->load( doc.documentElement () ) ) {
kdError(30522) << "Failed." << endl;
}
out << "$" << formula->texString() << "$";
delete formula;
delete wrapper;
}