⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.c

📁 一个很有名的浏览器
💻 C
📖 第 1 页 / 共 3 页
字号:
		 * 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] = "*&nbsp;";		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("&nbsp;", 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("&nbsp;", 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(".&nbsp;", 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 + -