Annotation of libwww/Library/src/HTTeXGen.c, revision 2.28
2.10 frystyk 1: /* HTTeXGen.c
2: ** HTML -> LaTeX CONVERTER
3: **
2.14 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.10 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.28 ! frystyk 6: ** @(#) $Id: HTTeXGen.c,v 2.27 1999/02/22 22:10:12 frystyk Exp $
2.1 frystyk 7: **
8: ** This version of the HTML object sends LaTeX to the output stream.
9: ** No attributes are considered in the translation!
10: ** The module uses simple 1:1 table-conversions, but this COULD be
11: ** expanded to a stack-machine. This would then be in start_element and
12: ** end_element...
13: ** Henrik 07/03-94
2.7 duns 14: **
15: ** HISTORY:
16: ** 8 Jul 94 FM Insulate free() from _free structure element.
17: **
2.1 frystyk 18: */
19:
20: #define BUFFER_SIZE 80 /* Line buffer attempts to make neat breaks */
2.8 frystyk 21: #define WORD_DELIMITERS ",;:[]()"
2.1 frystyk 22:
2.12 frystyk 23: /* Library include files */
2.24 frystyk 24: #include "wwwsys.h"
2.12 frystyk 25: #include "HTUtils.h"
2.1 frystyk 26: #include "HTTeXGen.h"
27: #include "HTMLPDTD.h"
2.15 frystyk 28: #include "HTStruct.h"
2.1 frystyk 29: #include "HTFormat.h"
30:
31: /* HTML Object
32: ** -----------
33: */
34:
35: struct _HTStream {
2.22 frystyk 36: const HTStreamClass * isa;
2.1 frystyk 37: HTStream * target;
38: HTStreamClass targetClass; /* COPY for speed */
39: };
40:
41: struct _HTStructured {
2.22 frystyk 42: const HTStructuredClass * isa;
2.1 frystyk 43: HTStream * target;
44: HTStreamClass targetClass; /* COPY for speed */
2.22 frystyk 45: const SGML_dtd * dtd;
2.1 frystyk 46:
2.5 frystyk 47: char buffer[2*BUFFER_SIZE]; /* See note */
2.1 frystyk 48: char * write_pointer;
49: char * line_break;
50: BOOL sensitive; /* Can we put \n */
51: BOOL preformatted; /* Is it verbatim? */
52: BOOL markup; /* If doing LaTeX markup */
53: BOOL startup; /* To skip MIME header */
54: };
2.5 frystyk 55:
56: /* The buffer has to be bigger than 80 as latex markup might make the line
57: longer before we get to flush it. */
2.1 frystyk 58:
2.25 frystyk 59: PRIVATE char *TeX_names[HTML_ELEMENTS][2] = {
2.1 frystyk 60: { "", "" }, /* HTML_A */
2.28 ! frystyk 61: { "", "" }, /* HTML_ABBR */
2.1 frystyk 62: { "", "" }, /* HTML_ACRONYM */
63: { "{\\it ", "}" }, /* HTML_ADDRESS */
2.28 ! frystyk 64: { "", "" }, /* HTML_APPLET */
2.25 frystyk 65: { "", "" }, /* HTML_AREA */
2.1 frystyk 66: { "{\\bf ", "}" }, /* HTML_B */
67: { "", "" }, /* HTML_BASE */
2.28 ! frystyk 68: { "", "" }, /* HTML_BASEFONT */
! 69: { "", "" }, /* HTML_BDO */
! 70: { "", "" }, /* HTML_BIG */
2.1 frystyk 71: { "{\\sf ", "}" }, /* HTML_BLOCKQUOTE */
72: { "", "" }, /* HTML_BODY */
73: { "", "" }, /* HTML_BR */
2.28 ! frystyk 74: { "", "" }, /* HTML_BUTTON */
2.1 frystyk 75: { "", "" }, /* HTML_CAPTION */
2.28 ! frystyk 76: { "", "" }, /* HTML_CENTER */
2.1 frystyk 77: { "\\cite{", "}" }, /* HTML_CITE */
78: { "{\\tt ", "}" }, /* HTML_CODE */
2.28 ! frystyk 79: { "", "" }, /* HTML_COL */
! 80: { "", "" }, /* HTML_COLGROUP */
2.1 frystyk 81: { "]", "" }, /* HTML_DD */
2.28 ! frystyk 82: { "", "" }, /* HTML_DEL */
2.1 frystyk 83: { "", "" }, /* HTML_DFN */
84: { "", "" }, /* HTML_DIR */
2.28 ! frystyk 85: { "", "" }, /* HTML_DIV */
2.1 frystyk 86: { "\n\\begin{description}","\n\\end{description}\n"}, /* HTML_DL */
87: { "\n\\item[", "" }, /* HTML_DT */
88: { "{\\em ", "}" }, /* HTML_EM */
2.28 ! frystyk 89: { "", "" }, /* HTML_FIELDSET */
! 90: { "", "" }, /* HTML_FONT */
2.1 frystyk 91: { "", "" }, /* HTML_FORM */
2.25 frystyk 92: { "", "" }, /* HTML_FRAME */
93: { "", "" }, /* HTML_FRAMESET */
2.1 frystyk 94: { "\n\\chapter{", "}\n" }, /* HTML_H1 */
95: { "\n\\section{", "}\n" }, /* HTML_H2 */
96: { "\n\\subsection{","}\n" }, /* HTML_H3 */
97: { "\n\\subsubsection{","}\n" }, /* HTML_H4 */
98: { "\n\\paragraph{", "}\n" }, /* HTML_H5 */
99: { "\n\\subparagraph{","}\n" }, /* HTML_H6 */
100: { "", "" }, /* HTML_HEAD */
101: { "", "" }, /* HTML_HR */
102: { "", "" }, /* HTML_HTML */
103: { "{\\it ", "}" }, /* HTML_I */
2.28 ! frystyk 104: { "", "" }, /* HTML_IFRAME */
2.8 frystyk 105: { "_FIGUR_", "" }, /* HTML_IMG */
2.1 frystyk 106: { "", "" }, /* HTML_INPUT */
2.28 ! frystyk 107: { "", "" }, /* HTML_INS */
2.1 frystyk 108: { "", "" }, /* HTML_ISINDEX */
109: { "{\\tt ", "}" }, /* HTML_KBD */
2.28 ! frystyk 110: { "", "" }, /* HTML_LABEL */
! 111: { "", "" }, /* HTML_LEGEND */
2.1 frystyk 112: { "\n\\item ", "" }, /* HTML_LI */
113: { "", "" }, /* HTML_LINK */
2.28 ! frystyk 114: { "", "" }, /* HTML_MAP */
2.1 frystyk 115: { "", "" }, /* HTML_MENU */
2.28 ! frystyk 116: { "", "" }, /* HTML_META */
2.1 frystyk 117: { "", "" }, /* HTML_NEXTID */
2.28 ! frystyk 118: { "", "" }, /* HTML_NOFRAME */
! 119: { "", "" }, /* HTML_NOSCRIPT */
2.25 frystyk 120: { "", "" }, /* HTML_OBJECT */
2.1 frystyk 121: { "\n\\begin{enumerate}\n","\n\\end{enumerate}\n"}, /* HTML_OL */
2.28 ! frystyk 122: { "", "" }, /* HTML_OPTGROUP */
2.1 frystyk 123: { "", "" }, /* HTML_OPTION */
124: { "\n\n", "" }, /* HTML_P */
2.28 ! frystyk 125: { "", "" }, /* HTML_PARAM */
2.1 frystyk 126: { "\n\\begin{verbatim}"," \\end{verbatim}\n"}, /* HTML_PRE */
127: { "", "" }, /* HTML_Q */
128: { "", "" }, /* HTML_S */
129: { "", "" }, /* HTML_SAMP */
2.28 ! frystyk 130: { "", "" }, /* HTML_SCRIPT */
2.1 frystyk 131: { "", "" }, /* HTML_SELECT */
2.28 ! frystyk 132: { "", "" }, /* HTML_SMALL */
! 133: { "", "" }, /* HTML_SPAN */
! 134: { "", "" }, /* HTML_STRIKE */
2.1 frystyk 135: { "{\\bf ", "}" }, /* HTML_STRONG */
2.28 ! frystyk 136: { "", "" }, /* HTML_STYLE */
2.1 frystyk 137: { "", "" }, /* HTML_SUB */
138: { "", "" }, /* HTML_SUP */
139: { "", "" }, /* HTML_TABLE */
2.28 ! frystyk 140: { "", "" }, /* HTML_TBODY */
2.1 frystyk 141: { "", "" }, /* HTML_TD */
142: { "", "" }, /* HTML_TEXTAREA */
2.28 ! frystyk 143: { "", "" }, /* HTML_TFOOT */
2.1 frystyk 144: { "", "" }, /* HTML_TH */
2.28 ! frystyk 145: { "", "" }, /* HTML_THEAD */
2.1 frystyk 146: { "\n\\title{", "}\n\\author{}\n\\maketitle\n"}, /* HTML_TITLE */
147: { "", "" }, /* HTML_TR */
148: { "", "" }, /* HTML_TT */
149: { "", "" }, /* HTML_U */
150: { "\n\\begin{itemize}","\n\\end{itemize}\n"}, /* HTML_UL */
2.28 ! frystyk 151: { "", "" } /* HTML_VAR */
2.1 frystyk 152: };
153:
2.8 frystyk 154: PRIVATE char *TeX_entities[HTML_ENTITIES] = {
2.1 frystyk 155: "\\AE ", /*"AElig", capital AE diphthong (ligature) */
2.2 frystyk 156: "\\\'{A}", /*"Aacute", capital A, acute accent */
157: "\\^{A}", /*"Acirc", capital A, circumflex accent */
158: "\\`{A}", /*"Agrave", capital A, grave accent */
159: "\\AA", /*"Aring", capital A, ring */
160: "\\~{A}", /*"Atilde", capital A, tilde */
161: "\\\"{A}", /*"Auml", capital A, dieresis or umlaut mark */
162: "\\c{C}", /*"Ccedil", capital C, cedilla */
163: "\\OE ", /*"ETH", capital Eth, Icelandic */
164: "\\\'{E}", /*"Eacute", capital E, acute accent */
165: "\\^{E}", /*"Ecirc", capital E, circumflex accent */
166: "\\`{E}", /*"Egrave", capital E, grave accent */
167: "\\\"{E}", /*"Euml", capital E, dieresis or umlaut mark */
168: "\\\'{I}", /*"Iacute", capital I, acute accent */
169: "\\^{I}", /*"Icirc", capital I, circumflex accent */
170: "\\`{I}", /*"Igrave", capital I, grave accent */
171: "\\\"{I}", /*"Iuml", capital I, dieresis or umlaut mark */
172: "\\~{N}", /*"Ntilde", capital N, tilde */
173: "\\\'{O}", /*"Oacute", capital O, acute accent */
174: "\\^{O}", /*"Ocirc", capital O, circumflex accent */
175: "\\`{O}", /*"Ograve", capital O, grave accent */
2.1 frystyk 176: "\\O ", /*"Oslash", capital O, slash */
2.2 frystyk 177: "\\~{O}", /*"Otilde", capital O, tilde */
178: "\\\"{O}", /*"Ouml", capital O, dieresis or umlaut mark */
179: " ", /*"THORN", capital THORN, Icelandic */
180: "\\\'{U}", /*"Uacute", capital U, acute accent */
181: "\\^{U}", /*"Ucirc", capital U, circumflex accent */
182: "\\`{U}", /*"Ugrave", capital U, grave accent */
183: "\\\"{U}", /*"Uuml", capital U, dieresis or umlaut mark */
184: "\\\'{Y}", /*"Yacute", capital Y, acute accent */
185: "\\\'{a}", /*"aacute", small a, acute accent */
186: "\\^{a}", /*"acirc", small a, circumflex accent */
2.1 frystyk 187: "\\ae ", /*"aelig", small ae diphthong (ligature) */
2.2 frystyk 188: "\\`{a}", /*"agrave", small a, grave accent */
2.1 frystyk 189: "&", /*"amp", ampersand */
190: "\\aa ", /*"aring", small a, ring */
2.2 frystyk 191: "\\~{a}", /*"atilde", small a, tilde */
192: "\\\"{a}", /*"auml", small a, dieresis or umlaut mark */
193: "\\c{c}", /*"ccedil", small c, cedilla */
194: "\\\'{e}", /*"eacute", small e, acute accent */
195: "\\^{c}", /*"ecirc", small e, circumflex accent */
196: "\\`{c}", /*"egrave", small e, grave accent */
197: "\\oe ", /*"eth", small eth, Icelandic */
198: "\\\"{e}", /*"euml", small e, dieresis or umlaut mark */
2.1 frystyk 199: ">", /*"gt", greater than */
2.2 frystyk 200: "\\\'{\\i}", /*"iacute", small i, acute accent */
201: "\\^{\\i}", /*"icirc", small i, circumflex accent */
202: "\\`{\\i}", /*"igrave", small i, grave accent */
203: "\\\"{\\i}", /*"iuml", small i, dieresis or umlaut mark */
2.1 frystyk 204: "<", /*"lt", less than */
2.2 frystyk 205: "\\~{n}", /*"ntilde", small n, tilde */
206: "\\\'{o}", /*"oacute", small o, acute accent */
207: "\\~{o}", /*"ocirc", small o, circumflex accent */
208: "\\`{o}", /*"ograve", small o, grave accent */
2.1 frystyk 209: "\\o ", /*"oslash", small o, slash */
2.2 frystyk 210: "\\~{o}", /*"otilde", small o, tilde */
211: "\\\"{o}", /*"ouml", small o, dieresis or umlaut mark */
2.8 frystyk 212: "\"", /*"quot", double quote sign - June 1994 */
2.1 frystyk 213: "\\ss ", /*"szlig", small sharp s, German (sz ligature)*/
2.2 frystyk 214: " ", /*"thorn", small thorn, Icelandic */
215: "\\\'{u}", /*"uacute", small u, acute accent */
216: "\\^{u}", /*"ucirc", small u, circumflex accent */
217: "\\`{u}", /*"ugrave", small u, grave accent */
218: "\\\"{u}", /*"uuml", small u, dieresis or umlaut mark */
219: "\\\'{y}", /*"yacute", small y, acute accent */
220: "\\\"{y}" /*"yuml", small y, dieresis or umlaut mark */
2.1 frystyk 221: };
222:
223:
224: /* Flush Buffer
225: ** ------------
226: */
2.19 frystyk 227: PRIVATE int HTTeXGen_flush (HTStructured * me)
2.1 frystyk 228: {
2.13 frystyk 229: int status;
230: if ((status =
231: (*me->targetClass.put_block)(me->target, me->buffer,
232: me->write_pointer-me->buffer)) != HT_OK)
233: return status;
2.1 frystyk 234: me->write_pointer = me->buffer;
235: me->line_break = me->buffer;
2.13 frystyk 236: return (*me->targetClass.flush)(me->target);
2.1 frystyk 237: }
238:
239:
240: /* Character handling
241: ** ------------------
242: **
243: */
2.19 frystyk 244: PRIVATE int HTTeXGen_put_character (HTStructured * me, char c)
2.1 frystyk 245: {
246: if (!me->startup) /* To skip MIME header */
2.13 frystyk 247: return HT_OK;
2.1 frystyk 248: if (c=='\n') {
249: if (me->markup || me->preformatted) { /* Put out as is and flush */
250: *me->write_pointer++ = c;
251: HTTeXGen_flush(me);
2.13 frystyk 252: return HT_OK;
2.1 frystyk 253: } else if (me->sensitive || *(me->write_pointer-1)==' ') {
2.13 frystyk 254: return HT_OK;
2.1 frystyk 255: } else
256: *me->write_pointer++ = ' '; /* Try to pretty print */
257: } else if (me->markup || me->preformatted) {
258: *me->write_pointer++ = c;
259: } else if (c==' ' || c=='\t') { /* Skip space and tabs */
260: if (*(me->write_pointer-1) != ' ')
261: *me->write_pointer++ = ' ';
262: else
2.13 frystyk 263: return HT_OK;
2.1 frystyk 264: } else {
265: if (c=='$' || c=='&' || c=='%' || c=='#' || /* Special chars */
266: c=='{' || c=='}' || c=='_') {
267: *me->write_pointer++ = '\\';
268: *me->write_pointer++ = c;
269: } else if (c=='\\') { /* Special names */
270: char *temp = "$\\backslash$";
271: strcpy(me->write_pointer, temp);
272: me->write_pointer += strlen(temp);
273: } else if (c=='^') {
274: char *temp = "$\\hat{ }$";
275: strcpy(me->write_pointer, temp);
276: me->write_pointer += strlen(temp);
277: } else if (c=='~') {
278: char *temp = "$\\tilde{ }$";
279: strcpy(me->write_pointer, temp);
280: me->write_pointer += strlen(temp);
281: } else if (c=='|' || c=='<' || c=='>') { /* Math mode */
282: *me->write_pointer++ = '$';
283: *me->write_pointer++ = c;
284: *me->write_pointer++ = '$';
285: } else
286: *me->write_pointer++ = c; /* Char seems normal */
287: }
288:
2.6 frystyk 289: if (c==' ') /* Find delimiter */
2.1 frystyk 290: me->line_break = me->write_pointer;
291: else if (strchr(WORD_DELIMITERS, c))
292: me->line_break = me->write_pointer-1;
293:
294: /* Flush buffer out when full */
295: if (me->write_pointer >= me->buffer+BUFFER_SIZE-3) {
2.9 frystyk 296: #ifdef OLD_CODE
2.1 frystyk 297: if (me->markup || me->preformatted) {
2.9 frystyk 298: #endif /* OLD_CODE */
2.8 frystyk 299: if (me->preformatted) {
2.1 frystyk 300: *me->write_pointer = '\n';
301: (*me->targetClass.put_block)(me->target,
302: me->buffer,
303: me->write_pointer-me->buffer+1);
304: me->write_pointer = me->buffer;
305: } else { /* Use break-point */
306: char line_break_char = *me->line_break;
307: char *saved = me->line_break;
308: *me->line_break = '\n';
309: (*me->targetClass.put_block)(me->target,
310: me->buffer,
311: me->line_break-me->buffer+1);
312: *me->line_break = line_break_char;
313: { /* move next line in */
314: char *p = saved;
315: char *q;
316: for(q=me->buffer; p<me->write_pointer; )
317: *q++ = *p++;
318: }
319: me->write_pointer = me->buffer + (me->write_pointer-saved);
320: }
321: me->line_break = me->buffer;
322: }
2.13 frystyk 323: return HT_OK;
2.1 frystyk 324: }
325:
326:
327:
328: /* String handling
329: ** ---------------
330: */
2.22 frystyk 331: PRIVATE int HTTeXGen_put_string (HTStructured * me, const char* s)
2.1 frystyk 332: {
2.13 frystyk 333: while (*s)
334: HTTeXGen_put_character(me, *s++);
335: return HT_OK;
2.1 frystyk 336: }
337:
338:
2.22 frystyk 339: PRIVATE int HTTeXGen_write (HTStructured * me, const char* b, int l)
2.1 frystyk 340: {
2.13 frystyk 341: while (l-- > 0)
342: HTTeXGen_put_character(me, *b++);
343: return HT_OK;
2.1 frystyk 344: }
345:
346:
347: /* Start Element
348: ** -------------
349: **
350: ** No attributes are put to the output Henrik 07/03-94
351: ** Does no assumptions of WHAT element is started...
352: */
2.19 frystyk 353: PRIVATE void HTTeXGen_start_element (HTStructured * me,
354: int element_number,
2.22 frystyk 355: const BOOL * present,
356: const char ** value)
2.1 frystyk 357: {
358: me->startup = YES; /* Now, let's get down to it */
2.6 frystyk 359: if (me->preformatted == YES) { /* Don't start markup in here */
2.27 frystyk 360: HTTRACE(SGML_TRACE, "LaTeX....... No Markup in verbatim mode\n");
2.1 frystyk 361: return;
2.6 frystyk 362: }
2.1 frystyk 363: if (element_number == HTML_PRE)
364: me->preformatted = YES;
365: if (element_number == HTML_CITE || /* No \n here, please! */
366: element_number == HTML_DT ||
367: element_number == HTML_H1 ||
368: element_number == HTML_H2 ||
369: element_number == HTML_H3 ||
370: element_number == HTML_H4 ||
371: element_number == HTML_H5 ||
372: element_number == HTML_H6 ||
373: element_number == HTML_TITLE)
374: me->sensitive = YES;
375: else if (element_number == HTML_DD) /* Only way to turn <DT> off */
376: me->sensitive = NO;
377: me->markup = element_number == HTML_A ? NO : YES;
378: HTTeXGen_put_string(me, *TeX_names[element_number]);
379: me->markup = NO;
380: }
381:
382:
383: /* End Element
384: ** -----------
385: **
386: ** Ends an markup element Henrik 07/03-94
387: ** Does no assumptions of WHAT element is ended...
388: */
2.19 frystyk 389: PRIVATE void HTTeXGen_end_element (HTStructured * me, int element_number)
2.1 frystyk 390: {
2.6 frystyk 391: if (me->preformatted && element_number != HTML_PRE) {
2.27 frystyk 392: HTTRACE(SGML_TRACE, "LaTeX....... No markup in verbatim mode\n");
2.6 frystyk 393: return;
394: }
2.1 frystyk 395: me->preformatted = NO;
396: me->markup = YES;
397: HTTeXGen_put_string(me, *(TeX_names[element_number]+1));
398: me->markup = NO;
399: if (element_number == HTML_CITE ||
400: element_number == HTML_DL ||
401: element_number == HTML_H1 ||
402: element_number == HTML_H2 ||
403: element_number == HTML_H3 ||
404: element_number == HTML_H4 ||
405: element_number == HTML_H5 ||
406: element_number == HTML_H6 ||
407: element_number == HTML_TITLE)
408: me->sensitive = NO;
409: }
410:
411:
412: /* Expanding entities
413: ** ------------------
414: **
415: */
2.19 frystyk 416: PRIVATE void HTTeXGen_put_entity (HTStructured * me, int entity_number)
2.1 frystyk 417: {
418: BOOL mark = me->markup;
419: if (*TeX_entities[entity_number] != '&' && /* Theese are converted later */
420: *TeX_entities[entity_number] != '<' &&
421: *TeX_entities[entity_number] != '>')
422: me->markup = YES;
423: HTTeXGen_put_string(me, TeX_entities[entity_number]);
424: me->markup = mark;
425: }
426:
2.25 frystyk 427: PRIVATE int HTTeXGen_unparsedBeginElement (HTStructured * me, const char * b, int l)
428: {
429: return (*me->targetClass.put_block)(me->target, b, l);
430: }
2.1 frystyk 431:
2.25 frystyk 432: PRIVATE int HTTeXGen_unparsedEndElement (HTStructured * me, const char * b, int l)
433: {
434: return (*me->targetClass.put_block)(me->target, b, l);
435: }
436:
437: PRIVATE int HTTeXGen_unparsedEntity (HTStructured * me, const char * b, int l)
438: {
439: return (*me->targetClass.put_block)(me->target, b, l);
440: }
2.1 frystyk 441:
442: /* Free an HTML object
443: ** -------------------
444: **
445: */
2.19 frystyk 446: PRIVATE int HTTeXGen_free (HTStructured * me)
2.1 frystyk 447: {
448: HTTeXGen_flush(me);
449: (*me->targetClass.put_string)(me->target, "\n\\end{document}\n");
450: HTTeXGen_flush(me);
2.7 duns 451: (*me->targetClass._free)(me->target); /* ripple through */
2.20 frystyk 452: HT_FREE(me);
2.13 frystyk 453: return HT_OK;
2.1 frystyk 454: }
455:
456:
2.19 frystyk 457: PRIVATE int HTTeXGen_abort (HTStructured * me, HTList * e)
2.1 frystyk 458: {
459: HTTeXGen_free(me);
2.13 frystyk 460: return HT_ERROR;
2.1 frystyk 461: }
462:
463:
464: /* Structured Object Class
465: ** -----------------------
466: */
2.22 frystyk 467: PRIVATE const HTStructuredClass HTTeXGeneration = /* As opposed to print etc */
2.1 frystyk 468: {
469: "HTMLToTeX",
2.13 frystyk 470: HTTeXGen_flush,
2.1 frystyk 471: HTTeXGen_free,
472: HTTeXGen_abort,
473: HTTeXGen_put_character, HTTeXGen_put_string, HTTeXGen_write,
474: HTTeXGen_start_element, HTTeXGen_end_element,
2.25 frystyk 475: HTTeXGen_put_entity,
476: HTTeXGen_unparsedBeginElement,
477: HTTeXGen_unparsedEndElement,
478: HTTeXGen_unparsedEntity
2.1 frystyk 479: };
480:
481:
482: /* HTConverter from HTML to TeX Stream
483: ** ------------------------------------------
484: **
485: */
2.19 frystyk 486: PUBLIC HTStream* HTMLToTeX (HTRequest * request,
487: void * param,
488: HTFormat input_format,
489: HTFormat output_format,
490: HTStream * output_stream)
2.1 frystyk 491: {
2.20 frystyk 492: HTStructured* me;
493: if ((me = (HTStructured *) HT_CALLOC(1, sizeof(*me))) == NULL)
494: HT_OUTOFMEM("HTMLToTeX");
2.1 frystyk 495:
496: me->isa = (HTStructuredClass*) &HTTeXGeneration;
2.25 frystyk 497: me->dtd = HTML_dtd();
2.1 frystyk 498: me->target = output_stream;
499: me->targetClass = *me->target->isa;/* Copy pointers to routines for speed*/
500: me->write_pointer = me->buffer;
501: me->line_break = me->buffer;
502: (*me->targetClass.put_string)(me->target,
503: "\\documentstyle[11pt]{report}\n\\begin{document}\n");
2.25 frystyk 504: return SGML_new(HTML_dtd(), me);
2.1 frystyk 505: }
Webmaster