From 399473a583018927ef4a4dcaa2aa14502bb96885 Mon Sep 17 00:00:00 2001 From: Tomek Szmytka Date: Sun, 3 Jan 2021 20:22:32 +0100 Subject: [PATCH] Handle SGRs with multiple options --- .../fusesource/jansi/io/AnsiProcessor.java | 3 +++ .../jansi/io/AnsiOutputStreamTest.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/test/java/org/fusesource/jansi/io/AnsiOutputStreamTest.java diff --git a/src/main/java/org/fusesource/jansi/io/AnsiProcessor.java b/src/main/java/org/fusesource/jansi/io/AnsiProcessor.java index 8fefe92f..507e5a49 100644 --- a/src/main/java/org/fusesource/jansi/io/AnsiProcessor.java +++ b/src/main/java/org/fusesource/jansi/io/AnsiProcessor.java @@ -128,6 +128,9 @@ protected boolean processEscapeCommand(ArrayList options, int command) t } else if (100 <= value && value <= 107) { processSetBackgroundColor(value - 100, true); } else if (value == 38 || value == 48) { + if (!optionsIterator.hasNext()) { + continue; + } // extended color like `esc[38;5;m` or `esc[38;2;;;m` int arg2or5 = getNextOptionInt(optionsIterator); if (arg2or5 == 2) { diff --git a/src/test/java/org/fusesource/jansi/io/AnsiOutputStreamTest.java b/src/test/java/org/fusesource/jansi/io/AnsiOutputStreamTest.java new file mode 100644 index 00000000..cc2f6697 --- /dev/null +++ b/src/test/java/org/fusesource/jansi/io/AnsiOutputStreamTest.java @@ -0,0 +1,22 @@ +package org.fusesource.jansi.io; + +import org.fusesource.jansi.AnsiColors; +import org.fusesource.jansi.AnsiMode; +import org.fusesource.jansi.AnsiType; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AnsiOutputStreamTest { + @Test + void canHandleSgrsWithMultipleOptions() throws IOException { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final AnsiOutputStream ansiOutput = new AnsiOutputStream(baos, AnsiMode.Strip, null, AnsiType.Emulation, AnsiColors.TrueColor, Charset.forName("UTF-8"), null, null, false); + ansiOutput.write("\u001B[33mbanana_1 |\u001B[0m 19:59:14.353\u001B[0;38m [debug] Lager installed handler {lager_file_backend,\"banana.log\"} into lager_event\u001B[0m\n".getBytes()); + assertEquals("banana_1 | 19:59:14.353 [debug] Lager installed handler {lager_file_backend,\"banana.log\"} into lager_event\n", baos.toString()); + } +}