Golang中如何处理有序列表与代码块导致的序号中断问题

Golang中如何处理有序列表与代码块导致的序号中断问题 我不确定该在哪里问这个问题。我正在使用 Hermit 主题。我写了一个代码块,并将其放在两个列表项之间。

根据 Hermit 文档(类似于 StackOverflow)推荐的代码编写方式:

```javascript
var num1, num2, sum

我的尝试:

## 案例 #1

```markdown
1. Lorem ipsum dolor sit amet.

```toml
[section]
key = "value"```

2. Lorem ipsum dolor sit amet.

渲染输出(没有延续)。

image

案例 #2

那么如何继续编号列表? 我尝试了这个:

1. Lorem ipsum dolor sit amet.

    ```toml
    [section]
    key = "value"
    ```

2. Lorem ipsum dolor sit amet.

语法高亮得以保留,但第二个项目是 1. 偏移了,2. 没有延续。

image

案例 #3

让我们试试这个:

1. Lorem ipsum dolor sit amet.

    [section]
    key = "value"

2. Lorem ipsum dolor sit amet.

哇!延续得以保留,但代码块消失了。

image

案例 #4

我将对代码块进行双重缩进,看看会发生什么:

1. Lorem ipsum dolor sit amet.

        [section]
        key = "value"

2. Lorem ipsum dolor sit amet.

代码块和编号都得以保留,但语法高亮不理想。

image

我不知道这是在哪个层面发生的问题,是 Hugo(Markdown 解析)还是我的主题 Hermit(自定义 CSS)。我们能在最后一种方法中指定语言吗?有人能帮我解决这个问题吗?


更多关于Golang中如何处理有序列表与代码块导致的序号中断问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我建议使用 Hugo 论坛,https://discourse.gohugo.io/

更多关于Golang中如何处理有序列表与代码块导致的序号中断问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个常见的Markdown渲染问题,主要涉及列表项中的代码块缩进规则。在Go生态中,如果你使用goldmark或blackfriday等Markdown解析器,也会遇到类似情况。

问题分析

在Markdown规范中,列表项中的代码块需要8个空格或2个制表符的缩进。但很多主题的CSS可能会干扰显示。

解决方案

方案1:使用正确的缩进(推荐)

  1. Lorem ipsum dolor sit amet.

     ```toml
     [section]
     key = "value"
     ```
    
  2. Lorem ipsum dolor sit amet.


**关键点**:
- 代码块前需要8个空格(相对于列表起始位置)
- 代码块内部的三个反引号也要保持这个缩进

### 方案2:使用HTML包装(如果主题支持)


1. Lorem ipsum dolor sit amet.

    <pre><code class="language-toml">
    [section]
    key = "value"
    </code></pre>

2. Lorem ipsum dolor sit amet.

方案3:在Go代码中处理Markdown

如果你在Go程序中处理Markdown:

package main

import (
    "fmt"
    "github.com/yuin/goldmark"
    "github.com/yuin/goldmark/extension"
    "github.com/yuin/goldmark/parser"
    "github.com/yuin/goldmark/renderer/html"
    "bytes"
)

func main() {
    markdown := `1. Lorem ipsum dolor sit amet.

        \`\`\`toml
        [section]
        key = "value"
        \`\`\`

    2. Lorem ipsum dolor sit amet.`

    md := goldmark.New(
        goldmark.WithExtensions(extension.GFM),
        goldmark.WithParserOptions(
            parser.WithAutoHeadingID(),
        ),
        goldmark.WithRendererOptions(
            html.WithHardWraps(),
            html.WithXHTML(),
        ),
    )

    var buf bytes.Buffer
    if err := md.Convert([]byte(markdown), &buf); err != nil {
        panic(err)
    }
    
    fmt.Println(buf.String())
}

方案4:使用raw HTML避免解析问题

  1. Lorem ipsum dolor sit amet.
[section]
key = "value"
  1. Lorem ipsum dolor sit amet.

## 针对Hugo的特定方案

在Hugo的config.toml中配置goldmark:

```toml
[markup]
  [markup.goldmark]
    [markup.goldmark.extensions]
      definitionList = true
      footnote = true
      linkify = true
      strikethrough = true
      table = true
      taskList = true
      typographer = true
    [markup.goldmark.renderer]
      hardWraps = false
      unsafe = true
      xHTML = true

然后在Markdown中使用:

  1. 第一项内容

    [section]
    key = "value"
    
  2. 第二项内容


确保代码块前有4个空格的缩进(在Hugo中,这是相对于列表项的缩进,不是文档起始位置)。

## 验证方法

创建一个测试文件验证渲染:

```go
// test_markdown.go
package main

import (
    "fmt"
    "strings"
    "github.com/gomarkdown/markdown"
    "github.com/gomarkdown/markdown/html"
    "github.com/gomarkdown/markdown/parser"
)

func main() {
    md := `1. First item

    \`\`\`toml
    [section]
    key = "value"
    \`\`\`

2. Second item`

    extensions := parser.CommonExtensions | parser.AutoHeadingIDs
    p := parser.NewWithExtensions(extensions)
    doc := p.Parse([]byte(md))
    
    htmlFlags := html.CommonFlags
    opts := html.RendererOptions{Flags: htmlFlags}
    renderer := html.NewRenderer(opts)
    
    output := markdown.Render(doc, renderer)
    fmt.Println(strings.TrimSpace(string(output)))
}

运行:

go run test_markdown.go

这会显示实际的HTML输出,帮助你调试渲染问题。

回到顶部