From 1d4be4bd8d86f4fcf2c66858e7ce5b7411ab4349 Mon Sep 17 00:00:00 2001 From: Johan Walles Date: Sun, 17 Dec 2023 07:56:05 +0100 Subject: [PATCH 1/4] Simplify some code --- m/ansiTokenizer.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/m/ansiTokenizer.go b/m/ansiTokenizer.go index cdfd1726..240338d7 100644 --- a/m/ansiTokenizer.go +++ b/m/ansiTokenizer.go @@ -93,12 +93,7 @@ func ConsumeLessTermcapEnvs() { setStyleFromEnv(&manPageBold, "LESS_TERMCAP_md") setStyleFromEnv(&manPageUnderline, "LESS_TERMCAP_us") - - value := os.Getenv("LESS_TERMCAP_so") - if value != "" { - _standoutStyle := termcapToStyle(value) - standoutStyle = &_standoutStyle - } + setStyleFromEnv(standoutStyle, "LESS_TERMCAP_so") } func termcapToStyle(termcap string) twin.Style { From 5c5656cbf70f49ae4e032f5ee7bd9a8fdcbf166a Mon Sep 17 00:00:00 2001 From: Johan Walles Date: Sun, 17 Dec 2023 07:59:05 +0100 Subject: [PATCH 2/4] Start changing some code Doesn't compile now, go fix. --- m/ansiTokenizer.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/m/ansiTokenizer.go b/m/ansiTokenizer.go index 240338d7..30f4d5a5 100644 --- a/m/ansiTokenizer.go +++ b/m/ansiTokenizer.go @@ -77,9 +77,12 @@ func (line *Line) Plain(lineNumberOneBased *int) string { return *line.plain } -func setStyleFromEnv(updateMe *twin.Style, envVarName string) { +func setStyle(updateMe *twin.Style, envVarName string, fallback *twin.Style) { envValue := os.Getenv(envVarName) if envValue == "" { + if fallback != nil { + *updateMe = *fallback + } return } @@ -91,9 +94,9 @@ func setStyleFromEnv(updateMe *twin.Style, envVarName string) { func ConsumeLessTermcapEnvs() { // Requested here: https://github.com/walles/moar/issues/14 - setStyleFromEnv(&manPageBold, "LESS_TERMCAP_md") - setStyleFromEnv(&manPageUnderline, "LESS_TERMCAP_us") - setStyleFromEnv(standoutStyle, "LESS_TERMCAP_so") + setStyle(&manPageBold, "LESS_TERMCAP_md") + setStyle(&manPageUnderline, "LESS_TERMCAP_us") + setStyle(standoutStyle, "LESS_TERMCAP_so", nil) } func termcapToStyle(termcap string) twin.Style { From a7d8e05daa7369c1411a229faf608276a4f5adec Mon Sep 17 00:00:00 2001 From: Johan Walles Date: Sun, 17 Dec 2023 08:17:58 +0100 Subject: [PATCH 3/4] Some more not-yet-compiling code --- m/ansiTokenizer.go | 7 ++++--- m/pager.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/m/ansiTokenizer.go b/m/ansiTokenizer.go index 30f4d5a5..1464c4c3 100644 --- a/m/ansiTokenizer.go +++ b/m/ansiTokenizer.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" + "github.com/alecthomas/chroma/v2" "github.com/walles/moar/twin" ) @@ -91,11 +92,11 @@ func setStyle(updateMe *twin.Style, envVarName string, fallback *twin.Style) { // ConsumeLessTermcapEnvs parses LESS_TERMCAP_xx environment variables and // adapts the moar output accordingly. -func ConsumeLessTermcapEnvs() { +func ConsumeLessTermcapEnvs(chromaStyle *chroma.Style, chromaFormatter *chroma.Formatter) { // Requested here: https://github.com/walles/moar/issues/14 - setStyle(&manPageBold, "LESS_TERMCAP_md") - setStyle(&manPageUnderline, "LESS_TERMCAP_us") + setStyle(&manPageBold, "LESS_TERMCAP_md", twinStyleFromChroma(chromaStyle, chromaFormatter, chroma.GenericStrong)) + setStyle(&manPageUnderline, "LESS_TERMCAP_us", twinStyleFromChroma(chromaStyle, chromaFormatter, chroma.GenericUnderline)) setStyle(standoutStyle, "LESS_TERMCAP_so", nil) } diff --git a/m/pager.go b/m/pager.go index 5175baa7..10130258 100644 --- a/m/pager.go +++ b/m/pager.go @@ -482,7 +482,7 @@ func (p *Pager) StartPaging(screen twin.Screen) { }() unprintableStyle = p.UnprintableStyle - ConsumeLessTermcapEnvs() + ConsumeLessTermcapEnvs(p.ChromaStyle, p.ChromaFormatter) p.screen = screen p.initStyle() From b2bd0bbe617a9f22002887c665ece21c18d5f2f4 Mon Sep 17 00:00:00 2001 From: Johan Walles Date: Sun, 17 Dec 2023 08:26:50 +0100 Subject: [PATCH 4/4] Get man page styles from Chroma Untested. --- m/ansiTokenizer.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/m/ansiTokenizer.go b/m/ansiTokenizer.go index 1464c4c3..1fd6cba4 100644 --- a/m/ansiTokenizer.go +++ b/m/ansiTokenizer.go @@ -7,6 +7,8 @@ import ( "strconv" "strings" + log "github.com/sirupsen/logrus" + "github.com/alecthomas/chroma/v2" "github.com/walles/moar/twin" ) @@ -90,6 +92,30 @@ func setStyle(updateMe *twin.Style, envVarName string, fallback *twin.Style) { *updateMe = termcapToStyle(envValue) } +func twinStyleFromChroma(chromaStyle *chroma.Style, chromaFormatter *chroma.Formatter, chromaToken chroma.TokenType) *twin.Style { + if chromaStyle == nil || chromaFormatter == nil { + return nil + } + + stringBuilder := strings.Builder{} + err := (*chromaFormatter).Format(&stringBuilder, chromaStyle, chroma.Literator(chroma.Token{ + Type: chromaToken, + Value: "X", + })) + if err != nil { + panic(err) + } + + formatted := stringBuilder.String() + cells := cellsFromString(formatted, nil).Cells + if len(cells) != 1 { + log.Warnf("Chroma formatter didn't return exactly one cell: %#v", cells) + return nil + } + + return &cells[0].Style +} + // ConsumeLessTermcapEnvs parses LESS_TERMCAP_xx environment variables and // adapts the moar output accordingly. func ConsumeLessTermcapEnvs(chromaStyle *chroma.Style, chromaFormatter *chroma.Formatter) {