summaryrefslogtreecommitdiffstats
path: root/ksayit/src/docbookparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksayit/src/docbookparser.cpp')
-rw-r--r--ksayit/src/docbookparser.cpp493
1 files changed, 493 insertions, 0 deletions
diff --git a/ksayit/src/docbookparser.cpp b/ksayit/src/docbookparser.cpp
new file mode 100644
index 0000000..03b9f73
--- /dev/null
+++ b/ksayit/src/docbookparser.cpp
@@ -0,0 +1,493 @@
+//
+// C++ Implementation: docbookparser
+//
+// Description:
+//
+//
+// Author: Robert Vogl <voglrobe@lapislazuli>, (C) 2005
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+// Qt includes
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+//KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+
+// App specific includes
+#include "docbookparser.h"
+#include "docbookclasses.h"
+
+
+DocbookParser::DocbookParser(ContextMenuHandler *cmHandler)
+{
+ m_contextmenuhandler = cmHandler;
+ m_idCounter = KSayItGlobal::item_initial_id;
+}
+
+
+DocbookParser::~DocbookParser()
+{
+}
+
+
+QString DocbookParser::node2raw(QDomNode node) const
+{
+ QString ret;
+
+ // get content of element
+ QTextStream in(ret, IO_WriteOnly);
+ in.setEncoding(QTextStream::UnicodeUTF8);
+ in << node;
+
+ return ret;
+}
+
+
+/******************************************
+ * XML-Parser functions
+ ******************************************/
+//
+// DocBook parser
+//
+void DocbookParser::parseBook(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseBook()" << endl;
+ item->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( item );
+
+ // TODO: Attributes Id, Lang
+
+ // Elements (parse BookInfo before Chapter)
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="bookinfo" ){
+ parseBookInfo( node.toElement(), item );
+ break;
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="chapter" ){
+ parseChapter( node.toElement(), item );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseBook()" << endl;
+}
+
+
+void DocbookParser::parseBookInfo(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseBookInfo()" << endl;
+
+ Overview *overview = new Overview(item, NULL, i18n("Overview"));
+ overview->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( overview );
+
+ QDomText data;
+ QDomNode node = element.firstChild();
+ // fixed order
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ item->setText( 0, data.nodeValue() ); // assign title to RootItem
+ item->setValue(KSayItGlobal::RTFHEADER, data.nodeValue() );
+ item->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue() );
+
+ break;
+ }
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="authorgroup" ){
+ parseAuthorGroup( node.toElement(), overview );
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="date" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ Date *date = new Date(overview, NULL, i18n("Date"));
+ date->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ date->setText( 1, data.nodeValue() );
+ date->setValue(KSayItGlobal::RTFDATA, data.nodeValue());
+ date->setValue(KSayItGlobal::SPEAKERDATA, data.nodeValue());
+ date->setValue(KSayItGlobal::RAWDATA, node2raw(data));
+
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( date );
+ }
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="releaseinfo" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ ReleaseInfo *relinfo = new ReleaseInfo(overview, NULL, i18n("Release"));
+ relinfo->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ relinfo->setText( 1, data.nodeValue() );
+ relinfo->setValue(KSayItGlobal::RTFDATA, data.nodeValue());
+ relinfo->setValue(KSayItGlobal::SPEAKERDATA, data.nodeValue());
+ relinfo->setValue(KSayItGlobal::RAWDATA, node2raw(data));
+
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( relinfo );
+ }
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="keywordset" ){
+ parseKeywordSet( node.toElement(), overview );
+ }
+ node = node.nextSibling();
+ }
+ node = element.firstChild();
+ while( !node.isNull() ){
+ if ( node.isElement() && node.nodeName().lower()=="abstract" ){
+ parseAbstract( node.toElement(), overview );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseBookInfo()" << endl;
+}
+
+
+void DocbookParser::parseAuthorGroup(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseAuthorGroup()" << endl;
+
+ // item = overview
+ AuthorGroup *authorgroup = new AuthorGroup(item, NULL, i18n("Author(s)"));
+ authorgroup->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( authorgroup );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="author" ){
+ parseAuthor( node.toElement(), authorgroup );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseAuthorGroup()" << endl;
+}
+
+
+void DocbookParser::parseAuthor(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseAuthor()" << endl;
+
+ // item = authorgroup
+ QDomText data;
+ QDomText firstname = QDomText();
+ QDomText surname = QDomText();
+ QString s_firstname = QString::null;
+ QString s_surname = QString::null;
+
+ Author *author = new Author(item);
+ author->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="firstname" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ s_firstname = data.nodeValue();
+ firstname = data;
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="surname" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ s_surname = data.nodeValue();
+ surname = data;
+ }
+ }
+ node = node.nextSibling();
+ }
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( author );
+
+ author->setText(0, i18n("Author") );
+ author->setText(1, s_firstname + " " + s_surname);
+ author->setValue(KSayItGlobal::RTFDATA, s_firstname + " " + s_surname);
+ author->setValue(KSayItGlobal::SPEAKERDATA, s_firstname + " " + s_surname);
+ author->setValue(KSayItGlobal::RAWDATA, s_firstname + " " + s_surname);
+
+ kdDebug(100200) << "--- leaving parseAuthor()" << endl;
+}
+
+
+void DocbookParser::parseKeywordSet(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseKeywordSet()" << endl;
+
+ // item = overview
+ KeywordSet *keywordset = new KeywordSet(item, NULL, i18n("Keywords"));
+ keywordset->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( keywordset );
+
+ QDomText data;
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="keyword" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ Keyword *keyword = new Keyword(keywordset);
+ keyword->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ keyword->setText(0, data.nodeValue() );
+ keyword->setValue(KSayItGlobal::RTFDATA, data.nodeValue() );
+ keyword->setValue(KSayItGlobal::SPEAKERDATA, data.nodeValue() );
+ keyword->setValue(KSayItGlobal::RAWDATA, node2raw(data) );
+
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( keyword );
+ }
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseKeywordSet()" << endl;
+}
+
+
+void DocbookParser::parseAbstract(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseAbstract()" << endl;
+
+ // item = overview
+ QDomText data;
+ Abstract *abstract = new Abstract(item, NULL, i18n("Abstract"));
+ abstract->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( abstract );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), abstract );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseAbstract()" << endl;
+}
+
+
+void DocbookParser::parseChapter(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseChapter()" << endl;
+
+ QDomText data;
+ Chapter *chapter = new Chapter(item, NULL, i18n("Chapter"));
+ chapter->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( chapter );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ chapter->setText( 0, data.nodeValue() );
+ chapter->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ chapter->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), chapter );
+ } else if ( node.isElement() && node.nodeName().lower()=="sect1" ){
+ parseSect1( node.toElement(), chapter );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseChapter()" << endl;
+}
+
+
+void DocbookParser::parseSect1(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseSect1()" << endl;
+
+ QDomText data;
+ Sect1 *sect1 = new Sect1(item, NULL, i18n("Section Level 1"));
+ sect1->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( sect1 );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ sect1->setText( 0, data.nodeValue() );
+ sect1->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ sect1->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), sect1 );
+ } else if ( node.isElement() && node.nodeName().lower()=="sect2" ){
+ parseSect2( node.toElement(), sect1 );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseSect1()" << endl;
+}
+
+
+void DocbookParser::parseSect2(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseSect2()" << endl;
+
+ QDomText data;
+ Sect2 *sect2 = new Sect2(item, NULL, i18n("Section Level 2"));
+ sect2->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( sect2 );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ sect2->setText( 0, data.nodeValue() );
+ sect2->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ sect2->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), sect2 );
+ } else if ( node.isElement() && node.nodeName().lower()=="sect3" ){
+ parseSect3( node.toElement(), sect2 );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseSect2()" << endl;
+}
+
+
+void DocbookParser::parseSect3(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseSect3()" << endl;
+
+ QDomText data;
+ Sect3 *sect3 = new Sect3(item, NULL, i18n("Section Level 3"));
+ sect3->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( sect3 );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ sect3->setText( 0, data.nodeValue() );
+ sect3->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ sect3->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), sect3 );
+ } else if ( node.isElement() && node.nodeName().lower()=="sect4" ){
+ parseSect4( node.toElement(), sect3 );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseSect3()" << endl;
+}
+
+
+void DocbookParser::parseSect4(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseSect4()" << endl;
+
+ QDomText data;
+ Sect4 *sect4 = new Sect4(item, NULL, i18n("Section Level 4"));
+ sect4->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( sect4 );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ sect4->setText( 0, data.nodeValue() );
+ sect4->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ sect4->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), sect4 );
+ } else if ( node.isElement() && node.nodeName().lower()=="sect5" ){
+ parseSect5( node.toElement(), sect4 );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseSect4()" << endl;
+}
+
+
+void DocbookParser::parseSect5(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parseSect5()" << endl;
+
+ QDomText data;
+ Sect5 *sect5 = new Sect5(item, NULL, i18n("Section Level 4"));
+ sect5->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( sect5 );
+
+ QDomNode node = element.firstChild();
+ while( !node.isNull() ){
+ if( node.isElement() && node.nodeName().lower()=="title" ){
+ data = node.firstChild().toText();
+ if( !data.isNull() ){
+ sect5->setText( 0, data.nodeValue() );
+ sect5->setValue(KSayItGlobal::RTFHEADER, data.nodeValue());
+ sect5->setValue(KSayItGlobal::SPEAKERHEADER, data.nodeValue());
+ }
+ } else if ( node.isElement() && node.nodeName().lower()=="para" ){
+ parsePara( node.toElement(), sect5 );
+ }
+ node = node.nextSibling();
+ }
+ kdDebug(100200) << "--- leaving parseSect5()" << endl;
+}
+
+
+void DocbookParser::parsePara(const QDomElement &element, ListViewInterface *item)
+{
+ kdDebug(100200) << "+++ entering parsePara()" << endl;
+
+ Para *para = new Para(item, NULL, i18n("Paragraph"));
+ para->setText(3, QString("%1").arg(++m_idCounter).rightJustify(8,'0') );
+ // register Popup menu
+ m_contextmenuhandler->registerPopupMenu( para );
+
+ QString raw = node2raw(element);
+ // remove <para> tags
+ raw.replace( QRegExp("</?(para|Para|PARA)/?>"),"");
+ raw.replace( QRegExp("^ "),"" );
+ raw.replace( QRegExp("^\n"), "" );
+
+ para->setValue(KSayItGlobal::RAWDATA, raw);
+ para->setValue(KSayItGlobal::RTFDATA, raw);
+ para->setValue(KSayItGlobal::SPEAKERDATA, raw);
+
+ kdDebug(100200) << "--- leaving parsePara()" << endl;
+}
+
+