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}