diff --git a/assets/components/LogViewer/LogEventSource.spec.ts b/assets/components/LogViewer/LogEventSource.spec.ts index ea45c053..51c529ee 100644 --- a/assets/components/LogViewer/LogEventSource.spec.ts +++ b/assets/components/LogViewer/LogEventSource.spec.ts @@ -140,19 +140,6 @@ describe("", () => { expect(wrapper.find("ul.events").html()).toMatchSnapshot(); }); - test("should render messages with color", async () => { - const wrapper = createLogEventSource(); - sources[sourceUrl].emitOpen(); - sources[sourceUrl].emitMessage({ - data: '{"ts":1560336942459,"m":"\\u001b[30mblack\\u001b[37mwhite", "id":1}', - }); - - vi.runAllTimers(); - await nextTick(); - - expect(wrapper.find("ul.events").html()).toMatchSnapshot(); - }); - test("should render messages with html entities", async () => { const wrapper = createLogEventSource(); sources[sourceUrl].emitOpen(); diff --git a/assets/components/LogViewer/SimpleLogItem.vue b/assets/components/LogViewer/SimpleLogItem.vue index d32457d5..475e5916 100644 --- a/assets/components/LogViewer/SimpleLogItem.vue +++ b/assets/components/LogViewer/SimpleLogItem.vue @@ -5,26 +5,22 @@
diff --git a/internal/docker/event_generator.go b/internal/docker/event_generator.go index a96458f0..8035e9a0 100644 --- a/internal/docker/event_generator.go +++ b/internal/docker/event_generator.go @@ -79,6 +79,9 @@ func (g *EventGenerator) consumeReader() { message, streamType, readerError := readEvent(g.reader, g.tty) if message != "" { logEvent := createEvent(message, streamType) + if _, ok := logEvent.Message.(string); ok { + logEvent.Message = stripANSI(logEvent.Message.(string)) + } logEvent.Level = guessLogLevel(logEvent) g.buffer <- logEvent } diff --git a/internal/docker/level_guesser.go b/internal/docker/level_guesser.go index 427288ef..056b4ac0 100644 --- a/internal/docker/level_guesser.go +++ b/internal/docker/level_guesser.go @@ -6,7 +6,6 @@ import ( ) var KEY_VALUE_REGEX = regexp.MustCompile(`level=(\w+)`) -var ANSI_COLOR_REGEX = regexp.MustCompile(`\x1b\[[0-9;]*m`) var LOG_LEVELS = []string{"error", "warn", "warning", "info", "debug", "trace", "fatal"} var LOG_LEVELS_PLAIN = map[string]*regexp.Regexp{} var LOG_LEVEL_BRACKET = map[string]*regexp.Regexp{} @@ -24,13 +23,12 @@ func init() { func guessLogLevel(logEvent *LogEvent) string { switch value := logEvent.Message.(type) { case string: - stripped := ANSI_COLOR_REGEX.ReplaceAllString(value, "") // remove ansi color codes for _, level := range LOG_LEVELS { - if LOG_LEVELS_PLAIN[level].MatchString(stripped) { + if LOG_LEVELS_PLAIN[level].MatchString(value) { return level } - if LOG_LEVEL_BRACKET[level].MatchString(stripped) { + if LOG_LEVEL_BRACKET[level].MatchString(value) { return level } diff --git a/internal/docker/stripansi.go b/internal/docker/stripansi.go new file mode 100644 index 00000000..6cfa2448 --- /dev/null +++ b/internal/docker/stripansi.go @@ -0,0 +1,13 @@ +package docker + +import ( + "regexp" +) + +const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))" + +var re = regexp.MustCompile(ansi) + +func stripANSI(str string) string { + return re.ReplaceAllString(str, "") +} diff --git a/package.json b/package.json index 40e36e3a..65bb4380 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "@vueuse/integrations": "^10.7.1", "@vueuse/math": "^10.7.1", "@vueuse/router": "^10.7.1", - "ansi-to-html": "^0.7.2", "autoprefixer": "^10.4.16", "d3-array": "^3.2.4", "d3-ease": "^3.0.1", @@ -59,7 +58,6 @@ "postcss": "^8.4.32", "postcss-mixins": "^9.0.4", "splitpanes": "^3.1.5", - "strip-ansi": "^7.1.0", "tailwindcss": "^3.4.0", "unplugin-auto-import": "^0.17.3", "unplugin-icons": "^0.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e74b963..75ecd503 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,6 @@ dependencies: '@vueuse/router': specifier: ^10.7.1 version: 10.7.1(vue-router@4.2.5)(vue@3.3.13) - ansi-to-html: - specifier: ^0.7.2 - version: 0.7.2 autoprefixer: specifier: ^10.4.16 version: 10.4.16(postcss@8.4.32) @@ -98,9 +95,6 @@ dependencies: splitpanes: specifier: ^3.1.5 version: 3.1.5 - strip-ansi: - specifier: ^7.1.0 - version: 7.1.0 tailwindcss: specifier: ^3.4.0 version: 3.4.0(ts-node@10.9.2) @@ -2031,6 +2025,7 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -2049,14 +2044,6 @@ packages: engines: {node: '>=12'} dev: true - /ansi-to-html@0.7.2: - resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - entities: 2.2.0 - dev: false - /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -2714,10 +2701,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: false - /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -4645,6 +4628,7 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}