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}