package org.exist.util.serializer; import java.io.Writer; import javax.xml.transform.TransformerException; import org.exist.util.hashtable.ObjectHashSet; /** * A writer which produces well-formed XHTML5. */ public class XHTML5Writer extends XHTMLWriter { protected final static ObjectHashSet<String> EMPTY_TAGS = new ObjectHashSet<>(31); static { //https://www.w3.org/TR/html5/syntax.html#void-elements EMPTY_TAGS.add("area"); EMPTY_TAGS.add("base"); EMPTY_TAGS.add("br"); EMPTY_TAGS.add("col"); EMPTY_TAGS.add("embed"); EMPTY_TAGS.add("hr"); EMPTY_TAGS.add("img"); EMPTY_TAGS.add("input"); EMPTY_TAGS.add("keygen"); EMPTY_TAGS.add("link"); EMPTY_TAGS.add("meta"); EMPTY_TAGS.add("param"); EMPTY_TAGS.add("source"); EMPTY_TAGS.add("track"); EMPTY_TAGS.add("wbr"); } protected final static ObjectHashSet<String> XHTML_INLINE_TAGS = new ObjectHashSet<String>(31); static { XHTML_INLINE_TAGS.add("a"); XHTML_INLINE_TAGS.add("abbr"); XHTML_INLINE_TAGS.add("area"); XHTML_INLINE_TAGS.add("audio"); XHTML_INLINE_TAGS.add("b"); XHTML_INLINE_TAGS.add("bdi"); XHTML_INLINE_TAGS.add("bdo"); XHTML_INLINE_TAGS.add("br"); XHTML_INLINE_TAGS.add("button"); XHTML_INLINE_TAGS.add("canvas"); XHTML_INLINE_TAGS.add("cite"); XHTML_INLINE_TAGS.add("code"); XHTML_INLINE_TAGS.add("command"); XHTML_INLINE_TAGS.add("datalist"); XHTML_INLINE_TAGS.add("del"); XHTML_INLINE_TAGS.add("dfn"); XHTML_INLINE_TAGS.add("em"); XHTML_INLINE_TAGS.add("embed"); XHTML_INLINE_TAGS.add("i"); XHTML_INLINE_TAGS.add("img"); XHTML_INLINE_TAGS.add("ins"); XHTML_INLINE_TAGS.add("input"); XHTML_INLINE_TAGS.add("kbd"); XHTML_INLINE_TAGS.add("keygen"); XHTML_INLINE_TAGS.add("label"); XHTML_INLINE_TAGS.add("map"); XHTML_INLINE_TAGS.add("mark"); XHTML_INLINE_TAGS.add("math"); XHTML_INLINE_TAGS.add("meter"); XHTML_INLINE_TAGS.add("object"); XHTML_INLINE_TAGS.add("output"); XHTML_INLINE_TAGS.add("progress"); XHTML_INLINE_TAGS.add("q"); XHTML_INLINE_TAGS.add("ruby"); XHTML_INLINE_TAGS.add("s"); XHTML_INLINE_TAGS.add("samp"); XHTML_INLINE_TAGS.add("select"); XHTML_INLINE_TAGS.add("small"); XHTML_INLINE_TAGS.add("span"); XHTML_INLINE_TAGS.add("strong"); XHTML_INLINE_TAGS.add("sub"); XHTML_INLINE_TAGS.add("sup"); XHTML_INLINE_TAGS.add("svg"); XHTML_INLINE_TAGS.add("textarea"); XHTML_INLINE_TAGS.add("time"); XHTML_INLINE_TAGS.add("tt"); XHTML_INLINE_TAGS.add("u"); XHTML_INLINE_TAGS.add("var"); XHTML_INLINE_TAGS.add("video"); } public XHTML5Writer() { this(EMPTY_TAGS, XHTML_INLINE_TAGS); } public XHTML5Writer(final Writer writer) { this(writer, EMPTY_TAGS, XHTML_INLINE_TAGS); } public XHTML5Writer(ObjectHashSet<String> emptyTags, ObjectHashSet<String> inlineTags) { super(emptyTags, inlineTags); } public XHTML5Writer(Writer writer, ObjectHashSet<String> emptyTags, ObjectHashSet<String> inlineTags) { super(writer, emptyTags, inlineTags); } @Override protected void writeDoctype(String rootElement) throws TransformerException { if (doctypeWritten) { return; } documentType("html", null, null); doctypeWritten = true; } }