summaryrefslogtreecommitdiff
path: root/internal/lightgallery/parser.go
blob: 2c10c010d1f7e34e43d545bc4cb5f92596577489 (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
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
package lightgallery

import (
	"bytes"
	"regexp"
	"strings"
	"time"

	"github.com/yuin/goldmark/ast"
	"github.com/yuin/goldmark/parser"
	"github.com/yuin/goldmark/text"
)

type LightGalleryParser struct{}

func NewLightGalleryParser() parser.BlockParser {
	return &LightGalleryParser{}
}

func (p *LightGalleryParser) Trigger() []byte {
	return []byte{'{'}
}

func (p *LightGalleryParser) Open(parent ast.Node, reader text.Reader, pc parser.Context) (ast.Node, parser.State) {
	line, _ := reader.PeekLine()

	if !bytes.HasPrefix(line, []byte("{Gallery")) {
		return nil, parser.NoChildren
	}

	r := regexp.MustCompile(`^\{Gallery:([A-Za-z0-9\+\-/]+)\}$`)

	trimmed := bytes.TrimSpace(line)
	parts := r.FindSubmatch(trimmed)
	if len(parts) < 2 {
		return nil, parser.NoChildren
	}

	loc, err := time.LoadLocation(string(parts[1]))
	if err != nil {
		return nil, parser.NoChildren
	}

	return &LightGalleryBlock{Location: loc}, parser.NoChildren
}

func (p *LightGalleryParser) Continue(node ast.Node, reader text.Reader, pc parser.Context) parser.State {
	line, segment := reader.PeekLine()
	if len(line) == 0 || segment.Len() == 0 {
		return parser.Close
	}

	trimmed := bytes.TrimSpace(line)
	if bytes.Equal(trimmed, []byte("{Gallery}")) {
		reader.AdvanceLine()
		return parser.Close
	}

	gallery := node.(*LightGalleryBlock)
	lineStr := string(trimmed)

	parts := strings.SplitN(lineStr, "|", 2)
	url := strings.TrimSpace(parts[0])
	caption := ""

	if len(parts) > 1 {
		caption = strings.TrimSpace(parts[1])
	}

	gallery.Images = append(gallery.Images, LightGalleryImage{
		URL:     url,
		Caption: caption,
	})

	return parser.Continue | parser.NoChildren
}

func (p *LightGalleryParser) Close(node ast.Node, reader text.Reader, pc parser.Context) {
}

func (p *LightGalleryParser) CanInterruptParagraph() bool {
	return true
}

func (p *LightGalleryParser) CanAcceptIndentedLine() bool {
	return false
}