mirror of https://github.com/jlelse/GoBlog
Add year and month archives
This commit is contained in:
parent
796470c067
commit
c8df151c57
21
http.go
21
http.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"compress/flate"
|
"compress/flate"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -236,6 +237,26 @@ func buildHandler() (http.Handler, error) {
|
||||||
r.With(cacheMiddleware, minifier.Middleware).Get(searchResultPath+paginationPath, resultHandler)
|
r.With(cacheMiddleware, minifier.Middleware).Get(searchResultPath+paginationPath, resultHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Year / month archives
|
||||||
|
months, err := allMonths(blog)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for y, ms := range months {
|
||||||
|
yearPath := blogPath + "/" + fmt.Sprintf("%0004d", y)
|
||||||
|
yearHandler := serveYearMonth(blog, yearPath, y, 0)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(yearPath, yearHandler)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(yearPath+feedPath, yearHandler)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(yearPath+paginationPath, yearHandler)
|
||||||
|
for _, m := range ms {
|
||||||
|
monthPath := yearPath + "/" + fmt.Sprintf("%02d", m)
|
||||||
|
monthHandler := serveYearMonth(blog, monthPath, y, m)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(monthPath, monthHandler)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(monthPath+feedPath, monthHandler)
|
||||||
|
r.With(cacheMiddleware, minifier.Middleware).Get(monthPath+paginationPath, monthHandler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Blog
|
// Blog
|
||||||
var mw []func(http.Handler) http.Handler
|
var mw []func(http.Handler) http.Handler
|
||||||
if appConfig.ActivityPub.Enabled {
|
if appConfig.ActivityPub.Enabled {
|
||||||
|
|
36
posts.go
36
posts.go
|
@ -8,8 +8,10 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/go-chi/chi"
|
"github.com/go-chi/chi"
|
||||||
|
"github.com/goodsign/monday"
|
||||||
"github.com/vcraescu/go-paginator"
|
"github.com/vcraescu/go-paginator"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -132,6 +134,24 @@ func serveSearchResults(blog string, path string) func(w http.ResponseWriter, r
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func serveYearMonth(blog string, path string, year, month int) func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var title string
|
||||||
|
if month == 0 {
|
||||||
|
title = fmt.Sprintf("%0004d", year)
|
||||||
|
} else {
|
||||||
|
ml := monday.Locale(appConfig.Blogs[blog].TimeLang)
|
||||||
|
date := time.Date(0, 0, 10, 0, 0, 0, 0, time.Local).AddDate(year, month, 0)
|
||||||
|
title = monday.Format(date, "January 2006", ml)
|
||||||
|
}
|
||||||
|
return serveIndex(&indexConfig{
|
||||||
|
blog: blog,
|
||||||
|
path: path,
|
||||||
|
year: year,
|
||||||
|
month: month,
|
||||||
|
title: title,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
type indexConfig struct {
|
type indexConfig struct {
|
||||||
blog string
|
blog string
|
||||||
path string
|
path string
|
||||||
|
@ -139,6 +159,8 @@ type indexConfig struct {
|
||||||
tax *taxonomy
|
tax *taxonomy
|
||||||
taxValue string
|
taxValue string
|
||||||
parameter string
|
parameter string
|
||||||
|
year int
|
||||||
|
month int
|
||||||
title string
|
title string
|
||||||
description string
|
description string
|
||||||
summaryTemplate string
|
summaryTemplate string
|
||||||
|
@ -161,12 +183,14 @@ func serveIndex(ic *indexConfig) func(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p := paginator.New(&postPaginationAdapter{config: &postsRequestConfig{
|
p := paginator.New(&postPaginationAdapter{config: &postsRequestConfig{
|
||||||
blog: ic.blog,
|
blog: ic.blog,
|
||||||
sections: sections,
|
sections: sections,
|
||||||
taxonomy: ic.tax,
|
taxonomy: ic.tax,
|
||||||
taxonomyValue: ic.taxValue,
|
taxonomyValue: ic.taxValue,
|
||||||
parameter: ic.parameter,
|
parameter: ic.parameter,
|
||||||
search: search,
|
search: search,
|
||||||
|
publishedYear: ic.year,
|
||||||
|
publishedMonth: ic.month,
|
||||||
}}, appConfig.Blogs[ic.blog].Pagination)
|
}}, appConfig.Blogs[ic.blog].Pagination)
|
||||||
p.SetPage(pageNo)
|
p.SetPage(pageNo)
|
||||||
var posts []*post
|
var posts []*post
|
||||||
|
|
27
postsDb.go
27
postsDb.go
|
@ -230,6 +230,8 @@ type postsRequestConfig struct {
|
||||||
taxonomyValue string
|
taxonomyValue string
|
||||||
parameter string
|
parameter string
|
||||||
parameterValue string
|
parameterValue string
|
||||||
|
publishedYear int
|
||||||
|
publishedMonth int
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildQuery(config *postsRequestConfig) (query string, args []interface{}) {
|
func buildQuery(config *postsRequestConfig) (query string, args []interface{}) {
|
||||||
|
@ -270,6 +272,14 @@ func buildQuery(config *postsRequestConfig) (query string, args []interface{}) {
|
||||||
}
|
}
|
||||||
postsTable += ")"
|
postsTable += ")"
|
||||||
}
|
}
|
||||||
|
if config.publishedYear != 0 {
|
||||||
|
postsTable = "(select * from " + postsTable + " p where substr(p.published, 1, 4) = @publishedyear)"
|
||||||
|
args = append(args, sql.Named("publishedyear", fmt.Sprintf("%0004d", config.publishedYear)))
|
||||||
|
}
|
||||||
|
if config.publishedMonth != 0 {
|
||||||
|
postsTable = "(select * from " + postsTable + " p where substr(p.published, 6, 2) = @publishedmonth)"
|
||||||
|
args = append(args, sql.Named("publishedmonth", fmt.Sprintf("%02d", config.publishedMonth)))
|
||||||
|
}
|
||||||
defaultTables := " from " + postsTable + " p left outer join post_parameters pp on p.path = pp.path "
|
defaultTables := " from " + postsTable + " p left outer join post_parameters pp on p.path = pp.path "
|
||||||
defaultSorting := " order by p.published desc "
|
defaultSorting := " order by p.published desc "
|
||||||
if config.path != "" {
|
if config.path != "" {
|
||||||
|
@ -352,3 +362,20 @@ func allTaxonomyValues(blog string, taxonomy string) ([]string, error) {
|
||||||
}
|
}
|
||||||
return values, nil
|
return values, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func allMonths(blog string) (months map[int][]int, err error) {
|
||||||
|
rows, err := appDbQuery("select distinct substr(published, 1, 4) as year, substr(published, 6, 2) as month from posts where blog = @blog and year != '' and month != ''", sql.Named("blog", blog))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
months = map[int][]int{}
|
||||||
|
for rows.Next() {
|
||||||
|
var year, month int
|
||||||
|
err = rows.Scan(&year, &month)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
months[year] = append(months[year], month)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue