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