shithub: hugo

Download patch

ref: fb0f2cc718a54fd0774a0367e0a60718b5731de5
parent: 748fd4cb0d083de7c173d4b04b874358750fc900
author: Fernando Jorge Mota <fjorgemota@users.noreply.github.com>
date: Sun Sep 13 02:00:16 EDT 2020

markup/highlight: Add support to linkable line anchors on Chroma

Fixes #7622 

--- a/docs/content/en/content-management/syntax-highlighting.md
+++ b/docs/content/en/content-management/syntax-highlighting.md
@@ -43,6 +43,8 @@
 * `linenos`: configure line numbers. Valid values are `true`, `false`, `table`, or `inline`. `false` will turn off line numbers if it's configured to be on in site config. {{< new-in "0.60.0" >}} `table` will give copy-and-paste friendly code blocks.
 * `hl_lines`: lists a set of line numbers or line number ranges to be highlighted.
 * `linenostart=199`: starts the line number count from 199.
+* `anchorlinenos`: Configure anchors on line numbers. Valid values are `true` or `false`;
+* `lineanchors`: Configure a prefix for the anchors on line numbers. Will be suffixed with `-`, so linking to the line number 1 with the option `lineanchors=prefix` adds the anchor `prefix-1` to the page.  
 
 ### Example: Highlight Shortcode
 
--- a/markup/highlight/config.go
+++ b/markup/highlight/config.go
@@ -50,6 +50,10 @@
 	LineNos            bool
 	LineNumbersInTable bool
 
+	// When set, add links to line numbers
+	AnchorLineNos bool
+	LineAnchors   string
+
 	// Start the line numbers from this value (default is 1).
 	LineNoStart int
 
@@ -63,6 +67,10 @@
 }
 
 func (cfg Config) ToHTMLOptions() []html.Option {
+	var lineAnchors string
+	if cfg.LineAnchors != "" {
+		lineAnchors = cfg.LineAnchors + "-"
+	}
 	var options = []html.Option{
 		html.TabWidth(cfg.TabWidth),
 		html.WithLineNumbers(cfg.LineNos),
@@ -69,6 +77,7 @@
 		html.BaseLineNumber(cfg.LineNoStart),
 		html.LineNumbersInTable(cfg.LineNumbersInTable),
 		html.WithClasses(!cfg.NoClasses),
+		html.LinkableLineNumbers(cfg.AnchorLineNos, lineAnchors),
 	}
 
 	if cfg.Hl_Lines != "" {
--- a/markup/highlight/highlight_test.go
+++ b/markup/highlight/highlight_test.go
@@ -79,6 +79,21 @@
 		c.Assert(result, qt.Not(qt.Contains), "class=\"lnt\"")
 	})
 
+	c.Run("Highlight lines, linenumbers default on, anchorlinenumbers default on", func(c *qt.C) {
+		cfg := DefaultConfig
+		cfg.NoClasses = false
+		cfg.LineNos = true
+		cfg.AnchorLineNos = true
+		h := New(cfg)
+
+		result, _ := h.Highlight(lines, "bash", "")
+		c.Assert(result, qt.Contains, "<span class=\"lnt\" id=\"2\">2\n</span>")
+		result, _ = h.Highlight(lines, "bash", "lineanchors=test")
+		c.Assert(result, qt.Contains, "<span class=\"lnt\" id=\"test-2\">2\n</span>")
+		result, _ = h.Highlight(lines, "bash", "anchorlinenos=false,hl_lines=2")
+		c.Assert(result, qt.Not(qt.Contains), "id=\"2\"")
+	})
+
 	c.Run("Highlight lines, linenumbers default on, linenumbers in table default off", func(c *qt.C) {
 		cfg := DefaultConfig
 		cfg.NoClasses = false