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

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

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