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.
tdeaccessibility/kttsd/filters/xhtml2ssml/xhtml2ssml.cpp

106 lines
4.0 KiB

/****************************************************************************
XHTMLToSSMLParser class
Parses a piece of XHTML markup and converts into SSML.
-------------------
Copyright:
(C) 2004 by Paul Giannaros <ceruleanblaze@gmail.com>
-------------------
Original author: Paul Giannaros <ceruleanblaze@gmail.com>
******************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; version 2 of the License. *
* *
***************************************************************************/
#include <tqstring.h>
#include <tqdict.h>
#include <tqxml.h>
#include <tqfile.h>
#include <iostream>
#include "xmlelement.h"
#include "xhtml2ssml.h"
/// Document parsing begin. Init stuff here.
bool XHTMLToSSMLParser::startDocument() {
/// Read the file which maps xhtml tags -> ssml tags. Look at the file for more information.
TQFile file("tagmappingrc");
if(!file.open(IO_ReadOnly)) {
std::cerr << "Could not read config file 'tagmappingrc'. Please check that it exists and is readable.\n";
// Kill further parsing
return false;
}
TQTextStream stream(&file);
// File parsing.
bool linestatus = true;
while(!stream.atEnd()) {
linestatus = readFileConfigEntry(stream.readLine());
// If there's some syntactical error in the file then return false.
if(!linestatus)
return false;
/// Maybe call processEvents() to prevent GUI blockages?
}
return true;
}
bool XHTMLToSSMLParser::startElement(const TQString &, const TQString &, const TQString &qName, const TQXmlAttributes &atts) {
TQString attributes = "";
if(atts.length() > 0) {
const int attsLength = atts.length();
for(int i = 0; i < attsLength; ++i)
attributes += " " + atts.qName(i) + "=\"" + atts.value(i) + "\"";
}
TQString fromelement = qName + attributes;
// If this element is one of the keys that was specified in the configuration file, get what it should be converted to and
// append to the output string.
TQString toelement = m_xhtml2ssml[fromelement];
if(toelement)
m_output.append(XMLElement::fromTQString(toelement).startTag());
return true;
}
bool XHTMLToSSMLParser::endElement(const TQString &, const TQString &, const TQString &qName) {
TQString fromelement = qName;
TQString toelement = m_xhtml2ssml[fromelement];
if(toelement)
m_output.append(XMLElement::fromTQString(toelement).endTag());
return true;
}
bool XHTMLToSSMLParser::characters(const TQString &characters) {
m_output.append(characters);
return true;
}
TQString XHTMLToSSMLParser::convertedText() {
return m_output.simplifyWhiteSpace();
}
/// Parse a line from the configuration file which maps xhtml : ssml equivalent.
/// It makes entries in the m_xhtml2ssml map accordingly.
/// @param line A line from a file to parse
/// @returns true if the syntax of the line was okay and the parsing succeeded - false otherwise.
bool XHTMLToSSMLParser::readFileConfigEntry(const TQString &line) {
// comments
if(line.stripWhiteSpace().startsWith("#")) {
return true;
}
// break into TQStringList
// the second parameter to split is the string, with all space simplified and all space around the : removed, i.e
// "something : somethingelse" -> "something:somethingelse"
TQStringList keyvalue = TQStringList::split(":", line.simplifyWhiteSpace().replace(" :", ":").replace(": ", ":"));
if(keyvalue.count() != 2)
return false;
m_xhtml2ssml[keyvalue[0]] = keyvalue[1];
return true;
}