You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/06/18 19:01:55 UTC
[maven-doxia] branch default-xhtml5 updated (6f72b427 -> b51ca66d)
This is an automated email from the ASF dual-hosted git repository.
michaelo pushed a change to branch default-xhtml5
in repository https://gitbox.apache.org/repos/asf/maven-doxia.git
discard 6f72b427 Remove/Disable XHTML(4)
discard 895e678e Stupid replacement
add 6538b6e2 [DOXIA-658] Upgrade test dependencies
add 9be64968 [DOXIA-659] Upgrade Parent to 36
add 9443d815 [DOXIA-656] Make XHTML5 default implementation of HTML
add ca82243f [DOXIA-657] Deprecate XHML(4) module
new b51ca66d Remove/Disable XHTML(4)
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (6f72b427)
\
N -- N -- N refs/heads/default-xhtml5 (b51ca66d)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
doxia-core/pom.xml | 2 +-
...ml5BaseSinkTest.java => XhtmlBaseSinkTest.java} | 666 ++++-----------------
.../doxia/module/xhtml/AbstractXhtmlSink.java | 1 +
.../maven/doxia/module/xhtml/XhtmlMarkup.java | 1 +
.../maven/doxia/module/xhtml/XhtmlParser.java | 1 +
.../doxia/module/xhtml/XhtmlParserModule.java | 1 +
.../apache/maven/doxia/module/xhtml/XhtmlSink.java | 1 +
.../maven/doxia/module/xhtml/XhtmlSinkFactory.java | 1 +
.../doxia/module/xhtml/XhtmlIdentityTest.java | 1 +
.../maven/doxia/module/xhtml/XhtmlParserTest.java | 1 +
.../maven/doxia/module/xhtml/XhtmlSinkTest.java | 1 +
.../module/xhtml/XhtmlSinkWithLanguageIdTest.java | 1 +
pom.xml | 4 +-
13 files changed, 115 insertions(+), 567 deletions(-)
copy doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/{Xhtml5BaseSinkTest.java => XhtmlBaseSinkTest.java} (54%)
[maven-doxia] 01/01: Remove/Disable XHTML(4)
Posted by mi...@apache.org.
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 b51ca66d602988eb6709477e573250ba64ace0b3
Author: Michael Osipov <mi...@apache.org>
AuthorDate: Sat May 28 22:19:28 2022 +0200
Remove/Disable XHTML(4)
---
.../apache/maven/doxia/parser/XhtmlBaseParser.java | 1242 -----------
.../maven/doxia/sink/impl/XhtmlBaseSink.java | 2229 --------------------
.../maven/doxia/parser/XhtmlBaseParserTest.java | 772 -------
doxia-modules/pom.xml | 1 -
4 files changed, 4244 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 109189dd..00000000
--- a/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
+++ /dev/null
@@ -1,1242 +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:jason@maven.org">Jason van Zyl</a>
- * @author ltheussl
- * @since 1.1
- */
-@Deprecated
-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 8bccda25..00000000
--- a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
+++ /dev/null
@@ -1,2229 +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
- */
-@Deprecated
-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/parser/XhtmlBaseParserTest.java b/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
deleted file mode 100644
index d2f7d138..00000000
--- a/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
+++ /dev/null
@@ -1,772 +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.util.Iterator;
-
-import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
-import org.apache.maven.doxia.sink.impl.SinkEventElement;
-import org.apache.maven.doxia.sink.impl.SinkEventTestingSink;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Test for XhtmlBaseParser.
- *
- * @author ltheussl
- * @since 1.1
- */
-@Deprecated
-public class XhtmlBaseParserTest
- extends AbstractParserTest
-{
- private XhtmlBaseParser parser;
- private final SinkEventTestingSink sink = new SinkEventTestingSink();
-
-
- @Override
- protected Parser createParser()
- {
- parser = new XhtmlBaseParser();
- return parser;
- }
-
- @Override
- protected String outputExtension()
- {
- return "xhtml";
- }
-
- @BeforeEach
- protected void setUp() throws Exception
- {
- parser = new XhtmlBaseParser();
- sink.reset();
- }
-
- /** @throws Exception */
- @Test
- public void testHeadingEventsList()
- throws Exception
- {
- String text = "<p><h1></h1><h2></h2><h3></h3><h4></h4><h5></h5><h1></h1></p>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "section1", it.next().getName() );
- assertEquals( "sectionTitle1", it.next().getName() );
- assertEquals( "sectionTitle1_", it.next().getName() );
- assertEquals( "section2", it.next().getName() );
- assertEquals( "sectionTitle2", it.next().getName() );
- assertEquals( "sectionTitle2_", it.next().getName() );
- assertEquals( "section3", it.next().getName() );
- assertEquals( "sectionTitle3", it.next().getName() );
- assertEquals( "sectionTitle3_", it.next().getName() );
- assertEquals( "section4", it.next().getName() );
- assertEquals( "sectionTitle4", it.next().getName() );
- assertEquals( "sectionTitle4_", it.next().getName() );
- assertEquals( "section5", it.next().getName() );
- assertEquals( "sectionTitle5", it.next().getName() );
- assertEquals( "sectionTitle5_", it.next().getName() );
- assertEquals( "section5_", it.next().getName() );
- assertEquals( "section4_", it.next().getName() );
- assertEquals( "section3_", it.next().getName() );
- assertEquals( "section2_", it.next().getName() );
- assertEquals( "section1_", it.next().getName() );
- assertEquals( "section1", it.next().getName() );
- assertEquals( "sectionTitle1", it.next().getName() );
- assertEquals( "sectionTitle1_", it.next().getName() );
- // this one is missing because we enclose everything in <p> which is not valid xhtml,
- // needs to be tested in overriding parser, eg XhtmlParser, XdocParser.
- //assertEquals( "section1_", it.next().getName() );
- assertEquals( "paragraph_", it.next().getName() );
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testNestedHeadingEventsList()
- throws Exception
- {
- // DOXIA-241
- String text = "<p><h1></h1><h5></h5><h2></h2></p>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "section1", it.next().getName() );
- assertEquals( "sectionTitle1", it.next().getName() );
- assertEquals( "sectionTitle1_", it.next().getName() );
-
- assertEquals( "section2", it.next().getName() );
- assertEquals( "section3", it.next().getName() );
- assertEquals( "section4", it.next().getName() );
-
- assertEquals( "section5", it.next().getName() );
- assertEquals( "sectionTitle5", it.next().getName() );
- assertEquals( "sectionTitle5_", it.next().getName() );
- assertEquals( "section5_", it.next().getName() );
-
- assertEquals( "section4_", it.next().getName() );
- assertEquals( "section3_", it.next().getName() );
- assertEquals( "section2_", it.next().getName() );
-
- assertEquals( "section2", it.next().getName() );
- assertEquals( "sectionTitle2", it.next().getName() );
- assertEquals( "sectionTitle2_", it.next().getName() );
- // these two are missing because we enclose everything in <p> which is not valid xhtml,
- // needs to be tested in overriding parser, eg XhtmlParser, XdocParser.
- //assertEquals( "section2_", it.next().getName() );
- //assertEquals( "section1_", it.next().getName() );
- assertEquals( "paragraph_", it.next().getName() );
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testFigureEventsList()
- throws Exception
- {
- String text = "<img src=\"source\" title=\"caption\" />";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "figureGraphics", it.next().getName() );
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testTableEventsList()
- throws Exception
- {
- // TODO: table caption, see DOXIA-177
-
- String text = "<table align=\"center\"><tr><th>Header</th></tr><tr><td>cell</td></tr></table>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "table", it.next().getName() );
- assertEquals( "tableRows", it.next().getName() );
- assertEquals( "tableRow", it.next().getName() );
- assertEquals( "tableHeaderCell", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "tableHeaderCell_", it.next().getName() );
- assertEquals( "tableRow_", it.next().getName() );
- assertEquals( "tableRow", it.next().getName() );
- assertEquals( "tableCell", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "tableCell_", it.next().getName() );
- assertEquals( "tableRow_", it.next().getName() );
- assertEquals( "tableRows_", it.next().getName() );
- assertEquals( "table_", it.next().getName() );
-
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testSignificantWhiteSpace()
- throws Exception
- {
- // NOTE significant white space
- String text = "<p><b>word</b> <i>word</i></p>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "inline", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
-
- SinkEventElement el = it.next();
- assertEquals( "text", el.getName() );
- assertEquals( " ", (String) el.getArgs()[0] );
-
- assertEquals( "inline", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "paragraph_", it.next().getName() );
- assertFalse( it.hasNext() );
-
-
- // same test with EOL
- String eol = System.getProperty( "line.separator" );
- text = "<p><b>word</b>" + eol + "<i>word</i></p>";
-
- sink.reset();
- parser.parse( text, sink );
- it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "inline", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
-
- el = it.next();
- assertEquals( "text", el.getName() );
- // according to section 2.11 of the XML spec, parsers must normalize line breaks to "\n"
- assertEquals( "\n", (String) el.getArgs()[0] );
-
- assertEquals( "inline", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "paragraph_", it.next().getName() );
- assertFalse( it.hasNext() );
-
-
- // DOXIA-189: there should be no EOL after closing tag
- text = "<p>There should be no space after the last <i>word</i>.</p>";
-
- sink.reset();
- parser.parse( text, sink );
- it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
-
- el = it.next();
- assertEquals( "text", el.getName() );
- assertEquals( ".", (String) el.getArgs()[0] );
-
- assertEquals( "paragraph_", it.next().getName() );
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testPreFormattedText()
- throws Exception
- {
- String text = "<pre><a href=\"what.html\">what</a></pre>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
- assertEquals( "verbatim", it.next().getName() );
- assertEquals( "link", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "link_", it.next().getName() );
- assertEquals( "verbatim_", it.next().getName() );
- assertFalse( it.hasNext() );
-
- text = "<pre><![CDATA[<a href=\"what.html\">what</a>]]></pre>";
- sink.reset();
- parser.parse( text, sink );
-
- it = sink.getEventList().iterator();
- assertEquals( "verbatim", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "verbatim_", it.next().getName() );
- assertFalse( it.hasNext() );
-
- text = "<pre><![CDATA[<pre>what</pre>]]></pre>";
- sink.reset();
- parser.parse( text, sink );
-
- it = sink.getEventList().iterator();
- assertEquals( "verbatim", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "verbatim_", it.next().getName() );
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testPreEOL()
- throws Exception
- {
- // test EOLs within <pre>: the sink MUST receive a text event for the EOL
- String text = "<pre><a href=\"what.html\">what</a>" + XhtmlBaseParser.EOL
- + "<a href=\"what.html\">what</a></pre>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "verbatim", it.next().getName() );
- assertEquals( "link", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "link_", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "link", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "link_", it.next().getName() );
- assertEquals( "verbatim_", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testDoxia250()
- throws Exception
- {
- StringBuilder sb = new StringBuilder();
- sb.append( "<!DOCTYPE test [" ).append( XhtmlBaseParser.EOL );
- sb.append( "<!ENTITY foo \"ř\">" ).append( XhtmlBaseParser.EOL );
- sb.append( "<!ENTITY foo1 \" \">" ).append( XhtmlBaseParser.EOL );
- sb.append( "<!ENTITY foo2 \"š\">" ).append( XhtmlBaseParser.EOL );
- sb.append( "<!ENTITY tritPos \"𝟭\">" ).append( XhtmlBaseParser.EOL );
- sb.append( "]>" ).append( XhtmlBaseParser.EOL );
- sb.append( "<b>&foo;&foo1;&foo2;&tritPos;</b>" );
-
- parser.setValidate( false );
- parser.parse( sb.toString(), sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- SinkEventElement event = it.next();
- assertEquals( "inline", event.getName() );
-
- event = it.next();
- assertEquals( "text", event.getName() );
- assertEquals( "\u0159", (String) event.getArgs()[0] );
-
- event = it.next();
- assertEquals( "text", event.getName() );
- assertEquals( "\u00A0", (String) event.getArgs()[0] );
-
- event = it.next();
- assertEquals( "text", event.getName() );
- assertEquals( "\u0161", (String) event.getArgs()[0] );
-
- event = it.next();
- assertEquals( "text", event.getName() );
- assertEquals( "\uD835\uDFED", (String) event.getArgs()[0] );
-
- event = it.next();
- assertEquals( "inline_", event.getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testEntities()
- throws Exception
- {
- final String text = "<!DOCTYPE test [<!ENTITY flo \"ř\"><!ENTITY tritPos \"𝟭\"><!ENTITY fo \"A\"><!ENTITY myCustom \"&fo;\">]>"
- + "<body><h1>&&flo;ř&tritPos;𝟭</h1><p>&&flo;ř&tritPos;𝟭&myCustom;</p></body>";
-
- parser.setValidate( false );
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "section1", it.next().getName() );
- assertEquals( "sectionTitle1", it.next().getName() );
-
- SinkEventElement textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "&", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u0159", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u0159", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\uD835\uDFED", (String) textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\uD835\uDFED", textEvt.getArgs()[0] );
-
- assertEquals( "sectionTitle1_", it.next().getName() );
- assertEquals( "paragraph", it.next().getName() );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "&", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u0159", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u0159", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\uD835\uDFED", (String) textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\uD835\uDFED", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "A", textEvt.getArgs()[0] );
-
- assertEquals( "paragraph_", it.next().getName() );
-
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testXhtmlEntities()
- throws Exception
- {
- final String text = "<body><h1>«®</h1><p>“’Φ←</p></body>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "section1", it.next().getName() );
- assertEquals( "sectionTitle1", it.next().getName() );
-
- // Couple symbols from Latin-1:
- // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Latin-1_characters
-
- SinkEventElement textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u00AB", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u00AE", textEvt.getArgs()[0] );
-
- assertEquals( "sectionTitle1_", it.next().getName() );
- assertEquals( "paragraph", it.next().getName() );
-
- // Couple symbols from Special characters:
- // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u201C", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u2019", textEvt.getArgs()[0] );
-
- // Couple symbols from Symbols:
- // http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Symbols
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u03A6", textEvt.getArgs()[0] );
-
- textEvt = it.next();
- assertEquals( "text", textEvt.getName() );
- assertEquals( "\u2190", textEvt.getArgs()[0] );
-
- assertEquals( "paragraph_", it.next().getName() );
-
- assertFalse( it.hasNext() );
- }
-
- /** @throws Exception */
- @Test
- public void testLists()
- throws Exception
- {
- String text = "<div><ul><li></li></ul><ol><li></li></ol><dl><dt></dt><dd></dd></dl></div>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "list", it.next().getName() );
- assertEquals( "listItem", it.next().getName() );
- assertEquals( "listItem_", it.next().getName() );
- assertEquals( "list_", it.next().getName() );
-
- assertEquals( "numberedList", it.next().getName() );
- assertEquals( "numberedListItem", it.next().getName() );
- assertEquals( "numberedListItem_", it.next().getName() );
- assertEquals( "numberedList_", it.next().getName() );
-
- assertEquals( "definitionList", it.next().getName() );
- assertEquals( "definitionListItem", it.next().getName() );
- assertEquals( "definedTerm", it.next().getName() );
- assertEquals( "definedTerm_", it.next().getName() );
- assertEquals( "definition", it.next().getName() );
- assertEquals( "definition_", it.next().getName() );
- assertEquals( "definitionListItem_", it.next().getName() );
- assertEquals( "definitionList_", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testSimpleTags()
- throws Exception
- {
- String text = "<div><br/><hr/><img src=\"img.src\"/></div>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "lineBreak", it.next().getName() );
- assertEquals( "horizontalRule", it.next().getName() );
- assertEquals( "figureGraphics", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testSemanticTags()
- throws Exception
- {
- String text = "<s><i><b><code><samp><sup><sub><u>a text & Æ</u></sub></sup></samp></code></b></i></s>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- SinkEventElement event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=line-through", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=italic", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=bold", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=code", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=code", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=superscript", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=subscript", event.getArgs()[0].toString().trim() );
-
- event = it.next();
- assertEquals( "inline", event.getName() );
- assertEquals( "semantics=annotation", event.getArgs()[0].toString().trim() );
-
- assertEquals( "text", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "text", it.next().getName() );
- assertEquals( "text", it.next().getName() );
-
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
- assertEquals( "inline_", it.next().getName() );
-
- }
-
- /** @throws Exception */
- @Test
- public void testSpecial()
- throws Exception
- {
- String text = "<p><!-- a pagebreak: --><!-- PB -->  <unknown /></p>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "paragraph", it.next().getName() );
- assertEquals( "comment", it.next().getName() );
- assertEquals( "pageBreak", it.next().getName() );
- assertEquals( "nonBreakingSpace", it.next().getName() );
- assertEquals( "nonBreakingSpace", it.next().getName() );
- // unknown events are not reported by the base parser
- assertEquals( "paragraph_", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testTable()
- throws Exception
- {
- String text = "<table><caption></caption><tr><th></th></tr><tr><td></td></tr></table>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "table", it.next().getName() );
-
- // DOXIA-374
- SinkEventElement el = it.next();
- assertEquals( "tableRows", el.getName() );
- assertFalse( (Boolean) el.getArgs()[1] );
-
- assertEquals( "tableCaption", it.next().getName() );
- assertEquals( "tableCaption_", it.next().getName() );
- assertEquals( "tableRow", it.next().getName() );
- assertEquals( "tableHeaderCell", it.next().getName() );
- assertEquals( "tableHeaderCell_", it.next().getName() );
- assertEquals( "tableRow_", it.next().getName() );
- assertEquals( "tableRow", it.next().getName() );
- assertEquals( "tableCell", it.next().getName() );
- assertEquals( "tableCell_", it.next().getName() );
- assertEquals( "tableRow_", it.next().getName() );
- assertEquals( "tableRows_", it.next().getName() );
- assertEquals( "table_", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testFigure()
- throws Exception
- {
- String text = "<div class=\"figure\"><p><img src=\"src.jpg\"/></p><p><i></i></p></div>";
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- assertEquals( "figure", it.next().getName() );
- assertEquals( "figureGraphics", it.next().getName() );
- assertEquals( "figureCaption", it.next().getName() );
- assertEquals( "figureCaption_", it.next().getName() );
- assertEquals( "figure_", it.next().getName() );
- }
-
- /** @throws Exception */
- @Test
- public void testAnchorLink()
- throws Exception
- {
- String text = "<div><a href=\"\"></a>" +
- "<a href=\"valid\"></a>" +
- "<a href=\"#1invalid\"></a>" +
- "<a href=\"http://www.fo.com/index.html#1invalid\"></a>" +
- "<a name=\"valid\"></a>" +
- "<a name=\"1invalid\"></a>" +
- "<a id=\"1invalid\"></a></div>";
-
- parser.parse( text, sink );
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- SinkEventElement element = it.next();
- assertEquals( "link", element.getName() );
- assertEquals( "", element.getArgs()[0] );
- assertEquals( "link_", it.next().getName() );
-
- element = it.next();
- assertEquals( "link", element.getName() );
- assertEquals( "valid", element.getArgs()[0] );
- assertEquals( "link_", it.next().getName() );
-
- element = it.next();
- assertEquals( "link", element.getName() );
- assertEquals( "#a1invalid", element.getArgs()[0] );
- assertEquals( "link_", it.next().getName() );
-
- element = it.next();
- assertEquals( "link", element.getName() );
- assertEquals( "http://www.fo.com/index.html#1invalid", element.getArgs()[0] );
- assertEquals( "link_", it.next().getName() );
-
- element = it.next();
- assertEquals( "anchor", element.getName() );
- assertEquals( "valid", element.getArgs()[0] );
- assertEquals( "anchor_", it.next().getName() );
-
- element = it.next();
- assertEquals( "anchor", element.getName() );
- assertEquals( "a1invalid", element.getArgs()[0] );
- assertEquals( "anchor_", it.next().getName() );
-
- element = it.next();
- assertEquals( "anchor", element.getName() );
- assertEquals( "a1invalid", element.getArgs()[0] );
- assertEquals( "anchor_", it.next().getName() );
- }
-
- /**
- * Test entities in attributes.
- *
- * @throws java.lang.Exception if any.
- */
- @Test
- public void testAttributeEntities()
- throws Exception
- {
- String text = "<script type=\"text/javascript\" src=\"http://ex.com/ex.js?v=l&l=e\"></script>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
-
- SinkEventElement event = it.next();
-
- assertEquals( "unknown", event.getName() );
- assertEquals( "script", event.getArgs()[0] );
- SinkEventAttributeSet attribs = (SinkEventAttributeSet) event.getArgs()[2];
- // ampersand should be un-escaped
- assertEquals( "http://ex.com/ex.js?v=l&l=e", attribs.getAttribute( "src" ) );
- assertEquals( "unknown", it.next().getName() );
- assertFalse( it.hasNext() );
-
- sink.reset();
- text = "<img src=\"http://ex.com/ex.jpg?v=l&l=e\" alt=\"image\"/>";
- parser.parse( text, sink );
-
- it = sink.getEventList().iterator();
- event = it.next();
- assertEquals( "figureGraphics", event.getName() );
- attribs = (SinkEventAttributeSet) event.getArgs()[1];
- // ampersand should be un-escaped
- assertEquals( "http://ex.com/ex.jpg?v=l&l=e", attribs.getAttribute( "src" ) );
- }
-
- @Test
- public void testUnbalancedDefinitionListItem() throws Exception
- {
- String text = "<body><dl><dt>key</dt><dd>value</dd></dl>" +
- "<dl><dd>value</dd></dl>" +
- "<dl><dt>key</dt></dl>" +
- "<dl></dl>" +
- "<dl><dd>value</dd><dt>key</dt></dl></body>";
-
- parser.parse( text, sink );
-
- Iterator<SinkEventElement> it = sink.getEventList().iterator();
- assertSinkStartsWith( it, "definitionList", "definitionListItem", "definedTerm", "text", "definedTerm_",
- "definition", "text", "definition_", "definitionListItem_", "definitionList_" );
- assertSinkStartsWith( it, "definitionList", "definitionListItem", "definition", "text", "definition_",
- "definitionListItem_", "definitionList_" );
- assertSinkStartsWith( it, "definitionList", "definitionListItem", "definedTerm", "text", "definedTerm_",
- "definitionListItem_", "definitionList_" );
- assertSinkStartsWith( it, "definitionList", "definitionList_" );
- assertSinkEquals( it, "definitionList", "definitionListItem", "definition", "text", "definition_",
- "definitionListItem_", "definitionListItem", "definedTerm", "text", "definedTerm_",
- "definitionListItem_", "definitionList_" );
- }
-}
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>