|
| 1 | +package com.axellience.vuegwt.processors.dom; |
| 2 | + |
| 3 | +import static com.axellience.vuegwt.processors.utils.GeneratorsNameUtil.propNameToAttributeName; |
| 4 | + |
| 5 | +import elemental2.dom.Element; |
| 6 | +import elemental2.dom.HTMLAnchorElement; |
| 7 | +import elemental2.dom.HTMLAreaElement; |
| 8 | +import elemental2.dom.HTMLAudioElement; |
| 9 | +import elemental2.dom.HTMLBRElement; |
| 10 | +import elemental2.dom.HTMLButtonElement; |
| 11 | +import elemental2.dom.HTMLCanvasElement; |
| 12 | +import elemental2.dom.HTMLDataListElement; |
| 13 | +import elemental2.dom.HTMLDetailsElement; |
| 14 | +import elemental2.dom.HTMLDialogElement; |
| 15 | +import elemental2.dom.HTMLDivElement; |
| 16 | +import elemental2.dom.HTMLEmbedElement; |
| 17 | +import elemental2.dom.HTMLFieldSetElement; |
| 18 | +import elemental2.dom.HTMLFormElement; |
| 19 | +import elemental2.dom.HTMLHRElement; |
| 20 | +import elemental2.dom.HTMLHeadingElement; |
| 21 | +import elemental2.dom.HTMLImageElement; |
| 22 | +import elemental2.dom.HTMLInputElement; |
| 23 | +import elemental2.dom.HTMLLIElement; |
| 24 | +import elemental2.dom.HTMLLabelElement; |
| 25 | +import elemental2.dom.HTMLLegendElement; |
| 26 | +import elemental2.dom.HTMLMapElement; |
| 27 | +import elemental2.dom.HTMLMenuElement; |
| 28 | +import elemental2.dom.HTMLMenuItemElement; |
| 29 | +import elemental2.dom.HTMLMeterElement; |
| 30 | +import elemental2.dom.HTMLOListElement; |
| 31 | +import elemental2.dom.HTMLObjectElement; |
| 32 | +import elemental2.dom.HTMLOptGroupElement; |
| 33 | +import elemental2.dom.HTMLOptionElement; |
| 34 | +import elemental2.dom.HTMLOutputElement; |
| 35 | +import elemental2.dom.HTMLParagraphElement; |
| 36 | +import elemental2.dom.HTMLParamElement; |
| 37 | +import elemental2.dom.HTMLPreElement; |
| 38 | +import elemental2.dom.HTMLProgressElement; |
| 39 | +import elemental2.dom.HTMLQuoteElement; |
| 40 | +import elemental2.dom.HTMLScriptElement; |
| 41 | +import elemental2.dom.HTMLSelectElement; |
| 42 | +import elemental2.dom.HTMLSourceElement; |
| 43 | +import elemental2.dom.HTMLTableCaptionElement; |
| 44 | +import elemental2.dom.HTMLTableCellElement; |
| 45 | +import elemental2.dom.HTMLTableColElement; |
| 46 | +import elemental2.dom.HTMLTableElement; |
| 47 | +import elemental2.dom.HTMLTableRowElement; |
| 48 | +import elemental2.dom.HTMLTextAreaElement; |
| 49 | +import elemental2.dom.HTMLTrackElement; |
| 50 | +import elemental2.dom.HTMLUListElement; |
| 51 | +import elemental2.dom.HTMLVideoElement; |
| 52 | +import java.lang.reflect.Field; |
| 53 | +import java.lang.reflect.Modifier; |
| 54 | +import java.util.HashMap; |
| 55 | +import java.util.Map; |
| 56 | +import java.util.Optional; |
| 57 | + |
| 58 | +public class DOMElementsUtil { |
| 59 | + |
| 60 | + // Taken from Elemento: https://github.com/hal/elemento/blob/develop/template-processor/src/main/java/org/jboss/gwt/elemento/processor/TemplatedProcessor.java#L149 |
| 61 | + // List of elements from https://developer.mozilla.org/en-US/docs/Web/HTML/Element |
| 62 | + // which have a class in elemental2.dom, are standardized and not obsolete or deprecated |
| 63 | + private static final Map<String, Class<? extends Element>> HTML_ELEMENTS = new HashMap<>(); |
| 64 | + |
| 65 | + private static final Map<Class<? extends Element>, Map<String, Class<?>>> HTML_ELEMENTS_PROPERTIES_CACHE = new HashMap<>(); |
| 66 | + |
| 67 | + static { |
| 68 | + HTML_ELEMENTS.put("a", HTMLAnchorElement.class); |
| 69 | + HTML_ELEMENTS.put("area", HTMLAreaElement.class); |
| 70 | + HTML_ELEMENTS.put("audio", HTMLAudioElement.class); |
| 71 | + HTML_ELEMENTS.put("blockquote", HTMLQuoteElement.class); |
| 72 | + HTML_ELEMENTS.put("br", HTMLBRElement.class); |
| 73 | + HTML_ELEMENTS.put("button", HTMLButtonElement.class); |
| 74 | + HTML_ELEMENTS.put("canvas", HTMLCanvasElement.class); |
| 75 | + HTML_ELEMENTS.put("caption", HTMLTableCaptionElement.class); |
| 76 | + HTML_ELEMENTS.put("col", HTMLTableColElement.class); |
| 77 | + HTML_ELEMENTS.put("datalist", HTMLDataListElement.class); |
| 78 | + HTML_ELEMENTS.put("details", HTMLDetailsElement.class); |
| 79 | + HTML_ELEMENTS.put("dialog", HTMLDialogElement.class); |
| 80 | + HTML_ELEMENTS.put("div", HTMLDivElement.class); |
| 81 | + HTML_ELEMENTS.put("embed", HTMLEmbedElement.class); |
| 82 | + HTML_ELEMENTS.put("fieldset", HTMLFieldSetElement.class); |
| 83 | + HTML_ELEMENTS.put("form", HTMLFormElement.class); |
| 84 | + HTML_ELEMENTS.put("h1", HTMLHeadingElement.class); |
| 85 | + HTML_ELEMENTS.put("h2", HTMLHeadingElement.class); |
| 86 | + HTML_ELEMENTS.put("h3", HTMLHeadingElement.class); |
| 87 | + HTML_ELEMENTS.put("h4", HTMLHeadingElement.class); |
| 88 | + HTML_ELEMENTS.put("h5", HTMLHeadingElement.class); |
| 89 | + HTML_ELEMENTS.put("h6", HTMLHeadingElement.class); |
| 90 | + HTML_ELEMENTS.put("hr", HTMLHRElement.class); |
| 91 | + HTML_ELEMENTS.put("img", HTMLImageElement.class); |
| 92 | + HTML_ELEMENTS.put("input", HTMLInputElement.class); |
| 93 | + HTML_ELEMENTS.put("label", HTMLLabelElement.class); |
| 94 | + HTML_ELEMENTS.put("legend", HTMLLegendElement.class); |
| 95 | + HTML_ELEMENTS.put("li", HTMLLIElement.class); |
| 96 | + HTML_ELEMENTS.put("map", HTMLMapElement.class); |
| 97 | + HTML_ELEMENTS.put("menu", HTMLMenuElement.class); |
| 98 | + HTML_ELEMENTS.put("menuitem", HTMLMenuItemElement.class); |
| 99 | + HTML_ELEMENTS.put("meter", HTMLMeterElement.class); |
| 100 | + HTML_ELEMENTS.put("object", HTMLObjectElement.class); |
| 101 | + HTML_ELEMENTS.put("ol", HTMLOListElement.class); |
| 102 | + HTML_ELEMENTS.put("optgroup", HTMLOptGroupElement.class); |
| 103 | + HTML_ELEMENTS.put("option", HTMLOptionElement.class); |
| 104 | + HTML_ELEMENTS.put("output", HTMLOutputElement.class); |
| 105 | + HTML_ELEMENTS.put("p", HTMLParagraphElement.class); |
| 106 | + HTML_ELEMENTS.put("param", HTMLParamElement.class); |
| 107 | + HTML_ELEMENTS.put("pre", HTMLPreElement.class); |
| 108 | + HTML_ELEMENTS.put("progress", HTMLProgressElement.class); |
| 109 | + HTML_ELEMENTS.put("q", HTMLQuoteElement.class); |
| 110 | + HTML_ELEMENTS.put("script", HTMLScriptElement.class); |
| 111 | + HTML_ELEMENTS.put("select", HTMLSelectElement.class); |
| 112 | + HTML_ELEMENTS.put("source", HTMLSourceElement.class); |
| 113 | + HTML_ELEMENTS.put("table", HTMLTableElement.class); |
| 114 | + HTML_ELEMENTS.put("td", HTMLTableCellElement.class); |
| 115 | + HTML_ELEMENTS.put("textarea", HTMLTextAreaElement.class); |
| 116 | + HTML_ELEMENTS.put("tr", HTMLTableRowElement.class); |
| 117 | + HTML_ELEMENTS.put("track", HTMLTrackElement.class); |
| 118 | + HTML_ELEMENTS.put("ul", HTMLUListElement.class); |
| 119 | + HTML_ELEMENTS.put("video", HTMLVideoElement.class); |
| 120 | + } |
| 121 | + |
| 122 | + public static Optional<Class<? extends Element>> getTypeForElementTag(String elementTag) { |
| 123 | + return Optional.ofNullable(HTML_ELEMENTS.get(elementTag)); |
| 124 | + } |
| 125 | + |
| 126 | + public static <T extends Element> Map<String, Class<?>> getElementProperties( |
| 127 | + Class<T> elementClass) { |
| 128 | + if (HTML_ELEMENTS_PROPERTIES_CACHE.containsKey(elementClass)) { |
| 129 | + return HTML_ELEMENTS_PROPERTIES_CACHE.get(elementClass); |
| 130 | + } |
| 131 | + |
| 132 | + Map<String, Class<?>> elementProperties = new HashMap<>(); |
| 133 | + for (Field field : elementClass.getFields()) { |
| 134 | + if (!Modifier.isPublic(field.getModifiers())) { |
| 135 | + continue; |
| 136 | + } |
| 137 | + |
| 138 | + elementProperties.put(propNameToAttributeName(field.getName()), field.getType()); |
| 139 | + } |
| 140 | + |
| 141 | + HTML_ELEMENTS_PROPERTIES_CACHE.put(elementClass, elementProperties); |
| 142 | + |
| 143 | + return elementProperties; |
| 144 | + } |
| 145 | +} |
0 commit comments