1 5 6 package org.w3c.tidy; 7 8 33 34 public class AttVal extends Object implements Cloneable { 35 36 public AttVal next; 37 public Attribute dict; 38 public Node asp; 39 public Node php; 40 public int delim; 41 public String attribute; 42 public String value; 43 44 public AttVal() 45 { 46 this.next = null; 47 this.dict = null; 48 this.asp = null; 49 this.php = null; 50 this.delim = 0; 51 this.attribute = null; 52 this.value = null; 53 } 54 55 public AttVal(AttVal next, Attribute dict, int delim, 56 String attribute, String value) 57 { 58 this.next = next; 59 this.dict = dict; 60 this.asp = null; 61 this.php = null; 62 this.delim = delim; 63 this.attribute = attribute; 64 this.value = value; 65 } 66 67 public AttVal(AttVal next, Attribute dict, Node asp, Node php, 68 int delim, String attribute, String value) 69 { 70 this.next = next; 71 this.dict = dict; 72 this.asp = asp; 73 this.php = php; 74 this.delim = delim; 75 this.attribute = attribute; 76 this.value = value; 77 } 78 79 protected Object clone() 80 { 81 AttVal av = new AttVal(); 82 if (next != null) { 83 av.next = (AttVal)next.clone(); 84 } 85 if (attribute != null) 86 av.attribute = attribute; 87 if (value != null) 88 av.value = value; 89 av.delim = delim; 90 if (asp != null) { 91 av.asp = (Node)asp.clone(); 92 } 93 if (php != null) { 94 av.php = (Node)php.clone(); 95 } 96 av.dict = 97 AttributeTable.getDefaultAttributeTable().findAttribute(this); 98 return av; 99 } 100 101 public boolean isBoolAttribute() 102 { 103 Attribute attribute = this.dict; 104 if ( attribute != null ) { 105 if (attribute.attrchk == AttrCheckImpl.getCheckBool() ) { 106 return true; 107 } 108 } 109 110 return false; 111 } 112 113 114 public Attribute checkAttribute( Lexer lexer, Node node ) 115 { 116 TagTable tt = lexer.configuration.tt; 117 118 if (this.asp == null && this.php == null) 119 this.checkUniqueAttribute(lexer, node); 120 121 Attribute attribute = this.dict; 122 if ( attribute != null ) { 123 124 if (attribute == AttributeTable.attrTitle && 125 (node.tag == tt.tagA || node.tag == tt.tagLink)) 126 lexer.versions &= Dict.VERS_ALL; 127 else if ((attribute.versions & Dict.VERS_XML) != 0) 128 { 129 if (!(lexer.configuration.XmlTags || lexer.configuration.XmlOut)) 130 Report.attrError(lexer, node, this.attribute, Report.XML_ATTRIBUTE_VALUE); 131 } 132 else 133 lexer.versions &= attribute.versions; 134 135 if (attribute.attrchk != null) 136 attribute.attrchk.check(lexer, node, this); 137 } 138 else if (!lexer.configuration.XmlTags && !(node.tag == null) && this.asp == null && 139 !(node.tag != null && ((node.tag.versions & Dict.VERS_PROPRIETARY) != 0))) 140 Report.attrError(lexer, node, this.attribute, Report.UNKNOWN_ATTRIBUTE); 141 142 return attribute; 143 } 144 145 149 public void checkUniqueAttribute(Lexer lexer, Node node) 150 { 151 AttVal attr; 152 int count = 0; 153 154 for (attr = this.next; attr != null; attr = attr.next) 155 { 156 if (this.attribute != null && 157 attr.attribute != null && 158 attr.asp == null && 159 attr.php == null && 160 Lexer.wstrcasecmp(this.attribute, attr.attribute) == 0) 161 ++count; 162 } 163 164 if (count > 0) 165 Report.attrError(lexer, node, this.attribute, Report.REPEATED_ATTRIBUTE); 166 } 167 168 169 170 protected org.w3c.dom.Attr adapter = null; 171 172 protected org.w3c.dom.Attr getAdapter() 173 { 174 if (adapter == null) 175 { 176 adapter = new DOMAttrImpl(this); 177 } 178 return adapter; 179 } 180 181 182 } 183 | Popular Tags |