|
|
|
/***************************************************************************
|
|
|
|
File: ks_gbfhtml.cpp
|
|
|
|
Project: Kio-Sword -- An ioslave for SWORD and KDE
|
|
|
|
Copyright: Copyright (C) 2004-2005 Luke Plant
|
|
|
|
and CrossWire Bible Society 2003
|
|
|
|
(file based on gbfhtmlhref.cpp and osiscgi.cpp)
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
* 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; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program 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 General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
|
* along with this program; if not, write to the *
|
|
|
|
* Free Software Foundation, Inc., *
|
|
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "ks_gbfhtml.h"
|
|
|
|
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
#include <swmodule.h>
|
|
|
|
#include <utilxml.h>
|
|
|
|
#include <versekey.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
using namespace sword;
|
|
|
|
|
|
|
|
namespace KioSword {
|
|
|
|
GBFHTML::GBFHTML() {
|
|
|
|
setTokenStart("<");
|
|
|
|
setTokenEnd(">");
|
|
|
|
|
|
|
|
setTokenCaseSensitive(true);
|
|
|
|
|
|
|
|
//addTokenSubstitute("Rf", ")</small></font>");
|
|
|
|
addTokenSubstitute("FA", "<font color=\"#800000\">"); // for ASV footnotes to mark text
|
|
|
|
addTokenSubstitute("Rx", "</a>");
|
|
|
|
addTokenSubstitute("FI", "<i>"); // italics begin
|
|
|
|
addTokenSubstitute("Fi", "</i>");
|
|
|
|
addTokenSubstitute("FB", "<b>"); // bold begin
|
|
|
|
addTokenSubstitute("Fb", "</b>");
|
|
|
|
addTokenSubstitute("FR", "<span class='jesusquote'>"); // words of Jesus begin
|
|
|
|
addTokenSubstitute("Fr", "</span>");
|
|
|
|
addTokenSubstitute("FU", "<u>"); // underline begin
|
|
|
|
addTokenSubstitute("Fu", "</u>");
|
|
|
|
addTokenSubstitute("FO", "<cite>"); // Old Testament quote begin
|
|
|
|
addTokenSubstitute("Fo", "</cite>");
|
|
|
|
addTokenSubstitute("FS", "<sup>"); // Superscript begin// Subscript begin
|
|
|
|
addTokenSubstitute("Fs", "</sup>");
|
|
|
|
addTokenSubstitute("FV", "<sub>"); // Subscript begin
|
|
|
|
addTokenSubstitute("Fv", "</sub>");
|
|
|
|
addTokenSubstitute("TT", "<span class='title'>"); // Book title begin
|
|
|
|
addTokenSubstitute("Tt", "</span>");
|
|
|
|
addTokenSubstitute("PP", "<cite>"); // poetry begin
|
|
|
|
addTokenSubstitute("Pp", "</cite>");
|
|
|
|
addTokenSubstitute("Fn", "</font>"); // font end
|
|
|
|
addTokenSubstitute("CL", "<br />"); // new line
|
|
|
|
addTokenSubstitute("CM", "<br />"); // non showing comment
|
|
|
|
addTokenSubstitute("CG", ""); // ???
|
|
|
|
addTokenSubstitute("CT", ""); // ???
|
|
|
|
addTokenSubstitute("JR", "<div align=\"right\">"); // right align begin
|
|
|
|
addTokenSubstitute("JC", "<div align=\"center\">"); // center align begin
|
|
|
|
addTokenSubstitute("JL", "</div>"); // align end
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool GBFHTML::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) {
|
|
|
|
const char *tok;
|
|
|
|
char val[128];
|
|
|
|
char *valto;
|
|
|
|
const char *num;
|
|
|
|
MyUserData *u = (MyUserData *)userData;
|
|
|
|
|
|
|
|
if (!substituteToken(buf, token)) {
|
|
|
|
XMLTag tag(token);
|
|
|
|
if (!strncmp(token, "w", 1)) {
|
|
|
|
// OSIS Word (temporary until OSISRTF is done)
|
|
|
|
valto = val;
|
|
|
|
num = strstr(token, "lemma=\"x-Strongs:");
|
|
|
|
if (num) {
|
|
|
|
for (num+=17; ((*num) && (*num != '\"')); num++)
|
|
|
|
*valto++ = *num;
|
|
|
|
*valto = 0;
|
|
|
|
if (atoi((!isdigit(*val))?val+1:val) < 5627) {
|
|
|
|
buf += " <span class='strongs'><<a href=\"";
|
|
|
|
buf += swordUrlForSearch(GREEKSTRONGS, val, m_swordoptions).utf8();
|
|
|
|
buf += "\">";
|
|
|
|
for (tok = (!isdigit(*val))?val+1:val; *tok; tok++)
|
|
|
|
buf += *tok;
|
|
|
|
buf += "</a>></span> ";
|
|
|
|
//cout << buf;
|
|
|
|
|
|
|
|
}
|
|
|
|
/* forget these for now
|
|
|
|
else {
|
|
|
|
// verb morph
|
|
|
|
sprintf(wordstr, "%03d", word-1);
|
|
|
|
module->getEntryAttributes()["Word"][wordstr]["Morph"] = val;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
valto = val;
|
|
|
|
num = strstr(token, "morph=\"x-Robinson:");
|
|
|
|
if (num) {
|
|
|
|
for (num+=18; ((*num) && (*num != '\"')); num++)
|
|
|
|
*valto++ = *num;
|
|
|
|
*valto = 0;
|
|
|
|
buf += " <span class='morph'>(<a href=\"";
|
|
|
|
buf += swordUrlForSearch(GREEKMORPH, val, m_swordoptions).utf8();
|
|
|
|
buf += "\">";
|
|
|
|
for (tok = val; *tok; tok++)
|
|
|
|
//if(*tok != '\"')
|
|
|
|
buf += *tok;
|
|
|
|
buf += "</a>)</span> ";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "WG", 2) || !strncmp(token, "WH", 2)) { // strong's numbers
|
|
|
|
buf += " <span class='strongs'><<a href=\"";
|
|
|
|
buf += swordUrlForSearch(GREEKSTRONGS, token + 2, m_swordoptions).utf8();
|
|
|
|
buf += "\">";
|
|
|
|
for (tok = token + 2; *tok; tok++)
|
|
|
|
//if(token[i] != '\"')
|
|
|
|
buf += *tok;
|
|
|
|
buf += "</a>></span> ";
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "WTG", 3) || !strncmp(token, "WTH", 3)) { // strong's numbers tense
|
|
|
|
buf += " <span class='morph'>(<a href=\"";
|
|
|
|
buf += swordUrlForSearch(GREEKMORPH, token + 3, m_swordoptions).utf8();
|
|
|
|
buf += "\">";
|
|
|
|
for (tok = token + 3; *tok; tok++)
|
|
|
|
if(*tok != '\"')
|
|
|
|
buf += *tok;
|
|
|
|
buf += "</a>)</span> ";
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "WT", 2) && strncmp(token, "WTH", 3) && strncmp(token, "WTG", 3)) { // morph tags
|
|
|
|
buf += " <span class='morph'>(<a href=\"";
|
|
|
|
buf += swordUrlForSearch(GREEKMORPH, token + 2, m_swordoptions).utf8();
|
|
|
|
buf += "\">";
|
|
|
|
for (tok = token + 2; *tok; tok++)
|
|
|
|
if(*tok != '\"')
|
|
|
|
buf += *tok;
|
|
|
|
buf += "</a>)</span>";
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strcmp(tag.getName(), "RX")) {
|
|
|
|
buf += "<a href=\"";
|
|
|
|
buf += swordUrlForSearch(DEFBIBLE, token + 3, m_swordoptions).utf8();
|
|
|
|
|
|
|
|
/* FIXME - restore this, work out what it does
|
|
|
|
for (tok = token + 3; *tok; tok++) {
|
|
|
|
if(*tok != '<' && *tok+1 != 'R' && *tok+2 != 'x') {
|
|
|
|
buf += *tok;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
buf += "\">";
|
|
|
|
}
|
|
|
|
|
|
|
|
// FIXME - modify for Kio-Sword
|
|
|
|
else if (!strcmp(tag.getName(), "RF")) {
|
|
|
|
SWBuf type = tag.getAttribute("type");
|
|
|
|
SWBuf footnoteNumber = tag.getAttribute("swordFootnote");
|
|
|
|
const VerseKey *vkey;
|
|
|
|
// see if we have a VerseKey * or descendant
|
|
|
|
try {
|
|
|
|
vkey = SWDYNAMIC_CAST(const VerseKey, u->key);
|
|
|
|
}
|
|
|
|
catch ( ... ) { }
|
|
|
|
if (vkey) {
|
|
|
|
// leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt.
|
|
|
|
//char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n');
|
|
|
|
buf.appendFormatted("<a href=\"noteID=%s.%c.%s\"><small><sup>*%c</sup></small></a> ", vkey->getText(), 'n', footnoteNumber.c_str(), 'n');
|
|
|
|
}
|
|
|
|
u->suspendTextPassThru = true;
|
|
|
|
}
|
|
|
|
else if (!strcmp(tag.getName(), "Rf")) {
|
|
|
|
u->suspendTextPassThru = false;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
else if (!strncmp(token, "RB", 2)) {
|
|
|
|
buf += "<i> ";
|
|
|
|
u->hasFootnotePreTag = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "Rf", 2)) {
|
|
|
|
buf += " <a href=\"note=";
|
|
|
|
buf += u->lastTextNode.c_str();
|
|
|
|
buf += "\">";
|
|
|
|
buf += "<small><sup>*n</sup></small></a> ";
|
|
|
|
// let's let text resume to output again
|
|
|
|
u->suspendTextPassThru = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "RF", 2)) {
|
|
|
|
if (u->hasFootnotePreTag) {
|
|
|
|
u->hasFootnotePreTag = false;
|
|
|
|
buf += "</i> ";
|
|
|
|
}
|
|
|
|
u->suspendTextPassThru = true;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
else if (!strncmp(token, "FN", 2)) {
|
|
|
|
buf += "<font face=\"";
|
|
|
|
for (tok = token + 2; *tok; tok++)
|
|
|
|
if(*tok != '\"')
|
|
|
|
buf += *tok;
|
|
|
|
buf += "\">";
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!strncmp(token, "CA", 2)) { // ASCII value
|
|
|
|
buf += (char)atoi(&token[2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|