summaryrefslogtreecommitdiffstats
path: root/vendor/gitlab.com/golang-commonmark/markdown/reference.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/markdown/reference.go')
-rw-r--r--vendor/gitlab.com/golang-commonmark/markdown/reference.go173
1 files changed, 173 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/markdown/reference.go b/vendor/gitlab.com/golang-commonmark/markdown/reference.go
new file mode 100644
index 00000000..6e97809e
--- /dev/null
+++ b/vendor/gitlab.com/golang-commonmark/markdown/reference.go
@@ -0,0 +1,173 @@
+// 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"
+
+var referenceTerminatedBy []BlockRule
+
+func ruleReference(s *StateBlock, startLine, _ int, silent bool) bool {
+ lines := 0
+ pos := s.BMarks[startLine] + s.TShift[startLine]
+ max := s.EMarks[startLine]
+ nextLine := startLine + 1
+
+ if s.SCount[startLine]-s.BlkIndent >= 4 {
+ return false
+ }
+
+ src := s.Src
+
+ if src[pos] != '[' {
+ return false
+ }
+
+ pos++
+ for pos < max {
+ if src[pos] == ']' && src[pos-1] != '\\' {
+ if pos+1 == max {
+ return false
+ }
+ if src[pos+1] != ':' {
+ return false
+ }
+ break
+ }
+ pos++
+ }
+
+ endLine := s.LineMax
+
+ oldParentType := s.ParentType
+ s.ParentType = ptReference
+outer:
+ for ; nextLine < endLine && !s.IsLineEmpty(nextLine); nextLine++ {
+ if s.SCount[nextLine]-s.BlkIndent > 3 {
+ continue
+ }
+
+ if s.SCount[nextLine] < 0 {
+ continue
+ }
+
+ for _, r := range referenceTerminatedBy {
+ if r(s, nextLine, endLine, true) {
+ break outer
+ }
+ }
+ }
+
+ str := strings.TrimSpace(s.Lines(startLine, nextLine, s.BlkIndent, false))
+ max = len(str)
+
+ var labelEnd int
+ for pos = 1; pos < max; pos++ {
+ b := str[pos]
+ if b == '[' {
+ return false
+ } else if b == ']' {
+ labelEnd = pos
+ break
+ } else if b == '\n' {
+ lines++
+ } else if b == '\\' {
+ pos++
+ if pos < max && str[pos] == '\n' {
+ lines++
+ }
+ }
+ }
+
+ if labelEnd <= 0 || labelEnd+1 >= max || str[labelEnd+1] != ':' {
+ return false
+ }
+
+ for pos = labelEnd + 2; pos < max; pos++ {
+ b := str[pos]
+ if b == '\n' {
+ lines++
+ } else if !byteIsSpace(b) {
+ break
+ }
+ }
+
+ href, nlines, endpos, ok := parseLinkDestination(str, pos, max)
+ if !ok {
+ return false
+ }
+ href = normalizeLink(href)
+ if !validateLink(href) {
+ return false
+ }
+
+ pos = endpos
+ lines += nlines
+
+ destEndPos := pos
+ destEndLineNo := lines
+
+ start := pos
+ for ; pos < max; pos++ {
+ b := str[pos]
+ if b == '\n' {
+ lines++
+ } else if !byteIsSpace(b) {
+ break
+ }
+ }
+
+ title, nlines, endpos, ok := parseLinkTitle(str, pos, max)
+ if pos < max && start != pos && ok {
+ pos = endpos
+ lines += nlines
+ } else {
+ pos = destEndPos
+ lines = destEndLineNo
+ }
+
+ for pos < max && byteIsSpace(str[pos]) {
+ pos++
+ }
+
+ if pos < max && str[pos] != '\n' {
+ if title != "" {
+ title = ""
+ pos = destEndPos
+ lines = destEndLineNo
+ for pos < max && byteIsSpace(src[pos]) {
+ pos++
+ }
+ }
+ }
+
+ if pos < max && str[pos] != '\n' {
+ return false
+ }
+
+ label := normalizeReference(str[1:labelEnd])
+ if label == "" {
+ return false
+ }
+
+ if silent {
+ return true
+ }
+
+ if s.Env.References == nil {
+ s.Env.References = make(map[string]map[string]string)
+ }
+ if _, ok := s.Env.References[label]; !ok {
+ s.Env.References[label] = map[string]string{
+ "title": title,
+ "href": href,
+ }
+ }
+
+ s.ParentType = oldParentType
+
+ s.Line = startLine + lines + 1
+
+ return true
+}