save length of const C string of html tag name master
authoryu.dongliang <18588496441@163.com>
Wed, 3 Jun 2026 14:43:08 +0000 (22:43 +0800)
committeryu.dongliang <18588496441@163.com>
Wed, 3 Jun 2026 14:43:08 +0000 (22:43 +0800)
html/abc_css.c
html/abc_html.c
html/abc_html.h
html/abc_io.h
html/abc_io_str.c
html/abc_obj.c
html/abc_obj.h
ui/abc_render_audio.c
ui/abc_render_video.c

index ca18d4cdbfc9a7a7d007339686f6e281932abab9..0a6713b9000a8386edfdebaf3369c114920c50dd 100644 (file)
@@ -1,7 +1,7 @@
 #include"abc_html.h"
 
 #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)
 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++) {
        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;
                }
        }
                                goto found;
                }
        }
@@ -211,7 +214,7 @@ found:
 
        attr = css->attrs[k - ABC_CSS_CLASS];
        if (!attr) {
 
        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;
 
                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 {
        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;
                }
 
                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;
        }
 
                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)
 
        if (css->text) {
                if (j < 0)
@@ -367,11 +373,7 @@ static int __css_parse_type(css_rule_t* css)
                        case '~':
                                j++;
                        default:
                        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;
 
                                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->flags  = label->flags;
                        css->keys   = label->names;
+                       css->n_keys = label->n_names;
                        css->parent = style;
 
                        css->text = key;
                        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;
 
                        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:
                                        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;
                }
 
                        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]);
 
                if (h->cache_attrs[i])
                        abc_attr_free(h->cache_attrs[i]);
index 445eea5c90632f1a4992bf724441b70f1343c9bc..c0af1e8472a720d2811a733b1948cd2798d8fc30 100644 (file)
 #include"abc_html.h"
 
 // HTML & CSS attrs
 #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
 
 // 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
 
 // 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)
 
 // 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) \
 
 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) \
 
 #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) \
 
 #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) \
 
 #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) \
 
 #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) \
 
 #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)
 
        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, )
 
        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[] =
 {
 };
 
 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[] =
 };
 
 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, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimSong, 16, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 40, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 32, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 28, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 24, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 20, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 16, black, )
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimSong, 16, black, )
        ABC_CSS_TEXT(left, )
 
        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() \
 };
 
 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_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()
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimHei, 16, , bold)
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimSong, 16, , italic)
        ABC_CSS_TEXT(left, )
 
        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[] =
 };
 
 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_SCROLL( , , )
        ABC_CSS_SELECTOR()
        ABC_CSS_BACK_GROUND()
+       ABC_CSS_PSE()
 
        ABC_CSS_FONT(SimSong, 16, blue, )
        ABC_CSS_TEXT(left, underline)
 
 
        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[] =
 {
 };
 
 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[] =
 };
 
 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_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[] =
 };
 
 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_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[] =
 {
 };
 
 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[] =
 {
 };
 
 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[] =
 };
 
 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_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_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[] =
 };
 
 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, )
 
        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[] =
 };
 
 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, )
 
        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[] =
 };
 
 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, )
 
        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[] =
 };
 
 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( , )
 
        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[] =
 };
 
 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( , )
 
        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[] =
 };
 
 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( , )
 
        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[] =
 {
 };
 
 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[] =
 {
 };
 
 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);
 
 };
 
 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;
 {
        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];
 
        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;
                }
        }
                                return  label;
                }
        }
@@ -738,7 +660,7 @@ html_label_t* __html_find_label2(const int type)
        return NULL;
 }
 
        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;
 {
        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;
        }
 
                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])
 
        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;
 
        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->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);
        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;
        }
 
                return -ENOMEM;
        }
 
-       label            = __html_find_label("progress");
+       label            = __html_find_label2(ABC_HTML_PROGRESS);
        progress->flags  = label->flags;
        progress->keys   = label->names;
        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);
        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++) {
        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;
                }
                        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;
 
                        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;
                }
                        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;
 
        free(c);
        c = NULL;
 
+       abc_str_t* s;
        int j;
        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",
                        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;
 
        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;
        c = NULL;
 
        abc_attr_t*  attr;
+       abc_str_t*   s;
        int i;
        int j;
 
        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;
 
                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;
                }
        }
                                goto found;
                }
        }
@@ -1513,7 +1443,7 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c)
        free(c);
        c = NULL;
 
        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);
        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;
 
        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;
 
 
        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",
 
                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
                        return -1;
                }
        } else
