[BACK] Return to HTTeXGen.c CVS log [TXT] [DIR] Up to [Public] / libwww / Library / src

Annotation of libwww/Library/src/HTTeXGen.c, revision 2.1

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

Webmaster

AltStyle によって変換されたページ (->オリジナル) /