xref: /php-src/ext/dom/lexbor/lexbor/html/tag.h (revision bffab33a)
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