Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
90 lines (74 sloc) 1.82 KB
// 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
type Delimiter struct {
Length int
Jump int
Token int
Level int
End int
Open bool
Close bool
Marker byte
}
func ruleEmphasis(s *StateInline, silent bool) bool {
src := s.Src
start := s.Pos
marker := src[start]
if silent {
return false
}
if marker != '_' && marker != '*' {
return false
}
canOpen, canClose, length := s.scanDelims(s.Pos, marker == '*')
for i := 0; i < length; i++ {
s.PushToken(&Text{Content: string(marker)})
s.Delimiters = append(s.Delimiters, Delimiter{
Marker: marker,
Length: length,
Jump: i,
Token: len(s.Tokens) - 1,
Level: s.Level,
End: -1,
Open: canOpen,
Close: canClose,
})
}
s.Pos += length
return true
}
func ruleEmphasisPostprocess(s *StateInline) {
delimiters := s.Delimiters
max := len(delimiters)
for i := max - 1; i >= 0; i-- {
startDelim := delimiters[i]
if startDelim.Marker != '_' && startDelim.Marker != '*' {
continue
}
if startDelim.End == -1 {
continue
}
endDelim := delimiters[startDelim.End]
isStrong := i > 0 &&
delimiters[i-1].End == startDelim.End+1 &&
delimiters[i-1].Token == startDelim.Token-1 &&
delimiters[startDelim.End+1].Token == endDelim.Token+1 &&
delimiters[i-1].Marker == startDelim.Marker
if isStrong {
s.Tokens[startDelim.Token] = &StrongOpen{}
s.Tokens[endDelim.Token] = &StrongClose{}
if text, ok := s.Tokens[delimiters[i-1].Token].(*Text); ok {
text.Content = ""
}
if text, ok := s.Tokens[delimiters[startDelim.End+1].Token].(*Text); ok {
text.Content = ""
}
i--
} else {
s.Tokens[startDelim.Token] = &EmphasisOpen{}
s.Tokens[endDelim.Token] = &EmphasisClose{}
}
}
}
You can’t perform that action at this time.