emphasis.go

 1package parser
 2
 3import (
 4	"github.com/yuin/goldmark/ast"
 5	"github.com/yuin/goldmark/text"
 6)
 7
 8type emphasisDelimiterProcessor struct {
 9}
10
11func (p *emphasisDelimiterProcessor) IsDelimiter(b byte) bool {
12	return b == '*' || b == '_'
13}
14
15func (p *emphasisDelimiterProcessor) CanOpenCloser(opener, closer *Delimiter) bool {
16	return opener.Char == closer.Char
17}
18
19func (p *emphasisDelimiterProcessor) OnMatch(consumes int) ast.Node {
20	return ast.NewEmphasis(consumes)
21}
22
23var defaultEmphasisDelimiterProcessor = &emphasisDelimiterProcessor{}
24
25type emphasisParser struct {
26}
27
28var defaultEmphasisParser = &emphasisParser{}
29
30// NewEmphasisParser return a new InlineParser that parses emphasises.
31func NewEmphasisParser() InlineParser {
32	return defaultEmphasisParser
33}
34
35func (s *emphasisParser) Trigger() []byte {
36	return []byte{'*', '_'}
37}
38
39func (s *emphasisParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node {
40	before := block.PrecendingCharacter()
41	line, segment := block.PeekLine()
42	node := ScanDelimiter(line, before, 1, defaultEmphasisDelimiterProcessor)
43	if node == nil {
44		return nil
45	}
46	node.Segment = segment.WithStop(segment.Start + node.OriginalLength)
47	block.Advance(node.OriginalLength)
48	pc.PushDelimiter(node)
49	return node
50}