ANSIConsoleOutput.java

  1. package org.jbehave.core.reporters;

  2. import static org.jbehave.core.reporters.SGRCodes.SGRCode.RESET;
  3. import static org.jbehave.core.reporters.SGRCodes.SGRCode.UNDERLINE;
  4. import static org.jbehave.core.steps.StepCreator.PARAMETER_VALUE_END;
  5. import static org.jbehave.core.steps.StepCreator.PARAMETER_VALUE_START;

  6. import java.util.Properties;

  7. import org.jbehave.core.configuration.Keywords;
  8. import org.jbehave.core.reporters.SGRCodes.SGRCode;

  9. /**
  10.  * <p>
  11.  * Story reporter that outputs as ANSI-coded text to System.out.
  12.  * Uses {@link SGRCodes} to decorate ConsoleOutput format patterns.
  13.  * </p>
  14.  */
  15. @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
  16. public class ANSIConsoleOutput extends ConsoleOutput {

  17.     private static final char ESCAPE_CHARACTER = (char) 27;
  18.     private static final String SGR_CONTROL = "m";
  19.     private static final String CODE_SEPARATOR = ";";

  20.     private SGRCodes codes = new SGRCodes();

  21.     public ANSIConsoleOutput() {
  22.         super();
  23.     }

  24.     public ANSIConsoleOutput(Keywords keywords) {
  25.         super(keywords);
  26.     }

  27.     public ANSIConsoleOutput(Properties outputPatterns, Keywords keywords, boolean reportFailureTrace) {
  28.         super(outputPatterns, keywords, reportFailureTrace);
  29.     }

  30.     public ANSIConsoleOutput assignCode(String key, SGRCode code) {
  31.         codes.assignCode(key, code);
  32.         return this;
  33.     }

  34.     public ANSIConsoleOutput withCodes(SGRCodes codes) {
  35.         this.codes = codes;
  36.         return this;
  37.     }

  38.     @Override
  39.     protected String format(String key, String defaultPattern, Object... args) {
  40.         String formatted = super.format(key, defaultPattern, args);

  41.         if (codes.hasCode(key)) {
  42.             SGRCode code = codes.getCode(key);
  43.             formatted = escapeCodeFor(code) + highlightParameterValues(formatted, code) + escapeCodeFor(RESET);
  44.         }

  45.         return formatted;
  46.     }

  47.     private String highlightParameterValues(String formatted, SGRCode code) {
  48.         final String valueStart = lookupPattern(PARAMETER_VALUE_START, PARAMETER_VALUE_START);
  49.         final String valueEnd = lookupPattern(PARAMETER_VALUE_END, PARAMETER_VALUE_END);
  50.         return formatted
  51.                 .replaceAll(valueStart, escapeCodeFor(highlightCode(), code))
  52.                 .replaceAll(valueEnd, escapeCodeFor(RESET, code));
  53.     }

  54.     private SGRCode highlightCode() {
  55.         if (codes.hasCode("highlight")) {
  56.             return codes.getCode("highlight");
  57.         }
  58.         return UNDERLINE;
  59.     }

  60.     private String escapeCodeFor(SGRCode code) {
  61.         return controlSequenceInitiator(code + SGR_CONTROL);
  62.     }

  63.     private String escapeCodeFor(SGRCode first, SGRCode second) {
  64.         return controlSequenceInitiator(first + CODE_SEPARATOR + second + SGR_CONTROL);
  65.     }

  66.     private String controlSequenceInitiator(String code) {
  67.         return ESCAPE_CHARACTER + "[" + code;
  68.     }

  69. }