📄 html.c
字号:
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] = "* "; 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(" ", 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(". ", 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("[ ", 7, put_chars_f, ff); if (fc->default_value) put_chrs(fc->default_value, strlen(fc->default_value), put_chars_f, ff); put_chrs(" ]", 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("[ ]", 8, put_chars_f, ff); break; case FC_RADIO: format.attr |= AT_BOLD | AT_FIXED; format.fontsize = 3; put_chrs("[ ]", 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("[ ", 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(" ]", 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("[ ", 7, put_chars_f, ff); if (fc->default_value) put_chrs(fc->default_value, strlen(fc->default_value), put_chars_f, ff); put_chrs(" ]", 7, put_chars_f, ff); break; case FC_BUTTON: format.attr |= AT_BOLD | AT_FIXED; format.fontsize = 3; put_chrs("[ ", 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(" ]", 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 + -