001package com.hfg.html; 002 003import java.lang.reflect.Constructor; 004import java.util.HashMap; 005import java.util.Map; 006 007import com.hfg.util.StringUtil; 008import com.hfg.xml.XMLNode; 009 010//------------------------------------------------------------------------------ 011/** 012 * Represents an html (<html>) tag and also contains tag name constants. 013 * 014 * @author J. Alex Taylor, hairyfatguy.com 015 */ 016//------------------------------------------------------------------------------ 017// com.hfg XML/HTML Coding Library 018// 019// This library is free software; you can redistribute it and/or 020// modify it under the terms of the GNU Lesser General Public 021// License as published by the Free Software Foundation; either 022// version 2.1 of the License, or (at your option) any later version. 023// 024// This library is distributed in the hope that it will be useful, 025// but WITHOUT ANY WARRANTY; without even the implied warranty of 026// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 027// Lesser General Public License for more details. 028// 029// You should have received a copy of the GNU Lesser General Public 030// License along with this library; if not, write to the Free Software 031// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 032// 033// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com 034// jataylor@hairyfatguy.com 035//------------------------------------------------------------------------------ 036 037public class HTML extends HTMLTag 038{ 039 //########################################################################### 040 // PUBLIC FIELDS 041 //########################################################################### 042 043 // Tag names 044 public static final String A = "a"; 045 public static final String ADDRESS = "address"; 046 public static final String APPLET = "applet"; 047 public static final String AREA = "area"; 048 public static final String B = "b"; 049 public static final String BODY = "body"; 050 public static final String BR = "br"; 051 public static final String CAPTION = "caption"; 052 public static final String CENTER = "center"; 053 public static final String CHAR = "char"; 054 public static final String CHAROFF = "charoff"; 055 public static final String COL = "col"; 056 public static final String COLGROUP = "colgroup"; 057 public static final String DATA = "data"; 058 public static final String DISABLED = "disabled"; 059 public static final String DIV = "div"; 060 public static final String EM = "em"; 061 public static final String FORM = "form"; 062 public static final String FRAME = "frame"; 063 public static final String FRAMESET = "frameset"; 064 public static final String H1 = "h1"; 065 public static final String H2 = "h2"; 066 public static final String H3 = "h3"; 067 public static final String HEAD = "head"; 068 public static final String HR = "hr"; 069 public static final String HTML = "html"; 070 public static final String IFRAME = "iframe"; 071 public static final String IMG = "img"; 072 public static final String INPUT = "input"; 073 public static final String LABEL = "label"; 074 public static final String LI = "li"; 075 public static final String LINK = "link"; 076 public static final String MAP = "map"; 077 public static final String META = "meta"; 078 public static final String NOBR = "nobr"; 079 public static final String OBJECT = "object"; 080 public static final String OL = "ol"; 081 public static final String OPTGROUP = "optgroup"; 082 public static final String OPTION = "option"; 083 public static final String P = "p"; 084 public static final String PRE = "pre"; 085 public static final String S = "s"; 086 public static final String SCRIPT = "script"; 087 public static final String SELECT = "select"; 088 public static final String SPAN = "span"; 089 public static final String STRONG = "strong"; 090 public static final String STYLE = "style"; 091 public static final String TABLE = "table"; 092 public static final String TBODY = "tbody"; 093 public static final String TD = "td"; 094 public static final String TEXTAREA = "textarea"; 095 public static final String TFOOT = "tfoot"; 096 public static final String TH = "th"; 097 public static final String THEAD = "thead"; 098 public static final String TITLE = "title"; 099 public static final String TR = "tr"; 100 public static final String U = "u"; 101 public static final String UL = "ul"; 102 103 // Attribute names 104 public static final String ACTION = "action"; 105 public static final String ALIGN = "align"; 106 public static final String ALT = "alt"; 107 public static final String ARCHIVE = "archive"; 108 public static final String BACKGROUND = "background"; 109 public static final String BGCOLOR = "bgcolor"; 110 public static final String BORDER = "border"; 111 public static final String CELLPADDING = "cellpadding"; 112 public static final String CELLSPACING = "cellspacing"; 113 public static final String CHARSET = "charset"; 114 public static final String CLASS = "class"; 115 public static final String CLASSID = "classid"; 116 public static final String CODE = "code"; 117 public static final String CODEBASE = "codebase"; 118 public static final String CODETYPE = "codetype"; 119 public static final String COLS = "cols"; 120 public static final String COLSPAN = "colspan"; 121 public static final String CONTENT = "content"; 122 public static final String COORDS = "coords"; 123 public static final String DECLARE = "declare"; 124 public static final String DEFER = "defer"; 125 public static final String DRAGGABLE = "draggable"; // HTML5 126 public static final String ENCTYPE = "enctype"; 127 public static final String FOR = "for"; 128 public static final String FRAMEBORDER = "frameborder"; 129 public static final String FRAMESPACING = "framespacing"; 130 public static final String HEIGHT = "height"; 131 public static final String HREF = "href"; 132 public static final String HSPACE = "hspace"; 133 public static final String HTTP_EQUIV = "http-equiv"; 134 public static final String ID = "id"; 135 public static final String LANGUAGE = "language"; 136 public static final String MAX_LENGTH = "maxlength"; 137 public static final String MAYSCRIPT = "mayscript"; 138 public static final String METHOD = "method"; 139 public static final String MULTIPLE = "multiple"; 140 public static final String NAME = "name"; 141 public static final String ONBLUR = "onblur"; 142 public static final String ONCHANGE = "onchange"; 143 public static final String ONCLICK = "onclick"; 144 public static final String ONDBLCLICK = "ondblclick"; 145 public static final String ONDRAG = "ondrag"; // HTML5 146 public static final String ONDRAGEND = "ondragend"; // HTML5 147 public static final String ONDRAGENTER = "ondragenter"; // HTML5 148 public static final String ONDRAGLEAVE = "ondragleave"; // HTML5 149 public static final String ONDRAGOVER = "ondragover"; // HTML5 150 public static final String ONDRAGSTART = "ondragstart"; // HTML5 151 public static final String ONDROP = "ondrop"; // HTML5 152 public static final String ONFOCUS = "onfocus"; 153 public static final String ONKEYDOWN = "onkeydown"; 154 public static final String ONKEYPRESS = "onkeypress"; 155 public static final String ONKEYUP = "onkeyup"; 156 public static final String ONLOAD = "onload"; 157 public static final String ONMOUSEDOWN = "onmousedown"; 158 public static final String ONMOUSEMOVE = "onmousemove"; 159 public static final String ONMOUSEOVER = "onmouseover"; 160 public static final String ONMOUSEOUT = "onmouseout"; 161 public static final String ONMOUSEUP = "onmouseup"; 162 public static final String ONMOUSEWHEEL = "onmousewheel"; // HTML5 163 public static final String ONRESET = "onreset"; // No longer supported in HTML5 164 public static final String ONSCROLL = "onscroll"; // HTML5 165 public static final String ONSELECT = "onselect"; 166 public static final String ONSUBMIT = "onsubmit"; 167 public static final String PARAM = "param"; 168 public static final String REL = "rel"; 169 public static final String REQUIRED = "required"; 170 public static final String RESIZABLE = "resizable"; 171 public static final String ROWS = "rows"; 172 public static final String ROWSPAN = "rowspan"; 173 public static final String SCOPED = "scoped"; 174 public static final String SCROLLING = "scrolling"; 175 public static final String SHAPE = "shape"; 176 public static final String SIZE = "size"; 177 public static final String SRC = "src"; 178 public static final String STANDBY = "standby"; 179 public static final String TABINDEX = "tabindex"; 180 public static final String TARGET = "target"; 181 public static final String TYPE = "type"; 182 public static final String USEMAP = "usemap"; 183 public static final String VALIGN = "valign"; 184 public static final String VALUE = "value"; 185 public static final String VSPACE = "vspace"; 186 public static final String WIDTH = "width"; 187 public static final String WRAP = "wrap"; 188 189 190 // Standard attribute values 191 public static final String BUTTON = "button"; 192 public static final String CACHE_CONTROL = "cache-control"; 193 public static final String CHECKED = "checked"; 194 public static final String EXPIRES = "expires"; 195 public static final String FILE = "file"; 196 public static final String OFF = "off"; 197 public static final String PASSWORD = "password"; 198 public static final String PRAGMA = "pragma"; 199 public static final String REFRESH = "refresh"; 200 public static final String SELECTED = "selected"; 201 public static final String MULTIPART_FORM_DATA = "multipart/form-data"; 202 203 private static Map<String, Class> sTagToClassMap = new HashMap<>(); 204 205 static 206 { 207 sTagToClassMap.put(A, Link.class); 208 sTagToClassMap.put(APPLET, Applet.class); 209 sTagToClassMap.put(AREA, Area.class); 210 sTagToClassMap.put(BODY, Body.class); 211 sTagToClassMap.put(CENTER, Center.class); 212 sTagToClassMap.put(COL, Col.class); 213 sTagToClassMap.put(COLGROUP, Colgroup.class); 214 sTagToClassMap.put(DIV, Div.class); 215 sTagToClassMap.put(EM, Em.class); 216 sTagToClassMap.put(FORM, Form.class); 217 sTagToClassMap.put(FRAME, Frame.class); 218 sTagToClassMap.put(FRAMESET, Frameset.class); 219 sTagToClassMap.put(HEAD, Head.class); 220 sTagToClassMap.put(H1, H1.class); 221 sTagToClassMap.put(H2, H2.class); 222 sTagToClassMap.put(H3, H3.class); 223 sTagToClassMap.put(HR, Hr.class); 224 sTagToClassMap.put(IFRAME, IFrame.class); 225 sTagToClassMap.put(IMG, Img.class); 226 sTagToClassMap.put(LI, Li.class); 227 sTagToClassMap.put(LABEL, Label.class); 228 sTagToClassMap.put(MAP, ImageMap.class); 229 sTagToClassMap.put(META, Meta.class); 230 sTagToClassMap.put(NOBR, Nobr.class); 231 sTagToClassMap.put(OL, Ol.class); 232 sTagToClassMap.put(OBJECT, ObjectTag.class); 233 sTagToClassMap.put(OPTGROUP, OptGroup.class); 234 sTagToClassMap.put(OPTION, Option.class); 235 sTagToClassMap.put(P, P.class); 236 sTagToClassMap.put(PARAM, Param.class); 237 sTagToClassMap.put(PRE, Pre.class); 238 sTagToClassMap.put(SCRIPT, Script.class); 239 sTagToClassMap.put(SELECT, Select.class); 240 sTagToClassMap.put(SPAN, Span.class); 241 sTagToClassMap.put(STYLE, StyleTag.class); 242 sTagToClassMap.put(TABLE, Table.class); 243 sTagToClassMap.put(THEAD, THead.class); 244 sTagToClassMap.put(TBODY, TBody.class); 245 sTagToClassMap.put(TR, Tr.class); 246 sTagToClassMap.put(TH, Th.class); 247 sTagToClassMap.put(TD, Td.class); 248 sTagToClassMap.put(UL, Ul.class); 249 250 } 251 252 //########################################################################### 253 // PRIVATE FIELDS 254 //########################################################################### 255 256 private Head mHead; 257 private Body mBody; 258 private Frameset mFrameset; 259 260 261 //########################################################################### 262 // CONSTRUCTORS 263 //########################################################################### 264 265 //-------------------------------------------------------------------------- 266 public HTML() 267 { 268 super(HTML); 269 initialize(); 270 } 271 272 //-------------------------------------------------------------------------- 273 public HTML(String inTitle) 274 { 275 this(); 276 getHead().setTitle(inTitle); 277 } 278 279 //--------------------------------------------------------------------------- 280 public HTML(XMLNode inXMLNode) 281 { 282 super(HTML); 283 initFromXMLNode(inXMLNode); 284 } 285 286 //########################################################################### 287 // PUBLIC METHODS 288 //########################################################################### 289 290 //-------------------------------------------------------------------------- 291 public Head getHead() 292 { 293 if (null == mHead) 294 { 295 mHead = (Head) getOptionalSubtagByName(HEAD); 296 } 297 298 return mHead; 299 } 300 301 //-------------------------------------------------------------------------- 302 public Body getBody() 303 { 304 if (null == mBody) 305 { 306 mBody = (Body) getOptionalSubtagByName(BODY); 307 308 if (null == mBody) 309 { 310 mBody = new Body(); 311 addSubtag(mBody); 312 } 313 } 314 315 return mBody; 316 } 317 318 //-------------------------------------------------------------------------- 319 public Frameset getFrameset() 320 { 321 if (null == mFrameset) { 322 mFrameset = new Frameset(); 323 addSubtag(mFrameset); 324 } 325 326 return mFrameset; 327 } 328 329 //--------------------------------------------------------------------------- 330 public static HTMLTag constructFromXMLNode(XMLNode inXMLNode) 331 { 332 Class clazz = sTagToClassMap.get(inXMLNode.getTagName().toLowerCase()); 333 if (null == clazz) 334 { 335 // throw new HTMLParseException("The tag " + StringUtil.singleQuote(inXMLTag.getTagName()) + " could not be mapped to an HTML class!"); 336 clazz = HTMLTag.class; 337 } 338 339 HTMLTag htmlTag; 340 try 341 { 342 Constructor constructor = clazz.getConstructor(XMLNode.class); 343 344 htmlTag = (HTMLTag) constructor.newInstance(inXMLNode); 345 } 346 catch (NoSuchMethodException e) 347 { 348 throw new HTMLParseException("The class " + StringUtil.singleQuote(clazz) + " needs a constructor that takes an XMLNode.", e); 349 } 350 catch (Exception e) 351 { 352 throw new HTMLParseException("Problem during invocation of class " + StringUtil.singleQuote(clazz) + "'s constructor!", e); 353 } 354 355 return htmlTag; 356 } 357 358 //########################################################################### 359 // PRIVATE METHODS 360 //########################################################################### 361 362 //-------------------------------------------------------------------------- 363 // Initialization is done to ensure that the head will appear first. 364 private void initialize() 365 { 366 mHead = new Head(); 367 addSubtag(mHead); 368 } 369 370}