/* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ /* * Created on Oct 8, 2005 */ package org.lobobrowser.html.domimpl; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.w3c.dom.DOMException; import org.w3c.dom.html.HTMLElement; class ElementFactory { private final Map<String, HTMLElementBuilder> builders = new HashMap<>(80); private ElementFactory() { // This sets up builders for each known element tag. final Map<String, HTMLElementBuilder> builders = this.builders; builders.put("HTML", new HTMLElementBuilder.Html()); builders.put("TITLE", new HTMLElementBuilder.Title()); builders.put("BASE", new HTMLElementBuilder.Base()); final HTMLElementBuilder div = new HTMLElementBuilder.Div(); builders.put("DIV", div); builders.put("DL", div); builders.put("BODY", new HTMLElementBuilder.Body()); builders.put("PRE", new HTMLElementBuilder.Pre()); builders.put("P", new HTMLElementBuilder.P()); final HTMLElementBuilder qb = new HTMLElementBuilder.Quote(); builders.put("BLOCKQUOTE", qb); builders.put("Q", qb); builders.put("SPAN", new HTMLElementBuilder.Span()); builders.put("SCRIPT", new HTMLElementBuilder.Script()); builders.put("IMG", new HTMLElementBuilder.Img()); builders.put("STYLE", new HTMLElementBuilder.Style()); builders.put("LINK", new HTMLElementBuilder.Link()); builders.put("A", new HTMLElementBuilder.Anchor()); builders.put("ANCHOR", new HTMLElementBuilder.Anchor()); builders.put("TABLE", new HTMLElementBuilder.Table()); builders.put("TD", new HTMLElementBuilder.Td()); builders.put("TH", new HTMLElementBuilder.Th()); builders.put("TR", new HTMLElementBuilder.Tr()); builders.put("FORM", new HTMLElementBuilder.Form()); builders.put("INPUT", new HTMLElementBuilder.Input()); builders.put("BUTTON", new HTMLElementBuilder.Button()); builders.put("TEXTAREA", new HTMLElementBuilder.Textarea()); builders.put("SELECT", new HTMLElementBuilder.Select()); builders.put("OPTION", new HTMLElementBuilder.Option()); builders.put("FRAMESET", new HTMLElementBuilder.Frameset()); builders.put("FRAME", new HTMLElementBuilder.Frame()); builders.put("IFRAME", new HTMLElementBuilder.IFrame()); builders.put("UL", new HTMLElementBuilder.Ul()); builders.put("OL", new HTMLElementBuilder.Ol()); builders.put("LI", new HTMLElementBuilder.Li()); builders.put("HR", new HTMLElementBuilder.Hr()); builders.put("BR", new HTMLElementBuilder.Br()); builders.put("OBJECT", new HTMLElementBuilder.HtmlObject()); builders.put("APPLET", new HTMLElementBuilder.Applet()); builders.put("EMBED", new HTMLElementBuilder.NonStandard()); builders.put("FONT", new HTMLElementBuilder.Font()); builders.put("BASEFONT", new HTMLElementBuilder.BaseFont()); final HTMLElementBuilder heading = new HTMLElementBuilder.Heading(); builders.put("H1", heading); builders.put("H2", heading); builders.put("H3", heading); builders.put("H4", heading); builders.put("H5", heading); builders.put("H6", heading); builders.put("CANVAS", new HTMLElementBuilder.Canvas()); } private static ElementFactory instance = new ElementFactory(); public static ElementFactory getInstance() { return instance; } public final HTMLElement createElement(final HTMLDocumentImpl document, final String name) throws DOMException { final String normalName = name.toUpperCase(Locale.ENGLISH); // No need to synchronize; read-only map at this point. final HTMLElementBuilder builder = this.builders.get(normalName); if (builder == null) { // TODO: IE would assume name is html text here? // TODO: ^^ Other browsers throw an exception if there are illegal characters in the name. // But am not sure what the legal character set is. Characters like angle-brackets // do throw an exception in Chromium and Firefox. - hrj final HTMLElementImpl element = new HTMLElementImpl(name); element.setOwnerDocument(document); return element; } else { return builder.create(document, name); } } }