in src/main/java/org/apache/commons/cli/HelpFormatter.java [417:488]
<A extends Appendable> A appendOptions(final A sb, final int width, final Options options, final int leftPad, final int descPad) throws IOException {
final String lpad = createPadding(leftPad);
final String dpad = createPadding(descPad);
// first create list containing only <lpad>-a,--aaa where
// -a is opt and --aaa is long opt; in parallel look for
// the longest opt string this list will be then used to
// sort options ascending
int max = 0;
final int maxSince = showSince ? determineMaxSinceLength(options) + leftPad : 0;
final List<StringBuilder> prefixList = new ArrayList<>();
final List<Option> optList = options.helpOptions();
if (getOptionComparator() != null) {
Collections.sort(optList, getOptionComparator());
}
for (final Option option : optList) {
final StringBuilder optBuf = new StringBuilder();
if (option.getOpt() == null) {
optBuf.append(lpad).append(" ").append(getLongOptPrefix()).append(option.getLongOpt());
} else {
optBuf.append(lpad).append(getOptPrefix()).append(option.getOpt());
if (option.hasLongOpt()) {
optBuf.append(',').append(getLongOptPrefix()).append(option.getLongOpt());
}
}
if (option.hasArg()) {
final String argName = option.getArgName();
if (argName != null && argName.isEmpty()) {
// if the option has a blank argname
optBuf.append(' ');
} else {
optBuf.append(option.hasLongOpt() ? longOptSeparator : " ");
optBuf.append("<").append(argName != null ? option.getArgName() : getArgName()).append(">");
}
}
prefixList.add(optBuf);
max = Math.max(optBuf.length() + maxSince, max);
}
final int nextLineTabStop = max + descPad;
if (showSince) {
final StringBuilder optHeader = new StringBuilder(HEADER_OPTIONS).append(createPadding(max - maxSince - HEADER_OPTIONS.length() + leftPad))
.append(HEADER_SINCE);
optHeader.append(createPadding(max - optHeader.length())).append(lpad).append(HEADER_DESCRIPTION);
appendWrappedText(sb, width, nextLineTabStop, optHeader.toString());
sb.append(getNewLine());
}
int x = 0;
for (final Iterator<Option> it = optList.iterator(); it.hasNext();) {
final Option option = it.next();
final StringBuilder optBuf = new StringBuilder(prefixList.get(x++).toString());
if (optBuf.length() < max) {
optBuf.append(createPadding(max - maxSince - optBuf.length()));
if (showSince) {
optBuf.append(lpad).append(option.getSince() == null ? "-" : option.getSince());
}
optBuf.append(createPadding(max - optBuf.length()));
}
optBuf.append(dpad);
if (deprecatedFormatFunction != null && option.isDeprecated()) {
optBuf.append(deprecatedFormatFunction.apply(option).trim());
} else if (option.getDescription() != null) {
optBuf.append(option.getDescription());
}
appendWrappedText(sb, width, nextLineTabStop, optBuf.toString());
if (it.hasNext()) {
sb.append(getNewLine());
}
}
return sb;
}