transform.go (1196B)
1 package codeblocks 2 3 import ( 4 "github.com/yuin/goldmark/ast" 5 "github.com/yuin/goldmark/parser" 6 "github.com/yuin/goldmark/text" 7 ) 8 9 // Kind is the kind of an Hugo code block. 10 var KindCodeBlock = ast.NewNodeKind("HugoCodeBlock") 11 12 // Its raw contents are the plain text of the code block. 13 type codeBlock struct { 14 ast.BaseBlock 15 ordinal int 16 b *ast.FencedCodeBlock 17 } 18 19 func (*codeBlock) Kind() ast.NodeKind { return KindCodeBlock } 20 21 func (*codeBlock) IsRaw() bool { return true } 22 23 func (b *codeBlock) Dump(src []byte, level int) { 24 } 25 26 type Transformer struct{} 27 28 // Transform transforms the provided Markdown AST. 29 func (*Transformer) Transform(doc *ast.Document, reader text.Reader, pctx parser.Context) { 30 var codeBlocks []*ast.FencedCodeBlock 31 32 ast.Walk(doc, func(node ast.Node, enter bool) (ast.WalkStatus, error) { 33 if !enter { 34 return ast.WalkContinue, nil 35 } 36 37 cb, ok := node.(*ast.FencedCodeBlock) 38 if !ok { 39 return ast.WalkContinue, nil 40 } 41 42 codeBlocks = append(codeBlocks, cb) 43 44 return ast.WalkContinue, nil 45 }) 46 47 for i, cb := range codeBlocks { 48 b := &codeBlock{b: cb, ordinal: i} 49 parent := cb.Parent() 50 if parent != nil { 51 parent.ReplaceChild(parent, cb, b) 52 } 53 } 54 }