summaryrefslogtreecommitdiffstats
path: root/vendor/gitlab.com/golang-commonmark/markdown/state_block.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/markdown/state_block.go')
-rw-r--r--vendor/gitlab.com/golang-commonmark/markdown/state_block.go141
1 files changed, 141 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/markdown/state_block.go b/vendor/gitlab.com/golang-commonmark/markdown/state_block.go
new file mode 100644
index 00000000..e1142416
--- /dev/null
+++ b/vendor/gitlab.com/golang-commonmark/markdown/state_block.go
@@ -0,0 +1,141 @@
+// 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 "strings"
+
+const (
+ ptRoot = iota
+ ptList
+ ptBlockQuote
+ ptParagraph
+ ptReference
+)
+
+type StateBlock struct {
+ StateCore
+
+ BMarks []int // offsets of the line beginnings
+ EMarks []int // offsets of the line endings
+ TShift []int // indents for each line
+ SCount []int
+ BSCount []int
+ BlkIndent int // required block content indent (in a list etc.)
+ Line int // line index in the source string
+ LineMax int // number of lines
+ Tight bool // loose or tight mode for lists
+ ParentType byte // parent block type
+ Level int
+}
+
+func (s *StateBlock) IsLineEmpty(n int) bool {
+ return s.BMarks[n]+s.TShift[n] >= s.EMarks[n]
+}
+
+func (s *StateBlock) SkipEmptyLines(from int) int {
+ for from < s.LineMax && s.IsLineEmpty(from) {
+ from++
+ }
+ return from
+}
+
+func (s *StateBlock) SkipSpaces(pos int) int {
+ src := s.Src
+ for pos < len(src) && byteIsSpace(src[pos]) {
+ pos++
+ }
+ return pos
+}
+
+func (s *StateBlock) SkipBytes(pos int, b byte) int {
+ src := s.Src
+ for pos < len(src) && src[pos] == b {
+ pos++
+ }
+ return pos
+}
+
+func (s *StateBlock) SkipBytesBack(pos int, b byte, min int) int {
+ for pos > min {
+ pos--
+ if s.Src[pos] != b {
+ return pos + 1
+ }
+ }
+ return pos
+}
+
+func (s *StateBlock) SkipSpacesBack(pos int, min int) int {
+ for pos > min {
+ pos--
+ if !byteIsSpace(s.Src[pos]) {
+ return pos + 1
+ }
+ }
+ return pos
+}
+
+func (s *StateBlock) Lines(begin, end, indent int, keepLastLf bool) string {
+ if begin == end {
+ return ""
+ }
+
+ src := s.Src
+
+ queue := make([]string, end-begin)
+
+ for i, line := 0, begin; line < end; i, line = i+1, line+1 {
+ lineIndent := 0
+ lineStart := s.BMarks[line]
+ first := lineStart
+ last := s.EMarks[line]
+ if (line+1 < end || keepLastLf) && last < len(src) {
+ last++
+ }
+
+ for first < last && lineIndent < indent {
+ ch := src[first]
+
+ if byteIsSpace(ch) {
+ if ch == '\t' {
+ lineIndent += 4 - (lineIndent+s.BSCount[line])%4
+ } else {
+ lineIndent++
+ }
+ } else if first-lineStart < s.TShift[line] {
+ lineIndent++
+ } else {
+ break
+ }
+
+ first++
+ }
+
+ if lineIndent > indent {
+ queue[i] = strings.Repeat(" ", lineIndent-indent) + src[first:last]
+ } else {
+ queue[i] = src[first:last]
+ }
+ }
+
+ return strings.Join(queue, "")
+}
+
+func (s *StateBlock) PushToken(tok Token) {
+ tok.SetLevel(s.Level)
+ s.Tokens = append(s.Tokens, tok)
+}
+
+func (s *StateBlock) PushOpeningToken(tok Token) {
+ tok.SetLevel(s.Level)
+ s.Level++
+ s.Tokens = append(s.Tokens, tok)
+}
+
+func (s *StateBlock) PushClosingToken(tok Token) {
+ s.Level--
+ tok.SetLevel(s.Level)
+ s.Tokens = append(s.Tokens, tok)
+}