# HG changeset patch # User indvdum # Date 1306842723 -14400 # Node ID ea825ba6336b044ea040734ab6188b93423ec764 # Parent f6b22b2ab1b92712e0d150c808e255140aabaf64 + console 1.2.0-SNAPSHOT diff -r f6b22b2ab1b9 -r ea825ba6336b pom.xml --- a/pom.xml Mon May 23 13:13:51 2011 +0400 +++ b/pom.xml Tue May 31 15:52:03 2011 +0400 @@ -6,7 +6,7 @@ org.vaadin.addons console - 1.1.8 + 1.2.0-SNAPSHOT jar Vaadin Console add-on diff -r f6b22b2ab1b9 -r ea825ba6336b src/main/java/org/vaadin/console/Console.java --- a/src/main/java/org/vaadin/console/Console.java Mon May 23 13:13:51 2011 +0400 +++ b/src/main/java/org/vaadin/console/Console.java Tue May 31 15:52:03 2011 +0400 @@ -12,7 +12,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; +import org.vaadin.console.ansi.ANSICodeConverter; +import org.vaadin.console.ansi.DefaultANSICodeConverter; import org.vaadin.rpc.ServerSideHandler; import org.vaadin.rpc.ServerSideProxy; import org.vaadin.rpc.client.Method; @@ -33,6 +36,8 @@ private static final long serialVersionUID = 590258219352859644L; private Handler handler; + private ANSICodeConverter ansiToCSSconverter; + private boolean isConvertANSIToCSS = false; private final HashMap commands = new HashMap(); private final Config config = new Config(); @@ -288,6 +293,7 @@ public Console() { setImmediate(true); setHandler(new DefaultConsoleHandler()); + setANSIToCSSConverter(new DefaultANSICodeConverter()); registerCallbacks(); } @@ -522,7 +528,11 @@ } public void print(final String output) { - client.call("print", output); + if(isConvertANSIToCSS){ + client.call("print", ""); + appendWithProcessingANSICodes(output); + } else + client.call("print", output); } /** @@ -601,7 +611,11 @@ } public void println(final String string) { - client.call("println", string); + if(isConvertANSIToCSS){ + client.call("print", ""); + appendWithProcessingANSICodes(string + "\n"); + } else + client.call("println", string); } /** @@ -619,9 +633,38 @@ * @return this Console object */ public Console append(final String string) { - client.call("append", string); + if(isConvertANSIToCSS) + appendWithProcessingANSICodes(string); + else + client.call("append", string); return this; } + + private void appendWithProcessingANSICodes(String sOutput) { + String splitted[] = sOutput.split(ANSICodeConverter.ANSI_PATTERN); + String notPrintedYet = new String(sOutput); + for(int i = 0; i < splitted.length; i++){ + String nextStr = splitted[i]; + if(i == 0 && nextStr.length() == 0) + continue; + String cssClasses = ""; + Pattern firstAnsi = Pattern.compile("^(" + ANSICodeConverter.ANSI_PATTERN + ")+\\Q" + nextStr + "\\E.*", Pattern.DOTALL); + if(firstAnsi.matcher(notPrintedYet).matches()){ + while(firstAnsi.matcher(notPrintedYet).matches()){ + String ansi = notPrintedYet.replaceAll("\\Q" + notPrintedYet.replaceAll("^(" + ANSICodeConverter.ANSI_PATTERN + "){1}", "") + "\\E", ""); + cssClasses += ansiToCSSconverter.convertANSIToCSS(ansi) + " "; + notPrintedYet = notPrintedYet.replaceAll("^(" + ANSICodeConverter.ANSI_PATTERN + "){1}", ""); + } + notPrintedYet = notPrintedYet.replaceAll("^\\Q" + nextStr + "\\E", ""); + } else + notPrintedYet = notPrintedYet.replaceFirst("\\Q" + nextStr + "\\E", ""); + cssClasses = cssClasses.trim(); + if(cssClasses.length() > 0) + client.call("append", nextStr, cssClasses); + else + client.call("append", nextStr); + } + } /** * Append text with predefined in theme CSS class. @@ -810,7 +853,33 @@ this.handler = handler != null ? handler : new DefaultConsoleHandler(); } - /** + public ANSICodeConverter getANSIToCSSConverter() { + return ansiToCSSconverter; + } + + public void setANSIToCSSConverter(ANSICodeConverter converter) { + this.ansiToCSSconverter = converter != null? converter : new DefaultANSICodeConverter(); + } + + /** + * Converting raw output with ANSI escape sequences to output with CSS-classes. + * + * @return + */ + public boolean isConvertANSIToCSS() { + return isConvertANSIToCSS; + } + + /** + * Converting raw output with ANSI escape sequences to output with CSS-classes. + * + * @param isConvertANSIToCSS + */ + public void setConvertANSIToCSS(boolean isConvertANSIToCSS) { + this.isConvertANSIToCSS = isConvertANSIToCSS; + } + + /** * Get map of available commands in this Console. * * @return diff -r f6b22b2ab1b9 -r ea825ba6336b src/main/java/org/vaadin/console/ansi/ANSICodeConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/vaadin/console/ansi/ANSICodeConverter.java Tue May 31 15:52:03 2011 +0400 @@ -0,0 +1,23 @@ +package org.vaadin.console.ansi; + +/** + * Interface for ANSI-code-TO-CSS converter. + * + * @author indvdum + * 31.05.2011 13:45:28 + * + */ +public interface ANSICodeConverter { + /** + * Pattern for one ANSI escape sequence. + */ + public String ANSI_PATTERN = "(\033\\[)([0-9a-zA-Z;]+)(m)"; + + /** + * Converting ANSI escape sequence to space-separated CSS classes. + * + * @param ansiEscapeSequence ANSI escape sequence + * @return CSS classes separated by spaces for this ANSI escape sequence + */ + public String convertANSIToCSS(String ansiEscapeSequence); +} diff -r f6b22b2ab1b9 -r ea825ba6336b src/main/java/org/vaadin/console/ansi/DefaultANSICodeConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/vaadin/console/ansi/DefaultANSICodeConverter.java Tue May 31 15:52:03 2011 +0400 @@ -0,0 +1,107 @@ +package org.vaadin.console.ansi; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Default converter for numeric-only ANSI codes. + * + * @author indvdum + * 31.05.2011 13:55:47 + * + */ +public class DefaultANSICodeConverter implements ANSICodeConverter { + + protected static final Map ANSI_CSS = new HashMap(); + static{ + ANSI_CSS.put(0, ""); + ANSI_CSS.put(1, "term-font-weight-bolder"); + ANSI_CSS.put(2, "term-font-weight-lighter"); + ANSI_CSS.put(3, "term-font-style-italic"); + ANSI_CSS.put(4, "term-text-decoration-underline"); + ANSI_CSS.put(5, "term-text-decoration-blink"); + ANSI_CSS.put(6, "term-text-decoration-blink"); + + ANSI_CSS.put(9, "term-text-decoration-line-through"); + + ANSI_CSS.put(22, "term-font-weight-normal"); + + ANSI_CSS.put(24, "term-text-decoration-none"); + ANSI_CSS.put(25, "term-text-decoration-none"); + + ANSI_CSS.put(29, "term-text-decoration-none"); + + ANSI_CSS.put(30, "term-color-black"); + ANSI_CSS.put(31, "term-color-red"); + ANSI_CSS.put(32, "term-color-green"); + ANSI_CSS.put(33, "term-color-yellow"); + ANSI_CSS.put(34, "term-color-blue"); + ANSI_CSS.put(35, "term-color-purple"); + ANSI_CSS.put(36, "term-color-teal"); + ANSI_CSS.put(37, "term-color-silver"); + + ANSI_CSS.put(40, "term-background-color-black"); + ANSI_CSS.put(41, "term-background-color-red"); + ANSI_CSS.put(42, "term-background-color-green"); + ANSI_CSS.put(43, "term-background-color-yellow"); + ANSI_CSS.put(44, "term-background-color-blue"); + ANSI_CSS.put(45, "term-background-color-purple"); + ANSI_CSS.put(46, "term-background-color-teal"); + ANSI_CSS.put(47, "term-background-color-silver"); + + ANSI_CSS.put(53, "term-text-decoration-overline"); + ANSI_CSS.put(55, "term-text-decoration-none"); + } + + @Override + public String convertANSIToCSS(String ansiEscapeSequence) { + StringBuilder cssClasses = new StringBuilder(""); + Matcher matcher = Pattern.compile(ANSI_PATTERN).matcher(ansiEscapeSequence); + if(!matcher.matches()) + return cssClasses.toString(); + String codes[] = matcher.group(2).split(";"); + for(int i = 0; i < codes.length; i++){ + if(!codes[i].matches("[0-9]+")) // processing only numeric codes + continue; + int nCode = Integer.valueOf(codes[i]); + if(nCode == 38){ // Set xterm-256 text color, nothing to do + i+=2; + continue; + } + if(nCode == 48){ // Set xterm-256 background color, nothing to do + i+=2; + continue; + } + String cssClass = getCSSClass(nCode); + if(cssClass == null) + continue; + cssClass = cssClass.trim(); + if(cssClass.length() > 0) + cssClasses.append(cssClass).append(" "); + } + return cssClasses.toString().trim(); + } + + /** + * Converting one numeric ANSI code to one or many CSS-classes. + * + * @param ansiCode ANSI code + * @return CSS-class(es). + */ + protected String getCSSClass(int ansiCode) { + return ANSI_CSS.get(ansiCode); + } + + /** + * Converting one string ANSI code to one or many CSS-classes. + * + * @param ansiCode ANSI code + * @return CSS-class(es). + */ + protected String getCSSClass(String ansiCode) { + return ""; + } + +} diff -r f6b22b2ab1b9 -r ea825ba6336b src/main/java/org/vaadin/console/public/console/styles.css --- a/src/main/java/org/vaadin/console/public/console/styles.css Mon May 23 13:13:51 2011 +0400 +++ b/src/main/java/org/vaadin/console/public/console/styles.css Tue May 31 15:52:03 2011 +0400 @@ -67,4 +67,190 @@ color: #222222 !important; } - **/ \ No newline at end of file + **/ + + /* Classes for ANSI Escape Sequences */ + +.term-text-decoration-blink { + text-decoration: blink; +} + +.term-text-decoration-line-through { + text-decoration: line-through; +} + +.term-text-decoration-overline { + text-decoration: overline; +} + +.term-text-decoration-underline { + text-decoration: underline; +} + +.term-text-decoration-none { + text-decoration: none; +} + +.term-font-style-normal { + font-style: normal; +} + +.term-font-style-italic { + font-style: italic; +} + +.term-font-style-oblique { + font-style: oblique; +} + +.term-font-weight-normal { + font-weight: normal; +} + +.term-font-weight-bold { + font-weight: bold; +} + +.term-font-weight-bolder { + font-weight: bolder; +} + +.term-font-weight-lighter { + font-weight: lighter; +} + +.term-color-white { + color: white; +} + +.term-color-silver { + color: silver; +} + +.term-color-gray { + color: gray; +} + +.term-color-black { + color: black; +} + +.term-color-maroon { + color: maroon; +} + +.term-color-red { + color: red; +} + +.term-color-orange { + color: orange; +} + +.term-color-yellow { + color: yellow; +} + +.term-color-olive { + color: olive; +} + +.term-color-lime { + color: lime; +} + +.term-color-green { + color: green; +} + +.term-color-aqua { + color: aqua; +} + +.term-color-blue { + color: blue; +} + +.term-color-navy { + color: navy; +} + +.term-color-teal { + color: teal; +} + +.term-color-fuchsia { + color: fuchsia; +} + +.term-color-purple { + color: purple; +} + +.term-background-color-white { + background-color: white; +} + +.term-background-color-silver { + background-color: silver; +} + +.term-background-color-gray { + background-color: gray; +} + +.term-background-color-black { + background-color: black; +} + +.term-background-color-maroon { + background-color: maroon; +} + +.term-background-color-red { + background-color: red; +} + +.term-background-color-orange { + background-color: orange; +} + +.term-background-color-yellow { + background-color: yellow; +} + +.term-background-color-olive { + background-color: olive; +} + +.term-background-color-lime { + background-color: lime; +} + +.term-background-color-green { + background-color: green; +} + +.term-background-color-aqua { + background-color: aqua; +} + +.term-background-color-blue { + background-color: blue; +} + +.term-background-color-navy { + background-color: navy; +} + +.term-background-color-teal { + background-color: teal; +} + +.term-background-color-fuchsia { + background-color: fuchsia; +} + +.term-background-color-purple { + background-color: purple; +}