| -rw-r--r-- | internal/frontmatter/parser.go | 1 | ||||
| -rw-r--r-- | internal/lightgallery/block.go | 9 | ||||
| -rw-r--r-- | internal/lightgallery/html_renderer.go | 3 | ||||
| -rw-r--r-- | internal/lightgallery/parser.go | 16 | ||||
| -rw-r--r-- | main.go | 12 | ||||
| -rw-r--r-- | static/input.css | 8 | ||||
| -rw-r--r-- | views/pages/blog-catalogue.html | 2 | ||||
| -rw-r--r-- | views/pages/blog-page.html | 4 |
8 files changed, 40 insertions, 15 deletions
diff --git a/internal/frontmatter/parser.go b/internal/frontmatter/parser.go index 1a521c0..3c00a7f 100644 --- a/internal/frontmatter/parser.go +++ b/internal/frontmatter/parser.go @@ -16,6 +16,7 @@ type Metadata struct { Thumbnail string `yaml:"thumbnail"` Tags []string `yaml:"tags"` Geolocation string `yaml:"geolocation"` + Timezone string `yaml:"timezone"` } func ParseFrontmatter(content []byte) (metadata *Metadata, markdown []byte, err error) { diff --git a/internal/lightgallery/block.go b/internal/lightgallery/block.go index dade2ea..072aa3c 100644 --- a/internal/lightgallery/block.go +++ b/internal/lightgallery/block.go @@ -1,11 +1,16 @@ package lightgallery -import "github.com/yuin/goldmark/ast" +import ( + "time" + + "github.com/yuin/goldmark/ast" +) // LightGalleryBlock represents a light gallery block in the AST type LightGalleryBlock struct { ast.BaseBlock - Images []LightGalleryImage + Images []LightGalleryImage + Location *time.Location } type LightGalleryImage struct { diff --git a/internal/lightgallery/html_renderer.go b/internal/lightgallery/html_renderer.go index e611f0b..77b9785 100644 --- a/internal/lightgallery/html_renderer.go +++ b/internal/lightgallery/html_renderer.go @@ -54,6 +54,7 @@ func (r *LightGalleryHTMLRenderer) renderLightGallery(w util.BufWriter, source [ imageNameParts := strings.Split(imageUrlWithoutExt, "-") dayDate, _ := time.Parse("20060102 150405", imageNameParts[len(imageNameParts)-2]+" "+imageNameParts[len(imageNameParts)-1]) + dayDate = dayDate.In(gallery.Location) dynamicElements = append(dynamicElements, fmt.Sprintf(`{ src: "https://f003.backblazeb2.com/file/sayana-photos/full/%s", @@ -70,7 +71,7 @@ func (r *LightGalleryHTMLRenderer) renderLightGallery(w util.BufWriter, source [ <p class="grow !text-[1vmax]/[0.9] text-left font-spectral text-main-dark">%s</p> <p class="!text-[1vmax]/[0.9] text-right font-spectral text-secondary">%s</p> </div>`+"`"+` - }`, img.URL, img.URL, img.Caption, imageUrlWithoutExt, imageUrlWithoutExt, img.Caption, dayDate.Format("2006-01-02 15:04:05 -07:00"))) + }`, img.URL, img.URL, escapeHTML(img.Caption), imageUrlWithoutExt, imageUrlWithoutExt, escapeHTML(img.Caption), dayDate.Format("2006-01-02 15:04:05 -07:00"))) } w.WriteString(fmt.Sprintf(` diff --git a/internal/lightgallery/parser.go b/internal/lightgallery/parser.go index 0ce209c..2c10c01 100644 --- a/internal/lightgallery/parser.go +++ b/internal/lightgallery/parser.go @@ -2,7 +2,9 @@ package lightgallery import ( "bytes" + "regexp" "strings" + "time" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" @@ -22,16 +24,24 @@ func (p *LightGalleryParser) Trigger() []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}")) { + if !bytes.HasPrefix(line, []byte("{Gallery")) { return nil, parser.NoChildren } + r := regexp.MustCompile(`^\{Gallery:([A-Za-z0-9\+\-/]+)\}$`) + trimmed := bytes.TrimSpace(line) - if !bytes.Equal(trimmed, []byte("{Gallery}")) { + 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{}, parser.NoChildren + return &LightGalleryBlock{Location: loc}, parser.NoChildren } func (p *LightGalleryParser) Continue(node ast.Node, reader text.Reader, pc parser.Context) parser.State { @@ -121,7 +121,7 @@ func main() { querySort := c.Query("sort") if querySort == "" { - querySort = "titleAsc" + querySort = "publicationDateDesc" } encodedQuery := c.Request().URI().QueryString() @@ -148,7 +148,7 @@ func main() { tagsMap := make(map[string]int) for _, page := range pages { - slog.Debug("enlist page for catalogue", slog.Any("page", page), slog.String("endpoint", "/")) + slog.Debug("enlist page for catalogue", slog.Any("page", page), slog.String("endpoint", "/"+lang+"/blog")) for _, tag := range page.Metadata.Tags { tagsMap[tag]++ } @@ -287,12 +287,12 @@ func main() { case "actionDateDesc": return strings.Compare(b["ActionDate"], a["ActionDate"]) case "publicationDateAsc": - publishedTimeA, _ := time.Parse(time.RFC3339, a["PublishedTime"]) - publishedTimeB, _ := time.Parse(time.RFC3339, b["PublishedTime"]) + publishedTimeA, _ := time.Parse("2006-01-02 15:04:05 -0700", a["PublishedTime"]) + publishedTimeB, _ := time.Parse("2006-01-02 15:04:05 -0700", b["PublishedTime"]) return publishedTimeA.Compare(publishedTimeB) case "publicationDateDesc": - publishedTimeA, _ := time.Parse(time.RFC3339, a["PublishedTime"]) - publishedTimeB, _ := time.Parse(time.RFC3339, b["PublishedTime"]) + publishedTimeA, _ := time.Parse("2006-01-02 15:04:05 -0700", a["PublishedTime"]) + publishedTimeB, _ := time.Parse("2006-01-02 15:04:05 -0700", b["PublishedTime"]) return publishedTimeB.Compare(publishedTimeA) } return 0 diff --git a/static/input.css b/static/input.css index 8776b25..69cfa91 100644 --- a/static/input.css +++ b/static/input.css @@ -416,6 +416,10 @@ body:has(.lg-container:not([class~="lg-inline"])) .mobile-topbar-custom { height: 10vh; } + .ar-lt-0\.8\:h-\[30vh\] { + height: 30vh; + } + .ar-lt-0\.8\:h-\[90vh\] { height: 90vh; } @@ -424,6 +428,10 @@ body:has(.lg-container:not([class~="lg-inline"])) .mobile-topbar-custom { width: 8vh; } + .ar-lt-0\.8\:w-\[80\%\] { + width: 80%; + } + .ar-lt-0\.8\:w-\[90vw\] { width: 90vw; } diff --git a/views/pages/blog-catalogue.html b/views/pages/blog-catalogue.html index 4cda19d..962932e 100644 --- a/views/pages/blog-catalogue.html +++ b/views/pages/blog-catalogue.html @@ -1,5 +1,5 @@ {{ define "body" }} -<div class="flex flex-row ar-lt-0.8:flex-col max-h-[calc(100%-6vmax)] ar-lt-0.8:max-h-[80%] flex-1 text-[1vmax]"> +<div class="flex flex-row ar-lt-0.8:flex-col max-h-[calc(100%-7vmax)] ar-lt-0.8:max-h-[80%] flex-1 text-[1vmax]"> <form hx-get="/api/v1/blog-search" hx-vals='{"lang": "{{ .Lang }}"}' hx-target=".blog-cards" hx-swap="innerHTML" class="tags-list ar-gt-0.8:min-w-[10vh] ar-gt-0.8:max-w-[20vh] ar-gt-0.8:w-fit ar-lt-0.8:w-[100%] flex shrink-0 flex-col overflow-y-auto ar-gt-0.8:mr-[1.2vmin]"> <fieldset> diff --git a/views/pages/blog-page.html b/views/pages/blog-page.html index 5f001d6..093a75e 100644 --- a/views/pages/blog-page.html +++ b/views/pages/blog-page.html @@ -15,11 +15,11 @@ {{ end }} {{ define "body" }} -<div class="bg-background-light flex flex-col grow overflow-y-auto inset-shadow p-[2.4vmin] ar-lt-0.8:max-h-[80%]"> +<div class="bg-background-light flex flex-col grow overflow-y-auto inset-shadow p-[2.4vmin] max-h-[calc(100%-7vmax)] ar-lt-0.8:max-h-[80%]"> {{ .ParsedMarkdown }} {{- if .MapLocationX }} <hr class="border-t-4 border-dotted border-main-dark mt-[0.8vmin] mb-[0.8vmin] w-[80%] ml-auto mr-auto"> - <div id="location-map" class="relative p-[0.8vmin] flex-none ml-auto mr-auto w-[60%] h-[40vh]"></div> + <div id="location-map" class="relative p-[0.8vmin] flex-none ml-auto mr-auto w-[60%] ar-lt-0.8:w-[80%] h-[40vh] ar-lt-0.8:h-[30vh]"></div> <hr class="border-t-4 border-dotted border-main-dark mt-[0.8vmin] mb-[0.8vmin] w-[80%] ml-auto mr-auto"> {{- end }} </div> |