markup/highlight: Add support to linkable line anchors on Chroma
authorFernando Jorge Mota <fjorgemota@users.noreply.github.com>
Sun, 13 Sep 2020 09:00:16 +0000 (06:00 -0300)
committerGitHub <noreply@github.com>
Sun, 13 Sep 2020 09:00:16 +0000 (11:00 +0200)
Fixes #7622

docs/content/en/content-management/syntax-highlighting.md
markup/highlight/config.go
markup/highlight/highlight_test.go

index 0e5107f36a0abd9b144bdcff2d76434530cf299f..a518935b1d270a701eb4a225d88e22a377c8a7ff 100644 (file)
@@ -43,6 +43,8 @@ Options:
 * `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
 
index 3f31e65eab6fdf9873775599c7002679cea395f0..a7c5ab4cb023f47aedf127387e44964c716c45eb 100644 (file)
@@ -50,6 +50,10 @@ type Config struct {
        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,12 +67,17 @@ type Config struct {
 }
 
 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),
                html.BaseLineNumber(cfg.LineNoStart),
                html.LineNumbersInTable(cfg.LineNumbersInTable),
                html.WithClasses(!cfg.NoClasses),
+               html.LinkableLineNumbers(cfg.AnchorLineNos, lineAnchors),
        }
 
        if cfg.Hl_Lines != "" {
index 3086792639db1a334c17a7b317407af523801e8b..f5992a5122a1d03c93cb524e6d6b1204627d7c42 100644 (file)
@@ -79,6 +79,21 @@ User-Agent: foo
                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