diff options
| author | 2025-10-17 19:28:37 +0700 | |
|---|---|---|
| committer | 2025-10-17 19:28:37 +0700 | |
| commit | fa2d3009ed93c28e05758d52367b25fd6a04a2b7 (patch) | |
| tree | c4a05a93b5b5a1c586f0ed8a9eea2ef2f90dd3c6 /internal/glightbox/parser.go | |
| parent | 2e93141f1f53410d6c38122b918972581ec4aa8d (diff) | |
| parent | 152bbebe8d2d0a07ab6958a74b5f53159c79e45f (diff) | |
| download | web-0.9.0.tar.gz web-0.9.0.zip | |
v0.9.0 (#10)v0.9.0
- [feat: implement new prototype
gallery](https://github.com/SayaAndy/saya-today-web/commit/44fe2478478225450becb77ad5d273462c9b400a)
(masonry + glightbox instead of lightgallery)
- A simpler column gallery, expandable between 2 and 5 columns;
- Allows highlighting images via tags;
- A simpler lightbox layout with wider image, especially on mobile
devices;
- Displays tooltips;
- [feat: adapted layouts for mobile/tablet
devices](https://github.com/SayaAndy/saya-today-web/commit/d3ffefbd3d9de2378b564e4c6f965c03a5a06113)
- [feat: switched most length units to absolute in
layouts](https://github.com/SayaAndy/saya-today-web/commit/454e2f3cd84b6c0b02a0c2936a574d3d9c35c5a1)
- [feat: use dvw/dvh instead of
vw/vh](https://github.com/SayaAndy/saya-today-web/commit/e231d8a3074853fbdbae9b368976bd902a1428f7)
- [feat: add onclick links in blog post
links](https://github.com/SayaAndy/saya-today-web/commit/db174993127a8b2faf863a670fd6ce8ca8d7c1af)
- feat: add href for any onclick links/icons
- feat: use page-first layout for page titles (like "{page-header} //
SAYA TODAY", not vice versa)
- chore: rm any remains of old lightgallery
- fix: map redefining
Diffstat (limited to 'internal/glightbox/parser.go')
| -rw-r--r-- | internal/glightbox/parser.go | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/internal/glightbox/parser.go b/internal/glightbox/parser.go new file mode 100644 index 0000000..6780090 --- /dev/null +++ b/internal/glightbox/parser.go @@ -0,0 +1,100 @@ +package glightbox + +import ( + "bytes" + "log/slog" + "regexp" + "strings" + "time" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/text" +) + +type GLightboxParser struct{} + +func NewGLightboxParser() parser.BlockParser { + return &GLightboxParser{} +} + +func (p *GLightboxParser) Trigger() []byte { + return []byte{'{'} +} + +func (p *GLightboxParser) 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 { + slog.Warn("invalid gallery header format", slog.String("line", string(trimmed)), slog.Int("submatch_count", len(parts))) + return nil, parser.NoChildren + } + + loc, err := time.LoadLocation(string(parts[1])) + if err != nil { + slog.Warn("invalid location specified for a gallery", slog.String("error", err.Error()), slog.String("line", string(trimmed)), slog.String("location", string(parts[1]))) + return nil, parser.NoChildren + } + + return &GLightboxBlock{Location: loc}, parser.NoChildren +} + +func (p *GLightboxParser) 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.Continue | parser.NoChildren + } + + trimmed := bytes.TrimSpace(line) + if bytes.Equal(trimmed, []byte("{Gallery}")) || bytes.Equal(trimmed, []byte("{/Gallery}")) { + reader.AdvanceLine() + return parser.Close + } + + gallery := node.(*GLightboxBlock) + + parts := bytes.SplitN(trimmed, []byte{'|'}, 3) + url := bytes.TrimSpace(parts[0]) + + caption := make([]byte, 0) + tagsRaw := "" + if len(parts) == 2 { + caption = bytes.TrimSpace(parts[1]) + } + if len(parts) >= 3 { + tagsRaw = string(parts[1]) + caption = bytes.TrimSpace(parts[2]) + } + + tags := strings.Split(tagsRaw, ",") + for i := range tags { + tags[i] = strings.TrimSpace(tags[i]) + } + + gallery.Images = append(gallery.Images, GLightboxImage{ + URL: string(url), + Tags: tags, + Caption: caption, + }) + + return parser.Continue | parser.NoChildren +} + +func (p *GLightboxParser) Close(node ast.Node, reader text.Reader, pc parser.Context) { +} + +func (p *GLightboxParser) CanInterruptParagraph() bool { + return true +} + +func (p *GLightboxParser) CanAcceptIndentedLine() bool { + return false +} |