/*
SGBlog -- Git-backed CGI/UCSPI blogging/phlogging/gemlogging engine
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
import (
"bufio"
+ _ "embed"
"errors"
"fmt"
"io"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
+ "github.com/vorlif/spreak"
"go.stargrave.org/sgblog"
)
-const (
- TmplGemMenu = `{{$CR := printf "\r"}}20 text/gemini{{$CR}}
-# {{.Cfg.Title}} {{if .Topic}}(topic: {{.Topic}}) {{end}}({{.Offset}}-{{.OffsetNext}})
-{{if .Cfg.AboutURL}}=> {{.Cfg.AboutURL}} About{{end}}
-{{if .Offset}}=> /?offset={{.OffsetPrev}}{{if .Topic}}&topic={{.Topic}}{{end}} Prev{{end}}
-{{if not .LogEnded}}=> /?offset={{.OffsetNext}}{{if .Topic}}&topic={{.Topic}}{{end}} Next{{end}}
+var (
+ //go:embed gemini-menu.tmpl
+ TmplGemMenuRaw string
+ //go:embed gemini-entry.tmpl
+ TmplGemEntryRaw string
-{{$datePrev := "0001-01-01" -}}
-{{- range .Entries -}}
-{{- $dateCur := .Commit.Author.When.Format "2006-01-02" -}}
-{{- if ne $dateCur $datePrev}}{{$datePrev = $dateCur}}## {{$dateCur}}
-{{end -}}
-=> /{{.Commit.Hash.String}} [{{.Commit.Author.When.Format "15:04"}}] {{.Title}} ({{.LinesNum}}L){{with .CommentsNum}} ({{.}}C){{end}}{{if .Topics}}{{range .Topics}} {{.}}{{end}}{{end}}
-{{end}}
-
-{{range .Topics -}}=> /?topic={{.}} Topic: {{.}}
-{{end}}
-Generated by: SGBlog {{.Version}}
-`
- TmplGemEntry = `{{$CR := printf "\r"}}20 text/gemini{{$CR}}
-# {{.Title}}
-What: {{.Commit.Hash.String}}
-When: {{.When}}
-{{if .Topics}}Topics:{{range .Topics}} {{.}}{{end}}{{end}}
-` + "```" + `
-{{.Commit.Message}}` + "```" + `
-{{- if .Note}}
-## Note:
-` + "```" + `
-{{.Note}}
-` + "```" + `
-{{end -}}
-{{- if .Cfg.CommentsEmail}}
-=> mailto:{{.Cfg.CommentsEmail}}?subject={{.TitleEscaped}} leave comment
-{{end}}{{range $idx, $comment := .Comments}}
-## comment {{$idx}}:
-` + "```" + `
-{{$comment}}
-` + "```" + `
-{{end}}
-Generated by: SGBlog {{.Version}}
-`
+ TmplGemMenu = template.Must(template.New("menu").Parse(TmplGemMenuRaw))
+ TmplGemEntry = template.Must(template.New("entry").Parse(TmplGemEntryRaw))
)
func makeGemErr(err error) {
if err != nil {
log.Fatalln(err)
}
+ initLocalizer(cfg.Lang)
headHash, err := initRepo(cfg)
if err != nil {
}
lines := msgSplit(commit.Message)
entries = append(entries, TableMenuEntry{
- Commit: commit,
- Title: lines[0],
- LinesNum: len(lines) - 2,
+ Commit: commit,
+ Title: lines[0],
+ LinesNum: len(lines) - 2,
+ ImagesNum: len(listImgs(cfg, commit.Hash)),
CommentsNum: len(sgblog.ParseComments(sgblog.GetNote(
repo, commentsTree, commit.Hash,
))),
)),
})
}
- tmpl := template.Must(template.New("menu").Parse(TmplGemMenu))
offsetPrev := offset - PageEntries
if offsetPrev < 0 {
offsetPrev = 0
}
- err = tmpl.Execute(os.Stdout, struct {
+ err = TmplGemMenu.Execute(os.Stdout, struct {
+ T *spreak.Localizer
Cfg *Cfg
Topic string
Offset int
Topics []string
Version string
}{
+ T: localizer,
Cfg: cfg,
Topic: topic,
Offset: offset,
if err != nil {
log.Fatalln(err)
}
- tmpl := template.Must(template.New("entry").Parse(TmplGemEntry))
title := msgSplit(commit.Message)[0]
- err = tmpl.Execute(os.Stdout, struct {
+ err = TmplGemEntry.Execute(os.Stdout, struct {
+ T *spreak.Localizer
Title string
Commit *object.Commit
When string
Cfg *Cfg
Note string
+ Images []Img
Comments []string
Topics []string
Version string
TitleEscaped string
}{
+ T: localizer,
Title: title,
Commit: commit,
When: commit.Author.When.Format(sgblog.WhenFmt),
Cfg: cfg,
Note: string(sgblog.GetNote(repo, notesTree, commit.Hash)),
+ Images: listImgs(cfg, commit.Hash),
Comments: sgblog.ParseComments(sgblog.GetNote(repo, commentsTree, commit.Hash)),
Topics: sgblog.ParseTopics(sgblog.GetNote(repo, topicsTree, commit.Hash)),
Version: sgblog.Version,