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