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));
}
}