1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.cli.example;
18
19 import java.io.IOException;
20 import java.util.Collection;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.commons.cli.help.FilterHelpAppendable;
25 import org.apache.commons.cli.help.TableDefinition;
26 import org.apache.commons.cli.help.TextStyle;
27 import org.apache.commons.lang3.StringUtils;
28 import org.apache.commons.text.translate.CharSequenceTranslator;
29 import org.apache.commons.text.translate.LookupTranslator;
30
31
32
33
34 public class AptHelpAppendable extends FilterHelpAppendable {
35
36
37
38
39 public static final CharSequenceTranslator ESCAPE_APT;
40
41 static {
42 final Map<CharSequence, CharSequence> escapeAptMap = new HashMap<>();
43 escapeAptMap.put("\\", "\\\\");
44 escapeAptMap.put("\"", "\\\"");
45 escapeAptMap.put("*", "\\*");
46 escapeAptMap.put("+", "\\+");
47 escapeAptMap.put("|", "\\|");
48 ESCAPE_APT = new LookupTranslator(escapeAptMap);
49 }
50
51
52
53
54
55
56
57 public AptHelpAppendable(final Appendable output) {
58 super(output);
59 }
60
61 @Override
62 public void appendHeader(final int level, final CharSequence text) throws IOException {
63 if (StringUtils.isNotEmpty(text)) {
64 if (level < 1) {
65 throw new IllegalArgumentException("level must be at least 1");
66 }
67 for (int i = 0; i < level; i++) {
68 output.append("*");
69 }
70 appendFormat(" %s%n%n", ESCAPE_APT.translate(text));
71 }
72 }
73
74 @Override
75 public void appendList(final boolean ordered, final Collection<CharSequence> list) throws IOException {
76 if (list != null) {
77 if (ordered) {
78 int idx = 1;
79 for (final CharSequence s : list) {
80 appendFormat(" [[%s]] %s%n", idx++, ESCAPE_APT.translate(s));
81 }
82 } else {
83 for (final CharSequence s : list) {
84 appendFormat(" * %s%n", ESCAPE_APT.translate(s));
85 }
86 }
87 output.append(System.lineSeparator());
88 }
89 }
90
91 @Override
92 public void appendParagraph(final CharSequence paragraph) throws IOException {
93 if (StringUtils.isNotEmpty(paragraph)) {
94 appendFormat(" %s%n%n", ESCAPE_APT.translate(paragraph));
95 }
96 }
97
98 @Override
99 public void appendTable(final TableDefinition table) throws IOException {
100 if (table != null) {
101
102 final StringBuilder sb = new StringBuilder("*");
103 for (int i = 0; i < table.headers().size(); i++) {
104 final String header = table.headers().get(i);
105 final TextStyle style = table.columnTextStyles().get(i);
106 sb.append(StringUtils.repeat('-', header.length() + 2));
107 switch (style.getAlignment()) {
108 case LEFT:
109 sb.append("+");
110 break;
111 case CENTER:
112 sb.append("*");
113 break;
114 case RIGHT:
115 sb.append(":");
116 break;
117 }
118 }
119 final String rowSeparator = System.lineSeparator() + sb.append(System.lineSeparator());
120
121 output.append(sb.toString());
122 output.append("|");
123 for (final String header : table.headers()) {
124 appendFormat(" %s |", ESCAPE_APT.translate(header));
125 }
126 output.append(rowSeparator);
127
128 for (final Collection<String> row : table.rows()) {
129 output.append("|");
130 for (final String cell : row) {
131 appendFormat(" %s |", ESCAPE_APT.translate(cell));
132 }
133 output.append(rowSeparator);
134 }
135
136 if (StringUtils.isNotEmpty(table.caption())) {
137 appendFormat("%s%n", ESCAPE_APT.translate(table.caption()));
138 }
139 output.append(System.lineSeparator());
140 }
141 }
142
143 @Override
144 public void appendTitle(final CharSequence title) throws IOException {
145 if (StringUtils.isNotEmpty(title)) {
146 appendFormat(" -----%n %1$s%n -----%n%n%1$s%n%n", title);
147 }
148 }
149 }