diff --git a/pkg/hicli/html.go b/pkg/hicli/html.go
index d9c78d4..8eaedb1 100644
--- a/pkg/hicli/html.go
+++ b/pkg/hicli/html.go
@@ -625,6 +625,20 @@ var CodeBlockFormatter = chromahtml.New(
chromahtml.WithLineNumbers(true),
)
+type lineRewriter struct {
+ w *strings.Builder
+}
+
+var lineNumberRewriter = regexp.MustCompile(`(\s*\d+)`)
+var lineNumberReplacement = []byte(``)
+
+func (lr *lineRewriter) Write(p []byte) (n int, err error) {
+ n = len(p)
+ p = lineNumberRewriter.ReplaceAll(p, lineNumberReplacement)
+ lr.w.Write(p)
+ return
+}
+
func writeCodeBlock(w *strings.Builder, language string, block *strings.Builder) {
lexer := lexers.Get(language)
if lexer == nil {
@@ -642,7 +656,7 @@ func writeCodeBlock(w *strings.Builder, language string, block *strings.Builder)
w.WriteString("")
return
}
- err = CodeBlockFormatter.Format(w, styles.Fallback, iter)
+ err = CodeBlockFormatter.Format(&lineRewriter{w}, styles.Fallback, iter)
if err != nil {
// This should never fail
panic(err)
diff --git a/pkg/hicli/sync.go b/pkg/hicli/sync.go
index 957dc0f..15d0852 100644
--- a/pkg/hicli/sync.go
+++ b/pkg/hicli/sync.go
@@ -430,7 +430,7 @@ func (h *HiClient) calculateLocalContent(ctx context.Context, dbEvt *database.Ev
return nil, nil
}
-const CurrentHTMLSanitizerVersion = 6
+const CurrentHTMLSanitizerVersion = 7
func (h *HiClient) ReprocessExistingEvent(ctx context.Context, evt *database.Event) {
if (evt.Type != event.EventMessage.Type && evt.DecryptedType != event.EventMessage.Type) ||
diff --git a/web/src/ui/timeline/content/index.css b/web/src/ui/timeline/content/index.css
index 7552e5d..b923f1a 100644
--- a/web/src/ui/timeline/content/index.css
+++ b/web/src/ui/timeline/content/index.css
@@ -113,6 +113,15 @@ div.html-body {
&.chroma {
background-color: var(--codeblock-background-color);
+
+ span.line > span.ln {
+ -webkit-user-select: initial;
+ user-select: initial;
+
+ &::before {
+ content: attr(data-linenum);
+ }
+ }
}
}