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"}]