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

83
util.go
View File

@ -3,16 +3,35 @@ package main
import ( import (
"bufio" "bufio"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"log" "log"
"math/rand" "math/rand"
"regexp" "regexp"
"strconv"
"strings" "strings"
"time" "time"
) )
var ( 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 { type ParsedLink struct {
@ -103,40 +122,10 @@ func todayPage() string {
} }
func formatDateTitle(date time.Time) string { func formatDateTitle(date time.Time) string {
months := []string{ return fmt.Sprintf("%d %s %d", date.Day(), Months[date.Month()], date.Year())
"",
"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())
} }
func formatDatePageName(date time.Time) string { func formatDatePageName(date time.Time) string {
months := []string{ return fmt.Sprintf("%d_%s_%d", date.Day(), Months[date.Month()], date.Year())
"",
"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())
} }
func PageTitle(pageText string) (string, error) { 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") 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)
}