1.1 --- a/pom.xml Mon May 23 13:13:51 2011 +0400
1.2 +++ b/pom.xml Tue May 31 15:52:03 2011 +0400
1.3 @@ -6,7 +6,7 @@
1.4
1.5 <groupId>org.vaadin.addons</groupId>
1.6 <artifactId>console</artifactId>
1.7 - <version>1.1.8</version>
1.8 + <version>1.2.0-SNAPSHOT</version>
1.9 <packaging>jar</packaging>
1.10 <name>Vaadin Console add-on</name>
1.11
2.1 --- a/src/main/java/org/vaadin/console/Console.java Mon May 23 13:13:51 2011 +0400
2.2 +++ b/src/main/java/org/vaadin/console/Console.java Tue May 31 15:52:03 2011 +0400
2.3 @@ -12,7 +12,10 @@
2.4 import java.util.List;
2.5 import java.util.Map;
2.6 import java.util.Set;
2.7 +import java.util.regex.Pattern;
2.8
2.9 +import org.vaadin.console.ansi.ANSICodeConverter;
2.10 +import org.vaadin.console.ansi.DefaultANSICodeConverter;
2.11 import org.vaadin.rpc.ServerSideHandler;
2.12 import org.vaadin.rpc.ServerSideProxy;
2.13 import org.vaadin.rpc.client.Method;
2.14 @@ -33,6 +36,8 @@
2.15
2.16 private static final long serialVersionUID = 590258219352859644L;
2.17 private Handler handler;
2.18 + private ANSICodeConverter ansiToCSSconverter;
2.19 + private boolean isConvertANSIToCSS = false;
2.20 private final HashMap<String, Command> commands = new HashMap<String, Command>();
2.21 private final Config config = new Config();
2.22
2.23 @@ -288,6 +293,7 @@
2.24 public Console() {
2.25 setImmediate(true);
2.26 setHandler(new DefaultConsoleHandler());
2.27 + setANSIToCSSConverter(new DefaultANSICodeConverter());
2.28 registerCallbacks();
2.29 }
2.30
2.31 @@ -522,7 +528,11 @@
2.32 }
2.33
2.34 public void print(final String output) {
2.35 - client.call("print", output);
2.36 + if(isConvertANSIToCSS){
2.37 + client.call("print", "");
2.38 + appendWithProcessingANSICodes(output);
2.39 + } else
2.40 + client.call("print", output);
2.41 }
2.42
2.43 /**
2.44 @@ -601,7 +611,11 @@
2.45 }
2.46
2.47 public void println(final String string) {
2.48 - client.call("println", string);
2.49 + if(isConvertANSIToCSS){
2.50 + client.call("print", "");
2.51 + appendWithProcessingANSICodes(string + "\n");
2.52 + } else
2.53 + client.call("println", string);
2.54 }
2.55
2.56 /**
2.57 @@ -619,9 +633,38 @@
2.58 * @return this Console object
2.59 */
2.60 public Console append(final String string) {
2.61 - client.call("append", string);
2.62 + if(isConvertANSIToCSS)
2.63 + appendWithProcessingANSICodes(string);
2.64 + else
2.65 + client.call("append", string);
2.66 return this;
2.67 }
2.68 +
2.69 + private void appendWithProcessingANSICodes(String sOutput) {
2.70 + String splitted[] = sOutput.split(ANSICodeConverter.ANSI_PATTERN);
2.71 + String notPrintedYet = new String(sOutput);
2.72 + for(int i = 0; i < splitted.length; i++){
2.73 + String nextStr = splitted[i];
2.74 + if(i == 0 && nextStr.length() == 0)
2.75 + continue;
2.76 + String cssClasses = "";
2.77 + Pattern firstAnsi = Pattern.compile("^(" + ANSICodeConverter.ANSI_PATTERN + ")+\\Q" + nextStr + "\\E.*", Pattern.DOTALL);
2.78 + if(firstAnsi.matcher(notPrintedYet).matches()){
2.79 + while(firstAnsi.matcher(notPrintedYet).matches()){
2.80 + String ansi = notPrintedYet.replaceAll("\\Q" + notPrintedYet.replaceAll("^(" + ANSICodeConverter.ANSI_PATTERN + "){1}", "") + "\\E", "");
2.81 + cssClasses += ansiToCSSconverter.convertANSIToCSS(ansi) + " ";
2.82 + notPrintedYet = notPrintedYet.replaceAll("^(" + ANSICodeConverter.ANSI_PATTERN + "){1}", "");
2.83 + }
2.84 + notPrintedYet = notPrintedYet.replaceAll("^\\Q" + nextStr + "\\E", "");
2.85 + } else
2.86 + notPrintedYet = notPrintedYet.replaceFirst("\\Q" + nextStr + "\\E", "");
2.87 + cssClasses = cssClasses.trim();
2.88 + if(cssClasses.length() > 0)
2.89 + client.call("append", nextStr, cssClasses);
2.90 + else
2.91 + client.call("append", nextStr);
2.92 + }
2.93 + }
2.94
2.95 /**
2.96 * Append text with predefined in theme CSS class.
2.97 @@ -810,7 +853,33 @@
2.98 this.handler = handler != null ? handler : new DefaultConsoleHandler();
2.99 }
2.100
2.101 - /**
2.102 + public ANSICodeConverter getANSIToCSSConverter() {
2.103 + return ansiToCSSconverter;
2.104 + }
2.105 +
2.106 + public void setANSIToCSSConverter(ANSICodeConverter converter) {
2.107 + this.ansiToCSSconverter = converter != null? converter : new DefaultANSICodeConverter();
2.108 + }
2.109 +
2.110 + /**
2.111 + * Converting raw output with ANSI escape sequences to output with CSS-classes.
2.112 + *
2.113 + * @return
2.114 + */
2.115 + public boolean isConvertANSIToCSS() {
2.116 + return isConvertANSIToCSS;
2.117 + }
2.118 +
2.119 + /**
2.120 + * Converting raw output with ANSI escape sequences to output with CSS-classes.
2.121 + *
2.122 + * @param isConvertANSIToCSS
2.123 + */
2.124 + public void setConvertANSIToCSS(boolean isConvertANSIToCSS) {
2.125 + this.isConvertANSIToCSS = isConvertANSIToCSS;
2.126 + }
2.127 +
2.128 + /**
2.129 * Get map of available commands in this Console.
2.130 *
2.131 * @return
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/src/main/java/org/vaadin/console/ansi/ANSICodeConverter.java Tue May 31 15:52:03 2011 +0400
3.3 @@ -0,0 +1,23 @@
3.4 +package org.vaadin.console.ansi;
3.5 +
3.6 +/**
3.7 + * Interface for ANSI-code-TO-CSS converter.
3.8 + *
3.9 + * @author indvdum
3.10 + * 31.05.2011 13:45:28
3.11 + *
3.12 + */
3.13 +public interface ANSICodeConverter {
3.14 + /**
3.15 + * Pattern for one ANSI escape sequence.
3.16 + */
3.17 + public String ANSI_PATTERN = "(\033\\[)([0-9a-zA-Z;]+)(m)";
3.18 +
3.19 + /**
3.20 + * Converting ANSI escape sequence to space-separated CSS classes.
3.21 + *
3.22 + * @param ansiEscapeSequence ANSI escape sequence
3.23 + * @return CSS classes separated by spaces for this ANSI escape sequence
3.24 + */
3.25 + public String convertANSIToCSS(String ansiEscapeSequence);
3.26 +}
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/src/main/java/org/vaadin/console/ansi/DefaultANSICodeConverter.java Tue May 31 15:52:03 2011 +0400
4.3 @@ -0,0 +1,107 @@
4.4 +package org.vaadin.console.ansi;
4.5 +
4.6 +import java.util.HashMap;
4.7 +import java.util.Map;
4.8 +import java.util.regex.Matcher;
4.9 +import java.util.regex.Pattern;
4.10 +
4.11 +/**
4.12 + * Default converter for numeric-only ANSI codes.
4.13 + *
4.14 + * @author indvdum
4.15 + * 31.05.2011 13:55:47
4.16 + *
4.17 + */
4.18 +public class DefaultANSICodeConverter implements ANSICodeConverter {
4.19 +
4.20 + protected static final Map<Integer, String> ANSI_CSS = new HashMap<Integer, String>();
4.21 + static{
4.22 + ANSI_CSS.put(0, "");
4.23 + ANSI_CSS.put(1, "term-font-weight-bolder");
4.24 + ANSI_CSS.put(2, "term-font-weight-lighter");
4.25 + ANSI_CSS.put(3, "term-font-style-italic");
4.26 + ANSI_CSS.put(4, "term-text-decoration-underline");
4.27 + ANSI_CSS.put(5, "term-text-decoration-blink");
4.28 + ANSI_CSS.put(6, "term-text-decoration-blink");
4.29 +
4.30 + ANSI_CSS.put(9, "term-text-decoration-line-through");
4.31 +
4.32 + ANSI_CSS.put(22, "term-font-weight-normal");
4.33 +
4.34 + ANSI_CSS.put(24, "term-text-decoration-none");
4.35 + ANSI_CSS.put(25, "term-text-decoration-none");
4.36 +
4.37 + ANSI_CSS.put(29, "term-text-decoration-none");
4.38 +
4.39 + ANSI_CSS.put(30, "term-color-black");
4.40 + ANSI_CSS.put(31, "term-color-red");
4.41 + ANSI_CSS.put(32, "term-color-green");
4.42 + ANSI_CSS.put(33, "term-color-yellow");
4.43 + ANSI_CSS.put(34, "term-color-blue");
4.44 + ANSI_CSS.put(35, "term-color-purple");
4.45 + ANSI_CSS.put(36, "term-color-teal");
4.46 + ANSI_CSS.put(37, "term-color-silver");
4.47 +
4.48 + ANSI_CSS.put(40, "term-background-color-black");
4.49 + ANSI_CSS.put(41, "term-background-color-red");
4.50 + ANSI_CSS.put(42, "term-background-color-green");
4.51 + ANSI_CSS.put(43, "term-background-color-yellow");
4.52 + ANSI_CSS.put(44, "term-background-color-blue");
4.53 + ANSI_CSS.put(45, "term-background-color-purple");
4.54 + ANSI_CSS.put(46, "term-background-color-teal");
4.55 + ANSI_CSS.put(47, "term-background-color-silver");
4.56 +
4.57 + ANSI_CSS.put(53, "term-text-decoration-overline");
4.58 + ANSI_CSS.put(55, "term-text-decoration-none");
4.59 + }
4.60 +
4.61 + @Override
4.62 + public String convertANSIToCSS(String ansiEscapeSequence) {
4.63 + StringBuilder cssClasses = new StringBuilder("");
4.64 + Matcher matcher = Pattern.compile(ANSI_PATTERN).matcher(ansiEscapeSequence);
4.65 + if(!matcher.matches())
4.66 + return cssClasses.toString();
4.67 + String codes[] = matcher.group(2).split(";");
4.68 + for(int i = 0; i < codes.length; i++){
4.69 + if(!codes[i].matches("[0-9]+")) // processing only numeric codes
4.70 + continue;
4.71 + int nCode = Integer.valueOf(codes[i]);
4.72 + if(nCode == 38){ // Set xterm-256 text color, nothing to do
4.73 + i+=2;
4.74 + continue;
4.75 + }
4.76 + if(nCode == 48){ // Set xterm-256 background color, nothing to do
4.77 + i+=2;
4.78 + continue;
4.79 + }
4.80 + String cssClass = getCSSClass(nCode);
4.81 + if(cssClass == null)
4.82 + continue;
4.83 + cssClass = cssClass.trim();
4.84 + if(cssClass.length() > 0)
4.85 + cssClasses.append(cssClass).append(" ");
4.86 + }
4.87 + return cssClasses.toString().trim();
4.88 + }
4.89 +
4.90 + /**
4.91 + * Converting one numeric ANSI code to one or many CSS-classes.
4.92 + *
4.93 + * @param ansiCode ANSI code
4.94 + * @return CSS-class(es).
4.95 + */
4.96 + protected String getCSSClass(int ansiCode) {
4.97 + return ANSI_CSS.get(ansiCode);
4.98 + }
4.99 +
4.100 + /**
4.101 + * Converting one string ANSI code to one or many CSS-classes.
4.102 + *
4.103 + * @param ansiCode ANSI code
4.104 + * @return CSS-class(es).
4.105 + */
4.106 + protected String getCSSClass(String ansiCode) {
4.107 + return "";
4.108 + }
4.109 +
4.110 +}
5.1 --- a/src/main/java/org/vaadin/console/public/console/styles.css Mon May 23 13:13:51 2011 +0400
5.2 +++ b/src/main/java/org/vaadin/console/public/console/styles.css Tue May 31 15:52:03 2011 +0400
5.3 @@ -67,4 +67,190 @@
5.4 color: #222222 !important;
5.5 }
5.6
5.7 - **/
5.8 \ No newline at end of file
5.9 + **/
5.10 +
5.11 + /* Classes for ANSI Escape Sequences */
5.12 +
5.13 +.term-text-decoration-blink {
5.14 + text-decoration: blink;
5.15 +}
5.16 +
5.17 +.term-text-decoration-line-through {
5.18 + text-decoration: line-through;
5.19 +}
5.20 +
5.21 +.term-text-decoration-overline {
5.22 + text-decoration: overline;
5.23 +}
5.24 +
5.25 +.term-text-decoration-underline {
5.26 + text-decoration: underline;
5.27 +}
5.28 +
5.29 +.term-text-decoration-none {
5.30 + text-decoration: none;
5.31 +}
5.32 +
5.33 +.term-font-style-normal {
5.34 + font-style: normal;
5.35 +}
5.36 +
5.37 +.term-font-style-italic {
5.38 + font-style: italic;
5.39 +}
5.40 +
5.41 +.term-font-style-oblique {
5.42 + font-style: oblique;
5.43 +}
5.44 +
5.45 +.term-font-weight-normal {
5.46 + font-weight: normal;
5.47 +}
5.48 +
5.49 +.term-font-weight-bold {
5.50 + font-weight: bold;
5.51 +}
5.52 +
5.53 +.term-font-weight-bolder {
5.54 + font-weight: bolder;
5.55 +}
5.56 +
5.57 +.term-font-weight-lighter {
5.58 + font-weight: lighter;
5.59 +}
5.60 +
5.61 +.term-color-white {
5.62 + color: white;
5.63 +}
5.64 +
5.65 +.term-color-silver {
5.66 + color: silver;
5.67 +}
5.68 +
5.69 +.term-color-gray {
5.70 + color: gray;
5.71 +}
5.72 +
5.73 +.term-color-black {
5.74 + color: black;
5.75 +}
5.76 +
5.77 +.term-color-maroon {
5.78 + color: maroon;
5.79 +}
5.80 +
5.81 +.term-color-red {
5.82 + color: red;
5.83 +}
5.84 +
5.85 +.term-color-orange {
5.86 + color: orange;
5.87 +}
5.88 +
5.89 +.term-color-yellow {
5.90 + color: yellow;
5.91 +}
5.92 +
5.93 +.term-color-olive {
5.94 + color: olive;
5.95 +}
5.96 +
5.97 +.term-color-lime {
5.98 + color: lime;
5.99 +}
5.100 +
5.101 +.term-color-green {
5.102 + color: green;
5.103 +}
5.104 +
5.105 +.term-color-aqua {
5.106 + color: aqua;
5.107 +}
5.108 +
5.109 +.term-color-blue {
5.110 + color: blue;
5.111 +}
5.112 +
5.113 +.term-color-navy {
5.114 + color: navy;
5.115 +}
5.116 +
5.117 +.term-color-teal {
5.118 + color: teal;
5.119 +}
5.120 +
5.121 +.term-color-fuchsia {
5.122 + color: fuchsia;
5.123 +}
5.124 +
5.125 +.term-color-purple {
5.126 + color: purple;
5.127 +}
5.128 +
5.129 +.term-background-color-white {
5.130 + background-color: white;
5.131 +}
5.132 +
5.133 +.term-background-color-silver {
5.134 + background-color: silver;
5.135 +}
5.136 +
5.137 +.term-background-color-gray {
5.138 + background-color: gray;
5.139 +}
5.140 +
5.141 +.term-background-color-black {
5.142 + background-color: black;
5.143 +}
5.144 +
5.145 +.term-background-color-maroon {
5.146 + background-color: maroon;
5.147 +}
5.148 +
5.149 +.term-background-color-red {
5.150 + background-color: red;
5.151 +}
5.152 +
5.153 +.term-background-color-orange {
5.154 + background-color: orange;
5.155 +}
5.156 +
5.157 +.term-background-color-yellow {
5.158 + background-color: yellow;
5.159 +}
5.160 +
5.161 +.term-background-color-olive {
5.162 + background-color: olive;
5.163 +}
5.164 +
5.165 +.term-background-color-lime {
5.166 + background-color: lime;
5.167 +}
5.168 +
5.169 +.term-background-color-green {
5.170 + background-color: green;
5.171 +}
5.172 +
5.173 +.term-background-color-aqua {
5.174 + background-color: aqua;
5.175 +}
5.176 +
5.177 +.term-background-color-blue {
5.178 + background-color: blue;
5.179 +}
5.180 +
5.181 +.term-background-color-navy {
5.182 + background-color: navy;
5.183 +}
5.184 +
5.185 +.term-background-color-teal {
5.186 + background-color: teal;
5.187 +}
5.188 +
5.189 +.term-background-color-fuchsia {
5.190 + background-color: fuchsia;
5.191 +}
5.192 +
5.193 +.term-background-color-purple {
5.194 + background-color: purple;
5.195 +}