index 9d788289abf28e1c200dcf5c6377906c64eb9b6c..89a1b6c12e125c3c5fc1befe42398c26c2ab2fa5 100644 (file)
@@ -8,14 +8,18 @@
 typedef struct abc_html_s  abc_html_t;
 
 typedef struct {
 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 {
 } html_attr_t;
 
 typedef struct {
-       char**        names;
+       abc_str_t*    names;
+       size_t        n_names;
+
        int           type;
 
        int           n_attrs;
        int           type;
 
        int           n_attrs;
index dc70fbe2e43458bd6ba41a2fe0d6c386aba60292..618deffea994569325cae1fcacbe1cad779d5e84 100644 (file)
@@ -5,8 +5,17 @@
 #include"scf_list.h"
 
 typedef struct abc_char_s  abc_char_t;
 #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;
 
 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,
 enum abc_protos
 {
        ABC_PROTO_FILE,
index 8dedd95d3c5205124ad4bc9f97d546806026e556..bc48e6630c3e5fad1e53683c0d68f94d1ad0dbb6 100644 (file)
@@ -3,14 +3,14 @@
 typedef struct {
        scf_string_t*  text;
        int            text_i;
 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;
 
 
 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;
 
        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)
 {
 
 static void __str_close(abc_io_t* io)
 {
-       abc_str_t* s;
+       io_str_t* s;
 
        if (io && io->priv) {
                s = io->priv;
 
        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)
 {
 
 static int __str_popc(abc_io_t* io)
 {
-       abc_str_t* s;
+       io_str_t* s;
 
        if (io && io->priv) {
                s = io->priv;
 
        if (io && io->priv) {
                s = io->priv;
index 73780010ece8fa2d3829da70236141820b3cdc71..e871ba4b6918fd730b18ee4367567de655884a76 100644 (file)
@@ -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)
 {
 
 int abc_attr_cmp_keys(abc_attr_t* attr, const char* name, size_t len)
 {
+       abc_str_t* s;
        int i;
        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;
                        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)
 {
 
 int abc_obj_cmp_keys(abc_obj_t* obj, const char* name, size_t len)
 {
+       abc_str_t* s;
        int i;
        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;
                        return 0;
        }
        return -1;
@@ -342,9 +346,10 @@ int abc_css_copy_attrs(css_rule_t* dst, css_rule_t* src)
                        return -ENOMEM;
                }
 
                        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]);
 
                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)
        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;
 
        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)
                        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");
        }
 
        printf("}\n");
@@ -441,7 +446,7 @@ void abc_attr_print(abc_attr_t* attr)
                if (!(ABC_HTML_FLAG_SHOW & attr->flags))
                        return;
 
                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)
                return;
 
        if (obj->keys)
-               printf("<%s", obj->keys[0]);
+               printf("<%s", obj->keys[0].data);
 
        int n = 0;
        int i;
 
        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)
 
        if (ABC_HTML_FLAG_CLOSE == (obj->flags & (ABC_HTML_FLAG_CLOSE | ABC_HTML_FLAG_SINGLE))) {
                if (obj->keys)
-                       printf("</%s>\n", obj->keys[0]);
+                       printf("</%s>\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;
 
        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;
 
        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;
 
                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;
        }
                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;
 
                        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;
 
                        if (ret < 0)
                                return ret;
 
index 16016c7d2cb0f4e78717e2aa4fce59863accc330..a574f7de6c36a4479c43376ede5de7e84fcb7754 100644 (file)
@@ -262,7 +262,8 @@ struct abc_attr_s
        int             type;
        uint32_t        flags;
 
        int             type;
        uint32_t        flags;
 
-       char**          keys;
+       size_t          n_keys;
+       abc_str_t*      keys;
        scf_string_t*   value;
 
        abc_obj_t*      parent;
        scf_string_t*   value;
 
        abc_obj_t*      parent;
@@ -273,7 +274,8 @@ struct css_rule_s
        int             type;
        uint32_t        flags;
 
        int             type;
        uint32_t        flags;
 
-       char**          keys;
+       size_t          n_keys;
+       abc_str_t*      keys;
        scf_string_t*   text;
 
        abc_obj_t*      parent;
        scf_string_t*   text;
 
        abc_obj_t*      parent;
@@ -318,7 +320,8 @@ struct abc_obj_s
        int             type;
        uint32_t        flags;
 
        int             type;
        uint32_t        flags;
 
-       char**          keys;
+       size_t          n_keys;
+       abc_str_t*      keys;
        scf_string_t*   text;
 
        abc_obj_t*      parent;
        scf_string_t*   text;
 
        abc_obj_t*      parent;
index 79e0c604a2bc3bc70ace0724ebf4505dde9974b0..86c7054d6e83ed336a666e68562209c9cffb8906 100644 (file)
@@ -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) {
 {
        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;
        }
 
                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);
 
        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[] =
        {
 
        GLfloat vert_update[] =
        {
index 7652b708ce3af7afd20574a458bb8dfb5d03d84f..7f91fba1a7997a956bd7b23412c5c2c992cb92ae 100644 (file)
@@ -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) {
        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;
        }
 
                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);
 
        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[] =
        {
 
        GLfloat vert_update[] =
        {