# 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;
+}