HTML Tidy  0.1
tags.h
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__ */