Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 34 additions & 6 deletions markup/highlight/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ type Config struct {
NoClasses bool

// When set, line numbers will be printed.
LineNos bool
LineNos any
LineNumbersInTable bool

// When set, add links to line numbers
Expand All @@ -85,16 +85,44 @@ type Config struct {
GuessSyntax bool
}

func (cfg Config) toHTMLOptions() []html.Option {
var lineAnchors string
const errLineNosMsg = `lineNos must be one of true, false, "inline", or "table"; got %[1]v (%[1]T)`

func (cfg Config) toHTMLOptions() ([]html.Option, error) {
var (
lineAnchors string
lineNos bool
inTable = cfg.LineNumbersInTable
)

if cfg.LineAnchors != "" {
lineAnchors = cfg.LineAnchors + "-"
}

switch v := cfg.LineNos.(type) {
case string:
switch v {
case "inline":
lineNos = true
inTable = false
case "table":
lineNos = true
inTable = true
default:
return nil, fmt.Errorf(errLineNosMsg, v)
}
case bool:
lineNos = v
case nil:
lineNos = false
default:
return nil, fmt.Errorf(errLineNosMsg, v)
}

options := []html.Option{
html.TabWidth(cfg.TabWidth),
html.WithLineNumbers(cfg.LineNos),
html.WithLineNumbers(lineNos),
html.BaseLineNumber(cfg.LineNoStart),
html.LineNumbersInTable(cfg.LineNumbersInTable),
html.LineNumbersInTable(inTable),
html.WithClasses(!cfg.NoClasses),
html.WithLinkableLineNumbers(cfg.AnchorLineNos, lineAnchors),
html.InlineCode(cfg.Hl_inline),
Expand All @@ -117,7 +145,7 @@ func (cfg Config) toHTMLOptions() []html.Option {
}
}

return options
return options, nil
}

func applyOptions(opts any, cfg *Config) error {
Expand Down
6 changes: 5 additions & 1 deletion markup/highlight/highlight.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,11 @@ func highlight(fw hugio.FlexiWriter, code, lang string, attributes []attributes.
writeDivStart(w, attributes, cfg.WrapperClass)
}

options := cfg.toHTMLOptions()
options, err := cfg.toHTMLOptions()
if err != nil {
return 0, 0, err
}

var wrapper html.PreWrapper

if cfg.Hl_inline {
Expand Down
74 changes: 74 additions & 0 deletions markup/highlight/highlight_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
package highlight_test

import (
"strings"
"testing"

qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/hugolib"
)

Expand Down Expand Up @@ -129,3 +131,75 @@ xəx := 0
<div class="highlight no-prose"><pre
`)
}

func TestHighlightLineNos(t *testing.T) {
t.Parallel()
c := qt.New(t)

files := `
-- config.toml --
disableKinds = ['page','rss','section','sitemap','taxonomy','term']
[markup.highlight]
noClasses = false
lineNoStart = 42
#LINENOS
-- content/_index.md --
---
title: home
---
§§§go
aaa
§§§
-- layouts/index.html --
{{ .Content }}
`

b := hugolib.Test(t, files)
b.AssertFileContent("public/index.html",
`<span class="nx">aaa</span>`,
`! <table class="lntable">`,
`! 42`,
)

f := strings.ReplaceAll(files, "#LINENOS", `linenos = false`)
b = hugolib.Test(t, f)
b.AssertFileContent("public/index.html",
`<span class="nx">aaa</span>`,
`! <table class="lntable">`,
`! 42`,
)

f = strings.ReplaceAll(files, "#LINENOS", `linenos = true`)
b = hugolib.Test(t, f)
b.AssertFileContent("public/index.html",
`<span class="nx">aaa</span>`,
`<table class="lntable">`,
`42`,
)

f = strings.ReplaceAll(files, "#LINENOS", `linenos = "table"`)
b = hugolib.Test(t, f)
b.AssertFileContent("public/index.html",
`<span class="nx">aaa</span>`,
`<table class="lntable">`,
`42`,
)

f = strings.ReplaceAll(files, "#LINENOS", `linenos = "inline"`)
b = hugolib.Test(t, f)
b.AssertFileContent("public/index.html",
`<span class="nx">aaa</span>`,
`! <table class="lntable">`,
`42`,
)

want := `.* lineNos must be one of .*`

f = strings.ReplaceAll(files, "#LINENOS", `linenos = "foo"`)
b, err := hugolib.TestE(c, f)
b.Assert(err, qt.ErrorMatches, want)

f = strings.ReplaceAll(files, "#LINENOS", `linenos = 123`)
b, err = hugolib.TestE(c, f)
b.Assert(err, qt.ErrorMatches, want)
}