📄 attrs.c
字号:
/* attrs.c -- recognize HTML attributes (c) 1998-2000 (W3C) MIT, INRIA, Keio University See tidy.c for the copyright notice.*/#include "platform.h" /* platform independent stuff */#include "html.h" /* to pull in definition of nodes */Attribute *attr_href;Attribute *attr_src;Attribute *attr_id;Attribute *attr_name;Attribute *attr_summary;Attribute *attr_alt;Attribute *attr_longdesc;Attribute *attr_usemap;Attribute *attr_ismap;Attribute *attr_language;Attribute *attr_type;Attribute *attr_value;Attribute *attr_content;Attribute *attr_title;Attribute *attr_xmlns;AttrCheck CheckUrl;AttrCheck CheckScript;AttrCheck CheckName;AttrCheck CheckId;AttrCheck CheckAlign;AttrCheck CheckValign;AttrCheck CheckBool;extern Bool XmlTags;extern Bool XmlOut;extern char *alt_text;#define HASHSIZE 101static Attribute *hashtab[HASHSIZE];/* Bind attribute types to procedures to check values. You can add new procedures for better validation and each procedure has access to the node in which the attribute occurred as well as the attribute name and its value. By default, attributes are checked without regard to the element they are found on. You have the choice of making the procedure test which element is involved or in writing methods for each element which controls exactly how the attributes of that element are checked. This latter approach is best for detecting the absence of required attributes.*/#define TEXT null#define CHARSET null#define TYPE null#define CHARACTER null#define URLS null#define URL CheckUrl#define SCRIPT CheckScript#define ALIGN CheckAlign#define VALIGN CheckValign#define COLOR null#define CLEAR null#define BORDER CheckBool /* kludge */#define LENGTH null#define CHARSET null#define LANG null#define BOOL CheckBool#define COLS null#define NUMBER null#define LENGTH null#define COORDS null#define DATE null#define TEXTDIR null#define IDREFS null#define IDREF null#define IDDEF CheckId#define NAME CheckName#define TFRAME null#define FBORDER null#define MEDIA null#define FSUBMIT null#define LINKTYPES null#define TRULES null#define SCOPE null#define SHAPE null#define SCROLL null#define TARGET null#define VTYPE nullstatic struct _attrlist{ char *name; unsigned versions; AttrCheck *attrchk;} attrlist[] ={ {"abbr", VERS_HTML40, TEXT}, {"accept-charset", VERS_HTML40, CHARSET}, {"accept", VERS_ALL, TYPE}, {"accesskey", VERS_HTML40, CHARACTER}, {"action", VERS_ALL, URL}, {"add_date", VERS_NETSCAPE, TEXT}, /* A */ {"align", VERS_ALL, ALIGN}, /* set varies with element */ {"alink", VERS_LOOSE, COLOR}, {"alt", VERS_ALL, TEXT}, {"archive", VERS_HTML40, URLS}, /* space or comma separated list */ {"axis", VERS_HTML40, TEXT}, {"background", VERS_LOOSE, URL}, {"bgcolor", VERS_LOOSE, COLOR}, {"bgproperties", VERS_PROPRIETARY, TEXT}, /* BODY "fixed" fixes background */ {"border", VERS_ALL, BORDER}, /* like LENGTH + "border" */ {"bottommargin", VERS_MICROSOFT, NUMBER}, /* used on BODY */ {"cellpadding", VERS_FROM32, LENGTH}, /* % or pixel values */ {"cellspacing", VERS_FROM32, LENGTH}, {"charoff", VERS_HTML40, LENGTH}, {"charset", VERS_HTML40, CHARSET}, {"checked", VERS_ALL, BOOL}, /* i.e. "checked" or absent */ {"cite", VERS_HTML40, URL}, {"class", VERS_HTML40, TEXT}, {"classid", VERS_HTML40, URL}, {"clear", VERS_LOOSE, CLEAR}, /* BR: left, right, all */ {"code", VERS_LOOSE, TEXT}, /* APPLET */ {"codebase", VERS_HTML40, URL}, /* OBJECT */ {"codetype", VERS_HTML40, TYPE}, /* OBJECT */ {"color", VERS_LOOSE, COLOR}, /* BASEFONT, FONT */ {"cols", VERS_IFRAMES, COLS}, /* TABLE & FRAMESET */ {"colspan", VERS_FROM32, NUMBER}, {"compact", VERS_ALL, BOOL}, /* lists */ {"content", VERS_ALL, TEXT}, /* META */ {"coords", VERS_FROM32, COORDS}, /* AREA, A */ {"data", VERS_HTML40, URL}, /* OBJECT */ {"datetime", VERS_HTML40, DATE}, /* INS, DEL */ {"declare", VERS_HTML40, BOOL}, /* OBJECT */ {"defer", VERS_HTML40, BOOL}, /* SCRIPT */ {"dir", VERS_HTML40, TEXTDIR}, /* ltr or rtl */ {"disabled", VERS_HTML40, BOOL}, /* form fields */ {"enctype", VERS_ALL, TYPE}, /* FORM */ {"face", VERS_LOOSE, TEXT}, /* BASEFONT, FONT */ {"for", VERS_HTML40, IDREF}, /* LABEL */ {"frame", VERS_HTML40, TFRAME}, /* TABLE */ {"frameborder", VERS_FRAMES, FBORDER}, /* 0 or 1 */ {"framespacing", VERS_PROPRIETARY, NUMBER}, /* pixel value */ {"headers", VERS_HTML40, IDREFS}, /* table cells */ {"height", VERS_ALL, LENGTH}, /* pixels only for TH/TD */ {"href", VERS_ALL, URL}, /* A, AREA, LINK and BASE */ {"hreflang", VERS_HTML40, LANG}, /* A, LINK */ {"hspace", VERS_ALL, NUMBER}, /* APPLET, IMG, OBJECT */ {"http-equiv", VERS_ALL, TEXT}, /* META */ {"id", VERS_HTML40, IDDEF}, {"ismap", VERS_ALL, BOOL}, /* IMG */ {"label", VERS_HTML40, TEXT}, /* OPT, OPTGROUP */ {"lang", VERS_HTML40, LANG}, {"language", VERS_LOOSE, TEXT}, /* SCRIPT */ {"last_modified", VERS_NETSCAPE, TEXT}, /* A */ {"last_visit", VERS_NETSCAPE, TEXT}, /* A */ {"leftmargin", VERS_MICROSOFT, NUMBER}, /* used on BODY */ {"link", VERS_LOOSE, COLOR}, /* BODY */ {"longdesc", VERS_HTML40, URL}, /* IMG */ {"lowsrc", VERS_PROPRIETARY, URL}, /* IMG */ {"marginheight", VERS_IFRAMES, NUMBER}, /* FRAME, IFRAME, BODY */ {"marginwidth", VERS_IFRAMES, NUMBER}, /* ditto */ {"maxlength", VERS_ALL, NUMBER}, /* INPUT */ {"media", VERS_HTML40, MEDIA}, /* STYLE, LINK */ {"method", VERS_ALL, FSUBMIT}, /* FORM: get or post */ {"multiple", VERS_ALL, BOOL}, /* SELECT */ {"name", VERS_ALL, NAME}, {"nohref", VERS_FROM32, BOOL}, /* AREA */ {"noresize", VERS_FRAMES, BOOL}, /* FRAME */ {"noshade", VERS_LOOSE, BOOL}, /* HR */ {"nowrap", VERS_LOOSE, BOOL}, /* table cells */ {"object", VERS_HTML40_LOOSE, TEXT}, /* APPLET */ {"onblur", VERS_HTML40, SCRIPT}, /* event */ {"onchange", VERS_HTML40, SCRIPT}, /* event */ {"onclick", VERS_HTML40, SCRIPT}, /* event */ {"ondblclick", VERS_HTML40, SCRIPT}, /* event */ {"onkeydown", VERS_HTML40, SCRIPT}, /* event */ {"onkeypress", VERS_HTML40, SCRIPT}, /* event */ {"onkeyup", VERS_HTML40, SCRIPT}, /* event */ {"onload", VERS_HTML40, SCRIPT}, /* event */ {"onmousedown", VERS_HTML40, SCRIPT}, /* event */ {"onmousemove", VERS_HTML40, SCRIPT}, /* event */ {"onmouseout", VERS_HTML40, SCRIPT}, /* event */ {"onmouseover", VERS_HTML40, SCRIPT}, /* event */ {"onmouseup", VERS_HTML40, SCRIPT}, /* event */ {"onsubmit", VERS_HTML40, SCRIPT}, /* event */ {"onreset", VERS_HTML40, SCRIPT}, /* event */ {"onselect", VERS_HTML40, SCRIPT}, /* event */ {"onunload", VERS_HTML40, SCRIPT}, /* event */ {"profile", VERS_HTML40, URL}, /* HEAD */ {"prompt", VERS_LOOSE, TEXT}, /* ISINDEX */ {"readonly", VERS_HTML40, BOOL}, /* form fields */ {"rel", VERS_ALL, LINKTYPES}, /* A, LINK */ {"rev", VERS_ALL, LINKTYPES}, /* A, LINK */ {"rightmargin", VERS_MICROSOFT, NUMBER}, /* used on BODY */ {"rows", VERS_ALL, NUMBER}, /* TEXTAREA */ {"rowspan", VERS_ALL, NUMBER}, /* table cells */ {"rules", VERS_HTML40, TRULES}, /* TABLE */ {"scheme", VERS_HTML40, TEXT}, /* META */ {"scope", VERS_HTML40, SCOPE}, /* table cells */ {"scrolling", VERS_IFRAMES, SCROLL}, /* yes, no or auto */ {"selected", VERS_ALL, BOOL}, /* OPTION */ {"shape", VERS_FROM32, SHAPE}, /* AREA, A */ {"size", VERS_LOOSE, NUMBER}, /* HR, FONT, BASEFONT, SELECT */ {"span", VERS_HTML40, NUMBER}, /* COL, COLGROUP */ {"src", (VERS_ALL|VERS_FRAMES), URL}, /* IMG, FRAME, IFRAME */ {"standby", VERS_HTML40, TEXT}, /* OBJECT */ {"start", VERS_ALL, NUMBER}, /* OL */ {"style", VERS_HTML40, TEXT}, {"summary", VERS_HTML40, TEXT}, /* TABLE */ {"tabindex", VERS_HTML40, NUMBER}, /* fields, OBJECT and A */ {"target", VERS_HTML40, TARGET}, /* names a frame/window */ {"text", VERS_LOOSE, COLOR}, /* BODY */ {"title", VERS_HTML40, TEXT}, /* text tool tip */ {"topmargin", VERS_MICROSOFT, NUMBER}, /* used on BODY */ {"type", VERS_FROM32, TYPE}, {"usemap", VERS_ALL, BOOL}, /* things with images */ {"valign", VERS_FROM32, VALIGN}, {"value", VERS_ALL, TEXT}, /* OPTION, PARAM */ {"valuetype", VERS_HTML40, VTYPE}, /* PARAM: data, ref, object */ {"version", VERS_ALL, TEXT}, /* HTML */ {"vlink", VERS_LOOSE, COLOR}, /* BODY */ {"vspace", VERS_LOOSE, NUMBER}, /* IMG, OBJECT, APPLET */ {"width", VERS_ALL, LENGTH}, /* pixels only for TD/TH */ {"xml:lang", VERS_XML, TEXT}, /* XML language */ {"xmlns", VERS_ALL, TEXT}, /* name space */ /* this must be the final entry */ {null, 0, 0}};static unsigned hash(char *s){ unsigned hashval; for (hashval = 0; *s != '\0'; s++) hashval = *s + 31*hashval; return hashval % HASHSIZE;}static Attribute *lookup(char *s){ Attribute *np; for (np = hashtab[hash(s)]; np != null; np = np->next) if (wstrcmp(s, np->name) == 0) return np; return null;}static Attribute *install(char *name, uint versions, AttrCheck *attrchk){ Attribute *np; unsigned hashval; if ((np = lookup(name)) == null) { np = (Attribute *)MemAlloc(sizeof(*np)); if (np == null || (np->name = wstrdup(name)) == null) return null; hashval = hash(name); np->next = hashtab[hashval]; hashtab[hashval] = np; } np->versions = versions; np->attrchk = attrchk; np->nowrap = no; return np;}void SetNoWrap(Attribute *attr){ attr->nowrap = yes; /* defaults to no */}/* public method for finding attribute definition by name */Attribute *FindAttribute(AttVal *attval){ Attribute *np; if (attval->attribute && (np = lookup(attval->attribute))) return np; return null;}AttVal *GetAttrByName(Node *node, char *name){ AttVal *attr; for (attr = node->attributes; attr; attr = attr->next) { if (wstrcmp(attr->attribute, name) == 0) break; } return attr;}void AddAttribute(Node *node, char *name, char *value){ AttVal *av = NewAttribute(); av->delim = '"'; av->attribute = wstrdup(name); av->value = wstrdup(value); av->dict = FindAttribute(av); if (node->attributes == null) node->attributes = av; else /* append to end of attributes */ { AttVal *here = node->attributes; while (here->next) here = here->next; here->next = av; }}Bool IsUrl(char *attrname){ Attribute *np; return (Bool)((np = lookup(attrname)) && np->attrchk == URL);}Bool IsScript(char *attrname){ Attribute *np; return (Bool)((np = lookup(attrname)) && np->attrchk == SCRIPT);}/* public method for inititializing attribute dictionary */void InitAttrs(void){ struct _attrlist *ap; for(ap = attrlist; ap->name != null; ++ap) install(ap->name, ap->versions, ap->attrchk); attr_href = lookup("href"); attr_src = lookup("src"); attr_id = lookup("id"); attr_name = lookup("name"); attr_summary = lookup("summary"); attr_alt = lookup("alt"); attr_longdesc = lookup("longdesc"); attr_usemap = lookup("usemap"); attr_ismap = lookup("ismap"); attr_language = lookup("language"); attr_type = lookup("type"); attr_title = lookup("title"); attr_xmlns = lookup("xmlns"); attr_value = lookup("value"); attr_content = lookup("content"); SetNoWrap(attr_alt); SetNoWrap(attr_value); SetNoWrap(attr_content);}void FreeAttrTable(void){ Attribute *dict, *next; int i; for (i = 0; i < HASHSIZE; ++i)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -