package org.python.pydev.debug.newconsole; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.text.TextAttribute; import org.python.pydev.debug.newconsole.prefs.ColorManager; import com.aptana.interactive_console.console.ui.IConsoleStyleProvider; import com.aptana.interactive_console.console.ui.ScriptStyleRange; import com.aptana.shared_core.string.FastStringBuffer; import com.aptana.shared_core.structure.Tuple; /** * @author fabioz * */ public final class ConsoleStyleProvider implements IConsoleStyleProvider { private class AnsiState { private FastStringBuffer escBuf = new FastStringBuffer(); private FastStringBuffer buf = new FastStringBuffer(); private int state = 0; private static final int STATE_DEFAULT = 0; private static final int STATE_IN_ANSI = 1; private TextAttribute prevAttribute; } private final AnsiState err = new AnsiState(); private final AnsiState out = new AnsiState(); private ScriptStyleRange getIt(String content, int offset, TextAttribute attr, int scriptStyle) { //background is the default (already set) return new ScriptStyleRange(offset, content.length(), attr.getForeground(), null, scriptStyle, attr.getStyle()); } public Tuple<List<ScriptStyleRange>, String> createInterpreterStdStyle(String content, int offset, AnsiState ansiState, ColorManager colorManager, TextAttribute attr, int style) { Tuple<List<ScriptStyleRange>, String> ret = new Tuple<List<ScriptStyleRange>, String>( new ArrayList<ScriptStyleRange>(), ""); FastStringBuffer retBuf = new FastStringBuffer(); if (ansiState.prevAttribute == null) { ansiState.prevAttribute = attr; } int len = content.length(); for (int i = 0; i < len; i++) { char c = content.charAt(i); if (ansiState.state == AnsiState.STATE_IN_ANSI) { ansiState.escBuf.append(c); if (!Character.isDigit(c) && c != ';' && c != '[') { String str = ansiState.escBuf.toString(); ansiState.prevAttribute = colorManager.getAnsiTextAttribute(str, ansiState.prevAttribute, attr); ansiState.escBuf.clear(); ansiState.state = AnsiState.STATE_DEFAULT; } } else { if (c == '\u001B') { int bufLen = ansiState.buf.length(); if (bufLen > 0) { ret.o1.add(getIt(ansiState.buf.toString(), offset, ansiState.prevAttribute, style)); retBuf.append(ansiState.buf); offset += bufLen; ansiState.buf.clear(); } ansiState.state = AnsiState.STATE_IN_ANSI; } else { ansiState.buf.append(c); } } } int bufLen = ansiState.buf.length(); if (bufLen > 0) { ret.o1.add(getIt(ansiState.buf.toString(), offset, ansiState.prevAttribute, style)); retBuf.append(ansiState.buf); offset += bufLen; ansiState.buf.clear(); } ret.o2 = retBuf.toString(); return ret; } public Tuple<List<ScriptStyleRange>, String> createInterpreterErrorStyle(String content, int offset) { ColorManager colorManager = ColorManager.getDefault(); TextAttribute attr = colorManager.getConsoleErrorTextAttribute(); return createInterpreterStdStyle(content, offset, err, colorManager, attr, ScriptStyleRange.STDERR); } public Tuple<List<ScriptStyleRange>, String> createInterpreterOutputStyle(String content, int offset) { ColorManager colorManager = ColorManager.getDefault(); TextAttribute attr = colorManager.getConsoleOutputTextAttribute(); return createInterpreterStdStyle(content, offset, out, colorManager, attr, ScriptStyleRange.STDOUT); } public ScriptStyleRange createPromptStyle(String content, int offset) { TextAttribute attr = ColorManager.getDefault().getConsolePromptTextAttribute(); return getIt(content, offset, attr, ScriptStyleRange.PROMPT); } public ScriptStyleRange createUserInputStyle(String content, int offset) { TextAttribute attr = ColorManager.getDefault().getConsoleInputTextAttribute(); return getIt(content, offset, attr, ScriptStyleRange.STDIN); } }