~ubuntu-branches/ubuntu/vivid/tidy/vivid

« back to all changes in this revision

Viewing changes to src/attrs.c

  • Committer: Bazaar Package Importer
  • Author(s): Jason Thomas
  • Date: 2005-10-20 10:26:07 UTC
  • mfrom: (0.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051020102607-ezcx81ght15xsjuj
Tags: 20051018-1
* New upstream release
  (closes: #333444)
* debian/tidy.install: added debian/tidy.conf /etc/tidy/
  (closes: #308883)
* debian/control: changed libtidy0 to libtidy-0.99-0
* updated manpage
  (closes: #224427)

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
  CVS Info :
7
7
 
8
8
    $Author: arnaud02 $ 
9
 
    $Date: 2005/04/15 13:52:06 $ 
10
 
    $Revision: 1.110 $ 
 
9
    $Date: 2005/09/20 09:03:17 $ 
 
10
    $Revision: 1.115 $ 
11
11
 
12
12
*/
13
13
 
17
17
#include "tmbstr.h"
18
18
#include "utf8.h"
19
19
 
 
20
static AttrCheck CheckAction;
 
21
 
 
22
#define CH_PCDATA      NULL
 
23
#define CH_CHARSET     NULL
 
24
#define CH_TYPE        CheckType
 
25
#define CH_XTYPE       NULL
 
26
#define CH_CHARACTER   NULL
 
27
#define CH_URLS        NULL
 
28
#define CH_URL         CheckUrl
 
29
#define CH_SCRIPT      CheckScript
 
30
#define CH_ALIGN       CheckAlign
 
31
#define CH_VALIGN      CheckValign
 
32
#define CH_COLOR       CheckColor
 
33
#define CH_CLEAR       CheckClear
 
34
#define CH_BORDER      CheckBool     /* kludge */
 
35
#define CH_LANG        CheckLang
 
36
#define CH_BOOL        CheckBool
 
37
#define CH_COLS        NULL
 
38
#define CH_NUMBER      CheckNumber
 
39
#define CH_LENGTH      CheckLength
 
40
#define CH_COORDS      NULL
 
41
#define CH_DATE        NULL
 
42
#define CH_TEXTDIR     CheckTextDir
 
43
#define CH_IDREFS      NULL
 
44
#define CH_IDREF       NULL
 
45
#define CH_IDDEF       CheckId
 
46
#define CH_NAME        CheckName
 
47
#define CH_TFRAME      NULL
 
48
#define CH_FBORDER     NULL
 
49
#define CH_MEDIA       NULL
 
50
#define CH_FSUBMIT     CheckFsubmit
 
51
#define CH_LINKTYPES   NULL
 
52
#define CH_TRULES      NULL
 
53
#define CH_SCOPE       CheckScope
 
54
#define CH_SHAPE       CheckShape
 
55
#define CH_SCROLL      CheckScroll
 
56
#define CH_TARGET      CheckTarget
 
57
#define CH_VTYPE       CheckVType
 
58
#define CH_ACTION      CheckAction
 
59
 
20
60
static const Attribute attribute_defs [] =
21
61
{
22
 
  { TidyAttr_UNKNOWN,           "unknown!",          VERS_PROPRIETARY,  NULL      }, 
23
 
  { TidyAttr_ABBR,              "abbr",              VERS_HTML40,       PCDATA    }, 
24
 
  { TidyAttr_ACCEPT,            "accept",            VERS_ALL,          TYPE      }, 
25
 
  { TidyAttr_ACCEPT_CHARSET,    "accept-charset",    VERS_HTML40,       CHARSET   }, 
26
 
  { TidyAttr_ACCESSKEY,         "accesskey",         VERS_HTML40,       CHARACTER }, 
27
 
  { TidyAttr_ACTION,            "action",            VERS_ALL,          URL       }, 
28
 
  { TidyAttr_ADD_DATE,          "add_date",          VERS_NETSCAPE,     PCDATA    }, /* A */
29
 
  { TidyAttr_ALIGN,             "align",             VERS_ALL,          ALIGN     }, /* varies by element */
30
 
  { TidyAttr_ALINK,             "alink",             VERS_LOOSE,        COLOR     }, 
31
 
  { TidyAttr_ALT,               "alt",               VERS_ALL,          PCDATA    }, /* nowrap */
32
 
  { TidyAttr_ARCHIVE,           "archive",           VERS_HTML40,       URLS      }, /* space or comma separated list */
33
 
  { TidyAttr_AXIS,              "axis",              VERS_HTML40,       PCDATA    }, 
34
 
  { TidyAttr_BACKGROUND,        "background",        VERS_LOOSE,        URL       }, 
35
 
  { TidyAttr_BGCOLOR,           "bgcolor",           VERS_LOOSE,        COLOR     }, 
36
 
  { TidyAttr_BGPROPERTIES,      "bgproperties",      VERS_PROPRIETARY,  PCDATA    }, /* BODY "fixed" fixes background */
37
 
  { TidyAttr_BORDER,            "border",            VERS_ALL,          BORDER    }, /* like LENGTH + "border" */
38
 
  { TidyAttr_BORDERCOLOR,       "bordercolor",       VERS_MICROSOFT,    COLOR     }, /* used on TABLE */
39
 
  { TidyAttr_BOTTOMMARGIN,      "bottommargin",      VERS_MICROSOFT,    NUMBER    }, /* used on BODY */
40
 
  { TidyAttr_CELLPADDING,       "cellpadding",       VERS_FROM32,       LENGTH    }, /* % or pixel values */
41
 
  { TidyAttr_CELLSPACING,       "cellspacing",       VERS_FROM32,       LENGTH    }, 
42
 
  { TidyAttr_CHAR,              "char",              VERS_HTML40,       CHARACTER }, 
43
 
  { TidyAttr_CHAROFF,           "charoff",           VERS_HTML40,       LENGTH    }, 
44
 
  { TidyAttr_CHARSET,           "charset",           VERS_HTML40,       CHARSET   }, 
45
 
  { TidyAttr_CHECKED,           "checked",           VERS_ALL,          BOOL      }, /* i.e. "checked" or absent */
46
 
  { TidyAttr_CITE,              "cite",              VERS_HTML40,       URL       }, 
47
 
  { TidyAttr_CLASS,             "class",             VERS_HTML40,       PCDATA    }, 
48
 
  { TidyAttr_CLASSID,           "classid",           VERS_HTML40,       URL       }, 
49
 
  { TidyAttr_CLEAR,             "clear",             VERS_LOOSE,        CLEAR     }, /* BR: left, right, all */
50
 
  { TidyAttr_CODE,              "code",              VERS_LOOSE,        PCDATA    }, /* APPLET */
51
 
  { TidyAttr_CODEBASE,          "codebase",          VERS_HTML40,       URL       }, /* OBJECT */
52
 
  { TidyAttr_CODETYPE,          "codetype",          VERS_HTML40,       TYPE      }, /* OBJECT */
53
 
  { TidyAttr_COLOR,             "color",             VERS_LOOSE,        COLOR     }, /* BASEFONT, FONT */
54
 
  { TidyAttr_COLS,              "cols",              VERS_IFRAME,       COLS      }, /* TABLE & FRAMESET */
55
 
  { TidyAttr_COLSPAN,           "colspan",           VERS_FROM32,       NUMBER    }, 
56
 
  { TidyAttr_COMPACT,           "compact",           VERS_ALL,          BOOL      }, /* lists */
57
 
  { TidyAttr_CONTENT,           "content",           VERS_ALL,          PCDATA    }, 
58
 
  { TidyAttr_COORDS,            "coords",            VERS_FROM32,       COORDS    }, /* AREA, A */
59
 
  { TidyAttr_DATA,              "data",              VERS_HTML40,       URL       }, /* OBJECT */
60
 
  { TidyAttr_DATAFLD,           "datafld",           VERS_MICROSOFT,    PCDATA    }, /* used on DIV, IMG */
61
 
  { TidyAttr_DATAFORMATAS,      "dataformatas",      VERS_MICROSOFT,    PCDATA    }, /* used on DIV, IMG */
62
 
  { TidyAttr_DATAPAGESIZE,      "datapagesize",      VERS_MICROSOFT,    NUMBER    }, /* used on DIV, IMG */
63
 
  { TidyAttr_DATASRC,           "datasrc",           VERS_MICROSOFT,    URL       }, /* used on TABLE */
64
 
  { TidyAttr_DATETIME,          "datetime",          VERS_HTML40,       DATE      }, /* INS, DEL */
65
 
  { TidyAttr_DECLARE,           "declare",           VERS_HTML40,       BOOL      }, /* OBJECT */
66
 
  { TidyAttr_DEFER,             "defer",             VERS_HTML40,       BOOL      }, /* SCRIPT */
67
 
  { TidyAttr_DIR,               "dir",               VERS_HTML40,       TEXTDIR   }, /* ltr or rtl */
68
 
  { TidyAttr_DISABLED,          "disabled",          VERS_HTML40,       BOOL      }, /* form fields */
69
 
  { TidyAttr_ENCODING,          "encoding",          VERS_XML,          PCDATA    }, /* <?xml?> */
70
 
  { TidyAttr_ENCTYPE,           "enctype",           VERS_ALL,          TYPE      }, /* FORM */
71
 
  { TidyAttr_FACE,              "face",              VERS_LOOSE,        PCDATA    }, /* BASEFONT, FONT */
72
 
  { TidyAttr_FOR,               "for",               VERS_HTML40,       IDREF     }, /* LABEL */
73
 
  { TidyAttr_FRAME,             "frame",             VERS_HTML40,       TFRAME    }, /* TABLE */
74
 
  { TidyAttr_FRAMEBORDER,       "frameborder",       VERS_FRAMESET,     FBORDER   }, /* 0 or 1 */
75
 
  { TidyAttr_FRAMESPACING,      "framespacing",      VERS_PROPRIETARY,  NUMBER    }, 
76
 
  { TidyAttr_GRIDX,             "gridx",             VERS_PROPRIETARY,  NUMBER    }, /* TABLE Adobe golive*/
77
 
  { TidyAttr_GRIDY,             "gridy",             VERS_PROPRIETARY,  NUMBER    }, /* TABLE Adobe golive */
78
 
  { TidyAttr_HEADERS,           "headers",           VERS_HTML40,       IDREFS    }, /* table cells */
79
 
  { TidyAttr_HEIGHT,            "height",            VERS_ALL,          LENGTH    }, /* pixels only for TH/TD */
80
 
  { TidyAttr_HREF,              "href",              VERS_ALL,          URL       }, /* A, AREA, LINK and BASE */
81
 
  { TidyAttr_HREFLANG,          "hreflang",          VERS_HTML40,       LANG      }, /* A, LINK */
82
 
  { TidyAttr_HSPACE,            "hspace",            VERS_ALL,          NUMBER    }, /* APPLET, IMG, OBJECT */
83
 
  { TidyAttr_HTTP_EQUIV,        "http-equiv",        VERS_ALL,          PCDATA    }, /* META */
84
 
  { TidyAttr_ID,                "id",                VERS_HTML40,       IDDEF     }, 
85
 
  { TidyAttr_ISMAP,             "ismap",             VERS_ALL,          BOOL      }, /* IMG */
86
 
  { TidyAttr_LABEL,             "label",             VERS_HTML40,       PCDATA    }, /* OPT, OPTGROUP */
87
 
  { TidyAttr_LANG,              "lang",              VERS_HTML40,       LANG      }, 
88
 
  { TidyAttr_LANGUAGE,          "language",          VERS_LOOSE,        PCDATA    }, /* SCRIPT */
89
 
  { TidyAttr_LAST_MODIFIED,     "last_modified",     VERS_NETSCAPE,     PCDATA    }, /* A */
90
 
  { TidyAttr_LAST_VISIT,        "last_visit",        VERS_NETSCAPE,     PCDATA    }, /* A */
91
 
  { TidyAttr_LEFTMARGIN,        "leftmargin",        VERS_MICROSOFT,    NUMBER    }, /* used on BODY */
92
 
  { TidyAttr_LINK,              "link",              VERS_LOOSE,        COLOR     }, /* BODY */
93
 
  { TidyAttr_LONGDESC,          "longdesc",          VERS_HTML40,       URL       }, /* IMG */
94
 
  { TidyAttr_LOWSRC,            "lowsrc",            VERS_PROPRIETARY,  URL       }, /* IMG */
95
 
  { TidyAttr_MARGINHEIGHT,      "marginheight",      VERS_IFRAME,       NUMBER    }, /* FRAME, IFRAME, BODY */
96
 
  { TidyAttr_MARGINWIDTH,       "marginwidth",       VERS_IFRAME,       NUMBER    }, /* ditto */
97
 
  { TidyAttr_MAXLENGTH,         "maxlength",         VERS_ALL,          NUMBER    }, /* INPUT */
98
 
  { TidyAttr_MEDIA,             "media",             VERS_HTML40,       MEDIA     }, /* STYLE, LINK */
99
 
  { TidyAttr_METHOD,            "method",            VERS_ALL,          FSUBMIT   }, /* FORM: get or post */
100
 
  { TidyAttr_MULTIPLE,          "multiple",          VERS_ALL,          BOOL      }, /* SELECT */
101
 
  { TidyAttr_NAME,              "name",              VERS_ALL,          NAME      }, 
102
 
  { TidyAttr_NOHREF,            "nohref",            VERS_FROM32,       BOOL      }, /* AREA */
103
 
  { TidyAttr_NORESIZE,          "noresize",          VERS_FRAMESET,     BOOL      }, /* FRAME */
104
 
  { TidyAttr_NOSHADE,           "noshade",           VERS_LOOSE,        BOOL      }, /* HR */
105
 
  { TidyAttr_NOWRAP,            "nowrap",            VERS_LOOSE,        BOOL      }, /* table cells */
106
 
  { TidyAttr_OBJECT,            "object",            VERS_HTML40_LOOSE, PCDATA    }, /* APPLET */
107
 
  { TidyAttr_OnAFTERUPDATE,     "onafterupdate",     VERS_MICROSOFT,    SCRIPT    }, 
108
 
  { TidyAttr_OnBEFOREUNLOAD,    "onbeforeunload",    VERS_MICROSOFT,    SCRIPT    }, 
109
 
  { TidyAttr_OnBEFOREUPDATE,    "onbeforeupdate",    VERS_MICROSOFT,    SCRIPT    }, 
110
 
  { TidyAttr_OnBLUR,            "onblur",            VERS_EVENTS,       SCRIPT    }, /* event */
111
 
  { TidyAttr_OnCHANGE,          "onchange",          VERS_EVENTS,       SCRIPT    }, /* event */
112
 
  { TidyAttr_OnCLICK,           "onclick",           VERS_EVENTS,       SCRIPT    }, /* event */
113
 
  { TidyAttr_OnDATAAVAILABLE,   "ondataavailable",   VERS_MICROSOFT,    SCRIPT    }, /* object, applet */
114
 
  { TidyAttr_OnDATASETCHANGED,  "ondatasetchanged",  VERS_MICROSOFT,    SCRIPT    }, /* object, applet */
115
 
  { TidyAttr_OnDATASETCOMPLETE, "ondatasetcomplete", VERS_MICROSOFT,    SCRIPT    }, 
116
 
  { TidyAttr_OnDBLCLICK,        "ondblclick",        VERS_EVENTS,       SCRIPT    }, /* event */
117
 
  { TidyAttr_OnERRORUPDATE,     "onerrorupdate",     VERS_MICROSOFT,    SCRIPT    }, /* form fields */
118
 
  { TidyAttr_OnFOCUS,           "onfocus",           VERS_EVENTS,       SCRIPT    }, /* event */
119
 
  { TidyAttr_OnKEYDOWN,         "onkeydown",         VERS_EVENTS,       SCRIPT    }, /* event */
120
 
  { TidyAttr_OnKEYPRESS,        "onkeypress",        VERS_EVENTS,       SCRIPT    }, /* event */
121
 
  { TidyAttr_OnKEYUP,           "onkeyup",           VERS_EVENTS,       SCRIPT    }, /* event */
122
 
  { TidyAttr_OnLOAD,            "onload",            VERS_EVENTS,       SCRIPT    }, /* event */
123
 
  { TidyAttr_OnMOUSEDOWN,       "onmousedown",       VERS_EVENTS,       SCRIPT    }, /* event */
124
 
  { TidyAttr_OnMOUSEMOVE,       "onmousemove",       VERS_EVENTS,       SCRIPT    }, /* event */
125
 
  { TidyAttr_OnMOUSEOUT,        "onmouseout",        VERS_EVENTS,       SCRIPT    }, /* event */
126
 
  { TidyAttr_OnMOUSEOVER,       "onmouseover",       VERS_EVENTS,       SCRIPT    }, /* event */
127
 
  { TidyAttr_OnMOUSEUP,         "onmouseup",         VERS_EVENTS,       SCRIPT    }, /* event */
128
 
  { TidyAttr_OnRESET,           "onreset",           VERS_EVENTS,       SCRIPT    }, /* event */
129
 
  { TidyAttr_OnROWENTER,        "onrowenter",        VERS_MICROSOFT,    SCRIPT    }, /* form fields */
130
 
  { TidyAttr_OnROWEXIT,         "onrowexit",         VERS_MICROSOFT,    SCRIPT    }, /* form fields */
131
 
  { TidyAttr_OnSELECT,          "onselect",          VERS_EVENTS,       SCRIPT    }, /* event */
132
 
  { TidyAttr_OnSUBMIT,          "onsubmit",          VERS_EVENTS,       SCRIPT    }, /* event */
133
 
  { TidyAttr_OnUNLOAD,          "onunload",          VERS_EVENTS,       SCRIPT    }, /* event */
134
 
  { TidyAttr_PROFILE,           "profile",           VERS_HTML40,       URL       }, /* HEAD */
135
 
  { TidyAttr_PROMPT,            "prompt",            VERS_LOOSE,        PCDATA    }, /* ISINDEX */
136
 
  { TidyAttr_RBSPAN,            "rbspan",            VERS_XHTML11,      NUMBER    }, /* ruby markup */
137
 
  { TidyAttr_READONLY,          "readonly",          VERS_HTML40,       BOOL      }, /* form fields */
138
 
  { TidyAttr_REL,               "rel",               VERS_ALL,          LINKTYPES }, 
139
 
  { TidyAttr_REV,               "rev",               VERS_ALL,          LINKTYPES }, 
140
 
  { TidyAttr_RIGHTMARGIN,       "rightmargin",       VERS_MICROSOFT,    NUMBER    }, /* used on BODY */
141
 
  { TidyAttr_ROWS,              "rows",              VERS_ALL,          NUMBER    }, /* TEXTAREA */
142
 
  { TidyAttr_ROWSPAN,           "rowspan",           VERS_ALL,          NUMBER    }, /* table cells */
143
 
  { TidyAttr_RULES,             "rules",             VERS_HTML40,       TRULES    }, /* TABLE */
144
 
  { TidyAttr_SCHEME,            "scheme",            VERS_HTML40,       PCDATA    }, /* META */
145
 
  { TidyAttr_SCOPE,             "scope",             VERS_HTML40,       SCOPE     }, /* table cells */
146
 
  { TidyAttr_SCROLLING,         "scrolling",         VERS_IFRAME,       SCROLL    }, /* yes, no or auto */
147
 
  { TidyAttr_SELECTED,          "selected",          VERS_ALL,          BOOL      }, /* OPTION */
148
 
  { TidyAttr_SHAPE,             "shape",             VERS_FROM32,       SHAPE     }, /* AREA, A */
149
 
  { TidyAttr_SHOWGRID,          "showgrid",          VERS_PROPRIETARY,  BOOL      }, /* TABLE Adobe golive */
150
 
  { TidyAttr_SHOWGRIDX,         "showgridx",         VERS_PROPRIETARY,  BOOL      }, /* TABLE Adobe golive*/
151
 
  { TidyAttr_SHOWGRIDY,         "showgridy",         VERS_PROPRIETARY,  BOOL      }, /* TABLE Adobe golive*/
152
 
  { TidyAttr_SIZE,              "size",              VERS_LOOSE,        NUMBER    }, /* HR, FONT, BASEFONT, SELECT */
153
 
  { TidyAttr_SPAN,              "span",              VERS_HTML40,       NUMBER    }, /* COL, COLGROUP */
154
 
  { TidyAttr_SRC,               "src",               VERS_ALL,          URL       }, /* IMG, FRAME, IFRAME */
155
 
  { TidyAttr_STANDBY,           "standby",           VERS_HTML40,       PCDATA    }, /* OBJECT */
156
 
  { TidyAttr_START,             "start",             VERS_ALL,          NUMBER    }, /* OL */
157
 
  { TidyAttr_STYLE,             "style",             VERS_HTML40,       PCDATA    }, 
158
 
  { TidyAttr_SUMMARY,           "summary",           VERS_HTML40,       PCDATA    }, /* TABLE */
159
 
  { TidyAttr_TABINDEX,          "tabindex",          VERS_HTML40,       NUMBER    }, /* fields, OBJECT  and A */
160
 
  { TidyAttr_TARGET,            "target",            VERS_HTML40,       TARGET    }, /* names a frame/window */
161
 
  { TidyAttr_TEXT,              "text",              VERS_LOOSE,        COLOR     }, /* BODY */
162
 
  { TidyAttr_TITLE,             "title",             VERS_HTML40,       PCDATA    }, /* text tool tip */
163
 
  { TidyAttr_TOPMARGIN,         "topmargin",         VERS_MICROSOFT,    NUMBER    }, /* used on BODY */
164
 
  { TidyAttr_TYPE,              "type",              VERS_FROM32,       TYPE      }, /* also used by SPACER */
165
 
  { TidyAttr_USEMAP,            "usemap",            VERS_ALL,          URL       }, /* things with images */
166
 
  { TidyAttr_VALIGN,            "valign",            VERS_FROM32,       VALIGN    }, 
167
 
  { TidyAttr_VALUE,             "value",             VERS_ALL,          PCDATA    }, 
168
 
  { TidyAttr_VALUETYPE,         "valuetype",         VERS_HTML40,       VTYPE     }, /* PARAM: data, ref, object */
169
 
  { TidyAttr_VERSION,           "version",           VERS_ALL|VERS_XML, PCDATA    }, /* HTML <?xml?> */
170
 
  { TidyAttr_VLINK,             "vlink",             VERS_LOOSE,        COLOR     }, /* BODY */
171
 
  { TidyAttr_VSPACE,            "vspace",            VERS_LOOSE,        NUMBER    }, /* IMG, OBJECT, APPLET */
172
 
  { TidyAttr_WIDTH,             "width",             VERS_ALL,          LENGTH    }, /* pixels only for TD/TH */
173
 
  { TidyAttr_WRAP,              "wrap",              VERS_NETSCAPE,     PCDATA    }, /* textarea */
174
 
  { TidyAttr_XML_LANG,          "xml:lang",          VERS_XML,          LANG      }, /* XML language */
175
 
  { TidyAttr_XML_SPACE,         "xml:space",         VERS_XML,          PCDATA    }, /* XML white space */
 
62
  { TidyAttr_UNKNOWN,           "unknown!",          VERS_PROPRIETARY,  NULL         }, 
 
63
  { TidyAttr_ABBR,              "abbr",              VERS_HTML40,       CH_PCDATA    }, 
 
64
  { TidyAttr_ACCEPT,            "accept",            VERS_ALL,          CH_XTYPE     }, 
 
65
  { TidyAttr_ACCEPT_CHARSET,    "accept-charset",    VERS_HTML40,       CH_CHARSET   }, 
 
66
  { TidyAttr_ACCESSKEY,         "accesskey",         VERS_HTML40,       CH_CHARACTER }, 
 
67
  { TidyAttr_ACTION,            "action",            VERS_ALL,          CH_ACTION    }, 
 
68
  { TidyAttr_ADD_DATE,          "add_date",          VERS_NETSCAPE,     CH_PCDATA    }, /* A */
 
69
  { TidyAttr_ALIGN,             "align",             VERS_ALL,          CH_ALIGN     }, /* varies by element */
 
70
  { TidyAttr_ALINK,             "alink",             VERS_LOOSE,        CH_COLOR     }, 
 
71
  { TidyAttr_ALT,               "alt",               VERS_ALL,          CH_PCDATA    }, /* nowrap */
 
72
  { TidyAttr_ARCHIVE,           "archive",           VERS_HTML40,       CH_URLS      }, /* space or comma separated list */
 
73
  { TidyAttr_AXIS,              "axis",              VERS_HTML40,       CH_PCDATA    }, 
 
74
  { TidyAttr_BACKGROUND,        "background",        VERS_LOOSE,        CH_URL       }, 
 
75
  { TidyAttr_BGCOLOR,           "bgcolor",           VERS_LOOSE,        CH_COLOR     }, 
 
76
  { TidyAttr_BGPROPERTIES,      "bgproperties",      VERS_PROPRIETARY,  CH_PCDATA    }, /* BODY "fixed" fixes background */
 
77
  { TidyAttr_BORDER,            "border",            VERS_ALL,          CH_BORDER    }, /* like LENGTH + "border" */
 
78
  { TidyAttr_BORDERCOLOR,       "bordercolor",       VERS_MICROSOFT,    CH_COLOR     }, /* used on TABLE */
 
79
  { TidyAttr_BOTTOMMARGIN,      "bottommargin",      VERS_MICROSOFT,    CH_NUMBER    }, /* used on BODY */
 
80
  { TidyAttr_CELLPADDING,       "cellpadding",       VERS_FROM32,       CH_LENGTH    }, /* % or pixel values */
 
81
  { TidyAttr_CELLSPACING,       "cellspacing",       VERS_FROM32,       CH_LENGTH    }, 
 
82
  { TidyAttr_CHAR,              "char",              VERS_HTML40,       CH_CHARACTER }, 
 
83
  { TidyAttr_CHAROFF,           "charoff",           VERS_HTML40,       CH_LENGTH    }, 
 
84
  { TidyAttr_CHARSET,           "charset",           VERS_HTML40,       CH_CHARSET   }, 
 
85
  { TidyAttr_CHECKED,           "checked",           VERS_ALL,          CH_BOOL      }, /* i.e. "checked" or absent */
 
86
  { TidyAttr_CITE,              "cite",              VERS_HTML40,       CH_URL       }, 
 
87
  { TidyAttr_CLASS,             "class",             VERS_HTML40,       CH_PCDATA    }, 
 
88
  { TidyAttr_CLASSID,           "classid",           VERS_HTML40,       CH_URL       }, 
 
89
  { TidyAttr_CLEAR,             "clear",             VERS_LOOSE,        CH_CLEAR     }, /* BR: left, right, all */
 
90
  { TidyAttr_CODE,              "code",              VERS_LOOSE,        CH_PCDATA    }, /* APPLET */
 
91
  { TidyAttr_CODEBASE,          "codebase",          VERS_HTML40,       CH_URL       }, /* OBJECT */
 
92
  { TidyAttr_CODETYPE,          "codetype",          VERS_HTML40,       CH_XTYPE     }, /* OBJECT */
 
93
  { TidyAttr_COLOR,             "color",             VERS_LOOSE,        CH_COLOR     }, /* BASEFONT, FONT */
 
94
  { TidyAttr_COLS,              "cols",              VERS_IFRAME,       CH_COLS      }, /* TABLE & FRAMESET */
 
95
  { TidyAttr_COLSPAN,           "colspan",           VERS_FROM32,       CH_NUMBER    }, 
 
96
  { TidyAttr_COMPACT,           "compact",           VERS_ALL,          CH_BOOL      }, /* lists */
 
97
  { TidyAttr_CONTENT,           "content",           VERS_ALL,          CH_PCDATA    }, 
 
98
  { TidyAttr_COORDS,            "coords",            VERS_FROM32,       CH_COORDS    }, /* AREA, A */
 
99
  { TidyAttr_DATA,              "data",              VERS_HTML40,       CH_URL       }, /* OBJECT */
 
100
  { TidyAttr_DATAFLD,           "datafld",           VERS_MICROSOFT,    CH_PCDATA    }, /* used on DIV, IMG */
 
101
  { TidyAttr_DATAFORMATAS,      "dataformatas",      VERS_MICROSOFT,    CH_PCDATA    }, /* used on DIV, IMG */
 
102
  { TidyAttr_DATAPAGESIZE,      "datapagesize",      VERS_MICROSOFT,    CH_NUMBER    }, /* used on DIV, IMG */
 
103
  { TidyAttr_DATASRC,           "datasrc",           VERS_MICROSOFT,    CH_URL       }, /* used on TABLE */
 
104
  { TidyAttr_DATETIME,          "datetime",          VERS_HTML40,       CH_DATE      }, /* INS, DEL */
 
105
  { TidyAttr_DECLARE,           "declare",           VERS_HTML40,       CH_BOOL      }, /* OBJECT */
 
106
  { TidyAttr_DEFER,             "defer",             VERS_HTML40,       CH_BOOL      }, /* SCRIPT */
 
107
  { TidyAttr_DIR,               "dir",               VERS_HTML40,       CH_TEXTDIR   }, /* ltr or rtl */
 
108
  { TidyAttr_DISABLED,          "disabled",          VERS_HTML40,       CH_BOOL      }, /* form fields */
 
109
  { TidyAttr_ENCODING,          "encoding",          VERS_XML,          CH_PCDATA    }, /* <?xml?> */
 
110
  { TidyAttr_ENCTYPE,           "enctype",           VERS_ALL,          CH_XTYPE     }, /* FORM */
 
111
  { TidyAttr_FACE,              "face",              VERS_LOOSE,        CH_PCDATA    }, /* BASEFONT, FONT */
 
112
  { TidyAttr_FOR,               "for",               VERS_HTML40,       CH_IDREF     }, /* LABEL */
 
113
  { TidyAttr_FRAME,             "frame",             VERS_HTML40,       CH_TFRAME    }, /* TABLE */
 
114
  { TidyAttr_FRAMEBORDER,       "frameborder",       VERS_FRAMESET,     CH_FBORDER   }, /* 0 or 1 */
 
115
  { TidyAttr_FRAMESPACING,      "framespacing",      VERS_PROPRIETARY,  CH_NUMBER    }, 
 
116
  { TidyAttr_GRIDX,             "gridx",             VERS_PROPRIETARY,  CH_NUMBER    }, /* TABLE Adobe golive*/
 
117
  { TidyAttr_GRIDY,             "gridy",             VERS_PROPRIETARY,  CH_NUMBER    }, /* TABLE Adobe golive */
 
118
  { TidyAttr_HEADERS,           "headers",           VERS_HTML40,       CH_IDREFS    }, /* table cells */
 
119
  { TidyAttr_HEIGHT,            "height",            VERS_ALL,          CH_LENGTH    }, /* pixels only for TH/TD */
 
120
  { TidyAttr_HREF,              "href",              VERS_ALL,          CH_URL       }, /* A, AREA, LINK and BASE */
 
121
  { TidyAttr_HREFLANG,          "hreflang",          VERS_HTML40,       CH_LANG      }, /* A, LINK */
 
122
  { TidyAttr_HSPACE,            "hspace",            VERS_ALL,          CH_NUMBER    }, /* APPLET, IMG, OBJECT */
 
123
  { TidyAttr_HTTP_EQUIV,        "http-equiv",        VERS_ALL,          CH_PCDATA    }, /* META */
 
124
  { TidyAttr_ID,                "id",                VERS_HTML40,       CH_IDDEF     }, 
 
125
  { TidyAttr_ISMAP,             "ismap",             VERS_ALL,          CH_BOOL      }, /* IMG */
 
126
  { TidyAttr_LABEL,             "label",             VERS_HTML40,       CH_PCDATA    }, /* OPT, OPTGROUP */
 
127
  { TidyAttr_LANG,              "lang",              VERS_HTML40,       CH_LANG      }, 
 
128
  { TidyAttr_LANGUAGE,          "language",          VERS_LOOSE,        CH_PCDATA    }, /* SCRIPT */
 
129
  { TidyAttr_LAST_MODIFIED,     "last_modified",     VERS_NETSCAPE,     CH_PCDATA    }, /* A */
 
130
  { TidyAttr_LAST_VISIT,        "last_visit",        VERS_NETSCAPE,     CH_PCDATA    }, /* A */
 
131
  { TidyAttr_LEFTMARGIN,        "leftmargin",        VERS_MICROSOFT,    CH_NUMBER    }, /* used on BODY */
 
132
  { TidyAttr_LINK,              "link",              VERS_LOOSE,        CH_COLOR     }, /* BODY */
 
133
  { TidyAttr_LONGDESC,          "longdesc",          VERS_HTML40,       CH_URL       }, /* IMG */
 
134
  { TidyAttr_LOWSRC,            "lowsrc",            VERS_PROPRIETARY,  CH_URL       }, /* IMG */
 
135
  { TidyAttr_MARGINHEIGHT,      "marginheight",      VERS_IFRAME,       CH_NUMBER    }, /* FRAME, IFRAME, BODY */
 
136
  { TidyAttr_MARGINWIDTH,       "marginwidth",       VERS_IFRAME,       CH_NUMBER    }, /* ditto */
 
137
  { TidyAttr_MAXLENGTH,         "maxlength",         VERS_ALL,          CH_NUMBER    }, /* INPUT */
 
138
  { TidyAttr_MEDIA,             "media",             VERS_HTML40,       CH_MEDIA     }, /* STYLE, LINK */
 
139
  { TidyAttr_METHOD,            "method",            VERS_ALL,          CH_FSUBMIT   }, /* FORM: get or post */
 
140
  { TidyAttr_MULTIPLE,          "multiple",          VERS_ALL,          CH_BOOL      }, /* SELECT */
 
141
  { TidyAttr_NAME,              "name",              VERS_ALL,          CH_NAME      }, 
 
142
  { TidyAttr_NOHREF,            "nohref",            VERS_FROM32,       CH_BOOL      }, /* AREA */
 
143
  { TidyAttr_NORESIZE,          "noresize",          VERS_FRAMESET,     CH_BOOL      }, /* FRAME */
 
144
  { TidyAttr_NOSHADE,           "noshade",           VERS_LOOSE,        CH_BOOL      }, /* HR */
 
145
  { TidyAttr_NOWRAP,            "nowrap",            VERS_LOOSE,        CH_BOOL      }, /* table cells */
 
146
  { TidyAttr_OBJECT,            "object",            VERS_HTML40_LOOSE, CH_PCDATA    }, /* APPLET */
 
147
  { TidyAttr_OnAFTERUPDATE,     "onafterupdate",     VERS_MICROSOFT,    CH_SCRIPT    }, 
 
148
  { TidyAttr_OnBEFOREUNLOAD,    "onbeforeunload",    VERS_MICROSOFT,    CH_SCRIPT    }, 
 
149
  { TidyAttr_OnBEFOREUPDATE,    "onbeforeupdate",    VERS_MICROSOFT,    CH_SCRIPT    }, 
 
150
  { TidyAttr_OnBLUR,            "onblur",            VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
151
  { TidyAttr_OnCHANGE,          "onchange",          VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
152
  { TidyAttr_OnCLICK,           "onclick",           VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
153
  { TidyAttr_OnDATAAVAILABLE,   "ondataavailable",   VERS_MICROSOFT,    CH_SCRIPT    }, /* object, applet */
 
154
  { TidyAttr_OnDATASETCHANGED,  "ondatasetchanged",  VERS_MICROSOFT,    CH_SCRIPT    }, /* object, applet */
 
155
  { TidyAttr_OnDATASETCOMPLETE, "ondatasetcomplete", VERS_MICROSOFT,    CH_SCRIPT    }, 
 
156
  { TidyAttr_OnDBLCLICK,        "ondblclick",        VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
157
  { TidyAttr_OnERRORUPDATE,     "onerrorupdate",     VERS_MICROSOFT,    CH_SCRIPT    }, /* form fields */
 
158
  { TidyAttr_OnFOCUS,           "onfocus",           VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
159
  { TidyAttr_OnKEYDOWN,         "onkeydown",         VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
160
  { TidyAttr_OnKEYPRESS,        "onkeypress",        VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
161
  { TidyAttr_OnKEYUP,           "onkeyup",           VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
162
  { TidyAttr_OnLOAD,            "onload",            VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
163
  { TidyAttr_OnMOUSEDOWN,       "onmousedown",       VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
164
  { TidyAttr_OnMOUSEMOVE,       "onmousemove",       VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
165
  { TidyAttr_OnMOUSEOUT,        "onmouseout",        VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
166
  { TidyAttr_OnMOUSEOVER,       "onmouseover",       VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
167
  { TidyAttr_OnMOUSEUP,         "onmouseup",         VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
168
  { TidyAttr_OnRESET,           "onreset",           VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
169
  { TidyAttr_OnROWENTER,        "onrowenter",        VERS_MICROSOFT,    CH_SCRIPT    }, /* form fields */
 
170
  { TidyAttr_OnROWEXIT,         "onrowexit",         VERS_MICROSOFT,    CH_SCRIPT    }, /* form fields */
 
171
  { TidyAttr_OnSELECT,          "onselect",          VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
172
  { TidyAttr_OnSUBMIT,          "onsubmit",          VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
173
  { TidyAttr_OnUNLOAD,          "onunload",          VERS_EVENTS,       CH_SCRIPT    }, /* event */
 
174
  { TidyAttr_PROFILE,           "profile",           VERS_HTML40,       CH_URL       }, /* HEAD */
 
175
  { TidyAttr_PROMPT,            "prompt",            VERS_LOOSE,        CH_PCDATA    }, /* ISINDEX */
 
176
  { TidyAttr_RBSPAN,            "rbspan",            VERS_XHTML11,      CH_NUMBER    }, /* ruby markup */
 
177
  { TidyAttr_READONLY,          "readonly",          VERS_HTML40,       CH_BOOL      }, /* form fields */
 
178
  { TidyAttr_REL,               "rel",               VERS_ALL,          CH_LINKTYPES }, 
 
179
  { TidyAttr_REV,               "rev",               VERS_ALL,          CH_LINKTYPES }, 
 
180
  { TidyAttr_RIGHTMARGIN,       "rightmargin",       VERS_MICROSOFT,    CH_NUMBER    }, /* used on BODY */
 
181
  { TidyAttr_ROWS,              "rows",              VERS_ALL,          CH_NUMBER    }, /* TEXTAREA */
 
182
  { TidyAttr_ROWSPAN,           "rowspan",           VERS_ALL,          CH_NUMBER    }, /* table cells */
 
183
  { TidyAttr_RULES,             "rules",             VERS_HTML40,       CH_TRULES    }, /* TABLE */
 
184
  { TidyAttr_SCHEME,            "scheme",            VERS_HTML40,       CH_PCDATA    }, /* META */
 
185
  { TidyAttr_SCOPE,             "scope",             VERS_HTML40,       CH_SCOPE     }, /* table cells */
 
186
  { TidyAttr_SCROLLING,         "scrolling",         VERS_IFRAME,       CH_SCROLL    }, /* yes, no or auto */
 
187
  { TidyAttr_SELECTED,          "selected",          VERS_ALL,          CH_BOOL      }, /* OPTION */
 
188
  { TidyAttr_SHAPE,             "shape",             VERS_FROM32,       CH_SHAPE     }, /* AREA, A */
 
189
  { TidyAttr_SHOWGRID,          "showgrid",          VERS_PROPRIETARY,  CH_BOOL      }, /* TABLE Adobe golive */
 
190
  { TidyAttr_SHOWGRIDX,         "showgridx",         VERS_PROPRIETARY,  CH_BOOL      }, /* TABLE Adobe golive*/
 
191
  { TidyAttr_SHOWGRIDY,         "showgridy",         VERS_PROPRIETARY,  CH_BOOL      }, /* TABLE Adobe golive*/
 
192
  { TidyAttr_SIZE,              "size",              VERS_LOOSE,        CH_NUMBER    }, /* HR, FONT, BASEFONT, SELECT */
 
193
  { TidyAttr_SPAN,              "span",              VERS_HTML40,       CH_NUMBER    }, /* COL, COLGROUP */
 
194
  { TidyAttr_SRC,               "src",               VERS_ALL,          CH_URL       }, /* IMG, FRAME, IFRAME */
 
195
  { TidyAttr_STANDBY,           "standby",           VERS_HTML40,       CH_PCDATA    }, /* OBJECT */
 
196
  { TidyAttr_START,             "start",             VERS_ALL,          CH_NUMBER    }, /* OL */
 
197
  { TidyAttr_STYLE,             "style",             VERS_HTML40,       CH_PCDATA    }, 
 
198
  { TidyAttr_SUMMARY,           "summary",           VERS_HTML40,       CH_PCDATA    }, /* TABLE */
 
199
  { TidyAttr_TABINDEX,          "tabindex",          VERS_HTML40,       CH_NUMBER    }, /* fields, OBJECT  and A */
 
200
  { TidyAttr_TARGET,            "target",            VERS_HTML40,       CH_TARGET    }, /* names a frame/window */
 
201
  { TidyAttr_TEXT,              "text",              VERS_LOOSE,        CH_COLOR     }, /* BODY */
 
202
  { TidyAttr_TITLE,             "title",             VERS_HTML40,       CH_PCDATA    }, /* text tool tip */
 
203
  { TidyAttr_TOPMARGIN,         "topmargin",         VERS_MICROSOFT,    CH_NUMBER    }, /* used on BODY */
 
204
  { TidyAttr_TYPE,              "type",              VERS_FROM32,       CH_TYPE      }, /* also used by SPACER */
 
205
  { TidyAttr_USEMAP,            "usemap",            VERS_ALL,          CH_URL       }, /* things with images */
 
206
  { TidyAttr_VALIGN,            "valign",            VERS_FROM32,       CH_VALIGN    }, 
 
207
  { TidyAttr_VALUE,             "value",             VERS_ALL,          CH_PCDATA    }, 
 
208
  { TidyAttr_VALUETYPE,         "valuetype",         VERS_HTML40,       CH_VTYPE     }, /* PARAM: data, ref, object */
 
209
  { TidyAttr_VERSION,           "version",           VERS_ALL|VERS_XML, CH_PCDATA    }, /* HTML <?xml?> */
 
210
  { TidyAttr_VLINK,             "vlink",             VERS_LOOSE,        CH_COLOR     }, /* BODY */
 
211
  { TidyAttr_VSPACE,            "vspace",            VERS_LOOSE,        CH_NUMBER    }, /* IMG, OBJECT, APPLET */
 
212
  { TidyAttr_WIDTH,             "width",             VERS_ALL,          CH_LENGTH    }, /* pixels only for TD/TH */
 
213
  { TidyAttr_WRAP,              "wrap",              VERS_NETSCAPE,     CH_PCDATA    }, /* textarea */
 
214
  { TidyAttr_XML_LANG,          "xml:lang",          VERS_XML,          CH_LANG      }, /* XML language */
 
215
  { TidyAttr_XML_SPACE,         "xml:space",         VERS_XML,          CH_PCDATA    }, /* XML white space */
176
216
 
177
217
  /* todo: VERS_ALL is wrong! */
178
 
  { TidyAttr_XMLNS,             "xmlns",             VERS_ALL,          PCDATA    }, /* name space */
179
 
  { TidyAttr_EVENT,             "event",             VERS_HTML40,       PCDATA    }, /* reserved for <script> */
180
 
  { TidyAttr_METHODS,           "methods",           VERS_HTML20,       PCDATA    }, /* for <a>, never implemented */
181
 
  { TidyAttr_N,                 "n",                 VERS_HTML20,       PCDATA    }, /* for <nextid> */
182
 
  { TidyAttr_SDAFORM,           "sdaform",           VERS_HTML20,       PCDATA    }, /* SDATA attribute in HTML 2.0 */
183
 
  { TidyAttr_SDAPREF,           "sdapref",           VERS_HTML20,       PCDATA    }, /* SDATA attribute in HTML 2.0 */
184
 
  { TidyAttr_SDASUFF,           "sdasuff",           VERS_HTML20,       PCDATA    }, /* SDATA attribute in HTML 2.0 */
185
 
  { TidyAttr_URN,               "urn",               VERS_HTML20,       PCDATA    }, /* for <a>, never implemented */
 
218
  { TidyAttr_XMLNS,             "xmlns",             VERS_ALL,          CH_PCDATA    }, /* name space */
 
219
  { TidyAttr_EVENT,             "event",             VERS_HTML40,       CH_PCDATA    }, /* reserved for <script> */
 
220
  { TidyAttr_METHODS,           "methods",           VERS_HTML20,       CH_PCDATA    }, /* for <a>, never implemented */
 
221
  { TidyAttr_N,                 "n",                 VERS_HTML20,       CH_PCDATA    }, /* for <nextid> */
 
222
  { TidyAttr_SDAFORM,           "sdaform",           VERS_HTML20,       CH_PCDATA    }, /* SDATA attribute in HTML 2.0 */
 
223
  { TidyAttr_SDAPREF,           "sdapref",           VERS_HTML20,       CH_PCDATA    }, /* SDATA attribute in HTML 2.0 */
 
224
  { TidyAttr_SDASUFF,           "sdasuff",           VERS_HTML20,       CH_PCDATA    }, /* SDATA attribute in HTML 2.0 */
 
225
  { TidyAttr_URN,               "urn",               VERS_HTML20,       CH_PCDATA    }, /* for <a>, never implemented */
186
226
 
187
227
  /* this must be the final entry */
188
 
  { N_TIDY_ATTRIBS,             NULL,                VERS_UNKNOWN,      NULL      }
 
228
  { N_TIDY_ATTRIBS,             NULL,                VERS_UNKNOWN,      NULL         }
189
229
};
190
230
 
191
231
static uint AttributeVersions(Node* node, AttVal* attval)
575
615
 
576
616
Bool IsUrl( TidyDocImpl* doc, ctmbstr attrname )
577
617
{
578
 
    return CheckAttrType( doc, attrname, URL );
 
618
    return CheckAttrType( doc, attrname, CH_URL );
579
619
}
580
620
 
581
621
Bool IsBool( TidyDocImpl* doc, ctmbstr attrname )
582
622
{
583
 
    return CheckAttrType( doc, attrname, BOOL );
 
623
    return CheckAttrType( doc, attrname, CH_BOOL );
584
624
}
585
625
 
586
626
Bool IsScript( TidyDocImpl* doc, ctmbstr attrname )
587
627
{
588
 
    return CheckAttrType( doc, attrname, SCRIPT );
 
628
    return CheckAttrType( doc, attrname, CH_SCRIPT );
589
629
}
590
630
 
591
631
/* may id or name serve as anchor? */
720
760
{
721
761
    TidyAttribImpl* attribs = &doc->attribs;
722
762
    Anchor *found;
 
763
    tmbstr lname = tmbstrdup(name);
 
764
    lname = tmbstrtolower(lname);
 
765
 
723
766
    for ( found = attribs->anchor_list; found != NULL; found = found->next )
724
767
    {
725
 
        if ( tmbstrcmp(found->name, name) == 0 )
 
768
        if ( tmbstrcmp(found->name, lname) == 0 )
726
769
            break;
727
770
    }
728
771
    
 
772
    MemFree(lname);
729
773
    if ( found )
730
774
        return found->node;
731
775
    return NULL;
739
783
    while (NULL != (a = attribs->anchor_list) )
740
784
    {
741
785
        attribs->anchor_list = a->next;
742
 
        MemFree( a->name );
743
 
        MemFree( a );
 
786
        FreeAnchor(a);
744
787
    }
745
788
}
746
789
 
962
1005
Bool IsBoolAttribute(AttVal *attval)
963
1006
{
964
1007
    const Attribute *attribute = ( attval ? attval->dict : NULL );
965
 
    if ( attribute && attribute->attrchk == CheckBool )
 
1008
    if ( attribute && attribute->attrchk == CH_BOOL )
966
1009
        return yes;
967
1010
    return no;
968
1011
}
1096
1139
    }
1097
1140
}
1098
1141
 
 
1142
/* RFC 2396, section 4.2 states:
 
1143
     "[...] in the case of HTML's FORM element, [...] an
 
1144
     empty URI reference represents the base URI of the
 
1145
     current document and should be replaced by that URI
 
1146
     when transformed into a request."
 
1147
*/
 
1148
void CheckAction( TidyDocImpl* doc, Node *node, AttVal *attval)
 
1149
{
 
1150
    if (AttrHasValue(attval))
 
1151
        CheckUrl( doc, node, attval );
 
1152
}
 
1153
 
1099
1154
void CheckScript( TidyDocImpl* ARG_UNUSED(doc), Node* ARG_UNUSED(node),
1100
1155
                  AttVal* ARG_UNUSED(attval))
1101
1156
{
1174
1229
    return yes;
1175
1230
}
1176
1231
 
 
1232
static Bool AttrValueIsAmong(AttVal *attval, ctmbstr const list[])
 
1233
{
 
1234
    const ctmbstr *v;   
 
1235
    for (v = list; *v; ++v)
 
1236
        if (AttrValueIs(attval, *v))
 
1237
            return yes;
 
1238
    return no;
 
1239
}
 
1240
 
 
1241
static void CheckAttrValidity( TidyDocImpl* doc, Node *node, AttVal *attval,
 
1242
                               ctmbstr const list[])
 
1243
{
 
1244
    if (!AttrHasValue(attval))
 
1245
    {
 
1246
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
 
1247
        return;
 
1248
    }
 
1249
 
 
1250
    CheckLowerCaseAttrValue( doc, node, attval );
 
1251
 
 
1252
    if (!AttrValueIsAmong(attval, list))
 
1253
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1254
}
 
1255
 
1177
1256
void CheckName( TidyDocImpl* doc, Node *node, AttVal *attval)
1178
1257
{
1179
1258
    Node *old;
1235
1314
 
1236
1315
void CheckAlign( TidyDocImpl* doc, Node *node, AttVal *attval)
1237
1316
{
 
1317
    ctmbstr const values[] = {"left", "right", "center", "justify", NULL};
 
1318
 
1238
1319
    /* IMG, OBJECT, APPLET and EMBED use align for vertical position */
1239
1320
    if (node->tag && (node->tag->model & CM_IMG))
1240
1321
    {
1254
1335
    if (nodeIsCAPTION(node))
1255
1336
        return;
1256
1337
 
1257
 
    if (!(AttrValueIs(attval, "left")   ||
1258
 
          AttrValueIs(attval, "right")  ||
1259
 
          AttrValueIs(attval, "center") ||
1260
 
          AttrValueIs(attval, "justify")))
 
1338
    if (!AttrValueIsAmong(attval, values))
1261
1339
    {
1262
1340
        /* align="char" is allowed for elements with CM_TABLE|CM_ROW
1263
1341
           except CAPTION which is excluded above, */
1269
1347
 
1270
1348
void CheckValign( TidyDocImpl* doc, Node *node, AttVal *attval)
1271
1349
{
 
1350
    ctmbstr const values[] = {"top", "middle", "bottom", "baseline", NULL};
 
1351
    ctmbstr const values2[] = {"left", "right", NULL};
 
1352
    ctmbstr const valuesp[] = {"texttop", "absmiddle", "absbottom",
 
1353
                               "textbottom", NULL};
 
1354
 
1272
1355
    if (!AttrHasValue(attval))
1273
1356
    {
1274
1357
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1277
1360
 
1278
1361
    CheckLowerCaseAttrValue( doc, node, attval );
1279
1362
 
1280
 
    if (AttrValueIs(attval, "top")    ||
1281
 
        AttrValueIs(attval, "middle") ||
1282
 
        AttrValueIs(attval, "bottom") ||
1283
 
        AttrValueIs(attval, "baseline"))
 
1363
    if (AttrValueIsAmong(attval, values))
1284
1364
    {
1285
1365
            /* all is fine */
1286
1366
    }
1287
 
    else if (AttrValueIs(attval, "left") ||
1288
 
             AttrValueIs(attval, "right"))
 
1367
    else if (AttrValueIsAmong(attval, values2))
1289
1368
    {
1290
1369
        if (!(node->tag && (node->tag->model & CM_IMG)))
1291
1370
            ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
1292
1371
    }
1293
 
    else if (AttrValueIs(attval, "texttop")   ||
1294
 
             AttrValueIs(attval, "absmiddle") ||
1295
 
             AttrValueIs(attval, "absbottom") ||
1296
 
             AttrValueIs(attval, "textbottom"))
 
1372
    else if (AttrValueIsAmong(attval, valuesp))
1297
1373
    {
1298
1374
        ConstrainVersion( doc, VERS_PROPRIETARY );
1299
1375
        ReportAttrError( doc, node, attval, PROPRIETARY_ATTR_VALUE);
1338
1414
 
1339
1415
void CheckTarget( TidyDocImpl* doc, Node *node, AttVal *attval)
1340
1416
{
 
1417
    ctmbstr const values[] = {"_blank", "_self", "_parent", "_top", NULL};
 
1418
 
1341
1419
    if (!AttrHasValue(attval))
1342
1420
    {
1343
1421
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1348
1426
    if (IsLetter(attval->value[0]))
1349
1427
        return;
1350
1428
 
1351
 
    /* or be one of _blank, _self, _parent and _top */
1352
 
    if (!(AttrValueIs(attval, "_blank")  ||
1353
 
          AttrValueIs(attval, "_self")   ||
1354
 
          AttrValueIs(attval, "_parent") ||
1355
 
          AttrValueIs(attval, "_top")))
 
1429
    /* or be one of the allowed list */
 
1430
    if (!AttrValueIsAmong(attval, values))
1356
1431
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
1357
1432
}
1358
1433
 
1359
1434
void CheckFsubmit( TidyDocImpl* doc, Node *node, AttVal *attval)
1360
1435
{
1361
 
    if (!AttrHasValue(attval))
1362
 
    {
1363
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1364
 
        return;
1365
 
    }
1366
 
 
1367
 
    CheckLowerCaseAttrValue( doc, node, attval);
1368
 
 
1369
 
    if (!(AttrValueIs(attval, "get") ||
1370
 
          AttrValueIs(attval, "post")))
1371
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1436
    ctmbstr const values[] = {"get", "post", NULL};
 
1437
    CheckAttrValidity( doc, node, attval, values );
1372
1438
}
1373
1439
 
1374
1440
void CheckClear( TidyDocImpl* doc, Node *node, AttVal *attval)
1375
1441
{
 
1442
    ctmbstr const values[] = {"none", "left", "right", "all", NULL};
 
1443
 
1376
1444
    if (!AttrHasValue(attval))
1377
1445
    {
1378
1446
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1383
1451
 
1384
1452
    CheckLowerCaseAttrValue( doc, node, attval );
1385
1453
        
1386
 
    if (!(AttrValueIs(attval, "none")  ||
1387
 
          AttrValueIs(attval, "left")  ||
1388
 
          AttrValueIs(attval, "right") ||
1389
 
          AttrValueIs(attval, "all")))
 
1454
    if (!AttrValueIsAmong(attval, values))
1390
1455
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
1391
1456
}
1392
1457
 
1393
1458
void CheckShape( TidyDocImpl* doc, Node *node, AttVal *attval)
1394
1459
{
1395
 
    if (!AttrHasValue(attval))
1396
 
    {
1397
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1398
 
        return;
1399
 
    }
1400
 
 
1401
 
    CheckLowerCaseAttrValue( doc, node, attval );
1402
 
 
1403
 
    if (!(AttrValueIs(attval, "rect")    ||
1404
 
          AttrValueIs(attval, "default") ||
1405
 
          AttrValueIs(attval, "circle")  ||
1406
 
          AttrValueIs(attval, "poly")))
1407
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1460
    ctmbstr const values[] = {"rect", "default", "circle", "poly", NULL};
 
1461
    CheckAttrValidity( doc, node, attval, values );
1408
1462
}
1409
1463
 
1410
1464
void CheckScope( TidyDocImpl* doc, Node *node, AttVal *attval)
1411
1465
{
1412
 
    if (!AttrHasValue(attval))
1413
 
    {
1414
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1415
 
        return;
1416
 
    }
1417
 
 
1418
 
    CheckLowerCaseAttrValue( doc, node, attval);
1419
 
 
1420
 
    if (!(AttrValueIs(attval, "row")      ||
1421
 
          AttrValueIs(attval, "rowgroup") ||
1422
 
          AttrValueIs(attval, "col")      ||
1423
 
          AttrValueIs(attval, "colgroup")))
1424
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1466
    ctmbstr const values[] = {"row", "rowgroup", "col", "colgroup", NULL};
 
1467
    CheckAttrValidity( doc, node, attval, values );
1425
1468
}
1426
1469
 
1427
1470
void CheckNumber( TidyDocImpl* doc, Node *node, AttVal *attval)
1532
1575
/* check valuetype attribute for element param */
1533
1576
void CheckVType( TidyDocImpl* doc, Node *node, AttVal *attval)
1534
1577
{
1535
 
    if (!AttrHasValue(attval))
1536
 
    {
1537
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1538
 
        return;
1539
 
    }
1540
 
 
1541
 
    CheckLowerCaseAttrValue( doc, node, attval );
1542
 
 
1543
 
    if (!(AttrValueIs(attval, "data")   ||
1544
 
          AttrValueIs(attval, "object") ||
1545
 
          AttrValueIs(attval, "ref")))
1546
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1578
    ctmbstr const values[] = {"data", "object", "ref", NULL};
 
1579
    CheckAttrValidity( doc, node, attval, values );
1547
1580
}
1548
1581
 
1549
1582
/* checks scrolling attribute */
1550
1583
void CheckScroll( TidyDocImpl* doc, Node *node, AttVal *attval)
1551
1584
{
1552
 
    if (!AttrHasValue(attval))
1553
 
    {
1554
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1555
 
        return;
1556
 
    }
1557
 
 
1558
 
    CheckLowerCaseAttrValue( doc, node, attval );
1559
 
 
1560
 
    if (!(AttrValueIs(attval, "no")   ||
1561
 
          AttrValueIs(attval, "auto") ||
1562
 
          AttrValueIs(attval, "yes")))
1563
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1585
    ctmbstr const values[] = {"no", "auto", "yes", NULL};
 
1586
    CheckAttrValidity( doc, node, attval, values );
1564
1587
}
1565
1588
 
1566
1589
/* checks dir attribute */
1567
1590
void CheckTextDir( TidyDocImpl* doc, Node *node, AttVal *attval)
1568
1591
{
1569
 
    if (!AttrHasValue(attval))
1570
 
    {
1571
 
        ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
1572
 
        return;
1573
 
    }
1574
 
 
1575
 
    CheckLowerCaseAttrValue( doc, node, attval);
1576
 
 
1577
 
    if (!(AttrValueIs(attval, "rtl") ||
1578
 
          AttrValueIs(attval, "ltr")))
1579
 
        ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1592
    ctmbstr const values[] = {"rtl", "ltr", NULL};
 
1593
    CheckAttrValidity( doc, node, attval, values );
1580
1594
}
1581
1595
 
1582
1596
/* checks lang and xml:lang attributes */
1592
1606
        return;
1593
1607
    }
1594
1608
}
 
1609
 
 
1610
/* checks type attribute */
 
1611
void CheckType( TidyDocImpl* doc, Node *node, AttVal *attval)
 
1612
{
 
1613
    ctmbstr const valuesINPUT[] = {"text", "password", "checkbox", "radio",
 
1614
                                   "submit", "reset", "file", "hidden",
 
1615
                                   "image", "button", NULL};
 
1616
    ctmbstr const valuesBUTTON[] = {"button", "submit", "reset", NULL};
 
1617
    ctmbstr const valuesUL[] = {"disc", "square", "circle", NULL};
 
1618
    ctmbstr const valuesOL[] = {"1", "a", "i", NULL};
 
1619
 
 
1620
    if (nodeIsINPUT(node))
 
1621
        CheckAttrValidity( doc, node, attval, valuesINPUT );
 
1622
    else if (nodeIsBUTTON(node))
 
1623
        CheckAttrValidity( doc, node, attval, valuesBUTTON );
 
1624
    else if (nodeIsUL(node))
 
1625
        CheckAttrValidity( doc, node, attval, valuesUL );
 
1626
    else if (nodeIsOL(node))
 
1627
    {
 
1628
        if (!AttrHasValue(attval))
 
1629
        {
 
1630
            ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
 
1631
            return;
 
1632
        }
 
1633
        if (!AttrValueIsAmong(attval, valuesOL))
 
1634
            ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1635
    }
 
1636
    else if (nodeIsLI(node))
 
1637
    {
 
1638
        if (!AttrHasValue(attval))
 
1639
        {
 
1640
            ReportAttrError( doc, node, attval, MISSING_ATTR_VALUE);
 
1641
            return;
 
1642
        }
 
1643
        if (AttrValueIsAmong(attval, valuesUL))
 
1644
            CheckLowerCaseAttrValue( doc, node, attval );
 
1645
        else if (!AttrValueIsAmong(attval, valuesOL))
 
1646
            ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE);
 
1647
    }
 
1648
    return;
 
1649
}
 
1650
 
 
1651
/*
 
1652
 * local variables:
 
1653
 * mode: c
 
1654
 * indent-tabs-mode: nil
 
1655
 * c-basic-offset: 4
 
1656
 * eval: (c-set-offset 'substatement-open 0)
 
1657
 * end:
 
1658
 */