#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define integer long
#include "dvi2html.h"
static char *font[256];
static int size[256];
static int mag[256];
static int topmargin = 150;
static int leftmargin = 106;
static int curfont = -1;
static int scalex(int x)
{
return (x/440)+leftmargin;
}
static int scaley(int y)
{
return (y/400)+topmargin;
}
void DRAW_startjob(void)
{
fprintf(stdout, "<HTML>");
fprintf(stdout, "<HEAD>");
fprintf(stdout, "</HEAD>");
fprintf(stdout, "<BODY>");
}
static int thisfont(char *f)
{
//fprintf(stderr,"'%s' vs %d '%s'?\n", f, curfont, font[curfont]);
return (curfont >= 0) && (font[curfont] != NULL) && (strcmp(font[curfont], f) == 0);
}
static void HTML_onechar(int c)
{
if (c == '<') fprintf(stdout, "<");
else if (c == '&') fprintf(stdout, "&");
else if (c == '\'') fprintf(stdout, "’");
else if (c == '`') fprintf(stdout, "‘");
else {
// fonst-specific tweaks can go here...
fputc(c, stdout);
}
}
static void HTML_char(int c)
{
if (thisfont("caecilia")) {
} else if (thisfont("caeciliab")) {
fprintf(stdout, "<B>");
} else if (thisfont("caeciliai")) {
fprintf(stdout, "<I>");
} else if (thisfont("caeciliabi")) {
fprintf(stdout, "<B><I>");
}
HTML_onechar(c);
if (thisfont("caecilia")) {
} else if (thisfont("caeciliab")) {
fprintf(stdout, "</B>");
} else if (thisfont("caeciliai")) {
fprintf(stdout, "</I>");
} else if (thisfont("caeciliabi")) {
fprintf(stdout, "</I></B>");
}
}
static void HTML_output(char *s)
{
if (thisfont("caecilia")) {
} else if (thisfont("caeciliab")) {
fprintf(stdout, "<B>");
} else if (thisfont("caeciliai")) {
fprintf(stdout, "<I>");
} else if (thisfont("caeciliabi")) {
fprintf(stdout, "<B><I>");
}
for (;;) {
int c = *s++;
if (c == '\0') break;
HTML_onechar(c);
}
if (thisfont("caecilia")) {
} else if (thisfont("caeciliab")) {
fprintf(stdout, "</B>");
} else if (thisfont("caeciliai")) {
fprintf(stdout, "</I>");
} else if (thisfont("caeciliabi")) {
fprintf(stdout, "</I></B>");
}
}
void DRAW_text(int oldhh, int oldvv, int hh_plus_font_charwidth, int vv, char *text)
{
// fprintf(stdout, "text: %d,%d %d %d %s\n", oldhh, oldvv, hh_plus_font_charwidth, vv, text);
if (strchr(text, ' ') == NULL) {// not stretchable?
fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx\">", scaley(oldvv), scalex(oldhh));
} else { // WE SHOULDN'T GET THESE ON THE KINDLE. IT DOESN'T SUPPORT JUSTIFICATION.
fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx; width: %dpx;"
" text-align: justify; text-justify: distribute; text-align-last: justify\">",
scaley(oldvv), scalex(oldhh), scalex(hh_plus_font_charwidth-oldhh)/*-8*/);
}
HTML_output(text);
fprintf(stdout, "</DIV\n>");
}
void DRAW_selfont(int p)
{
int x = size[p];
// int x = size[p]*mag[p]/1590;
if (p >> 8) fprintf(stderr, "BAD FONT NUMBER %d\n", p);
// fprintf(stderr, "sel font: %d ('%s' ?)\n", p, font[p]);
fprintf(stdout, "<!-- selfont: %d (%s at %dpts magstep %d)\n-->",
p, font[p], size[p], mag[p]);
fprintf(stdout, "</font><font face=\"Courier New\" size=%d>",
#ifdef NEVER
x < 75 ? 1
: x < 82 ? 2
: x < 84 ? 3
: x < 93 ? 4
: x < 109 ? 5
: x < 130 ? 6
: 7);
#else
// 122 1
// 129 2
// 137 2
// 152 3
// 175 4
// 206 5
// 229 6
// 282 7
x < 125 ? 1
: x < 144 ? 2
: x < 163 ? 3
: x < 190 ? 4
: x < 212 ? 5
: x < 254 ? 6
: 7);
#endif
curfont = p;
}
void DRAW_deffont(int p, char *font_name, int font_size, int scale)
{
if (p >> 8) fprintf(stderr, "BAD FONT NUMBER %d\n", p);
// fprintf(stderr, "def font[%d] as '%s'\n", p, font_name);
font[p] = strdup(font_name);
size[p] = font_size;
mag[p] = scale;
fprintf(stdout, "<!-- deffont: %d %s %d %d\n-->", p, font_name, font_size, scale);
}
void DRAW_startpage(void)
{
fprintf(stdout, "<font face=\"Courier New\" size=\"1\">");
fprintf(stdout, "<!-- startpage: -->\n");
}
void DRAW_char(int hh, int vv, int p)
{
// fprintf(stdout, "char: %d,%d %c\n", hh, vv, p);
fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx\"\n>", scaley(vv), scalex(hh));
// THESE ARE NOT SUPPORTED ON THE KINDLE
#ifdef NEVER
if (p == 28) {
HTML_output("fi");
} else if (p == 29) {
HTML_output("fl");
} else if (p == 30) {
HTML_output("ffi");
} else if (p == 27) {
HTML_output("ff");
} else if (p == 15) {
fprintf(stdout, "•");
} else if (p == 16) {
fprintf(stdout, "“");
} else if (p == 17) {
fprintf(stdout, "”");
} else if (p == 10) {
fprintf(stdout, "Ω");
} else if (p == 21) {
fprintf(stdout, "–");
} else if (p == 22) {
fprintf(stdout, "—");
} else if (p == 2) {
fprintf(stdout, "×");
} else {
fprintf(stdout, "<FONT SIZE=-2><SUP>%d</SUP></FONT>", p); // Debugging aid
}
#endif
fprintf(stdout, "BUG!");
fprintf(stdout, "</DIV>");
}
void DRAW_endpage(int page_width, int page_height, long *page_counters)
{
fprintf(stdout, "</font>");
fprintf(stdout, "<!-- endpage: %d %d -->\n", page_width, page_height);
topmargin = scaley(page_height/3200);
fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx\"><HR></DIV>",
topmargin, 0);
}
void DRAW_rule(int hh, int vv, long p, long q)
{
fprintf(stdout, "<!-- rule: %d,%d %d %d\n-->", hh, vv, p, q);
}
void DRAW_special(char *s)
{
static int href;
if (strncmp(s, "html:<a href=", 13) == 0) {
href = 1;
// fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx\"\n>%s</DIV>",
// topmargin, 0, s+5);
fprintf(stdout, "%s", s+5);
} else if (strncmp(s, "html:<a name=", 13) == 0) {
href = 0;
fprintf(stdout, "%s</a>", s+5);
} else if (strcmp(s, "html:</a>") == 0) {
if (href == 1) fprintf(stdout, "%s", s+5);
} else if (strncmp(s, "html:", 5) == 0) {
fprintf(stdout, "<DIV style=\"position: absolute; top:%dpx; left:%dpx\"\n>%s</DIV>",
topmargin, 0, s+5);
} else {
fprintf(stdout, "<!-- special: %s -->\n", s);
}
}
void DRAW_endjob(void)
{
fprintf(stdout, "</BODY>");
fprintf(stdout, "</HTML>\n");
}