ScrollText now respects ANSI escape codes.
This commit is contained in:
parent
6d08caab80
commit
7101535412
@ -11,7 +11,7 @@ dependencies {
|
|||||||
compile 'ch.qos.logback:logback-core:1.1.3'
|
compile 'ch.qos.logback:logback-core:1.1.3'
|
||||||
compile 'org.slf4j:slf4j-api:1.7.14'
|
compile 'org.slf4j:slf4j-api:1.7.14'
|
||||||
compile 'com.offbytwo:docopt:0.6.0.20150202'
|
compile 'com.offbytwo:docopt:0.6.0.20150202'
|
||||||
compile 'com.jdbernard:jdb-util:4.3'
|
compile 'com.jdbernard:jdb-util:4.4'
|
||||||
compile 'jline:jline:2.12'
|
compile 'jline:jline:2.12'
|
||||||
compile project(":wdiwtlt-core")
|
compile project(":wdiwtlt-core")
|
||||||
compile 'uk.co.caprica:vlcj:3.10.1'
|
compile 'uk.co.caprica:vlcj:3.10.1'
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package com.jdbernard.wdiwtlt.cli
|
package com.jdbernard.wdiwtlt.cli
|
||||||
|
|
||||||
|
import com.jdbernard.util.AnsiEscapeCodeSequence as ANSI
|
||||||
|
|
||||||
public class ScrollText {
|
public class ScrollText {
|
||||||
|
|
||||||
public String text = ""
|
public String text = ""
|
||||||
public int maxWidth
|
public int maxWidth
|
||||||
|
|
||||||
private int scrollIdx
|
private int scrollIdx
|
||||||
|
private String curAnsiPrefix = ""
|
||||||
|
|
||||||
public void setMaxWidth(int max) {
|
public void setMaxWidth(int max) {
|
||||||
this.maxWidth = Math.max(max, 1) }
|
this.maxWidth = Math.max(max, 1) }
|
||||||
@ -15,17 +18,52 @@ public class ScrollText {
|
|||||||
this.scrollIdx = Math.max(0, text.size() - 10) }
|
this.scrollIdx = Math.max(0, text.size() - 10) }
|
||||||
|
|
||||||
public String getNextScroll() {
|
public String getNextScroll() {
|
||||||
if (text.size() < maxWidth) return text
|
if (ANSI.strip(text).size() < maxWidth) return text
|
||||||
else {
|
|
||||||
scrollIdx = (scrollIdx + 1) % text.size()
|
|
||||||
int endIdx = Math.min(scrollIdx + maxWidth, text.size())
|
|
||||||
int wrapIdx = (scrollIdx + maxWidth) % text.size()
|
|
||||||
|
|
||||||
// don't need to wrap past the end
|
scrollIdx = (scrollIdx + 1) % text.size()
|
||||||
if (wrapIdx == endIdx) return text[scrollIdx..<endIdx]
|
|
||||||
return new StringBuilder()
|
// If we're on the start of an ANSI escape sequence, skip past the end
|
||||||
.append(text[scrollIdx..<endIdx])
|
// of it.
|
||||||
.append(" ").append(text[0..<wrapIdx]) } }
|
while (text[scrollIdx] == '\u001b') {
|
||||||
|
def endIdx = text.findIndexOf(scrollIdx) {
|
||||||
|
Character.isLetter(it.charAt(0)) }
|
||||||
|
curAnsiPrefix = text[scrollIdx..endIdx]
|
||||||
|
scrollIdx = (endIdx + 1) % text.size() }
|
||||||
|
|
||||||
|
int toWalk = maxWidth
|
||||||
|
int endIdx = scrollIdx + 1
|
||||||
|
int wrapIdx = 0
|
||||||
|
|
||||||
|
boolean inAnsiSeq = false
|
||||||
|
while (toWalk > 0 && wrapIdx < scrollIdx) {
|
||||||
|
def cur
|
||||||
|
if (endIdx == text.size()) {
|
||||||
|
cur = text[wrapIdx]
|
||||||
|
|
||||||
|
if (cur == '\u001b') inAnsiSeq = true
|
||||||
|
|
||||||
|
if (inAnsiSeq && Character.isLetter(cur.charAt(0)))
|
||||||
|
inAnsiSeq = false
|
||||||
|
|
||||||
|
if (!inAnsiSeq) toWalk--
|
||||||
|
wrapIdx++ }
|
||||||
|
|
||||||
|
else {
|
||||||
|
cur = text[endIdx]
|
||||||
|
|
||||||
|
if (cur == '\u001b') inAnsiSeq = true
|
||||||
|
|
||||||
|
if (inAnsiSeq && Character.isLetter(cur.charAt(0)))
|
||||||
|
inAnsiSeq = false
|
||||||
|
|
||||||
|
if (!inAnsiSeq) toWalk--
|
||||||
|
endIdx++ } }
|
||||||
|
|
||||||
|
if (wrapIdx == 0) return curAnsiPrefix + text[scrollIdx..<endIdx]
|
||||||
|
return new StringBuilder()
|
||||||
|
.append(curAnsiPrefix)
|
||||||
|
.append(text[scrollIdx..<endIdx])
|
||||||
|
.append(" ").append(text[0..<wrapIdx]) }
|
||||||
|
|
||||||
public String toString() { return getNextScroll() }
|
public String toString() { return getNextScroll() }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user