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/libexport/TagProcessing.cpp

236 lines
8.5 KiB

/*
This file is part of the KDE project
Copyright (C) 2001, 2002, 2004 Nicolas GOUTTE <goutte@kde.org>
Copyright (c) 2001 IABG mbH. All rights reserved.
Contact: Wolf-Michael Bolle <Bolle@IABG.de>
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.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/*
This file is based on the old file:
/home/kde/koffice/filters/kword/ascii/asciiexport.cpp
The old file was copyrighted by
Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
Copyright (c) 2000 ID-PRO Deutschland GmbH. All rights reserved.
Contact: Wolf-Michael Bolle <Bolle@GMX.de>
The old file was licensed under the terms of the GNU Library General Public
License version 2.
*/
#include <kdebug.h>
#include <tqdom.h>
#include "TagProcessing.h"
#define DEBUG_KWORD_TAGS
// #define DEBUG_KWORD_IGNORED_TAGS
void ProcessSubtags ( const TQDomNode &parentNode,
TQValueList<TagProcessing> &tagProcessingList,
KWEFKWordLeader *leader)
{
//kdDebug(30508) << "Starting ProcessSubtags for node: " << parentNode.nodeName() << endl;
TQDomNode childNode;
for ( childNode = parentNode.firstChild (); !childNode.isNull (); childNode = childNode.nextSibling () )
{
if ( childNode.isElement () )
{
bool found = false;
TQValueList<TagProcessing>::Iterator tagProcessingIt;
for ( tagProcessingIt = tagProcessingList.begin ();
tagProcessingIt != tagProcessingList.end ();
tagProcessingIt++ )
{
if ( childNode.nodeName () == (*tagProcessingIt).name )
{
found = true;
if ( (*tagProcessingIt).processor != NULL )
{
((*tagProcessingIt).processor) ( childNode, (*tagProcessingIt).data, leader );
}
#ifdef DEBUG_KWORD_IGNORED_TAGS
else
{
kdDebug(30508) << "Ignoring " << childNode.nodeName ()
<< " tag in " << parentNode.nodeName () << endl;
}
#endif
break;
}
}
if ( !found )
{
kdDebug(30508) << "Unexpected tag " << childNode.nodeName ()
<< " in " << parentNode.nodeName () << "!" << endl;
}
}
}
//kdDebug(30508) << "Ending ProcessSubtags for node: " << parentNode.nodeName() << endl;
}
void AllowNoSubtags ( const TQDomNode& myNode, KWEFKWordLeader *leader )
{
#ifdef DEBUG_KWORD_TAGS
TQString outputText;
TQValueList<TagProcessing> tagProcessingList;
ProcessSubtags (myNode, tagProcessingList, leader);
#else
@_UNUSED( leader ):
#endif
}
AttrProcessing::AttrProcessing ( const TQString& n, const TQString& t, void *d )
: name (n), data (d)
{
if ( t == "int" )
type = AttrInt;
else if ( t == "TQString" )
type = AttrTQString;
else if ( t == "double" )
type = AttrDouble;
else if ( t == "bool" )
type = AttrBool;
else if ( t.isEmpty() )
type = AttrNull;
else
{
kdWarning(30508) << "Unknown type: " << t << " for element " << n << " assuming NULL" << endl;
type = AttrNull;
}
}
void ProcessAttributes ( const TQDomNode &myNode,
TQValueList<AttrProcessing> &attrProcessingList )
{
//kdDebug(30508) << "Starting ProcessAttributes for node: " << myNode.nodeName() << endl;
TQDomNamedNodeMap myAttribs ( myNode.attributes () );
//kdDebug(30508) << "Attributes = " << myAttribs.length () <<endl;
for ( uint i = 0; i < myAttribs.length (); i++ )
{
TQDomAttr myAttrib ( myAttribs.item (i).toAttr () );
if ( !myAttrib.isNull () )
{
bool found = false;
TQValueList<AttrProcessing>::Iterator attrProcessingIt;
for ( attrProcessingIt = attrProcessingList.begin ();
attrProcessingIt != attrProcessingList.end ();
attrProcessingIt++ )
{
//kdDebug(30508) << "NAME: " << myAttrib.name () << " == " << (*attrProcessingIt).name <<endl;
if ( myAttrib.name () == (*attrProcessingIt).name )
{
found = true;
if ( (*attrProcessingIt).data != NULL )
{
switch ( (*attrProcessingIt).type )
{
case AttrProcessing::AttrTQString:
{
*((TQString *) (*attrProcessingIt).data) = myAttrib.value ();
break;
}
case AttrProcessing::AttrInt:
{
*((int *) (*attrProcessingIt).data) = myAttrib.value ().toInt ();
break;
}
case AttrProcessing::AttrDouble:
{
*((double *) (*attrProcessingIt).data) = myAttrib.value ().toDouble ();
break;
}
case AttrProcessing::AttrBool:
{
const TQString strAttr ( myAttrib.value().simplifyWhiteSpace() );
bool flag;
if ((strAttr=="yes")||(strAttr=="1")||(strAttr=="true"))
{
flag=true;
}
else if ((strAttr=="no")||(strAttr=="0")||(strAttr=="false"))
{
flag=false;
}
else
{
flag=false;
kdWarning(30508) << "Unknown value for a boolean: " << strAttr
<< " in tag " << myNode.nodeName () << ", attribute "
<< myAttrib.name() << endl;
}
*((bool *) (*attrProcessingIt).data) = flag;
break;
}
case AttrProcessing::AttrNull:
break;
default:
{
kdDebug(30508) << "Unexpected data type " << int( (*attrProcessingIt).type )
<< " in " << myNode.nodeName ()
<< " attribute " << (*attrProcessingIt).name
<< endl;
break;
}
}
}
#ifdef DEBUG_KWORD_IGNORED_TAGS
else
{
kdDebug(30508) << "Ignoring " << myNode.nodeName()
<< " attribute " << (*attrProcessingIt).name
<< endl;
}
#endif
break;
}
}
if ( !found )
{
kdWarning(30508) << "Unexpected attribute " << myAttrib.name ()
<< " in " << myNode.nodeName () << "!" << endl;
}
}
}
//kdDebug(30508) << "Ending ProcessAttributes for node: " << myNode.nodeName() << endl;
}
void AllowNoAttributes ( const TQDomNode & myNode )
{
#ifdef DEBUG_KWORD_TAGS
TQValueList<AttrProcessing> attrProcessingList;
ProcessAttributes (myNode, attrProcessingList);
#else
Q_UNUSED( myNode );
#endif
}