This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch default-xhtml5 in repository https://gitbox.apache.org/repos/asf/maven-doxia.git
commit 7567e3e023966371671d28ef315d017e64981fb9 Author: Michael Osipov <[email protected]> AuthorDate: Sat May 28 22:19:28 2022 +0200 Remove/Disable XHTML(4) --- .../apache/maven/doxia/parser/XhtmlBaseParser.java | 1241 ----------- .../maven/doxia/sink/impl/XhtmlBaseSink.java | 2228 -------------------- .../maven/doxia/sink/impl/XhtmlBaseSinkTest.java | 1061 ---------- .../doxia/module/xhtml5/Xhtml5ParserModule.java | 4 +- doxia-modules/pom.xml | 1 - 5 files changed, 2 insertions(+), 4533 deletions(-) diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java b/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java deleted file mode 100644 index c4f78ff4..00000000 --- a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java +++ /dev/null @@ -1,1241 +0,0 @@ -package org.apache.maven.doxia.parser; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.Reader; - -import javax.swing.text.html.HTML.Attribute; - -import org.apache.maven.doxia.macro.MacroExecutionException; -import org.apache.maven.doxia.markup.HtmlMarkup; -import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.doxia.sink.SinkEventAttributes; -import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet; -import org.apache.maven.doxia.util.DoxiaUtils; - -import org.codehaus.plexus.util.StringUtils; -import org.codehaus.plexus.util.xml.pull.XmlPullParser; -import org.codehaus.plexus.util.xml.pull.XmlPullParserException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Common base parser for xhtml events. - * - * @author <a href="mailto:[email protected]">Jason van Zyl</a> - * @author ltheussl - * @since 1.1 - */ -public class XhtmlBaseParser - extends AbstractXmlParser - implements HtmlMarkup -{ - private static final Logger LOGGER = LoggerFactory.getLogger( XhtmlBaseParser.class ); - - /** - * True if a <script></script> or <style></style> block is read. CDATA sections within are - * handled as rawText. - */ - private boolean scriptBlock; - - /** Used to distinguish <a href=""> from <a name="">. */ - private boolean isLink; - - /** Used to distinguish <a href=""> from <a name="">. */ - private boolean isAnchor; - - /** Used for nested lists. */ - private int orderedListDepth = 0; - - /** Counts section level. */ - private int sectionLevel; - - /** Verbatim flag, true whenever we are inside a <pre> tag. */ - private boolean inVerbatim; - - /** Used to recognize the case of img inside figure. */ - private boolean inFigure; - - /** Used to wrap the definedTerm with its definition, even when one is omitted */ - boolean hasDefinitionListItem = false; - - /** {@inheritDoc} */ - @Override - public void parse( Reader source, Sink sink, String reference ) - throws ParseException - { - init(); - - try - { - super.parse( source, sink, reference ); - } - finally - { - setSecondParsing( false ); - init(); - } - } - - /** - * {@inheritDoc} - * - * Adds all XHTML (HTML 4.0) entities to the parser so that they can be recognized and resolved - * without additional DTD. - */ - @Override - protected void initXmlParser( XmlPullParser parser ) - throws XmlPullParserException - { - super.initXmlParser( parser ); - - // the entities taken from org.apache.maven.doxia.document.io.xpp3.DocumentXpp3Reader, - // which is generated automatically - - // ---------------------------------------------------------------------- - // Latin 1 entities - // ---------------------------------------------------------------------- - - parser.defineEntityReplacementText( "nbsp", "\u00a0" ); - parser.defineEntityReplacementText( "iexcl", "\u00a1" ); - parser.defineEntityReplacementText( "cent", "\u00a2" ); - parser.defineEntityReplacementText( "pound", "\u00a3" ); - parser.defineEntityReplacementText( "curren", "\u00a4" ); - parser.defineEntityReplacementText( "yen", "\u00a5" ); - parser.defineEntityReplacementText( "brvbar", "\u00a6" ); - parser.defineEntityReplacementText( "sect", "\u00a7" ); - parser.defineEntityReplacementText( "uml", "\u00a8" ); - parser.defineEntityReplacementText( "copy", "\u00a9" ); - parser.defineEntityReplacementText( "ordf", "\u00aa" ); - parser.defineEntityReplacementText( "laquo", "\u00ab" ); - parser.defineEntityReplacementText( "not", "\u00ac" ); - parser.defineEntityReplacementText( "shy", "\u00ad" ); - parser.defineEntityReplacementText( "reg", "\u00ae" ); - parser.defineEntityReplacementText( "macr", "\u00af" ); - parser.defineEntityReplacementText( "deg", "\u00b0" ); - parser.defineEntityReplacementText( "plusmn", "\u00b1" ); - parser.defineEntityReplacementText( "sup2", "\u00b2" ); - parser.defineEntityReplacementText( "sup3", "\u00b3" ); - parser.defineEntityReplacementText( "acute", "\u00b4" ); - parser.defineEntityReplacementText( "micro", "\u00b5" ); - parser.defineEntityReplacementText( "para", "\u00b6" ); - parser.defineEntityReplacementText( "middot", "\u00b7" ); - parser.defineEntityReplacementText( "cedil", "\u00b8" ); - parser.defineEntityReplacementText( "sup1", "\u00b9" ); - parser.defineEntityReplacementText( "ordm", "\u00ba" ); - parser.defineEntityReplacementText( "raquo", "\u00bb" ); - parser.defineEntityReplacementText( "frac14", "\u00bc" ); - parser.defineEntityReplacementText( "frac12", "\u00bd" ); - parser.defineEntityReplacementText( "frac34", "\u00be" ); - parser.defineEntityReplacementText( "iquest", "\u00bf" ); - parser.defineEntityReplacementText( "Agrave", "\u00c0" ); - parser.defineEntityReplacementText( "Aacute", "\u00c1" ); - parser.defineEntityReplacementText( "Acirc", "\u00c2" ); - parser.defineEntityReplacementText( "Atilde", "\u00c3" ); - parser.defineEntityReplacementText( "Auml", "\u00c4" ); - parser.defineEntityReplacementText( "Aring", "\u00c5" ); - parser.defineEntityReplacementText( "AElig", "\u00c6" ); - parser.defineEntityReplacementText( "Ccedil", "\u00c7" ); - parser.defineEntityReplacementText( "Egrave", "\u00c8" ); - parser.defineEntityReplacementText( "Eacute", "\u00c9" ); - parser.defineEntityReplacementText( "Ecirc", "\u00ca" ); - parser.defineEntityReplacementText( "Euml", "\u00cb" ); - parser.defineEntityReplacementText( "Igrave", "\u00cc" ); - parser.defineEntityReplacementText( "Iacute", "\u00cd" ); - parser.defineEntityReplacementText( "Icirc", "\u00ce" ); - parser.defineEntityReplacementText( "Iuml", "\u00cf" ); - parser.defineEntityReplacementText( "ETH", "\u00d0" ); - parser.defineEntityReplacementText( "Ntilde", "\u00d1" ); - parser.defineEntityReplacementText( "Ograve", "\u00d2" ); - parser.defineEntityReplacementText( "Oacute", "\u00d3" ); - parser.defineEntityReplacementText( "Ocirc", "\u00d4" ); - parser.defineEntityReplacementText( "Otilde", "\u00d5" ); - parser.defineEntityReplacementText( "Ouml", "\u00d6" ); - parser.defineEntityReplacementText( "times", "\u00d7" ); - parser.defineEntityReplacementText( "Oslash", "\u00d8" ); - parser.defineEntityReplacementText( "Ugrave", "\u00d9" ); - parser.defineEntityReplacementText( "Uacute", "\u00da" ); - parser.defineEntityReplacementText( "Ucirc", "\u00db" ); - parser.defineEntityReplacementText( "Uuml", "\u00dc" ); - parser.defineEntityReplacementText( "Yacute", "\u00dd" ); - parser.defineEntityReplacementText( "THORN", "\u00de" ); - parser.defineEntityReplacementText( "szlig", "\u00df" ); - parser.defineEntityReplacementText( "agrave", "\u00e0" ); - parser.defineEntityReplacementText( "aacute", "\u00e1" ); - parser.defineEntityReplacementText( "acirc", "\u00e2" ); - parser.defineEntityReplacementText( "atilde", "\u00e3" ); - parser.defineEntityReplacementText( "auml", "\u00e4" ); - parser.defineEntityReplacementText( "aring", "\u00e5" ); - parser.defineEntityReplacementText( "aelig", "\u00e6" ); - parser.defineEntityReplacementText( "ccedil", "\u00e7" ); - parser.defineEntityReplacementText( "egrave", "\u00e8" ); - parser.defineEntityReplacementText( "eacute", "\u00e9" ); - parser.defineEntityReplacementText( "ecirc", "\u00ea" ); - parser.defineEntityReplacementText( "euml", "\u00eb" ); - parser.defineEntityReplacementText( "igrave", "\u00ec" ); - parser.defineEntityReplacementText( "iacute", "\u00ed" ); - parser.defineEntityReplacementText( "icirc", "\u00ee" ); - parser.defineEntityReplacementText( "iuml", "\u00ef" ); - parser.defineEntityReplacementText( "eth", "\u00f0" ); - parser.defineEntityReplacementText( "ntilde", "\u00f1" ); - parser.defineEntityReplacementText( "ograve", "\u00f2" ); - parser.defineEntityReplacementText( "oacute", "\u00f3" ); - parser.defineEntityReplacementText( "ocirc", "\u00f4" ); - parser.defineEntityReplacementText( "otilde", "\u00f5" ); - parser.defineEntityReplacementText( "ouml", "\u00f6" ); - parser.defineEntityReplacementText( "divide", "\u00f7" ); - parser.defineEntityReplacementText( "oslash", "\u00f8" ); - parser.defineEntityReplacementText( "ugrave", "\u00f9" ); - parser.defineEntityReplacementText( "uacute", "\u00fa" ); - parser.defineEntityReplacementText( "ucirc", "\u00fb" ); - parser.defineEntityReplacementText( "uuml", "\u00fc" ); - parser.defineEntityReplacementText( "yacute", "\u00fd" ); - parser.defineEntityReplacementText( "thorn", "\u00fe" ); - parser.defineEntityReplacementText( "yuml", "\u00ff" ); - - // ---------------------------------------------------------------------- - // Special entities - // ---------------------------------------------------------------------- - - parser.defineEntityReplacementText( "OElig", "\u0152" ); - parser.defineEntityReplacementText( "oelig", "\u0153" ); - parser.defineEntityReplacementText( "Scaron", "\u0160" ); - parser.defineEntityReplacementText( "scaron", "\u0161" ); - parser.defineEntityReplacementText( "Yuml", "\u0178" ); - parser.defineEntityReplacementText( "circ", "\u02c6" ); - parser.defineEntityReplacementText( "tilde", "\u02dc" ); - parser.defineEntityReplacementText( "ensp", "\u2002" ); - parser.defineEntityReplacementText( "emsp", "\u2003" ); - parser.defineEntityReplacementText( "thinsp", "\u2009" ); - parser.defineEntityReplacementText( "zwnj", "\u200c" ); - parser.defineEntityReplacementText( "zwj", "\u200d" ); - parser.defineEntityReplacementText( "lrm", "\u200e" ); - parser.defineEntityReplacementText( "rlm", "\u200f" ); - parser.defineEntityReplacementText( "ndash", "\u2013" ); - parser.defineEntityReplacementText( "mdash", "\u2014" ); - parser.defineEntityReplacementText( "lsquo", "\u2018" ); - parser.defineEntityReplacementText( "rsquo", "\u2019" ); - parser.defineEntityReplacementText( "sbquo", "\u201a" ); - parser.defineEntityReplacementText( "ldquo", "\u201c" ); - parser.defineEntityReplacementText( "rdquo", "\u201d" ); - parser.defineEntityReplacementText( "bdquo", "\u201e" ); - parser.defineEntityReplacementText( "dagger", "\u2020" ); - parser.defineEntityReplacementText( "Dagger", "\u2021" ); - parser.defineEntityReplacementText( "permil", "\u2030" ); - parser.defineEntityReplacementText( "lsaquo", "\u2039" ); - parser.defineEntityReplacementText( "rsaquo", "\u203a" ); - parser.defineEntityReplacementText( "euro", "\u20ac" ); - - // ---------------------------------------------------------------------- - // Symbol entities - // ---------------------------------------------------------------------- - - parser.defineEntityReplacementText( "fnof", "\u0192" ); - parser.defineEntityReplacementText( "Alpha", "\u0391" ); - parser.defineEntityReplacementText( "Beta", "\u0392" ); - parser.defineEntityReplacementText( "Gamma", "\u0393" ); - parser.defineEntityReplacementText( "Delta", "\u0394" ); - parser.defineEntityReplacementText( "Epsilon", "\u0395" ); - parser.defineEntityReplacementText( "Zeta", "\u0396" ); - parser.defineEntityReplacementText( "Eta", "\u0397" ); - parser.defineEntityReplacementText( "Theta", "\u0398" ); - parser.defineEntityReplacementText( "Iota", "\u0399" ); - parser.defineEntityReplacementText( "Kappa", "\u039a" ); - parser.defineEntityReplacementText( "Lambda", "\u039b" ); - parser.defineEntityReplacementText( "Mu", "\u039c" ); - parser.defineEntityReplacementText( "Nu", "\u039d" ); - parser.defineEntityReplacementText( "Xi", "\u039e" ); - parser.defineEntityReplacementText( "Omicron", "\u039f" ); - parser.defineEntityReplacementText( "Pi", "\u03a0" ); - parser.defineEntityReplacementText( "Rho", "\u03a1" ); - parser.defineEntityReplacementText( "Sigma", "\u03a3" ); - parser.defineEntityReplacementText( "Tau", "\u03a4" ); - parser.defineEntityReplacementText( "Upsilon", "\u03a5" ); - parser.defineEntityReplacementText( "Phi", "\u03a6" ); - parser.defineEntityReplacementText( "Chi", "\u03a7" ); - parser.defineEntityReplacementText( "Psi", "\u03a8" ); - parser.defineEntityReplacementText( "Omega", "\u03a9" ); - parser.defineEntityReplacementText( "alpha", "\u03b1" ); - parser.defineEntityReplacementText( "beta", "\u03b2" ); - parser.defineEntityReplacementText( "gamma", "\u03b3" ); - parser.defineEntityReplacementText( "delta", "\u03b4" ); - parser.defineEntityReplacementText( "epsilon", "\u03b5" ); - parser.defineEntityReplacementText( "zeta", "\u03b6" ); - parser.defineEntityReplacementText( "eta", "\u03b7" ); - parser.defineEntityReplacementText( "theta", "\u03b8" ); - parser.defineEntityReplacementText( "iota", "\u03b9" ); - parser.defineEntityReplacementText( "kappa", "\u03ba" ); - parser.defineEntityReplacementText( "lambda", "\u03bb" ); - parser.defineEntityReplacementText( "mu", "\u03bc" ); - parser.defineEntityReplacementText( "nu", "\u03bd" ); - parser.defineEntityReplacementText( "xi", "\u03be" ); - parser.defineEntityReplacementText( "omicron", "\u03bf" ); - parser.defineEntityReplacementText( "pi", "\u03c0" ); - parser.defineEntityReplacementText( "rho", "\u03c1" ); - parser.defineEntityReplacementText( "sigmaf", "\u03c2" ); - parser.defineEntityReplacementText( "sigma", "\u03c3" ); - parser.defineEntityReplacementText( "tau", "\u03c4" ); - parser.defineEntityReplacementText( "upsilon", "\u03c5" ); - parser.defineEntityReplacementText( "phi", "\u03c6" ); - parser.defineEntityReplacementText( "chi", "\u03c7" ); - parser.defineEntityReplacementText( "psi", "\u03c8" ); - parser.defineEntityReplacementText( "omega", "\u03c9" ); - parser.defineEntityReplacementText( "thetasym", "\u03d1" ); - parser.defineEntityReplacementText( "upsih", "\u03d2" ); - parser.defineEntityReplacementText( "piv", "\u03d6" ); - parser.defineEntityReplacementText( "bull", "\u2022" ); - parser.defineEntityReplacementText( "hellip", "\u2026" ); - parser.defineEntityReplacementText( "prime", "\u2032" ); - parser.defineEntityReplacementText( "Prime", "\u2033" ); - parser.defineEntityReplacementText( "oline", "\u203e" ); - parser.defineEntityReplacementText( "frasl", "\u2044" ); - parser.defineEntityReplacementText( "weierp", "\u2118" ); - parser.defineEntityReplacementText( "image", "\u2111" ); - parser.defineEntityReplacementText( "real", "\u211c" ); - parser.defineEntityReplacementText( "trade", "\u2122" ); - parser.defineEntityReplacementText( "alefsym", "\u2135" ); - parser.defineEntityReplacementText( "larr", "\u2190" ); - parser.defineEntityReplacementText( "uarr", "\u2191" ); - parser.defineEntityReplacementText( "rarr", "\u2192" ); - parser.defineEntityReplacementText( "darr", "\u2193" ); - parser.defineEntityReplacementText( "harr", "\u2194" ); - parser.defineEntityReplacementText( "crarr", "\u21b5" ); - parser.defineEntityReplacementText( "lArr", "\u21d0" ); - parser.defineEntityReplacementText( "uArr", "\u21d1" ); - parser.defineEntityReplacementText( "rArr", "\u21d2" ); - parser.defineEntityReplacementText( "dArr", "\u21d3" ); - parser.defineEntityReplacementText( "hArr", "\u21d4" ); - parser.defineEntityReplacementText( "forall", "\u2200" ); - parser.defineEntityReplacementText( "part", "\u2202" ); - parser.defineEntityReplacementText( "exist", "\u2203" ); - parser.defineEntityReplacementText( "empty", "\u2205" ); - parser.defineEntityReplacementText( "nabla", "\u2207" ); - parser.defineEntityReplacementText( "isin", "\u2208" ); - parser.defineEntityReplacementText( "notin", "\u2209" ); - parser.defineEntityReplacementText( "ni", "\u220b" ); - parser.defineEntityReplacementText( "prod", "\u220f" ); - parser.defineEntityReplacementText( "sum", "\u2211" ); - parser.defineEntityReplacementText( "minus", "\u2212" ); - parser.defineEntityReplacementText( "lowast", "\u2217" ); - parser.defineEntityReplacementText( "radic", "\u221a" ); - parser.defineEntityReplacementText( "prop", "\u221d" ); - parser.defineEntityReplacementText( "infin", "\u221e" ); - parser.defineEntityReplacementText( "ang", "\u2220" ); - parser.defineEntityReplacementText( "and", "\u2227" ); - parser.defineEntityReplacementText( "or", "\u2228" ); - parser.defineEntityReplacementText( "cap", "\u2229" ); - parser.defineEntityReplacementText( "cup", "\u222a" ); - parser.defineEntityReplacementText( "int", "\u222b" ); - parser.defineEntityReplacementText( "there4", "\u2234" ); - parser.defineEntityReplacementText( "sim", "\u223c" ); - parser.defineEntityReplacementText( "cong", "\u2245" ); - parser.defineEntityReplacementText( "asymp", "\u2248" ); - parser.defineEntityReplacementText( "ne", "\u2260" ); - parser.defineEntityReplacementText( "equiv", "\u2261" ); - parser.defineEntityReplacementText( "le", "\u2264" ); - parser.defineEntityReplacementText( "ge", "\u2265" ); - parser.defineEntityReplacementText( "sub", "\u2282" ); - parser.defineEntityReplacementText( "sup", "\u2283" ); - parser.defineEntityReplacementText( "nsub", "\u2284" ); - parser.defineEntityReplacementText( "sube", "\u2286" ); - parser.defineEntityReplacementText( "supe", "\u2287" ); - parser.defineEntityReplacementText( "oplus", "\u2295" ); - parser.defineEntityReplacementText( "otimes", "\u2297" ); - parser.defineEntityReplacementText( "perp", "\u22a5" ); - parser.defineEntityReplacementText( "sdot", "\u22c5" ); - parser.defineEntityReplacementText( "lceil", "\u2308" ); - parser.defineEntityReplacementText( "rceil", "\u2309" ); - parser.defineEntityReplacementText( "lfloor", "\u230a" ); - parser.defineEntityReplacementText( "rfloor", "\u230b" ); - parser.defineEntityReplacementText( "lang", "\u2329" ); - parser.defineEntityReplacementText( "rang", "\u232a" ); - parser.defineEntityReplacementText( "loz", "\u25ca" ); - parser.defineEntityReplacementText( "spades", "\u2660" ); - parser.defineEntityReplacementText( "clubs", "\u2663" ); - parser.defineEntityReplacementText( "hearts", "\u2665" ); - parser.defineEntityReplacementText( "diams", "\u2666" ); - } - - /** - * <p> - * Goes through a common list of possible html start tags. These include only tags that can go into - * the body of a xhtml document and so should be re-usable by different xhtml-based parsers. - * </p> - * <p> - * The currently handled tags are: - * </p> - * <p> - * <code> - * <h1>, <h2>, <h3>, <h4>, <h5>, <p>, <pre>, - * <ul>, <ol>, <li>, <dl>, <dt>, <dd>, <b>, <strong>, - * <i>, <em>, <code>, <samp>, <tt>, <a>, <table>, <tr>, - * <th>, <td>, <caption>, <br/>, <hr/>, <img/>. - * </code> - * </p> - * - * @param parser A parser. - * @param sink the sink to receive the events. - * @return True if the event has been handled by this method, i.e. the tag was recognized, false otherwise. - */ - protected boolean baseStartTag( XmlPullParser parser, Sink sink ) - { - boolean visited = true; - - SinkEventAttributeSet attribs = getAttributesFromParser( parser ); - - if ( parser.getName().equals( HtmlMarkup.H1.toString() ) ) - { - handleSectionStart( sink, Sink.SECTION_LEVEL_1, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.H2.toString() ) ) - { - handleSectionStart( sink, Sink.SECTION_LEVEL_2, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.H3.toString() ) ) - { - handleSectionStart( sink, Sink.SECTION_LEVEL_3, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.H4.toString() ) ) - { - handleSectionStart( sink, Sink.SECTION_LEVEL_4, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.H5.toString() ) ) - { - handleSectionStart( sink, Sink.SECTION_LEVEL_5, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.U.toString() ) ) - { - attribs.addAttributes( SinkEventAttributeSet.Semantics.ANNOTATION ); - sink.inline( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.S.toString() ) - || parser.getName().equals( HtmlMarkup.STRIKE.toString() ) - || parser.getName().equals( "del" ) ) - { - attribs.addAttributes( SinkEventAttributeSet.Semantics.LINE_THROUGH ); - sink.inline( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) ) - { - attribs.addAttributes( SinkEventAttributeSet.Semantics.SUBSCRIPT ); - sink.inline( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.SUP.toString() ) ) - { - attribs.addAttributes( SinkEventAttributeSet.Semantics.SUPERSCRIPT ); - sink.inline( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.P.toString() ) ) - { - handlePStart( sink, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.DIV.toString() ) ) - { - visited = handleDivStart( parser, attribs, sink ); - } - else if ( parser.getName().equals( HtmlMarkup.PRE.toString() ) ) - { - handlePreStart( attribs, sink ); - } - else if ( parser.getName().equals( HtmlMarkup.UL.toString() ) ) - { - sink.list( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.OL.toString() ) ) - { - handleOLStart( parser, sink, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.LI.toString() ) ) - { - handleLIStart( sink, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.DL.toString() ) ) - { - sink.definitionList( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.DT.toString() ) ) - { - if ( hasDefinitionListItem ) - { - // close previous listItem - sink.definitionListItem_(); - } - sink.definitionListItem( attribs ); - hasDefinitionListItem = true; - sink.definedTerm( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.DD.toString() ) ) - { - if ( !hasDefinitionListItem ) - { - sink.definitionListItem( attribs ); - } - sink.definition( attribs ); - } - else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) ) - { - sink.inline( SinkEventAttributeSet.Semantics.BOLD ); - } - else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) ) - { - handleFigureCaptionStart( sink, attribs ); - } - else if ( ( parser.getName().equals( HtmlMarkup.CODE.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) ) - { - attribs.addAttributes( SinkEventAttributeSet.Semantics.CODE ); - sink.inline( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.A.toString() ) ) - { - handleAStart( parser, sink, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.TABLE.toString() ) ) - { - handleTableStart( sink, attribs, parser ); - } - else if ( parser.getName().equals( HtmlMarkup.TR.toString() ) ) - { - sink.tableRow( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.TH.toString() ) ) - { - sink.tableHeaderCell( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.TD.toString() ) ) - { - sink.tableCell( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.CAPTION.toString() ) ) - { - sink.tableCaption( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.BR.toString() ) ) - { - sink.lineBreak( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.HR.toString() ) ) - { - sink.horizontalRule( attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.IMG.toString() ) ) - { - handleImgStart( parser, sink, attribs ); - } - else if ( parser.getName().equals( HtmlMarkup.SCRIPT.toString() ) - || parser.getName().equals( HtmlMarkup.STYLE.toString() ) ) - { - handleUnknown( parser, sink, TAG_TYPE_START ); - scriptBlock = true; - } - else - { - visited = false; - } - - return visited; - } - - /** - * <p> - * Goes through a common list of possible html end tags. - * These should be re-usable by different xhtml-based parsers. - * The tags handled here are the same as for {@link #baseStartTag(XmlPullParser,Sink)}, - * except for the empty elements ({@code <br/>, <hr/>, <img/>}). - * </p> - * - * @param parser A parser. - * @param sink the sink to receive the events. - * @return True if the event has been handled by this method, false otherwise. - */ - protected boolean baseEndTag( XmlPullParser parser, Sink sink ) - { - boolean visited = true; - - if ( parser.getName().equals( HtmlMarkup.P.toString() ) ) - { - if ( !inFigure ) - { - sink.paragraph_(); - } - } - else if ( parser.getName().equals( HtmlMarkup.U.toString() ) - || parser.getName().equals( HtmlMarkup.S.toString() ) - || parser.getName().equals( HtmlMarkup.STRIKE.toString() ) - || parser.getName().equals( "del" ) ) - { - sink.inline_(); - } - else if ( parser.getName().equals( HtmlMarkup.SUB.toString() ) - || parser.getName().equals( HtmlMarkup.SUP.toString() ) ) - { - sink.inline_(); - } - else if ( parser.getName().equals( HtmlMarkup.DIV.toString() ) ) - { - if ( inFigure ) - { - sink.figure_(); - this.inFigure = false; - } - else - { - visited = false; - } - } - else if ( parser.getName().equals( HtmlMarkup.PRE.toString() ) ) - { - verbatim_(); - - sink.verbatim_(); - } - else if ( parser.getName().equals( HtmlMarkup.UL.toString() ) ) - { - sink.list_(); - } - else if ( parser.getName().equals( HtmlMarkup.OL.toString() ) ) - { - sink.numberedList_(); - orderedListDepth--; - } - else if ( parser.getName().equals( HtmlMarkup.LI.toString() ) ) - { - handleListItemEnd( sink ); - } - else if ( parser.getName().equals( HtmlMarkup.DL.toString() ) ) - { - if ( hasDefinitionListItem ) - { - sink.definitionListItem_(); - hasDefinitionListItem = false; - } - sink.definitionList_(); - } - else if ( parser.getName().equals( HtmlMarkup.DT.toString() ) ) - { - sink.definedTerm_(); - } - else if ( parser.getName().equals( HtmlMarkup.DD.toString() ) ) - { - sink.definition_(); - sink.definitionListItem_(); - hasDefinitionListItem = false; - } - else if ( ( parser.getName().equals( HtmlMarkup.B.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.STRONG.toString() ) ) ) - { - sink.inline_(); - } - else if ( ( parser.getName().equals( HtmlMarkup.I.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.EM.toString() ) ) ) - { - handleFigureCaptionEnd( sink ); - } - else if ( ( parser.getName().equals( HtmlMarkup.CODE.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.SAMP.toString() ) ) - || ( parser.getName().equals( HtmlMarkup.TT.toString() ) ) ) - { - sink.inline_(); - } - else if ( parser.getName().equals( HtmlMarkup.A.toString() ) ) - { - handleAEnd( sink ); - } - - // ---------------------------------------------------------------------- - // Tables - // ---------------------------------------------------------------------- - - else if ( parser.getName().equals( HtmlMarkup.TABLE.toString() ) ) - { - sink.tableRows_(); - - sink.table_(); - } - else if ( parser.getName().equals( HtmlMarkup.TR.toString() ) ) - { - sink.tableRow_(); - } - else if ( parser.getName().equals( HtmlMarkup.TH.toString() ) ) - { - sink.tableHeaderCell_(); - } - else if ( parser.getName().equals( HtmlMarkup.TD.toString() ) ) - { - sink.tableCell_(); - } - else if ( parser.getName().equals( HtmlMarkup.CAPTION.toString() ) ) - { - sink.tableCaption_(); - } - else if ( parser.getName().equals( HtmlMarkup.H1.toString() ) ) - { - sink.sectionTitle1_(); - } - else if ( parser.getName().equals( HtmlMarkup.H2.toString() ) ) - { - sink.sectionTitle2_(); - } - else if ( parser.getName().equals( HtmlMarkup.H3.toString() ) ) - { - sink.sectionTitle3_(); - } - else if ( parser.getName().equals( HtmlMarkup.H4.toString() ) ) - { - sink.sectionTitle4_(); - } - else if ( parser.getName().equals( HtmlMarkup.H5.toString() ) ) - { - sink.sectionTitle5_(); - } - else if ( parser.getName().equals( HtmlMarkup.SCRIPT.toString() ) - || parser.getName().equals( HtmlMarkup.STYLE.toString() ) ) - { - handleUnknown( parser, sink, TAG_TYPE_END ); - - scriptBlock = false; - } - else - { - visited = false; - } - - return visited; - } - - /** - * {@inheritDoc} - * - * Just calls {@link #baseStartTag(XmlPullParser,Sink)}, this should be - * overridden by implementing parsers to include additional tags. - */ - protected void handleStartTag( XmlPullParser parser, Sink sink ) - throws XmlPullParserException, MacroExecutionException - { - if ( !baseStartTag( parser, sink ) ) - { - LOGGER.warn( "Unrecognized xml tag <{}> at [{}:{}]", parser.getName(), - parser.getLineNumber(), parser.getColumnNumber() ); - } - } - - /** - * {@inheritDoc} - * - * Just calls {@link #baseEndTag(XmlPullParser,Sink)}, this should be - * overridden by implementing parsers to include additional tags. - */ - protected void handleEndTag( XmlPullParser parser, Sink sink ) - throws XmlPullParserException, MacroExecutionException - { - if ( !baseEndTag( parser, sink ) ) - { - // unrecognized tag is already logged in StartTag - } - } - - /** {@inheritDoc} */ - @Override - protected void handleText( XmlPullParser parser, Sink sink ) - throws XmlPullParserException - { - String text = getText( parser ); - - /* - * NOTE: Don't do any whitespace trimming here. Whitespace normalization has already been performed by the - * parser so any whitespace that makes it here is significant. - * - * NOTE: text within script tags is ignored, scripting code should be embedded in CDATA. - */ - if ( StringUtils.isNotEmpty( text ) && !isScriptBlock() ) - { - sink.text( text ); - } - } - - /** {@inheritDoc} */ - @Override - protected void handleComment( XmlPullParser parser, Sink sink ) - throws XmlPullParserException - { - String text = getText( parser ); - - if ( "PB".equals( text.trim() ) ) - { - sink.pageBreak(); - } - else - { - if ( isEmitComments() ) - { - sink.comment( text ); - } - } - } - - /** {@inheritDoc} */ - @Override - protected void handleCdsect( XmlPullParser parser, Sink sink ) - throws XmlPullParserException - { - String text = getText( parser ); - - if ( isScriptBlock() ) - { - sink.unknown( CDATA, new Object[] { CDATA_TYPE, text }, null ); - } - else - { - sink.text( text ); - } - } - - /** - * Make sure sections are nested consecutively. - * - * <p> - * HTML doesn't have any sections, only sectionTitles (<h2> etc), that means we have to - * open close any sections that are missing in between. - * </p> - * - * <p> - * For instance, if the following sequence is parsed: - * </p> - * <pre> - * <h2></h2> - * <h5></h5> - * </pre> - * <p> - * we have to insert two section starts before we open the <code><h5></code>. - * In the following sequence - * </p> - * <pre> - * <h5></h5> - * <h2></h2> - * </pre> - * <p> - * we have to close two sections before we open the <code><h2></code>. - * </p> - * - * <p>The current level is set to newLevel afterwards.</p> - * - * @param newLevel the new section level, all upper levels have to be closed. - * @param sink the sink to receive the events. - */ - protected void consecutiveSections( int newLevel, Sink sink ) - { - closeOpenSections( newLevel, sink ); - openMissingSections( newLevel, sink ); - - this.sectionLevel = newLevel; - } - - /** - * Close open sections. - * - * @param newLevel the new section level, all upper levels have to be closed. - * @param sink the sink to receive the events. - */ - private void closeOpenSections( int newLevel, Sink sink ) - { - while ( this.sectionLevel >= newLevel ) - { - if ( sectionLevel == Sink.SECTION_LEVEL_5 ) - { - sink.section5_(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_4 ) - { - sink.section4_(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_3 ) - { - sink.section3_(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_2 ) - { - sink.section2_(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_1 ) - { - sink.section1_(); - } - - this.sectionLevel--; - } - } - - /** - * Open missing sections. - * - * @param newLevel the new section level, all lower levels have to be opened. - * @param sink the sink to receive the events. - */ - private void openMissingSections( int newLevel, Sink sink ) - { - while ( this.sectionLevel < newLevel - 1 ) - { - this.sectionLevel++; - - if ( sectionLevel == Sink.SECTION_LEVEL_5 ) - { - sink.section5(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_4 ) - { - sink.section4(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_3 ) - { - sink.section3(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_2 ) - { - sink.section2(); - } - else if ( sectionLevel == Sink.SECTION_LEVEL_1 ) - { - sink.section1(); - } - } - } - - /** - * Return the current section level. - * - * @return the current section level. - */ - protected int getSectionLevel() - { - return this.sectionLevel; - } - - /** - * Set the current section level. - * - * @param newLevel the new section level. - */ - protected void setSectionLevel( int newLevel ) - { - this.sectionLevel = newLevel; - } - - /** - * Stop verbatim mode. - */ - protected void verbatim_() - { - this.inVerbatim = false; - } - - /** - * Start verbatim mode. - */ - protected void verbatim() - { - this.inVerbatim = true; - } - - /** - * Checks if we are currently inside a <pre> tag. - * - * @return true if we are currently in verbatim mode. - */ - protected boolean isVerbatim() - { - return this.inVerbatim; - } - - /** - * Checks if we are currently inside a <script> tag. - * - * @return true if we are currently inside <code><script></code> tags. - * @since 1.1.1. - */ - protected boolean isScriptBlock() - { - return this.scriptBlock; - } - - /** - * Checks if the given id is a valid Doxia id and if not, returns a transformed one. - * - * @param id The id to validate. - * @return A transformed id or the original id if it was already valid. - * @see DoxiaUtils#encodeId(String) - */ - protected String validAnchor( String id ) - { - if ( !DoxiaUtils.isValidId( id ) ) - { - String linkAnchor = DoxiaUtils.encodeId( id, true ); - - LOGGER.debug( "Modified invalid link '{}' to '{}'", id, linkAnchor ); - - return linkAnchor; - } - - return id; - } - - /** {@inheritDoc} */ - @Override - protected void init() - { - super.init(); - - this.scriptBlock = false; - this.isLink = false; - this.isAnchor = false; - this.orderedListDepth = 0; - this.sectionLevel = 0; - this.inVerbatim = false; - this.inFigure = false; - } - - private void handleAEnd( Sink sink ) - { - if ( isLink ) - { - sink.link_(); - isLink = false; - } - else if ( isAnchor ) - { - sink.anchor_(); - isAnchor = false; - } - } - - private void handleAStart( XmlPullParser parser, Sink sink, SinkEventAttributeSet attribs ) - { - String href = parser.getAttributeValue( null, Attribute.HREF.toString() ); - - if ( href != null ) - { - int hashIndex = href.indexOf( '#' ); - if ( hashIndex != -1 && !DoxiaUtils.isExternalLink( href ) ) - { - String hash = href.substring( hashIndex + 1 ); - - if ( !DoxiaUtils.isValidId( hash ) ) - { - href = href.substring( 0, hashIndex ) + "#" + DoxiaUtils.encodeId( hash, true ); - - LOGGER.debug( "Modified invalid link '{}' to '{}'", hash, href ); - } - } - sink.link( href, attribs ); - isLink = true; - } - else - { - String name = parser.getAttributeValue( null, Attribute.NAME.toString() ); - - if ( name != null ) - { - sink.anchor( validAnchor( name ), attribs ); - isAnchor = true; - } - else - { - String id = parser.getAttributeValue( null, Attribute.ID.toString() ); - if ( id != null ) - { - sink.anchor( validAnchor( id ), attribs ); - isAnchor = true; - } - } - } - } - - private boolean handleDivStart( XmlPullParser parser, SinkEventAttributeSet attribs, Sink sink ) - { - boolean visited = true; - - String divclass = parser.getAttributeValue( null, Attribute.CLASS.toString() ); - - if ( "figure".equals( divclass ) ) - { - this.inFigure = true; - SinkEventAttributeSet atts = new SinkEventAttributeSet( attribs ); - atts.removeAttribute( SinkEventAttributes.CLASS ); - sink.figure( atts ); - } - else - { - visited = false; - } - - return visited; - } - - private void handleFigureCaptionEnd( Sink sink ) - { - if ( inFigure ) - { - sink.figureCaption_(); - } - else - { - sink.inline_(); - } - } - - private void handleFigureCaptionStart( Sink sink, SinkEventAttributeSet attribs ) - { - if ( inFigure ) - { - sink.figureCaption( attribs ); - } - else - { - sink.inline( SinkEventAttributeSet.Semantics.ITALIC ); - } - } - - private void handleImgStart( XmlPullParser parser, Sink sink, SinkEventAttributeSet attribs ) - { - String src = parser.getAttributeValue( null, Attribute.SRC.toString() ); - - if ( src != null ) - { - sink.figureGraphics( src, attribs ); - } - } - - private void handleLIStart( Sink sink, SinkEventAttributeSet attribs ) - { - if ( orderedListDepth == 0 ) - { - sink.listItem( attribs ); - } - else - { - sink.numberedListItem( attribs ); - } - } - - private void handleListItemEnd( Sink sink ) - { - if ( orderedListDepth == 0 ) - { - sink.listItem_(); - } - else - { - sink.numberedListItem_(); - } - } - - private void handleOLStart( XmlPullParser parser, Sink sink, SinkEventAttributeSet attribs ) - { - int numbering = Sink.NUMBERING_DECIMAL; - // this will have to be generalized if we handle styles - String style = parser.getAttributeValue( null, Attribute.STYLE.toString() ); - - if ( style != null ) - { - switch ( style ) - { - case "list-style-type: upper-alpha": - numbering = Sink.NUMBERING_UPPER_ALPHA; - break; - case "list-style-type: lower-alpha": - numbering = Sink.NUMBERING_LOWER_ALPHA; - break; - case "list-style-type: upper-roman": - numbering = Sink.NUMBERING_UPPER_ROMAN; - break; - case "list-style-type: lower-roman": - numbering = Sink.NUMBERING_LOWER_ROMAN; - break; - case "list-style-type: decimal": - numbering = Sink.NUMBERING_DECIMAL; - break; - default: - // ignore all other - } - } - - sink.numberedList( numbering, attribs ); - orderedListDepth++; - } - - private void handlePStart( Sink sink, SinkEventAttributeSet attribs ) - { - if ( !inFigure ) - { - sink.paragraph( attribs ); - } - } - - /* - * The PRE element tells visual user agents that the enclosed text is - * "preformatted". When handling preformatted text, visual user agents: - * - May leave white space intact. - * - May render text with a fixed-pitch font. - * - May disable automatic word wrap. - * - Must not disable bidirectional processing. - * Non-visual user agents are not required to respect extra white space - * in the content of a PRE element. - */ - private void handlePreStart( SinkEventAttributeSet attribs, Sink sink ) - { - verbatim(); - sink.verbatim( attribs ); - } - - private void handleSectionStart( Sink sink, int level, SinkEventAttributeSet attribs ) - { - consecutiveSections( level, sink ); - sink.section( level, attribs ); - sink.sectionTitle( level, attribs ); - } - - private void handleTableStart( Sink sink, SinkEventAttributeSet attribs, XmlPullParser parser ) - { - sink.table( attribs ); - String border = parser.getAttributeValue( null, Attribute.BORDER.toString() ); - boolean grid = true; - - if ( border == null || "0".equals( border ) ) - { - grid = false; - } - - String align = parser.getAttributeValue( null, Attribute.ALIGN.toString() ); - int[] justif = {Sink.JUSTIFY_LEFT}; - - if ( "center".equals( align ) ) - { - justif[0] = Sink.JUSTIFY_CENTER; - } - else if ( "right".equals( align ) ) - { - justif[0] = Sink.JUSTIFY_RIGHT; - } - - sink.tableRows( justif, grid ); - } -} diff --git a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java deleted file mode 100644 index bc7ca83f..00000000 --- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java +++ /dev/null @@ -1,2228 +0,0 @@ -package org.apache.maven.doxia.sink.impl; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Stack; - -import javax.swing.text.MutableAttributeSet; -import javax.swing.text.html.HTML.Attribute; -import javax.swing.text.html.HTML.Tag; - -import org.apache.maven.doxia.markup.HtmlMarkup; -import org.apache.maven.doxia.markup.Markup; -import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.doxia.sink.SinkEventAttributes; -import org.apache.maven.doxia.util.DoxiaUtils; -import org.apache.maven.doxia.util.HtmlTools; - -import org.codehaus.plexus.util.StringUtils; -import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Abstract base xhtml sink implementation. - * - * @author Jason van Zyl - * @author ltheussl - * @since 1.1 - */ -public class XhtmlBaseSink - extends AbstractXmlSink - implements HtmlMarkup -{ - private static final Logger LOGGER = LoggerFactory.getLogger( XhtmlBaseSink.class ); - - // ---------------------------------------------------------------------- - // Instance fields - // ---------------------------------------------------------------------- - - /** The PrintWriter to write the result. */ - private final PrintWriter writer; - - /** Used to collect text events mainly for the head events. */ - private StringBuffer textBuffer = new StringBuffer(); - - /** An indication on if we're inside a head. */ - private boolean headFlag; - - /** An indication on if we're inside an image caption flag. */ - private boolean figureCaptionFlag; - - /** An indication on if we're inside a paragraph flag. */ - private boolean paragraphFlag; - - /** An indication on if we're in verbatim mode. */ - private boolean verbatimFlag; - - /** Stack of alignment int[] of table cells. */ - private final LinkedList<int[]> cellJustifStack; - - /** Stack of justification of table cells. */ - private final LinkedList<Boolean> isCellJustifStack; - - /** Stack of current table cell. */ - private final LinkedList<Integer> cellCountStack; - - /** Used to style successive table rows differently. */ - private boolean evenTableRow = true; - - /** The stack of StringWriter to write the table result temporary, so we could play with the output DOXIA-177. */ - private final LinkedList<StringWriter> tableContentWriterStack; - - private final LinkedList<StringWriter> tableCaptionWriterStack; - - private final LinkedList<PrettyPrintXMLWriter> tableCaptionXMLWriterStack; - - /** The stack of table caption */ - private final LinkedList<String> tableCaptionStack; - - /** used to store attributes passed to table(). */ - protected MutableAttributeSet tableAttributes; - - /** Used to distinguish old-style figure handling. */ - private boolean legacyFigure; - - /** Used to distinguish old-style figure handling. */ - private boolean legacyFigureCaption; - - /** Indicates that an image is part of a figure. */ - private boolean inFigure; - - /** Flag to know if {@link #tableRows(int[], boolean)} is called or not. It is mainly to be backward compatible - * with some plugins (like checkstyle) which uses: - * <pre> - * sink.table(); - * sink.tableRow(); - * </pre> - * instead of - * <pre> - * sink.table(); - * sink.tableRows( justify, true ); - * sink.tableRow(); - * </pre> - * */ - protected boolean tableRows = false; - - /** Keep track of the closing tags for inline events. */ - protected Stack<List<Tag>> inlineStack = new Stack<>(); - - // ---------------------------------------------------------------------- - // Constructor - // ---------------------------------------------------------------------- - - /** - * Constructor, initialize the PrintWriter. - * - * @param out The writer to write the result. - */ - public XhtmlBaseSink( Writer out ) - { - this.writer = new PrintWriter( out ); - - this.cellJustifStack = new LinkedList<>(); - this.isCellJustifStack = new LinkedList<>(); - this.cellCountStack = new LinkedList<>(); - this.tableContentWriterStack = new LinkedList<>(); - this.tableCaptionWriterStack = new LinkedList<>(); - this.tableCaptionXMLWriterStack = new LinkedList<>(); - this.tableCaptionStack = new LinkedList<>(); - - init(); - } - - // ---------------------------------------------------------------------- - // Accessor methods - // ---------------------------------------------------------------------- - - /** - * To use mainly when playing with the head events. - * - * @return the current buffer of text events. - */ - protected StringBuffer getTextBuffer() - { - return this.textBuffer; - } - - /** - * <p>Setter for the field <code>headFlag</code>.</p> - * - * @param headFlag an header flag. - */ - protected void setHeadFlag( boolean headFlag ) - { - this.headFlag = headFlag; - } - - /** - * <p>isHeadFlag.</p> - * - * @return the current headFlag. - */ - protected boolean isHeadFlag() - { - return this.headFlag ; - } - - /** - * <p>Setter for the field <code>verbatimFlag</code>.</p> - * - * @param verb a verbatim flag. - */ - protected void setVerbatimFlag( boolean verb ) - { - this.verbatimFlag = verb; - } - - /** - * <p>isVerbatimFlag.</p> - * - * @return the current verbatim flag. - */ - protected boolean isVerbatimFlag() - { - return this.verbatimFlag ; - } - - /** - * <p>Setter for the field <code>cellJustif</code>.</p> - * - * @param justif the new cell justification array. - */ - protected void setCellJustif( int[] justif ) - { - this.cellJustifStack.addLast( justif ); - this.isCellJustifStack.addLast( Boolean.TRUE ); - } - - /** - * <p>Getter for the field <code>cellJustif</code>.</p> - * - * @return the current cell justification array. - */ - protected int[] getCellJustif() - { - return this.cellJustifStack.getLast(); - } - - /** - * <p>Setter for the field <code>cellCount</code>.</p> - * - * @param count the new cell count. - */ - protected void setCellCount( int count ) - { - this.cellCountStack.addLast( count ); - } - - /** - * <p>Getter for the field <code>cellCount</code>.</p> - * - * @return the current cell count. - */ - protected int getCellCount() - { - return Integer.parseInt( this.cellCountStack.getLast().toString() ); - } - - /** {@inheritDoc} */ - @Override - protected void init() - { - super.init(); - - resetTextBuffer(); - - this.cellJustifStack.clear(); - this.isCellJustifStack.clear(); - this.cellCountStack.clear(); - this.tableContentWriterStack.clear(); - this.tableCaptionWriterStack.clear(); - this.tableCaptionXMLWriterStack.clear(); - this.tableCaptionStack.clear(); - - this.headFlag = false; - this.figureCaptionFlag = false; - this.paragraphFlag = false; - this.verbatimFlag = false; - - this.evenTableRow = true; - this.tableAttributes = null; - this.legacyFigure = false; - this.legacyFigureCaption = false; - this.inFigure = false; - this.tableRows = false; - } - - /** - * Reset the text buffer. - */ - protected void resetTextBuffer() - { - this.textBuffer = new StringBuffer(); - } - - // ---------------------------------------------------------------------- - // Sections - // ---------------------------------------------------------------------- - - /** {@inheritDoc} */ - @Override - public void section( int level, SinkEventAttributes attributes ) - { - onSection( level, attributes ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle( int level, SinkEventAttributes attributes ) - { - onSectionTitle( level, attributes ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle_( int level ) - { - onSectionTitle_( level ); - } - - /** {@inheritDoc} */ - @Override - public void section_( int level ) - { - onSection_( level ); - } - - /** {@inheritDoc} */ - @Override - public void section1() - { - onSection( SECTION_LEVEL_1, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle1() - { - onSectionTitle( SECTION_LEVEL_1, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle1_() - { - onSectionTitle_( SECTION_LEVEL_1 ); - } - - /** {@inheritDoc} */ - @Override - public void section1_() - { - onSection_( SECTION_LEVEL_1 ); - } - - /** {@inheritDoc} */ - @Override - public void section2() - { - onSection( SECTION_LEVEL_2, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle2() - { - onSectionTitle( SECTION_LEVEL_2, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle2_() - { - onSectionTitle_( SECTION_LEVEL_2 ); - } - - /** {@inheritDoc} */ - @Override - public void section2_() - { - onSection_( SECTION_LEVEL_2 ); - } - - /** {@inheritDoc} */ - @Override - public void section3() - { - onSection( SECTION_LEVEL_3, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle3() - { - onSectionTitle( SECTION_LEVEL_3, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle3_() - { - onSectionTitle_( SECTION_LEVEL_3 ); - } - - /** {@inheritDoc} */ - @Override - public void section3_() - { - onSection_( SECTION_LEVEL_3 ); - } - - /** {@inheritDoc} */ - @Override - public void section4() - { - onSection( SECTION_LEVEL_4, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle4() - { - onSectionTitle( SECTION_LEVEL_4, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle4_() - { - onSectionTitle_( SECTION_LEVEL_4 ); - } - - /** {@inheritDoc} */ - @Override - public void section4_() - { - onSection_( SECTION_LEVEL_4 ); - } - - /** {@inheritDoc} */ - @Override - public void section5() - { - onSection( SECTION_LEVEL_5, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle5() - { - onSectionTitle( SECTION_LEVEL_5, null ); - } - - /** {@inheritDoc} */ - @Override - public void sectionTitle5_() - { - onSectionTitle_( SECTION_LEVEL_5 ); - } - - /** {@inheritDoc} */ - @Override - public void section5_() - { - onSection_( SECTION_LEVEL_5 ); - } - - /** - * Starts a section. The default class style is <code>section</code>. - * - * @param depth The level of the section. - * @param attributes some attributes. May be null. - * @see javax.swing.text.html.HTML.Tag#DIV - */ - protected void onSection( int depth, SinkEventAttributes attributes ) - { - if ( depth >= SECTION_LEVEL_1 && depth <= SECTION_LEVEL_5 ) - { - MutableAttributeSet att = new SinkEventAttributeSet(); - att.addAttribute( Attribute.CLASS, "section" ); - // NOTE: any class entry in attributes will overwrite the above - att.addAttributes( SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ) ); - - writeStartTag( HtmlMarkup.DIV, att ); - } - } - - /** - * Ends a section. - * - * @param depth The level of the section. - * @see javax.swing.text.html.HTML.Tag#DIV - */ - protected void onSection_( int depth ) - { - if ( depth >= SECTION_LEVEL_1 && depth <= SECTION_LEVEL_5 ) - { - writeEndTag( HtmlMarkup.DIV ); - } - } - - /** - * Starts a section title. - * - * @param depth The level of the section title. - * @param attributes some attributes. May be null. - * @see javax.swing.text.html.HTML.Tag#H1 - * @see javax.swing.text.html.HTML.Tag#H2 - * @see javax.swing.text.html.HTML.Tag#H3 - * @see javax.swing.text.html.HTML.Tag#H4 - * @see javax.swing.text.html.HTML.Tag#H5 - */ - protected void onSectionTitle( int depth, SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - if ( depth == SECTION_LEVEL_1 ) - { - writeStartTag( HtmlMarkup.H1, atts ); - } - else if ( depth == SECTION_LEVEL_2 ) - { - writeStartTag( HtmlMarkup.H2, atts ); - } - else if ( depth == SECTION_LEVEL_3 ) - { - writeStartTag( HtmlMarkup.H3, atts ); - } - else if ( depth == SECTION_LEVEL_4 ) - { - writeStartTag( HtmlMarkup.H4, atts ); - } - else if ( depth == SECTION_LEVEL_5 ) - { - writeStartTag( HtmlMarkup.H5, atts ); - } - } - - /** - * Ends a section title. - * - * @param depth The level of the section title. - * @see javax.swing.text.html.HTML.Tag#H1 - * @see javax.swing.text.html.HTML.Tag#H2 - * @see javax.swing.text.html.HTML.Tag#H3 - * @see javax.swing.text.html.HTML.Tag#H4 - * @see javax.swing.text.html.HTML.Tag#H5 - */ - protected void onSectionTitle_( int depth ) - { - if ( depth == SECTION_LEVEL_1 ) - { - writeEndTag( HtmlMarkup.H1 ); - } - else if ( depth == SECTION_LEVEL_2 ) - { - writeEndTag( HtmlMarkup.H2 ); - } - else if ( depth == SECTION_LEVEL_3 ) - { - writeEndTag( HtmlMarkup.H3 ); - } - else if ( depth == SECTION_LEVEL_4 ) - { - writeEndTag( HtmlMarkup.H4 ); - } - else if ( depth == SECTION_LEVEL_5 ) - { - writeEndTag( HtmlMarkup.H5 ); - } - } - - // ----------------------------------------------------------------------- - // - // ----------------------------------------------------------------------- - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#UL - */ - @Override - public void list() - { - list( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#UL - */ - @Override - public void list( SinkEventAttributes attributes ) - { - if ( paragraphFlag ) - { - // The content of element type "p" must match - // "(a|br|span|bdo|object|applet|img|map|iframe|tt|i|b|u|s|strike|big|small|font|basefont|em|strong| - // dfn|code|q|samp|kbd|var|cite|abbr|acronym|sub|sup|input|select|textarea|label|button|ins|del|script)". - paragraph_(); - } - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.UL, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#UL - */ - @Override - public void list_() - { - writeEndTag( HtmlMarkup.UL ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void listItem() - { - listItem( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void listItem( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.LI, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void listItem_() - { - writeEndTag( HtmlMarkup.LI ); - } - - /** - * The default list style depends on the numbering. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#OL - */ - @Override - public void numberedList( int numbering ) - { - numberedList( numbering, null ); - } - - /** - * The default list style depends on the numbering. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#OL - */ - @Override - public void numberedList( int numbering, SinkEventAttributes attributes ) - { - if ( paragraphFlag ) - { - // The content of element type "p" must match - // "(a|br|span|bdo|object|applet|img|map|iframe|tt|i|b|u|s|strike|big|small|font|basefont|em|strong| - // dfn|code|q|samp|kbd|var|cite|abbr|acronym|sub|sup|input|select|textarea|label|button|ins|del|script)". - paragraph_(); - } - - String style; - switch ( numbering ) - { - case NUMBERING_UPPER_ALPHA: - style = "upper-alpha"; - break; - case NUMBERING_LOWER_ALPHA: - style = "lower-alpha"; - break; - case NUMBERING_UPPER_ROMAN: - style = "upper-roman"; - break; - case NUMBERING_LOWER_ROMAN: - style = "lower-roman"; - break; - case NUMBERING_DECIMAL: - default: - style = "decimal"; - } - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - if ( atts == null ) - { - atts = new SinkEventAttributeSet( 1 ); - } - - atts.addAttribute( Attribute.STYLE, "list-style-type: " + style ); - - writeStartTag( HtmlMarkup.OL, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#OL - */ - @Override - public void numberedList_() - { - writeEndTag( HtmlMarkup.OL ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void numberedListItem() - { - numberedListItem( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void numberedListItem( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.LI, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#LI - */ - @Override - public void numberedListItem_() - { - writeEndTag( HtmlMarkup.LI ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DL - */ - @Override - public void definitionList() - { - definitionList( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DL - */ - @Override - public void definitionList( SinkEventAttributes attributes ) - { - if ( paragraphFlag ) - { - // The content of element type "p" must match - // "(a|br|span|bdo|object|applet|img|map|iframe|tt|i|b|u|s|strike|big|small|font|basefont|em|strong| - // dfn|code|q|samp|kbd|var|cite|abbr|acronym|sub|sup|input|select|textarea|label|button|ins|del|script)". - paragraph_(); - } - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.DL, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DL - */ - @Override - public void definitionList_() - { - writeEndTag( HtmlMarkup.DL ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DT - */ - @Override - public void definedTerm( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.DT, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DT - */ - @Override - public void definedTerm() - { - definedTerm( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DT - */ - @Override - public void definedTerm_() - { - writeEndTag( HtmlMarkup.DT ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DD - */ - @Override - public void definition() - { - definition( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DD - */ - @Override - public void definition( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.DD, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DD - */ - @Override - public void definition_() - { - writeEndTag( HtmlMarkup.DD ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#IMG - * @deprecated Use {@link #figure(SinkEventAttributes)}, this method is only kept for - * backward compatibility. Note that the behavior is different though, as this method - * writes an img tag, while correctly the img tag should be written by figureGraphics(). - */ - @Override - public void figure() - { - write( String.valueOf( LESS_THAN ) + HtmlMarkup.IMG ); - legacyFigure = true; - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#IMG - */ - @Override - public void figure( SinkEventAttributes attributes ) - { - inFigure = true; - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - if ( atts == null ) - { - atts = new SinkEventAttributeSet( 1 ); - } - - if ( !atts.isDefined( SinkEventAttributes.CLASS ) ) - { - atts.addAttribute( SinkEventAttributes.CLASS, "figure" ); - } - - writeStartTag( HtmlMarkup.DIV, atts ); - } - - /** {@inheritDoc} */ - @Override - public void figure_() - { - if ( legacyFigure ) - { - if ( !figureCaptionFlag ) - { - // Attribute "alt" is required and must be specified for element type "img". - write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE + QUOTE ); - } - write( String.valueOf( SPACE ) + SLASH + GREATER_THAN ); - legacyFigure = false; - } - else - { - writeEndTag( HtmlMarkup.DIV ); - inFigure = false; - } - - figureCaptionFlag = false; - } - - /** - * {@inheritDoc} - * @deprecated Use {@link #figureGraphics(String,SinkEventAttributes)}, - * this method is only kept for backward compatibility. Note that the behavior is - * different though, as this method does not write the img tag, only the src attribute. - */ - @Override - public void figureGraphics( String name ) - { - write( String.valueOf( SPACE ) + Attribute.SRC + EQUAL + QUOTE + escapeHTML( name ) + QUOTE ); - } - - /** {@inheritDoc} */ - @Override - public void figureGraphics( String src, SinkEventAttributes attributes ) - { - if ( inFigure ) - { - MutableAttributeSet atts = new SinkEventAttributeSet( 1 ); - atts.addAttribute( SinkEventAttributes.ALIGN, "center" ); - - writeStartTag( HtmlMarkup.P, atts ); - } - - MutableAttributeSet filtered = SinkUtils.filterAttributes( attributes, SinkUtils.SINK_IMG_ATTRIBUTES ); - if ( filtered != null ) - { - filtered.removeAttribute( Attribute.SRC.toString() ); - } - - int count = ( attributes == null ? 1 : attributes.getAttributeCount() + 1 ); - - MutableAttributeSet atts = new SinkEventAttributeSet( count ); - - atts.addAttribute( Attribute.SRC, HtmlTools.escapeHTML( src, true ) ); - atts.addAttributes( filtered ); - - if ( atts.getAttribute( Attribute.ALT.toString() ) == null ) - { - atts.addAttribute( Attribute.ALT.toString(), "" ); - } - - writeStartTag( HtmlMarkup.IMG, atts, true ); - - if ( inFigure ) - { - writeEndTag( HtmlMarkup.P ); - } - } - - /** - * {@inheritDoc} - * @deprecated Use {@link #figureCaption(SinkEventAttributes)}, - * this method is only kept for backward compatibility. Note that the behavior is - * different though, as this method only writes an alt attribute. - */ - @Override - public void figureCaption() - { - figureCaptionFlag = true; - write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE ); - legacyFigureCaption = true; - } - - /** {@inheritDoc} */ - @Override - public void figureCaption( SinkEventAttributes attributes ) - { - if ( legacyFigureCaption ) - { - write( String.valueOf( SPACE ) + Attribute.ALT + EQUAL + QUOTE ); - legacyFigureCaption = false; - figureCaptionFlag = true; - } - else - { - SinkEventAttributeSet atts = new SinkEventAttributeSet( 1 ); - atts.addAttribute( SinkEventAttributes.ALIGN, "center" ); - atts.addAttributes( SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ) ); - - paragraph( atts ); - inline( SinkEventAttributeSet.Semantics.ITALIC ); - } - } - - /** {@inheritDoc} */ - @Override - public void figureCaption_() - { - if ( legacyFigureCaption ) - { - write( String.valueOf( QUOTE ) ); - } - else - { - inline_(); - paragraph_(); - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#P - */ - @Override - public void paragraph() - { - paragraph( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#P - */ - @Override - public void paragraph( SinkEventAttributes attributes ) - { - paragraphFlag = true; - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.P, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#P - */ - @Override - public void paragraph_() - { - if ( paragraphFlag ) - { - writeEndTag( HtmlMarkup.P ); - paragraphFlag = false; - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#ADDRESS - */ - @Override - public void address() - { - address( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#ADDRESS - */ - @Override - public void address( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.ADDRESS, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#ADDRESS - */ - @Override - public void address_() - { - writeEndTag( HtmlMarkup.ADDRESS ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE - */ - @Override - public void blockquote() - { - blockquote( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE - */ - @Override - public void blockquote( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.BLOCKQUOTE, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#BLOCKQUOTE - */ - @Override - public void blockquote_() - { - writeEndTag( HtmlMarkup.BLOCKQUOTE ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DIV - */ - @Override - public void division() - { - division( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DIV - */ - @Override - public void division( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.DIV, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DIV - */ - @Override - public void division_() - { - writeEndTag( HtmlMarkup.DIV ); - } - - /** - * The default class style for boxed is <code>source</code>. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DIV - * @see javax.swing.text.html.HTML.Tag#PRE - */ - @Override - public void verbatim( SinkEventAttributes attributes ) - { - if ( paragraphFlag ) - { - // The content of element type "p" must match - // "(a|br|span|bdo|object|applet|img|map|iframe|tt|i|b|u|s|strike|big|small|font|basefont|em|strong| - // dfn|code|q|samp|kbd|var|cite|abbr|acronym|sub|sup|input|select|textarea|label|button|ins|del|script)". - paragraph_(); - } - - verbatimFlag = true; - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_VERBATIM_ATTRIBUTES ); - - if ( atts == null ) - { - atts = new SinkEventAttributeSet(); - } - - boolean boxed = false; - - if ( atts.isDefined( SinkEventAttributes.DECORATION ) ) - { - boxed = - "boxed".equals( atts.getAttribute( SinkEventAttributes.DECORATION ).toString() ); - } - - SinkEventAttributes divAtts = null; - - if ( boxed ) - { - divAtts = new SinkEventAttributeSet( Attribute.CLASS.toString(), "source" ); - } - - atts.removeAttribute( SinkEventAttributes.DECORATION ); - - writeStartTag( HtmlMarkup.DIV, divAtts ); - writeStartTag( HtmlMarkup.PRE, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#DIV - * @see javax.swing.text.html.HTML.Tag#PRE - */ - @Override - public void verbatim_() - { - writeEndTag( HtmlMarkup.PRE ); - writeEndTag( HtmlMarkup.DIV ); - - verbatimFlag = false; - - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#HR - */ - @Override - public void horizontalRule() - { - horizontalRule( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#HR - */ - @Override - public void horizontalRule( SinkEventAttributes attributes ) - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_HR_ATTRIBUTES ); - - writeSimpleTag( HtmlMarkup.HR, atts ); - } - - /** {@inheritDoc} */ - @Override - public void table() - { - // start table with tableRows - table( null ); - } - - /** {@inheritDoc} */ - @Override - public void table( SinkEventAttributes attributes ) - { - this.tableContentWriterStack.addLast( new StringWriter() ); - this.tableRows = false; - - if ( paragraphFlag ) - { - // The content of element type "p" must match - // "(a|br|span|bdo|object|applet|img|map|iframe|tt|i|b|u|s|strike|big|small|font|basefont|em|strong| - // dfn|code|q|samp|kbd|var|cite|abbr|acronym|sub|sup|input|select|textarea|label|button|ins|del|script)". - paragraph_(); - } - - // start table with tableRows - if ( attributes == null ) - { - this.tableAttributes = new SinkEventAttributeSet( 0 ); - } - else - { - this.tableAttributes = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_TABLE_ATTRIBUTES ); - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TABLE - */ - @Override - public void table_() - { - this.tableRows = false; - - writeEndTag( HtmlMarkup.TABLE ); - - if ( !this.cellCountStack.isEmpty() ) - { - this.cellCountStack.removeLast().toString(); - } - - if ( this.tableContentWriterStack.isEmpty() ) - { - LOGGER.warn( "No table content" ); - return; - } - - String tableContent = this.tableContentWriterStack.removeLast().toString(); - - String tableCaption = null; - if ( !this.tableCaptionStack.isEmpty() && this.tableCaptionStack.getLast() != null ) - { - tableCaption = this.tableCaptionStack.removeLast(); - } - - if ( tableCaption != null ) - { - // DOXIA-177 - StringBuilder sb = new StringBuilder(); - sb.append( tableContent, 0, tableContent.indexOf( Markup.GREATER_THAN ) + 1 ); - sb.append( tableCaption ); - sb.append( tableContent.substring( tableContent.indexOf( Markup.GREATER_THAN ) + 1 ) ); - - write( sb.toString() ); - } - else - { - write( tableContent ); - } - } - - /** - * The default class style is <code>bodyTable</code>. - * The default align is <code>center</code>. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TABLE - */ - @Override - public void tableRows( int[] justification, boolean grid ) - { - this.tableRows = true; - - setCellJustif( justification ); - - if ( this.tableAttributes == null ) - { - this.tableAttributes = new SinkEventAttributeSet( 0 ); - } - - MutableAttributeSet att = new SinkEventAttributeSet(); - if ( !this.tableAttributes.isDefined( Attribute.BORDER.toString() ) ) - { - att.addAttribute( Attribute.BORDER, ( grid ? "1" : "0" ) ); - } - - if ( !this.tableAttributes.isDefined( Attribute.CLASS.toString() ) ) - { - att.addAttribute( Attribute.CLASS, "bodyTable" ); - } - - att.addAttributes( this.tableAttributes ); - this.tableAttributes.removeAttributes( this.tableAttributes ); - - writeStartTag( HtmlMarkup.TABLE, att ); - - this.cellCountStack.addLast( 0 ); - } - - /** {@inheritDoc} */ - @Override - public void tableRows_() - { - this.tableRows = false; - if ( !this.cellJustifStack.isEmpty() ) - { - this.cellJustifStack.removeLast(); - } - if ( !this.isCellJustifStack.isEmpty() ) - { - this.isCellJustifStack.removeLast(); - } - - this.evenTableRow = true; - } - - /** - * The default class style is <code>a</code> or <code>b</code> depending the row id. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TR - */ - @Override - public void tableRow() - { - // To be backward compatible - if ( !this.tableRows ) - { - tableRows( null, false ); - } - tableRow( null ); - } - - /** - * The default class style is <code>a</code> or <code>b</code> depending the row id. - * - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TR - */ - @Override - public void tableRow( SinkEventAttributes attributes ) - { - MutableAttributeSet att = new SinkEventAttributeSet(); - - if ( evenTableRow ) - { - att.addAttribute( Attribute.CLASS, "a" ); - } - else - { - att.addAttribute( Attribute.CLASS, "b" ); - } - - att.addAttributes( SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_TR_ATTRIBUTES ) ); - - writeStartTag( HtmlMarkup.TR, att ); - - evenTableRow = !evenTableRow; - - if ( !this.cellCountStack.isEmpty() ) - { - this.cellCountStack.removeLast(); - this.cellCountStack.addLast( 0 ); - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TR - */ - @Override - public void tableRow_() - { - writeEndTag( HtmlMarkup.TR ); - } - - /** {@inheritDoc} */ - @Override - public void tableCell() - { - tableCell( (SinkEventAttributeSet) null ); - } - - /** {@inheritDoc} */ - @Override - public void tableHeaderCell() - { - tableHeaderCell( (SinkEventAttributeSet) null ); - } - - /** {@inheritDoc} */ - @Override - public void tableCell( SinkEventAttributes attributes ) - { - tableCell( false, attributes ); - } - - /** {@inheritDoc} */ - @Override - public void tableHeaderCell( SinkEventAttributes attributes ) - { - tableCell( true, attributes ); - } - - /** - * @param headerRow true if it is an header row - * @param attributes the cell attributes - * @see javax.swing.text.html.HTML.Tag#TH - * @see javax.swing.text.html.HTML.Tag#TD - */ - private void tableCell( boolean headerRow, MutableAttributeSet attributes ) - { - Tag t = ( headerRow ? HtmlMarkup.TH : HtmlMarkup.TD ); - - if ( !headerRow && cellCountStack != null && !cellCountStack.isEmpty() - && cellJustifStack != null && !cellJustifStack.isEmpty() && getCellJustif() != null ) - { - int cellCount = getCellCount(); - if ( cellCount < getCellJustif().length ) - { - Map<Integer, MutableAttributeSet> hash = new HashMap<>(); - hash.put( Sink.JUSTIFY_CENTER, SinkEventAttributeSet.CENTER ); - hash.put( Sink.JUSTIFY_LEFT, SinkEventAttributeSet.LEFT ); - hash.put( Sink.JUSTIFY_RIGHT, SinkEventAttributeSet.RIGHT ); - MutableAttributeSet atts = hash.get( getCellJustif()[cellCount] ); - - if ( attributes == null ) - { - attributes = new SinkEventAttributeSet(); - } - if ( atts != null ) - { - attributes.addAttributes( atts ); - } - } - } - - if ( attributes == null ) - { - writeStartTag( t, null ); - } - else - { - writeStartTag( t, - SinkUtils.filterAttributes( attributes, SinkUtils.SINK_TD_ATTRIBUTES ) ); - } - } - - /** {@inheritDoc} */ - @Override - public void tableCell_() - { - tableCell_( false ); - } - - /** {@inheritDoc} */ - @Override - public void tableHeaderCell_() - { - tableCell_( true ); - } - - /** - * Ends a table cell. - * - * @param headerRow true if it is an header row - * @see javax.swing.text.html.HTML.Tag#TH - * @see javax.swing.text.html.HTML.Tag#TD - */ - private void tableCell_( boolean headerRow ) - { - Tag t = ( headerRow ? HtmlMarkup.TH : HtmlMarkup.TD ); - - writeEndTag( t ); - - if ( !this.isCellJustifStack.isEmpty() && this.isCellJustifStack.getLast().equals( Boolean.TRUE ) - && !this.cellCountStack.isEmpty() ) - { - int cellCount = Integer.parseInt( this.cellCountStack.removeLast().toString() ); - this.cellCountStack.addLast( ++cellCount ); - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#CAPTION - */ - @Override - public void tableCaption() - { - tableCaption( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#CAPTION - */ - @Override - public void tableCaption( SinkEventAttributes attributes ) - { - StringWriter sw = new StringWriter(); - this.tableCaptionWriterStack.addLast( sw ); - this.tableCaptionXMLWriterStack.addLast( new PrettyPrintXMLWriter( sw ) ); - - // TODO: tableCaption should be written before tableRows (DOXIA-177) - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_SECTION_ATTRIBUTES ); - - writeStartTag( HtmlMarkup.CAPTION, atts ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#CAPTION - */ - @Override - public void tableCaption_() - { - writeEndTag( HtmlMarkup.CAPTION ); - - if ( !this.tableCaptionXMLWriterStack.isEmpty() && this.tableCaptionXMLWriterStack.getLast() != null ) - { - this.tableCaptionStack.addLast( this.tableCaptionWriterStack.removeLast().toString() ); - this.tableCaptionXMLWriterStack.removeLast(); - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#A - */ - @Override - public void anchor( String name ) - { - anchor( name, null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#A - */ - @Override - public void anchor( String name, SinkEventAttributes attributes ) - { - Objects.requireNonNull( name, "name cannot be null" ); - - if ( headFlag ) - { - return; - } - - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BASE_ATTRIBUTES ); - - String id = name; - - if ( !DoxiaUtils.isValidId( id ) ) - { - id = DoxiaUtils.encodeId( name, true ); - - LOGGER.debug( "Modified invalid anchor name '{}' to '{}'", name, id ); - } - - MutableAttributeSet att = new SinkEventAttributeSet(); - att.addAttribute( Attribute.NAME, id ); - att.addAttributes( atts ); - - writeStartTag( HtmlMarkup.A, att ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#A - */ - @Override - public void anchor_() - { - if ( !headFlag ) - { - writeEndTag( HtmlMarkup.A ); - } - } - - /** {@inheritDoc} */ - @Override - public void link( String name ) - { - link( name, null ); - } - - /** {@inheritDoc} */ - @Override - public void link( String name, SinkEventAttributes attributes ) - { - if ( attributes == null ) - { - link( name, null, null ); - } - else - { - String target = (String) attributes.getAttribute( Attribute.TARGET.toString() ); - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_LINK_ATTRIBUTES ); - - link( name, target, atts ); - } - } - - /** - * Adds a link with an optional target. - * The default style class for external link is <code>externalLink</code>. - * - * @param href the link href. - * @param target the link target, may be null. - * @param attributes an AttributeSet, may be null. - * This is supposed to be filtered already. - * @see javax.swing.text.html.HTML.Tag#A - */ - private void link( String href, String target, MutableAttributeSet attributes ) - { - Objects.requireNonNull( href, "href cannot be null" ); - - if ( headFlag ) - { - return; - } - - MutableAttributeSet att = new SinkEventAttributeSet(); - - if ( DoxiaUtils.isExternalLink( href ) ) - { - att.addAttribute( Attribute.CLASS, "externalLink" ); - } - - att.addAttribute( Attribute.HREF, HtmlTools.escapeHTML( href ) ); - - if ( target != null ) - { - att.addAttribute( Attribute.TARGET, target ); - } - - if ( attributes != null ) - { - attributes.removeAttribute( Attribute.HREF.toString() ); - attributes.removeAttribute( Attribute.TARGET.toString() ); - att.addAttributes( attributes ); - } - - writeStartTag( HtmlMarkup.A, att ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#A - */ - @Override - public void link_() - { - if ( !headFlag ) - { - writeEndTag( HtmlMarkup.A ); - } - } - - /** {@inheritDoc} */ - @Override - public void inline() - { - inline( null ); - } - - private void inlineSemantics( SinkEventAttributes attributes, String semantic, - List<Tag> tags, Tag tag ) - { - if ( attributes.containsAttribute( SinkEventAttributes.SEMANTICS, semantic ) ) - { - SinkEventAttributes attributesNoSemantics = ( SinkEventAttributes ) attributes.copyAttributes(); - attributesNoSemantics.removeAttribute( SinkEventAttributes.SEMANTICS ); - writeStartTag( tag, attributesNoSemantics ); - tags.add( 0, tag ); - } - } - - /** {@inheritDoc} */ - @Override - public void inline( SinkEventAttributes attributes ) - { - if ( !headFlag ) - { - List<Tag> tags = new ArrayList<>(); - - if ( attributes != null ) - { - inlineSemantics( attributes, "emphasis", tags, HtmlMarkup.EM ); - inlineSemantics( attributes, "strong", tags, HtmlMarkup.STRONG ); - inlineSemantics( attributes, "small", tags, HtmlMarkup.SMALL ); - inlineSemantics( attributes, "line-through", tags, HtmlMarkup.S ); - inlineSemantics( attributes, "citation", tags, HtmlMarkup.CITE ); - inlineSemantics( attributes, "quote", tags, HtmlMarkup.Q ); - inlineSemantics( attributes, "definition", tags, HtmlMarkup.DFN ); - inlineSemantics( attributes, "abbreviation", tags, HtmlMarkup.ABBR ); - inlineSemantics( attributes, "italic", tags, HtmlMarkup.I ); - inlineSemantics( attributes, "bold", tags, HtmlMarkup.B ); - inlineSemantics( attributes, "monospaced", tags, HtmlMarkup.TT ); - inlineSemantics( attributes, "code", tags, HtmlMarkup.CODE ); - inlineSemantics( attributes, "variable", tags, HtmlMarkup.VAR ); - inlineSemantics( attributes, "sample", tags, HtmlMarkup.SAMP ); - inlineSemantics( attributes, "keyboard", tags, HtmlMarkup.KBD ); - inlineSemantics( attributes, "superscript", tags, HtmlMarkup.SUP ); - inlineSemantics( attributes, "subscript", tags, HtmlMarkup.SUB ); - inlineSemantics( attributes, "annotation", tags, HtmlMarkup.U ); - inlineSemantics( attributes, "bidirectionalOverride", tags, HtmlMarkup.BDO ); - inlineSemantics( attributes, "phrase", tags, HtmlMarkup.SPAN ); - inlineSemantics( attributes, "insert", tags, HtmlMarkup.INS ); - inlineSemantics( attributes, "delete", tags, HtmlMarkup.DEL ); - } - - inlineStack.push( tags ); - } - } - - /** {@inheritDoc} */ - @Override - public void inline_() - { - if ( !headFlag ) - { - for ( Tag tag: inlineStack.pop() ) - { - writeEndTag( tag ); - } - } - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#I - */ - @Override - public void italic() - { - inline( SinkEventAttributeSet.Semantics.ITALIC ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#I - */ - @Override - public void italic_() - { - inline_(); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#B - */ - @Override - public void bold() - { - inline( SinkEventAttributeSet.Semantics.BOLD ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#B - */ - @Override - public void bold_() - { - inline_(); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TT - */ - @Override - public void monospaced() - { - inline( SinkEventAttributeSet.Semantics.MONOSPACED ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#TT - */ - @Override - public void monospaced_() - { - inline_(); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#BR - */ - @Override - public void lineBreak() - { - lineBreak( null ); - } - - /** - * {@inheritDoc} - * @see javax.swing.text.html.HTML.Tag#BR - */ - @Override - public void lineBreak( SinkEventAttributes attributes ) - { - if ( headFlag || isVerbatimFlag() ) - { - getTextBuffer().append( EOL ); - } - else - { - MutableAttributeSet atts = SinkUtils.filterAttributes( - attributes, SinkUtils.SINK_BR_ATTRIBUTES ); - - writeSimpleTag( HtmlMarkup.BR, atts ); - } - } - - /** {@inheritDoc} */ - @Override - public void pageBreak() - { - comment( " PB " ); - } - - /** {@inheritDoc} */ - @Override - public void nonBreakingSpace() - { - if ( headFlag ) - { - getTextBuffer().append( ' ' ); - } - else - { - write( " " ); - } - } - - /** {@inheritDoc} */ - @Override - public void text( String text ) - { - if ( headFlag ) - { - getTextBuffer().append( text ); - } - else if ( verbatimFlag ) - { - verbatimContent( text ); - } - else - { - content( text ); - } - } - - /** {@inheritDoc} */ - @Override - public void text( String text, SinkEventAttributes attributes ) - { - text( text ); - } - - /** {@inheritDoc} */ - @Override - public void rawText( String text ) - { - if ( headFlag ) - { - getTextBuffer().append( text ); - } - else - { - write( text ); - } - } - - /** {@inheritDoc} */ - @Override - public void comment( String comment ) - { - if ( comment != null ) - { - final String originalComment = comment; - - // http://www.w3.org/TR/2000/REC-xml-20001006#sec-comments - while ( comment.contains( "--" ) ) - { - comment = comment.replace( "--", "- -" ); - } - - if ( comment.endsWith( "-" ) ) - { - comment += " "; - } - - if ( !originalComment.equals( comment ) ) - { - LOGGER.warn( "Modified invalid comment '{}' to '{}'", originalComment, comment ); - } - - final StringBuilder buffer = new StringBuilder( comment.length() + 7 ); - - buffer.append( LESS_THAN ).append( BANG ).append( MINUS ).append( MINUS ); - buffer.append( comment ); - buffer.append( MINUS ).append( MINUS ).append( GREATER_THAN ); - - write( buffer.toString() ); - } - } - - /** - * {@inheritDoc} - * - * Add an unknown event. - * This can be used to generate html tags for which no corresponding sink event exists. - * - * <p> - * If {@link org.apache.maven.doxia.util.HtmlTools#getHtmlTag(String) HtmlTools.getHtmlTag( name )} - * does not return null, the corresponding tag will be written. - * </p> - * - * <p>For example, the div block</p> - * - * <pre> - * <div class="detail" style="display:inline">text</div> - * </pre> - * - * <p>can be generated via the following event sequence:</p> - * - * <pre> - * SinkEventAttributeSet atts = new SinkEventAttributeSet(); - * atts.addAttribute( SinkEventAttributes.CLASS, "detail" ); - * atts.addAttribute( SinkEventAttributes.STYLE, "display:inline" ); - * sink.unknown( "div", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_START )}, atts ); - * sink.text( "text" ); - * sink.unknown( "div", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_END )}, null ); - * </pre> - * - * @param name the name of the event. If this is not a valid xhtml tag name - * as defined in {@link org.apache.maven.doxia.markup.HtmlMarkup} then the event is ignored. - * @param requiredParams If this is null or the first argument is not an Integer then the event is ignored. - * The first argument should indicate the type of the unknown event, its integer value should be one of - * {@link org.apache.maven.doxia.markup.HtmlMarkup#TAG_TYPE_START TAG_TYPE_START}, - * {@link org.apache.maven.doxia.markup.HtmlMarkup#TAG_TYPE_END TAG_TYPE_END}, - * {@link org.apache.maven.doxia.markup.HtmlMarkup#TAG_TYPE_SIMPLE TAG_TYPE_SIMPLE}, - * {@link org.apache.maven.doxia.markup.HtmlMarkup#ENTITY_TYPE ENTITY_TYPE}, or - * {@link org.apache.maven.doxia.markup.HtmlMarkup#CDATA_TYPE CDATA_TYPE}, - * otherwise the event will be ignored. - * @param attributes a set of attributes for the event. May be null. - * The attributes will always be written, no validity check is performed. - */ - @Override - public void unknown( String name, Object[] requiredParams, SinkEventAttributes attributes ) - { - if ( requiredParams == null || !( requiredParams[0] instanceof Integer ) ) - { - LOGGER.warn( "No type information for unknown event '{}', ignoring!", name ); - - return; - } - - int tagType = (Integer) requiredParams[0]; - - if ( tagType == ENTITY_TYPE ) - { - rawText( name ); - - return; - } - - if ( tagType == CDATA_TYPE ) - { - rawText( EOL + "//<![CDATA[" + requiredParams[1] + "]]>" + EOL ); - - return; - } - - Tag tag = HtmlTools.getHtmlTag( name ); - - if ( tag == null ) - { - LOGGER.warn( "No HTML tag found for unknown event '{}', ignoring!", name ); - } - else - { - if ( tagType == TAG_TYPE_SIMPLE ) - { - writeSimpleTag( tag, escapeAttributeValues( attributes ) ); - } - else if ( tagType == TAG_TYPE_START ) - { - writeStartTag( tag, escapeAttributeValues( attributes ) ); - } - else if ( tagType == TAG_TYPE_END ) - { - writeEndTag( tag ); - } - else - { - LOGGER.warn( "No type information for unknown event '{}', ignoring!", name ); - } - } - } - - private SinkEventAttributes escapeAttributeValues( SinkEventAttributes attributes ) - { - SinkEventAttributeSet set = new SinkEventAttributeSet( attributes.getAttributeCount() ); - - Enumeration<?> names = attributes.getAttributeNames(); - - while ( names.hasMoreElements() ) - { - Object name = names.nextElement(); - - set.addAttribute( name, escapeHTML( attributes.getAttribute( name ).toString() ) ); - } - - return set; - } - - /** {@inheritDoc} */ - @Override - public void flush() - { - writer.flush(); - } - - /** {@inheritDoc} */ - @Override - public void close() - { - writer.close(); - - init(); - } - - // ---------------------------------------------------------------------- - // - // ---------------------------------------------------------------------- - - /** - * Write HTML escaped text to output. - * - * @param text The text to write. - */ - protected void content( String text ) - { - // small hack due to DOXIA-314 - String txt = escapeHTML( text ); - txt = StringUtils.replace( txt, "&#", "&#" ); - write( txt ); - } - - /** - * Write HTML escaped text to output. - * - * @param text The text to write. - */ - protected void verbatimContent( String text ) - { - write( escapeHTML( text ) ); - } - - /** - * Forward to HtmlTools.escapeHTML( text ). - * - * @param text the String to escape, may be null - * @return the text escaped, "" if null String input - * @see org.apache.maven.doxia.util.HtmlTools#escapeHTML(String) - */ - protected static String escapeHTML( String text ) - { - return HtmlTools.escapeHTML( text, false ); - } - - /** - * Forward to HtmlTools.encodeURL( text ). - * - * @param text the String to encode, may be null. - * @return the text encoded, null if null String input. - * @see org.apache.maven.doxia.util.HtmlTools#encodeURL(String) - */ - protected static String encodeURL( String text ) - { - return HtmlTools.encodeURL( text ); - } - - /** {@inheritDoc} */ - protected void write( String text ) - { - if ( !this.tableCaptionXMLWriterStack.isEmpty() && this.tableCaptionXMLWriterStack.getLast() != null ) - { - this.tableCaptionXMLWriterStack.getLast().writeMarkup( unifyEOLs( text ) ); - } - else if ( !this.tableContentWriterStack.isEmpty() && this.tableContentWriterStack.getLast() != null ) - { - this.tableContentWriterStack.getLast().write( unifyEOLs( text ) ); - } - else - { - writer.write( unifyEOLs( text ) ); - } - } - - /** {@inheritDoc} */ - @Override - protected void writeStartTag( Tag t, MutableAttributeSet att, boolean isSimpleTag ) - { - if ( this.tableCaptionXMLWriterStack.isEmpty() ) - { - super.writeStartTag ( t, att, isSimpleTag ); - } - else - { - String tag = ( getNameSpace() != null ? getNameSpace() + ":" : "" ) + t.toString(); - this.tableCaptionXMLWriterStack.getLast().startElement( tag ); - - if ( att != null ) - { - Enumeration<?> names = att.getAttributeNames(); - while ( names.hasMoreElements() ) - { - Object key = names.nextElement(); - Object value = att.getAttribute( key ); - - this.tableCaptionXMLWriterStack.getLast().addAttribute( key.toString(), value.toString() ); - } - } - - if ( isSimpleTag ) - { - this.tableCaptionXMLWriterStack.getLast().endElement(); - } - } - } - - /** {@inheritDoc} */ - @Override - protected void writeEndTag( Tag t ) - { - if ( this.tableCaptionXMLWriterStack.isEmpty() ) - { - super.writeEndTag( t ); - } - else - { - this.tableCaptionXMLWriterStack.getLast().endElement(); - } - } -} diff --git a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java deleted file mode 100644 index bea64e93..00000000 --- a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java +++ /dev/null @@ -1,1061 +0,0 @@ -package org.apache.maven.doxia.sink.impl; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.StringWriter; -import java.io.Writer; - -import javax.swing.text.html.HTML.Attribute; - -import org.apache.maven.doxia.markup.Markup; -import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.doxia.sink.SinkEventAttributes; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test for XhtmlBaseSink. - * - * @author ltheussl - * @since 1.1 - */ -public class XhtmlBaseSinkTest -{ - protected static final String LS = Markup.EOL; - private final SinkEventAttributes attributes = SinkEventAttributeSet.BOLD; - private XhtmlBaseSink sink; - private Writer writer; - - @BeforeEach - public void setUp() - { - writer = new StringWriter(); - } - - @Test - public void testSpaceAfterClosingTag() - { - // DOXIA-189 - try - { - sink = new XhtmlBaseSink( writer ); - - sink.paragraph(); - sink.text( "There should be no space before the " ); - sink.inline( SinkEventAttributeSet.Semantics.ITALIC ); - sink.text( "period" ); - sink.inline_(); - sink.text( "." ); - sink.paragraph_(); - } - finally - { - if ( sink != null ) - { - sink.close(); - } - } - - String actual = writer.toString(); - String expected = "<p>There should be no space before the <i>period</i>.</p>"; - - assertEquals( expected, actual ); - } - - /** - */ - @Test - public void testNestedTables() - { - // DOXIA-177 - try - { - sink = new XhtmlBaseSink( writer ); - - sink.table(); - sink.tableRows( new int[] { Sink.JUSTIFY_CENTER, Sink.JUSTIFY_LEFT }, false ); - sink.tableRow(); - sink.tableCell(); - sink.text( "cell11" ); - sink.tableCell_(); - sink.tableCell(); - sink.text( "cell12" ); - sink.tableCell_(); - sink.tableRow_(); - - sink.tableRow(); - sink.tableCell(); - sink.table( SinkEventAttributeSet.LEFT ); - sink.tableRows( new int[] { Sink.JUSTIFY_LEFT, Sink.JUSTIFY_RIGHT }, false ); - sink.tableRow(); - sink.tableCell(); - sink.text( "nestedTable1Cell11" ); - sink.tableCell_(); - sink.tableCell(); - sink.text( "nestedTable1Cell12" ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableCell(); - - sink.table( SinkEventAttributeSet.RIGHT ); - sink.tableRows( new int[] { Sink.JUSTIFY_RIGHT, Sink.JUSTIFY_CENTER }, false ); - sink.tableRow(); - sink.tableCell(); - sink.text( "nestedTable2Cell11" ); - sink.tableCell_(); - sink.tableCell(); - sink.text( "nestedTable2Cell12" ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableCell(); - sink.text( "nestedTable2Cell21" ); - sink.tableCell_(); - sink.tableCell(); - sink.text( "nestedTable2Cell22" ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRows_(); - sink.tableCaption(); - sink.text( "caption3" ); - sink.tableCaption_(); - sink.table_(); - - sink.tableCell_(); - sink.tableCell(); - sink.text( "nestedTable1Cell22" ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRows_(); - sink.tableCaption(); - sink.text( "caption2" ); - sink.tableCaption_(); - sink.table_(); - - sink.tableCell_(); - sink.tableCell(); - sink.text( "cell22" ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRows_(); - sink.tableCaption(); - sink.text( "caption&1" ); - sink.tableCaption_(); - sink.table_(); - } - finally - { - sink.close(); - } - - String actual = writer.toString(); - assertTrue( - actual.contains( "<table border=\"0\" class=\"bodyTable\">" + "<caption>caption&1</caption>" ) ); - assertTrue( actual.contains( - "<table border=\"0\" class=\"bodyTable\" align=\"left\">" + "<caption>caption2</caption>" ) ); - assertTrue( actual.contains( - "<table border=\"0\" class=\"bodyTable\" align=\"right\">" + "<caption>caption3</caption>" ) ); - - assertTrue( actual.contains( "<td align=\"center\">cell11</td>" ) ); - assertTrue( actual.contains( "<td align=\"right\">nestedTable2Cell11</td>" ) ); - assertTrue( actual.contains( "<td align=\"right\">nestedTable1Cell22</td>" ) ); - assertTrue( actual.contains( "<td align=\"left\">cell22</td>" ) ); - } - - /** - * Test of section method, of class XhtmlBaseSink. - */ - @Test - public void testSection() - { - final int level = XhtmlBaseSink.SECTION_LEVEL_1; - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section( level, attributes ); - sink.sectionTitle( level, attributes ); - sink.sectionTitle_( level ); - sink.section_( level ); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\" style=\"bold\">" + LS + "<h1 style=\"bold\"></h1></div>", - writer.toString() ); - } - - /** - * Test of section method, of class XhtmlBaseSink. - */ - @Test - public void testSectionAttributes() - { - final int level = XhtmlBaseSink.SECTION_LEVEL_1; - final SinkEventAttributeSet set = new SinkEventAttributeSet( "name", "section name", "class", "foo", "id", - "bar" ); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section( level, set ); - sink.sectionTitle( level, null ); - sink.sectionTitle_( level ); - sink.section_( level ); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"foo\" id=\"bar\">" + LS + "<h1></h1></div>", writer.toString() ); - } - - /** - * Test of section1 method, of class XhtmlBaseSink. - */ - @Test - public void testSection1() - { - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section1(); - sink.sectionTitle1(); - sink.sectionTitle1_(); - sink.section1_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\">" + LS + "<h1></h1></div>", writer.toString() ); - } - - /** - * Test of section2 method, of class XhtmlBaseSink. - */ - @Test - public void testSection2() - { - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section2(); - sink.sectionTitle2(); - sink.sectionTitle2_(); - sink.section2_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\">" + LS + "<h2></h2></div>", writer.toString() ); - } - - /** - * Test of section3 method, of class XhtmlBaseSink. - */ - @Test - public void testSection3() - { - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section3(); - sink.sectionTitle3(); - sink.sectionTitle3_(); - sink.section3_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\">" + LS + "<h3></h3></div>", writer.toString() ); - } - - /** - * Test of section4 method, of class XhtmlBaseSink. - */ - @Test - public void testSection4() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section4(); - sink.sectionTitle4(); - sink.sectionTitle4_(); - sink.section4_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\">" + LS + "<h4></h4></div>", writer.toString() ); - } - - /** - * Test of section5 method, of class XhtmlBaseSink. - */ - @Test - public void testSection5() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.section5(); - sink.sectionTitle5(); - sink.sectionTitle5_(); - sink.section5_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"section\">" + LS + "<h5></h5></div>", writer.toString() ); - } - - /** - * Test of list method, of class XhtmlBaseSink. - */ - @Test - public void testList() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.list(); - sink.listItem(); - sink.listItem_(); - sink.list_(); - } - finally - { - sink.close(); - } - - assertEquals( "<ul>" + LS + "<li></li></ul>", writer.toString() ); - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.list( attributes ); - sink.listItem( attributes ); - sink.listItem_(); - sink.list_(); - } - finally - { - sink.close(); - } - - assertEquals( "<ul style=\"bold\">" + LS + "<li style=\"bold\"></li></ul>", writer.toString() ); - } - - /** - * Test of numberedList method, of class XhtmlBaseSink. - */ - @Test - public void testNumberedList() - { - final int numbering = XhtmlBaseSink.NUMBERING_DECIMAL; - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.numberedList( numbering ); - sink.numberedListItem(); - sink.numberedListItem_(); - sink.numberedList_(); - } - finally - { - sink.close(); - } - - assertEquals( "<ol style=\"list-style-type: decimal\">" + LS + "<li></li></ol>", writer.toString() ); - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.numberedList( numbering, attributes ); - sink.numberedListItem( attributes ); - sink.numberedListItem_(); - sink.numberedList_(); - } - finally - { - sink.close(); - } - - assertEquals( "<ol style=\"list-style-type: decimal\">" + LS + "<li style=\"bold\"></li></ol>", - writer.toString() ); - } - - /** - * Test of definitionList method, of class XhtmlBaseSink. - */ - @Test - public void testDefinitionList() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.definitionList(); - sink.definedTerm(); - sink.definedTerm_(); - sink.definition(); - sink.definition_(); - sink.definitionList_(); - } - finally - { - sink.close(); - } - - assertEquals( "<dl>" + LS + "<dt></dt>" + LS + "<dd></dd></dl>", writer.toString() ); - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.definitionList( attributes ); - sink.definedTerm( attributes ); - sink.definedTerm_(); - sink.definition( attributes ); - sink.definition_(); - sink.definitionList_(); - } - finally - { - sink.close(); - } - - assertEquals( - "<dl style=\"bold\">" + LS + "<dt style=\"bold\"></dt>" + LS + "<dd style=\"bold\"></dd></dl>", - writer.toString() ); - } - - /** - * Test of figure method, of class XhtmlBaseSink. - */ - @Test - public void testFigure() - { - final String src = "src.jpg"; - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.figure( attributes ); - sink.figureGraphics( src, attributes ); - sink.figureCaption( attributes ); - sink.figureCaption_(); - sink.figure_(); - } - finally - { - sink.close(); - } - - assertEquals( - "<div style=\"bold\" class=\"figure\">" + "" + LS + "<p align=\"center\"><img src=\"src.jpg\" style=\"bold\" alt=\"\" /></p>" + "" + LS + "<p align=\"center\" style=\"bold\"><i></i></p></div>", - writer.toString() ); - } - - /** - * Test of figureGraphics method, of class XhtmlBaseSink. - */ - @Test - public void testFigureGraphics() - { - String src = "source.png"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.figureGraphics( src, attributes ); - } - finally - { - sink.close(); - } - - assertEquals( "<img src=\"source.png\" style=\"bold\" alt=\"\" />", writer.toString() ); - } - - /** - * Test of paragraph method, of class XhtmlBaseSink. - */ - @Test - public void testParagraph() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.paragraph(); - sink.paragraph_(); - } - finally - { - sink.close(); - } - - assertEquals( "<p></p>", writer.toString() ); - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.paragraph( attributes ); - sink.paragraph_(); - } - finally - { - sink.close(); - } - - assertEquals( "<p style=\"bold\"></p>", writer.toString() ); - } - - /** - * Test of verbatim method, of class XhtmlBaseSink. - */ - @Test - public void testVerbatim() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.verbatim( SinkEventAttributeSet.BOXED ); - sink.verbatim_(); - } - finally - { - sink.close(); - } - - assertEquals( "<div class=\"source\">" + LS + "<pre></pre></div>", writer.toString() ); - - checkVerbatimAttributes( attributes, "<div>" + LS + "<pre style=\"bold\"></pre></div>" ); - - final SinkEventAttributes att = - new SinkEventAttributeSet( SinkEventAttributes.ID, "id" ); - checkVerbatimAttributes( att, "<div>" + LS + "<pre id=\"id\"></pre></div>" ); - - att.addAttribute( Attribute.CLASS, "class" ); - checkVerbatimAttributes( att, "<div>" + LS + "<pre id=\"id\" class=\"class\"></pre></div>" ); - - att.addAttribute( SinkEventAttributes.DECORATION, "boxed" ); - checkVerbatimAttributes( att, "<div class=\"source\">" + LS + "<pre id=\"id\" class=\"class\"></pre></div>" ); - - att.removeAttribute( Attribute.CLASS.toString() ); - checkVerbatimAttributes( att, "<div class=\"source\">" + LS + "<pre id=\"id\"></pre></div>" ); - } - - private void checkVerbatimAttributes( final SinkEventAttributes att, final String expected ) - { - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.verbatim( att ); - sink.verbatim_(); - } - finally - { - sink.close(); - } - - assertEquals( expected, writer.toString() ); - } - - /** - * Test of horizontalRule method, of class XhtmlBaseSink. - */ - @Test - public void testHorizontalRule() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.horizontalRule(); - sink.horizontalRule( attributes ); - } - finally - { - sink.close(); - } - - assertEquals( "<hr /><hr style=\"bold\" />", writer.toString() ); - } - - /** - * Test of table method, of class XhtmlBaseSink. - */ - @Test - public void testTable() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.table( attributes ); - sink.table_(); - } - finally - { - sink.close(); - } - - assertEquals( "</table>", writer.toString() ); - } - - /** - * Test of tableRows method, of class XhtmlBaseSink. - */ - @Test - public void testTableRows() - { - final int[] justification = null; - final boolean grid = false; - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.tableRows( justification, grid ); - sink.tableRows_(); - } - finally - { - sink.close(); - } - - assertEquals( "<table border=\"0\" class=\"bodyTable\">", writer.toString() ); - } - - /** - * Test of tableRow method, of class XhtmlBaseSink. - */ - @Test - public void testTableRow() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.tableRow( attributes ); - sink.tableRow_(); - } - finally - { - sink.close(); - } - - assertEquals( "<tr class=\"a\" style=\"bold\"></tr>", writer.toString() ); - } - - /** - * Test of tableCell method, of class XhtmlBaseSink. - */ - @Test - public void testTableCell() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.tableCell( attributes ); - sink.tableCell_(); - } - finally - { - sink.close(); - } - - assertEquals( "<td style=\"bold\"></td>", writer.toString() ); - } - - /** - * Test of tableHeaderCell method, of class XhtmlBaseSink. - */ - @Test - public void testTableHeaderCell() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.tableHeaderCell( attributes ); - sink.tableHeaderCell_(); - } - finally - { - sink.close(); - } - - assertEquals( "<th style=\"bold\"></th>", writer.toString() ); - } - - /** - * Test of tableCaption method, of class XhtmlBaseSink. - */ - @Test - public void testTableCaption() - { - try - { - sink = new XhtmlBaseSink( writer ); - - sink.table(); - sink.tableRows( null, false ); - sink.tableCaption( attributes ); - sink.text( "caption" ); - sink.tableCaption_(); - sink.tableRows_(); - sink.table_(); - } - finally - { - sink.close(); - } - - assertEquals( - "<table border=\"0\" class=\"bodyTable\">" + "<caption style=\"bold\">caption</caption></table>", - writer.toString() ); - } - - /** - * Test of anchor method, of class XhtmlBaseSink. - */ - @Test - public void testAnchor() - { - String name = "anchor"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.anchor( name, attributes ); - sink.anchor_(); - } - finally - { - sink.close(); - } - - assertEquals( "<a name=\"anchor\" style=\"bold\"></a>", writer.toString() ); - } - - /** - * Test of link method, of class XhtmlBaseSink. - */ - @Test - public void testLink() - { - final String name = "link.html"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.link( name, attributes ); - sink.link_(); - } - finally - { - sink.close(); - } - - assertEquals( "<a href=\"link.html\" style=\"bold\"></a>", writer.toString() ); - } - - /** - * Test of italic/bold/monospaced method, of class XhtmlBaseSink. - */ - @Test - public void testItalic() - { - try - { - sink = new XhtmlBaseSink( writer ); - sink.inline( SinkEventAttributeSet.Semantics.ITALIC ); - sink.inline_(); - sink.inline( SinkEventAttributeSet.Semantics.BOLD ); - sink.inline_(); - sink.inline( SinkEventAttributeSet.Semantics.MONOSPACED ); - sink.inline_(); - } - finally - { - sink.close(); - } - - assertEquals( "<i></i><b></b><tt></tt>", writer.toString() ); - } - - /** - * Test of lineBreak/pageBreak/nonBreakingSpace method, of class XhtmlBaseSink. - */ - @Test - public void testLineBreak() - { - try - { - sink = new XhtmlBaseSink( writer ); - sink.lineBreak( attributes ); - sink.pageBreak(); - sink.nonBreakingSpace(); - } - finally - { - sink.close(); - } - - assertEquals( "<br style=\"bold\" /><!-- PB --> ", writer.toString() ); - } - - /** - * Test of text method, of class XhtmlBaseSink. - */ - @Test - public void testText() - { - String text = "a text & \u00c6"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.text( text ); - } - finally - { - sink.close(); - } - - assertEquals( "a text & Æ", writer.toString() ); - - writer = new StringWriter(); - - try - { - sink = new XhtmlBaseSink( writer ); - sink.text( text, attributes ); - } - finally - { - sink.close(); - } - - assertEquals( "a text & Æ", writer.toString() ); - } - - /** - * Test of rawText method, of class XhtmlBaseSink. - */ - @Test - public void testRawText() - { - String text = "raw text"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.rawText( text ); - } - finally - { - sink.close(); - } - - assertEquals( "raw text", writer.toString() ); - } - - /** - * Test of comment method, of class XhtmlBaseSink. - */ - @Test - public void testComment() - { - try - { - sink = new XhtmlBaseSink( writer ); - sink.comment( "a comment" ); - sink.comment( " a comment" ); - sink.comment( "a comment " ); - sink.comment( " a comment " ); - } - finally - { - sink.close(); - } - - assertEquals( "<!--a comment--><!-- a comment--><!--a comment --><!-- a comment -->", - writer.toString() ); - } - - /** - * Test of unknown method, of class XhtmlBaseSink. - */ - @Test - public void testUnknown() - { - final String name = "unknown"; - final Object[] requiredParams = null; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.unknown( name, requiredParams, attributes ); - } - finally - { - sink.close(); - } - - assertEquals( "", writer.toString() ); - } - - /** - * Test entities in attribute values. - */ - @Test - public void testAttributeEntities() - { - final Object[] startTag = new Object[] { XhtmlBaseSink.TAG_TYPE_START }; - final Object[] endTag = new Object[] { XhtmlBaseSink.TAG_TYPE_END }; - final String script = XhtmlBaseSink.SCRIPT.toString(); - final SinkEventAttributes src = new SinkEventAttributeSet( SinkEventAttributes.SRC, - "http://ex.com/ex.js?v=l&l=e" ); - - try - { - sink = new XhtmlBaseSink( writer ); - - sink.unknown( script, startTag, src ); - sink.unknown( script, endTag, null ); - - sink.figureGraphics( "http://ex.com/ex.jpg?v=l&l=e", src ); - } - finally - { - sink.close(); - } - - String result = writer.toString(); - - assertTrue( result.contains( "ex.js?v=l&l=e" ) ); - assertTrue( result.contains( "ex.jpg?v=l&l=e" ) ); - } - - /** - * Test of entity. - */ - @Test - public void testEntity() - { - // DOXIA-314 - String text = "a text '𝟭'"; - - try - { - sink = new XhtmlBaseSink( writer ); - sink.text( text ); - } - finally - { - sink.close(); - } - - assertEquals( "a text '𝟭'", writer.toString() ); - } - - /** - * Test unicode chracters in tables. DOXIA-433. - */ - @Test - public void testSpecialCharacters() - { - try - { - sink = new XhtmlBaseSink( writer ); - sink.table( null ); - sink.tableRows( null, true ); - sink.tableRow( null ); - sink.tableCell(); - sink.text( "\u2713", null ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRows_(); - sink.table_(); - } - finally - { - sink.close(); - } - - final String result = writer.toString(); - - assertTrue( result.contains( "✓" ) ); - } -} diff --git a/doxia-modules/doxia-module-xhtml5/src/main/java/org/apache/maven/doxia/module/xhtml5/Xhtml5ParserModule.java b/doxia-modules/doxia-module-xhtml5/src/main/java/org/apache/maven/doxia/module/xhtml5/Xhtml5ParserModule.java index 6bc58b2b..2ee5c2bb 100644 --- a/doxia-modules/doxia-module-xhtml5/src/main/java/org/apache/maven/doxia/module/xhtml5/Xhtml5ParserModule.java +++ b/doxia-modules/doxia-module-xhtml5/src/main/java/org/apache/maven/doxia/module/xhtml5/Xhtml5ParserModule.java @@ -28,7 +28,7 @@ import org.apache.maven.doxia.parser.module.AbstractParserModule; * <p>Xhtml5ParserModule class.</p> */ @Singleton -@Named( "xhtml5" ) +@Named( "xhtml" ) public class Xhtml5ParserModule extends AbstractParserModule { @@ -37,6 +37,6 @@ public class Xhtml5ParserModule */ public Xhtml5ParserModule() { - super( "xhtml5" ); + super( "xhtml" ); } } diff --git a/doxia-modules/pom.xml b/doxia-modules/pom.xml index 574772f2..3352dc6c 100644 --- a/doxia-modules/pom.xml +++ b/doxia-modules/pom.xml @@ -37,7 +37,6 @@ under the License. <module>doxia-module-apt</module> <module>doxia-module-fml</module> <module>doxia-module-xdoc</module> - <module>doxia-module-xhtml</module> <module>doxia-module-xhtml5</module> <module>doxia-module-markdown</module> </modules>
