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<ComponentDependency> 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 <code>Artifact</code></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<ComponentDependency> toComponentDependencies(Collection<Artifact> artifacts) {</a> -<span class="sourceLineNo">107</span><a id="line.107"> List<ComponentDependency> componentDeps = new LinkedList<>();</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 <code>String</code> for the specified <code>String</code>. This method</a> -<span class="sourceLineNo">129</span><a id="line.129"> * produces a <code>String</code> that will work as a literal replacement <code>s</code> in the</a> -<span class="sourceLineNo">130</span><a id="line.130"> * <code>appendReplacement</code> method of the {@link Matcher} class. The <code>String</code> produced will</a> -<span class="sourceLineNo">131</span><a id="line.131"> * match the sequence of characters in <code>s</code> 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 <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html">java.util.regex.Matcher</a></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) && (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 < 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<ComponentDependency> 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 <code>Artifact</code></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<ComponentDependency> toComponentDependencies(Collection<Artifact> artifacts) {</a> +<span class="sourceLineNo">108</span><a id="line.108"> List<ComponentDependency> componentDeps = new LinkedList<>();</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 <code>String</code> for the specified <code>String</code>. This method</a> +<span class="sourceLineNo">130</span><a id="line.130"> * produces a <code>String</code> that will work as a literal replacement <code>s</code> in the</a> +<span class="sourceLineNo">131</span><a id="line.131"> * <code>appendReplacement</code> method of the {@link Matcher} class. The <code>String</code> produced will</a> +<span class="sourceLineNo">132</span><a id="line.132"> * match the sequence of characters in <code>s</code> 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 <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html">java.util.regex.Matcher</a></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) && (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 < 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 <A&B>}" should be</a> -<span class="sourceLineNo">163</span><a id="line.163"> * rendered as "<code>&lt;A&amp;B&gt;</code>".</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 <code>null</code>.</a> -<span class="sourceLineNo">166</span><a id="line.166"> * @return The decoded description, never <code>null</code>.</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;");</a> -<span class="sourceLineNo">182</span><a id="line.182"> text = StringUtils.replace(text, "<", "&lt;");</a> -<span class="sourceLineNo">183</span><a id="line.183"> text = StringUtils.replace(text, ">", "&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 = "<code>" + text + "</code>";</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 && !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 = "<code>" + text + "</code>";</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 <code>null</code>.</a> -<span class="sourceLineNo">226</span><a id="line.226"> * @return The description with valid XHTML tags, never <code>null</code>.</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("<body>" + ls) + 6 + ls.length();</a> -<span class="sourceLineNo">262</span><a id="line.262"> int endPos = commentCleaned.indexOf(ls + "</body>");</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"> * <ul></a> -<span class="sourceLineNo">272</span><a id="line.272"> * <li>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.</li></a> -<span class="sourceLineNo">274</span><a id="line.274"> * <li>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.</li></a> -<span class="sourceLineNo">276</span><a id="line.276"> * <li>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.</li></a> -<span class="sourceLineNo">278</span><a id="line.278"> * <li>Each space in preformatted text will be converted to a non-breaking space (U+00A0).</li></a> -<span class="sourceLineNo">279</span><a id="line.279"> * </ul></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 <code>null</code>.</a> -<span class="sourceLineNo">282</span><a id="line.282"> * @return A string with HTML tags converted into pure text, never <code>null</code>.</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"> * <code>null</code> 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<Counter> numbering = new Stack<>();</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 && 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 && (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 && (t.breaksFlow() || t.isBlock()) && !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"> && 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 <br/> as "<br>" followed by</a> -<span class="sourceLineNo">431</span><a id="line.431"> * the text event ">..." 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 && data[0] == '>') {</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 < data.length && data[offset] <= ' '; ) {</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 < 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() > 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 <code>null</code>.</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() <= 0 || sb.charAt(sb.length() - 1) == '\n') {</a> -<span class="sourceLineNo">489</span><a id="line.489"> for (int i = 0; i < 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 > 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<String, Integer> packageNames = new HashMap<>();</a> -<span class="sourceLineNo">511</span><a id="line.511"></a> -<span class="sourceLineNo">512</span><a id="line.512"> List<MojoDescriptor> 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") && 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<String, Integer> 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 > 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 <code>true</code> is the Mojo implementation implements <code>MavenReport</code>,</a> -<span class="sourceLineNo">552</span><a id="line.552"> * <code>false</code> 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 <A&B>}" should be</a> +<span class="sourceLineNo">164</span><a id="line.164"> * rendered as "<code>&lt;A&amp;B&gt;</code>".</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 <code>null</code>.</a> +<span class="sourceLineNo">167</span><a id="line.167"> * @return The decoded description, never <code>null</code>.</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;");</a> +<span class="sourceLineNo">183</span><a id="line.183"> text = text.replace("<", "&lt;");</a> +<span class="sourceLineNo">184</span><a id="line.184"> text = text.replace(">", "&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 = "<code>" + text + "</code>";</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 && !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 = "<code>" + text + "</code>";</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 <code>null</code>.</a> +<span class="sourceLineNo">227</span><a id="line.227"> * @return The description with valid XHTML tags, never <code>null</code>.</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("<body>" + ls) + 6 + ls.length();</a> +<span class="sourceLineNo">263</span><a id="line.263"> int endPos = commentCleaned.indexOf(ls + "</body>");</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"> * <ul></a> +<span class="sourceLineNo">273</span><a id="line.273"> * <li>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.</li></a> +<span class="sourceLineNo">275</span><a id="line.275"> * <li>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.</li></a> +<span class="sourceLineNo">277</span><a id="line.277"> * <li>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.</li></a> +<span class="sourceLineNo">279</span><a id="line.279"> * <li>Each space in preformatted text will be converted to a non-breaking space (U+00A0).</li></a> +<span class="sourceLineNo">280</span><a id="line.280"> * </ul></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 <code>null</code>.</a> +<span class="sourceLineNo">283</span><a id="line.283"> * @return A string with HTML tags converted into pure text, never <code>null</code>.</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"> * <code>null</code> 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<Counter> numbering = new Stack<>();</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 && 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 && (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 && (t.breaksFlow() || t.isBlock()) && !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"> && 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 <br/> as "<br>" followed by</a> +<span class="sourceLineNo">432</span><a id="line.432"> * the text event ">..." 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 && data[0] == '>') {</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 < data.length && data[offset] <= ' '; ) {</a> +<span class="sourceLineNo">438</span><a id="line.438"> offset++;</a>
[... 127 lines stripped ...]