You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2015/03/10 22:02:27 UTC

karaf git commit: [KARAF-2998] When chopping long lines, less does not take tabs into account

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 <gn...@gmail.com>
Authored: Tue Mar 10 21:38:23 2015 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
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));
     }
 
 }