diff --git a/.gitignore b/.gitignore
index a33b780..c31558d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,7 @@ Tzum/xml2txt
VRT/metadata
VRT/vrt
bin/data2json
+bin/dates2json
bin/ISOWeek
bin/flush
bin/items2count
diff --git a/Makefile b/Makefile
index 6715a78..f9a3e67 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@ all:
make -C Tzum
make -C VRT
make bin/data2json
+ make bin/dates2json
make bin/flush
make bin/ISOWeek
make bin/items2count
@@ -24,6 +25,9 @@ all:
bin/data2json: cmd/data2json/*.go
go build -o $@ $^
+bin/dates2json: cmd/dates2json/*.go
+ go build -o $@ $^
+
bin/flush: cmd/flush/*.go
go build -o $@ $^
diff --git a/cmd/dates2json/dates2json.go b/cmd/dates2json/dates2json.go
new file mode 100644
index 0000000..f0fd390
--- /dev/null
+++ b/cmd/dates2json/dates2json.go
@@ -0,0 +1,105 @@
+package main
+
+import (
+ e "codeberg.org/pebbe/errors"
+
+ "encoding/json"
+ "fmt"
+ "os"
+ "slices"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type Date struct {
+ Week string `json:"week"`
+ First string `json:"first"`
+ Last string `json:"last"`
+}
+
+var (
+ x = e.ExitErr
+
+ dates = make([]Date, 0)
+)
+
+func main() {
+
+ files, err := os.ReadDir("/net/corpora/nlnieuws/data")
+ x(err)
+
+ for _, file := range files {
+ filename := file.Name()
+ if strings.HasPrefix(filename, "DATA-") && strings.HasSuffix(filename, "-4.json") {
+ addWeek(filename[5:12])
+ }
+ }
+
+ slices.Reverse(dates)
+ b, err := json.Marshal(dates)
+ x(err)
+ fmt.Println(string(b))
+
+}
+
+func addWeek(s string) {
+
+ week, err := strconv.Atoi(s[5:])
+ x(err)
+ year, err := strconv.Atoi(s[:4])
+ x(err)
+
+ // 15 januari van het jaar
+ t := time.Date(year, 1, 15, 12, 0, 0, 0, time.UTC)
+
+ // eerste gok
+ t = t.AddDate(0, 0, 7*week-14)
+
+ // zoek juiste week
+ var y, w int
+ for {
+ y, _ = t.ISOWeek()
+ if y < year {
+ t = t.AddDate(0, 12, 0)
+ continue
+ }
+ if y > year {
+ t = t.AddDate(0, -12, 0)
+ continue
+ }
+ break
+ }
+ for {
+ y, w = t.ISOWeek()
+ if w < week {
+ t = t.AddDate(0, 0, 7)
+ continue
+ }
+ if w > week {
+ t = t.AddDate(0, 0, -7)
+ }
+ break
+ }
+ if y != year {
+ x(fmt.Errorf("ongeldige combinatie van week/jaar: %d/%d", week, year))
+ }
+
+ // zoek begin van de week
+ d := int(t.Weekday())
+ if d == 0 {
+ d = 7
+ }
+ tFirst := t.AddDate(0, 0, 1-d)
+ tLast := tFirst.AddDate(0, 0, 6)
+
+ dates = append(dates, Date{
+ Week: s,
+ First: makeDate(tFirst),
+ Last: makeDate(tLast),
+ })
+}
+
+func makeDate(d time.Time) string {
+ return fmt.Sprintf("%d-%02d-%02d", d.Year(), int(d.Month()), d.Day())
+}
diff --git a/www/app.html b/www/app.html
index a17d43b..1af3b1f 100644
--- a/www/app.html
+++ b/www/app.html
@@ -21,6 +21,7 @@
| bron |
onderdeel |
+ week |
|
@@ -82,15 +83,15 @@
>
|
+
+
+ |
- |
- to do: selecteer een periode
-
-
-
+ |
+
|
diff --git a/www/app.js b/www/app.js
index eb0f032..29a5efe 100644
--- a/www/app.js
+++ b/www/app.js
@@ -1,4 +1,5 @@
var dates
+var datesNr
var parts = [
'nieuwe namen',
@@ -156,9 +157,9 @@ async function loadWeken(source, part) {
tab.classList.add('outer')
tr = document.createElement('tr')
- for (var i = 0; i < 6; i++) {
+ for (var i = datesNr; i < datesNr + 10; i++) {
if (i < dates.length) {
- var week = dates[i]
+ var week = dates[i].week
if (!data.has(week)) {
data[week] = await getJSON('DATA-' + week + '-4.json')
}
@@ -172,14 +173,51 @@ async function loadWeken(source, part) {
document.getElementById('data').innerHTML = d.innerHTML
}
+function locateWeek(date) {
+ if (date == '') {
+ datesNr = 0
+ return
+ }
+ var n = dates.length - 1
+ if (date < dates[n].first) {
+ datesNr = n
+ return
+ }
+ if (date > dates[0].last) {
+ datesNr = 0
+ return
+ }
+ var p1 = 0
+ var p2 = n
+ while (true) {
+ // fix voor als de weken niet aansluitend zijn (er ontbreken weken)
+ if (p1 > p2) {
+ datesNr = p2
+ return
+ }
+ var i = Math.floor((p1 + p2) / 2)
+ if (dates[i].first > date) {
+ p1 = i + 1 // dit klopt: lijst is van groot naar klein
+ } else if (dates[i].last < date) {
+ p2 = i - 1
+ } else {
+ datesNr = i
+ return
+ }
+ }
+}
+
async function kies() {
let source = document.forms['choice']['rSource'].value
let part = document.forms['choice']['rPart'].value
+ let date = document.forms['choice']['dDatum'].value
if ((source == 'alles' || source == '') && (part == 'alles' || part == '')) {
alert('Kies een bron en/of een onderdeel')
return
}
+ locateWeek(date)
+
const dd = document.getElementById('data')
const st = document.getElementById('subtitle')
dd.classList.add('fade')
@@ -187,11 +225,11 @@ async function kies() {
await sleep(20)
if (source == 'alles' || source == '') {
- loadPart(part, dates[0])
+ await loadPart(part, dates[datesNr].week)
} else if (part == 'alles' || part == '') {
- loadSource(source, dates[0])
+ await loadSource(source, dates[datesNr].week)
} else {
- loadWeken(source, part)
+ await loadWeken(source, part)
}
dd.classList.remove('fade')
st.classList.remove('fade')
@@ -199,7 +237,11 @@ async function kies() {
async function init() {
dates = await getJSON('index4.json')
- loadSource('Algemeen', dates[0])
+ datesNr = 0
+ const d = document.getElementById('dDatum')
+ d.setAttribute('min', dates[dates.length - 1].last)
+ d.setAttribute('max', dates[0].last)
+ loadSource('Algemeen', dates[datesNr].week)
}
init()
diff --git a/www/index1.json b/www/index1.json
index 8928904..74cc310 100644
--- a/www/index1.json
+++ b/www/index1.json
@@ -1 +1 @@
-["2026-16", "2026-15", "2026-14", "2026-13", "2026-12", "2026-11", "2026-10"]
+[{"week":"2026-16","first":"2026-04-13","last":"2026-04-19"},{"week":"2026-15","first":"2026-04-06","last":"2026-04-12"},{"week":"2026-14","first":"2026-03-30","last":"2026-04-05"},{"week":"2026-13","first":"2026-03-23","last":"2026-03-29"},{"week":"2026-12","first":"2026-03-16","last":"2026-03-22"},{"week":"2026-11","first":"2026-03-09","last":"2026-03-15"},{"week":"2026-10","first":"2026-03-02","last":"2026-03-08"}]
diff --git a/www/index4.json b/www/index4.json
index 8928904..74cc310 100644
--- a/www/index4.json
+++ b/www/index4.json
@@ -1 +1 @@
-["2026-16", "2026-15", "2026-14", "2026-13", "2026-12", "2026-11", "2026-10"]
+[{"week":"2026-16","first":"2026-04-13","last":"2026-04-19"},{"week":"2026-15","first":"2026-04-06","last":"2026-04-12"},{"week":"2026-14","first":"2026-03-30","last":"2026-04-05"},{"week":"2026-13","first":"2026-03-23","last":"2026-03-29"},{"week":"2026-12","first":"2026-03-16","last":"2026-03-22"},{"week":"2026-11","first":"2026-03-09","last":"2026-03-15"},{"week":"2026-10","first":"2026-03-02","last":"2026-03-08"}]