Parse date title to actual date
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Peter Stuifzand 2021-01-17 21:31:26 +01:00
parent 35b8c45169
commit 05539ff687
2 changed files with 62 additions and 42 deletions

21
file.go
View File

@ -131,7 +131,6 @@ type titleOption struct {
timeObj time.Time
}
// 1_januari_2021
// 2021-01-01
@ -139,29 +138,33 @@ func (fp *FilePages) Get(name string) Page {
var sw stopwatch
sw.Start("Get " + name)
defer sw.Stop()
var names []string
date := false
t, err := time.Parse("2006-01-02", name)
var to titleOption
pageNameDate, err := ParseDatePageName(name)
if err == nil {
date = true
names = append(names, formatDatePageName(t), name)
to.date = true
to.timeObj = pageNameDate
names = append(names, name, pageNameDate.Format("2006-01-02"))
} else if t, err := time.Parse("2006-01-02", name); err == nil {
to.date = true
to.timeObj = t
names = append(names, formatDatePageName(to.timeObj), name)
} else {
names = append(names, name)
}
for _, name := range names {
log.Printf("Trying %q", name)
blocks, err := loadBlocks(fp.dirname, name)
if err != nil && errors.Is(err, BlockNotFound) {
continue
}
return fp.blocksBackendGet(name, blocks, titleOption{date, t})
return fp.blocksBackendGet(name, blocks, to)
}
page, err := fp.oldPagesBackend(name)
if err != nil {
return fp.blocksBackendGet(name, BlockResponse{ParentID: "root", PageID: name}, titleOption{date, t})
return fp.blocksBackendGet(name, BlockResponse{ParentID: "root", PageID: name}, to)
}
return page

83
util.go
View File

@ -3,16 +3,35 @@ package main
import (
"bufio"
"encoding/json"
"errors"
"fmt"
"log"
"math/rand"
"regexp"
"strconv"
"strings"
"time"
)
var (
MetaKV = regexp.MustCompile(`(\w+)::\s+(.*)`)
MetaKV = regexp.MustCompile(`(\w+)::\s+(.*)`)
niceDateParseRE = regexp.MustCompile(`^(\d{1,2})_([a-z]+)_(\d{4})$`)
ParseFailed = errors.New("parse failed")
Months = []string{
"",
"januari",
"februari",
"maart",
"april",
"mei",
"juni",
"juli",
"augustus",
"september",
"oktober",
"november",
"december",
}
)
type ParsedLink struct {
@ -103,40 +122,10 @@ func todayPage() string {
}
func formatDateTitle(date time.Time) string {
months := []string{
"",
"januari",
"februari",
"maart",
"april",
"mei",
"juni",
"juli",
"augustus",
"september",
"oktober",
"november",
"december",
}
return fmt.Sprintf("%d %s %d", date.Day(), months[date.Month()], date.Year())
return fmt.Sprintf("%d %s %d", date.Day(), Months[date.Month()], date.Year())
}
func formatDatePageName(date time.Time) string {
months := []string{
"",
"januari",
"februari",
"maart",
"april",
"mei",
"juni",
"juli",
"augustus",
"september",
"oktober",
"november",
"december",
}
return fmt.Sprintf("%d_%s_%d", date.Day(), months[date.Month()], date.Year())
return fmt.Sprintf("%d_%s_%d", date.Day(), Months[date.Month()], date.Year())
}
func PageTitle(pageText string) (string, error) {
@ -158,3 +147,31 @@ func PageTitle(pageText string) (string, error) {
}
return "", fmt.Errorf("no meta title found in page text")
}
func parseMonth(month string) (time.Month, error) {
for i, m := range Months {
if m == month {
return time.Month(i), nil
}
}
return time.Month(0), fmt.Errorf("parseMonth: %q is not a recognized month", month)
}
func ParseDatePageName(name string) (time.Time, error) {
if matches := niceDateParseRE.FindStringSubmatch(name); matches != nil {
day, err := strconv.Atoi(matches[1])
if err != nil {
return time.Time{}, fmt.Errorf("%q: %s: %w", name, err, ParseFailed)
}
month, err := parseMonth(matches[2])
if err != nil {
return time.Time{}, fmt.Errorf("%q: %s: %w", name, err, ParseFailed)
}
year, err := strconv.Atoi(matches[3])
if err != nil {
return time.Time{}, fmt.Errorf("%q: %s: %w", name, err, ParseFailed)
}
return time.Date(year, month, day, 0, 0, 0, 0, time.Local), nil
}
return time.Time{}, fmt.Errorf("%q: invalid syntax: %w", name, ParseFailed)
}