1 #ifndef __TAGS_H__
2 #define __TAGS_H__
3 
4 /* tags.h -- recognize HTML tags
5 
6   (c) 1998-2006 (W3C) MIT, ERCIM, Keio University
7   See tidy.h for the copyright notice.
8 
9   CVS Info :
10 
11     $Author: arnaud02 $
12     $Date: 2006/12/15 10:17:55 $
13     $Revision: 1.20 $
14 
15   The HTML tags are stored as 8 bit ASCII strings.
16   Use lookupw() to find a tag given a wide char string.
17 
18 */
19 
20 #include "forward.h"
21 #include "attrdict.h"
22 
23 typedef void (Parser)( TidyDocImpl* doc, Node *node, GetTokenMode mode );
24 typedef void (CheckAttribs)( TidyDocImpl* doc, Node *node );
25 
26 /*
27  Tag dictionary node
28 */
29 
30 /* types of tags that the user can define */
31 typedef enum
32 {
33     tagtype_null = 0,
34     tagtype_empty = 1,
35     tagtype_inline = 2,
36     tagtype_block = 4,
37     tagtype_pre = 8
38 } UserTagType;
39 
40 struct _Dict
41 {
42     TidyTagId       id;
43     tmbstr          name;
44     uint            versions;
45     AttrVersion const *    attrvers;
46     uint            model;
47     Parser*         parser;
48     CheckAttribs*   chkattrs;
49     Dict*           next;
50 };
51 
52 #if !defined(ELEMENT_HASH_LOOKUP)
53 #define ELEMENT_HASH_LOOKUP 1
54 #endif
55 
56 #if ELEMENT_HASH_LOOKUP
57 enum
58 {
59     ELEMENT_HASH_SIZE=178u
60 };
61 
62 struct _DictHash
63 {
64     Dict const*         tag;
65     struct _DictHash*   next;
66 };
67 
68 typedef struct _DictHash DictHash;
69 #endif
70 
71 struct _TidyTagImpl
72 {
73     Dict* xml_tags;                /* placeholder for all xml tags */
74     Dict* declared_tag_list;       /* User declared tags */
75 #if ELEMENT_HASH_LOOKUP
76     DictHash* hashtab[ELEMENT_HASH_SIZE];
77 #endif
78 };
79 
80 typedef struct _TidyTagImpl TidyTagImpl;
81 
82 /* interface for finding tag by name */
83 const Dict* TY_(LookupTagDef)( TidyTagId tid );
84 Bool    TY_(FindTag)( TidyDocImpl* doc, Node *node );
85 Parser* TY_(FindParser)( TidyDocImpl* doc, Node *node );
86 void    TY_(DefineTag)( TidyDocImpl* doc, UserTagType tagType, ctmbstr name );
87 void    TY_(FreeDeclaredTags)( TidyDocImpl* doc, UserTagType tagType ); /* tagtype_null to free all */
88 
89 TidyIterator   TY_(GetDeclaredTagList)( TidyDocImpl* doc );
90 ctmbstr        TY_(GetNextDeclaredTag)( TidyDocImpl* doc, UserTagType tagType,
91                                         TidyIterator* iter );
92 
93 void TY_(InitTags)( TidyDocImpl* doc );
94 void TY_(FreeTags)( TidyDocImpl* doc );
95 
96 
97 /* Parser methods for tags */
98 
99 Parser TY_(ParseHTML);
100 Parser TY_(ParseHead);
101 Parser TY_(ParseTitle);
102 Parser TY_(ParseScript);
103 Parser TY_(ParseFrameSet);
104 Parser TY_(ParseNoFrames);
105 Parser TY_(ParseBody);
106 Parser TY_(ParsePre);
107 Parser TY_(ParseList);
108 Parser TY_(ParseDefList);
109 Parser TY_(ParseBlock);
110 Parser TY_(ParseInline);
111 Parser TY_(ParseEmpty);
112 Parser TY_(ParseTableTag);
113 Parser TY_(ParseColGroup);
114 Parser TY_(ParseRowGroup);
115 Parser TY_(ParseRow);
116 Parser TY_(ParseSelect);
117 Parser TY_(ParseOptGroup);
118 Parser TY_(ParseText);
119 
120 CheckAttribs TY_(CheckAttributes);
121 
122 /* 0 == TidyTag_UNKNOWN */
123 #define TagId(node)        ((node) && (node)->tag ? (node)->tag->id : TidyTag_UNKNOWN)
124 #define TagIsId(node, tid) ((node) && (node)->tag && (node)->tag->id == tid)
125 
126 Bool TY_(nodeIsText)( Node* node );
127 Bool TY_(nodeIsElement)( Node* node );
128 
129 Bool TY_(nodeHasText)( TidyDocImpl* doc, Node* node );
130 
131 #if 0
132 /* Compare & result to operand.  If equal, then all bits
133 ** requested are set.
134 */
135 Bool nodeMatchCM( Node* node, uint contentModel );
136 #endif
137 
138 /* True if any of the bits requested are set.
139 */
140 Bool TY_(nodeHasCM)( Node* node, uint contentModel );
141 
142 Bool TY_(nodeCMIsBlock)( Node* node );
143 Bool TY_(nodeCMIsInline)( Node* node );
144 Bool TY_(nodeCMIsEmpty)( Node* node );
145 
146 
147 Bool TY_(nodeIsHeader)( Node* node );     /* H1, H2, ..., H6 */
148 uint TY_(nodeHeaderLevel)( Node* node );  /* 1, 2, ..., 6 */
149 
150 #define nodeIsHTML( node )       TagIsId( node, TidyTag_HTML )
151 #define nodeIsHEAD( node )       TagIsId( node, TidyTag_HEAD )
152 #define nodeIsTITLE( node )      TagIsId( node, TidyTag_TITLE )
153 #define nodeIsBASE( node )       TagIsId( node, TidyTag_BASE )
154 #define nodeIsMETA( node )       TagIsId( node, TidyTag_META )
155 #define nodeIsBODY( node )       TagIsId( node, TidyTag_BODY )
156 #define nodeIsFRAMESET( node )   TagIsId( node, TidyTag_FRAMESET )
157 #define nodeIsFRAME( node )      TagIsId( node, TidyTag_FRAME )
158 #define nodeIsIFRAME( node )     TagIsId( node, TidyTag_IFRAME )
159 #define nodeIsNOFRAMES( node )   TagIsId( node, TidyTag_NOFRAMES )
160 #define nodeIsHR( node )         TagIsId( node, TidyTag_HR )
161 #define nodeIsH1( node )         TagIsId( node, TidyTag_H1 )
162 #define nodeIsH2( node )         TagIsId( node, TidyTag_H2 )
163 #define nodeIsPRE( node )        TagIsId( node, TidyTag_PRE )
164 #define nodeIsLISTING( node )    TagIsId( node, TidyTag_LISTING )
165 #define nodeIsP( node )          TagIsId( node, TidyTag_P )
166 #define nodeIsUL( node )         TagIsId( node, TidyTag_UL )
167 #define nodeIsOL( node )         TagIsId( node, TidyTag_OL )
168 #define nodeIsDL( node )         TagIsId( node, TidyTag_DL )
169 #define nodeIsDIR( node )        TagIsId( node, TidyTag_DIR )
170 #define nodeIsLI( node )         TagIsId( node, TidyTag_LI )
171 #define nodeIsDT( node )         TagIsId( node, TidyTag_DT )
172 #define nodeIsDD( node )         TagIsId( node, TidyTag_DD )
173 #define nodeIsTABLE( node )      TagIsId( node, TidyTag_TABLE )
174 #define nodeIsCAPTION( node )    TagIsId( node, TidyTag_CAPTION )
175 #define nodeIsTD( node )         TagIsId( node, TidyTag_TD )
176 #define nodeIsTH( node )         TagIsId( node, TidyTag_TH )
177 #define nodeIsTR( node )         TagIsId( node, TidyTag_TR )
178 #define nodeIsCOL( node )        TagIsId( node, TidyTag_COL )
179 #define nodeIsCOLGROUP( node )   TagIsId( node, TidyTag_COLGROUP )
180 #define nodeIsBR( node )         TagIsId( node, TidyTag_BR )
181 #define nodeIsA( node )          TagIsId( node, TidyTag_A )
182 #define nodeIsLINK( node )       TagIsId( node, TidyTag_LINK )
183 #define nodeIsB( node )          TagIsId( node, TidyTag_B )
184 #define nodeIsI( node )          TagIsId( node, TidyTag_I )
185 #define nodeIsSTRONG( node )     TagIsId( node, TidyTag_STRONG )
186 #define nodeIsEM( node )         TagIsId( node, TidyTag_EM )
187 #define nodeIsBIG( node )        TagIsId( node, TidyTag_BIG )
188 #define nodeIsSMALL( node )      TagIsId( node, TidyTag_SMALL )
189 #define nodeIsPARAM( node )      TagIsId( node, TidyTag_PARAM )
190 #define nodeIsOPTION( node )     TagIsId( node, TidyTag_OPTION )
191 #define nodeIsOPTGROUP( node )   TagIsId( node, TidyTag_OPTGROUP )
192 #define nodeIsIMG( node )        TagIsId( node, TidyTag_IMG )
193 #define nodeIsMAP( node )        TagIsId( node, TidyTag_MAP )
194 #define nodeIsAREA( node )       TagIsId( node, TidyTag_AREA )
195 #define nodeIsNOBR( node )       TagIsId( node, TidyTag_NOBR )
196 #define nodeIsWBR( node )        TagIsId( node, TidyTag_WBR )
197 #define nodeIsFONT( node )       TagIsId( node, TidyTag_FONT )
198 #define nodeIsLAYER( node )      TagIsId( node, TidyTag_LAYER )
199 #define nodeIsSPACER( node )     TagIsId( node, TidyTag_SPACER )
200 #define nodeIsCENTER( node )     TagIsId( node, TidyTag_CENTER )
201 #define nodeIsSTYLE( node )      TagIsId( node, TidyTag_STYLE )
202 #define nodeIsSCRIPT( node )     TagIsId( node, TidyTag_SCRIPT )
203 #define nodeIsNOSCRIPT( node )   TagIsId( node, TidyTag_NOSCRIPT )
204 #define nodeIsFORM( node )       TagIsId( node, TidyTag_FORM )
205 #define nodeIsTEXTAREA( node )   TagIsId( node, TidyTag_TEXTAREA )
206 #define nodeIsBLOCKQUOTE( node ) TagIsId( node, TidyTag_BLOCKQUOTE )
207 #define nodeIsAPPLET( node )     TagIsId( node, TidyTag_APPLET )
208 #define nodeIsOBJECT( node )     TagIsId( node, TidyTag_OBJECT )
209 #define nodeIsDIV( node )        TagIsId( node, TidyTag_DIV )
210 #define nodeIsSPAN( node )       TagIsId( node, TidyTag_SPAN )
211 #define nodeIsINPUT( node )      TagIsId( node, TidyTag_INPUT )
212 #define nodeIsQ( node )          TagIsId( node, TidyTag_Q )
213 #define nodeIsLABEL( node )      TagIsId( node, TidyTag_LABEL )
214 #define nodeIsH3( node )         TagIsId( node, TidyTag_H3 )
215 #define nodeIsH4( node )         TagIsId( node, TidyTag_H4 )
216 #define nodeIsH5( node )         TagIsId( node, TidyTag_H5 )
217 #define nodeIsH6( node )         TagIsId( node, TidyTag_H6 )
218 #define nodeIsADDRESS( node )    TagIsId( node, TidyTag_ADDRESS )
219 #define nodeIsXMP( node )        TagIsId( node, TidyTag_XMP )
220 #define nodeIsSELECT( node )     TagIsId( node, TidyTag_SELECT )
221 #define nodeIsBLINK( node )      TagIsId( node, TidyTag_BLINK )
222 #define nodeIsMARQUEE( node )    TagIsId( node, TidyTag_MARQUEE )
223 #define nodeIsEMBED( node )      TagIsId( node, TidyTag_EMBED )
224 #define nodeIsBASEFONT( node )   TagIsId( node, TidyTag_BASEFONT )
225 #define nodeIsISINDEX( node )    TagIsId( node, TidyTag_ISINDEX )
226 #define nodeIsS( node )          TagIsId( node, TidyTag_S )
227 #define nodeIsSTRIKE( node )     TagIsId( node, TidyTag_STRIKE )
228 #define nodeIsSUB( node )        TagIsId( node, TidyTag_SUB )
229 #define nodeIsSUP( node )        TagIsId( node, TidyTag_SUP )
230 #define nodeIsU( node )          TagIsId( node, TidyTag_U )
231 #define nodeIsMENU( node )       TagIsId( node, TidyTag_MENU )
232 #define nodeIsBUTTON( node )     TagIsId( node, TidyTag_BUTTON )
233 
234 
235 #endif /* __TAGS_H__ */
236