Fetch the repository succeeded.
package main
import (
"bytes"
"os"
"strings"
chromahtml "github.com/alecthomas/chroma/v2/formatters/html"
"github.com/yuin/goldmark"
emoji "github.com/yuin/goldmark-emoji"
highlighting "github.com/yuin/goldmark-highlighting/v2"
meta "github.com/yuin/goldmark-meta"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/text"
"github.com/yuin/goldmark/util"
"go.abhg.dev/goldmark/toc"
// github.com/OhYee/goldmark-fenced_codeblock_extension
// github.com/stefanfritsch/goldmark-fences
// latex "github.com/soypat/goldmark-latex"
)
var markdown goldmark.Markdown
func init() {
markdown = goldmark.New(
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
),
goldmark.WithExtensions(
extension.CJK, // 支持中日韩语言
extension.GFM, // github标准
extension.Table, // 表格
extension.Strikethrough, // 删除线
extension.Linkify, // 链接自动跳转
extension.TaskList, // 任务列表
// extension.Typographer, //符号替换,替换之后不好用
// extension.Footnote,//php
meta.Meta,
//&toc.Extender{},//不能在这里引用toc插件,手动控制
emoji.Emoji, // emoji表情
initHighlighting(), // 代码高亮
),
//goldmark.WithRenderer(initLatexRenderer()),
/*
goldmark.WithRendererOptions(
renderer.WithNodeRenderers(
util.Prioritized(extension.NewTableHTMLRenderer(), 500),
),
),
*/
)
}
// conver2Html 由markdown转成html
func conver2Html(mkfile string) (map[string]interface{}, *string, *string, error) {
source, err := os.ReadFile(mkfile)
if err != nil {
return nil, nil, nil, err
}
var htmlBuffer bytes.Buffer
// 生成id时支持中文
parserContext := parser.NewContext(parser.WithIDs(newIDs()))
if err := markdown.Convert(source, &htmlBuffer, parser.WithContext(parserContext)); err != nil {
return nil, nil, nil, err
}
// 生成页面html
html := htmlBuffer.String()
// 读取markdown文件中的元属性
metaData := meta.Get(parserContext)
// 生成 toc Table of Contents,文章目录
var tocBuffer bytes.Buffer
mdParser := markdown.Parser()
// 生成id时支持中文
doc := mdParser.Parse(text.NewReader(source), parser.WithContext(parserContext))
tocTree, err := toc.Inspect(doc, source)
if err != nil {
return metaData, nil, &html, err
}
tocNode := toc.RenderList(tocTree)
markdown.Renderer().Render(&tocBuffer, source, tocNode)
tocHtml := tocBuffer.String()
return metaData, &tocHtml, &html, err
}
// 重写goldmark的autoHeadingID生成方式 --------------------------
type gpressMarkdownIDS struct {
values map[string]bool
}
func newIDs() parser.IDs {
return &gpressMarkdownIDS{
values: map[string]bool{},
}
}
func (s *gpressMarkdownIDS) Generate(value []byte, kind ast.NodeKind) []byte {
value = util.TrimLeftSpace(value)
value = util.TrimRightSpace(value)
result := string(value)
result = strings.ReplaceAll(result, " ", "")
result = strings.ReplaceAll(result, ".", "-")
if len(result) == 0 {
if kind == ast.KindHeading {
result = "heading"
} else {
result = "id"
}
}
if _, ok := s.values[result]; !ok {
s.values[result] = true
}
return []byte(result)
}
func (s *gpressMarkdownIDS) Put(value []byte) {
s.values[string(value)] = true
}
//------------------------结束----------------
// initHighlighting 代码高亮的配置
func initHighlighting() goldmark.Extender {
// var css bytes.Buffer
return highlighting.NewHighlighting(
highlighting.WithStyle("monokai"),
// highlighting.WithCSSWriter(&css),
highlighting.WithFormatOptions(
chromahtml.WithClasses(true),
chromahtml.WithLineNumbers(true),
chromahtml.TabWidth(4),
chromahtml.LineNumbersInTable(true),
//chromahtml.InlineCode(true),
//chromahtml.LineNumbersInTable(true),
),
highlighting.WithWrapperRenderer(func(w util.BufWriter, c highlighting.CodeBlockContext, entering bool) {
language, ok := c.Language()
if entering {
if !ok {
w.WriteString("<pre><code>")
return
}
w.WriteString(`<div class="highlight"><pre class="chroma"><code class="language-`)
w.Write(language)
w.WriteString(`" data-lang="`)
w.Write(language)
w.WriteString(`">`)
} else {
if !ok {
w.WriteString("</code></pre>")
return
}
w.WriteString(`</div>`)
}
}),
/*
highlighting.WithCodeBlockOptions(func(c highlighting.CodeBlockContext) []chromahtml.Option {
if language, ok := c.Language(); ok {
// Turn on line numbers for Go only.
if string(language) == "go" {
return []chromahtml.Option{
chromahtml.WithLineNumbers(true),
}
}
}
return nil
}),
*/
)
}
/*
// initLatexRenderer 初始化latex科学符号
func initLatexRenderer() renderer.Renderer {
r := renderer.NewRenderer(renderer.WithNodeRenderers(util.Prioritized(latex.NewRenderer(latex.Config{
NoHeadingNumbering: true, // No heading numbers
Preamble: append(latex.DefaultPreamble(), []byte("\n\\usepackage{MnSymbol}\n")...), // add star symbols to preamble.
DeclareUnicode: func(r rune) (raw string, isReplaced bool) {
switch r {
case '★':
return `$\filledstar$`, true
case '☆':
return `$\smallstar$`, true
}
return "", false
},
}), 1)))
return r
}
*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。