From: yu.dongliang <18588496441@163.com> Date: Wed, 3 Jun 2026 14:43:08 +0000 (+0800) Subject: save length of const C string of html tag name X-Git-Url: http://baseworks.info/?a=commitdiff_plain;h=76e9633c88029bba5bded0bbd5cd3d34ef0c0c0b;p=abc.git save length of const C string of html tag name --- diff --git a/html/abc_css.c b/html/abc_css.c index ca18d4c..0a6713b 100644 --- a/html/abc_css.c +++ b/html/abc_css.c @@ -1,7 +1,7 @@ #include"abc_html.h" -int __html_add_attr (abc_obj_t* obj, int type, char** names, const char* value, int flags); -html_label_t* __html_find_label (const char* name); +int __html_add_attr (abc_obj_t* obj, int type, abc_str_t* names, size_t n_names, const char* value, int flags); +html_label_t* __html_find_label (const char* name, size_t len); html_label_t* __html_find_label2(const int type); static int __css_drop_comment(abc_obj_t* style) @@ -194,9 +194,12 @@ static int __css_parse_attr2(abc_obj_t* style, css_rule_t* css, const html_attr_ int j; int k; for (i = 0; attrs && i < n_attrs; i++) { + abc_str_t* s; - for (j = 0; attrs[i].names[j]; j++) { - if (!__html_strcmp(attrs[i].names[j], key->data)) + for (j = 0; j < attrs[i].n_names; j++) { + s = &(attrs[i].names[j]); + + if (s->len == key->len && !__html_strcmp(s->data, key->data)) goto found; } } @@ -211,7 +214,7 @@ found: attr = css->attrs[k - ABC_CSS_CLASS]; if (!attr) { - int ret = __html_add_attr((abc_obj_t*)css, attrs[i].type, attrs[i].names, attrs[i].value, attrs[i].flags); + int ret = __html_add_attr((abc_obj_t*)css, attrs[i].type, attrs[i].names, attrs[i].n_names, attrs[i].value, attrs[i].flags); if (ret < 0) return ret; @@ -335,19 +338,22 @@ static int __css_parse_type(css_rule_t* css) else if (combinator >= 0) label = __html_find_label2(ABC_CSS_COMBINATOR); else { - label = __html_find_label(css->text->data); + label = __html_find_label(css->text->data, css->text->len); if (!label) { scf_loge("css selector '%s' invalid, file: %s, line: %d\n", css->text->data, css->file->data, css->line); return -EINVAL; } + scf_logd("css selector '%s', label->name: %s\n", css->text->data, label->names[0].data); + scf_string_free(css->text); css->text = NULL; } - css->type = label->type; - css->keys = label->names; - css->flags = label->flags; + css->type = label->type; + css->keys = label->names; + css->n_keys = label->n_names; + css->flags = label->flags; if (css->text) { if (j < 0) @@ -367,11 +373,7 @@ static int __css_parse_type(css_rule_t* css) case '~': j++; default: - c = css->text->data[k]; - css->text->data[k] = '\0'; - - label = __html_find_label(css->text->data + j); - css->text->data[k] = c; + label = __html_find_label(css->text->data + j, k - j); css->key_type = label->type; break; @@ -413,6 +415,7 @@ static int __css_parse_selectors(abc_obj_t* style, scf_string_t* key, html_label css->flags = label->flags; css->keys = label->names; + css->n_keys = label->n_names; css->parent = style; css->text = key; @@ -1216,7 +1219,7 @@ static abc_obj_t* __css_select_by_attr(css_rule_t* css, abc_obj_t* current, scf_ if (!current) return NULL; - scf_logi("current: %s, key: %.*s, m: %d, n: %d, next: %.*s\n", current->keys[0], len, key, m, n, + scf_logi("current: %s, key: %.*s, m: %d, n: %d, next: %.*s\n", current->keys[0].data, len, key, m, n, n - m, css->text->data + m); break; default: @@ -1391,9 +1394,10 @@ int css_hash_update_attrs(css_hash_t* h, css_rule_t* r) return -ENOMEM; } - copy->type = attr->type; - copy->keys = attr->keys; - copy->flags = attr->flags; + copy->type = attr->type; + copy->keys = attr->keys; + copy->n_keys = attr->n_keys; + copy->flags = attr->flags; if (h->cache_attrs[i]) abc_attr_free(h->cache_attrs[i]); diff --git a/html/abc_html.c b/html/abc_html.c index 445eea5..c0af1e8 100644 --- a/html/abc_html.c +++ b/html/abc_html.c @@ -1,229 +1,231 @@ #include"abc_html.h" // HTML & CSS attrs -static char* src_keys[] = {"src", "源", NULL}; -static char* rel_keys[] = {"rel", "关系", NULL}; -static char* alt_keys[] = {"alt", "替代文本", NULL}; -static char* href_keys[] = {"href", "地址", NULL}; - -static char* width_keys[] = {"width", "宽度", NULL}; -static char* height_keys[] = {"height", "高度", NULL}; - -static char* display_keys[] = {"display", "显示模式", NULL}; -static char* visible_keys[] = {"visibility", "可见性", NULL}; -static char* opacity_keys[] = {"opacity", "透明度", NULL}; -static char* filter_keys[] = {"filter", "滤镜", NULL}; - -static char* margin_keys[] = {"margin", "外边距", NULL}; -static char* margin_top_keys[] = {"margin-top", "上边缘", NULL}; -static char* margin_bottom_keys[] = {"margin-bottom", "下边缘", NULL}; -static char* margin_left_keys[] = {"margin-left", "左边缘", NULL}; -static char* margin_right_keys[] = {"margin-right", "右边缘", NULL}; - -static char* border_keys[] = {"border", "边框", NULL}; -static char* border_top_keys[] = {"border-top", "上边框", NULL}; -static char* border_bottom_keys[] = {"border-bottom", "下边框", NULL}; -static char* border_left_keys[] = {"border-left", "左边框", NULL}; -static char* border_right_keys[] = {"border-right", "右边框", NULL}; - -static char* padding_keys[] = {"padding", "内边距", NULL}; -static char* padding_top_keys[] = {"padding-top", "上填充", NULL}; -static char* padding_bottom_keys[] = {"padding-bottom", "下填充", NULL}; -static char* padding_left_keys[] = {"padding-left", "左填充", NULL}; -static char* padding_right_keys[] = {"padding-right", "右填充", NULL}; - -static char* position_keys[] = {"position", "定位", NULL}; -static char* top_keys[] = {"top", "上", NULL}; -static char* bottom_keys[] = {"bottom", "下", NULL}; -static char* left_keys[] = {"left", "左", NULL}; -static char* right_keys[] = {"right", "右", NULL}; - -static char* font_keys[] = {"font", "字体", NULL}; -static char* font_size_keys[] = {"font-size", "字号", NULL}; -static char* font_color_keys[] = {"font-color", "字体颜色", "color", "颜色", NULL}; -static char* font_style_keys[] = {"style", "字体风格", NULL}; - -static char* text_align_keys[] = {"text-align", "对齐", NULL}; -static char* text_decoration_keys[] = {"text-decoration", "下划线", NULL}; -static char* text_transform_keys[] = {"text-transform", "大小写", NULL}; -static char* text_indent_keys[] = {"text-transform", "缩进", NULL}; - -static char* vertical_align_keys[] = {"vertical-align", "垂直对齐", NULL}; - -static char* bg_keys[] = {"background", "背景", NULL}; -static char* bg_color_keys[] = {"background-color", "背景颜色", NULL}; -static char* bg_image_keys[] = {"background-image", "背景图片", NULL}; -static char* bg_repeat_keys[] = {"background-repeat", "背景重复", NULL}; -static char* bg_position_keys[] = {"background-position", "背景位置", NULL}; - -static char* overflow_keys[] = {"overflow", "内容溢出", NULL}; -static char* scroll_width_keys[] = {"scrollbar-width", "滚动条宽度", NULL}; -static char* scroll_color_keys[] = {"scrollbar-color", "滚动条颜色", NULL}; - -static char* list_style_keys[] = {"list-style", "列表风格", NULL}; -static char* list_style_type_keys[] = {"list-style-type", "列表标记", NULL}; -static char* list_style_image_keys[] = {"list-style-image", "列表标记图片", NULL}; -static char* list_style_pos_keys[] = {"list-style-position", "列表标记位置", NULL}; - -static char* border_collapse_keys[] = {"border-collapse", "边框折叠", NULL}; - -static char* class_keys[] = {"class", "类名", NULL}; -static char* type_keys[] = {"type", "类型", NULL}; -static char* name_keys[] = {"name", "名字", NULL}; -static char* for_keys[] = {"for", "关于", NULL}; -static char* id_keys[] = {"id", "编号", NULL}; - -static char* size_keys[] = {"size", NULL}; -static char* value_keys[] = {"value", "值", NULL}; -static char* action_keys[] = {"action", "动作", NULL}; -static char* method_keys[] = {"method", "方法", NULL}; -static char* control_keys[] = {"controls", "控件", NULL}; - -static char* xmlns_keys[] = {"xmlns", NULL}; -static char* xmlang_keys[] = {"xml:lang", NULL}; -static char* lang_keys[] = {"lang", "语言", NULL}; - -static char* http_equiv_keys[] = {"http-equiv", NULL}; -static char* content_keys[] = {"content", "正文类型", NULL}; -static char* charset_keys[] = {"charset", "字符集", NULL}; - -static char* enctype_keys[] = {"enctype", NULL}; - +static abc_str_t src_keys[] = {ABC_STR("src"), ABC_STR("源")}; +static abc_str_t rel_keys[] = {ABC_STR("rel"), ABC_STR("关系")}; +static abc_str_t alt_keys[] = {ABC_STR("alt"), ABC_STR("替代文本")}; +static abc_str_t href_keys[] = {ABC_STR("href"), ABC_STR("地址")}; + +static abc_str_t width_keys[] = {ABC_STR("width"), ABC_STR("宽度")}; +static abc_str_t height_keys[] = {ABC_STR("height"), ABC_STR("高度")}; +static abc_str_t display_keys[] = {ABC_STR("display"), ABC_STR("显示模式")}; +static abc_str_t visible_keys[] = {ABC_STR("visibility"), ABC_STR("可见性")}; +static abc_str_t opacity_keys[] = {ABC_STR("opacity"), ABC_STR("透明度")}; +static abc_str_t filter_keys[] = {ABC_STR("filter"), ABC_STR("滤镜")}; + +static abc_str_t margin_keys[] = {ABC_STR("margin"), ABC_STR("外边距")}; +static abc_str_t margin_top_keys[] = {ABC_STR("margin-top"), ABC_STR("上边缘")}; +static abc_str_t margin_bottom_keys[] = {ABC_STR("margin-bottom"), ABC_STR("下边缘")}; +static abc_str_t margin_left_keys[] = {ABC_STR("margin-left"), ABC_STR("左边缘")}; +static abc_str_t margin_right_keys[] = {ABC_STR("margin-right"), ABC_STR("右边缘")}; + +static abc_str_t border_keys[] = {ABC_STR("border"), ABC_STR("边框")}; +static abc_str_t border_top_keys[] = {ABC_STR("border-top"), ABC_STR("上边框")}; +static abc_str_t border_bottom_keys[] = {ABC_STR("border-bottom"), ABC_STR("下边框")}; +static abc_str_t border_left_keys[] = {ABC_STR("border-left"), ABC_STR("左边框")}; +static abc_str_t border_right_keys[] = {ABC_STR("border-right"), ABC_STR("右边框")}; + +static abc_str_t padding_keys[] = {ABC_STR("padding"), ABC_STR("内边距")}; +static abc_str_t padding_top_keys[] = {ABC_STR("padding-top"), ABC_STR("上填充")}; +static abc_str_t padding_bottom_keys[] = {ABC_STR("padding-bottom"), ABC_STR("下填充")}; +static abc_str_t padding_left_keys[] = {ABC_STR("padding-left"), ABC_STR("左填充")}; +static abc_str_t padding_right_keys[] = {ABC_STR("padding-right"), ABC_STR("右填充")}; + +static abc_str_t position_keys[] = {ABC_STR("position"), ABC_STR("定位")}; +static abc_str_t top_keys[] = {ABC_STR("top"), ABC_STR("上")}; +static abc_str_t bottom_keys[] = {ABC_STR("bottom"), ABC_STR("下")}; +static abc_str_t left_keys[] = {ABC_STR("left"), ABC_STR("左")}; +static abc_str_t right_keys[] = {ABC_STR("right"), ABC_STR("右")}; + +static abc_str_t font_keys[] = {ABC_STR("font"), ABC_STR("字体")}; +static abc_str_t font_size_keys[] = {ABC_STR("font-size"), ABC_STR("字号")}; +static abc_str_t font_color_keys[] = {ABC_STR("font-color"), ABC_STR("字体颜色"), ABC_STR("color"), ABC_STR("颜色")}; +static abc_str_t font_style_keys[] = {ABC_STR("style"), ABC_STR("字体风格")}; + +static abc_str_t text_align_keys[] = {ABC_STR("text-align"), ABC_STR("对齐")}; +static abc_str_t text_decoration_keys[] = {ABC_STR("text-decoration"), ABC_STR("下划线")}; +static abc_str_t text_transform_keys[] = {ABC_STR("text-transform"), ABC_STR("大小写")}; +static abc_str_t text_indent_keys[] = {ABC_STR("text-indent"), ABC_STR("缩进")}; +static abc_str_t vertical_align_keys[] = {ABC_STR("vertical-align"), ABC_STR("垂直对齐")}; + +static abc_str_t bg_keys[] = {ABC_STR("background"), ABC_STR("背景")}; +static abc_str_t bg_color_keys[] = {ABC_STR("background-color"), ABC_STR("背景颜色")}; +static abc_str_t bg_image_keys[] = {ABC_STR("background-image"), ABC_STR("背景图片")}; +static abc_str_t bg_repeat_keys[] = {ABC_STR("background-repeat"), ABC_STR("背景重复")}; +static abc_str_t bg_position_keys[] = {ABC_STR("background-position"), ABC_STR("背景位置")}; + +static abc_str_t overflow_keys[] = {ABC_STR("overflow"), ABC_STR("内容溢出")}; +static abc_str_t scroll_width_keys[] = {ABC_STR("scrollbar-width"), ABC_STR("滚动条宽度")}; +static abc_str_t scroll_color_keys[] = {ABC_STR("scrollbar-color"), ABC_STR("滚动条颜色")}; + +static abc_str_t list_style_keys[] = {ABC_STR("list-style"), ABC_STR("列表风格")}; +static abc_str_t list_style_type_keys[] = {ABC_STR("list-style-type"), ABC_STR("列表标记")}; +static abc_str_t list_style_image_keys[] = {ABC_STR("list-style-image"), ABC_STR("列表标记图片")}; +static abc_str_t list_style_pos_keys[] = {ABC_STR("list-style-position"), ABC_STR("列表标记位置")}; + +static abc_str_t border_collapse_keys[] = {ABC_STR("border-collapse"), ABC_STR("边框折叠")}; + +static abc_str_t class_keys[] = {ABC_STR("class"), ABC_STR("类名")}; +static abc_str_t type_keys[] = {ABC_STR("type"), ABC_STR("类型")}; +static abc_str_t name_keys[] = {ABC_STR("name"), ABC_STR("名字")}; +static abc_str_t for_keys[] = {ABC_STR("for"), ABC_STR("关于")}; +static abc_str_t id_keys[] = {ABC_STR("id"), ABC_STR("编号")}; + +static abc_str_t size_keys[] = {ABC_STR("size"), ABC_STR("大小")}; +static abc_str_t value_keys[] = {ABC_STR("value"), ABC_STR("值")}; +static abc_str_t action_keys[] = {ABC_STR("action"), ABC_STR("动作")}; +static abc_str_t method_keys[] = {ABC_STR("method"), ABC_STR("方法")}; +static abc_str_t control_keys[] = {ABC_STR("controls"), ABC_STR("控件")}; + +static abc_str_t xmlns_keys[] = {ABC_STR("xmlns")}; +static abc_str_t xmlang_keys[] = {ABC_STR("xml:lang")}; +static abc_str_t lang_keys[] = {ABC_STR("lang"), ABC_STR("语言")}; +static abc_str_t content_keys[] = {ABC_STR("content"), ABC_STR("正文类型")}; +static abc_str_t charset_keys[] = {ABC_STR("charset"), ABC_STR("字符集")}; +static abc_str_t enctype_keys[] = {ABC_STR("enctype")}; + +static abc_str_t http_equiv_keys[] = {ABC_STR("http-equiv")}; // HTML labels -static char* html_keys[] = {"html", "网页", NULL}; -static char* head_keys[] = {"head", "头部", NULL}; -static char* body_keys[] = {"body", "主体", NULL}; -static char* form_keys[] = {"form", "表单", NULL}; -static char* link_keys[] = {"link", "链接", NULL}; -static char* div_keys[] = {"div", "分区", NULL}; -static char* img_keys[] = {"img", "图片", NULL}; - -static char* meta_keys[] = {"meta", NULL}; - -static char* center_keys[] = {"center", "居中", NULL}; -static char* title_keys[] = {"title", "标题", NULL}; -static char* input_keys[] = {"input", "输入", NULL}; -static char* label_keys[] = {"label", "标签", NULL}; - -static char* video_keys[] = {"video", "视频", NULL}; -static char* audio_keys[] = {"audio", "音频", NULL}; -static char* source_keys[] = {"source", "源", NULL}; - -static char* table_keys[] = {"table", "表格", NULL}; -static char* th_keys[] = {"th", "表头", NULL}; -static char* tr_keys[] = {"tr", "行", NULL}; -static char* td_keys[] = {"td", "列", NULL}; - -static char* ol_keys[] = {"ol", "有序列表", NULL}; -static char* ul_keys[] = {"ul", "无序列表", NULL}; -static char* li_keys[] = {"li", "列表项", NULL}; - -static char* br_keys[] = {"br", "换行", NULL}; -static char* hr_keys[] = {"hr", "标题换行", NULL}; - -static char* h1_keys[] = {"h1", "标题1", NULL}; -static char* h2_keys[] = {"h2", "标题2", NULL}; -static char* h3_keys[] = {"h3", "标题3", NULL}; -static char* h4_keys[] = {"h4", "标题4", NULL}; -static char* h5_keys[] = {"h5", "标题5", NULL}; -static char* h6_keys[] = {"h6", "标题6", NULL}; -static char* p_keys[] = {"p", "段落", NULL}; -static char* a_keys[] = {"a", "超链接", NULL}; -static char* b_keys[] = {"b", "加粗", NULL}; -static char* i_keys[] = {"i", "斜体", NULL}; - -static char* play_keys[] = {"play", "播放", NULL}; -static char* progress_keys[] = {"progress", "进度条", NULL}; - -static char* script_keys[] = {"script", "脚本", NULL}; -static char* style_keys[] = {"style", "样式", NULL}; +static abc_str_t html_keys[] = {ABC_STR("html"), ABC_STR("网页")}; +static abc_str_t head_keys[] = {ABC_STR("head"), ABC_STR("头部")}; +static abc_str_t body_keys[] = {ABC_STR("body"), ABC_STR("主体")}; +static abc_str_t form_keys[] = {ABC_STR("form"), ABC_STR("表单")}; +static abc_str_t link_keys[] = {ABC_STR("link"), ABC_STR("链接")}; +static abc_str_t div_keys[] = {ABC_STR("div"), ABC_STR("分区")}; +static abc_str_t img_keys[] = {ABC_STR("img"), ABC_STR("图片")}; +static abc_str_t meta_keys[] = {ABC_STR("meta")}; + +static abc_str_t center_keys[] = {ABC_STR("center"), ABC_STR("居中")}; +static abc_str_t title_keys[] = {ABC_STR("title"), ABC_STR("标题")}; +static abc_str_t input_keys[] = {ABC_STR("input"), ABC_STR("输入")}; +static abc_str_t label_keys[] = {ABC_STR("label"), ABC_STR("标签")}; + +static abc_str_t video_keys[] = {ABC_STR("video"), ABC_STR("视频")}; +static abc_str_t audio_keys[] = {ABC_STR("audio"), ABC_STR("音频")}; +static abc_str_t source_keys[] = {ABC_STR("source"), ABC_STR("源")}; + +static abc_str_t table_keys[] = {ABC_STR("table"), ABC_STR("表格")}; +static abc_str_t th_keys[] = {ABC_STR("th"), ABC_STR("表头")}; +static abc_str_t tr_keys[] = {ABC_STR("tr"), ABC_STR("行")}; +static abc_str_t td_keys[] = {ABC_STR("td"), ABC_STR("列")}; + +static abc_str_t ol_keys[] = {ABC_STR("ol"), ABC_STR("有序列表")}; +static abc_str_t ul_keys[] = {ABC_STR("ul"), ABC_STR("无序列表")}; +static abc_str_t li_keys[] = {ABC_STR("li"), ABC_STR("列表项")}; + +static abc_str_t h1_keys[] = {ABC_STR("h1"), ABC_STR("标题1")}; +static abc_str_t h2_keys[] = {ABC_STR("h2"), ABC_STR("标题2")}; +static abc_str_t h3_keys[] = {ABC_STR("h3"), ABC_STR("标题3")}; +static abc_str_t h4_keys[] = {ABC_STR("h4"), ABC_STR("标题4")}; +static abc_str_t h5_keys[] = {ABC_STR("h5"), ABC_STR("标题5")}; +static abc_str_t h6_keys[] = {ABC_STR("h6"), ABC_STR("标题6")}; +static abc_str_t hr_keys[] = {ABC_STR("hr"), ABC_STR("标题换行")}; + +static abc_str_t p_keys[] = {ABC_STR("p"), ABC_STR("段落")}; +static abc_str_t a_keys[] = {ABC_STR("a"), ABC_STR("超链接")}; +static abc_str_t b_keys[] = {ABC_STR("b"), ABC_STR("加粗")}; +static abc_str_t i_keys[] = {ABC_STR("i"), ABC_STR("斜体")}; +static abc_str_t br_keys[] = {ABC_STR("br"), ABC_STR("换行")}; + +static abc_str_t play_keys[] = {ABC_STR("play"), ABC_STR("播放")}; +static abc_str_t progress_keys[] = {ABC_STR("progress"), ABC_STR("进度条")}; + +static abc_str_t script_keys[] = {ABC_STR("script"), ABC_STR("脚本")}; +static abc_str_t style_keys[] = {ABC_STR("style"), ABC_STR("样式")}; // css selectors -static char* css_id_keys[] = {"#", NULL}; -static char* css_class_keys[] = {".", NULL}; -static char* css_attr_keys[] = {"[]", NULL}; -static char* css_other_keys[] = {"*", NULL}; -static char* css_pse_class_keys[] = {":", NULL}; -static char* css_pse_element_keys[] = {"::", NULL}; +static abc_str_t css_id_keys[] = {ABC_STR("#")}; +static abc_str_t css_class_keys[] = {ABC_STR(".")}; +static abc_str_t css_attr_keys[] = {ABC_STR("[]")}; +static abc_str_t css_other_keys[] = {ABC_STR("*")}; +static abc_str_t css_pse_class_keys[] = {ABC_STR(":")}; +static abc_str_t css_pse_element_keys[] = {ABC_STR("::")}; // css pse class (element) -static char* css_link_keys[] = {":link", "未访问", NULL}; -static char* css_visited_keys[] = {":visited", "已访问", NULL}; -static char* css_hover_keys[] = {":hover", "正在指向", NULL}; -static char* css_active_keys[] = {":active", "正在点击", NULL}; +static abc_str_t css_link_keys[] = {ABC_STR(":link"), ABC_STR("未访问")}; +static abc_str_t css_visited_keys[] = {ABC_STR(":visited"), ABC_STR("已访问")}; +static abc_str_t css_hover_keys[] = {ABC_STR(":hover"), ABC_STR("正在指向")}; +static abc_str_t css_active_keys[] = {ABC_STR(":active"), ABC_STR("正在点击")}; + +static abc_str_t css_first_child_keys[] = {ABC_STR(":first-child"), ABC_STR("第1个子元素"), ABC_STR("第一个子元素")}; -static char* css_first_child_keys[] = {":first-child", "第1个子元素", "第一个子元素", NULL}; static html_attr_t html_attrs[] = { #define ABC_CSS_BOX(display, margin, border, padding) \ - {display_keys, #display, ABC_CSS_DISPLAY, ABC_HTML_FLAG_SHOW}, \ - {visible_keys, "", ABC_CSS_VISIBILITY, ABC_HTML_FLAG_SHOW}, \ - {border_keys, #border, ABC_CSS_BORDER, ABC_HTML_FLAG_SHOW}, \ - {border_top_keys, #border, ABC_CSS_BORDER_TOP, ABC_HTML_FLAG_SHOW}, \ - {border_bottom_keys, #border, ABC_CSS_BORDER_BOTTOM, ABC_HTML_FLAG_SHOW}, \ - {border_left_keys, #border, ABC_CSS_BORDER_LEFT, ABC_HTML_FLAG_SHOW}, \ - {border_right_keys, #border, ABC_CSS_BORDER_RIGHT, ABC_HTML_FLAG_SHOW}, \ + {display_keys, abc_number_of(display_keys), #display, ABC_CSS_DISPLAY, ABC_HTML_FLAG_SHOW}, \ + {visible_keys, abc_number_of(visible_keys), "", ABC_CSS_VISIBILITY, ABC_HTML_FLAG_SHOW}, \ + {border_keys, abc_number_of(border_keys), #border, ABC_CSS_BORDER, ABC_HTML_FLAG_SHOW}, \ + {border_top_keys, abc_number_of(border_top_keys), #border, ABC_CSS_BORDER_TOP, ABC_HTML_FLAG_SHOW}, \ + {border_bottom_keys, abc_number_of(border_bottom_keys), #border, ABC_CSS_BORDER_BOTTOM, ABC_HTML_FLAG_SHOW}, \ + {border_left_keys, abc_number_of(border_left_keys), #border, ABC_CSS_BORDER_LEFT, ABC_HTML_FLAG_SHOW}, \ + {border_right_keys, abc_number_of(border_right_keys), #border, ABC_CSS_BORDER_RIGHT, ABC_HTML_FLAG_SHOW}, \ \ - {margin_keys, #margin, ABC_CSS_MARGIN, ABC_HTML_FLAG_SHOW}, \ - {margin_top_keys, #margin, ABC_CSS_MARGIN_TOP, ABC_HTML_FLAG_SHOW}, \ - {margin_bottom_keys, #margin, ABC_CSS_MARGIN_BOTTOM, ABC_HTML_FLAG_SHOW}, \ - {margin_left_keys, #margin, ABC_CSS_MARGIN_LEFT, ABC_HTML_FLAG_SHOW}, \ - {margin_right_keys, #margin, ABC_CSS_MARGIN_RIGHT, ABC_HTML_FLAG_SHOW}, \ + {margin_keys, abc_number_of(margin_keys), #margin, ABC_CSS_MARGIN, ABC_HTML_FLAG_SHOW}, \ + {margin_top_keys, abc_number_of(margin_top_keys), #margin, ABC_CSS_MARGIN_TOP, ABC_HTML_FLAG_SHOW}, \ + {margin_bottom_keys, abc_number_of(margin_bottom_keys), #margin, ABC_CSS_MARGIN_BOTTOM, ABC_HTML_FLAG_SHOW}, \ + {margin_left_keys, abc_number_of(margin_left_keys), #margin, ABC_CSS_MARGIN_LEFT, ABC_HTML_FLAG_SHOW}, \ + {margin_right_keys, abc_number_of(margin_right_keys), #margin, ABC_CSS_MARGIN_RIGHT, ABC_HTML_FLAG_SHOW}, \ \ - {padding_keys, #padding, ABC_CSS_PADDING, ABC_HTML_FLAG_SHOW}, \ - {padding_top_keys, #padding, ABC_CSS_PADDING_TOP, ABC_HTML_FLAG_SHOW}, \ - {padding_bottom_keys, #padding, ABC_CSS_PADDING_BOTTOM, ABC_HTML_FLAG_SHOW}, \ - {padding_left_keys, #padding, ABC_CSS_PADDING_LEFT, ABC_HTML_FLAG_SHOW}, \ - {padding_right_keys, #padding, ABC_CSS_PADDING_RIGHT, ABC_HTML_FLAG_SHOW}, \ + {padding_keys, abc_number_of(padding_keys), #padding, ABC_CSS_PADDING, ABC_HTML_FLAG_SHOW}, \ + {padding_top_keys, abc_number_of(padding_top_keys), #padding, ABC_CSS_PADDING_TOP, ABC_HTML_FLAG_SHOW}, \ + {padding_bottom_keys, abc_number_of(padding_bottom_keys), #padding, ABC_CSS_PADDING_BOTTOM, ABC_HTML_FLAG_SHOW}, \ + {padding_left_keys, abc_number_of(padding_left_keys), #padding, ABC_CSS_PADDING_LEFT, ABC_HTML_FLAG_SHOW}, \ + {padding_right_keys, abc_number_of(padding_right_keys), #padding, ABC_CSS_PADDING_RIGHT, ABC_HTML_FLAG_SHOW}, \ \ - {position_keys, "", ABC_CSS_POSITION, ABC_HTML_FLAG_SHOW}, \ - {top_keys, "", ABC_CSS_TOP, ABC_HTML_FLAG_SHOW}, \ - {bottom_keys, "", ABC_CSS_BOTTOM, ABC_HTML_FLAG_SHOW}, \ - {left_keys, "", ABC_CSS_LEFT, ABC_HTML_FLAG_SHOW}, \ - {right_keys, "", ABC_CSS_RIGHT, ABC_HTML_FLAG_SHOW}, \ + {position_keys, abc_number_of(position_keys), "", ABC_CSS_POSITION, ABC_HTML_FLAG_SHOW}, \ + {top_keys, abc_number_of(top_keys), "", ABC_CSS_TOP, ABC_HTML_FLAG_SHOW}, \ + {bottom_keys, abc_number_of(bottom_keys), "", ABC_CSS_BOTTOM, ABC_HTML_FLAG_SHOW}, \ + {left_keys, abc_number_of(left_keys), "", ABC_CSS_LEFT, ABC_HTML_FLAG_SHOW}, \ + {right_keys, abc_number_of(right_keys), "", ABC_CSS_RIGHT, ABC_HTML_FLAG_SHOW}, \ \ - {width_keys, "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW}, \ - {height_keys, "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW}, + {width_keys, abc_number_of(width_keys), "", ABC_HTML_ATTR_WIDTH, ABC_HTML_FLAG_SHOW}, \ + {height_keys, abc_number_of(height_keys), "", ABC_HTML_ATTR_HEIGHT, ABC_HTML_FLAG_SHOW}, \ + {opacity_keys, abc_number_of(opacity_keys), "1.0", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, \ + {filter_keys, abc_number_of(filter_keys), "", ABC_CSS_FILTER, 0}, #define ABC_CSS_SCROLL(overflow, scroll_width, scroll_color) \ - {overflow_keys, #overflow, ABC_CSS_OVERFLOW, ABC_HTML_FLAG_SHOW}, \ - {scroll_width_keys, #scroll_width, ABC_CSS_SCROLLBAR_WIDTH, ABC_HTML_FLAG_SHOW}, \ - {scroll_color_keys, #scroll_color, ABC_CSS_SCROLLBAR_COLOR, ABC_HTML_FLAG_SHOW}, + {overflow_keys, abc_number_of(overflow_keys), #overflow, ABC_CSS_OVERFLOW, ABC_HTML_FLAG_SHOW}, \ + {scroll_width_keys, abc_number_of(scroll_width_keys), #scroll_width, ABC_CSS_SCROLLBAR_WIDTH, ABC_HTML_FLAG_SHOW}, \ + {scroll_color_keys, abc_number_of(scroll_color_keys), #scroll_color, ABC_CSS_SCROLLBAR_COLOR, ABC_HTML_FLAG_SHOW}, #define ABC_CSS_SELECTOR(type) \ - {style_keys, "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW}, \ - {title_keys, "", ABC_HTML_ATTR_TITLE, ABC_HTML_FLAG_SHOW}, \ - {type_keys, #type, ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, \ - {name_keys, "", ABC_HTML_ATTR_NAME, ABC_HTML_FLAG_SHOW}, \ - {class_keys, "", ABC_CSS_CLASS, ABC_HTML_FLAG_SHOW}, \ - {id_keys, "", ABC_CSS_ID, ABC_HTML_FLAG_SHOW}, + {style_keys, abc_number_of(style_keys), "", ABC_HTML_ATTR_STYLE, ABC_HTML_FLAG_SHOW}, \ + {title_keys, abc_number_of(title_keys), "", ABC_HTML_ATTR_TITLE, ABC_HTML_FLAG_SHOW}, \ + {type_keys, abc_number_of(type_keys), #type, ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, \ + {name_keys, abc_number_of(name_keys), "", ABC_HTML_ATTR_NAME, ABC_HTML_FLAG_SHOW}, \ + {class_keys, abc_number_of(class_keys), "", ABC_CSS_CLASS, ABC_HTML_FLAG_SHOW}, \ + {id_keys, abc_number_of(id_keys), "", ABC_CSS_ID, ABC_HTML_FLAG_SHOW}, #define ABC_CSS_BACK_GROUND(color) \ - {bg_keys, "", ABC_HTML_ATTR_BG, ABC_HTML_FLAG_SHOW}, \ - {bg_color_keys, #color, ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW}, \ - {bg_image_keys, "", ABC_HTML_ATTR_BG_IMAGE, ABC_HTML_FLAG_SHOW}, \ - {bg_repeat_keys, "", ABC_HTML_ATTR_BG_REPEAT, ABC_HTML_FLAG_SHOW}, \ - {bg_position_keys, "", ABC_HTML_ATTR_BG_POSITION, ABC_HTML_FLAG_SHOW}, \ + {bg_keys, abc_number_of(bg_keys), "", ABC_HTML_ATTR_BG, ABC_HTML_FLAG_SHOW}, \ + {bg_color_keys, abc_number_of(bg_color_keys), #color, ABC_HTML_ATTR_BG_COLOR, ABC_HTML_FLAG_SHOW}, \ + {bg_image_keys, abc_number_of(bg_image_keys), "", ABC_HTML_ATTR_BG_IMAGE, ABC_HTML_FLAG_SHOW}, \ + {bg_repeat_keys, abc_number_of(bg_repeat_keys), "", ABC_HTML_ATTR_BG_REPEAT, ABC_HTML_FLAG_SHOW}, \ + {bg_position_keys, abc_number_of(bg_position_keys), "", ABC_HTML_ATTR_BG_POSITION, ABC_HTML_FLAG_SHOW}, #define ABC_CSS_FONT(font, size, color, style) \ - {font_keys, #font, ABC_HTML_ATTR_FONT, 0}, \ - {font_size_keys, #size, ABC_HTML_ATTR_FONT_SIZE, 0}, \ - {font_color_keys, #color, ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW}, \ - {font_style_keys, #style, ABC_HTML_ATTR_FONT_STYLE, 0}, + {font_keys, abc_number_of(font_keys), #font, ABC_HTML_ATTR_FONT, 0}, \ + {font_size_keys, abc_number_of(font_size_keys), #size, ABC_HTML_ATTR_FONT_SIZE, 0}, \ + {font_color_keys, abc_number_of(font_color_keys), #color, ABC_HTML_ATTR_FONT_COLOR, ABC_HTML_FLAG_SHOW}, \ + {font_style_keys, abc_number_of(font_style_keys), #style, ABC_HTML_ATTR_FONT_STYLE, 0}, \ + {size_keys, abc_number_of(size_keys), "", ABC_HTML_ATTR_SIZE, ABC_HTML_FLAG_SHOW}, \ + {value_keys, abc_number_of(value_keys), "", ABC_HTML_ATTR_VALUE, ABC_HTML_FLAG_SHOW}, #define ABC_CSS_TEXT(align, underline) \ - {text_align_keys, #align, ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW}, \ - {text_decoration_keys, #underline, ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW}, \ - {text_transform_keys, "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW}, \ - {text_indent_keys, "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW}, - -#define ABC_CSS_PSE_MOUSE() \ - {css_link_keys, "", ABC_CSS_LINK, ABC_HTML_FLAG_SHOW}, \ - {css_visited_keys, "", ABC_CSS_VISITED, ABC_HTML_FLAG_SHOW}, \ - {css_hover_keys, "", ABC_CSS_HOVER, ABC_HTML_FLAG_SHOW}, \ - {css_active_keys, "", ABC_CSS_ACTIVE, ABC_HTML_FLAG_SHOW}, + {text_align_keys, abc_number_of(text_align_keys), #align, ABC_HTML_ATTR_TEXT_ALIGN, ABC_HTML_FLAG_SHOW}, \ + {text_decoration_keys, abc_number_of(text_decoration_keys), #underline, ABC_HTML_ATTR_TEXT_DECORATION, ABC_HTML_FLAG_SHOW}, \ + {text_transform_keys, abc_number_of(text_transform_keys), "", ABC_HTML_ATTR_TEXT_TRANSFORM, ABC_HTML_FLAG_SHOW}, \ + {text_indent_keys, abc_number_of(text_indent_keys), "", ABC_HTML_ATTR_TEXT_INDENT, ABC_HTML_FLAG_SHOW}, \ + {vertical_align_keys, abc_number_of(vertical_align_keys), "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW}, + +#define ABC_CSS_PSE() \ + {css_link_keys, abc_number_of(css_link_keys), "", ABC_CSS_LINK, ABC_HTML_FLAG_SHOW}, \ + {css_visited_keys, abc_number_of(css_visited_keys), "", ABC_CSS_VISITED, ABC_HTML_FLAG_SHOW}, \ + {css_hover_keys, abc_number_of(css_hover_keys), "", ABC_CSS_HOVER, ABC_HTML_FLAG_SHOW}, \ + {css_active_keys, abc_number_of(css_active_keys), "", ABC_CSS_ACTIVE, ABC_HTML_FLAG_SHOW}, \ + {css_first_child_keys, abc_number_of(css_first_child_keys), "", ABC_CSS_FIRST_CHILD, 0}, ABC_CSS_BOX(block, , , 12px) ABC_CSS_SCROLL(scroll, 12px, orangeRed white) @@ -233,19 +235,16 @@ static html_attr_t html_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - {xmlns_keys, "", ABC_HTML_ATTR_XMLNS, 0}, - {xmlang_keys, "", ABC_HTML_ATTR_XMLANG, 0}, - {lang_keys, "", ABC_HTML_ATTR_LANG, 0}, - - {opacity_keys, "1.0", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, + {xmlns_keys, abc_number_of(xmlns_keys), "", ABC_HTML_ATTR_XMLNS, 0}, + {xmlang_keys, abc_number_of(xmlang_keys), "", ABC_HTML_ATTR_XMLANG, 0}, + {lang_keys, abc_number_of(lang_keys), "", ABC_HTML_ATTR_LANG, 0}, }; static html_attr_t meta_attrs[] = { - {http_equiv_keys, "", ABC_HTML_ATTR_HTTP_EQUIV, ABC_HTML_FLAG_SHOW}, - {content_keys, "", ABC_HTML_ATTR_CONTENT, ABC_HTML_FLAG_SHOW}, - {charset_keys, "", ABC_HTML_ATTR_CHARSET, ABC_HTML_FLAG_SHOW}, + {http_equiv_keys, abc_number_of(http_equiv_keys), "", ABC_HTML_ATTR_HTTP_EQUIV, ABC_HTML_FLAG_SHOW}, + {content_keys, abc_number_of(content_keys), "", ABC_HTML_ATTR_CONTENT, ABC_HTML_FLAG_SHOW}, + {charset_keys, abc_number_of(charset_keys), "", ABC_HTML_ATTR_CHARSET, ABC_HTML_FLAG_SHOW}, }; static html_attr_t body_attrs[] = @@ -257,9 +256,6 @@ static html_attr_t body_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - - {opacity_keys, "1.0", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t div_attrs[] = @@ -268,14 +264,10 @@ static html_attr_t div_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h1_attrs[] = @@ -284,14 +276,10 @@ static html_attr_t h1_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 40, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h2_attrs[] = @@ -300,14 +288,10 @@ static html_attr_t h2_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 32, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h3_attrs[] = @@ -316,14 +300,10 @@ static html_attr_t h3_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 28, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h4_attrs[] = @@ -332,14 +312,10 @@ static html_attr_t h4_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 24, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h5_attrs[] = @@ -348,14 +324,10 @@ static html_attr_t h5_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 20, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t h6_attrs[] = @@ -364,14 +336,10 @@ static html_attr_t h6_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 16, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t hr_attrs[] = @@ -383,9 +351,6 @@ static html_attr_t hr_attrs[] = ABC_CSS_FONT(SimHei, 16, lightGray, ) ABC_CSS_TEXT(left, ) - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t p_attrs[] = @@ -394,39 +359,29 @@ static html_attr_t p_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, - - {css_first_child_keys, "", ABC_CSS_FIRST_CHILD, ABC_HTML_FLAG_SHOW}, }; static html_attr_t css_id_attrs[] = { #define ABC_CSS_LIST() \ - {list_style_keys, "", ABC_CSS_LIST_STYLE, ABC_HTML_FLAG_SHOW}, \ - {list_style_type_keys, "", ABC_CSS_LIST_STYLE_TYPE, ABC_HTML_FLAG_SHOW}, \ - {list_style_image_keys, "", ABC_CSS_LIST_STYLE_IMAGE, ABC_HTML_FLAG_SHOW}, \ - {list_style_pos_keys, "", ABC_CSS_LIST_STYLE_POSITION, ABC_HTML_FLAG_SHOW}, + {list_style_keys, abc_number_of(list_style_keys), "", ABC_CSS_LIST_STYLE, ABC_HTML_FLAG_SHOW}, \ + {list_style_type_keys, abc_number_of(list_style_type_keys), "", ABC_CSS_LIST_STYLE_TYPE, ABC_HTML_FLAG_SHOW}, \ + {list_style_image_keys, abc_number_of(list_style_image_keys), "", ABC_CSS_LIST_STYLE_IMAGE, ABC_HTML_FLAG_SHOW}, \ + {list_style_pos_keys, abc_number_of(list_style_pos_keys), "", ABC_CSS_LIST_STYLE_POSITION, ABC_HTML_FLAG_SHOW}, ABC_CSS_BOX( , 2px, , 2px) ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) ABC_CSS_LIST() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, - - {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW}, }; static html_attr_t b_attrs[] = @@ -435,14 +390,10 @@ static html_attr_t b_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimHei, 16, , bold) ABC_CSS_TEXT(left, ) - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, - - {css_first_child_keys, "", ABC_CSS_FIRST_CHILD, ABC_HTML_FLAG_SHOW}, }; static html_attr_t i_attrs[] = @@ -451,14 +402,10 @@ static html_attr_t i_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, , italic) ABC_CSS_TEXT(left, ) - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, - - {css_first_child_keys, "", ABC_CSS_FIRST_CHILD, ABC_HTML_FLAG_SHOW}, }; static html_attr_t a_attrs[] = @@ -467,23 +414,19 @@ static html_attr_t a_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() ABC_CSS_BACK_GROUND() + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, blue, ) ABC_CSS_TEXT(left, underline) - ABC_CSS_PSE_MOUSE() - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, - - {href_keys, "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW}, + {href_keys, abc_number_of(href_keys), "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW}, }; static html_attr_t link_attrs[] = { - {rel_keys, "", ABC_HTML_ATTR_REL, ABC_HTML_FLAG_SHOW}, - {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, - {href_keys, "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW}, + {rel_keys, abc_number_of(rel_keys), "", ABC_HTML_ATTR_REL, ABC_HTML_FLAG_SHOW}, + {type_keys, abc_number_of(type_keys), "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, + {href_keys, abc_number_of(href_keys), "", ABC_HTML_ATTR_HREF, ABC_HTML_FLAG_SHOW}, }; static html_attr_t img_attrs[] = @@ -491,14 +434,10 @@ static html_attr_t img_attrs[] = ABC_CSS_BOX(inline-block, , , ) ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() + ABC_CSS_PSE() - ABC_CSS_PSE_MOUSE() - - {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW}, - {alt_keys, "", ABC_HTML_ATTR_ALT, ABC_HTML_FLAG_SHOW}, - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, + {src_keys, abc_number_of(src_keys), "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW}, + {alt_keys, abc_number_of(alt_keys), "", ABC_HTML_ATTR_ALT, ABC_HTML_FLAG_SHOW}, }; static html_attr_t video_attrs[] = @@ -506,24 +445,20 @@ static html_attr_t video_attrs[] = ABC_CSS_BOX(block, , , ) ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR() + ABC_CSS_PSE() - ABC_CSS_PSE_MOUSE() - - {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0}, - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, + {control_keys, abc_number_of(control_keys), "", ABC_HTML_ATTR_CONTROLS, 0}, }; static html_attr_t audio_attrs[] = { - {control_keys, "", ABC_HTML_ATTR_CONTROLS, 0}, + {control_keys, abc_number_of(control_keys), "", ABC_HTML_ATTR_CONTROLS, 0}, }; static html_attr_t source_attrs[] = { - {src_keys, "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW}, - {type_keys, "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, + {src_keys, abc_number_of(src_keys), "", ABC_HTML_ATTR_SRC, ABC_HTML_FLAG_SHOW}, + {type_keys, abc_number_of(type_keys), "", ABC_HTML_ATTR_TYPE, ABC_HTML_FLAG_SHOW}, }; static html_attr_t input_attrs[] = @@ -532,17 +467,10 @@ static html_attr_t input_attrs[] = ABC_CSS_SCROLL( , , ) ABC_CSS_SELECTOR(text) ABC_CSS_BACK_GROUND(lightGray) + ABC_CSS_PSE() ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - - ABC_CSS_PSE_MOUSE() - - {size_keys, "", ABC_HTML_ATTR_SIZE, ABC_HTML_FLAG_SHOW}, - {value_keys, "", ABC_HTML_ATTR_VALUE, ABC_HTML_FLAG_SHOW}, - - {opacity_keys, "", ABC_CSS_OPACITY, ABC_HTML_FLAG_SHOW}, - {filter_keys, "", ABC_CSS_FILTER, 0}, }; static html_attr_t label_attrs[] = @@ -555,7 +483,7 @@ static html_attr_t label_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - {for_keys, "", ABC_HTML_ATTR_FOR, ABC_HTML_FLAG_SHOW}, + {for_keys, abc_number_of(for_keys), "", ABC_HTML_ATTR_FOR, ABC_HTML_FLAG_SHOW}, }; static html_attr_t form_attrs[] = @@ -568,9 +496,9 @@ static html_attr_t form_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - {action_keys, "/", ABC_HTML_ATTR_ACTION, ABC_HTML_FLAG_SHOW}, - {method_keys, "post", ABC_HTML_ATTR_METHOD, ABC_HTML_FLAG_SHOW}, - {enctype_keys, "", ABC_HTML_ATTR_ENCTYPE, 0}, + {action_keys, abc_number_of(action_keys), "/", ABC_HTML_ATTR_ACTION, ABC_HTML_FLAG_SHOW}, + {method_keys, abc_number_of(method_keys), "post", ABC_HTML_ATTR_METHOD, ABC_HTML_FLAG_SHOW}, + {enctype_keys, abc_number_of(enctype_keys), "", ABC_HTML_ATTR_ENCTYPE, 0}, }; static html_attr_t ol_attrs[] = @@ -595,7 +523,7 @@ static html_attr_t table_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT(left, ) - {border_collapse_keys, "", ABC_CSS_BORDER_COLLAPSE, ABC_HTML_FLAG_SHOW}, + {border_collapse_keys, abc_number_of(border_collapse_keys), "", ABC_CSS_BORDER_COLLAPSE, ABC_HTML_FLAG_SHOW}, }; static html_attr_t th_attrs[] = @@ -607,8 +535,6 @@ static html_attr_t th_attrs[] = ABC_CSS_FONT(SimHei, 24, black, ) ABC_CSS_TEXT( , ) - - {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW}, }; static html_attr_t tr_attrs[] = @@ -620,8 +546,6 @@ static html_attr_t tr_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT( , ) - - {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW}, }; static html_attr_t td_attrs[] = @@ -633,89 +557,87 @@ static html_attr_t td_attrs[] = ABC_CSS_FONT(SimSong, 16, black, ) ABC_CSS_TEXT( , ) - - {vertical_align_keys, "", ABC_HTML_ATTR_VERTICAL_ALIGN, ABC_HTML_FLAG_SHOW}, }; static html_attr_t script_attrs[] = { - {font_keys, "SimSong", ABC_HTML_ATTR_FONT, 0}, - {font_size_keys, "16", ABC_HTML_ATTR_FONT_SIZE, 0}, + {font_keys, abc_number_of(font_keys), "SimSong", ABC_HTML_ATTR_FONT, 0}, + {font_size_keys, abc_number_of(font_size_keys), "16", ABC_HTML_ATTR_FONT_SIZE, 0}, }; static html_label_t html_labels[] = { - {html_keys, ABC_HTML, abc_number_of(html_attrs), html_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {meta_keys, ABC_HTML_META, abc_number_of(meta_attrs), meta_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - {head_keys, ABC_HTML_HEAD, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {title_keys, ABC_HTML_TITLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {body_keys, ABC_HTML_BODY, abc_number_of(body_attrs), body_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {div_keys, ABC_HTML_DIV, abc_number_of(div_attrs), div_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {h1_keys, ABC_HTML_H1, abc_number_of(h1_attrs), h1_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {h2_keys, ABC_HTML_H2, abc_number_of(h2_attrs), h2_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {h3_keys, ABC_HTML_H3, abc_number_of(h3_attrs), h3_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {h4_keys, ABC_HTML_H4, abc_number_of(h4_attrs), h4_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {h5_keys, ABC_HTML_H5, abc_number_of(h5_attrs), h5_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {h6_keys, ABC_HTML_H6, abc_number_of(h6_attrs), h6_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {p_keys, ABC_HTML_P, abc_number_of(p_attrs), p_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {b_keys, ABC_HTML_B, abc_number_of(b_attrs), b_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {i_keys, ABC_HTML_I, abc_number_of(i_attrs), i_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {br_keys, ABC_HTML_BR, 0, NULL, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - {hr_keys, ABC_HTML_HR, abc_number_of(hr_attrs), hr_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - - {a_keys, ABC_HTML_A, abc_number_of(a_attrs), a_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {img_keys, ABC_HTML_IMG, abc_number_of(img_attrs), img_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - {link_keys, ABC_HTML_LINK, abc_number_of(link_attrs), link_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - - {form_keys, ABC_HTML_FORM, abc_number_of(form_attrs), form_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {input_keys, ABC_HTML_INPUT, abc_number_of(input_attrs), input_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - {label_keys, ABC_HTML_LABEL, abc_number_of(label_attrs), label_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {center_keys, ABC_HTML_CENTER, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {table_keys, ABC_HTML_TABLE, abc_number_of(table_attrs), table_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {tr_keys, ABC_HTML_TR, abc_number_of(tr_attrs), tr_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {td_keys, ABC_HTML_TD, abc_number_of(td_attrs), td_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {th_keys, ABC_HTML_TH, abc_number_of(th_attrs), th_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {ol_keys, ABC_HTML_OL, abc_number_of(ol_attrs), ol_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {ul_keys, ABC_HTML_UL, abc_number_of(ol_attrs), ol_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {li_keys, ABC_HTML_LI, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {video_keys, ABC_HTML_VIDEO, abc_number_of(video_attrs), video_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {audio_keys, ABC_HTML_AUDIO, abc_number_of(audio_attrs), audio_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {source_keys, ABC_HTML_SOURCE, abc_number_of(source_attrs), source_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, - {play_keys, ABC_HTML_PLAY, 0, NULL, ABC_HTML_FLAG_OPEN}, - {progress_keys, ABC_HTML_PROGRESS, 0, NULL, ABC_HTML_FLAG_OPEN}, - - {script_keys, ABC_HTML_SCRIPT, abc_number_of(script_attrs), script_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {style_keys, ABC_HTML_STYLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - - {css_id_keys, ABC_CSS_ID, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {css_class_keys, ABC_CSS_CLASS, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {css_attr_keys, ABC_CSS_ATTR, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {css_pse_class_keys, ABC_CSS_PSE_CLASS, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {css_pse_element_keys, ABC_CSS_PSE_ELEMENT, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, - {css_other_keys, ABC_CSS_COMBINATOR, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {html_keys, abc_number_of(html_keys), ABC_HTML, abc_number_of(html_attrs), html_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {meta_keys, abc_number_of(meta_keys), ABC_HTML_META, abc_number_of(meta_attrs), meta_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + {head_keys, abc_number_of(head_keys), ABC_HTML_HEAD, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {title_keys, abc_number_of(title_keys), ABC_HTML_TITLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {body_keys, abc_number_of(body_keys), ABC_HTML_BODY, abc_number_of(body_attrs), body_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {div_keys, abc_number_of(div_keys), ABC_HTML_DIV, abc_number_of(div_attrs), div_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {h1_keys, abc_number_of(h1_keys), ABC_HTML_H1, abc_number_of(h1_attrs), h1_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {h2_keys, abc_number_of(h2_keys), ABC_HTML_H2, abc_number_of(h2_attrs), h2_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {h3_keys, abc_number_of(h3_keys), ABC_HTML_H3, abc_number_of(h3_attrs), h3_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {h4_keys, abc_number_of(h4_keys), ABC_HTML_H4, abc_number_of(h4_attrs), h4_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {h5_keys, abc_number_of(h5_keys), ABC_HTML_H5, abc_number_of(h5_attrs), h5_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {h6_keys, abc_number_of(h6_keys), ABC_HTML_H6, abc_number_of(h6_attrs), h6_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {p_keys, abc_number_of(p_keys), ABC_HTML_P, abc_number_of(p_attrs), p_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {b_keys, abc_number_of(b_keys), ABC_HTML_B, abc_number_of(b_attrs), b_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {i_keys, abc_number_of(i_keys), ABC_HTML_I, abc_number_of(i_attrs), i_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {br_keys, abc_number_of(br_keys), ABC_HTML_BR, 0, NULL, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + {hr_keys, abc_number_of(hr_keys), ABC_HTML_HR, abc_number_of(hr_attrs), hr_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + + {a_keys, abc_number_of(a_keys), ABC_HTML_A, abc_number_of(a_attrs), a_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {img_keys, abc_number_of(img_keys), ABC_HTML_IMG, abc_number_of(img_attrs), img_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + {link_keys, abc_number_of(link_keys), ABC_HTML_LINK, abc_number_of(link_attrs), link_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + + {form_keys, abc_number_of(form_keys), ABC_HTML_FORM, abc_number_of(form_attrs), form_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {input_keys, abc_number_of(input_keys), ABC_HTML_INPUT, abc_number_of(input_attrs), input_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + {label_keys, abc_number_of(label_keys), ABC_HTML_LABEL, abc_number_of(label_attrs), label_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {center_keys, abc_number_of(center_keys), ABC_HTML_CENTER, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {table_keys, abc_number_of(table_keys), ABC_HTML_TABLE, abc_number_of(table_attrs), table_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {tr_keys, abc_number_of(tr_keys), ABC_HTML_TR, abc_number_of(tr_attrs), tr_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {td_keys, abc_number_of(td_keys), ABC_HTML_TD, abc_number_of(td_attrs), td_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {th_keys, abc_number_of(th_keys), ABC_HTML_TH, abc_number_of(th_attrs), th_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {ol_keys, abc_number_of(ol_keys), ABC_HTML_OL, abc_number_of(ol_attrs), ol_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {ul_keys, abc_number_of(ul_keys), ABC_HTML_UL, abc_number_of(ol_attrs), ol_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {li_keys, abc_number_of(li_keys), ABC_HTML_LI, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {video_keys, abc_number_of(video_keys), ABC_HTML_VIDEO, abc_number_of(video_attrs), video_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {audio_keys, abc_number_of(audio_keys), ABC_HTML_AUDIO, abc_number_of(audio_attrs), audio_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {source_keys, abc_number_of(source_keys), ABC_HTML_SOURCE, abc_number_of(source_attrs), source_attrs, ABC_HTML_FLAG_OPEN | ABC_HTML_FLAG_SHOW}, + {play_keys, abc_number_of(play_keys), ABC_HTML_PLAY, 0, NULL, ABC_HTML_FLAG_OPEN}, + {progress_keys, abc_number_of(progress_keys), ABC_HTML_PROGRESS, 0, NULL, ABC_HTML_FLAG_OPEN}, + + {script_keys, abc_number_of(script_keys), ABC_HTML_SCRIPT, abc_number_of(script_attrs), script_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {style_keys, abc_number_of(style_keys), ABC_HTML_STYLE, 0, NULL, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + + {css_id_keys, abc_number_of(css_id_keys), ABC_CSS_ID, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {css_class_keys, abc_number_of(css_class_keys), ABC_CSS_CLASS, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {css_attr_keys, abc_number_of(css_attr_keys), ABC_CSS_ATTR, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {css_pse_class_keys, abc_number_of(css_pse_class_keys), ABC_CSS_PSE_CLASS, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {css_pse_element_keys, abc_number_of(css_pse_element_keys), ABC_CSS_PSE_ELEMENT, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, + {css_other_keys, abc_number_of(css_other_keys), ABC_CSS_COMBINATOR, abc_number_of(css_id_attrs), css_id_attrs, ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SHOW}, }; static int __html_parse_obj(abc_html_t* html, abc_char_t* c); -html_label_t* __html_find_label(const char* name) +html_label_t* __html_find_label(const char* name, size_t len) { html_label_t* label; - + abc_str_t* s; int i; int j; for (i = 0; i < sizeof(html_labels) / sizeof(html_labels[0]); i++) { label = &html_labels[i]; - for (j = 0; label->names[j]; j++) { + for (j = 0; j < label->n_names; j++) { + s = &(label->names[j]); - if (!__html_strcmp(label->names[j], name)) + if (len == s->len && !__html_strncmp(s->data, name, len)) return label; } } @@ -738,7 +660,7 @@ html_label_t* __html_find_label2(const int type) return NULL; } -int __html_add_attr(abc_obj_t* obj, int type, char** names, const char* value, int flags) +int __html_add_attr(abc_obj_t* obj, int type, abc_str_t* names, size_t n_names, const char* value, int flags) { if (type < ABC_CSS_CLASS || type >= ABC_HTML_CSS_NB) return -EINVAL; @@ -753,9 +675,10 @@ int __html_add_attr(abc_obj_t* obj, int type, char** names, const char* value, i return -ENOMEM; } - attr->type = type; - attr->keys = names; - attr->flags = flags; + attr->flags = flags; + attr->type = type; + attr->keys = names; + attr->n_keys = n_names; int i = type - ABC_CSS_CLASS; if (obj->attrs[i]) @@ -775,9 +698,10 @@ static int __html_add_controls(abc_obj_t* obj) if (!play) return -ENOMEM; - label = __html_find_label("play"); + label = __html_find_label2(ABC_HTML_PLAY); play->flags = label->flags; play->keys = label->names; + play->n_keys = label->n_names; play->parent = obj; progress = abc_obj_alloc(obj->file, obj->line, obj->pos, ABC_HTML_PROGRESS); @@ -786,9 +710,10 @@ static int __html_add_controls(abc_obj_t* obj) return -ENOMEM; } - label = __html_find_label("progress"); + label = __html_find_label2(ABC_HTML_PROGRESS); progress->flags = label->flags; progress->keys = label->names; + progress->n_keys = label->n_names; progress->parent = obj; scf_list_add_tail(&obj->childs, &play->list); @@ -806,7 +731,7 @@ static int __html_load_attrs(abc_obj_t* obj, html_attr_t* attrs, int n_attrs) if (attrs && n_attrs > 0) { for (i = 0; i < n_attrs; i++) { - ret = __html_add_attr(obj, attrs[i].type, attrs[i].names, attrs[i].value, attrs[i].flags); + ret = __html_add_attr(obj, attrs[i].type, attrs[i].names, attrs[i].n_names, attrs[i].value, attrs[i].flags); if (ret < 0) return ret; } @@ -818,7 +743,7 @@ static int __html_load_attrs(abc_obj_t* obj, html_attr_t* attrs, int n_attrs) if (!attr) continue; - ret = __html_add_attr(obj, attr->type, attr->keys, attr->value->data, 0); + ret = __html_add_attr(obj, attr->type, attr->keys, attr->n_keys, attr->value->data, 0); if (ret < 0) return ret; } @@ -1021,16 +946,19 @@ static int __html_parse_end(abc_html_t* html, abc_obj_t* obj) free(c); c = NULL; + abc_str_t* s; int j; - for (j = 0; obj->keys[j]; j++) { - if (!__html_strcmp(obj->keys[j], end->data)) { + for (j = 0; j < obj->n_keys; j++) { + s = &(obj->keys[j]); + + if (s->len == end->len && !__html_strcmp(s->data, end->data)) { scf_string_free(end); return 0; } } scf_loge("end label '%s' file: %s, line: %d, NOT for label '%s' line: %d\n", - end->data, html->file->data, html->n_lines, obj->keys[0], obj->line); + end->data, html->file->data, html->n_lines, obj->keys[0].data, obj->line); scf_string_free(end); return -1; @@ -1275,6 +1203,7 @@ static int __html_parse_attr2(abc_html_t* html, abc_obj_t* obj, const html_attr_ c = NULL; abc_attr_t* attr; + abc_str_t* s; int i; int j; @@ -1283,9 +1212,10 @@ static int __html_parse_attr2(abc_html_t* html, abc_obj_t* obj, const html_attr_ if (!attr) continue; - for (j = 0; attr->keys[j]; j++) - { - if (!__html_strcmp(attr->keys[j], key->data)) + for (j = 0; j < attr->n_keys; j++) { + s = &(attr->keys[j]); + + if (s->len == key->len && !__html_strncmp(s->data, key->data, key->len)) goto found; } } @@ -1513,7 +1443,7 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c) free(c); c = NULL; - label = __html_find_label(key->data); + label = __html_find_label(key->data, key->len); if (!label) { scf_loge("invalid HTML label '%s' in file: %s, line: %d\n", key->data, html->file->data, html->n_lines); @@ -1528,8 +1458,9 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c) if (!obj) return -ENOMEM; - obj->flags = label->flags; - obj->keys = label->names; + obj->flags = label->flags; + obj->keys = label->names; + obj->n_keys = label->n_names; obj->parent = html->current; @@ -1581,7 +1512,7 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c) if ('>' != tmp) { scf_loge("HTML label '%s' (%d) not closed, in file: %s, line: %d\n", - obj->keys[0], tmp, html->file->data, html->n_lines); + obj->keys[0].data, tmp, html->file->data, html->n_lines); return -1; } } else diff --git a/html/abc_html.h b/html/abc_html.h index 9d78828..89a1b6c 100644 --- a/html/abc_html.h +++ b/html/abc_html.h @@ -8,14 +8,18 @@ typedef struct abc_html_s abc_html_t; typedef struct { - char** names; - char* value; - int type; - int flags; + abc_str_t* names; + size_t n_names; + + char* value; + int type; + int flags; } html_attr_t; typedef struct { - char** names; + abc_str_t* names; + size_t n_names; + int type; int n_attrs; diff --git a/html/abc_io.h b/html/abc_io.h index dc70fbe..618deff 100644 --- a/html/abc_io.h +++ b/html/abc_io.h @@ -5,8 +5,17 @@ #include"scf_list.h" typedef struct abc_char_s abc_char_t; +typedef struct abc_str_s abc_str_t; typedef struct abc_io_s abc_io_t; +struct abc_str_s +{ + uint8_t* data; + size_t len; +}; + +#define ABC_STR(s) {s, sizeof(s) - 1} + enum abc_protos { ABC_PROTO_FILE, diff --git a/html/abc_io_str.c b/html/abc_io_str.c index 8dedd95..bc48e66 100644 --- a/html/abc_io_str.c +++ b/html/abc_io_str.c @@ -3,14 +3,14 @@ typedef struct { scf_string_t* text; int text_i; -} abc_str_t; +} io_str_t; static int __str_open(abc_io_t* io, const char* path) { if (!io || !path) return -EINVAL; - abc_str_t* s = calloc(1, sizeof(abc_str_t)); + io_str_t* s = calloc(1, sizeof(abc_str_t)); if (!s) return -ENOMEM; @@ -27,7 +27,7 @@ static int __str_open(abc_io_t* io, const char* path) static void __str_close(abc_io_t* io) { - abc_str_t* s; + io_str_t* s; if (io && io->priv) { s = io->priv; @@ -42,7 +42,7 @@ static void __str_close(abc_io_t* io) static int __str_popc(abc_io_t* io) { - abc_str_t* s; + io_str_t* s; if (io && io->priv) { s = io->priv; diff --git a/html/abc_obj.c b/html/abc_obj.c index 7378001..e871ba4 100644 --- a/html/abc_obj.c +++ b/html/abc_obj.c @@ -301,10 +301,12 @@ abc_obj_t* abc_obj_find_type(abc_obj_t* root, int type) int abc_attr_cmp_keys(abc_attr_t* attr, const char* name, size_t len) { + abc_str_t* s; int i; - for (i = 0; attr->keys[i]; i++) { + for (i = 0; i < attr->n_keys; i++) { + s = &(attr->keys[i]); - if (!__html_strncmp(attr->keys[i], name, len)) + if (s->len == len && !__html_strncmp(s->data, name, len)) return 0; } return -1; @@ -312,10 +314,12 @@ int abc_attr_cmp_keys(abc_attr_t* attr, const char* name, size_t len) int abc_obj_cmp_keys(abc_obj_t* obj, const char* name, size_t len) { + abc_str_t* s; int i; - for (i = 0; obj->keys[i]; i++) { + for (i = 0; i < obj->n_keys; i++) { + s = &(obj->keys[i]); - if (!__html_strncmp(obj->keys[i], name, len)) + if (s->len == len && !__html_strncmp(s->data, name, len)) return 0; } return -1; @@ -342,9 +346,10 @@ int abc_css_copy_attrs(css_rule_t* dst, css_rule_t* src) return -ENOMEM; } - copy->type = attr->type; - copy->keys = attr->keys; - copy->flags = attr->flags; + copy->type = attr->type; + copy->keys = attr->keys; + copy->n_keys = attr->n_keys; + copy->flags = attr->flags; if (dst->attrs[i]) abc_attr_free(dst->attrs[i]); @@ -414,7 +419,7 @@ void abc_css_print(css_rule_t* css) if (css->text) printf("%s ", css->text->data); else if (css->keys) - printf("%s ", css->keys[0]); + printf("%s ", css->keys[0].data); abc_attr_t* attr; int i; @@ -428,7 +433,7 @@ void abc_css_print(css_rule_t* css) continue; if (ABC_HTML_FLAG_SHOW & attr->flags) - printf(" %s: %s;\n", attr->keys[0], attr->value->data); + printf(" %s: %s;\n", attr->keys[0].data, attr->value->data); } printf("}\n"); @@ -441,7 +446,7 @@ void abc_attr_print(abc_attr_t* attr) if (!(ABC_HTML_FLAG_SHOW & attr->flags)) return; - printf(" %s=\"%s\"", attr->keys[0], attr->value->data); + printf(" %s=\"%s\"", attr->keys[0].data, attr->value->data); } } @@ -459,7 +464,7 @@ void abc_obj_print(abc_obj_t* obj) return; if (obj->keys) - printf("<%s", obj->keys[0]); + printf("<%s", obj->keys[0].data); int n = 0; int i; @@ -499,7 +504,7 @@ void abc_obj_print(abc_obj_t* obj) if (ABC_HTML_FLAG_CLOSE == (obj->flags & (ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SINGLE))) { if (obj->keys) - printf("\n", obj->keys[0]); + printf("\n", obj->keys[0].data); } } @@ -515,7 +520,7 @@ static int __abc_attr_to_string(abc_attr_t* attr, scf_string_t* s) if (ret < 0) return ret; - ret = scf_string_cat_cstr(s, attr->keys[0]); + ret = scf_string_cat_cstr_len(s, attr->keys[0].data, attr->keys[0].len); if (ret < 0) return ret; @@ -548,7 +553,7 @@ static int __abc_obj_to_string(abc_obj_t* obj, scf_string_t* s) if (ret < 0) return ret; - ret = scf_string_cat_cstr(s, obj->keys[0]); + ret = scf_string_cat_cstr_len(s, obj->keys[0].data, obj->keys[0].len); if (ret < 0) return ret; } @@ -602,7 +607,7 @@ static int __abc_obj_to_string(abc_obj_t* obj, scf_string_t* s) if (ret < 0) return ret; - ret = scf_string_cat_cstr(s, obj->keys[0]); + ret = scf_string_cat_cstr_len(s, obj->keys[0].data, obj->keys[0].len); if (ret < 0) return ret; diff --git a/html/abc_obj.h b/html/abc_obj.h index 16016c7..a574f7d 100644 --- a/html/abc_obj.h +++ b/html/abc_obj.h @@ -262,7 +262,8 @@ struct abc_attr_s int type; uint32_t flags; - char** keys; + size_t n_keys; + abc_str_t* keys; scf_string_t* value; abc_obj_t* parent; @@ -273,7 +274,8 @@ struct css_rule_s int type; uint32_t flags; - char** keys; + size_t n_keys; + abc_str_t* keys; scf_string_t* text; abc_obj_t* parent; @@ -318,7 +320,8 @@ struct abc_obj_s int type; uint32_t flags; - char** keys; + size_t n_keys; + abc_str_t* keys; scf_string_t* text; abc_obj_t* parent; diff --git a/ui/abc_render_audio.c b/ui/abc_render_audio.c index 79e0c60..86c7054 100644 --- a/ui/abc_render_audio.c +++ b/ui/abc_render_audio.c @@ -43,7 +43,7 @@ static int _render_draw_audio(abc_render_t* render, abc_obj_t* obj, int width, i { abc_attr_t* attr = abc_obj_get_attr(obj, ABC_HTML_ATTR_SRC); if (!attr) { - scf_loge("src audio of '%s' not found\n", obj->keys[0]); + scf_loge("src audio of '%s' not found\n", obj->keys[0].data); return -EINVAL; } @@ -59,7 +59,7 @@ static int _render_draw_audio(abc_render_t* render, abc_obj_t* obj, int width, i float mvp[16]; __compute_mvp(mvp, 0, 0, 0); - scf_logi("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0], obj->x, obj->y, obj->w, obj->h); + scf_logi("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0].data, obj->x, obj->y, obj->w, obj->h); GLfloat vert_update[] = { diff --git a/ui/abc_render_video.c b/ui/abc_render_video.c index 7652b70..7f91fba 100644 --- a/ui/abc_render_video.c +++ b/ui/abc_render_video.c @@ -58,7 +58,7 @@ static int _render_draw_video(abc_render_t* render, abc_obj_t* obj, int width, i abc_frame_t* f; if (!obj->av_filter || !obj->vout) { - scf_logw("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0], obj->x, obj->y, obj->w, obj->h); + scf_logw("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0].data, obj->x, obj->y, obj->w, obj->h); return 0; } @@ -107,7 +107,7 @@ static int _render_draw_video(abc_render_t* render, abc_obj_t* obj, int width, i float mvp[16]; __compute_mvp(mvp, 0, 0, 0); - scf_logd("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0], obj->x, obj->y, obj->w, obj->h); + scf_logd("%s, x: %d, y: %d, w: %d, h: %d\n", obj->keys[0].data, obj->x, obj->y, obj->w, obj->h); GLfloat vert_update[] = {