📄 parser.c
字号:
* argument. */ if (parse_element(*end, eof, &name, &namelen, NULL, NULL)) continue; if (strlcasecmp(name, namelen, "/script", 7)) continue; /* We have won! */ break; } if (*end >= eof) { /* Either the document is not completely loaded yet or it's * broken. At any rate, run away screaming. */ *end = eof; /* Just for sanity. */ return 1; } if (part->document && *html != '^') { add_to_string_list(&part->document->onload_snippets, html, *end - html); } return 0;}#endifvoidhtml_script(unsigned char *a){#ifdef CONFIG_ECMASCRIPT /* We did everything (even possibly html_skip()) in do_html_script(). */#else html_skip(a);#endif}voidhtml_style(unsigned char *a){ html_skip(a);}voidhtml_html(unsigned char *a){ /* This is here just to get CSS stuff applied. */ /* Modify the root HTML element - format_html_part() will take * this from there. */ struct html_element *e = html_context.stack.prev; if (par_format.bgcolor != format.style.bg) e->parattr.bgcolor = e->attr.style.bg = par_format.bgcolor = format.style.bg;}voidhtml_head(unsigned char *a){ /* This makes sure it gets to the stack and helps tame down unclosed * <title>. */}voidhtml_title(unsigned char *a){ html_top.invisible = 1; html_top.type = ELEMENT_WEAK;}voidhtml_center(unsigned char *a){ par_format.align = ALIGN_CENTER; if (!html_context.table_level) par_format.leftmargin = par_format.rightmargin = 0;}voidhtml_linebrk(unsigned char *a){ unsigned char *al = get_attr_val(a, "align"); if (al) { if (!strcasecmp(al, "left")) par_format.align = ALIGN_LEFT; else if (!strcasecmp(al, "right")) par_format.align = ALIGN_RIGHT; else if (!strcasecmp(al, "center")) { par_format.align = ALIGN_CENTER; if (!html_context.table_level) par_format.leftmargin = par_format.rightmargin = 0; } else if (!strcasecmp(al, "justify")) par_format.align = ALIGN_JUSTIFY; mem_free(al); }}voidhtml_br(unsigned char *a){ html_linebrk(a); if (html_context.was_br) ln_break(2, html_context.line_break_f, html_context.part); else html_context.was_br = 1;}voidhtml_p(unsigned char *a){ int_lower_bound(&par_format.leftmargin, html_context.margin); int_lower_bound(&par_format.rightmargin, html_context.margin); /*par_format.align = ALIGN_LEFT;*/ html_linebrk(a);}voidhtml_address(unsigned char *a){ par_format.leftmargin++; par_format.align = ALIGN_LEFT;}voidhtml_blockquote(unsigned char *a){ par_format.leftmargin += 2; par_format.align = ALIGN_LEFT;}voidhtml_h(int h, unsigned char *a, enum format_align default_align){ if (!par_format.align) par_format.align = default_align; html_linebrk(a); h -= 2; if (h < 0) h = 0; switch (par_format.align) { case ALIGN_LEFT: par_format.leftmargin = h * 2; par_format.rightmargin = 0; break; case ALIGN_RIGHT: par_format.leftmargin = 0; par_format.rightmargin = h * 2; break; case ALIGN_CENTER: par_format.leftmargin = par_format.rightmargin = 0; break; case ALIGN_JUSTIFY: par_format.leftmargin = par_format.rightmargin = h * 2; break; }}voidhtml_h1(unsigned char *a){ format.style.attr |= AT_BOLD; html_h(1, a, ALIGN_CENTER);}voidhtml_h2(unsigned char *a){ html_h(2, a, ALIGN_LEFT);}voidhtml_h3(unsigned char *a){ html_h(3, a, ALIGN_LEFT);}voidhtml_h4(unsigned char *a){ html_h(4, a, ALIGN_LEFT);}voidhtml_h5(unsigned char *a){ html_h(5, a, ALIGN_LEFT);}voidhtml_h6(unsigned char *a){ html_h(6, a, ALIGN_LEFT);}voidhtml_pre(unsigned char *a){ format.style.attr |= AT_PREFORMATTED; par_format.leftmargin = (par_format.leftmargin > 1); par_format.rightmargin = 0;}voidhtml_xmp(unsigned char *a){ html_context.was_xmp = 1; html_pre(a);}voidhtml_hr(unsigned char *a){ int i/* = par_format.width - 10*/; unsigned char r = (unsigned char) BORDER_DHLINE; int q = get_num(a, "size"); if (q >= 0 && q < 2) r = (unsigned char) BORDER_SHLINE; html_stack_dup(ELEMENT_KILLABLE); par_format.align = ALIGN_CENTER; mem_free_set(&format.link, NULL); format.form = NULL; html_linebrk(a); if (par_format.align == ALIGN_JUSTIFY) par_format.align = ALIGN_CENTER; par_format.leftmargin = par_format.rightmargin = html_context.margin; i = get_width(a, "width", 1); if (i == -1) i = get_html_max_width(); format.style.attr = AT_GRAPHICS; html_context.special_f(html_context.part, SP_NOWRAP, 1); while (i-- > 0) { put_chrs(&r, 1, html_context.put_chars_f, html_context.part); } html_context.special_f(html_context.part, SP_NOWRAP, 0); ln_break(2, html_context.line_break_f, html_context.part); kill_html_stack_item(&html_top);}voidhtml_table(unsigned char *a){ par_format.leftmargin = par_format.rightmargin = html_context.margin; par_format.align = ALIGN_LEFT; html_linebrk(a); format.style.attr = 0;}voidhtml_tr(unsigned char *a){ html_linebrk(a);}voidhtml_th(unsigned char *a){ /*html_linebrk(a);*/ kill_html_stack_until(1, "TD", "TH", "", "TR", "TABLE", NULL); format.style.attr |= AT_BOLD; put_chrs(" ", 1, html_context.put_chars_f, html_context.part);}voidhtml_td(unsigned char *a){ /*html_linebrk(a);*/ kill_html_stack_until(1, "TD", "TH", "", "TR", "TABLE", NULL); format.style.attr &= ~AT_BOLD; put_chrs(" ", 1, html_context.put_chars_f, html_context.part);}voidhtml_base(unsigned char *a){ unsigned char *al; al = get_url_val(a, "href"); if (al) { unsigned char *base = join_urls(html_context.base_href, al); struct uri *uri = base ? get_uri(base, 0) : NULL; mem_free(al); mem_free_if(base); if (uri) { done_uri(html_context.base_href); html_context.base_href = uri; } } al = get_target(a); if (al) mem_free_set(&html_context.base_target, al);}voidhtml_ul(unsigned char *a){ unsigned char *al; /* dump_html_stack(); */ par_format.list_level++; par_format.list_number = 0; par_format.flags = P_STAR; al = get_attr_val(a, "type"); if (al) { if (!strcasecmp(al, "disc") || !strcasecmp(al, "circle")) par_format.flags = P_O; else if (!strcasecmp(al, "square")) par_format.flags = P_PLUS; mem_free(al); } par_format.leftmargin += 2 + (par_format.list_level > 1); if (!html_context.table_level) int_upper_bound(&par_format.leftmargin, par_format.width / 2); par_format.align = ALIGN_LEFT; html_top.type = ELEMENT_DONT_KILL;}voidhtml_ol(unsigned char *a){ unsigned char *al; int st; par_format.list_level++; st = get_num(a, "start"); if (st == -1) st = 1; par_format.list_number = st; par_format.flags = P_NUMBER; al = get_attr_val(a, "type"); if (al) { if (*al && !al[1]) { if (*al == '1') par_format.flags = P_NUMBER; else if (*al == 'a') par_format.flags = P_alpha; else if (*al == 'A') par_format.flags = P_ALPHA; else if (*al == 'r') par_format.flags = P_roman; else if (*al == 'R') par_format.flags = P_ROMAN; else if (*al == 'i') par_format.flags = P_roman; else if (*al == 'I') par_format.flags = P_ROMAN; } mem_free(al); } par_format.leftmargin += (par_format.list_level > 1); if (!html_context.table_level) int_upper_bound(&par_format.leftmargin, par_format.width / 2); par_format.align = ALIGN_LEFT; html_top.type = ELEMENT_DONT_KILL;}voidhtml_li(unsigned char *a){ /* When handling the code <li><li> @was_li will be 1 and it means we * have to insert a line break since no list item content has done it * for us. */ if (html_context.was_li) { html_context.line_breax = 0; ln_break(1, html_context.line_break_f, html_context.part); } /*kill_html_stack_until(0, "", "UL", "OL", NULL);*/ if (!par_format.list_number) { unsigned char x[7] = "* "; int t = par_format.flags & P_LISTMASK; if (t == P_O) x[0] = 'o'; if (t == P_PLUS) x[0] = '+'; put_chrs(x, 7, html_context.put_chars_f, html_context.part); par_format.leftmargin += 2; par_format.align = ALIGN_LEFT; } else { unsigned char c = 0; unsigned char n[32]; int nlen; int t = par_format.flags & P_LISTMASK; int s = get_num(a, "value"); if (s != -1) par_format.list_number = s; if (t == P_ALPHA || t == P_alpha) { put_chrs(" ", 6, html_context.put_chars_f, html_context.part); c = 1; n[0] = par_format.list_number ? (par_format.list_number - 1) % 26 + (t == P_ALPHA ? 'A' : 'a') : 0; n[1] = 0; } else if (t == P_ROMAN || t == P_roman) { roman(n, par_format.list_number); if (t == P_ROMAN) { unsigned char *x; for (x = n; *x; x++) *x = toupper(*x); } } else { if (par_format.list_number < 10) { put_chrs(" ", 6, html_context.put_chars_f, html_context.part); c = 1; } ulongcat(n, NULL, par_format.list_number, (sizeof(n) - 1), 0); } nlen = strlen(n); put_chrs(n, nlen, html_context.put_chars_f, html_context.part); put_chrs(". ", 7, html_context.put_chars_f, html_context.part); par_format.leftmargin += nlen + c + 2; par_format.align = ALIGN_LEFT; html_top.next->parattr.list_number = par_format.list_number + 1; { struct html_element *element; element = search_html_stack("ol"); if (element) element->parattr.list_number = par_format.list_number + 1; } par_format.list_number = 0; } html_context.putsp = -1; html_context.line_breax = 2; html_context.was_li = 1;}voidhtml_dl(unsigned char *a){ par_format.flags &= ~P_COMPACT; if (has_attr(a, "compact")) par_format.flags |= P_COMPACT; if (par_format.list_level) par_format.leftmargin += 5; par_format.list_level++; par_format.list_number = 0; par_format.align = ALIGN_LEFT; par_format.dd_margin = par_format.leftmargin; html_top.type = ELEMENT_DONT_KILL; if (!(par_format.flags & P_COMPACT)) { ln_break(2, html_context.line_break_f, html_context.part); html_top.linebreak = 2; }}voidhtml_dt(unsigned char *a){ kill_html_stack_until(0, "", "DL", NULL); par_format.align = ALIGN_LEFT; par_format.leftmargin = par_format.dd_margin; if (!(par_format.flags & P_COMPACT) && !has_attr(a, "compact")) ln_break(2, html_context.line_break_f, html_context.part);}voidhtml_dd(unsigned char *a){ kill_html_stack_until(0, "", "DL", NULL); par_format.leftmargin = par_format.dd_margin + (html_context.table_level ? 3 : 8); if (!html_context.table_level) int_upper_bound(&par_format.leftmargin, par_format.width / 2); par_format.align = ALIGN_LEFT;}voidhtml_noframes(unsigned char *a){ struct html_element *element; if (!global_doc_opts->frames) return; element = search_html_stack("frameset"); if (element && !element->frameset) return; html_skip(a);}voidhtml_frame(unsigned char *a){ unsigned char *name, *src, *url; src = get_url_val(a, "src"); if (!src) { url = stracpy("about:blank"); } else { url = join_urls(html_context.base_href, src); mem_free(src); } if (!url) return; name = get_attr_val(a, "name"); if (!name) { name = stracpy(url); } else if (!name[0]) { /* When name doesn't have a value */ mem_free(name); name = stracpy(url); } if (!name) return; if (!global_doc_opts->frames || !html_top.frameset) { html_focusable(a); put_link_line("Frame: ", name, url, ""); } else { if (html_context.special_f(html_context.part, SP_USED, NULL)) { html_context.special_f(html_context.part, SP_FRAME, html_top.frameset, name, url); } } mem_free(name); mem_free(url);}voidhtml_frameset(unsigned char *a){ struct frameset_param fp; unsigned char *cols, *rows; int width, height; /* XXX: This is still not 100% correct. We should also ignore the * frameset when we encountered anything 3v1l (read as: non-whitespace * text/element/anything) in the document outside of <head>. Well, this * is still better than nothing and it should heal up the security * concerns at least because sane sites should enclose the documents in * <body> elements ;-). See also bug 171. --pasky */ if (search_html_stack("BODY") || !global_doc_opts->frames || !html_context.special_f(html_context.part, SP_USED, NULL)) return; cols = get_attr_val(a, "cols"); if (!cols) { cols = stracpy("100%"); if (!cols) return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -