1 /*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7
8 #ifndef LXB_HTML_TAG_H
9 #define LXB_HTML_TAG_H
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 #include "lexbor/html/base.h"
16
17 #include "lexbor/tag/tag.h"
18 #include "lexbor/ns/ns.h"
19
20
21 typedef int lxb_html_tag_category_t;
22
23 enum lxb_html_tag_category {
24 LXB_HTML_TAG_CATEGORY__UNDEF = 0x0000,
25 LXB_HTML_TAG_CATEGORY_ORDINARY = 0x0001,
26 LXB_HTML_TAG_CATEGORY_SPECIAL = 0x0002,
27 LXB_HTML_TAG_CATEGORY_FORMATTING = 0x0004,
28 LXB_HTML_TAG_CATEGORY_SCOPE = 0x0008,
29 LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM = 0x0010,
30 LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON = 0x0020,
31 LXB_HTML_TAG_CATEGORY_SCOPE_TABLE = 0x0040,
32 LXB_HTML_TAG_CATEGORY_SCOPE_SELECT = 0x0080,
33 };
34
35 typedef struct {
36 const lxb_char_t *name;
37 unsigned int len;
38 }
39 lxb_html_tag_fixname_t;
40
41
42 #define LXB_HTML_TAG_RES_CATS
43 #define LXB_HTML_TAG_RES_FIXNAME_SVG
44 #include "lexbor/html/tag_res.h"
45
46
47 /*
48 * Inline functions
49 */
50 lxb_inline bool
lxb_html_tag_is_category(lxb_tag_id_t tag_id,lxb_ns_id_t ns,lxb_html_tag_category_t cat)51 lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns,
52 lxb_html_tag_category_t cat)
53 {
54 if (tag_id < LXB_TAG__LAST_ENTRY && ns < LXB_NS__LAST_ENTRY) {
55 return lxb_html_tag_res_cats[tag_id][ns] & cat;
56 }
57
58 return (LXB_HTML_TAG_CATEGORY_ORDINARY|LXB_HTML_TAG_CATEGORY_SCOPE_SELECT) & cat;
59 }
60
61 lxb_inline const lxb_html_tag_fixname_t *
lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id)62 lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id)
63 {
64 if (tag_id >= LXB_TAG__LAST_ENTRY) {
65 return NULL;
66 }
67
68 return &lxb_html_tag_res_fixname_svg[tag_id];
69 }
70
71 lxb_inline bool
lxb_html_tag_is_void(lxb_tag_id_t tag_id)72 lxb_html_tag_is_void(lxb_tag_id_t tag_id)
73 {
74 switch (tag_id) {
75 case LXB_TAG_AREA:
76 case LXB_TAG_BASE:
77 case LXB_TAG_BR:
78 case LXB_TAG_COL:
79 case LXB_TAG_EMBED:
80 case LXB_TAG_HR:
81 case LXB_TAG_IMG:
82 case LXB_TAG_INPUT:
83 case LXB_TAG_LINK:
84 case LXB_TAG_META:
85 case LXB_TAG_PARAM:
86 case LXB_TAG_SOURCE:
87 case LXB_TAG_TRACK:
88 case LXB_TAG_WBR:
89 return true;
90
91 default:
92 return false;
93 }
94
95 return false;
96 }
97
98
99 #ifdef __cplusplus
100 } /* extern "C" */
101 #endif
102
103 #endif /* LXB_HTML_TAG_H */
104