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

📄 html.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
	par_format.list_level++;	st = get_num(a, "start");	if (st == -1) st = 1;	par_format.list_number = st;	par_format.flags = P_NUMBER;	if ((al = get_attr_val(a, "type"))) {		if (!strcmp(al, "1")) par_format.flags = P_NUMBER;		if (!strcmp(al, "a")) par_format.flags = P_alpha;		if (!strcmp(al, "A")) par_format.flags = P_ALPHA;		if (!strcmp(al, "r")) par_format.flags = P_roman;		if (!strcmp(al, "R")) par_format.flags = P_ROMAN;		if (!strcmp(al, "i")) par_format.flags = P_roman;		if (!strcmp(al, "I")) par_format.flags = P_ROMAN;		mem_free(al);	}	if (!F) if ((par_format.leftmargin += (par_format.list_level > 1)) > par_format.width * 2 / 3 && !table_level)		par_format.leftmargin = par_format.width * 2 / 3;	par_format.align = AL_LEFT;	html_top.dontkill = 1;}void html_li(unsigned char *a){	/*kill_until(0, "", "UL", "OL", NULL);*/	if (!par_format.list_number) {		char x[7] = "*&nbsp;";		if ((par_format.flags & P_LISTMASK) == P_O) x[0] = 'o';		if ((par_format.flags & P_LISTMASK) == P_PLUS) x[0] = '+';		if (F) par_format.leftmargin += 2;		put_chrs(x, 7, put_chars_f, ff);		if (!F) par_format.leftmargin += 2;		par_format.align = AL_LEFT;		putsp = -1;	} else {		char c = 0;		char n[32];		int t = par_format.flags & P_LISTMASK;		int s = get_num(a, "value");		if (F) par_format.leftmargin += 4;		if (s != -1) par_format.list_number = s;		if ((t != P_roman && t != P_ROMAN && par_format.list_number < 10) || t == P_alpha || t == P_ALPHA) put_chrs("&nbsp;", 6, put_chars_f, ff), c = 1;		if (t == P_ALPHA || t == P_alpha) {			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) {				char *x;				for (x = n; *x; x++) *x = upcase(*x);			}		} else sprintf(n, "%d", par_format.list_number);		put_chrs(n, strlen(n), put_chars_f, ff);		put_chrs(".&nbsp;", 7, put_chars_f, ff);		if (!F) par_format.leftmargin += strlen(n) + c + 2;		par_format.align = AL_LEFT;		par_format.list_number = 0;		html_top.next->parattr.list_number++;		putsp = -1;	}	line_breax = 2;}void html_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 = AL_LEFT;	par_format.dd_margin = par_format.leftmargin;	html_top.dontkill = 1;	if (!(par_format.flags & P_COMPACT)) {		ln_break(2, line_break_f, ff);		html_top.linebreak = 2;	}}void html_dt(unsigned char *a){	kill_until(0, "", "DL", NULL);	par_format.align = AL_LEFT;	par_format.leftmargin = par_format.dd_margin;	if (!(par_format.flags & P_COMPACT) && !has_attr(a, "compact"))		ln_break(2, line_break_f, ff);}void html_dd(unsigned char *a){	kill_until(0, "", "DL", NULL);	if ((par_format.leftmargin = par_format.dd_margin + (table_level ? 3 : 8)) > par_format.width * 2 / 3 && !table_level)		par_format.leftmargin = par_format.width * 2 / 3;	par_format.align = AL_LEFT;}void get_html_form(unsigned char *a, struct form *form){	unsigned char *al;	unsigned char *ch;	form->method = FM_GET;	if ((al = get_attr_val(a, "method"))) {		if (!strcasecmp(al, "post")) {			char *ax;			form->method = FM_POST;			if ((ax = get_attr_val(a, "enctype"))) {				if (!strcasecmp(ax, "multipart/form-data"))					form->method = FM_POST_MP;				mem_free(ax);			}		}		mem_free(al);	}	if ((al = get_url_val(a, "action"))) {		char *all = al;		while (all[0] == ' ') all++;		while (all[0] && all[strlen(all) - 1] == ' ') all[strlen(all) - 1] = 0;		form->action = join_urls(format.href_base, all);		mem_free(al);	} else {		if ((ch = strchr(form->action = stracpy(format.href_base), POST_CHAR))) *ch = 0;		if (form->method == FM_GET && (ch = strchr(form->action, '?'))) *ch = 0;	}	if ((al = get_target(a))) {		form->target = al;	} else {		form->target = stracpy(format.target_base);	}	if ((al=get_attr_val(a,"name")))	{		form->form_name=al;	}	if ((al=get_attr_val(a,"onsubmit")))	{		form->onsubmit=al;	}	form->num = a - startf;}void find_form_for_input(unsigned char *i){	unsigned char *s, *ss, *name, *attr, *lf, *la;	int namelen;	if (form.action) mem_free(form.action);	if (form.target) mem_free(form.target);	if (form.form_name) mem_free(form.form_name);	if (form.onsubmit) mem_free(form.onsubmit);	memset(&form, 0, sizeof(struct form));	if (!special_f(ff, SP_USED, NULL)) return;	if (last_form_tag && last_input_tag && i <= last_input_tag && i > last_form_tag) {		get_html_form(last_form_attr, &form);		return;	}	if (last_form_tag && last_input_tag && i > last_input_tag) s = last_form_tag;	else s = startf;	lf = NULL, la = NULL;	se:	while (s < i && *s != '<') sp:s++;	if (s >= i) goto end_parse;	if (s + 2 <= eofff && (s[1] == '!' || s[1] == '?')) {		s = skip_comment(s, i);		goto se;	}	ss = s;	if (parse_element(s, i, &name, &namelen, &attr, &s)) goto sp;	if (namelen != 4 || casecmp(name, "FORM", 4)) goto se;	lf = ss;	la = attr;	goto se;	end_parse:	if (lf) {		last_form_tag = lf;		last_form_attr = la;		last_input_tag = i;		get_html_form(la, &form);	} else last_form_tag = NULL;}void html_button(unsigned char *a){	char *al;	struct form_control *fc;	find_form_for_input(a);	fc = mem_calloc(sizeof(struct form_control));	if (!(al = get_attr_val(a, "type"))) {		fc->type = FC_SUBMIT;		goto xxx;	}	if (!strcasecmp(al, "submit")) fc->type = FC_SUBMIT;	else if (!strcasecmp(al, "reset")) fc->type = FC_RESET;	else if (!strcasecmp(al, "button")) fc->type = FC_BUTTON;	else {		mem_free(al);		mem_free(fc);		return;	}	mem_free(al);	xxx:	get_js_events(a);	fc->form_num = last_form_tag ? last_form_tag - startf : 0;	fc->ctrl_num = last_form_tag ? a - last_form_tag : a - startf;	fc->position = a - startf;	fc->method = form.method;	fc->action = stracpy(form.action);	fc->form_name = stracpy(form.form_name);	fc->onsubmit = stracpy(form.onsubmit);	fc->name = get_attr_val(a, "name");	fc->default_value = get_exact_attr_val(a, "value");	fc->ro = has_attr(a, "disabled") ? 2 : has_attr(a, "readonly") ? 1 : 0;	if (fc->type == FC_IMAGE) fc->alt = get_attr_val(a, "alt");	if (fc->type == FC_SUBMIT && !fc->default_value) fc->default_value = stracpy("Submit");	if (fc->type == FC_RESET && !fc->default_value) fc->default_value = stracpy("Reset");	if (fc->type == FC_BUTTON && !fc->default_value) fc->default_value = stracpy("BUTTON");	if (!fc->default_value) fc->default_value = stracpy("");	special_f(ff, SP_CONTROL, fc);	format.form = fc;	format.attr |= AT_BOLD | AT_FIXED;	/*put_chrs("[&nbsp;", 7, put_chars_f, ff);	if (fc->default_value) put_chrs(fc->default_value, strlen(fc->default_value), put_chars_f, ff);	put_chrs("&nbsp;]", 7, put_chars_f, ff);	put_chrs(" ", 1, put_chars_f, ff);*/}void html_input(unsigned char *a){	int i;	unsigned char *al;	struct form_control *fc;	find_form_for_input(a);	fc = mem_calloc(sizeof(struct form_control));	if (!(al = get_attr_val(a, "type"))) {		if (has_attr(a, "onclick")) fc->type = FC_BUTTON;		else fc->type = FC_TEXT;		goto xxx;	}	if (!strcasecmp(al, "text")) fc->type = FC_TEXT;	else if (!strcasecmp(al, "password")) fc->type = FC_PASSWORD;	else if (!strcasecmp(al, "checkbox")) fc->type = FC_CHECKBOX;	else if (!strcasecmp(al, "radio")) fc->type = FC_RADIO;	else if (!strcasecmp(al, "submit")) fc->type = FC_SUBMIT;	else if (!strcasecmp(al, "reset")) fc->type = FC_RESET;	else if (!strcasecmp(al, "file")) fc->type = FC_FILE;	else if (!strcasecmp(al, "hidden")) fc->type = FC_HIDDEN;	else if (!strcasecmp(al, "image")) fc->type = FC_IMAGE;	else if (!strcasecmp(al, "button")) fc->type = FC_BUTTON;	else fc->type = FC_TEXT;	mem_free(al);	xxx:	fc->form_num = last_form_tag ? last_form_tag - startf : 0;	fc->ctrl_num = last_form_tag ? a - last_form_tag : a - startf;	fc->position = a - startf;	fc->method = form.method;	fc->action = stracpy(form.action);	fc->form_name = stracpy(form.form_name);	fc->onsubmit = stracpy(form.onsubmit);	fc->target = stracpy(form.target);	fc->name = get_attr_val(a, "name");	if (fc->type == FC_TEXT || fc->type == FC_PASSWORD) fc->default_value = get_attr_val(a, "value");	else if (fc->type != FC_FILE) fc->default_value = get_exact_attr_val(a, "value");	if (fc->type == FC_CHECKBOX && !fc->default_value) fc->default_value = stracpy("on");	if ((fc->size = get_num(a, "size")) == -1) fc->size = HTML_DEFAULT_INPUT_SIZE;	fc->size++;	if (fc->size > d_opt->xw) fc->size = d_opt->xw;	if ((fc->maxlength = get_num(a, "maxlength")) == -1) fc->maxlength = MAXINT / 4;	if (fc->type == FC_CHECKBOX || fc->type == FC_RADIO) fc->default_state = has_attr(a, "checked");	fc->ro = has_attr(a, "disabled") ? 2 : has_attr(a, "readonly") ? 1 : 0;	if (fc->type == FC_IMAGE) {		fc->alt = get_attr_val(a, "alt");		if (!fc->alt) fc->alt = get_attr_val(a, "title");		if (!fc->alt) fc->alt = get_attr_val(a, "name");	}	if (fc->type == FC_SUBMIT && !fc->default_value) fc->default_value = stracpy("Submit");	if (fc->type == FC_RESET && !fc->default_value) fc->default_value = stracpy("Reset");	if (!fc->default_value) fc->default_value = stracpy("");	if (fc->type == FC_HIDDEN) goto hid;	put_chrs(" ", 1, put_chars_f, ff);	html_stack_dup();	format.form = fc;	get_js_events(a);	switch (fc->type) {		case FC_TEXT:		case FC_PASSWORD:		case FC_FILE:			format.attr |= AT_BOLD | AT_FIXED;			format.fontsize = 3;			for (i = 0; i < fc->size; i++) put_chrs("_", 1, put_chars_f, ff);			break;		case FC_CHECKBOX:			format.attr |= AT_BOLD | AT_FIXED;			format.fontsize = 3;			put_chrs("[&nbsp;]", 8, put_chars_f, ff);			break;		case FC_RADIO:			format.attr |= AT_BOLD | AT_FIXED;			format.fontsize = 3;			put_chrs("[&nbsp;]", 8, put_chars_f, ff);			break;		case FC_IMAGE:			if (!F || !d_opt->display_images) {				if (format.image) mem_free(format.image), format.image = NULL;				if ((al = get_url_val(a, "src")) || (al = get_url_val(a, "dynsrc"))) {					format.image = join_urls(format.href_base, al);					mem_free(al);				}				format.attr |= AT_BOLD | AT_FIXED;				put_chrs("[&nbsp;", 7, put_chars_f, ff);				if (fc->alt) put_chrs(fc->alt, strlen(fc->alt), put_chars_f, ff);				else put_chrs("Submit", 6, put_chars_f, ff);				put_chrs("&nbsp;]", 7, put_chars_f, ff);			} else html_img(a);			break;		case FC_SUBMIT:		case FC_RESET:			format.attr |= AT_BOLD | AT_FIXED;			format.fontsize = 3;			put_chrs("[&nbsp;", 7, put_chars_f, ff);			if (fc->default_value) put_chrs(fc->default_value, strlen(fc->default_value), put_chars_f, ff);			put_chrs("&nbsp;]", 7, put_chars_f, ff);			break;		case FC_BUTTON:			format.attr |= AT_BOLD | AT_FIXED;			format.fontsize = 3;			put_chrs("[&nbsp;", 7, put_chars_f, ff);			if (fc->default_value) put_chrs(fc->default_value, strlen(fc->default_value), put_chars_f, ff);			else put_chrs("BUTTON", 6, put_chars_f, ff);			put_chrs("&nbsp;]", 7, put_chars_f, ff);			break;		default:			internal("bad control type");	}	kill_html_stack_item(&html_top);	put_chrs(" ", 1, put_chars_f, ff);				hid:	special_f(ff, SP_CONTROL, fc);}void html_select(unsigned char *a){	char *al;	if (!(al = get_attr_val(a, "name"))) return;	html_top.dontkill = 1;	if (format.select) mem_free(format.select);	format.select = al;	format.select_disabled = 2 * has_attr(a, "disabled");}void html_option(unsigned char *a){	struct form_control *fc;	unsigned char *val;	find_form_for_input(a);	if (!format.select) return;	fc = mem_calloc(sizeof(struct form_control));	if (!(val = get_exact_attr_val(a, "value"))) {		unsigned char *p, *r;		unsigned char *name;		int namelen;		int l = 0;		for (p = a - 1; *p != '<'; p--) ;		val = init_str();		if (parse_element(p, eoff, NULL, NULL, NULL, &p)) {			internal("parse element failed");			goto x;		}		rrrr:		while (p < eoff && WHITECHAR(*p)) p++;		while (p < eoff && !WHITECHAR(*p) && *p != '<') {			pppp:			add_chr_to_str(&val, &l, *p), p++;		}		r = p;		while (r < eoff && WHITECHAR(*r)) r++;		if (r >= eoff) goto x;		if (r - 2 <= eoff && (r[1] == '!' || r[1] == '?')) {			p = skip_comment(r, eoff);			goto rrrr;		}		if (parse_element(r, eoff, &name, &namelen, NULL, &p)) goto pppp;		if (!((namelen == 6 && !casecmp(name, "OPTION", 6)) ||		    (namelen == 7 && !casecmp(name, "/OPTION", 7)) ||		    (namelen == 6 && !casecmp(name, "SELECT", 6)) ||		    (namelen == 7 && !casecmp(name, "/SELECT", 7)) ||		    (namelen == 8 && !casecmp(name, "OPTGROUP", 8)) ||		    (namelen == 9 && !casecmp(name, "/OPTGROUP", 9)))) goto rrrr;	}	x:	fc->form_num = last_form_tag ? last_form_tag - startf : 0;	fc->ctrl_num = last_form_tag ? a - last_form_tag : a - startf;	fc->position = a - startf;	fc->method = form.method;	fc->action = stracpy(form.action);	fc->form_name = stracpy(form.form_name);	fc->onsubmit = stracpy(form.onsubmit);	fc->type = FC_CHECKBOX;	fc->name = stracpy(format.select);	fc->default_value = val;	fc->default_state = has_attr(a, "selected");	fc->ro = format.select_disabled;	if (has_attr(a, "disabled")) fc->ro = 2;	put_chrs(" ", 1, put_chars_f, ff);	html_stack_dup();	format.form = fc;	format.attr |= AT_BOLD | AT_FIXED;	format.fontsize = 3;	put_chrs("[ ]", 3, put_chars_f, ff);	kill_html_stack_item(&html_top);	put_chrs(" ", 1, put_chars_f, ff);	special_f(ff, SP_CONTROL, fc);}void clr_white(unsigned char *name){	unsigned char *nm;	for (nm = name; *nm; nm++)		if (WHITECHAR(*nm) || *nm == 1) *nm = ' ';}void clr_spaces(unsigned char *name){	unsigned char *n1, *n2;	clr_white(name);	/*for (nm = name; *nm; nm++)		while (nm[0] == ' ' && (nm == name || nm[1] == ' ' || !nm[1]))			memmove(nm, nm + 1, strlen(nm));*/	if (!strchr(name, ' ')) return;	for (n1 = name, n2 = name; *n1; n1++)		if (!(n1[0] == ' ' && (n2 == name || n1[1] == ' ' || !n1[1])))			*n2++ = *n1;	*n2 = 0;}int menu_stack_size;struct menu_item **menu_stack;void new_menu_item(unsigned char *name, long data, int fullname)	/* name == NULL - up;	data == -1 - down */{	struct menu_item *top, *item, *nmenu = NULL; /* no uninitialized warnings */	if (name) {		clr_spaces(name);		if (!name[0]) mem_free(name), name = stracpy(" ");		if (name[0] == 1) name[0] = ' ';	}	if (name && data == -1) {		nmenu = mem_calloc(sizeof(struct menu_item));		/*nmenu->text = "";*/	}	if (menu_stack_size && name) {		top = item = menu_stack[menu_stack_size - 1];		while (item->text) item++;		if ((size_t)((char *)(item + 2) - (char *)top) > MAXINT) overalloc();		top = mem_realloc(top, (char *)(item + 2) - (char *)top);		item = item - menu_stack[menu_stack_size - 1] + top;		menu_stack[menu_stack_size - 1] = top;		if (menu_stack_size >= 2) {			struct menu_item *below = menu_stack[menu_stack_size - 2];			while (below->text) below++;			below[-1].data = top;		}		item->text = name;		item->rtext = data == -1 ? ">" : "";		item->hotkey = fullname ? "\000\001" : "\000\000"; /* dirty */		item->func = data == -1 ? MENU_FUNC do_select_submenu : MENU_FUNC selected_item;		item->data = data == -1 ? nmenu : (void *)(my_intptr_t)data;		item->in_m = data == -1 ? 1 : 0;		item->free_i = 0;		item++;		memset(item, 0, sizeof(struct menu_item));		/*item->text = "";*/	} else if (name) mem_free(name);	if (name && data == -1) {		if ((unsigned)menu_stack_size > MAXINT / sizeof(struct menu_item *) - 1) overalloc();		menu_stack = mem_realloc(menu_stack, (menu_stack_size + 1) * sizeof(struct menu_item *));		menu_stack[menu_stack_size++] = nmenu;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -