mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-28 22:11:48 -05:00
markup/goldmark: Use Ordinal to create default lineanchors
The `Ordinal` starts at 0, so with a `hl-` prefix, this gives `hl-0-1` as a starting point. Fixes #9567
This commit is contained in:
parent
78afdb88ab
commit
0f80be341f
3 changed files with 41 additions and 34 deletions
|
@ -288,6 +288,20 @@ func TestConvertAttributes(t *testing.T) {
|
||||||
"```bash {linenos=table, anchorlinenos=true, lineanchors=org-coderef--xyz}\necho 'foo';\n```",
|
"```bash {linenos=table, anchorlinenos=true, lineanchors=org-coderef--xyz}\necho 'foo';\n```",
|
||||||
"<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\" id=\"org-coderef--xyz-1\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#org-coderef--xyz-1\">1</a>\n</span></code></pre></td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\"><span class=\"nb\">echo</span> <span class=\"s1\">'foo'</span><span class=\"p\">;</span>\n</span></span></code></pre></td></tr></table>\n</div>\n</div>",
|
"<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class=\"lnt\" id=\"org-coderef--xyz-1\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#org-coderef--xyz-1\">1</a>\n</span></code></pre></td>\n<td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"cl\"><span class=\"nb\">echo</span> <span class=\"s1\">'foo'</span><span class=\"p\">;</span>\n</span></span></code></pre></td></tr></table>\n</div>\n</div>",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Code block, CodeFences=true,lineanchors, default ordinal",
|
||||||
|
func(conf *markup_config.Config) {
|
||||||
|
withBlockAttributes(conf)
|
||||||
|
conf.Highlight.CodeFences = true
|
||||||
|
conf.Highlight.NoClasses = false
|
||||||
|
},
|
||||||
|
"```bash {linenos=inline, anchorlinenos=true}\necho 'foo';\nnecho 'bar';\n```\n\n```bash {linenos=inline, anchorlinenos=true}\necho 'baz';\nnecho 'qux';\n```",
|
||||||
|
[]string{
|
||||||
|
"<span class=\"ln\" id=\"hl-0-1\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#hl-0-1\">1</a></span><span class=\"cl\"><span class=\"nb\">echo</span> <span class=\"s1\">'foo'</span>",
|
||||||
|
"<span class=\"ln\" id=\"hl-0-2\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#hl-0-2\">2</a></span><span class=\"cl\">necho <span class=\"s1\">'bar'</span>",
|
||||||
|
"<span class=\"ln\" id=\"hl-1-2\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#hl-1-2\">2</a></span><span class=\"cl\">necho <span class=\"s1\">'qux'</span>",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Paragraph",
|
"Paragraph",
|
||||||
withBlockAttributes,
|
withBlockAttributes,
|
||||||
|
|
|
@ -23,10 +23,19 @@ import (
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/config"
|
"github.com/gohugoio/hugo/config"
|
||||||
|
"github.com/gohugoio/hugo/markup/converter/hooks"
|
||||||
|
|
||||||
"github.com/mitchellh/mapstructure"
|
"github.com/mitchellh/mapstructure"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
lineanchorsKey = "lineanchors"
|
||||||
|
lineNosKey = "linenos"
|
||||||
|
hlLinesKey = "hl_lines"
|
||||||
|
linosStartKey = "linenostart"
|
||||||
|
noHlKey = "nohl"
|
||||||
|
)
|
||||||
|
|
||||||
var DefaultConfig = Config{
|
var DefaultConfig = Config{
|
||||||
// The highlighter style to use.
|
// The highlighter style to use.
|
||||||
// See https://xyproto.github.io/splash/docs/all.html
|
// See https://xyproto.github.io/splash/docs/all.html
|
||||||
|
@ -38,7 +47,6 @@ var DefaultConfig = Config{
|
||||||
TabWidth: 4,
|
TabWidth: 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Style string
|
Style string
|
||||||
|
|
||||||
|
@ -133,6 +141,16 @@ func applyOptionsFromMap(optsm map[string]interface{}, cfg *Config) error {
|
||||||
return mapstructure.WeakDecode(optsm, cfg)
|
return mapstructure.WeakDecode(optsm, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func applyOptionsFromCodeBlockContext(ctx hooks.CodeblockContext, cfg *Config) error {
|
||||||
|
if cfg.LineAnchors == "" {
|
||||||
|
const lineAnchorPrefix = "hl-"
|
||||||
|
// Set it to the ordinal with a prefix.
|
||||||
|
cfg.LineAnchors = fmt.Sprintf("%s%d", lineAnchorPrefix, ctx.Ordinal())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ApplyLegacyConfig applies legacy config from back when we had
|
// ApplyLegacyConfig applies legacy config from back when we had
|
||||||
// Pygments.
|
// Pygments.
|
||||||
func ApplyLegacyConfig(cfg config.Provider, conf *Config) error {
|
func ApplyLegacyConfig(cfg config.Provider, conf *Config) error {
|
||||||
|
@ -191,13 +209,6 @@ func normalizeHighlightOptions(m map[string]interface{}) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
lineNosKey = "linenos"
|
|
||||||
hlLinesKey = "hl_lines"
|
|
||||||
linosStartKey = "linenostart"
|
|
||||||
noHlKey = "nohl"
|
|
||||||
)
|
|
||||||
|
|
||||||
baseLineNumber := 1
|
baseLineNumber := 1
|
||||||
if v, ok := m[linosStartKey]; ok {
|
if v, ok := m[linosStartKey]; ok {
|
||||||
baseLineNumber = cast.ToInt(v)
|
baseLineNumber = cast.ToInt(v)
|
||||||
|
|
|
@ -18,7 +18,6 @@ import (
|
||||||
gohtml "html"
|
gohtml "html"
|
||||||
"html/template"
|
"html/template"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alecthomas/chroma"
|
"github.com/alecthomas/chroma"
|
||||||
|
@ -98,6 +97,10 @@ func (h chromaHighlighter) HighlightCodeBlock(ctx hooks.CodeblockContext, opts i
|
||||||
return HightlightResult{}, err
|
return HightlightResult{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := applyOptionsFromCodeBlockContext(ctx, &cfg); err != nil {
|
||||||
|
return HightlightResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
err := highlight(&b, ctx.Code(), ctx.Lang(), attributes, cfg)
|
err := highlight(&b, ctx.Code(), ctx.Lang(), attributes, cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return HightlightResult{}, err
|
return HightlightResult{}, err
|
||||||
|
@ -116,6 +119,10 @@ func (h chromaHighlighter) RenderCodeblock(w hugio.FlexiWriter, ctx hooks.Codebl
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := applyOptionsFromCodeBlockContext(ctx, &cfg); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return highlight(w, ctx.Code(), ctx.Lang(), attributes, cfg)
|
return highlight(w, ctx.Code(), ctx.Lang(), attributes, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,31 +140,6 @@ func (h HightlightResult) Highlighted() template.HTML {
|
||||||
return h.Body
|
return h.Body
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h chromaHighlighter) toHighlightOptionsAttributes(ctx hooks.CodeblockContext) (map[string]interface{}, map[string]interface{}) {
|
|
||||||
attributes := ctx.Attributes()
|
|
||||||
if attributes == nil || len(attributes) == 0 {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
options := make(map[string]interface{})
|
|
||||||
attrs := make(map[string]interface{})
|
|
||||||
|
|
||||||
for k, v := range attributes {
|
|
||||||
klow := strings.ToLower(k)
|
|
||||||
if chromaHightlightProcessingAttributes[klow] {
|
|
||||||
options[klow] = v
|
|
||||||
} else {
|
|
||||||
attrs[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const lineanchorsKey = "lineanchors"
|
|
||||||
if _, found := options[lineanchorsKey]; !found {
|
|
||||||
// Set it to the ordinal.
|
|
||||||
options[lineanchorsKey] = strconv.Itoa(ctx.Ordinal())
|
|
||||||
}
|
|
||||||
return options, attrs
|
|
||||||
}
|
|
||||||
|
|
||||||
func highlight(w hugio.FlexiWriter, code, lang string, attributes []attributes.Attribute, cfg Config) error {
|
func highlight(w hugio.FlexiWriter, code, lang string, attributes []attributes.Attribute, cfg Config) error {
|
||||||
var lexer chroma.Lexer
|
var lexer chroma.Lexer
|
||||||
if lang != "" {
|
if lang != "" {
|
||||||
|
|
Loading…
Reference in a new issue