📄 html.c
字号:
*/ if (!strcasecomp(value[HTML_LINK_REL], "StyleSheet") || !strcasecomp(value[HTML_LINK_REL], "Style")) { if (TRACE) { fprintf(stderr, "HTML: StyleSheet link found.\n"); }#ifdef LINKEDSTYLES if (href && *href != '\0') { int res = -999; if ((url_type = is_url(href)) == 0 || (url_type == FILE_URL_TYPE && LYisLocalFile(href))) { if (url_type == FILE_URL_TYPE) { temp = HTParse(href, "", PARSE_PATH+PARSE_PUNCTUATION); HTUnEscape(temp); if (temp && *temp != '\0') { res = style_readFromFile(temp); if (res != 0) StrAllocCopy(href, temp); } FREE(temp); } else { res = style_readFromFile(href); } } if (TRACE) fprintf(stderr, "CSS: StyleSheet=%s %d\n", href, res); if (res == 0) HTAnchor_setStyle (me->node_anchor, href); } else if (TRACE) fprintf(stderr, " non-local StyleSheets not yet implemented.\n");#else if (TRACE) fprintf(stderr, " StyleSheets not yet implemented.\n");#endif FREE(href); break; } /* * Ignore anything not registered in the the 28-Mar-95 * IETF HTML 3.0 draft and W3C HTML 3.2 draft, or not * appropriate for Lynx banner links in the expired * Maloney and Quin relrev draft. We'll make this more * efficient when the situation stabilizes, and for now, * we'll treat "Banner" as another toolbar element. - FM */ if (!strcasecomp(value[HTML_LINK_REL], "Home") || !strcasecomp(value[HTML_LINK_REL], "ToC") || !strcasecomp(value[HTML_LINK_REL], "Contents") || !strcasecomp(value[HTML_LINK_REL], "Index") || !strcasecomp(value[HTML_LINK_REL], "Glossary") || !strcasecomp(value[HTML_LINK_REL], "Copyright") || !strcasecomp(value[HTML_LINK_REL], "Up") || !strcasecomp(value[HTML_LINK_REL], "Next") || !strcasecomp(value[HTML_LINK_REL], "Previous") || !strcasecomp(value[HTML_LINK_REL], "Prev") || !strcasecomp(value[HTML_LINK_REL], "Help") || !strcasecomp(value[HTML_LINK_REL], "Search") || !strcasecomp(value[HTML_LINK_REL], "Bookmark") || !strcasecomp(value[HTML_LINK_REL], "Banner") || !strcasecomp(value[HTML_LINK_REL], "Top") || !strcasecomp(value[HTML_LINK_REL], "Origin") || !strcasecomp(value[HTML_LINK_REL], "Navigator") || !strcasecomp(value[HTML_LINK_REL], "Child") || !strcasecomp(value[HTML_LINK_REL], "Disclaimer") || !strcasecomp(value[HTML_LINK_REL], "Sibling") || !strcasecomp(value[HTML_LINK_REL], "Parent") || !strcasecomp(value[HTML_LINK_REL], "Author") || !strcasecomp(value[HTML_LINK_REL], "Editor") || !strcasecomp(value[HTML_LINK_REL], "Publisher") || !strcasecomp(value[HTML_LINK_REL], "Trademark") || !strcasecomp(value[HTML_LINK_REL], "Meta") || !strcasecomp(value[HTML_LINK_REL], "URC") || !strcasecomp(value[HTML_LINK_REL], "Hotlist") || !strcasecomp(value[HTML_LINK_REL], "Begin") || !strcasecomp(value[HTML_LINK_REL], "First") || !strcasecomp(value[HTML_LINK_REL], "End") || !strcasecomp(value[HTML_LINK_REL], "Last") || !strcasecomp(value[HTML_LINK_REL], "Pointer") || !strcasecomp(value[HTML_LINK_REL], "Translation") || !strcasecomp(value[HTML_LINK_REL], "Definition") || !strcasecomp(value[HTML_LINK_REL], "Chapter") || !strcasecomp(value[HTML_LINK_REL], "Documentation") || !strcasecomp(value[HTML_LINK_REL], "Biblioentry") || !strcasecomp(value[HTML_LINK_REL], "Bibliography")) { StrAllocCopy(title, value[HTML_LINK_REL]); } else { if (TRACE) { fprintf(stderr, "HTML: LINK with REL=\"%s\" ignored.\n", value[HTML_LINK_REL]); } FREE(href); break; } } } else if (present && present[HTML_LINK_REL] && value[HTML_LINK_REL]) { /* * If no HREF was specified, handle special REL links * with self-designated HREFs. - FM */ if (!strcasecomp(value[HTML_LINK_REL], "Home")) { StrAllocCopy(href, LynxHome); } else if (!strcasecomp(value[HTML_LINK_REL], "Help")) { StrAllocCopy(href, helpfile); } else if (!strcasecomp(value[HTML_LINK_REL], "Index")) { StrAllocCopy(href, indexfile); } else { if (TRACE) { fprintf(stderr, "HTML: LINK with REL=\"%s\" and no HREF ignored.\n", value[HTML_LINK_REL]); } break; } StrAllocCopy(title, value[HTML_LINK_REL]); } if (href) { /* * Create a title (link name) from the TITLE value, * if present, or default to the REL value that was * loaded into title. - FM */ if (present && present[HTML_LINK_TITLE] && value[HTML_LINK_TITLE] && *value[HTML_LINK_TITLE] != '\0') { StrAllocCopy(title, value[HTML_LINK_TITLE]); TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE); LYTrimHead(title); LYTrimTail(title); } if (!(title && *title)) { FREE(href); FREE(title); break; } if (me->inA) { /* * Ugh! The LINK tag, which is a HEAD element, * is in an Anchor, which is BODY element. All * we can do is close the Anchor and cross our * fingers. - FM */ SET_SKIP_STACK(HTML_A); HTML_end_element(me, HTML_A, (char **)&include); } /* * Create anchors for the links that simulate * a toolbar. - FM */ me->CurrentA = HTAnchor_findChildAndLink( me->node_anchor, /* Parent */ NULL, /* Tag */ href, /* Addresss */ INTERN_LT); /* Type */ if ((dest = HTAnchor_parent( HTAnchor_followMainLink((HTAnchor*)me->CurrentA) )) != NULL) { if (!HTAnchor_title(dest)) HTAnchor_setTitle(dest, title); dest = NULL; if (present[HTML_LINK_CHARSET] && value[HTML_LINK_CHARSET] && *value[HTML_LINK_CHARSET] != '\0') { dest_char_set = UCGetLYhndl_byMIME(value[HTML_LINK_CHARSET]); if (dest_char_set < 0) dest_char_set = UCLYhndl_for_unrec; } if (dest && dest_char_set >= 0) HTAnchor_setUCInfoStage(dest, dest_char_set, UCT_STAGE_PARSER, UCT_SETBY_LINK); dest_char_set = -1; } UPDATE_STYLE; if (!HText_hasToolbar(me->text) && (ID_A = HTAnchor_findChildAndLink( me->node_anchor, /* Parent */ LYToolbarName, /* Tag */ NULL, /* Addresss */ (HTLinkType*)0))) { /* Type */ HText_appendCharacter(me->text, '#'); HText_setLastChar(me->text, ' '); /* absorb white space */ HText_beginAnchor(me->text, me->inUnderline, ID_A); HText_endAnchor(me->text, 0); HText_setToolbar(me->text); } HText_beginAnchor(me->text, me->inUnderline, me->CurrentA); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_START_CHAR);#ifdef USE_COLOR_STYLE if (present && present[HTML_LINK_CLASS] && value && *value[HTML_LINK_CLASS]!='\0') { char tmp[1024]; sprintf(tmp, "link.%s.%s.%s", value[HTML_LINK_CLASS], title, value[HTML_LINK_CLASS]); if (TRACE) fprintf(stderr, "CSSTRIM:link=%s\n", tmp); HText_characterStyle(me->text, hash_code(tmp), 1); HTML_put_string(me, title); HTML_put_string(me, " ("); HTML_put_string(me, value[HTML_LINK_CLASS]); HTML_put_string(me, ")"); HText_characterStyle(me->text, hash_code(tmp), 0); } else#endif HTML_put_string(me, title); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_END_CHAR); HText_endAnchor(me->text, 0); } FREE(href); FREE(title); break; case HTML_ISINDEX: if (((present)) && ((present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF]) || (present[HTML_ISINDEX_ACTION] && value[HTML_ISINDEX_ACTION]))) { char * action = NULL; char * isindex_href = NULL; /* * Lynx was supporting ACTION, which never made it into * the HTML 2.0 specs. HTML 3.0 uses HREF, so we'll * use that too, but allow use of ACTION as an alternate * until people have fully switched over. - FM */ if (present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF]) StrAllocCopy(isindex_href, value[HTML_ISINDEX_HREF]); else StrAllocCopy(isindex_href, value[HTML_ISINDEX_ACTION]); url_type = LYLegitimizeHREF(me, (char**)&isindex_href, TRUE, TRUE); /* * Check whether a base tag is in effect. */ if (me->inBASE && *isindex_href != '\0' && *isindex_href != '#') action = HTParse(isindex_href, me->base_href, PARSE_ALL); if (!(action && *action)) action = HTParse(isindex_href, me->node_anchor->address, PARSE_ALL); FREE(isindex_href); if (action && *action) { HTAnchor_setIndex(me->node_anchor, action); } else { HTAnchor_setIndex(me->node_anchor, me->node_anchor->address); } FREE(action); } else { if (me->inBASE) /* * Use base. */ HTAnchor_setIndex(me->node_anchor, me->base_href); else /* * Use index's address. */ HTAnchor_setIndex(me->node_anchor, me->node_anchor->address); } /* * Support HTML 3.0 PROMPT attribute. - FM */ if (present && present[HTML_ISINDEX_PROMPT] && value[HTML_ISINDEX_PROMPT] && *value[HTML_ISINDEX_PROMPT]) { StrAllocCopy(temp, value[HTML_ISINDEX_PROMPT]); TRANSLATE_AND_UNESCAPE_ENTITIES(&temp, TRUE, FALSE); LYTrimHead(temp); LYTrimTail(temp); if (*temp != '\0') { StrAllocCat(temp, " "); HTAnchor_setPrompt(me->node_anchor, temp); } else { HTAnchor_setPrompt(me->node_anchor, "Enter a database query: "); } FREE(temp); } else { HTAnchor_setPrompt(me->node_anchor, "Enter a database query: "); } break; case HTML_NEXTID: /* if (present && present[NEXTID_N] && value[NEXTID_N]) HText_setNextId(me->text, atoi(value[NEXTID_N])); */ break; case HTML_STYLE: /* * We're getting it as Literal text, which, for now, * we'll just ignore. - FM */ HTChunkClear(&me->style_block); break; case HTML_SCRIPT: /* * We're getting it as Literal text, which, for now, * we'll just ignore. - FM */ HTChunkClear(&me->script); break; case HTML_BODY: CHECK_ID(HTML_BODY_ID); if (HText_hasToolbar(me->text)) HText_appendParagraph(me->text); break; case HTML_FRAMESET: break; case HTML_FRAME: if (present && present[HTML_FRAME_NAME] && value[HTML_FRAME_NAME] && *value[HTML_FRAME_NAME]) { StrAllocCopy(id_string, value[HTML_FRAME_NAME]); TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE); LYTrimHead(id_string); LYTrimTail(id_string); } if (present && present[HTML_FRAME_SRC] && value[HTML_FRAME_SRC] && *value[HTML_FRAME_SRC] != '\0') { StrAllocCopy(href, value[HTML_FRAME_SRC]); CHECK_FOR_INTERN(href); url_type = LYLegitimizeHREF(me, (char**)&href, TRUE, TRUE); /* * Check whether a base tag is in effect. - FM */ if ((me->inBASE && *href != '\0' && *href != '#') && (temp = HTParse(href, me->base_href, PARSE_ALL)) && *temp != '\0') /* * Use reference related to the base. */ StrAllocCopy(href, temp); FREE(temp); /* * Check whether to fill in localhost. - FM */ LYFillLocalFileURL((char **)&href, ((*href != '\0' && *href != '#' && me->inBASE) ? me->base_href : me->node_anchor->address)); if (me->inA) { SET_SKIP_STACK(HTML_A); HTML_end_element(me, HTML_A, (char **)&include); } me->CurrentA = HTAnchor_findChildAndLink( me->node_anchor, /* Parent */ NULL, /* Tag */ href, /* Addresss */ INTERN_LT); /* Type */ LYEnsureSingleSpace(me); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR); HTML_put_string(me, "FRAME:"); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); me->in_word = NO; CHECK_ID(HTML_FRAME_ID); HText_beginAnchor(me->text, me->inUnderline, me->CurrentA); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_START_CHAR); HTML_put_string(me, (id_string ? id_string : href)); FREE(href); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_END_CHAR); HText_endAnchor(me->text, 0); LYEnsureSingleSpace(me); } else { CHECK_ID(HTML_FRAME_ID); } FREE(id_string); break; case HTML_NOFRAMES: LYEnsureDoubleSpace(me); LYResetParagraphAlignment(me); break; case HTML_IFRAME: if (present && present[HTML_IFRAME_NAME] && value[HTML_IFRAME_NAME] && *value[HTML_IFRAME_NAME]) { StrAllocCopy(id_string, value[HTML_IFRAME_NAME]); TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE); LYTrimHead(id_string); LYTrimTail(id_string); } if (present && present[HTML_IFRAME_SRC] && value[HTML_IFRAME_SRC] && *value[HTML_IFRAME_SRC] != '\0') { StrAllocCopy(href, value[HTML_IFRAME_SRC]); CHECK_FOR_INTERN(href); url_type = LYLegitimizeHREF(me, (char**)&href, TRUE, TRUE); /* * Check whether a base tag is in effect. - FM */ if ((me->inBASE && *href != '\0' && *href != '#') && (temp = HTParse(href, me->base_href, PARSE_ALL)) && *temp != '\0') /* * Use reference related to the base. */ StrAllocCopy(href, temp); FREE(temp); /* * Check whether to fill in localhost. - FM */ LYFillLocalFileURL((char **)&href, ((*href != '\0' && *href != '#' && me->inBASE) ? me->base_href : me->node_anchor->address)); if (me->inA) HTML_end_element(me, HTML_A, (char **)&include); me->CurrentA = HTAnchor_findChildAndLink( me->node_anchor, /* Parent */ NULL, /* Tag */ href, /* Addresss */ INTERN_LT); /* Type */ LYEnsureDoubleSpace(me); LYResetParagraphAlignment(me); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR); HTML_put_string(me, "IFRAME:"); if (me->inUnderline == FALSE) HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR); HTML_put_character(me, ' '); me->in_word = NO; CHECK_ID(HTML_IFRAME_ID); HText_beginAnchor(me->text, me->inUnderline, me->CurrentA); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_START_CHAR); HTML_put_string(me, (id_string ? id_string : href)); FREE(href); if (me->inBoldH == FALSE) HText_appendCharacter(me->text, LY_BOLD_END_CHAR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -