Modified: 
maven/website/components/plugin-tools-archives/plugin-tools-LATEST/maven-plugin-tools-generators/apidocs/src-html/org/apache/maven/tools/plugin/generator/GeneratorUtils.html
==============================================================================
--- 
maven/website/components/plugin-tools-archives/plugin-tools-LATEST/maven-plugin-tools-generators/apidocs/src-html/org/apache/maven/tools/plugin/generator/GeneratorUtils.html
 (original)
+++ 
maven/website/components/plugin-tools-archives/plugin-tools-LATEST/maven-plugin-tools-generators/apidocs/src-html/org/apache/maven/tools/plugin/generator/GeneratorUtils.html
 Sat Mar 30 02:00:43 2024
@@ -42,531 +42,532 @@
 <span class="sourceLineNo">033</span><a id="line.33">import 
java.util.LinkedList;</a>
 <span class="sourceLineNo">034</span><a id="line.34">import java.util.List;</a>
 <span class="sourceLineNo">035</span><a id="line.35">import java.util.Map;</a>
-<span class="sourceLineNo">036</span><a id="line.36">import 
java.util.Stack;</a>
-<span class="sourceLineNo">037</span><a id="line.37">import 
java.util.regex.Matcher;</a>
-<span class="sourceLineNo">038</span><a id="line.38">import 
java.util.regex.Pattern;</a>
-<span class="sourceLineNo">039</span><a id="line.39"></a>
-<span class="sourceLineNo">040</span><a id="line.40">import 
org.apache.maven.artifact.Artifact;</a>
-<span class="sourceLineNo">041</span><a id="line.41">import 
org.apache.maven.plugin.descriptor.MojoDescriptor;</a>
-<span class="sourceLineNo">042</span><a id="line.42">import 
org.apache.maven.plugin.descriptor.PluginDescriptor;</a>
-<span class="sourceLineNo">043</span><a id="line.43">import 
org.apache.maven.project.MavenProject;</a>
-<span class="sourceLineNo">044</span><a id="line.44">import 
org.apache.maven.tools.plugin.util.PluginUtils;</a>
-<span class="sourceLineNo">045</span><a id="line.45">import 
org.codehaus.plexus.component.repository.ComponentDependency;</a>
-<span class="sourceLineNo">046</span><a id="line.46">import 
org.codehaus.plexus.util.StringUtils;</a>
-<span class="sourceLineNo">047</span><a id="line.47">import 
org.codehaus.plexus.util.xml.XMLWriter;</a>
-<span class="sourceLineNo">048</span><a id="line.48">import 
org.w3c.tidy.Tidy;</a>
-<span class="sourceLineNo">049</span><a id="line.49"></a>
-<span class="sourceLineNo">050</span><a id="line.50">/**</a>
-<span class="sourceLineNo">051</span><a id="line.51"> * Convenience methods to 
play with Maven plugins.</a>
-<span class="sourceLineNo">052</span><a id="line.52"> *</a>
-<span class="sourceLineNo">053</span><a id="line.53"> * @author jdcasey</a>
-<span class="sourceLineNo">054</span><a id="line.54"> */</a>
-<span class="sourceLineNo">055</span><a id="line.55">public final class 
GeneratorUtils {</a>
-<span class="sourceLineNo">056</span><a id="line.56">    private 
GeneratorUtils() {</a>
-<span class="sourceLineNo">057</span><a id="line.57">        // nop</a>
-<span class="sourceLineNo">058</span><a id="line.58">    }</a>
-<span class="sourceLineNo">059</span><a id="line.59"></a>
-<span class="sourceLineNo">060</span><a id="line.60">    /**</a>
-<span class="sourceLineNo">061</span><a id="line.61">     * @param w not null 
writer</a>
-<span class="sourceLineNo">062</span><a id="line.62">     * @param 
pluginDescriptor not null</a>
-<span class="sourceLineNo">063</span><a id="line.63">     */</a>
-<span class="sourceLineNo">064</span><a id="line.64">    public static void 
writeDependencies(XMLWriter w, PluginDescriptor pluginDescriptor) {</a>
-<span class="sourceLineNo">065</span><a id="line.65">        
w.startElement("dependencies");</a>
-<span class="sourceLineNo">066</span><a id="line.66"></a>
-<span class="sourceLineNo">067</span><a id="line.67">        
List&lt;ComponentDependency&gt; deps = pluginDescriptor.getDependencies();</a>
-<span class="sourceLineNo">068</span><a id="line.68">        for 
(ComponentDependency dep : deps) {</a>
-<span class="sourceLineNo">069</span><a id="line.69">            
w.startElement("dependency");</a>
-<span class="sourceLineNo">070</span><a id="line.70"></a>
-<span class="sourceLineNo">071</span><a id="line.71">            element(w, 
"groupId", dep.getGroupId());</a>
-<span class="sourceLineNo">072</span><a id="line.72"></a>
-<span class="sourceLineNo">073</span><a id="line.73">            element(w, 
"artifactId", dep.getArtifactId());</a>
-<span class="sourceLineNo">074</span><a id="line.74"></a>
-<span class="sourceLineNo">075</span><a id="line.75">            element(w, 
"type", dep.getType());</a>
-<span class="sourceLineNo">076</span><a id="line.76"></a>
-<span class="sourceLineNo">077</span><a id="line.77">            element(w, 
"version", dep.getVersion());</a>
-<span class="sourceLineNo">078</span><a id="line.78"></a>
-<span class="sourceLineNo">079</span><a id="line.79">            
w.endElement();</a>
-<span class="sourceLineNo">080</span><a id="line.80">        }</a>
-<span class="sourceLineNo">081</span><a id="line.81"></a>
-<span class="sourceLineNo">082</span><a id="line.82">        
w.endElement();</a>
-<span class="sourceLineNo">083</span><a id="line.83">    }</a>
-<span class="sourceLineNo">084</span><a id="line.84"></a>
-<span class="sourceLineNo">085</span><a id="line.85">    /**</a>
-<span class="sourceLineNo">086</span><a id="line.86">     * @param w not null 
writer</a>
-<span class="sourceLineNo">087</span><a id="line.87">     * @param name  not 
null</a>
-<span class="sourceLineNo">088</span><a id="line.88">     * @param value could 
be null</a>
-<span class="sourceLineNo">089</span><a id="line.89">     */</a>
-<span class="sourceLineNo">090</span><a id="line.90">    public static void 
element(XMLWriter w, String name, String value) {</a>
-<span class="sourceLineNo">091</span><a id="line.91">        
w.startElement(name);</a>
-<span class="sourceLineNo">092</span><a id="line.92"></a>
-<span class="sourceLineNo">093</span><a id="line.93">        if (value == 
null) {</a>
-<span class="sourceLineNo">094</span><a id="line.94">            value = 
"";</a>
-<span class="sourceLineNo">095</span><a id="line.95">        }</a>
-<span class="sourceLineNo">096</span><a id="line.96"></a>
-<span class="sourceLineNo">097</span><a id="line.97">        
w.writeText(value);</a>
-<span class="sourceLineNo">098</span><a id="line.98"></a>
-<span class="sourceLineNo">099</span><a id="line.99">        
w.endElement();</a>
-<span class="sourceLineNo">100</span><a id="line.100">    }</a>
-<span class="sourceLineNo">101</span><a id="line.101"></a>
-<span class="sourceLineNo">102</span><a id="line.102">    /**</a>
-<span class="sourceLineNo">103</span><a id="line.103">     * @param artifacts 
not null collection of &lt;code&gt;Artifact&lt;/code&gt;</a>
-<span class="sourceLineNo">104</span><a id="line.104">     * @return list of 
component dependencies, without in provided scope</a>
-<span class="sourceLineNo">105</span><a id="line.105">     */</a>
-<span class="sourceLineNo">106</span><a id="line.106">    public static 
List&lt;ComponentDependency&gt; 
toComponentDependencies(Collection&lt;Artifact&gt; artifacts) {</a>
-<span class="sourceLineNo">107</span><a id="line.107">        
List&lt;ComponentDependency&gt; componentDeps = new LinkedList&lt;&gt;();</a>
-<span class="sourceLineNo">108</span><a id="line.108"></a>
-<span class="sourceLineNo">109</span><a id="line.109">        for (Artifact 
artifact : artifacts) {</a>
-<span class="sourceLineNo">110</span><a id="line.110">            if 
(Artifact.SCOPE_PROVIDED.equals(artifact.getScope())) {</a>
-<span class="sourceLineNo">111</span><a id="line.111">                
continue;</a>
-<span class="sourceLineNo">112</span><a id="line.112">            }</a>
-<span class="sourceLineNo">113</span><a id="line.113"></a>
-<span class="sourceLineNo">114</span><a id="line.114">            
ComponentDependency cd = new ComponentDependency();</a>
-<span class="sourceLineNo">115</span><a id="line.115"></a>
-<span class="sourceLineNo">116</span><a id="line.116">            
cd.setArtifactId(artifact.getArtifactId());</a>
-<span class="sourceLineNo">117</span><a id="line.117">            
cd.setGroupId(artifact.getGroupId());</a>
-<span class="sourceLineNo">118</span><a id="line.118">            
cd.setVersion(artifact.getVersion());</a>
-<span class="sourceLineNo">119</span><a id="line.119">            
cd.setType(artifact.getType());</a>
-<span class="sourceLineNo">120</span><a id="line.120"></a>
-<span class="sourceLineNo">121</span><a id="line.121">            
componentDeps.add(cd);</a>
-<span class="sourceLineNo">122</span><a id="line.122">        }</a>
-<span class="sourceLineNo">123</span><a id="line.123"></a>
-<span class="sourceLineNo">124</span><a id="line.124">        return 
componentDeps;</a>
-<span class="sourceLineNo">125</span><a id="line.125">    }</a>
-<span class="sourceLineNo">126</span><a id="line.126"></a>
-<span class="sourceLineNo">127</span><a id="line.127">    /**</a>
-<span class="sourceLineNo">128</span><a id="line.128">     * Returns a literal 
replacement &lt;code&gt;String&lt;/code&gt; for the specified 
&lt;code&gt;String&lt;/code&gt;. This method</a>
-<span class="sourceLineNo">129</span><a id="line.129">     * produces a 
&lt;code&gt;String&lt;/code&gt; that will work as a literal replacement 
&lt;code&gt;s&lt;/code&gt; in the</a>
-<span class="sourceLineNo">130</span><a id="line.130">     * 
&lt;code&gt;appendReplacement&lt;/code&gt; method of the {@link Matcher} class. 
The &lt;code&gt;String&lt;/code&gt; produced will</a>
-<span class="sourceLineNo">131</span><a id="line.131">     * match the 
sequence of characters in &lt;code&gt;s&lt;/code&gt; treated as a literal 
sequence. Slashes ('\') and dollar</a>
-<span class="sourceLineNo">132</span><a id="line.132">     * signs ('$') will 
be given no special meaning. TODO: copied from Matcher class of Java 1.5, 
remove once target</a>
-<span class="sourceLineNo">133</span><a id="line.133">     * platform can be 
upgraded</a>
-<span class="sourceLineNo">134</span><a id="line.134">     *</a>
-<span class="sourceLineNo">135</span><a id="line.135">     * @see &lt;a 
href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html"&gt;java.util.regex.Matcher&lt;/a&gt;</a>
-<span class="sourceLineNo">136</span><a id="line.136">     * @param s The 
string to be literalized</a>
-<span class="sourceLineNo">137</span><a id="line.137">     * @return A literal 
string replacement</a>
-<span class="sourceLineNo">138</span><a id="line.138">     */</a>
-<span class="sourceLineNo">139</span><a id="line.139">    private static 
String quoteReplacement(String s) {</a>
-<span class="sourceLineNo">140</span><a id="line.140">        if 
((s.indexOf('\\') == -1) &amp;&amp; (s.indexOf('$') == -1)) {</a>
-<span class="sourceLineNo">141</span><a id="line.141">            return s;</a>
-<span class="sourceLineNo">142</span><a id="line.142">        }</a>
-<span class="sourceLineNo">143</span><a id="line.143"></a>
-<span class="sourceLineNo">144</span><a id="line.144">        StringBuilder sb 
= new StringBuilder();</a>
-<span class="sourceLineNo">145</span><a id="line.145">        for (int i = 0; 
i &lt; s.length(); i++) {</a>
-<span class="sourceLineNo">146</span><a id="line.146">            char c = 
s.charAt(i);</a>
-<span class="sourceLineNo">147</span><a id="line.147">            if (c == 
'\\') {</a>
-<span class="sourceLineNo">148</span><a id="line.148">                
sb.append('\\');</a>
+<span class="sourceLineNo">036</span><a id="line.36">import 
java.util.Objects;</a>
+<span class="sourceLineNo">037</span><a id="line.37">import 
java.util.Stack;</a>
+<span class="sourceLineNo">038</span><a id="line.38">import 
java.util.regex.Matcher;</a>
+<span class="sourceLineNo">039</span><a id="line.39">import 
java.util.regex.Pattern;</a>
+<span class="sourceLineNo">040</span><a id="line.40"></a>
+<span class="sourceLineNo">041</span><a id="line.41">import 
org.apache.maven.artifact.Artifact;</a>
+<span class="sourceLineNo">042</span><a id="line.42">import 
org.apache.maven.plugin.descriptor.MojoDescriptor;</a>
+<span class="sourceLineNo">043</span><a id="line.43">import 
org.apache.maven.plugin.descriptor.PluginDescriptor;</a>
+<span class="sourceLineNo">044</span><a id="line.44">import 
org.apache.maven.project.MavenProject;</a>
+<span class="sourceLineNo">045</span><a id="line.45">import 
org.apache.maven.tools.plugin.util.PluginUtils;</a>
+<span class="sourceLineNo">046</span><a id="line.46">import 
org.codehaus.plexus.component.repository.ComponentDependency;</a>
+<span class="sourceLineNo">047</span><a id="line.47">import 
org.codehaus.plexus.util.StringUtils;</a>
+<span class="sourceLineNo">048</span><a id="line.48">import 
org.codehaus.plexus.util.xml.XMLWriter;</a>
+<span class="sourceLineNo">049</span><a id="line.49">import 
org.w3c.tidy.Tidy;</a>
+<span class="sourceLineNo">050</span><a id="line.50"></a>
+<span class="sourceLineNo">051</span><a id="line.51">/**</a>
+<span class="sourceLineNo">052</span><a id="line.52"> * Convenience methods to 
play with Maven plugins.</a>
+<span class="sourceLineNo">053</span><a id="line.53"> *</a>
+<span class="sourceLineNo">054</span><a id="line.54"> * @author jdcasey</a>
+<span class="sourceLineNo">055</span><a id="line.55"> */</a>
+<span class="sourceLineNo">056</span><a id="line.56">public final class 
GeneratorUtils {</a>
+<span class="sourceLineNo">057</span><a id="line.57">    private 
GeneratorUtils() {</a>
+<span class="sourceLineNo">058</span><a id="line.58">        // nop</a>
+<span class="sourceLineNo">059</span><a id="line.59">    }</a>
+<span class="sourceLineNo">060</span><a id="line.60"></a>
+<span class="sourceLineNo">061</span><a id="line.61">    /**</a>
+<span class="sourceLineNo">062</span><a id="line.62">     * @param w not null 
writer</a>
+<span class="sourceLineNo">063</span><a id="line.63">     * @param 
pluginDescriptor not null</a>
+<span class="sourceLineNo">064</span><a id="line.64">     */</a>
+<span class="sourceLineNo">065</span><a id="line.65">    public static void 
writeDependencies(XMLWriter w, PluginDescriptor pluginDescriptor) {</a>
+<span class="sourceLineNo">066</span><a id="line.66">        
w.startElement("dependencies");</a>
+<span class="sourceLineNo">067</span><a id="line.67"></a>
+<span class="sourceLineNo">068</span><a id="line.68">        
List&lt;ComponentDependency&gt; deps = pluginDescriptor.getDependencies();</a>
+<span class="sourceLineNo">069</span><a id="line.69">        for 
(ComponentDependency dep : deps) {</a>
+<span class="sourceLineNo">070</span><a id="line.70">            
w.startElement("dependency");</a>
+<span class="sourceLineNo">071</span><a id="line.71"></a>
+<span class="sourceLineNo">072</span><a id="line.72">            element(w, 
"groupId", dep.getGroupId());</a>
+<span class="sourceLineNo">073</span><a id="line.73"></a>
+<span class="sourceLineNo">074</span><a id="line.74">            element(w, 
"artifactId", dep.getArtifactId());</a>
+<span class="sourceLineNo">075</span><a id="line.75"></a>
+<span class="sourceLineNo">076</span><a id="line.76">            element(w, 
"type", dep.getType());</a>
+<span class="sourceLineNo">077</span><a id="line.77"></a>
+<span class="sourceLineNo">078</span><a id="line.78">            element(w, 
"version", dep.getVersion());</a>
+<span class="sourceLineNo">079</span><a id="line.79"></a>
+<span class="sourceLineNo">080</span><a id="line.80">            
w.endElement();</a>
+<span class="sourceLineNo">081</span><a id="line.81">        }</a>
+<span class="sourceLineNo">082</span><a id="line.82"></a>
+<span class="sourceLineNo">083</span><a id="line.83">        
w.endElement();</a>
+<span class="sourceLineNo">084</span><a id="line.84">    }</a>
+<span class="sourceLineNo">085</span><a id="line.85"></a>
+<span class="sourceLineNo">086</span><a id="line.86">    /**</a>
+<span class="sourceLineNo">087</span><a id="line.87">     * @param w not null 
writer</a>
+<span class="sourceLineNo">088</span><a id="line.88">     * @param name  not 
null</a>
+<span class="sourceLineNo">089</span><a id="line.89">     * @param value could 
be null</a>
+<span class="sourceLineNo">090</span><a id="line.90">     */</a>
+<span class="sourceLineNo">091</span><a id="line.91">    public static void 
element(XMLWriter w, String name, String value) {</a>
+<span class="sourceLineNo">092</span><a id="line.92">        
w.startElement(name);</a>
+<span class="sourceLineNo">093</span><a id="line.93"></a>
+<span class="sourceLineNo">094</span><a id="line.94">        if (value == 
null) {</a>
+<span class="sourceLineNo">095</span><a id="line.95">            value = 
"";</a>
+<span class="sourceLineNo">096</span><a id="line.96">        }</a>
+<span class="sourceLineNo">097</span><a id="line.97"></a>
+<span class="sourceLineNo">098</span><a id="line.98">        
w.writeText(value);</a>
+<span class="sourceLineNo">099</span><a id="line.99"></a>
+<span class="sourceLineNo">100</span><a id="line.100">        
w.endElement();</a>
+<span class="sourceLineNo">101</span><a id="line.101">    }</a>
+<span class="sourceLineNo">102</span><a id="line.102"></a>
+<span class="sourceLineNo">103</span><a id="line.103">    /**</a>
+<span class="sourceLineNo">104</span><a id="line.104">     * @param artifacts 
not null collection of &lt;code&gt;Artifact&lt;/code&gt;</a>
+<span class="sourceLineNo">105</span><a id="line.105">     * @return list of 
component dependencies, without in provided scope</a>
+<span class="sourceLineNo">106</span><a id="line.106">     */</a>
+<span class="sourceLineNo">107</span><a id="line.107">    public static 
List&lt;ComponentDependency&gt; 
toComponentDependencies(Collection&lt;Artifact&gt; artifacts) {</a>
+<span class="sourceLineNo">108</span><a id="line.108">        
List&lt;ComponentDependency&gt; componentDeps = new LinkedList&lt;&gt;();</a>
+<span class="sourceLineNo">109</span><a id="line.109"></a>
+<span class="sourceLineNo">110</span><a id="line.110">        for (Artifact 
artifact : artifacts) {</a>
+<span class="sourceLineNo">111</span><a id="line.111">            if 
(Artifact.SCOPE_PROVIDED.equals(artifact.getScope())) {</a>
+<span class="sourceLineNo">112</span><a id="line.112">                
continue;</a>
+<span class="sourceLineNo">113</span><a id="line.113">            }</a>
+<span class="sourceLineNo">114</span><a id="line.114"></a>
+<span class="sourceLineNo">115</span><a id="line.115">            
ComponentDependency cd = new ComponentDependency();</a>
+<span class="sourceLineNo">116</span><a id="line.116"></a>
+<span class="sourceLineNo">117</span><a id="line.117">            
cd.setArtifactId(artifact.getArtifactId());</a>
+<span class="sourceLineNo">118</span><a id="line.118">            
cd.setGroupId(artifact.getGroupId());</a>
+<span class="sourceLineNo">119</span><a id="line.119">            
cd.setVersion(artifact.getVersion());</a>
+<span class="sourceLineNo">120</span><a id="line.120">            
cd.setType(artifact.getType());</a>
+<span class="sourceLineNo">121</span><a id="line.121"></a>
+<span class="sourceLineNo">122</span><a id="line.122">            
componentDeps.add(cd);</a>
+<span class="sourceLineNo">123</span><a id="line.123">        }</a>
+<span class="sourceLineNo">124</span><a id="line.124"></a>
+<span class="sourceLineNo">125</span><a id="line.125">        return 
componentDeps;</a>
+<span class="sourceLineNo">126</span><a id="line.126">    }</a>
+<span class="sourceLineNo">127</span><a id="line.127"></a>
+<span class="sourceLineNo">128</span><a id="line.128">    /**</a>
+<span class="sourceLineNo">129</span><a id="line.129">     * Returns a literal 
replacement &lt;code&gt;String&lt;/code&gt; for the specified 
&lt;code&gt;String&lt;/code&gt;. This method</a>
+<span class="sourceLineNo">130</span><a id="line.130">     * produces a 
&lt;code&gt;String&lt;/code&gt; that will work as a literal replacement 
&lt;code&gt;s&lt;/code&gt; in the</a>
+<span class="sourceLineNo">131</span><a id="line.131">     * 
&lt;code&gt;appendReplacement&lt;/code&gt; method of the {@link Matcher} class. 
The &lt;code&gt;String&lt;/code&gt; produced will</a>
+<span class="sourceLineNo">132</span><a id="line.132">     * match the 
sequence of characters in &lt;code&gt;s&lt;/code&gt; treated as a literal 
sequence. Slashes ('\') and dollar</a>
+<span class="sourceLineNo">133</span><a id="line.133">     * signs ('$') will 
be given no special meaning. TODO: copied from Matcher class of Java 1.5, 
remove once target</a>
+<span class="sourceLineNo">134</span><a id="line.134">     * platform can be 
upgraded</a>
+<span class="sourceLineNo">135</span><a id="line.135">     *</a>
+<span class="sourceLineNo">136</span><a id="line.136">     * @see &lt;a 
href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html"&gt;java.util.regex.Matcher&lt;/a&gt;</a>
+<span class="sourceLineNo">137</span><a id="line.137">     * @param s The 
string to be literalized</a>
+<span class="sourceLineNo">138</span><a id="line.138">     * @return A literal 
string replacement</a>
+<span class="sourceLineNo">139</span><a id="line.139">     */</a>
+<span class="sourceLineNo">140</span><a id="line.140">    private static 
String quoteReplacement(String s) {</a>
+<span class="sourceLineNo">141</span><a id="line.141">        if 
((s.indexOf('\\') == -1) &amp;&amp; (s.indexOf('$') == -1)) {</a>
+<span class="sourceLineNo">142</span><a id="line.142">            return s;</a>
+<span class="sourceLineNo">143</span><a id="line.143">        }</a>
+<span class="sourceLineNo">144</span><a id="line.144"></a>
+<span class="sourceLineNo">145</span><a id="line.145">        StringBuilder sb 
= new StringBuilder();</a>
+<span class="sourceLineNo">146</span><a id="line.146">        for (int i = 0; 
i &lt; s.length(); i++) {</a>
+<span class="sourceLineNo">147</span><a id="line.147">            char c = 
s.charAt(i);</a>
+<span class="sourceLineNo">148</span><a id="line.148">            if (c == 
'\\') {</a>
 <span class="sourceLineNo">149</span><a id="line.149">                
sb.append('\\');</a>
-<span class="sourceLineNo">150</span><a id="line.150">            } else if (c 
== '$') {</a>
-<span class="sourceLineNo">151</span><a id="line.151">                
sb.append('\\');</a>
-<span class="sourceLineNo">152</span><a id="line.152">                
sb.append('$');</a>
-<span class="sourceLineNo">153</span><a id="line.153">            } else {</a>
-<span class="sourceLineNo">154</span><a id="line.154">                
sb.append(c);</a>
-<span class="sourceLineNo">155</span><a id="line.155">            }</a>
-<span class="sourceLineNo">156</span><a id="line.156">        }</a>
-<span class="sourceLineNo">157</span><a id="line.157"></a>
-<span class="sourceLineNo">158</span><a id="line.158">        return 
sb.toString();</a>
-<span class="sourceLineNo">159</span><a id="line.159">    }</a>
-<span class="sourceLineNo">160</span><a id="line.160"></a>
-<span class="sourceLineNo">161</span><a id="line.161">    /**</a>
-<span class="sourceLineNo">162</span><a id="line.162">     * Decodes javadoc 
inline tags into equivalent HTML tags. For instance, the inline tag "{@code 
&lt;A&amp;B&gt;}" should be</a>
-<span class="sourceLineNo">163</span><a id="line.163">     * rendered as 
"&lt;code&gt;&amp;lt;A&amp;amp;B&amp;gt;&lt;/code&gt;".</a>
-<span class="sourceLineNo">164</span><a id="line.164">     *</a>
-<span class="sourceLineNo">165</span><a id="line.165">     * @param 
description The javadoc description to decode, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">166</span><a id="line.166">     * @return The 
decoded description, never &lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">167</span><a id="line.167">     * @deprecated Only 
used for non java extractor</a>
-<span class="sourceLineNo">168</span><a id="line.168">     */</a>
-<span class="sourceLineNo">169</span><a id="line.169">    @Deprecated</a>
-<span class="sourceLineNo">170</span><a id="line.170">    static String 
decodeJavadocTags(String description) {</a>
-<span class="sourceLineNo">171</span><a id="line.171">        if (description 
== null || description.isEmpty()) {</a>
-<span class="sourceLineNo">172</span><a id="line.172">            return 
"";</a>
-<span class="sourceLineNo">173</span><a id="line.173">        }</a>
-<span class="sourceLineNo">174</span><a id="line.174"></a>
-<span class="sourceLineNo">175</span><a id="line.175">        StringBuffer 
decoded = new StringBuffer(description.length() + 1024);</a>
-<span class="sourceLineNo">176</span><a id="line.176"></a>
-<span class="sourceLineNo">177</span><a id="line.177">        Matcher matcher 
= Pattern.compile("\\{@(\\w+)\\s*([^\\}]*)\\}").matcher(description);</a>
-<span class="sourceLineNo">178</span><a id="line.178">        while 
(matcher.find()) {</a>
-<span class="sourceLineNo">179</span><a id="line.179">            String tag = 
matcher.group(1);</a>
-<span class="sourceLineNo">180</span><a id="line.180">            String text 
= matcher.group(2);</a>
-<span class="sourceLineNo">181</span><a id="line.181">            text = 
StringUtils.replace(text, "&amp;", "&amp;amp;");</a>
-<span class="sourceLineNo">182</span><a id="line.182">            text = 
StringUtils.replace(text, "&lt;", "&amp;lt;");</a>
-<span class="sourceLineNo">183</span><a id="line.183">            text = 
StringUtils.replace(text, "&gt;", "&amp;gt;");</a>
-<span class="sourceLineNo">184</span><a id="line.184">            if 
("code".equals(tag)) {</a>
-<span class="sourceLineNo">185</span><a id="line.185">                text = 
"&lt;code&gt;" + text + "&lt;/code&gt;";</a>
-<span class="sourceLineNo">186</span><a id="line.186">            } else if 
("link".equals(tag) || "linkplain".equals(tag) || "value".equals(tag)) {</a>
-<span class="sourceLineNo">187</span><a id="line.187">                String 
pattern = "(([^#\\.\\s]+\\.)*([^#\\.\\s]+))?" + 
"(#([^\\(\\s]*)(\\([^\\)]*\\))?\\s*(\\S.*)?)?";</a>
-<span class="sourceLineNo">188</span><a id="line.188">                final 
int label = 7;</a>
-<span class="sourceLineNo">189</span><a id="line.189">                final 
int clazz = 3;</a>
-<span class="sourceLineNo">190</span><a id="line.190">                final 
int member = 5;</a>
-<span class="sourceLineNo">191</span><a id="line.191">                final 
int args = 6;</a>
-<span class="sourceLineNo">192</span><a id="line.192">                Matcher 
link = Pattern.compile(pattern).matcher(text);</a>
-<span class="sourceLineNo">193</span><a id="line.193">                if 
(link.matches()) {</a>
-<span class="sourceLineNo">194</span><a id="line.194">                    text 
= link.group(label);</a>
-<span class="sourceLineNo">195</span><a id="line.195">                    if 
(text == null || text.isEmpty()) {</a>
-<span class="sourceLineNo">196</span><a id="line.196">                        
text = link.group(clazz);</a>
-<span class="sourceLineNo">197</span><a id="line.197">                        
if (text == null || text.isEmpty()) {</a>
-<span class="sourceLineNo">198</span><a id="line.198">                         
   text = "";</a>
-<span class="sourceLineNo">199</span><a id="line.199">                        
}</a>
-<span class="sourceLineNo">200</span><a id="line.200">                        
if (StringUtils.isNotEmpty(link.group(member))) {</a>
-<span class="sourceLineNo">201</span><a id="line.201">                         
   if (text != null &amp;&amp; !text.isEmpty()) {</a>
-<span class="sourceLineNo">202</span><a id="line.202">                         
       text += '.';</a>
-<span class="sourceLineNo">203</span><a id="line.203">                         
   }</a>
-<span class="sourceLineNo">204</span><a id="line.204">                         
   text += link.group(member);</a>
-<span class="sourceLineNo">205</span><a id="line.205">                         
   if (StringUtils.isNotEmpty(link.group(args))) {</a>
-<span class="sourceLineNo">206</span><a id="line.206">                         
       text += "()";</a>
-<span class="sourceLineNo">207</span><a id="line.207">                         
   }</a>
-<span class="sourceLineNo">208</span><a id="line.208">                        
}</a>
-<span class="sourceLineNo">209</span><a id="line.209">                    }</a>
-<span class="sourceLineNo">210</span><a id="line.210">                }</a>
-<span class="sourceLineNo">211</span><a id="line.211">                if 
(!"linkplain".equals(tag)) {</a>
-<span class="sourceLineNo">212</span><a id="line.212">                    text 
= "&lt;code&gt;" + text + "&lt;/code&gt;";</a>
-<span class="sourceLineNo">213</span><a id="line.213">                }</a>
-<span class="sourceLineNo">214</span><a id="line.214">            }</a>
-<span class="sourceLineNo">215</span><a id="line.215">            
matcher.appendReplacement(decoded, (text != null) ? quoteReplacement(text) : 
"");</a>
-<span class="sourceLineNo">216</span><a id="line.216">        }</a>
-<span class="sourceLineNo">217</span><a id="line.217">        
matcher.appendTail(decoded);</a>
-<span class="sourceLineNo">218</span><a id="line.218"></a>
-<span class="sourceLineNo">219</span><a id="line.219">        return 
decoded.toString();</a>
-<span class="sourceLineNo">220</span><a id="line.220">    }</a>
-<span class="sourceLineNo">221</span><a id="line.221"></a>
-<span class="sourceLineNo">222</span><a id="line.222">    /**</a>
-<span class="sourceLineNo">223</span><a id="line.223">     * Fixes some 
javadoc comment to become a valid XHTML snippet.</a>
-<span class="sourceLineNo">224</span><a id="line.224">     *</a>
-<span class="sourceLineNo">225</span><a id="line.225">     * @param 
description Javadoc description with HTML tags, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">226</span><a id="line.226">     * @return The 
description with valid XHTML tags, never &lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">227</span><a id="line.227">     * @deprecated 
Redundant for java extractor</a>
-<span class="sourceLineNo">228</span><a id="line.228">     */</a>
-<span class="sourceLineNo">229</span><a id="line.229">    @Deprecated</a>
-<span class="sourceLineNo">230</span><a id="line.230">    public static String 
makeHtmlValid(String description) {</a>
-<span class="sourceLineNo">231</span><a id="line.231"></a>
-<span class="sourceLineNo">232</span><a id="line.232">        if (description 
== null || description.isEmpty()) {</a>
-<span class="sourceLineNo">233</span><a id="line.233">            return 
"";</a>
-<span class="sourceLineNo">234</span><a id="line.234">        }</a>
-<span class="sourceLineNo">235</span><a id="line.235"></a>
-<span class="sourceLineNo">236</span><a id="line.236">        String 
commentCleaned = decodeJavadocTags(description);</a>
-<span class="sourceLineNo">237</span><a id="line.237"></a>
-<span class="sourceLineNo">238</span><a id="line.238">        // Using jTidy 
to clean comment</a>
-<span class="sourceLineNo">239</span><a id="line.239">        Tidy tidy = new 
Tidy();</a>
-<span class="sourceLineNo">240</span><a id="line.240">        
tidy.setDocType("loose");</a>
-<span class="sourceLineNo">241</span><a id="line.241">        
tidy.setXHTML(true);</a>
-<span class="sourceLineNo">242</span><a id="line.242">        
tidy.setXmlOut(true);</a>
-<span class="sourceLineNo">243</span><a id="line.243">        
tidy.setInputEncoding("UTF-8");</a>
-<span class="sourceLineNo">244</span><a id="line.244">        
tidy.setOutputEncoding("UTF-8");</a>
-<span class="sourceLineNo">245</span><a id="line.245">        
tidy.setMakeClean(true);</a>
-<span class="sourceLineNo">246</span><a id="line.246">        
tidy.setNumEntities(true);</a>
-<span class="sourceLineNo">247</span><a id="line.247">        
tidy.setQuoteNbsp(false);</a>
-<span class="sourceLineNo">248</span><a id="line.248">        
tidy.setQuiet(true);</a>
-<span class="sourceLineNo">249</span><a id="line.249">        
tidy.setShowWarnings(true);</a>
-<span class="sourceLineNo">250</span><a id="line.250"></a>
-<span class="sourceLineNo">251</span><a id="line.251">        
ByteArrayOutputStream out = new ByteArrayOutputStream(commentCleaned.length() + 
256);</a>
-<span class="sourceLineNo">252</span><a id="line.252">        tidy.parse(new 
ByteArrayInputStream(commentCleaned.getBytes(StandardCharsets.UTF_8)), out);</a>
-<span class="sourceLineNo">253</span><a id="line.253">        commentCleaned = 
new String(out.toByteArray(), StandardCharsets.UTF_8);</a>
-<span class="sourceLineNo">254</span><a id="line.254"></a>
-<span class="sourceLineNo">255</span><a id="line.255">        if 
(commentCleaned == null || commentCleaned.isEmpty()) {</a>
-<span class="sourceLineNo">256</span><a id="line.256">            return 
"";</a>
-<span class="sourceLineNo">257</span><a id="line.257">        }</a>
-<span class="sourceLineNo">258</span><a id="line.258"></a>
-<span class="sourceLineNo">259</span><a id="line.259">        // strip the 
header/body stuff</a>
-<span class="sourceLineNo">260</span><a id="line.260">        String ls = 
System.getProperty("line.separator");</a>
-<span class="sourceLineNo">261</span><a id="line.261">        int startPos = 
commentCleaned.indexOf("&lt;body&gt;" + ls) + 6 + ls.length();</a>
-<span class="sourceLineNo">262</span><a id="line.262">        int endPos = 
commentCleaned.indexOf(ls + "&lt;/body&gt;");</a>
-<span class="sourceLineNo">263</span><a id="line.263">        commentCleaned = 
commentCleaned.substring(startPos, endPos);</a>
-<span class="sourceLineNo">264</span><a id="line.264"></a>
-<span class="sourceLineNo">265</span><a id="line.265">        return 
commentCleaned;</a>
-<span class="sourceLineNo">266</span><a id="line.266">    }</a>
-<span class="sourceLineNo">267</span><a id="line.267"></a>
-<span class="sourceLineNo">268</span><a id="line.268">    /**</a>
-<span class="sourceLineNo">269</span><a id="line.269">     * Converts a HTML 
fragment as extracted from a javadoc comment to a plain text string. This 
method tries to retain</a>
-<span class="sourceLineNo">270</span><a id="line.270">     * as much of the 
text formatting as possible by means of the following transformations:</a>
-<span class="sourceLineNo">271</span><a id="line.271">     * &lt;ul&gt;</a>
-<span class="sourceLineNo">272</span><a id="line.272">     * &lt;li&gt;List 
items are converted to leading tabs (U+0009), followed by the item 
number/bullet, another tab and</a>
-<span class="sourceLineNo">273</span><a id="line.273">     * finally the item 
contents. Each tab denotes an increase of indentation.&lt;/li&gt;</a>
-<span class="sourceLineNo">274</span><a id="line.274">     * &lt;li&gt;Flow 
breaking elements as well as literal line terminators in preformatted text are 
converted to a newline</a>
-<span class="sourceLineNo">275</span><a id="line.275">     * (U+000A) to 
denote a mandatory line break.&lt;/li&gt;</a>
-<span class="sourceLineNo">276</span><a id="line.276">     * 
&lt;li&gt;Consecutive spaces and line terminators from character data outside 
of preformatted text will be normalized</a>
-<span class="sourceLineNo">277</span><a id="line.277">     * to a single 
space. The resulting space denotes a possible point for line 
wrapping.&lt;/li&gt;</a>
-<span class="sourceLineNo">278</span><a id="line.278">     * &lt;li&gt;Each 
space in preformatted text will be converted to a non-breaking space 
(U+00A0).&lt;/li&gt;</a>
-<span class="sourceLineNo">279</span><a id="line.279">     * &lt;/ul&gt;</a>
-<span class="sourceLineNo">280</span><a id="line.280">     *</a>
-<span class="sourceLineNo">281</span><a id="line.281">     * @param html The 
HTML fragment to convert to plain text, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">282</span><a id="line.282">     * @return A string 
with HTML tags converted into pure text, never 
&lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">283</span><a id="line.283">     * @since 2.4.3</a>
-<span class="sourceLineNo">284</span><a id="line.284">     * @deprecated 
Replaced by {@link HtmlToPlainTextConverter}</a>
-<span class="sourceLineNo">285</span><a id="line.285">     */</a>
-<span class="sourceLineNo">286</span><a id="line.286">    @Deprecated</a>
-<span class="sourceLineNo">287</span><a id="line.287">    public static String 
toText(String html) {</a>
-<span class="sourceLineNo">288</span><a id="line.288">        if (html == null 
|| html.isEmpty()) {</a>
-<span class="sourceLineNo">289</span><a id="line.289">            return 
"";</a>
-<span class="sourceLineNo">290</span><a id="line.290">        }</a>
-<span class="sourceLineNo">291</span><a id="line.291"></a>
-<span class="sourceLineNo">292</span><a id="line.292">        final 
StringBuilder sb = new StringBuilder();</a>
-<span class="sourceLineNo">293</span><a id="line.293"></a>
-<span class="sourceLineNo">294</span><a id="line.294">        
HTMLEditorKit.Parser parser = new ParserDelegator();</a>
-<span class="sourceLineNo">295</span><a id="line.295">        
HTMLEditorKit.ParserCallback htmlCallback = new MojoParserCallback(sb);</a>
-<span class="sourceLineNo">296</span><a id="line.296"></a>
-<span class="sourceLineNo">297</span><a id="line.297">        try {</a>
-<span class="sourceLineNo">298</span><a id="line.298">            
parser.parse(new StringReader(makeHtmlValid(html)), htmlCallback, true);</a>
-<span class="sourceLineNo">299</span><a id="line.299">        } catch 
(IOException e) {</a>
-<span class="sourceLineNo">300</span><a id="line.300">            throw new 
RuntimeException(e);</a>
-<span class="sourceLineNo">301</span><a id="line.301">        }</a>
-<span class="sourceLineNo">302</span><a id="line.302"></a>
-<span class="sourceLineNo">303</span><a id="line.303">        return 
sb.toString().replace('\"', '\''); // for CDATA</a>
-<span class="sourceLineNo">304</span><a id="line.304">    }</a>
-<span class="sourceLineNo">305</span><a id="line.305"></a>
-<span class="sourceLineNo">306</span><a id="line.306">    /**</a>
-<span class="sourceLineNo">307</span><a id="line.307">     * ParserCallback 
implementation.</a>
-<span class="sourceLineNo">308</span><a id="line.308">     */</a>
-<span class="sourceLineNo">309</span><a id="line.309">    private static class 
MojoParserCallback extends HTMLEditorKit.ParserCallback {</a>
-<span class="sourceLineNo">310</span><a id="line.310">        /**</a>
-<span class="sourceLineNo">311</span><a id="line.311">         * Holds the 
index of the current item in a numbered list.</a>
-<span class="sourceLineNo">312</span><a id="line.312">         */</a>
-<span class="sourceLineNo">313</span><a id="line.313">        class Counter 
{</a>
-<span class="sourceLineNo">314</span><a id="line.314">            int 
value;</a>
-<span class="sourceLineNo">315</span><a id="line.315">        }</a>
-<span class="sourceLineNo">316</span><a id="line.316"></a>
-<span class="sourceLineNo">317</span><a id="line.317">        /**</a>
-<span class="sourceLineNo">318</span><a id="line.318">         * A flag 
whether the parser is currently in the body element.</a>
-<span class="sourceLineNo">319</span><a id="line.319">         */</a>
-<span class="sourceLineNo">320</span><a id="line.320">        private boolean 
body;</a>
-<span class="sourceLineNo">321</span><a id="line.321"></a>
-<span class="sourceLineNo">322</span><a id="line.322">        /**</a>
-<span class="sourceLineNo">323</span><a id="line.323">         * A flag 
whether the parser is currently processing preformatted text, actually a 
counter to track nesting.</a>
-<span class="sourceLineNo">324</span><a id="line.324">         */</a>
-<span class="sourceLineNo">325</span><a id="line.325">        private int 
preformatted;</a>
-<span class="sourceLineNo">326</span><a id="line.326"></a>
-<span class="sourceLineNo">327</span><a id="line.327">        /**</a>
-<span class="sourceLineNo">328</span><a id="line.328">         * The current 
indentation depth for the output.</a>
-<span class="sourceLineNo">329</span><a id="line.329">         */</a>
-<span class="sourceLineNo">330</span><a id="line.330">        private int 
depth;</a>
-<span class="sourceLineNo">331</span><a id="line.331"></a>
-<span class="sourceLineNo">332</span><a id="line.332">        /**</a>
-<span class="sourceLineNo">333</span><a id="line.333">         * A stack of 
{@link Counter} objects corresponding to the nesting of (un-)ordered lists. 
A</a>
-<span class="sourceLineNo">334</span><a id="line.334">         * 
&lt;code&gt;null&lt;/code&gt; element denotes an unordered list.</a>
-<span class="sourceLineNo">335</span><a id="line.335">         */</a>
-<span class="sourceLineNo">336</span><a id="line.336">        private 
Stack&lt;Counter&gt; numbering = new Stack&lt;&gt;();</a>
-<span class="sourceLineNo">337</span><a id="line.337"></a>
-<span class="sourceLineNo">338</span><a id="line.338">        /**</a>
-<span class="sourceLineNo">339</span><a id="line.339">         * A flag 
whether an implicit line break is pending in the output buffer. This flag is 
used to postpone the</a>
-<span class="sourceLineNo">340</span><a id="line.340">         * output of 
implicit line breaks until we are sure that are not to be merged with other 
implicit line</a>
-<span class="sourceLineNo">341</span><a id="line.341">         * breaks.</a>
-<span class="sourceLineNo">342</span><a id="line.342">         */</a>
-<span class="sourceLineNo">343</span><a id="line.343">        private boolean 
pendingNewline;</a>
-<span class="sourceLineNo">344</span><a id="line.344"></a>
-<span class="sourceLineNo">345</span><a id="line.345">        /**</a>
-<span class="sourceLineNo">346</span><a id="line.346">         * A flag 
whether we have just parsed a simple tag.</a>
-<span class="sourceLineNo">347</span><a id="line.347">         */</a>
-<span class="sourceLineNo">348</span><a id="line.348">        private boolean 
simpleTag;</a>
-<span class="sourceLineNo">349</span><a id="line.349"></a>
-<span class="sourceLineNo">350</span><a id="line.350">        /**</a>
-<span class="sourceLineNo">351</span><a id="line.351">         * The current 
buffer.</a>
-<span class="sourceLineNo">352</span><a id="line.352">         */</a>
-<span class="sourceLineNo">353</span><a id="line.353">        private final 
StringBuilder sb;</a>
-<span class="sourceLineNo">354</span><a id="line.354"></a>
-<span class="sourceLineNo">355</span><a id="line.355">        /**</a>
-<span class="sourceLineNo">356</span><a id="line.356">         * @param sb not 
null</a>
-<span class="sourceLineNo">357</span><a id="line.357">         */</a>
-<span class="sourceLineNo">358</span><a id="line.358">        
MojoParserCallback(StringBuilder sb) {</a>
-<span class="sourceLineNo">359</span><a id="line.359">            this.sb = 
sb;</a>
-<span class="sourceLineNo">360</span><a id="line.360">        }</a>
-<span class="sourceLineNo">361</span><a id="line.361"></a>
-<span class="sourceLineNo">362</span><a id="line.362">        /** 
{@inheritDoc} */</a>
-<span class="sourceLineNo">363</span><a id="line.363">        @Override</a>
-<span class="sourceLineNo">364</span><a id="line.364">        public void 
handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {</a>
-<span class="sourceLineNo">365</span><a id="line.365">            simpleTag = 
true;</a>
-<span class="sourceLineNo">366</span><a id="line.366">            if (body 
&amp;&amp; HTML.Tag.BR.equals(t)) {</a>
-<span class="sourceLineNo">367</span><a id="line.367">                
newline(false);</a>
-<span class="sourceLineNo">368</span><a id="line.368">            }</a>
-<span class="sourceLineNo">369</span><a id="line.369">        }</a>
-<span class="sourceLineNo">370</span><a id="line.370"></a>
-<span class="sourceLineNo">371</span><a id="line.371">        /** 
{@inheritDoc} */</a>
-<span class="sourceLineNo">372</span><a id="line.372">        @Override</a>
-<span class="sourceLineNo">373</span><a id="line.373">        public void 
handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {</a>
-<span class="sourceLineNo">374</span><a id="line.374">            simpleTag = 
false;</a>
-<span class="sourceLineNo">375</span><a id="line.375">            if (body 
&amp;&amp; (t.breaksFlow() || t.isBlock())) {</a>
-<span class="sourceLineNo">376</span><a id="line.376">                
newline(true);</a>
-<span class="sourceLineNo">377</span><a id="line.377">            }</a>
-<span class="sourceLineNo">378</span><a id="line.378">            if 
(HTML.Tag.OL.equals(t)) {</a>
-<span class="sourceLineNo">379</span><a id="line.379">                
numbering.push(new Counter());</a>
-<span class="sourceLineNo">380</span><a id="line.380">            } else if 
(HTML.Tag.UL.equals(t)) {</a>
-<span class="sourceLineNo">381</span><a id="line.381">                
numbering.push(null);</a>
-<span class="sourceLineNo">382</span><a id="line.382">            } else if 
(HTML.Tag.LI.equals(t)) {</a>
-<span class="sourceLineNo">383</span><a id="line.383">                Counter 
counter = numbering.peek();</a>
-<span class="sourceLineNo">384</span><a id="line.384">                if 
(counter == null) {</a>
-<span class="sourceLineNo">385</span><a id="line.385">                    
text("-\t");</a>
-<span class="sourceLineNo">386</span><a id="line.386">                } else 
{</a>
-<span class="sourceLineNo">387</span><a id="line.387">                    
text(++counter.value + ".\t");</a>
-<span class="sourceLineNo">388</span><a id="line.388">                }</a>
-<span class="sourceLineNo">389</span><a id="line.389">                
depth++;</a>
-<span class="sourceLineNo">390</span><a id="line.390">            } else if 
(HTML.Tag.DD.equals(t)) {</a>
-<span class="sourceLineNo">391</span><a id="line.391">                
depth++;</a>
-<span class="sourceLineNo">392</span><a id="line.392">            } else if 
(t.isPreformatted()) {</a>
-<span class="sourceLineNo">393</span><a id="line.393">                
preformatted++;</a>
-<span class="sourceLineNo">394</span><a id="line.394">            } else if 
(HTML.Tag.BODY.equals(t)) {</a>
-<span class="sourceLineNo">395</span><a id="line.395">                body = 
true;</a>
-<span class="sourceLineNo">396</span><a id="line.396">            }</a>
-<span class="sourceLineNo">397</span><a id="line.397">        }</a>
-<span class="sourceLineNo">398</span><a id="line.398"></a>
-<span class="sourceLineNo">399</span><a id="line.399">        /** 
{@inheritDoc} */</a>
-<span class="sourceLineNo">400</span><a id="line.400">        @Override</a>
-<span class="sourceLineNo">401</span><a id="line.401">        public void 
handleEndTag(HTML.Tag t, int pos) {</a>
-<span class="sourceLineNo">402</span><a id="line.402">            if 
(HTML.Tag.OL.equals(t) || HTML.Tag.UL.equals(t)) {</a>
-<span class="sourceLineNo">403</span><a id="line.403">                
numbering.pop();</a>
-<span class="sourceLineNo">404</span><a id="line.404">            } else if 
(HTML.Tag.LI.equals(t) || HTML.Tag.DD.equals(t)) {</a>
-<span class="sourceLineNo">405</span><a id="line.405">                
depth--;</a>
-<span class="sourceLineNo">406</span><a id="line.406">            } else if 
(t.isPreformatted()) {</a>
-<span class="sourceLineNo">407</span><a id="line.407">                
preformatted--;</a>
-<span class="sourceLineNo">408</span><a id="line.408">            } else if 
(HTML.Tag.BODY.equals(t)) {</a>
-<span class="sourceLineNo">409</span><a id="line.409">                body = 
false;</a>
-<span class="sourceLineNo">410</span><a id="line.410">            }</a>
-<span class="sourceLineNo">411</span><a id="line.411">            if (body 
&amp;&amp; (t.breaksFlow() || t.isBlock()) &amp;&amp; !HTML.Tag.LI.equals(t)) 
{</a>
-<span class="sourceLineNo">412</span><a id="line.412">                if 
((HTML.Tag.P.equals(t)</a>
-<span class="sourceLineNo">413</span><a id="line.413">                         
       || HTML.Tag.PRE.equals(t)</a>
-<span class="sourceLineNo">414</span><a id="line.414">                         
       || HTML.Tag.OL.equals(t)</a>
-<span class="sourceLineNo">415</span><a id="line.415">                         
       || HTML.Tag.UL.equals(t)</a>
-<span class="sourceLineNo">416</span><a id="line.416">                         
       || HTML.Tag.DL.equals(t))</a>
-<span class="sourceLineNo">417</span><a id="line.417">                        
&amp;&amp; numbering.isEmpty()) {</a>
-<span class="sourceLineNo">418</span><a id="line.418">                    
pendingNewline = false;</a>
-<span class="sourceLineNo">419</span><a id="line.419">                    
newline(pendingNewline);</a>
-<span class="sourceLineNo">420</span><a id="line.420">                } else 
{</a>
-<span class="sourceLineNo">421</span><a id="line.421">                    
newline(true);</a>
-<span class="sourceLineNo">422</span><a id="line.422">                }</a>
-<span class="sourceLineNo">423</span><a id="line.423">            }</a>
-<span class="sourceLineNo">424</span><a id="line.424">        }</a>
-<span class="sourceLineNo">425</span><a id="line.425"></a>
-<span class="sourceLineNo">426</span><a id="line.426">        /** 
{@inheritDoc} */</a>
-<span class="sourceLineNo">427</span><a id="line.427">        @Override</a>
-<span class="sourceLineNo">428</span><a id="line.428">        public void 
handleText(char[] data, int pos) {</a>
-<span class="sourceLineNo">429</span><a id="line.429">            /*</a>
-<span class="sourceLineNo">430</span><a id="line.430">             * NOTE: 
Parsers before JRE 1.6 will parse XML-conform simple tags like &lt;br/&gt; as 
"&lt;br&gt;" followed by</a>
-<span class="sourceLineNo">431</span><a id="line.431">             * the text 
event "&gt;..." so we need to watch out for the closing angle bracket.</a>
-<span class="sourceLineNo">432</span><a id="line.432">             */</a>
-<span class="sourceLineNo">433</span><a id="line.433">            int offset = 
0;</a>
-<span class="sourceLineNo">434</span><a id="line.434">            if 
(simpleTag &amp;&amp; data[0] == '&gt;') {</a>
-<span class="sourceLineNo">435</span><a id="line.435">                
simpleTag = false;</a>
-<span class="sourceLineNo">436</span><a id="line.436">                for 
(++offset; offset &lt; data.length &amp;&amp; data[offset] &lt;= ' '; ) {</a>
-<span class="sourceLineNo">437</span><a id="line.437">                    
offset++;</a>
-<span class="sourceLineNo">438</span><a id="line.438">                }</a>
-<span class="sourceLineNo">439</span><a id="line.439">            }</a>
-<span class="sourceLineNo">440</span><a id="line.440">            if (offset 
&lt; data.length) {</a>
-<span class="sourceLineNo">441</span><a id="line.441">                String 
text = new String(data, offset, data.length - offset);</a>
-<span class="sourceLineNo">442</span><a id="line.442">                
text(text);</a>
-<span class="sourceLineNo">443</span><a id="line.443">            }</a>
-<span class="sourceLineNo">444</span><a id="line.444">        }</a>
-<span class="sourceLineNo">445</span><a id="line.445"></a>
-<span class="sourceLineNo">446</span><a id="line.446">        /** 
{@inheritDoc} */</a>
-<span class="sourceLineNo">447</span><a id="line.447">        @Override</a>
-<span class="sourceLineNo">448</span><a id="line.448">        public void 
flush() {</a>
-<span class="sourceLineNo">449</span><a id="line.449">            
flushPendingNewline();</a>
-<span class="sourceLineNo">450</span><a id="line.450">        }</a>
-<span class="sourceLineNo">451</span><a id="line.451"></a>
-<span class="sourceLineNo">452</span><a id="line.452">        /**</a>
-<span class="sourceLineNo">453</span><a id="line.453">         * Writes a line 
break to the plain text output.</a>
-<span class="sourceLineNo">454</span><a id="line.454">         *</a>
-<span class="sourceLineNo">455</span><a id="line.455">         * @param 
implicit A flag whether this is an explicit or implicit line break. Explicit 
line breaks are</a>
-<span class="sourceLineNo">456</span><a id="line.456">         *            
always written to the output whereas consecutive implicit line breaks are 
merged into a single</a>
-<span class="sourceLineNo">457</span><a id="line.457">         *            
line break.</a>
-<span class="sourceLineNo">458</span><a id="line.458">         */</a>
-<span class="sourceLineNo">459</span><a id="line.459">        private void 
newline(boolean implicit) {</a>
-<span class="sourceLineNo">460</span><a id="line.460">            if 
(implicit) {</a>
-<span class="sourceLineNo">461</span><a id="line.461">                
pendingNewline = true;</a>
-<span class="sourceLineNo">462</span><a id="line.462">            } else {</a>
-<span class="sourceLineNo">463</span><a id="line.463">                
flushPendingNewline();</a>
-<span class="sourceLineNo">464</span><a id="line.464">                
sb.append('\n');</a>
-<span class="sourceLineNo">465</span><a id="line.465">            }</a>
-<span class="sourceLineNo">466</span><a id="line.466">        }</a>
-<span class="sourceLineNo">467</span><a id="line.467"></a>
-<span class="sourceLineNo">468</span><a id="line.468">        /**</a>
-<span class="sourceLineNo">469</span><a id="line.469">         * Flushes a 
pending newline (if any).</a>
-<span class="sourceLineNo">470</span><a id="line.470">         */</a>
-<span class="sourceLineNo">471</span><a id="line.471">        private void 
flushPendingNewline() {</a>
-<span class="sourceLineNo">472</span><a id="line.472">            if 
(pendingNewline) {</a>
-<span class="sourceLineNo">473</span><a id="line.473">                
pendingNewline = false;</a>
-<span class="sourceLineNo">474</span><a id="line.474">                if 
(sb.length() &gt; 0) {</a>
-<span class="sourceLineNo">475</span><a id="line.475">                    
sb.append('\n');</a>
-<span class="sourceLineNo">476</span><a id="line.476">                }</a>
-<span class="sourceLineNo">477</span><a id="line.477">            }</a>
-<span class="sourceLineNo">478</span><a id="line.478">        }</a>
-<span class="sourceLineNo">479</span><a id="line.479"></a>
-<span class="sourceLineNo">480</span><a id="line.480">        /**</a>
-<span class="sourceLineNo">481</span><a id="line.481">         * Writes the 
specified character data to the plain text output. If the last output was a 
line break, the</a>
-<span class="sourceLineNo">482</span><a id="line.482">         * character 
data will automatically be prefixed with the current indent.</a>
-<span class="sourceLineNo">483</span><a id="line.483">         *</a>
-<span class="sourceLineNo">484</span><a id="line.484">         * @param data 
The character data, must not be &lt;code&gt;null&lt;/code&gt;.</a>
-<span class="sourceLineNo">485</span><a id="line.485">         */</a>
-<span class="sourceLineNo">486</span><a id="line.486">        private void 
text(String data) {</a>
-<span class="sourceLineNo">487</span><a id="line.487">            
flushPendingNewline();</a>
-<span class="sourceLineNo">488</span><a id="line.488">            if 
(sb.length() &lt;= 0 || sb.charAt(sb.length() - 1) == '\n') {</a>
-<span class="sourceLineNo">489</span><a id="line.489">                for (int 
i = 0; i &lt; depth; i++) {</a>
-<span class="sourceLineNo">490</span><a id="line.490">                    
sb.append('\t');</a>
-<span class="sourceLineNo">491</span><a id="line.491">                }</a>
-<span class="sourceLineNo">492</span><a id="line.492">            }</a>
-<span class="sourceLineNo">493</span><a id="line.493">            String 
text;</a>
-<span class="sourceLineNo">494</span><a id="line.494">            if 
(preformatted &gt; 0) {</a>
-<span class="sourceLineNo">495</span><a id="line.495">                text = 
data;</a>
-<span class="sourceLineNo">496</span><a id="line.496">            } else {</a>
-<span class="sourceLineNo">497</span><a id="line.497">                text = 
data.replace('\n', ' ');</a>
-<span class="sourceLineNo">498</span><a id="line.498">            }</a>
-<span class="sourceLineNo">499</span><a id="line.499">            
sb.append(text);</a>
-<span class="sourceLineNo">500</span><a id="line.500">        }</a>
-<span class="sourceLineNo">501</span><a id="line.501">    }</a>
-<span class="sourceLineNo">502</span><a id="line.502"></a>
-<span class="sourceLineNo">503</span><a id="line.503">    /**</a>
-<span class="sourceLineNo">504</span><a id="line.504">     * Find the best 
package name, based on the number of hits of actual Mojo classes.</a>
-<span class="sourceLineNo">505</span><a id="line.505">     *</a>
-<span class="sourceLineNo">506</span><a id="line.506">     * @param 
pluginDescriptor not null</a>
-<span class="sourceLineNo">507</span><a id="line.507">     * @return the best 
name of the package for the generated mojo</a>
-<span class="sourceLineNo">508</span><a id="line.508">     */</a>
-<span class="sourceLineNo">509</span><a id="line.509">    public static String 
discoverPackageName(PluginDescriptor pluginDescriptor) {</a>
-<span class="sourceLineNo">510</span><a id="line.510">        Map&lt;String, 
Integer&gt; packageNames = new HashMap&lt;&gt;();</a>
-<span class="sourceLineNo">511</span><a id="line.511"></a>
-<span class="sourceLineNo">512</span><a id="line.512">        
List&lt;MojoDescriptor&gt; mojoDescriptors = pluginDescriptor.getMojos();</a>
-<span class="sourceLineNo">513</span><a id="line.513">        if 
(mojoDescriptors == null) {</a>
-<span class="sourceLineNo">514</span><a id="line.514">            return 
"";</a>
-<span class="sourceLineNo">515</span><a id="line.515">        }</a>
-<span class="sourceLineNo">516</span><a id="line.516">        for 
(MojoDescriptor descriptor : mojoDescriptors) {</a>
-<span class="sourceLineNo">517</span><a id="line.517"></a>
-<span class="sourceLineNo">518</span><a id="line.518">            String impl 
= descriptor.getImplementation();</a>
-<span class="sourceLineNo">519</span><a id="line.519">            if 
(StringUtils.equals(descriptor.getGoal(), "help") &amp;&amp; 
StringUtils.equals("HelpMojo", impl)) {</a>
-<span class="sourceLineNo">520</span><a id="line.520">                
continue;</a>
-<span class="sourceLineNo">521</span><a id="line.521">            }</a>
-<span class="sourceLineNo">522</span><a id="line.522">            if 
(impl.lastIndexOf('.') != -1) {</a>
-<span class="sourceLineNo">523</span><a id="line.523">                String 
name = impl.substring(0, impl.lastIndexOf('.'));</a>
-<span class="sourceLineNo">524</span><a id="line.524">                if 
(packageNames.get(name) != null) {</a>
-<span class="sourceLineNo">525</span><a id="line.525">                    int 
next = (packageNames.get(name)).intValue() + 1;</a>
-<span class="sourceLineNo">526</span><a id="line.526">                    
packageNames.put(name, Integer.valueOf(next));</a>
-<span class="sourceLineNo">527</span><a id="line.527">                } else 
{</a>
-<span class="sourceLineNo">528</span><a id="line.528">                    
packageNames.put(name, Integer.valueOf(1));</a>
-<span class="sourceLineNo">529</span><a id="line.529">                }</a>
-<span class="sourceLineNo">530</span><a id="line.530">            } else {</a>
-<span class="sourceLineNo">531</span><a id="line.531">                
packageNames.put("", Integer.valueOf(1));</a>
-<span class="sourceLineNo">532</span><a id="line.532">            }</a>
-<span class="sourceLineNo">533</span><a id="line.533">        }</a>
-<span class="sourceLineNo">534</span><a id="line.534"></a>
-<span class="sourceLineNo">535</span><a id="line.535">        String 
packageName = "";</a>
-<span class="sourceLineNo">536</span><a id="line.536">        int max = 0;</a>
-<span class="sourceLineNo">537</span><a id="line.537">        for 
(Map.Entry&lt;String, Integer&gt; entry : packageNames.entrySet()) {</a>
-<span class="sourceLineNo">538</span><a id="line.538">            int value = 
entry.getValue().intValue();</a>
-<span class="sourceLineNo">539</span><a id="line.539">            if (value 
&gt; max) {</a>
-<span class="sourceLineNo">540</span><a id="line.540">                max = 
value;</a>
-<span class="sourceLineNo">541</span><a id="line.541">                
packageName = entry.getKey();</a>
-<span class="sourceLineNo">542</span><a id="line.542">            }</a>
-<span class="sourceLineNo">543</span><a id="line.543">        }</a>
-<span class="sourceLineNo">544</span><a id="line.544"></a>
-<span class="sourceLineNo">545</span><a id="line.545">        return 
packageName;</a>
-<span class="sourceLineNo">546</span><a id="line.546">    }</a>
-<span class="sourceLineNo">547</span><a id="line.547"></a>
-<span class="sourceLineNo">548</span><a id="line.548">    /**</a>
-<span class="sourceLineNo">549</span><a id="line.549">     * @param impl a 
Mojo implementation, not null</a>
-<span class="sourceLineNo">550</span><a id="line.550">     * @param project a 
MavenProject instance, could be null</a>
-<span class="sourceLineNo">551</span><a id="line.551">     * @return 
&lt;code&gt;true&lt;/code&gt; is the Mojo implementation implements 
&lt;code&gt;MavenReport&lt;/code&gt;,</a>
-<span class="sourceLineNo">552</span><a id="line.552">     * 
&lt;code&gt;false&lt;/code&gt; otherwise.</a>
-<span class="sourceLineNo">553</span><a id="line.553">     * @throws 
IllegalArgumentException if any</a>
-<span class="sourceLineNo">554</span><a id="line.554">     * @deprecated Use 
{@link PluginUtils#isMavenReport(String, MavenProject)} instead.</a>
-<span class="sourceLineNo">555</span><a id="line.555">     */</a>
-<span class="sourceLineNo">556</span><a id="line.556">    @Deprecated</a>
-<span class="sourceLineNo">557</span><a id="line.557">    public static 
boolean isMavenReport(String impl, MavenProject project) throws 
IllegalArgumentException {</a>
-<span class="sourceLineNo">558</span><a id="line.558">        return 
PluginUtils.isMavenReport(impl, project);</a>
-<span class="sourceLineNo">559</span><a id="line.559">    }</a>
-<span class="sourceLineNo">560</span><a id="line.560">}</a>
+<span class="sourceLineNo">150</span><a id="line.150">                
sb.append('\\');</a>
+<span class="sourceLineNo">151</span><a id="line.151">            } else if (c 
== '$') {</a>
+<span class="sourceLineNo">152</span><a id="line.152">                
sb.append('\\');</a>
+<span class="sourceLineNo">153</span><a id="line.153">                
sb.append('$');</a>
+<span class="sourceLineNo">154</span><a id="line.154">            } else {</a>
+<span class="sourceLineNo">155</span><a id="line.155">                
sb.append(c);</a>
+<span class="sourceLineNo">156</span><a id="line.156">            }</a>
+<span class="sourceLineNo">157</span><a id="line.157">        }</a>
+<span class="sourceLineNo">158</span><a id="line.158"></a>
+<span class="sourceLineNo">159</span><a id="line.159">        return 
sb.toString();</a>
+<span class="sourceLineNo">160</span><a id="line.160">    }</a>
+<span class="sourceLineNo">161</span><a id="line.161"></a>
+<span class="sourceLineNo">162</span><a id="line.162">    /**</a>
+<span class="sourceLineNo">163</span><a id="line.163">     * Decodes javadoc 
inline tags into equivalent HTML tags. For instance, the inline tag "{@code 
&lt;A&amp;B&gt;}" should be</a>
+<span class="sourceLineNo">164</span><a id="line.164">     * rendered as 
"&lt;code&gt;&amp;lt;A&amp;amp;B&amp;gt;&lt;/code&gt;".</a>
+<span class="sourceLineNo">165</span><a id="line.165">     *</a>
+<span class="sourceLineNo">166</span><a id="line.166">     * @param 
description The javadoc description to decode, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">167</span><a id="line.167">     * @return The 
decoded description, never &lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">168</span><a id="line.168">     * @deprecated Only 
used for non java extractor</a>
+<span class="sourceLineNo">169</span><a id="line.169">     */</a>
+<span class="sourceLineNo">170</span><a id="line.170">    @Deprecated</a>
+<span class="sourceLineNo">171</span><a id="line.171">    static String 
decodeJavadocTags(String description) {</a>
+<span class="sourceLineNo">172</span><a id="line.172">        if (description 
== null || description.isEmpty()) {</a>
+<span class="sourceLineNo">173</span><a id="line.173">            return 
"";</a>
+<span class="sourceLineNo">174</span><a id="line.174">        }</a>
+<span class="sourceLineNo">175</span><a id="line.175"></a>
+<span class="sourceLineNo">176</span><a id="line.176">        StringBuffer 
decoded = new StringBuffer(description.length() + 1024);</a>
+<span class="sourceLineNo">177</span><a id="line.177"></a>
+<span class="sourceLineNo">178</span><a id="line.178">        Matcher matcher 
= Pattern.compile("\\{@(\\w+)\\s*([^\\}]*)\\}").matcher(description);</a>
+<span class="sourceLineNo">179</span><a id="line.179">        while 
(matcher.find()) {</a>
+<span class="sourceLineNo">180</span><a id="line.180">            String tag = 
matcher.group(1);</a>
+<span class="sourceLineNo">181</span><a id="line.181">            String text 
= matcher.group(2);</a>
+<span class="sourceLineNo">182</span><a id="line.182">            text = 
text.replace("&amp;", "&amp;amp;");</a>
+<span class="sourceLineNo">183</span><a id="line.183">            text = 
text.replace("&lt;", "&amp;lt;");</a>
+<span class="sourceLineNo">184</span><a id="line.184">            text = 
text.replace("&gt;", "&amp;gt;");</a>
+<span class="sourceLineNo">185</span><a id="line.185">            if 
("code".equals(tag)) {</a>
+<span class="sourceLineNo">186</span><a id="line.186">                text = 
"&lt;code&gt;" + text + "&lt;/code&gt;";</a>
+<span class="sourceLineNo">187</span><a id="line.187">            } else if 
("link".equals(tag) || "linkplain".equals(tag) || "value".equals(tag)) {</a>
+<span class="sourceLineNo">188</span><a id="line.188">                String 
pattern = "(([^#\\.\\s]+\\.)*([^#\\.\\s]+))?" + 
"(#([^\\(\\s]*)(\\([^\\)]*\\))?\\s*(\\S.*)?)?";</a>
+<span class="sourceLineNo">189</span><a id="line.189">                final 
int label = 7;</a>
+<span class="sourceLineNo">190</span><a id="line.190">                final 
int clazz = 3;</a>
+<span class="sourceLineNo">191</span><a id="line.191">                final 
int member = 5;</a>
+<span class="sourceLineNo">192</span><a id="line.192">                final 
int args = 6;</a>
+<span class="sourceLineNo">193</span><a id="line.193">                Matcher 
link = Pattern.compile(pattern).matcher(text);</a>
+<span class="sourceLineNo">194</span><a id="line.194">                if 
(link.matches()) {</a>
+<span class="sourceLineNo">195</span><a id="line.195">                    text 
= link.group(label);</a>
+<span class="sourceLineNo">196</span><a id="line.196">                    if 
(text == null || text.isEmpty()) {</a>
+<span class="sourceLineNo">197</span><a id="line.197">                        
text = link.group(clazz);</a>
+<span class="sourceLineNo">198</span><a id="line.198">                        
if (text == null || text.isEmpty()) {</a>
+<span class="sourceLineNo">199</span><a id="line.199">                         
   text = "";</a>
+<span class="sourceLineNo">200</span><a id="line.200">                        
}</a>
+<span class="sourceLineNo">201</span><a id="line.201">                        
if (StringUtils.isNotEmpty(link.group(member))) {</a>
+<span class="sourceLineNo">202</span><a id="line.202">                         
   if (text != null &amp;&amp; !text.isEmpty()) {</a>
+<span class="sourceLineNo">203</span><a id="line.203">                         
       text += '.';</a>
+<span class="sourceLineNo">204</span><a id="line.204">                         
   }</a>
+<span class="sourceLineNo">205</span><a id="line.205">                         
   text += link.group(member);</a>
+<span class="sourceLineNo">206</span><a id="line.206">                         
   if (StringUtils.isNotEmpty(link.group(args))) {</a>
+<span class="sourceLineNo">207</span><a id="line.207">                         
       text += "()";</a>
+<span class="sourceLineNo">208</span><a id="line.208">                         
   }</a>
+<span class="sourceLineNo">209</span><a id="line.209">                        
}</a>
+<span class="sourceLineNo">210</span><a id="line.210">                    }</a>
+<span class="sourceLineNo">211</span><a id="line.211">                }</a>
+<span class="sourceLineNo">212</span><a id="line.212">                if 
(!"linkplain".equals(tag)) {</a>
+<span class="sourceLineNo">213</span><a id="line.213">                    text 
= "&lt;code&gt;" + text + "&lt;/code&gt;";</a>
+<span class="sourceLineNo">214</span><a id="line.214">                }</a>
+<span class="sourceLineNo">215</span><a id="line.215">            }</a>
+<span class="sourceLineNo">216</span><a id="line.216">            
matcher.appendReplacement(decoded, (text != null) ? quoteReplacement(text) : 
"");</a>
+<span class="sourceLineNo">217</span><a id="line.217">        }</a>
+<span class="sourceLineNo">218</span><a id="line.218">        
matcher.appendTail(decoded);</a>
+<span class="sourceLineNo">219</span><a id="line.219"></a>
+<span class="sourceLineNo">220</span><a id="line.220">        return 
decoded.toString();</a>
+<span class="sourceLineNo">221</span><a id="line.221">    }</a>
+<span class="sourceLineNo">222</span><a id="line.222"></a>
+<span class="sourceLineNo">223</span><a id="line.223">    /**</a>
+<span class="sourceLineNo">224</span><a id="line.224">     * Fixes some 
javadoc comment to become a valid XHTML snippet.</a>
+<span class="sourceLineNo">225</span><a id="line.225">     *</a>
+<span class="sourceLineNo">226</span><a id="line.226">     * @param 
description Javadoc description with HTML tags, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">227</span><a id="line.227">     * @return The 
description with valid XHTML tags, never &lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">228</span><a id="line.228">     * @deprecated 
Redundant for java extractor</a>
+<span class="sourceLineNo">229</span><a id="line.229">     */</a>
+<span class="sourceLineNo">230</span><a id="line.230">    @Deprecated</a>
+<span class="sourceLineNo">231</span><a id="line.231">    public static String 
makeHtmlValid(String description) {</a>
+<span class="sourceLineNo">232</span><a id="line.232"></a>
+<span class="sourceLineNo">233</span><a id="line.233">        if (description 
== null || description.isEmpty()) {</a>
+<span class="sourceLineNo">234</span><a id="line.234">            return 
"";</a>
+<span class="sourceLineNo">235</span><a id="line.235">        }</a>
+<span class="sourceLineNo">236</span><a id="line.236"></a>
+<span class="sourceLineNo">237</span><a id="line.237">        String 
commentCleaned = decodeJavadocTags(description);</a>
+<span class="sourceLineNo">238</span><a id="line.238"></a>
+<span class="sourceLineNo">239</span><a id="line.239">        // Using jTidy 
to clean comment</a>
+<span class="sourceLineNo">240</span><a id="line.240">        Tidy tidy = new 
Tidy();</a>
+<span class="sourceLineNo">241</span><a id="line.241">        
tidy.setDocType("loose");</a>
+<span class="sourceLineNo">242</span><a id="line.242">        
tidy.setXHTML(true);</a>
+<span class="sourceLineNo">243</span><a id="line.243">        
tidy.setXmlOut(true);</a>
+<span class="sourceLineNo">244</span><a id="line.244">        
tidy.setInputEncoding("UTF-8");</a>
+<span class="sourceLineNo">245</span><a id="line.245">        
tidy.setOutputEncoding("UTF-8");</a>
+<span class="sourceLineNo">246</span><a id="line.246">        
tidy.setMakeClean(true);</a>
+<span class="sourceLineNo">247</span><a id="line.247">        
tidy.setNumEntities(true);</a>
+<span class="sourceLineNo">248</span><a id="line.248">        
tidy.setQuoteNbsp(false);</a>
+<span class="sourceLineNo">249</span><a id="line.249">        
tidy.setQuiet(true);</a>
+<span class="sourceLineNo">250</span><a id="line.250">        
tidy.setShowWarnings(true);</a>
+<span class="sourceLineNo">251</span><a id="line.251"></a>
+<span class="sourceLineNo">252</span><a id="line.252">        
ByteArrayOutputStream out = new ByteArrayOutputStream(commentCleaned.length() + 
256);</a>
+<span class="sourceLineNo">253</span><a id="line.253">        tidy.parse(new 
ByteArrayInputStream(commentCleaned.getBytes(StandardCharsets.UTF_8)), out);</a>
+<span class="sourceLineNo">254</span><a id="line.254">        commentCleaned = 
new String(out.toByteArray(), StandardCharsets.UTF_8);</a>
+<span class="sourceLineNo">255</span><a id="line.255"></a>
+<span class="sourceLineNo">256</span><a id="line.256">        if 
(commentCleaned == null || commentCleaned.isEmpty()) {</a>
+<span class="sourceLineNo">257</span><a id="line.257">            return 
"";</a>
+<span class="sourceLineNo">258</span><a id="line.258">        }</a>
+<span class="sourceLineNo">259</span><a id="line.259"></a>
+<span class="sourceLineNo">260</span><a id="line.260">        // strip the 
header/body stuff</a>
+<span class="sourceLineNo">261</span><a id="line.261">        String ls = 
System.getProperty("line.separator");</a>
+<span class="sourceLineNo">262</span><a id="line.262">        int startPos = 
commentCleaned.indexOf("&lt;body&gt;" + ls) + 6 + ls.length();</a>
+<span class="sourceLineNo">263</span><a id="line.263">        int endPos = 
commentCleaned.indexOf(ls + "&lt;/body&gt;");</a>
+<span class="sourceLineNo">264</span><a id="line.264">        commentCleaned = 
commentCleaned.substring(startPos, endPos);</a>
+<span class="sourceLineNo">265</span><a id="line.265"></a>
+<span class="sourceLineNo">266</span><a id="line.266">        return 
commentCleaned;</a>
+<span class="sourceLineNo">267</span><a id="line.267">    }</a>
+<span class="sourceLineNo">268</span><a id="line.268"></a>
+<span class="sourceLineNo">269</span><a id="line.269">    /**</a>
+<span class="sourceLineNo">270</span><a id="line.270">     * Converts a HTML 
fragment as extracted from a javadoc comment to a plain text string. This 
method tries to retain</a>
+<span class="sourceLineNo">271</span><a id="line.271">     * as much of the 
text formatting as possible by means of the following transformations:</a>
+<span class="sourceLineNo">272</span><a id="line.272">     * &lt;ul&gt;</a>
+<span class="sourceLineNo">273</span><a id="line.273">     * &lt;li&gt;List 
items are converted to leading tabs (U+0009), followed by the item 
number/bullet, another tab and</a>
+<span class="sourceLineNo">274</span><a id="line.274">     * finally the item 
contents. Each tab denotes an increase of indentation.&lt;/li&gt;</a>
+<span class="sourceLineNo">275</span><a id="line.275">     * &lt;li&gt;Flow 
breaking elements as well as literal line terminators in preformatted text are 
converted to a newline</a>
+<span class="sourceLineNo">276</span><a id="line.276">     * (U+000A) to 
denote a mandatory line break.&lt;/li&gt;</a>
+<span class="sourceLineNo">277</span><a id="line.277">     * 
&lt;li&gt;Consecutive spaces and line terminators from character data outside 
of preformatted text will be normalized</a>
+<span class="sourceLineNo">278</span><a id="line.278">     * to a single 
space. The resulting space denotes a possible point for line 
wrapping.&lt;/li&gt;</a>
+<span class="sourceLineNo">279</span><a id="line.279">     * &lt;li&gt;Each 
space in preformatted text will be converted to a non-breaking space 
(U+00A0).&lt;/li&gt;</a>
+<span class="sourceLineNo">280</span><a id="line.280">     * &lt;/ul&gt;</a>
+<span class="sourceLineNo">281</span><a id="line.281">     *</a>
+<span class="sourceLineNo">282</span><a id="line.282">     * @param html The 
HTML fragment to convert to plain text, may be 
&lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">283</span><a id="line.283">     * @return A string 
with HTML tags converted into pure text, never 
&lt;code&gt;null&lt;/code&gt;.</a>
+<span class="sourceLineNo">284</span><a id="line.284">     * @since 2.4.3</a>
+<span class="sourceLineNo">285</span><a id="line.285">     * @deprecated 
Replaced by {@link HtmlToPlainTextConverter}</a>
+<span class="sourceLineNo">286</span><a id="line.286">     */</a>
+<span class="sourceLineNo">287</span><a id="line.287">    @Deprecated</a>
+<span class="sourceLineNo">288</span><a id="line.288">    public static String 
toText(String html) {</a>
+<span class="sourceLineNo">289</span><a id="line.289">        if (html == null 
|| html.isEmpty()) {</a>
+<span class="sourceLineNo">290</span><a id="line.290">            return 
"";</a>
+<span class="sourceLineNo">291</span><a id="line.291">        }</a>
+<span class="sourceLineNo">292</span><a id="line.292"></a>
+<span class="sourceLineNo">293</span><a id="line.293">        final 
StringBuilder sb = new StringBuilder();</a>
+<span class="sourceLineNo">294</span><a id="line.294"></a>
+<span class="sourceLineNo">295</span><a id="line.295">        
HTMLEditorKit.Parser parser = new ParserDelegator();</a>
+<span class="sourceLineNo">296</span><a id="line.296">        
HTMLEditorKit.ParserCallback htmlCallback = new MojoParserCallback(sb);</a>
+<span class="sourceLineNo">297</span><a id="line.297"></a>
+<span class="sourceLineNo">298</span><a id="line.298">        try {</a>
+<span class="sourceLineNo">299</span><a id="line.299">            
parser.parse(new StringReader(makeHtmlValid(html)), htmlCallback, true);</a>
+<span class="sourceLineNo">300</span><a id="line.300">        } catch 
(IOException e) {</a>
+<span class="sourceLineNo">301</span><a id="line.301">            throw new 
RuntimeException(e);</a>
+<span class="sourceLineNo">302</span><a id="line.302">        }</a>
+<span class="sourceLineNo">303</span><a id="line.303"></a>
+<span class="sourceLineNo">304</span><a id="line.304">        return 
sb.toString().replace('\"', '\''); // for CDATA</a>
+<span class="sourceLineNo">305</span><a id="line.305">    }</a>
+<span class="sourceLineNo">306</span><a id="line.306"></a>
+<span class="sourceLineNo">307</span><a id="line.307">    /**</a>
+<span class="sourceLineNo">308</span><a id="line.308">     * ParserCallback 
implementation.</a>
+<span class="sourceLineNo">309</span><a id="line.309">     */</a>
+<span class="sourceLineNo">310</span><a id="line.310">    private static class 
MojoParserCallback extends HTMLEditorKit.ParserCallback {</a>
+<span class="sourceLineNo">311</span><a id="line.311">        /**</a>
+<span class="sourceLineNo">312</span><a id="line.312">         * Holds the 
index of the current item in a numbered list.</a>
+<span class="sourceLineNo">313</span><a id="line.313">         */</a>
+<span class="sourceLineNo">314</span><a id="line.314">        class Counter 
{</a>
+<span class="sourceLineNo">315</span><a id="line.315">            int 
value;</a>
+<span class="sourceLineNo">316</span><a id="line.316">        }</a>
+<span class="sourceLineNo">317</span><a id="line.317"></a>
+<span class="sourceLineNo">318</span><a id="line.318">        /**</a>
+<span class="sourceLineNo">319</span><a id="line.319">         * A flag 
whether the parser is currently in the body element.</a>
+<span class="sourceLineNo">320</span><a id="line.320">         */</a>
+<span class="sourceLineNo">321</span><a id="line.321">        private boolean 
body;</a>
+<span class="sourceLineNo">322</span><a id="line.322"></a>
+<span class="sourceLineNo">323</span><a id="line.323">        /**</a>
+<span class="sourceLineNo">324</span><a id="line.324">         * A flag 
whether the parser is currently processing preformatted text, actually a 
counter to track nesting.</a>
+<span class="sourceLineNo">325</span><a id="line.325">         */</a>
+<span class="sourceLineNo">326</span><a id="line.326">        private int 
preformatted;</a>
+<span class="sourceLineNo">327</span><a id="line.327"></a>
+<span class="sourceLineNo">328</span><a id="line.328">        /**</a>
+<span class="sourceLineNo">329</span><a id="line.329">         * The current 
indentation depth for the output.</a>
+<span class="sourceLineNo">330</span><a id="line.330">         */</a>
+<span class="sourceLineNo">331</span><a id="line.331">        private int 
depth;</a>
+<span class="sourceLineNo">332</span><a id="line.332"></a>
+<span class="sourceLineNo">333</span><a id="line.333">        /**</a>
+<span class="sourceLineNo">334</span><a id="line.334">         * A stack of 
{@link Counter} objects corresponding to the nesting of (un-)ordered lists. 
A</a>
+<span class="sourceLineNo">335</span><a id="line.335">         * 
&lt;code&gt;null&lt;/code&gt; element denotes an unordered list.</a>
+<span class="sourceLineNo">336</span><a id="line.336">         */</a>
+<span class="sourceLineNo">337</span><a id="line.337">        private 
Stack&lt;Counter&gt; numbering = new Stack&lt;&gt;();</a>
+<span class="sourceLineNo">338</span><a id="line.338"></a>
+<span class="sourceLineNo">339</span><a id="line.339">        /**</a>
+<span class="sourceLineNo">340</span><a id="line.340">         * A flag 
whether an implicit line break is pending in the output buffer. This flag is 
used to postpone the</a>
+<span class="sourceLineNo">341</span><a id="line.341">         * output of 
implicit line breaks until we are sure that are not to be merged with other 
implicit line</a>
+<span class="sourceLineNo">342</span><a id="line.342">         * breaks.</a>
+<span class="sourceLineNo">343</span><a id="line.343">         */</a>
+<span class="sourceLineNo">344</span><a id="line.344">        private boolean 
pendingNewline;</a>
+<span class="sourceLineNo">345</span><a id="line.345"></a>
+<span class="sourceLineNo">346</span><a id="line.346">        /**</a>
+<span class="sourceLineNo">347</span><a id="line.347">         * A flag 
whether we have just parsed a simple tag.</a>
+<span class="sourceLineNo">348</span><a id="line.348">         */</a>
+<span class="sourceLineNo">349</span><a id="line.349">        private boolean 
simpleTag;</a>
+<span class="sourceLineNo">350</span><a id="line.350"></a>
+<span class="sourceLineNo">351</span><a id="line.351">        /**</a>
+<span class="sourceLineNo">352</span><a id="line.352">         * The current 
buffer.</a>
+<span class="sourceLineNo">353</span><a id="line.353">         */</a>
+<span class="sourceLineNo">354</span><a id="line.354">        private final 
StringBuilder sb;</a>
+<span class="sourceLineNo">355</span><a id="line.355"></a>
+<span class="sourceLineNo">356</span><a id="line.356">        /**</a>
+<span class="sourceLineNo">357</span><a id="line.357">         * @param sb not 
null</a>
+<span class="sourceLineNo">358</span><a id="line.358">         */</a>
+<span class="sourceLineNo">359</span><a id="line.359">        
MojoParserCallback(StringBuilder sb) {</a>
+<span class="sourceLineNo">360</span><a id="line.360">            this.sb = 
sb;</a>
+<span class="sourceLineNo">361</span><a id="line.361">        }</a>
+<span class="sourceLineNo">362</span><a id="line.362"></a>
+<span class="sourceLineNo">363</span><a id="line.363">        /** 
{@inheritDoc} */</a>
+<span class="sourceLineNo">364</span><a id="line.364">        @Override</a>
+<span class="sourceLineNo">365</span><a id="line.365">        public void 
handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {</a>
+<span class="sourceLineNo">366</span><a id="line.366">            simpleTag = 
true;</a>
+<span class="sourceLineNo">367</span><a id="line.367">            if (body 
&amp;&amp; HTML.Tag.BR.equals(t)) {</a>
+<span class="sourceLineNo">368</span><a id="line.368">                
newline(false);</a>
+<span class="sourceLineNo">369</span><a id="line.369">            }</a>
+<span class="sourceLineNo">370</span><a id="line.370">        }</a>
+<span class="sourceLineNo">371</span><a id="line.371"></a>
+<span class="sourceLineNo">372</span><a id="line.372">        /** 
{@inheritDoc} */</a>
+<span class="sourceLineNo">373</span><a id="line.373">        @Override</a>
+<span class="sourceLineNo">374</span><a id="line.374">        public void 
handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {</a>
+<span class="sourceLineNo">375</span><a id="line.375">            simpleTag = 
false;</a>
+<span class="sourceLineNo">376</span><a id="line.376">            if (body 
&amp;&amp; (t.breaksFlow() || t.isBlock())) {</a>
+<span class="sourceLineNo">377</span><a id="line.377">                
newline(true);</a>
+<span class="sourceLineNo">378</span><a id="line.378">            }</a>
+<span class="sourceLineNo">379</span><a id="line.379">            if 
(HTML.Tag.OL.equals(t)) {</a>
+<span class="sourceLineNo">380</span><a id="line.380">                
numbering.push(new Counter());</a>
+<span class="sourceLineNo">381</span><a id="line.381">            } else if 
(HTML.Tag.UL.equals(t)) {</a>
+<span class="sourceLineNo">382</span><a id="line.382">                
numbering.push(null);</a>
+<span class="sourceLineNo">383</span><a id="line.383">            } else if 
(HTML.Tag.LI.equals(t)) {</a>
+<span class="sourceLineNo">384</span><a id="line.384">                Counter 
counter = numbering.peek();</a>
+<span class="sourceLineNo">385</span><a id="line.385">                if 
(counter == null) {</a>
+<span class="sourceLineNo">386</span><a id="line.386">                    
text("-\t");</a>
+<span class="sourceLineNo">387</span><a id="line.387">                } else 
{</a>
+<span class="sourceLineNo">388</span><a id="line.388">                    
text(++counter.value + ".\t");</a>
+<span class="sourceLineNo">389</span><a id="line.389">                }</a>
+<span class="sourceLineNo">390</span><a id="line.390">                
depth++;</a>
+<span class="sourceLineNo">391</span><a id="line.391">            } else if 
(HTML.Tag.DD.equals(t)) {</a>
+<span class="sourceLineNo">392</span><a id="line.392">                
depth++;</a>
+<span class="sourceLineNo">393</span><a id="line.393">            } else if 
(t.isPreformatted()) {</a>
+<span class="sourceLineNo">394</span><a id="line.394">                
preformatted++;</a>
+<span class="sourceLineNo">395</span><a id="line.395">            } else if 
(HTML.Tag.BODY.equals(t)) {</a>
+<span class="sourceLineNo">396</span><a id="line.396">                body = 
true;</a>
+<span class="sourceLineNo">397</span><a id="line.397">            }</a>
+<span class="sourceLineNo">398</span><a id="line.398">        }</a>
+<span class="sourceLineNo">399</span><a id="line.399"></a>
+<span class="sourceLineNo">400</span><a id="line.400">        /** 
{@inheritDoc} */</a>
+<span class="sourceLineNo">401</span><a id="line.401">        @Override</a>
+<span class="sourceLineNo">402</span><a id="line.402">        public void 
handleEndTag(HTML.Tag t, int pos) {</a>
+<span class="sourceLineNo">403</span><a id="line.403">            if 
(HTML.Tag.OL.equals(t) || HTML.Tag.UL.equals(t)) {</a>
+<span class="sourceLineNo">404</span><a id="line.404">                
numbering.pop();</a>
+<span class="sourceLineNo">405</span><a id="line.405">            } else if 
(HTML.Tag.LI.equals(t) || HTML.Tag.DD.equals(t)) {</a>
+<span class="sourceLineNo">406</span><a id="line.406">                
depth--;</a>
+<span class="sourceLineNo">407</span><a id="line.407">            } else if 
(t.isPreformatted()) {</a>
+<span class="sourceLineNo">408</span><a id="line.408">                
preformatted--;</a>
+<span class="sourceLineNo">409</span><a id="line.409">            } else if 
(HTML.Tag.BODY.equals(t)) {</a>
+<span class="sourceLineNo">410</span><a id="line.410">                body = 
false;</a>
+<span class="sourceLineNo">411</span><a id="line.411">            }</a>
+<span class="sourceLineNo">412</span><a id="line.412">            if (body 
&amp;&amp; (t.breaksFlow() || t.isBlock()) &amp;&amp; !HTML.Tag.LI.equals(t)) 
{</a>
+<span class="sourceLineNo">413</span><a id="line.413">                if 
((HTML.Tag.P.equals(t)</a>
+<span class="sourceLineNo">414</span><a id="line.414">                         
       || HTML.Tag.PRE.equals(t)</a>
+<span class="sourceLineNo">415</span><a id="line.415">                         
       || HTML.Tag.OL.equals(t)</a>
+<span class="sourceLineNo">416</span><a id="line.416">                         
       || HTML.Tag.UL.equals(t)</a>
+<span class="sourceLineNo">417</span><a id="line.417">                         
       || HTML.Tag.DL.equals(t))</a>
+<span class="sourceLineNo">418</span><a id="line.418">                        
&amp;&amp; numbering.isEmpty()) {</a>
+<span class="sourceLineNo">419</span><a id="line.419">                    
pendingNewline = false;</a>
+<span class="sourceLineNo">420</span><a id="line.420">                    
newline(pendingNewline);</a>
+<span class="sourceLineNo">421</span><a id="line.421">                } else 
{</a>
+<span class="sourceLineNo">422</span><a id="line.422">                    
newline(true);</a>
+<span class="sourceLineNo">423</span><a id="line.423">                }</a>
+<span class="sourceLineNo">424</span><a id="line.424">            }</a>
+<span class="sourceLineNo">425</span><a id="line.425">        }</a>
+<span class="sourceLineNo">426</span><a id="line.426"></a>
+<span class="sourceLineNo">427</span><a id="line.427">        /** 
{@inheritDoc} */</a>
+<span class="sourceLineNo">428</span><a id="line.428">        @Override</a>
+<span class="sourceLineNo">429</span><a id="line.429">        public void 
handleText(char[] data, int pos) {</a>
+<span class="sourceLineNo">430</span><a id="line.430">            /*</a>
+<span class="sourceLineNo">431</span><a id="line.431">             * NOTE: 
Parsers before JRE 1.6 will parse XML-conform simple tags like &lt;br/&gt; as 
"&lt;br&gt;" followed by</a>
+<span class="sourceLineNo">432</span><a id="line.432">             * the text 
event "&gt;..." so we need to watch out for the closing angle bracket.</a>
+<span class="sourceLineNo">433</span><a id="line.433">             */</a>
+<span class="sourceLineNo">434</span><a id="line.434">            int offset = 
0;</a>
+<span class="sourceLineNo">435</span><a id="line.435">            if 
(simpleTag &amp;&amp; data[0] == '&gt;') {</a>
+<span class="sourceLineNo">436</span><a id="line.436">                
simpleTag = false;</a>
+<span class="sourceLineNo">437</span><a id="line.437">                for 
(++offset; offset &lt; data.length &amp;&amp; data[offset] &lt;= ' '; ) {</a>
+<span class="sourceLineNo">438</span><a id="line.438">                    
offset++;</a>

[... 127 lines stripped ...]


Reply via email to