emphasis.go 1.2 KB

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