diff options
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/markdown/blockquote.go')
-rw-r--r-- | vendor/gitlab.com/golang-commonmark/markdown/blockquote.go | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/markdown/blockquote.go b/vendor/gitlab.com/golang-commonmark/markdown/blockquote.go new file mode 100644 index 00000000..f8ad3626 --- /dev/null +++ b/vendor/gitlab.com/golang-commonmark/markdown/blockquote.go @@ -0,0 +1,233 @@ +// 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 "unicode/utf8" + +var blockquoteTerminatedBy []BlockRule + +func ruleBlockQuote(s *StateBlock, startLine, endLine int, silent bool) bool { + if s.SCount[startLine]-s.BlkIndent >= 4 { + return false + } + + pos := s.BMarks[startLine] + s.TShift[startLine] + max := s.EMarks[startLine] + src := s.Src + + if pos >= max { + return false + } + if src[pos] != '>' { + return false + } + pos++ + + if silent { + return true + } + + initial := s.SCount[startLine] + pos - (s.BMarks[startLine] + s.TShift[startLine]) + offset := initial + + spaceAfterMarker := false + adjustTab := false + if pos < max { + if src[pos] == ' ' { + pos++ + initial++ + offset++ + spaceAfterMarker = true + } else if src[pos] == '\t' { + spaceAfterMarker = true + if (s.BSCount[startLine]+offset)%4 == 3 { + pos++ + initial++ + offset++ + } else { + adjustTab = true + } + } + } + + oldBMarks := []int{s.BMarks[startLine]} + s.BMarks[startLine] = pos + + for pos < max { + r, size := utf8.DecodeRuneInString(src[pos:]) + if runeIsSpace(r) { + if r == '\t' { + d := 0 + if adjustTab { + d = 1 + } + offset += 4 - (offset+s.BSCount[startLine]+d)%4 + } else { + offset++ + } + } else { + break + } + pos += size + } + + oldBSCount := []int{s.BSCount[startLine]} + d := 0 + if spaceAfterMarker { + d = 1 + } + s.BSCount[startLine] = s.SCount[startLine] + 1 + d + + lastLineEmpty := pos >= max + + oldSCount := []int{s.SCount[startLine]} + s.SCount[startLine] = offset - initial + + oldTShift := []int{s.TShift[startLine]} + s.TShift[startLine] = pos - s.BMarks[startLine] + + oldParentType := s.ParentType + s.ParentType = ptBlockQuote + wasOutdented := false + + oldLineMax := s.LineMax + + nextLine := startLine + 1 + for ; nextLine < endLine; nextLine++ { + if s.SCount[nextLine] < s.BlkIndent { + wasOutdented = true + } + pos = s.BMarks[nextLine] + s.TShift[nextLine] + max = s.EMarks[nextLine] + + if pos >= max { + break + } + + pos++ + if src[pos-1] == '>' && !wasOutdented { + initial = s.SCount[nextLine] + pos + (s.BMarks[nextLine] + s.TShift[nextLine]) + offset = initial + + if pos >= len(src) || src[pos] != ' ' && src[pos] != '\t' { + spaceAfterMarker = true + } else if src[pos] == ' ' { + pos++ + initial++ + offset++ + adjustTab = false + spaceAfterMarker = true + } else if src[pos] == '\t' { + spaceAfterMarker = true + + if (s.BSCount[nextLine]+offset)%4 == 3 { + pos++ + initial++ + offset++ + adjustTab = false + } else { + adjustTab = true + } + } + + oldBMarks = append(oldBMarks, s.BMarks[nextLine]) + s.BMarks[nextLine] = pos + + for pos < max { + r, size := utf8.DecodeRuneInString(src[pos:]) + if runeIsSpace(r) { + if r == '\t' { + d := 0 + if adjustTab { + d = 1 + } + offset += 4 - (offset+s.BSCount[startLine]+d)%4 + } else { + offset++ + } + } else { + break + } + pos += size + } + + lastLineEmpty = pos >= max + + oldBSCount = append(oldBSCount, s.BSCount[nextLine]) + d := 0 + if spaceAfterMarker { + d = 1 + } + s.BSCount[nextLine] = s.SCount[nextLine] + 1 + d + + oldSCount = append(oldSCount, s.SCount[nextLine]) + s.SCount[nextLine] = offset - initial + + oldTShift = append(oldTShift, s.TShift[nextLine]) + s.TShift[nextLine] = pos - s.BMarks[nextLine] + + continue + } + + if lastLineEmpty { + break + } + + terminate := false + for _, r := range blockquoteTerminatedBy { + if r(s, nextLine, endLine, true) { + terminate = true + break + } + } + + if terminate { + s.LineMax = nextLine + + if s.BlkIndent != 0 { + oldBMarks = append(oldBMarks, s.BMarks[nextLine]) + oldBSCount = append(oldBSCount, s.BSCount[nextLine]) + oldTShift = append(oldTShift, s.TShift[nextLine]) + oldSCount = append(oldSCount, s.SCount[nextLine]) + s.SCount[nextLine] -= s.BlkIndent + } + + break + } + + oldBMarks = append(oldBMarks, s.BMarks[nextLine]) + oldBSCount = append(oldBSCount, s.BSCount[nextLine]) + oldTShift = append(oldTShift, s.TShift[nextLine]) + oldSCount = append(oldSCount, s.SCount[nextLine]) + + s.SCount[nextLine] = -1 + } + + oldIndent := s.BlkIndent + s.BlkIndent = 0 + + tok := &BlockquoteOpen{ + Map: [2]int{startLine, 0}, + } + s.PushOpeningToken(tok) + + s.Md.Block.Tokenize(s, startLine, nextLine) + + s.PushClosingToken(&BlockquoteClose{}) + + s.LineMax = oldLineMax + s.ParentType = oldParentType + tok.Map[1] = s.Line + + for i := 0; i < len(oldTShift); i++ { + s.BMarks[startLine+i] = oldBMarks[i] + s.TShift[startLine+i] = oldTShift[i] + s.SCount[startLine+i] = oldSCount[i] + s.BSCount[startLine+i] = oldBSCount[i] + } + s.BlkIndent = oldIndent + + return true +} |