📄 httexgen.c
字号:
} else if (me->markup || me->preformatted) { *me->write_pointer++ = c; } else if (c==' ' || c=='\t') { /* Skip space and tabs */ if (*(me->write_pointer-1) != ' ') *me->write_pointer++ = ' '; else return HT_OK; } else { if (c=='$' || c=='&' || c=='%' || c=='#' || /* Special chars */ c=='{' || c=='}' || c=='_') { *me->write_pointer++ = '\\'; *me->write_pointer++ = c; } else if (c=='\\') { /* Special names */ char *temp = "$\\backslash$"; strcpy(me->write_pointer, temp); me->write_pointer += strlen(temp); } else if (c=='^') { char *temp = "$\\hat{ }$"; strcpy(me->write_pointer, temp); me->write_pointer += strlen(temp); } else if (c=='~') { char *temp = "$\\tilde{ }$"; strcpy(me->write_pointer, temp); me->write_pointer += strlen(temp); } else if (c=='|' || c=='<' || c=='>') { /* Math mode */ *me->write_pointer++ = '$'; *me->write_pointer++ = c; *me->write_pointer++ = '$'; } else *me->write_pointer++ = c; /* Char seems normal */ } if (c==' ') /* Find delimiter */ me->line_break = me->write_pointer; else if (strchr(WORD_DELIMITERS, c)) me->line_break = me->write_pointer-1; /* Flush buffer out when full */ if (me->write_pointer >= me->buffer+BUFFER_SIZE-3) {#ifdef OLD_CODE if (me->markup || me->preformatted) {#endif /* OLD_CODE */ if (me->preformatted) { *me->write_pointer = '\n'; (*me->targetClass.put_block)(me->target, me->buffer, me->write_pointer-me->buffer+1); me->write_pointer = me->buffer; } else { /* Use break-point */ char line_break_char = *me->line_break; char *saved = me->line_break; *me->line_break = '\n'; (*me->targetClass.put_block)(me->target, me->buffer, me->line_break-me->buffer+1); *me->line_break = line_break_char; { /* move next line in */ char *p = saved; char *q; for(q=me->buffer; p<me->write_pointer; ) *q++ = *p++; } me->write_pointer = me->buffer + (me->write_pointer-saved); } me->line_break = me->buffer; } return HT_OK;}/* String handling** ---------------*/PRIVATE int HTTeXGen_put_string (HTStructured * me, const char* s){ while (*s) HTTeXGen_put_character(me, *s++); return HT_OK;}PRIVATE int HTTeXGen_write (HTStructured * me, const char* b, int l){ while (l-- > 0) HTTeXGen_put_character(me, *b++); return HT_OK;}/* Start Element** -------------**** No attributes are put to the output Henrik 07/03-94** Does no assumptions of WHAT element is started...*/PRIVATE void HTTeXGen_start_element (HTStructured * me, int element_number, const BOOL * present, const char ** value){ me->startup = YES; /* Now, let's get down to it */ if (me->preformatted == YES) { /* Don't start markup in here */ HTTRACE(SGML_TRACE, "LaTeX....... No Markup in verbatim mode\n"); return; } if (element_number == HTML_PRE) me->preformatted = YES; if (element_number == HTML_CITE || /* No \n here, please! */ element_number == HTML_DT || element_number == HTML_H1 || element_number == HTML_H2 || element_number == HTML_H3 || element_number == HTML_H4 || element_number == HTML_H5 || element_number == HTML_H6 || element_number == HTML_H7 || element_number == HTML_TITLE) me->sensitive = YES; else if (element_number == HTML_DD) /* Only way to turn <DT> off */ me->sensitive = NO; me->markup = element_number == HTML_A ? NO : YES; HTTeXGen_put_string(me, *TeX_names[element_number]); me->markup = NO;}/* End Element** -----------**** Ends an markup element Henrik 07/03-94** Does no assumptions of WHAT element is ended...*/PRIVATE void HTTeXGen_end_element (HTStructured * me, int element_number){ if (me->preformatted && element_number != HTML_PRE) { HTTRACE(SGML_TRACE, "LaTeX....... No markup in verbatim mode\n"); return; } me->preformatted = NO; me->markup = YES; HTTeXGen_put_string(me, *(TeX_names[element_number]+1)); me->markup = NO; if (element_number == HTML_CITE || element_number == HTML_DL || element_number == HTML_H1 || element_number == HTML_H2 || element_number == HTML_H3 || element_number == HTML_H4 || element_number == HTML_H5 || element_number == HTML_H6 || element_number == HTML_H7 || element_number == HTML_TITLE) me->sensitive = NO;}/* Expanding entities** ------------------***/PRIVATE void HTTeXGen_put_entity (HTStructured * me, int entity_number){ BOOL mark = me->markup; if (*TeX_entities[entity_number] != '&' && /* Theese are converted later */ *TeX_entities[entity_number] != '<' && *TeX_entities[entity_number] != '>') me->markup = YES; HTTeXGen_put_string(me, TeX_entities[entity_number]); me->markup = mark;}PRIVATE int HTTeXGen_unparsedBeginElement (HTStructured * me, const char * b, int l){ return (*me->targetClass.put_block)(me->target, b, l);}PRIVATE int HTTeXGen_unparsedEndElement (HTStructured * me, const char * b, int l){ return (*me->targetClass.put_block)(me->target, b, l);}PRIVATE int HTTeXGen_unparsedEntity (HTStructured * me, const char * b, int l){ return (*me->targetClass.put_block)(me->target, b, l);}/* Free an HTML object** -------------------***/PRIVATE int HTTeXGen_free (HTStructured * me){ HTTeXGen_flush(me); (*me->targetClass.put_string)(me->target, "\n\\end{document}\n"); HTTeXGen_flush(me); (*me->targetClass._free)(me->target); /* ripple through */ HT_FREE(me); return HT_OK;}PRIVATE int HTTeXGen_abort (HTStructured * me, HTList * e){ HTTeXGen_free(me); return HT_ERROR;}/* Structured Object Class** -----------------------*/PRIVATE const HTStructuredClass HTTeXGeneration = /* As opposed to print etc */{ "HTMLToTeX", HTTeXGen_flush, HTTeXGen_free, HTTeXGen_abort, HTTeXGen_put_character, HTTeXGen_put_string, HTTeXGen_write, HTTeXGen_start_element, HTTeXGen_end_element, HTTeXGen_put_entity, HTTeXGen_unparsedBeginElement, HTTeXGen_unparsedEndElement, HTTeXGen_unparsedEntity}; /* HTConverter from HTML to TeX Stream** ------------------------------------------***/PUBLIC HTStream* HTMLToTeX (HTRequest * request, void * param, HTFormat input_format, HTFormat output_format, HTStream * output_stream){ HTStructured* me; if ((me = (HTStructured *) HT_CALLOC(1, sizeof(*me))) == NULL) HT_OUTOFMEM("HTMLToTeX"); me->isa = (HTStructuredClass*) &HTTeXGeneration; me->dtd = HTML_dtd(); me->target = output_stream; me->targetClass = *me->target->isa;/* Copy pointers to routines for speed*/ me->write_pointer = me->buffer; me->line_break = me->buffer; (*me->targetClass.put_string)(me->target, "\\documentstyle[11pt]{report}\n\\begin{document}\n"); return SGML_new(HTML_dtd(), me);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -