+ console 1.2.0-SNAPSHOT consoleWithANSI
authorindvdum
Tue, 31 May 2011 15:52:03 +0400
branchconsoleWithANSI
changeset 15ea825ba6336b
parent 14 f6b22b2ab1b9
child 16 942d8db3a181
+ console 1.2.0-SNAPSHOT
pom.xml
src/main/java/org/vaadin/console/Console.java
src/main/java/org/vaadin/console/ansi/ANSICodeConverter.java
src/main/java/org/vaadin/console/ansi/DefaultANSICodeConverter.java
src/main/java/org/vaadin/console/public/console/styles.css
     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 +}