Wijzigen voor document Speler voor video's

Laatst gewijzigd door Jeeves de Butler op 09-10-2026 10:34

Van versie 4.1
gewijzigd door Jeeves de Butler
op 06-10-2026 04:09
Opmerking bij wijziging: Er is geen opmerking bij deze versie
Naar versie 11.1
gewijzigd door Jeeves de Butler
op 07-10-2026 09:08
Opmerking bij wijziging: Er is geen opmerking bij deze versie

Samenvatting

Details

Paginaeigenschappen
Inhoud
... ... @@ -17,7 +17,8 @@
17 17   'showcase': "$!o.getValue('vimeo_showcase')",
18 18   'geupload': "$!o.getValue('geupload')",
19 19   'hoofdstukken': "$!o.getValue('hoofdstukken')",
20 - 'gecontroleerd': "$!o.getValue('hoofdstukken_gecontroleerd')"
20 + 'gecontroleerd': "$!o.getValue('hoofdstukken_gecontroleerd')",
21 + 'tekst': "$!o.getValue('tekst')"
21 21   }))
22 22  #end
23 23  #foreach ($c in $collectiontool.sort($clips, 'positie'))
... ... @@ -27,7 +27,9 @@
27 27  {{html clean="false"}}
28 28  <figure class="wb-clip" id="clip-$escapetool.xml($c.nummer)">
29 29  #if ("$!c.bijlage" != '' && $doc.getAttachment($c.bijlage))
30 - <video controls preload="metadata" playsinline src="$doc.getAttachmentURL($c.bijlage)"#if ("$!c.poster" != '' && $doc.getAttachment($c.poster)) poster="$doc.getAttachmentURL($c.poster)"#{end}></video>
31 + ## Subtitles: an attachment <video name>.nl.vtt next to the video, off by default (CC button in the player)
32 + #set ($vtt = $c.bijlage.replaceAll('\.mp4$', '.nl.vtt'))
33 + <video controls preload="metadata" playsinline src="$doc.getAttachmentURL($c.bijlage)"#if ("$!c.poster" != '' && $doc.getAttachment($c.poster)) poster="$doc.getAttachmentURL($c.poster)"#{end}>#if ($vtt != $c.bijlage && $doc.getAttachment($vtt))<track kind="subtitles" srclang="nl" label="Nederlands" src="$doc.getAttachmentURL($vtt)">#{end}</video>
31 31  #else
32 32   <p class="wb-clip-ontbreekt">De video ontbreekt nog op deze pagina.</p>
33 33  #end
... ... @@ -40,13 +40,30 @@
40 40   #foreach ($p in $tc.split(':'))
41 41   #set ($sec = $sec * 60 + $mathtool.toInteger($p))
42 42   #end
43 - #set ($discard = $items.add({'t': $sec, 'tc': $tc, 'label': $line.replaceAll('^\S+\s+', '')}))
46 + #set ($label = $line.replaceAll('^\S+\s+', ''))
47 + ## Optional reference after the label: "mm:ss Label >> Linktekst | adres" (adres: https://... or /...)
48 + #set ($refText = '')
49 + #set ($refUrl = '')
50 + #set ($at = $label.indexOf(' >> '))
51 + #if ($at > 0)
52 + #set ($ref = $label.substring($at + 4).trim())
53 + #set ($label = $label.substring(0, $at).trim())
54 + #set ($bar = $ref.lastIndexOf(' | '))
55 + #if ($bar > 0)
56 + #set ($candidate = $ref.substring($bar + 3).trim())
57 + #if ($candidate.matches('^(https://|/)[^\s"<>]+$'))
58 + #set ($refText = $ref.substring(0, $bar).trim())
59 + #set ($refUrl = $candidate)
60 + #end
61 + #end
62 + #end
63 + #set ($discard = $items.add({'t': $sec, 'tc': $tc, 'label': $label, 'refText': $refText, 'refUrl': $refUrl}))
44 44   #end
45 45  #end
46 46  #if ($items.size() > 0)
47 47   <ol class="wb-hoofdstukken" aria-label="Hoofdstukken">
48 48   #foreach ($i in $items)
49 - <li><button type="button" data-t="$i.t"><span class="wb-t">$escapetool.xml($i.tc)</span><span class="wb-label">$escapetool.xml($i.label)</span></button></li>
69 + <li><button type="button" data-t="$i.t"><span class="wb-t">$escapetool.xml($i.tc)</span><span class="wb-label">$escapetool.xml($i.label)</span></button>#if ("$!i.refUrl" != '')<a class="wb-ref" href="$escapetool.xml($i.refUrl)">$escapetool.xml($i.refText)</a>#{end}</li>
50 50   #end
51 51   </ol>
52 52  #end
... ... @@ -55,6 +55,24 @@
55 55   Bron: Syntess Atrium Zelfstudie#if ("$!c.showcase" != ''), <a href="https://vimeo.com/showcase/$escapetool.url($c.showcase)" target="_blank" rel="noopener">alle clips van deze paragraaf</a>#{end}.
56 56   #if ($items.size() > 0 && "$!c.gecontroleerd" != '1') <span class="wb-clip-let">Hoofdstukken nog niet gecontroleerd.</span>#{end}
57 57   </figcaption>
78 +#if ("$!c.tekst" != '')
79 + ## Transcript (field tekst, one line per sentence as "[mm:ss] text"); the field is searchable in the Kennisbank
80 + <details class="wb-tekst">
81 + <summary>Uitgeschreven tekst</summary>
82 + <p class="wb-tekst-let">Automatisch uitgeschreven uit de gesproken tekst; er kunnen fouten in staan.</p>
83 + <ol>
84 + #foreach ($raw in $c.tekst.split('\r?\n'))
85 + #set ($line = $raw.trim())
86 + #if ($line.matches('^\[\d{1,2}:\d{2}\]\s*.+$'))
87 + #set ($tc = $line.replaceAll('^\[(\d{1,2}:\d{2})\].*$', '$1'))
88 + #set ($parts = $tc.split(':'))
89 + #set ($sec = $mathtool.toInteger($parts[0]) * 60 + $mathtool.toInteger($parts[1]))
90 + <li><button type="button" data-t="$sec">$escapetool.xml($tc)</button> $escapetool.xml($line.replaceAll('^\[\d{1,2}:\d{2}\]\s*', ''))</li>
91 + #end
92 + #end
93 + </ol>
94 + </details>
95 +#end
58 58  </figure>
59 59  {{/html}}
60 60  #end
XWiki.JavaScriptExtension[0]
code
... ... @@ -10,8 +10,18 @@
10 10   fig.setAttribute('data-wb-klaar', '1');
11 11   var video = fig.querySelector('video');
12 12   var buttons = Array.prototype.slice.call(fig.querySelectorAll('.wb-hoofdstukken button'));
13 - if (!video || !buttons.length) return;
13 + if (!video) return;
14 14  
15 + // The times in the transcript jump as well, without highlighting
16 + Array.prototype.forEach.call(fig.querySelectorAll('.wb-tekst button'), function (button) {
17 + button.addEventListener('click', function () {
18 + video.currentTime = Number(button.getAttribute('data-t'));
19 + video.play();
20 + video.scrollIntoView({ block: 'nearest' });
21 + });
22 + });
23 + if (!buttons.length) return;
24 +
15 15   buttons.forEach(function (button) {
16 16   button.addEventListener('click', function () {
17 17   video.currentTime = Number(button.getAttribute('data-t'));
XWiki.StyleSheetExtension[0]
Caching policy
... ... @@ -1,0 +1,1 @@
1 +long
Code
... ... @@ -1,0 +1,81 @@
1 +/* Syntess Atrium leren: player with chapter list (Wardenburg.Code.AtriumClips) */
2 +.wb-clip {
3 + margin: 0.5em 0 2em;
4 + max-width: 960px;
5 +}
6 +.wb-clip video {
7 + display: block;
8 + width: 100%;
9 + aspect-ratio: 16 / 9;
10 + background: #000;
11 + border: 1px solid #ddd;
12 +}
13 +.wb-hoofdstukken {
14 + list-style: none;
15 + margin: 0;
16 + padding: 0;
17 + border: 1px solid #ddd;
18 + border-top: 0;
19 +}
20 +.wb-hoofdstukken li {
21 + margin: 0;
22 + border-top: 1px solid #eee;
23 +}
24 +.wb-hoofdstukken li:first-child {
25 + border-top: 0;
26 +}
27 +.wb-hoofdstukken button {
28 + display: flex;
29 + gap: 0.9em;
30 + width: 100%;
31 + padding: 0.45em 0.75em;
32 + border: 0;
33 + background: #fff;
34 + color: inherit;
35 + font: inherit;
36 + text-align: left;
37 + cursor: pointer;
38 +}
39 +.wb-hoofdstukken button:hover,
40 +.wb-hoofdstukken button:focus-visible {
41 + background: #f6f6f6;
42 +}
43 +.wb-hoofdstukken button.wb-actief {
44 + background: #FFF0DA;
45 + box-shadow: inset 4px 0 0 #FFB447;
46 +}
47 +.wb-hoofdstukken .wb-t {
48 + min-width: 3.2em;
49 + color: #666;
50 + font-variant-numeric: tabular-nums;
51 +}
52 +.wb-hoofdstukken .wb-ref {
53 + display: block;
54 + /* 4.85em of the button text, measured in this smaller font: lines up with the chapter name */
55 + padding: 0 0.75em 0.45em 5.39em;
56 + font-size: 0.9em;
57 +}
58 +.wb-hoofdstukken .wb-ref::before {
59 + content: "Zie";
60 + display: inline-block;
61 + margin-right: 0.3em;
62 + color: #666;
63 +}
64 +.wb-hoofdstukken button.wb-actief + .wb-ref {
65 + background: #FFF0DA;
66 + box-shadow: inset 4px 0 0 #FFB447;
67 +}
68 +.wb-clip figcaption {
69 + margin-top: 0.4em;
70 + color: #666;
71 + font-size: 0.9em;
72 +}
73 +.wb-clip-let {
74 + color: #8a5a00;
75 +}
76 +.wb-clip-ontbreekt {
77 + padding: 1em;
78 + border: 1px dashed #ccc;
79 + color: #666;
80 +}
81 +
Content Type
... ... @@ -1,0 +1,1 @@
1 +CSS
Naam
... ... @@ -1,0 +1,1 @@
1 +Opmaak speler
Inhoud verwerken
... ... @@ -1,0 +1,1 @@
1 +Nee
Gebruik deze uitbreiding
... ... @@ -1,0 +1,1 @@
1 +onDemand
XWiki.XWikiRights[2]
allow
... ... @@ -1,0 +1,1 @@
1 +Sta toe
groups
... ... @@ -1,0 +1,1 @@
1 +XWiki.XWikiAdminGroup
levels
... ... @@ -1,0 +1,1 @@
1 +view,edit,comment,script