HTML Tidy
0.1
|
00001 #ifndef __TAGS_H__ 00002 #define __TAGS_H__ 00003 00004 /* tags.h -- recognize HTML tags 00005 00006 (c) 1998-2006 (W3C) MIT, ERCIM, Keio University 00007 See tidy.h for the copyright notice. 00008 00009 CVS Info : 00010 00011 $Author: arnaud02 $ 00012 $Date: 2006/12/15 10:17:55 $ 00013 $Revision: 1.20 $ 00014 00015 The HTML tags are stored as 8 bit ASCII strings. 00016 Use lookupw() to find a tag given a wide char string. 00017 00018 */ 00019 00020 #include "forward.h" 00021 #include "attrdict.h" 00022 00023 typedef void (Parser)( TidyDocImpl* doc, Node *node, GetTokenMode mode ); 00024 typedef void (CheckAttribs)( TidyDocImpl* doc, Node *node ); 00025 00026 /* 00027 Tag dictionary node 00028 */ 00029 00030 /* types of tags that the user can define */ 00031 typedef enum 00032 { 00033 tagtype_null = 0, 00034 tagtype_empty = 1, 00035 tagtype_inline = 2, 00036 tagtype_block = 4, 00037 tagtype_pre = 8 00038 } UserTagType; 00039 00040 struct _Dict 00041 { 00042 TidyTagId id; 00043 tmbstr name; 00044 uint versions; 00045 AttrVersion const * attrvers; 00046 uint model; 00047 Parser* parser; 00048 CheckAttribs* chkattrs; 00049 Dict* next; 00050 }; 00051 00052 #if !defined(ELEMENT_HASH_LOOKUP) 00053 #define ELEMENT_HASH_LOOKUP 1 00054 #endif 00055 00056 #if ELEMENT_HASH_LOOKUP 00057 enum 00058 { 00059 ELEMENT_HASH_SIZE=178u 00060 }; 00061 00062 struct _DictHash 00063 { 00064 Dict const* tag; 00065 struct _DictHash* next; 00066 }; 00067 00068 typedef struct _DictHash DictHash; 00069 #endif 00070 00071 struct _TidyTagImpl 00072 { 00073 Dict* xml_tags; /* placeholder for all xml tags */ 00074 Dict* declared_tag_list; /* User declared tags */ 00075 #if ELEMENT_HASH_LOOKUP 00076 DictHash* hashtab[ELEMENT_HASH_SIZE]; 00077 #endif 00078 }; 00079 00080 typedef struct _TidyTagImpl TidyTagImpl; 00081 00082 /* interface for finding tag by name */ 00083 const Dict* TY_(LookupTagDef)( TidyTagId tid ); 00084 Bool TY_(FindTag)( TidyDocImpl* doc, Node *node ); 00085 Parser* TY_(FindParser)( TidyDocImpl* doc, Node *node ); 00086 void TY_(DefineTag)( TidyDocImpl* doc, UserTagType tagType, ctmbstr name ); 00087 void TY_(FreeDeclaredTags)( TidyDocImpl* doc, UserTagType tagType ); /* tagtype_null to free all */ 00088 00089 TidyIterator TY_(GetDeclaredTagList)( TidyDocImpl* doc ); 00090 ctmbstr TY_(GetNextDeclaredTag)( TidyDocImpl* doc, UserTagType tagType, 00091 TidyIterator* iter ); 00092 00093 void TY_(InitTags)( TidyDocImpl* doc ); 00094 void TY_(FreeTags)( TidyDocImpl* doc ); 00095 00096 00097 /* Parser methods for tags */ 00098 00099 Parser TY_(ParseHTML); 00100 Parser TY_(ParseHead); 00101 Parser TY_(ParseTitle); 00102 Parser TY_(ParseScript); 00103 Parser TY_(ParseFrameSet); 00104 Parser TY_(ParseNoFrames); 00105 Parser TY_(ParseBody); 00106 Parser TY_(ParsePre); 00107 Parser TY_(ParseList); 00108 Parser TY_(ParseDefList); 00109 Parser TY_(ParseBlock); 00110 Parser TY_(ParseInline); 00111 Parser TY_(ParseEmpty); 00112 Parser TY_(ParseTableTag); 00113 Parser TY_(ParseColGroup); 00114 Parser TY_(ParseRowGroup); 00115 Parser TY_(ParseRow); 00116 Parser TY_(ParseSelect); 00117 Parser TY_(ParseOptGroup); 00118 Parser TY_(ParseText); 00119 00120 CheckAttribs TY_(CheckAttributes); 00121 00122 /* 0 == TidyTag_UNKNOWN */ 00123 #define TagId(node) ((node) && (node)->tag ? (node)->tag->id : TidyTag_UNKNOWN) 00124 #define TagIsId(node, tid) ((node) && (node)->tag && (node)->tag->id == tid) 00125 00126 Bool TY_(nodeIsText)( Node* node ); 00127 Bool TY_(nodeIsElement)( Node* node ); 00128 00129 Bool TY_(nodeHasText)( TidyDocImpl* doc, Node* node ); 00130 00131 #if 0 00132 /* Compare & result to operand. If equal, then all bits 00133 ** requested are set. 00134 */ 00135 Bool nodeMatchCM( Node* node, uint contentModel ); 00136 #endif 00137 00138 /* True if any of the bits requested are set. 00139 */ 00140 Bool TY_(nodeHasCM)( Node* node, uint contentModel ); 00141 00142 Bool TY_(nodeCMIsBlock)( Node* node ); 00143 Bool TY_(nodeCMIsInline)( Node* node ); 00144 Bool TY_(nodeCMIsEmpty)( Node* node ); 00145 00146 00147 Bool TY_(nodeIsHeader)( Node* node ); /* H1, H2, ..., H6 */ 00148 uint TY_(nodeHeaderLevel)( Node* node ); /* 1, 2, ..., 6 */ 00149 00150 #define nodeIsHTML( node ) TagIsId( node, TidyTag_HTML ) 00151 #define nodeIsHEAD( node ) TagIsId( node, TidyTag_HEAD ) 00152 #define nodeIsTITLE( node ) TagIsId( node, TidyTag_TITLE ) 00153 #define nodeIsBASE( node ) TagIsId( node, TidyTag_BASE ) 00154 #define nodeIsMETA( node ) TagIsId( node, TidyTag_META ) 00155 #define nodeIsBODY( node ) TagIsId( node, TidyTag_BODY ) 00156 #define nodeIsFRAMESET( node ) TagIsId( node, TidyTag_FRAMESET ) 00157 #define nodeIsFRAME( node ) TagIsId( node, TidyTag_FRAME ) 00158 #define nodeIsIFRAME( node ) TagIsId( node, TidyTag_IFRAME ) 00159 #define nodeIsNOFRAMES( node ) TagIsId( node, TidyTag_NOFRAMES ) 00160 #define nodeIsHR( node ) TagIsId( node, TidyTag_HR ) 00161 #define nodeIsH1( node ) TagIsId( node, TidyTag_H1 ) 00162 #define nodeIsH2( node ) TagIsId( node, TidyTag_H2 ) 00163 #define nodeIsPRE( node ) TagIsId( node, TidyTag_PRE ) 00164 #define nodeIsLISTING( node ) TagIsId( node, TidyTag_LISTING ) 00165 #define nodeIsP( node ) TagIsId( node, TidyTag_P ) 00166 #define nodeIsUL( node ) TagIsId( node, TidyTag_UL ) 00167 #define nodeIsOL( node ) TagIsId( node, TidyTag_OL ) 00168 #define nodeIsDL( node ) TagIsId( node, TidyTag_DL ) 00169 #define nodeIsDIR( node ) TagIsId( node, TidyTag_DIR ) 00170 #define nodeIsLI( node ) TagIsId( node, TidyTag_LI ) 00171 #define nodeIsDT( node ) TagIsId( node, TidyTag_DT ) 00172 #define nodeIsDD( node ) TagIsId( node, TidyTag_DD ) 00173 #define nodeIsTABLE( node ) TagIsId( node, TidyTag_TABLE ) 00174 #define nodeIsCAPTION( node ) TagIsId( node, TidyTag_CAPTION ) 00175 #define nodeIsTD( node ) TagIsId( node, TidyTag_TD ) 00176 #define nodeIsTH( node ) TagIsId( node, TidyTag_TH ) 00177 #define nodeIsTR( node ) TagIsId( node, TidyTag_TR ) 00178 #define nodeIsCOL( node ) TagIsId( node, TidyTag_COL ) 00179 #define nodeIsCOLGROUP( node ) TagIsId( node, TidyTag_COLGROUP ) 00180 #define nodeIsBR( node ) TagIsId( node, TidyTag_BR ) 00181 #define nodeIsA( node ) TagIsId( node, TidyTag_A ) 00182 #define nodeIsLINK( node ) TagIsId( node, TidyTag_LINK ) 00183 #define nodeIsB( node ) TagIsId( node, TidyTag_B ) 00184 #define nodeIsI( node ) TagIsId( node, TidyTag_I ) 00185 #define nodeIsSTRONG( node ) TagIsId( node, TidyTag_STRONG ) 00186 #define nodeIsEM( node ) TagIsId( node, TidyTag_EM ) 00187 #define nodeIsBIG( node ) TagIsId( node, TidyTag_BIG ) 00188 #define nodeIsSMALL( node ) TagIsId( node, TidyTag_SMALL ) 00189 #define nodeIsPARAM( node ) TagIsId( node, TidyTag_PARAM ) 00190 #define nodeIsOPTION( node ) TagIsId( node, TidyTag_OPTION ) 00191 #define nodeIsOPTGROUP( node ) TagIsId( node, TidyTag_OPTGROUP ) 00192 #define nodeIsIMG( node ) TagIsId( node, TidyTag_IMG ) 00193 #define nodeIsMAP( node ) TagIsId( node, TidyTag_MAP ) 00194 #define nodeIsAREA( node ) TagIsId( node, TidyTag_AREA ) 00195 #define nodeIsNOBR( node ) TagIsId( node, TidyTag_NOBR ) 00196 #define nodeIsWBR( node ) TagIsId( node, TidyTag_WBR ) 00197 #define nodeIsFONT( node ) TagIsId( node, TidyTag_FONT ) 00198 #define nodeIsLAYER( node ) TagIsId( node, TidyTag_LAYER ) 00199 #define nodeIsSPACER( node ) TagIsId( node, TidyTag_SPACER ) 00200 #define nodeIsCENTER( node ) TagIsId( node, TidyTag_CENTER ) 00201 #define nodeIsSTYLE( node ) TagIsId( node, TidyTag_STYLE ) 00202 #define nodeIsSCRIPT( node ) TagIsId( node, TidyTag_SCRIPT ) 00203 #define nodeIsNOSCRIPT( node ) TagIsId( node, TidyTag_NOSCRIPT ) 00204 #define nodeIsFORM( node ) TagIsId( node, TidyTag_FORM ) 00205 #define nodeIsTEXTAREA( node ) TagIsId( node, TidyTag_TEXTAREA ) 00206 #define nodeIsBLOCKQUOTE( node ) TagIsId( node, TidyTag_BLOCKQUOTE ) 00207 #define nodeIsAPPLET( node ) TagIsId( node, TidyTag_APPLET ) 00208 #define nodeIsOBJECT( node ) TagIsId( node, TidyTag_OBJECT ) 00209 #define nodeIsDIV( node ) TagIsId( node, TidyTag_DIV ) 00210 #define nodeIsSPAN( node ) TagIsId( node, TidyTag_SPAN ) 00211 #define nodeIsINPUT( node ) TagIsId( node, TidyTag_INPUT ) 00212 #define nodeIsQ( node ) TagIsId( node, TidyTag_Q ) 00213 #define nodeIsLABEL( node ) TagIsId( node, TidyTag_LABEL ) 00214 #define nodeIsH3( node ) TagIsId( node, TidyTag_H3 ) 00215 #define nodeIsH4( node ) TagIsId( node, TidyTag_H4 ) 00216 #define nodeIsH5( node ) TagIsId( node, TidyTag_H5 ) 00217 #define nodeIsH6( node ) TagIsId( node, TidyTag_H6 ) 00218 #define nodeIsADDRESS( node ) TagIsId( node, TidyTag_ADDRESS ) 00219 #define nodeIsXMP( node ) TagIsId( node, TidyTag_XMP ) 00220 #define nodeIsSELECT( node ) TagIsId( node, TidyTag_SELECT ) 00221 #define nodeIsBLINK( node ) TagIsId( node, TidyTag_BLINK ) 00222 #define nodeIsMARQUEE( node ) TagIsId( node, TidyTag_MARQUEE ) 00223 #define nodeIsEMBED( node ) TagIsId( node, TidyTag_EMBED ) 00224 #define nodeIsBASEFONT( node ) TagIsId( node, TidyTag_BASEFONT ) 00225 #define nodeIsISINDEX( node ) TagIsId( node, TidyTag_ISINDEX ) 00226 #define nodeIsS( node ) TagIsId( node, TidyTag_S ) 00227 #define nodeIsSTRIKE( node ) TagIsId( node, TidyTag_STRIKE ) 00228 #define nodeIsSUB( node ) TagIsId( node, TidyTag_SUB ) 00229 #define nodeIsSUP( node ) TagIsId( node, TidyTag_SUP ) 00230 #define nodeIsU( node ) TagIsId( node, TidyTag_U ) 00231 #define nodeIsMENU( node ) TagIsId( node, TidyTag_MENU ) 00232 #define nodeIsBUTTON( node ) TagIsId( node, TidyTag_BUTTON ) 00233 00234 00235 #endif /* __TAGS_H__ */