?? html.c
字號:
char * ptr = NULL; char * relation = NULL; StrAllocCopy(strval, value[HTML_LINK_REL]); ptr = strval; while ((relation = HTNextLWSToken(&ptr)) != NULL) { HTLink_add((HTAnchor *) me->node_anchor, (HTAnchor *) dest, (HTLinkType) HTAtom_caseFor(relation), METHOD_INVALID); } HT_FREE(strval); } /* If reverse reference */ if ((present[HTML_LINK_REV] && value[HTML_LINK_REV])) { char * strval = NULL; char * ptr = NULL; char * relation = NULL; StrAllocCopy(strval, value[HTML_LINK_REV]); ptr = strval; while ((relation = HTNextLWSToken(&ptr)) != NULL) { HTLink_add((HTAnchor *) dest, (HTAnchor *) me->node_anchor, (HTLinkType) HTAtom_caseFor(relation), METHOD_INVALID); } HT_FREE(strval); } /* If we got any type information as well */ if (present[HTML_LINK_TYPE] && value[HTML_LINK_TYPE]) { if (HTAnchor_format(dest) == WWW_UNKNOWN) HTAnchor_setFormat(dest, (HTFormat) HTAtom_caseFor(value[HTML_LINK_TYPE])); } /* Call out to the layout engine */ HTextImp_foundLink(me->text, element_number, HTML_LINK_HREF, address, present, value); } break; case HTML_META: if (present[HTML_META_NAME] && value[HTML_META_NAME]) { HTAnchor_addMeta (me->node_anchor, value[HTML_META_NAME], (present[HTML_META_CONTENT] && value[HTML_META_CONTENT]) ? value[HTML_META_CONTENT] : ""); } break; case HTML_OBJECT: if (present[HTML_OBJECT_CLASSID] && value[HTML_OBJECT_CLASSID]) { address = HTAnchor_findChildAndLink(me->node_anchor, NULL, value[HTML_OBJECT_CLASSID], NULL); HTextImp_foundLink(me->text, element_number, HTML_OBJECT_CLASSID, address, present, value); } if (present[HTML_OBJECT_CODEBASE] && value[HTML_OBJECT_CODEBASE]) { address = HTAnchor_findChildAndLink(me->node_anchor, NULL, value[HTML_OBJECT_CODEBASE], NULL); HTextImp_foundLink(me->text, element_number, HTML_OBJECT_CODEBASE, address, present, value); } if (present[HTML_OBJECT_DATA] && value[HTML_OBJECT_DATA]) { address = HTAnchor_findChildAndLink(me->node_anchor, NULL, value[HTML_OBJECT_DATA], NULL); HTextImp_foundLink(me->text, element_number, HTML_OBJECT_DATA, address, present, value); } if (present[HTML_OBJECT_ARCHIVE] && value[HTML_OBJECT_ARCHIVE]) { address = HTAnchor_findChildAndLink(me->node_anchor, NULL, value[HTML_OBJECT_ARCHIVE], NULL); HTextImp_foundLink(me->text, element_number, HTML_OBJECT_ARCHIVE, address, present, value); } if (present[HTML_OBJECT_USEMAP] && value[HTML_OBJECT_USEMAP]) { address = HTAnchor_findChildAndLink(me->node_anchor, NULL, value[HTML_OBJECT_USEMAP], NULL); HTextImp_foundLink(me->text, element_number, HTML_OBJECT_USEMAP, address, present, value); } break; case HTML_PRE: if (me->comment_end) HTextImp_addText(me->text, me->comment_end, strlen(me->comment_end)); break; case HTML_TITLE: HTChunk_truncate(me->title,0); break; } /* Update our parse stack */ if (SGML_findTagContents(me->dtd, element_number) != SGML_EMPTY) { if (me->sp == me->stack) { HTTRACE(SGML_TRACE, "HTML Parser. Maximum nesting of %d exceded!\n" _ MAX_NESTING); me->overflow++; return; } --(me->sp); me->sp[0] = element_number; } /* Call out to the layout engine */ HTextImp_beginElement(me->text, element_number, present, value);}PRIVATE void HTML_end_element (HTStructured * me, int element_number){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } /* Update our parse stack */ if (me->overflow > 0) { me->overflow--; return; } me->sp++; if (me->sp > me->stack + MAX_NESTING - 1) { HTTRACE(SGML_TRACE, "HTML Parser. Bottom of parse stack reached\n"); me->sp = me->stack + MAX_NESTING - 1; } /* Look at what element was closed */ switch(element_number) { case HTML_TITLE: HTAnchor_setTitle(me->node_anchor, HTChunk_data(me->title)); break; case HTML_PRE: if (me->comment_start) HTextImp_addText(me->text, me->comment_start, strlen(me->comment_start)); break; } /* Call out to the layout engine */ HTextImp_endElement(me->text, element_number);}PRIVATE void HTML_put_entity (HTStructured * me, int entity_number){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } if (entity_number>=0 && entity_number<HTML_ENTITIES) HTML_put_string(me, *(CurrentEntityValues+entity_number));}PUBLIC int HTML_flush (HTStructured * me){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } if (me->comment_end) HTML_put_string(me, me->comment_end); return me->target ? FLUSH_TARGET(me) : HT_OK;}PRIVATE int HTML_unparsedBeginElement (HTStructured * me, const char * b, int l){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } HTextImp_unparsedBeginElement(me->text, b, l); return HT_OK;}PRIVATE int HTML_unparsedEndElement (HTStructured * me, const char * b, int l){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } HTextImp_unparsedEndElement(me->text, b, l); return HT_OK;}PRIVATE int HTML_unparsedEntity (HTStructured * me, const char * b, int l){ if (!me->started) { HTextImp_build(me->text, HTEXT_BEGIN); me->started = YES; } HTextImp_unparsedEntity(me->text, b, l); return HT_OK;}PUBLIC int HTML_free (HTStructured * me){ if (!me->started) HTextImp_build(me->text, HTEXT_BEGIN); if (me->comment_end) HTML_put_string(me, me->comment_end); HTextImp_build(me->text, HTEXT_END); HTextImp_delete(me->text); HTChunk_delete(me->title); if (me->target) FREE_TARGET(me); HT_FREE(me); return HT_OK;}PRIVATE int HTML_abort (HTStructured * me, HTList * e){ if (!me->started) HTextImp_build(me->text, HTEXT_BEGIN); HTextImp_build(me->text, HTEXT_ABORT); HTextImp_delete(me->text); HTChunk_delete(me->title); if (me->target) ABORT_TARGET(me); HT_FREE(me); return HT_ERROR;}/* Structured Object Class** -----------------------*/PRIVATE const HTStructuredClass HTMLPresentation = /* As opposed to print etc */{ "text/html", HTML_flush, HTML_free, HTML_abort, HTML_put_character, HTML_put_string, HTML_write, HTML_start_element, HTML_end_element, HTML_put_entity, HTML_unparsedBeginElement, HTML_unparsedEndElement, HTML_unparsedEntity};/* Structured Text object** ----------------------**** The structured stream can generate either presentation,** or plain text, or HTML.*/PRIVATE HTStructured * HTML_new (HTRequest * request, void * param, HTFormat input_format, HTFormat output_format, HTStream * output_stream){ HTStructured * me = NULL; if (request) { if ((me = (HTStructured *) HT_CALLOC(1, sizeof(HTStructured))) == NULL) HT_OUTOFMEM("HTML_new"); me->isa = &HTMLPresentation; me->dtd = HTML_dtd(); me->request = request; me->node_anchor = HTRequest_anchor(request); me->title = HTChunk_new(128); me->comment_start = NULL; me->comment_end = NULL; me->target = output_stream; me->sp = me->stack + MAX_NESTING - 1; /* Create the text object */ me->text = HTextImp_new(me->request, me->node_anchor, me->target); } return me;}/* HTConverter for HTML to plain text** ----------------------------------**** This will convert from HTML to presentation or plain text.*/PUBLIC HTStream * HTMLToPlain (HTRequest * request, void * param, HTFormat input_format, HTFormat output_format, HTStream * output_stream){ return SGML_new(HTML_dtd(), HTML_new( request, NULL, input_format, output_format, output_stream));}/* HTConverter for HTML to C code** ------------------------------**** C code is like plain text but all non-preformatted code** is commented out.** This will convert from HTML to presentation or plain text.*/PUBLIC HTStream * HTMLToC (HTRequest * request, void * param, HTFormat input_format, HTFormat output_format, HTStream * output_stream){ if (output_stream) { HTStructured * html = NULL; (*output_stream->isa->put_string)(output_stream, "/* "); /* Before title */ html = HTML_new(request, NULL, input_format, output_format, output_stream); html->comment_start = "\n/* "; html->dtd = HTML_dtd(); html->comment_end = " */\n"; /* Must start in col 1 for cpp */ return SGML_new(HTML_dtd(), html); } else return HTErrorStream();}/* Presenter for HTML** ------------------**** This will convert from HTML to presentation or plain text.**** Override this if you have a windows version*/PUBLIC HTStream * HTMLPresent (HTRequest * request, void * param, HTFormat input_format, HTFormat output_format, HTStream * output_stream){ return SGML_new(HTML_dtd(), HTML_new( request, NULL, input_format, output_format, output_stream));}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -