Repository: karaf Updated Branches: refs/heads/master 10750e16b -> 8b36f7345
[KARAF-2998] When chopping long lines, less does not take tabs into account Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/8b36f734 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/8b36f734 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/8b36f734 Branch: refs/heads/master Commit: 8b36f734567a00f31295ae46cd8007258c2fb515 Parents: 10750e1 Author: Guillaume Nodet <[email protected]> Authored: Tue Mar 10 21:38:23 2015 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Tue Mar 10 22:02:20 2015 +0100 ---------------------------------------------------------------------- .../karaf/shell/commands/impl/LessAction.java | 7 ++- .../karaf/shell/commands/impl/MoreAction.java | 2 +- .../karaf/shell/support/ansi/AnsiSplitter.java | 55 +++++++++++++++----- .../shell/support/ansi/AnsiSplitterTest.java | 3 +- 4 files changed, 49 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/8b36f734/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/LessAction.java ---------------------------------------------------------------------- diff --git a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/LessAction.java b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/LessAction.java index b2e9448..a2e1ea5 100644 --- a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/LessAction.java +++ b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/LessAction.java @@ -87,6 +87,9 @@ public class LessAction implements Action, SignalListener { @Option(name = "-I", aliases = "--IGNORE-CASE") boolean ignoreCaseAlways; + @Option(name = "-x", aliases = "--tabs") + int tabs = 4; + @Argument(multiValued = true) List<File> files; @@ -608,11 +611,11 @@ public class LessAction implements Action, SignalListener { } private int ansiLength(String curLine) throws IOException { - return AnsiSplitter.length(curLine); + return AnsiSplitter.length(curLine, tabs); } private String ansiSubstring(String curLine, int begin, int end) throws IOException { - return AnsiSplitter.substring(curLine, begin, end); + return AnsiSplitter.substring(curLine, begin, end, tabs); } String getLine(int line) throws IOException { http://git-wip-us.apache.org/repos/asf/karaf/blob/8b36f734/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java ---------------------------------------------------------------------- diff --git a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java index 0d344a9..889bd5b 100644 --- a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java +++ b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java @@ -64,7 +64,7 @@ public class MoreAction implements Action { if (lines == 0) { lines = terminal.getHeight(); } - AnsiSplitter.AnsiBufferedReader reader = AnsiSplitter.splitter(System.in, terminal.getWidth()); + AnsiSplitter.AnsiBufferedReader reader = AnsiSplitter.splitter(System.in, terminal.getWidth(), 4); int count = 0; int c; do { http://git-wip-us.apache.org/repos/asf/karaf/blob/8b36f734/shell/core/src/main/java/org/apache/karaf/shell/support/ansi/AnsiSplitter.java ---------------------------------------------------------------------- diff --git a/shell/core/src/main/java/org/apache/karaf/shell/support/ansi/AnsiSplitter.java b/shell/core/src/main/java/org/apache/karaf/shell/support/ansi/AnsiSplitter.java index f855c1c..d729cfc 100644 --- a/shell/core/src/main/java/org/apache/karaf/shell/support/ansi/AnsiSplitter.java +++ b/shell/core/src/main/java/org/apache/karaf/shell/support/ansi/AnsiSplitter.java @@ -30,38 +30,43 @@ import org.fusesource.jansi.AnsiOutputStream; public class AnsiSplitter { - public static List<String> splitLines(String text, int maxLength) throws IOException { + public static List<String> splitLines(String text, int maxLength, int tabs) throws IOException { AnsiOutputStreamSplitter splitter = new AnsiOutputStreamSplitter(maxLength); + splitter.setTabs(tabs); splitter.write(text.getBytes()); splitter.close(); return splitter.lines; } - public static String substring(String text, int begin, int end) throws IOException { + public static String substring(String text, int begin, int end, int tabs) throws IOException { AnsiOutputStreamSplitter splitter = new AnsiOutputStreamSplitter(begin, end, Integer.MAX_VALUE); + splitter.setTabs(tabs); splitter.write(text.getBytes()); splitter.close(); return splitter.lines.get(0); } - public static int length(String curLine) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - AnsiOutputStream aos = new AnsiOutputStream(baos); - aos.write(curLine.getBytes()); - aos.close(); - return baos.toString().length(); + public static int length(String curLine, int tabs) throws IOException { + AnsiOutputStreamSplitter splitter = new AnsiOutputStreamSplitter(0, Integer.MAX_VALUE, Integer.MAX_VALUE); + splitter.setTabs(tabs); + splitter.write(curLine.getBytes()); + return splitter.getRealLength(); } - public static String cut(String text, int maxLength) throws IOException { - return splitLines(text, maxLength).get(0); + public static String cut(String text, int maxLength, int tabs) throws IOException { + return splitLines(text, maxLength, tabs).get(0); } - public static AnsiBufferedReader window(InputStream is, int begin, int end) throws IOException { - return new AnsiBufferedReader(is, begin, end, Integer.MAX_VALUE); + public static AnsiBufferedReader window(InputStream is, int begin, int end, int tabs) throws IOException { + AnsiBufferedReader reader = new AnsiBufferedReader(is, begin, end, Integer.MAX_VALUE); + reader.setTabs(tabs); + return reader; } - public static AnsiBufferedReader splitter(InputStream is, int maxLength) throws IOException { - return new AnsiBufferedReader(is, 0, Integer.MAX_VALUE, maxLength); + public static AnsiBufferedReader splitter(InputStream is, int maxLength, int tabs) throws IOException { + AnsiBufferedReader reader = new AnsiBufferedReader(is, 0, Integer.MAX_VALUE, maxLength); + reader.setTabs(tabs); + return reader; } @@ -95,6 +100,10 @@ public class AnsiSplitter { @Override public void close() throws IOException { } + + public void setTabs(int tabs) { + this.splitter.setTabs(tabs); + } } static class AnsiOutputStreamSplitter extends AnsiOutputStream { @@ -113,6 +122,7 @@ public class AnsiSplitter { private int maxLength; private int escapeLength; private int windowState; + private int tabs; private List<String> lines = new ArrayList<>(); public AnsiOutputStreamSplitter(int maxLength) { @@ -128,6 +138,14 @@ public class AnsiSplitter { reset(); } + public int getTabs() { + return tabs; + } + + public void setTabs(int tabs) { + this.tabs = tabs; + } + protected void reset() { intensity = Ansi.Attribute.INTENSITY_BOLD_OFF; underline = Ansi.Attribute.UNDERLINE_OFF; @@ -137,10 +155,19 @@ public class AnsiSplitter { bg = Ansi.Color.DEFAULT; } + public int getRealLength() { + return ((ByteArrayOutputStream) out).size() - escapeLength; + } + @Override public void write(int data) throws IOException { if (data == '\n') { flushLine(true); + } else if (data == '\t') { + ByteArrayOutputStream baos = (ByteArrayOutputStream) out; + do { + write(' '); + } while ((baos.size() - escapeLength) % tabs > 0); } else { if (windowState != 2) { super.write(data); http://git-wip-us.apache.org/repos/asf/karaf/blob/8b36f734/shell/core/src/test/java/org/apache/karaf/shell/support/ansi/AnsiSplitterTest.java ---------------------------------------------------------------------- diff --git a/shell/core/src/test/java/org/apache/karaf/shell/support/ansi/AnsiSplitterTest.java b/shell/core/src/test/java/org/apache/karaf/shell/support/ansi/AnsiSplitterTest.java index be4148c..3d490bf 100644 --- a/shell/core/src/test/java/org/apache/karaf/shell/support/ansi/AnsiSplitterTest.java +++ b/shell/core/src/test/java/org/apache/karaf/shell/support/ansi/AnsiSplitterTest.java @@ -29,7 +29,8 @@ public class AnsiSplitterTest { @Test public void testWindow() throws IOException { String text = "\u001B[1mThis is bold.\u001B[22m"; - assertEquals("\u001B[1mis\u001B[22m", AnsiSplitter.substring(text, 5, 7)); + assertEquals("\u001B[1mis\u001B[22m", AnsiSplitter.substring(text, 5, 7, 4)); + assertEquals(13, AnsiSplitter.length(text, 4)); } }
