summaryrefslogtreecommitdiffstats
path: root/utils/markdown/block_quote.go
blob: 04a324617d8805a44b2821bc5826380ada0a384f (plain)
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
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.

package markdown

type BlockQuote struct {
	blockBase
	markdown string

	Children []Block
}

func (b *BlockQuote) Continuation(indentation int, r Range) *continuation {
	if indentation > 3 {
		return nil
	}
	s := b.markdown[r.Position:r.End]
	if s == "" || s[0] != '>' {
		return nil
	}
	remaining := Range{r.Position + 1, r.End}
	indentation, indentationBytes := countIndentation(b.markdown, remaining)
	if indentation > 0 {
		indentation--
	}
	return &continuation{
		Indentation: indentation,
		Remaining:   Range{remaining.Position + indentationBytes, remaining.End},
	}
}

func (b *BlockQuote) AddChild(openBlocks []Block) []Block {
	b.Children = append(b.Children, openBlocks[0])
	return openBlocks
}

func blockQuoteStart(markdown string, indent int, r Range, matchedBlocks, unmatchedBlocks []Block) []Block {
	if indent > 3 {
		return nil
	}
	s := markdown[r.Position:r.End]
	if s == "" || s[0] != '>' {
		return nil
	}

	block := &BlockQuote{
		markdown: markdown,
	}
	r.Position++
	if len(s) > 1 && s[1] == ' ' {
		r.Position++
	}

	indent, bytes := countIndentation(markdown, r)

	ret := []Block{block}
	if descendants := blockStartOrParagraph(markdown, indent, Range{r.Position + bytes, r.End}, nil, nil); descendants != nil {
		block.Children = append(block.Children, descendants[0])
		ret = append(ret, descendants...)
	}
	return ret
}