hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

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 }