ANSIConsoleOutput.java
- package org.jbehave.core.reporters;
- import static org.jbehave.core.reporters.SGRCodes.SGRCode.RESET;
- import static org.jbehave.core.reporters.SGRCodes.SGRCode.UNDERLINE;
- import static org.jbehave.core.steps.StepCreator.PARAMETER_VALUE_END;
- import static org.jbehave.core.steps.StepCreator.PARAMETER_VALUE_START;
- import java.util.Properties;
- import org.jbehave.core.configuration.Keywords;
- import org.jbehave.core.reporters.SGRCodes.SGRCode;
- /**
- * <p>
- * Story reporter that outputs as ANSI-coded text to System.out.
- * Uses {@link SGRCodes} to decorate ConsoleOutput format patterns.
- * </p>
- */
- @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
- public class ANSIConsoleOutput extends ConsoleOutput {
- private static final char ESCAPE_CHARACTER = (char) 27;
- private static final String SGR_CONTROL = "m";
- private static final String CODE_SEPARATOR = ";";
- private SGRCodes codes = new SGRCodes();
- public ANSIConsoleOutput() {
- super();
- }
- public ANSIConsoleOutput(Keywords keywords) {
- super(keywords);
- }
- public ANSIConsoleOutput(Properties outputPatterns, Keywords keywords, boolean reportFailureTrace) {
- super(outputPatterns, keywords, reportFailureTrace);
- }
- public ANSIConsoleOutput assignCode(String key, SGRCode code) {
- codes.assignCode(key, code);
- return this;
- }
- public ANSIConsoleOutput withCodes(SGRCodes codes) {
- this.codes = codes;
- return this;
- }
- @Override
- protected String format(String key, String defaultPattern, Object... args) {
- String formatted = super.format(key, defaultPattern, args);
- if (codes.hasCode(key)) {
- SGRCode code = codes.getCode(key);
- formatted = escapeCodeFor(code) + highlightParameterValues(formatted, code) + escapeCodeFor(RESET);
- }
- return formatted;
- }
- private String highlightParameterValues(String formatted, SGRCode code) {
- final String valueStart = lookupPattern(PARAMETER_VALUE_START, PARAMETER_VALUE_START);
- final String valueEnd = lookupPattern(PARAMETER_VALUE_END, PARAMETER_VALUE_END);
- return formatted
- .replaceAll(valueStart, escapeCodeFor(highlightCode(), code))
- .replaceAll(valueEnd, escapeCodeFor(RESET, code));
- }
- private SGRCode highlightCode() {
- if (codes.hasCode("highlight")) {
- return codes.getCode("highlight");
- }
- return UNDERLINE;
- }
- private String escapeCodeFor(SGRCode code) {
- return controlSequenceInitiator(code + SGR_CONTROL);
- }
- private String escapeCodeFor(SGRCode first, SGRCode second) {
- return controlSequenceInitiator(first + CODE_SEPARATOR + second + SGR_CONTROL);
- }
- private String controlSequenceInitiator(String code) {
- return ESCAPE_CHARACTER + "[" + code;
- }
- }