// Copyright 2015 The Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package markdown import ( "io" "regexp" "strconv" "strings" "gitlab.com/golang-commonmark/html" ) type Renderer struct { w *monadicWriter } func NewRenderer(w io.Writer) *Renderer { return &Renderer{newMonadicWriter(w)} } func (r *Renderer) Render(tokens []Token, options RenderOptions) error { for i, tok := range tokens { if tok, ok := tok.(*Inline); ok { r.renderInline(tok.Children, options) } else { r.renderToken(tokens, i, options) } } r.w.Flush() return r.w.err } func (r *Renderer) renderInline(tokens []Token, o RenderOptions) { for i := range tokens { r.renderToken(tokens, i, o) } } func (r *Renderer) renderInlineAsText(tokens []Token) { for _, tok := range tokens { if text, ok := tok.(*Text); ok { html.WriteEscapedString(r.w, text.Content) } else if img, ok := tok.(*Image); ok { r.renderInlineAsText(img.Tokens) } } } var rNotSpace = regexp.MustCompile(`^\S+`) func (r *Renderer) renderToken(tokens []Token, idx int, options RenderOptions) { tok := tokens[idx] if idx > 0 && tok.Block() && !tok.Closing() { switch t := tokens[idx-1].(type) { case *ParagraphOpen: if t.Hidden { r.w.WriteByte('\n') } case *ParagraphClose: if t.Hidden { r.w.WriteByte('\n') } } } switch tok := tok.(type) { case *BlockquoteClose: r.w.WriteString("") case *BlockquoteOpen: r.w.WriteString("
") case *BulletListClose: r.w.WriteString("") case *BulletListOpen: r.w.WriteString("