/***************************************************************************
thmlhtmlhref.cpp - ThML to HTML filter with hrefs
-------------------
begin : 2001-09-03
copyright : 2001 by CrossWire Bible Society
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <thmlhtmlhref.h>
#include <swmodule.h>
SWORD_NAMESPACE_START
ThMLHTMLHREF::ThMLHTMLHREF() {
setTokenStart("<");
setTokenEnd(">");
/*
setEscapeStart("&");
setEscapeEnd(";");
setEscapeStringCaseSensitive(true);
addEscapeStringSubstitute("nbsp", " ");
addEscapeStringSubstitute("quot", "\"");
addEscapeStringSubstitute("amp", "&");
addEscapeStringSubstitute("lt", "<");
addEscapeStringSubstitute("gt", ">");
addEscapeStringSubstitute("brvbar", "|");
addEscapeStringSubstitute("sect", "§");
addEscapeStringSubstitute("copy", "©");
addEscapeStringSubstitute("laquo", "«");
addEscapeStringSubstitute("reg", "®");
addEscapeStringSubstitute("acute", "´");
addEscapeStringSubstitute("para", "¶");
addEscapeStringSubstitute("raquo", "»");
addEscapeStringSubstitute("Aacute", "Á");
addEscapeStringSubstitute("Agrave", "À");
addEscapeStringSubstitute("Acirc", "Â");
addEscapeStringSubstitute("Auml", "Ä");
addEscapeStringSubstitute("Atilde", "Ã");
addEscapeStringSubstitute("Aring", "Å");
addEscapeStringSubstitute("aacute", "á");
addEscapeStringSubstitute("agrave", "à");
addEscapeStringSubstitute("acirc", "â");
addEscapeStringSubstitute("auml", "ä");
addEscapeStringSubstitute("atilde", "ã");
addEscapeStringSubstitute("aring", "å");
addEscapeStringSubstitute("Eacute", "É");
addEscapeStringSubstitute("Egrave", "È");
addEscapeStringSubstitute("Ecirc", "Ê");
addEscapeStringSubstitute("Euml", "Ë");
addEscapeStringSubstitute("eacute", "é");
addEscapeStringSubstitute("egrave", "è");
addEscapeStringSubstitute("ecirc", "ê");
addEscapeStringSubstitute("euml", "ë");
addEscapeStringSubstitute("Iacute", "Í");
addEscapeStringSubstitute("Igrave", "Ì");
addEscapeStringSubstitute("Icirc", "Î");
addEscapeStringSubstitute("Iuml", "Ï");
addEscapeStringSubstitute("iacute", "í");
addEscapeStringSubstitute("igrave", "ì");
addEscapeStringSubstitute("icirc", "î");
addEscapeStringSubstitute("iuml", "ï");
addEscapeStringSubstitute("Oacute", "Ó");
addEscapeStringSubstitute("Ograve", "Ò");
addEscapeStringSubstitute("Ocirc", "Ô");
addEscapeStringSubstitute("Ouml", "Ö");
addEscapeStringSubstitute("Otilde", "Õ");
addEscapeStringSubstitute("oacute", "ó");
addEscapeStringSubstitute("ograve", "ò");
addEscapeStringSubstitute("ocirc", "ô");
addEscapeStringSubstitute("ouml", "ö");
addEscapeStringSubstitute("otilde", "õ");
addEscapeStringSubstitute("Uacute", "Ú");
addEscapeStringSubstitute("Ugrave", "Ù");
addEscapeStringSubstitute("Ucirc", "Û");
addEscapeStringSubstitute("Uuml", "Ü");
addEscapeStringSubstitute("uacute", "ú");
addEscapeStringSubstitute("ugrave", "ù");
addEscapeStringSubstitute("ucirc", "û");
addEscapeStringSubstitute("uuml", "ü");
addEscapeStringSubstitute("Yacute", "Ý");
addEscapeStringSubstitute("yacute", "ý");
addEscapeStringSubstitute("yuml", "ÿ");
addEscapeStringSubstitute("deg", "°");
addEscapeStringSubstitute("plusmn", "±");
addEscapeStringSubstitute("sup2", "²");
addEscapeStringSubstitute("sup3", "³");
addEscapeStringSubstitute("sup1", "¹");
addEscapeStringSubstitute("nbsp", "º");
addEscapeStringSubstitute("pound", "£");
addEscapeStringSubstitute("cent", "¢");
addEscapeStringSubstitute("frac14", "¼");
addEscapeStringSubstitute("frac12", "½");
addEscapeStringSubstitute("frac34", "¾");
addEscapeStringSubstitute("iquest", "¿");
addEscapeStringSubstitute("iexcl", "¡");
addEscapeStringSubstitute("ETH", "Ð");
addEscapeStringSubstitute("eth", "ð");
addEscapeStringSubstitute("THORN", "Þ");
addEscapeStringSubstitute("thorn", "þ");
addEscapeStringSubstitute("AElig", "Æ");
addEscapeStringSubstitute("aelig", "æ");
addEscapeStringSubstitute("Oslash", "Ø");
addEscapeStringSubstitute("curren", "¤");
addEscapeStringSubstitute("Ccedil", "Ç");
addEscapeStringSubstitute("ccedil", "ç");
addEscapeStringSubstitute("szlig", "ß");
addEscapeStringSubstitute("Ntilde", "Ñ");
addEscapeStringSubstitute("ntilde", "ñ");
addEscapeStringSubstitute("yen", "¥");
addEscapeStringSubstitute("not", "¬");
addEscapeStringSubstitute("ordf", "ª");
addEscapeStringSubstitute("uml", "¨");
addEscapeStringSubstitute("shy", "");
addEscapeStringSubstitute("macr", "¯");
*/
setTokenCaseSensitive(true);
addTokenSubstitute("note", " <font color=\"#800000\"><small>(");
addTokenSubstitute("/note", ")</small></font> ");
addTokenSubstitute("/scripture", "</i> ");
}
bool ThMLHTMLHREF::handleToken(char **buf, const char *token, DualStringMap &userData) {
const char *tok;
if (!substituteToken(buf, token)) {
// manually process if it wasn't a simple substitution
if (!strncmp(token, "sync ", 5)) {
if(strstr(token,"type=\"morph\"")){
pushString(buf, "<small><em> (<a href=\"");
}
else
pushString(buf, "<small><em> <<a href=\"");
for (tok = token + 5; *(tok+1); tok++)
if(*tok != '\"')
*(*buf)++ = *tok;
pushString(buf, "\">");
//scan for value and add it to the buffer
for (tok = token + 5; *tok; tok++) {
if (!strncmp(tok, "value=\"", 7)) {
if(strstr(token,"type=\"morph\""))
tok += 7;
else
tok += 8;
for (;*tok != '\"'; tok++)
*(*buf)++ = *tok;
break;
}
}
if(strstr(token,"type=\"morph\""))
pushString(buf, "</a>) </em></small>");
else
pushString(buf, "</a>> </em></small>");
}
else if (!strncmp(token, "scripture ", 10)) {
userData["inscriptRef"] = "true";
pushString(buf, "<i>");
}
else if (!strncmp(token, "scripRef p", 10) || !strncmp(token, "scripRef v", 10)) {
userData["inscriptRef"] = "true";
pushString(buf, "<a href=\"");
for (const char *tok = token + 9; *(tok+1); tok++)
if(*tok != '\"')
*(*buf)++ = *tok;
*(*buf)++ = '\"';
*(*buf)++ = '>';
}
// we're starting a scripRef like "<scripRef>John 3:16</scripRef>"
else if (!strcmp(token, "scripRef")) {
userData["inscriptRef"] = "false";
// let's stop text from going to output
userData["suspendTextPassThru"] = "true";
}
// we've ended a scripRef
else if (!strcmp(token, "/scripRef")) {
if (userData["inscriptRef"] == "true") { // like "<scripRef passage="John 3:16">John 3:16</scripRef>"
userData["inscriptRef"] = "false";
pushString(buf, "</a>");
}
else { // like "<scripRef>John 3:16</scripRef>"
pushString(buf, "<a href=\"passage=");
//char *strbuf = (char *)userData["lastTextNode"].c_str();
pushString(buf, userData["lastTextNode"].c_str());
*(*buf)++ = '\"';
*(*buf)++ = '>';
pushString(buf, userData["lastTextNode"].c_str());
// let's let text resume to output again
userData["suspendTextPassThru"] = "false";
pushString(buf, "</a>");
}
}
else if (!strncmp(token, "div class=\"sechead\"", 19)) {
userData["SecHead"] = "true";
pushString(buf, "<br /><b><i>");
}
else if (!strncmp(token, "div class=\"title\"", 19)) {
userData["SecHead"] = "true";
pushString(buf, "<br /><b><i>");
}
else if (!strncmp(token, "/div", 4)) {
if (userData["SecHead"] == "true") {
pushString(buf, "</i></b><br />");
userData["SecHead"] = "false";
}
}
/*
else if (!strncmp(token, "sync type=\"Strongs\" value=\"T", 28)) {
pushString(buf, "<a href=\"");
for (tok = token + 5; *(tok+1); tok++)
if(*tok != '\"')
*(*buf)++ = *tok;
*(*buf)++ = '\"';
*(*buf)++ = '>';
for (tok = token + 29; *(tok+2); tok++)
if(*tok != '\"')
*(*buf)++ = *tok;
pushString(buf, "</a>");
}
*/
else if (!strncmp(token, "img ", 4)) {
const char *src = strstr(token, "src");
if (!src) // assert we have a src attribute
return false;
*(*buf)++ = '<';
for (const char *c = token; *c; c++) {
if (c == src) {
for (;((*c) && (*c != '"')); c++)
*(*buf)++ = *c;
if (!*c) { c--; continue; }
*(*buf)++ = '"';
if (*(c+1) == '/') {
pushString(buf, "file:");
pushString(buf, module->getConfigEntry("AbsoluteDataPath"));
if (*((*buf)-1) == '/')
c++; // skip '/'
}
continue;
}
*(*buf)++ = *c;
}
*(*buf)++ = '>';
}
else if (!strncmp(token, "note", 4)) {
pushString(buf, " <small><font color=\"#800000\">(");
}
else {
*(*buf)++ = '<';
for (const char *tok = token; *tok; tok++)
*(*buf)++ = *tok;
*(*buf)++ = '>';
//return false; // we still didn't handle token
}
}
return true;
}
SWORD_NAMESPACE_END