1 package org.apache.maven.doxia.plugin;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.apache.maven.plugin.AbstractMojo;
8 import org.apache.maven.plugin.MojoExecutionException;
9
10
11
12
13
14
15
16
17
18 public class HelpMojo
19 extends AbstractMojo
20 {
21
22
23
24
25
26 private boolean detail;
27
28
29
30
31
32
33 private java.lang.String goal;
34
35
36
37
38
39
40 private int lineLength;
41
42
43
44
45
46
47 private int indentSize;
48
49
50
51 public void execute()
52 throws MojoExecutionException
53 {
54 if ( lineLength <= 0 )
55 {
56 getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
57 lineLength = 80;
58 }
59 if ( indentSize <= 0 )
60 {
61 getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
62 indentSize = 2;
63 }
64
65 StringBuffer sb = new StringBuffer();
66
67 append( sb, "org.apache.maven.doxia:doxia-maven-plugin:1.2", 0 );
68 append( sb, "", 0 );
69
70 append( sb, "Doxia :: Maven Plugin", 0 );
71 append( sb, "A Maven plugin for Doxia.", 1 );
72 append( sb, "", 0 );
73
74 if ( goal == null || goal.length() <= 0 )
75 {
76 append( sb, "This plugin has 2 goals:", 0 );
77 append( sb, "", 0 );
78 }
79
80 if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
81 {
82 append( sb, "doxia:help", 0 );
83 append( sb, "Display help information on doxia-maven-plugin.\nCall\n\u00a0\u00a0mvn\u00a0doxia:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
84 append( sb, "", 0 );
85 if ( detail )
86 {
87 append( sb, "Available parameters:", 1 );
88 append( sb, "", 0 );
89
90 append( sb, "detail (Default: false)", 2 );
91 append( sb, "If true, display all settable properties for each goal.", 3 );
92 append( sb, "", 0 );
93
94 append( sb, "goal", 2 );
95 append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
96 append( sb, "", 0 );
97
98 append( sb, "indentSize (Default: 2)", 2 );
99 append( sb, "The number of spaces per indentation level, should be positive.", 3 );
100 append( sb, "", 0 );
101
102 append( sb, "lineLength (Default: 80)", 2 );
103 append( sb, "The maximum length of a display line, should be positive.", 3 );
104 append( sb, "", 0 );
105 }
106 }
107
108 if ( goal == null || goal.length() <= 0 || "render-books".equals( goal ) )
109 {
110 append( sb, "doxia:render-books", 0 );
111 append( sb, "A Mojo to create books in different output formats.", 1 );
112 append( sb, "", 0 );
113 if ( detail )
114 {
115 append( sb, "Available parameters:", 1 );
116 append( sb, "", 0 );
117
118 append( sb, "basedir (Default: ${basedir})", 2 );
119 append( sb, "Base directory of the project.", 3 );
120 append( sb, "", 0 );
121
122 append( sb, "books", 2 );
123 append( sb, "A list of books.", 3 );
124 append( sb, "", 0 );
125
126 append( sb, "generatedDocs (Default: ${project.build.directory}/generated-site)", 2 );
127 append( sb, "Directory containing the generated project docs.", 3 );
128 append( sb, "", 0 );
129
130 append( sb, "inputEncoding (Default: ${project.build.sourceEncoding})", 2 );
131 append( sb, "Specifies the input encoding.", 3 );
132 append( sb, "", 0 );
133
134 append( sb, "locales (Default: ${locales})", 2 );
135 append( sb, "A comma separated list of locales supported by Maven. The first valid token will be the default Locale for this instance of the Java Virtual Machine.", 3 );
136 append( sb, "", 0 );
137
138 append( sb, "outputEncoding (Default: ${project.reporting.outputEncoding})", 2 );
139 append( sb, "Specifies the output encoding.", 3 );
140 append( sb, "", 0 );
141 }
142 }
143
144 if ( getLog().isInfoEnabled() )
145 {
146 getLog().info( sb.toString() );
147 }
148 }
149
150
151
152
153
154
155
156
157
158
159 private static String repeat( String str, int repeat )
160 {
161 StringBuffer buffer = new StringBuffer( repeat * str.length() );
162
163 for ( int i = 0; i < repeat; i++ )
164 {
165 buffer.append( str );
166 }
167
168 return buffer.toString();
169 }
170
171
172
173
174
175
176
177
178
179 private void append( StringBuffer sb, String description, int indent )
180 {
181 for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
182 {
183 sb.append( it.next().toString() ).append( '\n' );
184 }
185 }
186
187
188
189
190
191
192
193
194
195
196
197 private static List toLines( String text, int indent, int indentSize, int lineLength )
198 {
199 List lines = new ArrayList();
200
201 String ind = repeat( "\t", indent );
202 String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
203 for ( int i = 0; i < plainLines.length; i++ )
204 {
205 toLines( lines, ind + plainLines[i], indentSize, lineLength );
206 }
207
208 return lines;
209 }
210
211
212
213
214
215
216
217
218
219 private static void toLines( List lines, String line, int indentSize, int lineLength )
220 {
221 int lineIndent = getIndentLevel( line );
222 StringBuffer buf = new StringBuffer( 256 );
223 String[] tokens = line.split( " +" );
224 for ( int i = 0; i < tokens.length; i++ )
225 {
226 String token = tokens[i];
227 if ( i > 0 )
228 {
229 if ( buf.length() + token.length() >= lineLength )
230 {
231 lines.add( buf.toString() );
232 buf.setLength( 0 );
233 buf.append( repeat( " ", lineIndent * indentSize ) );
234 }
235 else
236 {
237 buf.append( ' ' );
238 }
239 }
240 for ( int j = 0; j < token.length(); j++ )
241 {
242 char c = token.charAt( j );
243 if ( c == '\t' )
244 {
245 buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
246 }
247 else if ( c == '\u00A0' )
248 {
249 buf.append( ' ' );
250 }
251 else
252 {
253 buf.append( c );
254 }
255 }
256 }
257 lines.add( buf.toString() );
258 }
259
260
261
262
263
264
265
266 private static int getIndentLevel( String line )
267 {
268 int level = 0;
269 for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
270 {
271 level++;
272 }
273 for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
274 {
275 if ( line.charAt( i ) == '\t' )
276 {
277 level++;
278 break;
279 }
280 }
281 return level;
282 }
283 }