Skip to content

Commit 22d84a4

Browse files
committed
Use our own markdown rendering
It's faster, has fewer bugs and is easier to fix and customize Signed-off-by: David Gageot <david.gageot@docker.com>
1 parent be84e6a commit 22d84a4

File tree

9 files changed

+375
-65
lines changed

9 files changed

+375
-65
lines changed

go.mod

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ require (
1212
github.com/aymanbagabas/go-udiff v0.3.1
1313
github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
1414
github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250930175933-4cafc092c5e7
15-
github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
1615
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
1716
github.com/dop251/goja v0.0.0-20251008123653-cf18d89f3cf6
1817
github.com/fatih/color v1.18.0
@@ -24,11 +23,13 @@ require (
2423
github.com/labstack/echo/v4 v4.13.4
2524
github.com/mattn/go-runewidth v0.0.19
2625
github.com/modelcontextprotocol/go-sdk v1.0.0
26+
github.com/muesli/termenv v0.16.0
2727
github.com/sashabaranov/go-openai v1.41.2
2828
github.com/spf13/cobra v1.10.1
2929
github.com/stretchr/testify v1.11.1
3030
github.com/temoto/robotstxt v1.1.2
3131
github.com/xeipuuv/gojsonschema v1.2.0
32+
github.com/yuin/goldmark v1.7.13
3233
go.opentelemetry.io/otel v1.38.0
3334
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0
3435
go.opentelemetry.io/otel/sdk v1.38.0
@@ -44,13 +45,12 @@ require (
4445
cloud.google.com/go/auth v0.16.5 // indirect
4546
cloud.google.com/go/compute/metadata v0.8.0 // indirect
4647
github.com/JohannesKaufmann/dom v0.2.0 // indirect
47-
github.com/aymerick/douceur v0.2.0 // indirect
48+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
4849
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
4950
github.com/charmbracelet/colorprofile v0.3.2 // indirect
5051
github.com/charmbracelet/ultraviolet v0.0.0-20250915111650-81d4262876ef // indirect
5152
github.com/charmbracelet/x/ansi v0.10.2 // indirect
5253
github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect
53-
github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d // indirect
5454
github.com/charmbracelet/x/term v0.2.1 // indirect
5555
github.com/charmbracelet/x/termios v0.1.1 // indirect
5656
github.com/charmbracelet/x/windows v0.2.2 // indirect
@@ -71,7 +71,6 @@ require (
7171
github.com/google/s2a-go v0.1.9 // indirect
7272
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
7373
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
74-
github.com/gorilla/css v1.0.1 // indirect
7574
github.com/gorilla/websocket v1.5.3 // indirect
7675
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
7776
github.com/inconshreveable/mousetrap v1.1.0 // indirect
@@ -80,7 +79,6 @@ require (
8079
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
8180
github.com/mattn/go-colorable v0.1.14 // indirect
8281
github.com/mattn/go-isatty v0.0.20 // indirect
83-
github.com/microcosm-cc/bluemonday v1.0.27 // indirect
8482
github.com/mitchellh/go-homedir v1.1.0 // indirect
8583
github.com/muesli/cancelreader v0.2.2 // indirect
8684
github.com/ncruces/go-strftime v0.1.9 // indirect
@@ -104,8 +102,6 @@ require (
104102
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
105103
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
106104
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
107-
github.com/yuin/goldmark v1.7.13 // indirect
108-
github.com/yuin/goldmark-emoji v1.0.6 // indirect
109105
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
110106
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect
111107
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect

go.sum

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ github.com/anthropics/anthropic-sdk-go v1.14.0 h1:EzNQvnZlaDHe2UPkoUySDz3ixRgNbw
2626
github.com/anthropics/anthropic-sdk-go v1.14.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE=
2727
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
2828
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
29+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
30+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
2931
github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
3032
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
31-
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
32-
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
3333
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
3434
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
3535
github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2 h1:973OHYuq2Jx9deyuPwe/6lsuQrDCatOsjP8uCd02URE=
@@ -38,8 +38,6 @@ github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250930175933-4cafc092c5e
3838
github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250930175933-4cafc092c5e7/go.mod h1:5IzIGXU1n0foRc8bRAherC8ZuQCQURPlwx3ANLq1138=
3939
github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
4040
github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
41-
github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w=
42-
github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018/go.mod h1:Z/GLmp9fzaqX4ze3nXG7StgWez5uBM5XtlLHK8V/qSk=
4341
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea h1:g1HfUgSMvye8mgecMD1mPscpt+pzJoDEiSA+p2QXzdQ=
4442
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea/go.mod h1:ngHerf1JLJXBrDXdphn5gFrBPriCL437uwukd5c93pM=
4543
github.com/charmbracelet/ultraviolet v0.0.0-20250915111650-81d4262876ef h1:VrWaUi2LXYLjfjCHowdSOEc6dQ9Ro14KY7Bw4IWd19M=
@@ -50,8 +48,6 @@ github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSN
5048
github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a/go.mod h1:rc2bsPC6MWae3LdOxNO1mOb443NlMrrDL0xEya48NNc=
5149
github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
5250
github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
53-
github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d h1:H2oh4WlSsXy8qwLd7I3eAvPd/X3S40aM9l+h47WF1eA=
54-
github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms=
5551
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
5652
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
5753
github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY=
@@ -111,8 +107,6 @@ github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81
111107
github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
112108
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
113109
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
114-
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
115-
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
116110
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
117111
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
118112
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
@@ -143,14 +137,14 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
143137
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
144138
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
145139
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
146-
github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
147-
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
148140
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
149141
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
150142
github.com/modelcontextprotocol/go-sdk v1.0.0 h1:Z4MSjLi38bTgLrd/LjSmofqRqyBiVKRyQSJgw8q8V74=
151143
github.com/modelcontextprotocol/go-sdk v1.0.0/go.mod h1:nYtYQroQ2KQiM0/SbyEPUWQ6xs4B95gJjEalc9AQyOs=
152144
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
153145
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
146+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
147+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
154148
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
155149
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
156150
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -221,8 +215,6 @@ github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zI
221215
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
222216
github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA=
223217
github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg=
224-
github.com/yuin/goldmark-emoji v1.0.6 h1:QWfF2FYaXwL74tfGOW5izeiZepUDroDJfWubQI9HTHs=
225-
github.com/yuin/goldmark-emoji v1.0.6/go.mod h1:ukxJDKFpdFb5x0a5HqbdlcKtebh086iJpI31LTKmWuA=
226218
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
227219
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
228220
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18=
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package markdown
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime"
7+
)
8+
9+
func supportsHyperlinks() bool {
10+
if version, found := os.LookupEnv("VTE_VERSION"); found {
11+
major, _ := parseVersion(version)
12+
return major > 5000
13+
}
14+
15+
if term, found := os.LookupEnv("TERM_PROGRAM"); found {
16+
switch term {
17+
case "ghostty", "Tabby", "rio":
18+
return true
19+
case "Hyper":
20+
// Renders correctly but not clickable
21+
return false
22+
}
23+
24+
major, minor := parseVersion(os.Getenv("TERM_PROGRAM_VERSION"))
25+
switch term {
26+
case "iTerm.app":
27+
return major > 3 || (major == 3 && minor >= 1)
28+
case "WezTerm":
29+
return major >= 20200620
30+
case "vscode":
31+
return major > 1 || (major == 1 && minor >= 72)
32+
}
33+
}
34+
35+
if emulator, found := os.LookupEnv("TERMINAL_EMULATOR"); found {
36+
if emulator == "JetBrains-JediTerm" {
37+
return true
38+
}
39+
}
40+
41+
if _, found := os.LookupEnv("ALACRITTY_WINDOW_ID"); found {
42+
return true
43+
}
44+
if _, found := os.LookupEnv("BYOBU_TERM"); found {
45+
return true
46+
}
47+
48+
return runtime.GOOS == "windows"
49+
}
50+
51+
func parseVersion(version string) (int, int) {
52+
var major, minor, patch int
53+
_, _ = fmt.Sscanf(version, "%d.%d.%d", &major, &minor, &patch)
54+
return major, minor
55+
}

0 commit comments

Comments
 (0)