Compare commits
10 Commits
5edf144d3b
...
4b3c20a913
Author | SHA1 | Date | |
---|---|---|---|
|
4b3c20a913 | ||
|
bbef072f8b | ||
|
dcef7512ce | ||
|
51a0cdbc08 | ||
|
7fb35060c2 | ||
|
5ce1cfab88 | ||
|
5b25794f5d | ||
|
f85050f0f2 | ||
|
f2bc4b34d0 | ||
|
be4d89abff |
21
build.gradle
21
build.gradle
@ -1,18 +1,31 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath 'ch.raffael.pegdown-doclet:pegdown-doclet:1.2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
apply plugin: "groovy"
|
apply plugin: "groovy"
|
||||||
|
apply plugin: "ch.raffael.pegdown-doclet"
|
||||||
apply plugin: "maven"
|
apply plugin: "maven"
|
||||||
|
|
||||||
group = "com.jdbernard"
|
group = "com.jdbernard"
|
||||||
version = "3.9"
|
version = "4.4"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral() }
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'org.codehaus.groovy:groovy-all:2.3.6'
|
compile localGroovy()
|
||||||
compile 'org.slf4j:slf4j-api:1.7.10'
|
compile 'org.slf4j:slf4j-api:1.7.10'
|
||||||
compile 'ch.qos.logback:logback-core:1.1.2'
|
compile 'ch.qos.logback:logback-core:1.1.2'
|
||||||
compile 'ch.qos.logback:logback-classic:1.1.2'
|
compile 'ch.qos.logback:logback-classic:1.1.2'
|
||||||
compile 'org.eclipse.jetty.aggregate:jetty-all:7.6.15.v20140411'
|
|
||||||
|
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
}
|
}
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
#!/usr/bin/env groovy
|
|
||||||
|
|
||||||
package com.jdbernard.net
|
|
||||||
|
|
||||||
import org.eclipse.jetty.server.Server
|
|
||||||
import org.eclipse.jetty.servlet.*
|
|
||||||
import groovy.servlet.*
|
|
||||||
|
|
||||||
|
|
||||||
def startJetty(int port) {
|
|
||||||
def server = new Server(port)
|
|
||||||
|
|
||||||
def handler = new ServletContextHandler(ServletContextHandler.SESSIONS)
|
|
||||||
handler.contextPath = '/'
|
|
||||||
handler.resourceBase = '.'
|
|
||||||
|
|
||||||
// Groovy Scripts
|
|
||||||
handler.addServlet(GroovyServlet, '*.groovy')
|
|
||||||
|
|
||||||
// Files
|
|
||||||
def filesHolder = handler.addServlet(DefaultServlet, '/')
|
|
||||||
filesHolder.setInitParameter('resourceBase', '.')
|
|
||||||
|
|
||||||
server.handler = handler
|
|
||||||
server.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length < 1) {
|
|
||||||
println "Usage: webServer.groovy <port>"
|
|
||||||
System.exit(1) }
|
|
||||||
|
|
||||||
println "Starting Jetty, press Ctrl-C to stop."
|
|
||||||
startJetty(Integer.parseInt(args[0]))
|
|
@ -11,17 +11,17 @@ package com.jdbernard.util
|
|||||||
class ConsoleProgressBar {
|
class ConsoleProgressBar {
|
||||||
int MAX_STEP = 30
|
int MAX_STEP = 30
|
||||||
|
|
||||||
int max = 10
|
long max = 10
|
||||||
def out = System.out
|
def out = System.out
|
||||||
private int lastStepAmount = -1
|
private int lastStepAmount = -1
|
||||||
private String lastLinePrinted = ""
|
private String lastLinePrinted = ""
|
||||||
private String lastInfo = ""
|
private String lastInfo = ""
|
||||||
private long startTime
|
private long startTime
|
||||||
|
|
||||||
public void setMax(int max) {
|
public void setMax(long max) {
|
||||||
this.max = Math.max(max, 1) }
|
this.max = Math.max(max, 1) }
|
||||||
|
|
||||||
void update(int value, String info) {
|
void update(long value, String info) {
|
||||||
if (value == 0 || startTime == 0)
|
if (value == 0 || startTime == 0)
|
||||||
startTime = System.currentTimeMillis()
|
startTime = System.currentTimeMillis()
|
||||||
|
|
||||||
@ -43,8 +43,8 @@ class ConsoleProgressBar {
|
|||||||
remTime /= 1000
|
remTime /= 1000
|
||||||
|
|
||||||
def numEq = Math.max(curStep - 1, 0)
|
def numEq = Math.max(curStep - 1, 0)
|
||||||
def remMin = curPercent < 0.05 ? '?' : (int) (remTime / 60)
|
def remMin = curPercent < 0.05 ? '?' : (long) (remTime / 60)
|
||||||
def remSec = curPercent < 0.05 ? '?' : (int) (((remTime / 60.0) - remMin) * 60)
|
def remSec = curPercent < 0.05 ? '?' : (long) (((remTime / 60.0) - remMin) * 60)
|
||||||
|
|
||||||
lastInfo = info
|
lastInfo = info
|
||||||
if (info.length() > 16) info = info[0..<16]
|
if (info.length() > 16) info = info[0..<16]
|
||||||
|
@ -170,12 +170,13 @@ public class LightOptionParser {
|
|||||||
else {
|
else {
|
||||||
if (!returnOpts.containsKey(optName))
|
if (!returnOpts.containsKey(optName))
|
||||||
returnOpts[optName] = []
|
returnOpts[optName] = []
|
||||||
returnOpts[optName] += retVal
|
|
||||||
|
|
||||||
if (optDef.longName) {
|
if (optDef.arguments == 1) returnOpts[optName] += retVal
|
||||||
if (!returnOpts.containsKey(optDef.longName))
|
else returnOpts[optName] << retVal
|
||||||
returnOpts[optDef.longName] = []
|
|
||||||
returnOpts[optDef.longName] += retVal } } }
|
|
||||||
|
if (optDef.longName)
|
||||||
|
returnOpts[optDef.longName] = returnOpts[optName] } }
|
||||||
|
|
||||||
/// This was not as option, it is an unclaomed argument.
|
/// This was not as option, it is an unclaomed argument.
|
||||||
else { returnOpts.args << args[i]; i++ } }
|
else { returnOpts.args << args[i]; i++ } }
|
||||||
|
157
src/main/java/com/jdbernard/util/AnsiEscapeCodeSequence.java
Normal file
157
src/main/java/com/jdbernard/util/AnsiEscapeCodeSequence.java
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/**
|
||||||
|
* # AnsiEscapeCodeSequence
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
* @org jdbernard.com/util/AnsiEscapeCodeSequence
|
||||||
|
* @copyright 2016 Jonathan Bernard
|
||||||
|
*/
|
||||||
|
package com.jdbernard.util;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The AnsiEscapeCodeSequence class is an extended wrapper around
|
||||||
|
* [ANSI escape codes].
|
||||||
|
*
|
||||||
|
* [ANSI escape codes]: http://en.wikipedia.org/wiki/ANSI_escape_code
|
||||||
|
*/
|
||||||
|
public class AnsiEscapeCodeSequence {
|
||||||
|
|
||||||
|
public static final String CSI = "\u001b[";
|
||||||
|
|
||||||
|
public static final Pattern ANSI_SEQ_PATTERN =
|
||||||
|
Pattern.compile("\u001b\\[[^a-zA-Z]+[a-zA-Z]");
|
||||||
|
|
||||||
|
public static enum Colors {
|
||||||
|
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, EXT, DEFAULT }
|
||||||
|
|
||||||
|
public static enum Erase { ToEnd, ToBeginning, All }
|
||||||
|
|
||||||
|
public static String strip(String input) {
|
||||||
|
return ANSI_SEQ_PATTERN.matcher(input).replaceAll(""); }
|
||||||
|
|
||||||
|
public StringBuilder value = new StringBuilder();
|
||||||
|
|
||||||
|
public String toString() { return value.toString(); }
|
||||||
|
|
||||||
|
// Multiple methods for various forms of SGR
|
||||||
|
public AnsiEscapeCodeSequence color(Colors fg, Colors bg, boolean bright) {
|
||||||
|
value.append(CSI);
|
||||||
|
value.append(bright ? "1" : "22");
|
||||||
|
if (fg != null) {
|
||||||
|
value.append(";3");
|
||||||
|
value.append(Integer.toString(fg.ordinal())); }
|
||||||
|
|
||||||
|
if (bg != null) {
|
||||||
|
value.append(";4");
|
||||||
|
value.append(Integer.toString(bg.ordinal())); }
|
||||||
|
|
||||||
|
value.append("m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence resetText() {
|
||||||
|
value.append(CSI).append("0m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence blinkSlow() {
|
||||||
|
value.append(CSI).append("5m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence blinkFast() {
|
||||||
|
value.append(CSI).append("6m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence invertColors() {
|
||||||
|
value.append(CSI).append("7m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence strikethrough() {
|
||||||
|
value.append(CSI).append("9m");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
// Other ANSI escape codes
|
||||||
|
public AnsiEscapeCodeSequence cursorUp() { return cursorUp(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorUp(int cells) {
|
||||||
|
value.append(CSI).append(Integer.toString(cells)).append("A");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorDown() { return cursorDown(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorDown(int cells) {
|
||||||
|
value.append(CSI).append(Integer.toString(cells)).append("B");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorForward() { return cursorForward(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorForward(int cells) {
|
||||||
|
value.append(CSI).append(Integer.toString(cells)).append("C");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorBackward() { return cursorBackward(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorBackward(int cells) {
|
||||||
|
value.append(CSI).append(Integer.toString(cells)).append("D");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorNextLine() { return cursorNextLine(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorNextLine(int lines) {
|
||||||
|
value.append(CSI).append(Integer.toString(lines)).append("E");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorPrevLine() { return cursorPrevLine(1); }
|
||||||
|
public AnsiEscapeCodeSequence cursorPrevLine(int lines) {
|
||||||
|
value.append(CSI).append(Integer.toString(lines)).append("F");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorHorizontalAbsolute(int column) {
|
||||||
|
value.append(CSI).append(Integer.toString(column)).append("G");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorPosition(int row, int column) {
|
||||||
|
value.append(CSI)
|
||||||
|
.append(Integer.toString(row))
|
||||||
|
.append(";")
|
||||||
|
.append(Integer.toString(column))
|
||||||
|
.append("H");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence eraseDisplay() {
|
||||||
|
return eraseDisplay(Erase.ToEnd); }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence eraseDisplay(Erase how) {
|
||||||
|
value.append(CSI)
|
||||||
|
.append(Integer.toString(how.ordinal()))
|
||||||
|
.append("J");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence eraseLine() { return eraseLine(Erase.ToEnd); }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence eraseLine(Erase how) {
|
||||||
|
value.append(CSI)
|
||||||
|
.append(Integer.toString(how.ordinal()))
|
||||||
|
.append("K");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence scrollUp() { return scrollUp(1); }
|
||||||
|
public AnsiEscapeCodeSequence scrollUp(int lines) {
|
||||||
|
value.append(CSI).append(Integer.toString(lines)).append("S");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence scrollDown() { return scrollDown(1); }
|
||||||
|
public AnsiEscapeCodeSequence scrollDown(int lines) {
|
||||||
|
value.append(CSI).append(Integer.toString(lines)).append("T");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence cursorHVPosition(int row, int column) {
|
||||||
|
value.append(CSI)
|
||||||
|
.append(Integer.toString(row))
|
||||||
|
.append(";")
|
||||||
|
.append(Integer.toString(column))
|
||||||
|
.append("f");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence saveCursor() {
|
||||||
|
value.append(CSI).append("s");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
public AnsiEscapeCodeSequence restoreCursor() {
|
||||||
|
value.append(CSI).append("u");
|
||||||
|
return this; }
|
||||||
|
|
||||||
|
}
|
@ -58,8 +58,8 @@ public class LightOptionParserTests extends GroovyTestCase {
|
|||||||
assert opts.c == ["cfgFile"]
|
assert opts.c == ["cfgFile"]
|
||||||
assert opts['config-file'] == ["cfgFile"]
|
assert opts['config-file'] == ["cfgFile"]
|
||||||
assert opts.args == ["arg1", "arg2"]
|
assert opts.args == ["arg1", "arg2"]
|
||||||
assert opts.i == ["in1", "in2", "in3", "in4"]
|
assert opts.i == [["in1", "in2", "in3"], ["in4"]]
|
||||||
assert opts["input-file"] == ["in1", "in2", "in3", "in4"]
|
assert opts["input-file"] == [["in1", "in2", "in3"], ["in4"]]
|
||||||
assert opts.o == ["out1", "out2"]
|
assert opts.o == [["out1", "out2"]]
|
||||||
assert opts["output-file2"] == ["out1", "out2"] }
|
assert opts["output-file2"] == [["out1", "out2"]] }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user