summaryrefslogtreecommitdiffstats
path: root/vendor/gitlab.com/golang-commonmark/markdown/fence.go
blob: 04924dc49edfe257b61a484191ec73b458c90fd0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// 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"

func ruleFence(s *StateBlock, startLine, endLine int, silent bool) bool {
	haveEndMarker := false
	pos := s.BMarks[startLine] + s.TShift[startLine]
	max := s.EMarks[startLine]

	if s.SCount[startLine]-s.BlkIndent >= 4 {
		return false
	}
	if pos+3 > max {
		return false
	}

	src := s.Src

	marker := src[pos]
	if marker != '~' && marker != '`' {
		return false
	}

	mem := pos
	pos = s.SkipBytes(pos, marker)

	len := pos - mem

	if len < 3 {
		return false
	}

	params := strings.TrimSpace(src[pos:max])

	if strings.IndexByte(params, marker) >= 0 {
		return false
	}

	if silent {
		return true
	}

	nextLine := startLine

	for {
		nextLine++
		if nextLine >= endLine {
			break
		}

		mem = s.BMarks[nextLine] + s.TShift[nextLine]
		pos = mem
		max = s.EMarks[nextLine]

		if pos < max && s.SCount[nextLine] < s.BlkIndent {
			break
		}

		if pos >= max || src[pos] != marker {
			continue
		}

		if s.SCount[nextLine]-s.BlkIndent >= 4 {
			continue
		}

		pos = s.SkipBytes(pos, marker)

		if pos-mem < len {
			continue
		}

		pos = s.SkipSpaces(pos)

		if pos < max {
			continue
		}

		haveEndMarker = true

		break
	}

	len = s.SCount[startLine]

	s.Line = nextLine
	if haveEndMarker {
		s.Line++
	}

	s.PushToken(&Fence{
		Params:  params,
		Content: s.Lines(startLine+1, nextLine, len, true),
		Map:     [2]int{startLine, s.Line},
	})

	return true
}