www: selectie van de week
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -33,6 +33,7 @@ Tzum/xml2txt
|
|||||||
VRT/metadata
|
VRT/metadata
|
||||||
VRT/vrt
|
VRT/vrt
|
||||||
bin/data2json
|
bin/data2json
|
||||||
|
bin/dates2json
|
||||||
bin/ISOWeek
|
bin/ISOWeek
|
||||||
bin/flush
|
bin/flush
|
||||||
bin/items2count
|
bin/items2count
|
||||||
|
|||||||
4
Makefile
4
Makefile
@@ -14,6 +14,7 @@ all:
|
|||||||
make -C Tzum
|
make -C Tzum
|
||||||
make -C VRT
|
make -C VRT
|
||||||
make bin/data2json
|
make bin/data2json
|
||||||
|
make bin/dates2json
|
||||||
make bin/flush
|
make bin/flush
|
||||||
make bin/ISOWeek
|
make bin/ISOWeek
|
||||||
make bin/items2count
|
make bin/items2count
|
||||||
@@ -24,6 +25,9 @@ all:
|
|||||||
bin/data2json: cmd/data2json/*.go
|
bin/data2json: cmd/data2json/*.go
|
||||||
go build -o $@ $^
|
go build -o $@ $^
|
||||||
|
|
||||||
|
bin/dates2json: cmd/dates2json/*.go
|
||||||
|
go build -o $@ $^
|
||||||
|
|
||||||
bin/flush: cmd/flush/*.go
|
bin/flush: cmd/flush/*.go
|
||||||
go build -o $@ $^
|
go build -o $@ $^
|
||||||
|
|
||||||
|
|||||||
105
cmd/dates2json/dates2json.go
Normal file
105
cmd/dates2json/dates2json.go
Normal file
@@ -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())
|
||||||
|
}
|
||||||
15
www/app.html
15
www/app.html
@@ -21,6 +21,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>bron</th>
|
<th>bron</th>
|
||||||
<th>onderdeel</th>
|
<th>onderdeel</th>
|
||||||
|
<th>week</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@@ -82,15 +83,15 @@
|
|||||||
> </label
|
> </label
|
||||||
>
|
>
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="date" id="dDatum" name="dDatum" step="7" />
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" style="text-align: center">
|
<td colspan="3" style="text-align: center">
|
||||||
<p>to do: selecteer een periode</p>
|
<button type="button" onclick="kies()">
|
||||||
<p>
|
— laat maar zien —
|
||||||
<button type="button" onclick="kies()">
|
</button>
|
||||||
— kies —
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
54
www/app.js
54
www/app.js
@@ -1,4 +1,5 @@
|
|||||||
var dates
|
var dates
|
||||||
|
var datesNr
|
||||||
|
|
||||||
var parts = [
|
var parts = [
|
||||||
'nieuwe namen',
|
'nieuwe namen',
|
||||||
@@ -156,9 +157,9 @@ async function loadWeken(source, part) {
|
|||||||
tab.classList.add('outer')
|
tab.classList.add('outer')
|
||||||
tr = document.createElement('tr')
|
tr = document.createElement('tr')
|
||||||
|
|
||||||
for (var i = 0; i < 6; i++) {
|
for (var i = datesNr; i < datesNr + 10; i++) {
|
||||||
if (i < dates.length) {
|
if (i < dates.length) {
|
||||||
var week = dates[i]
|
var week = dates[i].week
|
||||||
if (!data.has(week)) {
|
if (!data.has(week)) {
|
||||||
data[week] = await getJSON('DATA-' + week + '-4.json')
|
data[week] = await getJSON('DATA-' + week + '-4.json')
|
||||||
}
|
}
|
||||||
@@ -172,14 +173,51 @@ async function loadWeken(source, part) {
|
|||||||
document.getElementById('data').innerHTML = d.innerHTML
|
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() {
|
async function kies() {
|
||||||
let source = document.forms['choice']['rSource'].value
|
let source = document.forms['choice']['rSource'].value
|
||||||
let part = document.forms['choice']['rPart'].value
|
let part = document.forms['choice']['rPart'].value
|
||||||
|
let date = document.forms['choice']['dDatum'].value
|
||||||
if ((source == 'alles' || source == '') && (part == 'alles' || part == '')) {
|
if ((source == 'alles' || source == '') && (part == 'alles' || part == '')) {
|
||||||
alert('Kies een bron en/of een onderdeel')
|
alert('Kies een bron en/of een onderdeel')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
locateWeek(date)
|
||||||
|
|
||||||
const dd = document.getElementById('data')
|
const dd = document.getElementById('data')
|
||||||
const st = document.getElementById('subtitle')
|
const st = document.getElementById('subtitle')
|
||||||
dd.classList.add('fade')
|
dd.classList.add('fade')
|
||||||
@@ -187,11 +225,11 @@ async function kies() {
|
|||||||
await sleep(20)
|
await sleep(20)
|
||||||
|
|
||||||
if (source == 'alles' || source == '') {
|
if (source == 'alles' || source == '') {
|
||||||
loadPart(part, dates[0])
|
await loadPart(part, dates[datesNr].week)
|
||||||
} else if (part == 'alles' || part == '') {
|
} else if (part == 'alles' || part == '') {
|
||||||
loadSource(source, dates[0])
|
await loadSource(source, dates[datesNr].week)
|
||||||
} else {
|
} else {
|
||||||
loadWeken(source, part)
|
await loadWeken(source, part)
|
||||||
}
|
}
|
||||||
dd.classList.remove('fade')
|
dd.classList.remove('fade')
|
||||||
st.classList.remove('fade')
|
st.classList.remove('fade')
|
||||||
@@ -199,7 +237,11 @@ async function kies() {
|
|||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
dates = await getJSON('index4.json')
|
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()
|
init()
|
||||||
|
|||||||
@@ -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"}]
|
||||||
|
|||||||
@@ -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"}]
|
||||||
|
|||||||
Reference in New Issue
Block a user