diff options
Diffstat (limited to 'templates/page.tmpl')
-rw-r--r-- | templates/page.tmpl | 174 |
1 files changed, 130 insertions, 44 deletions
diff --git a/templates/page.tmpl b/templates/page.tmpl index 14b5ca8a..cc8357d7 100644 --- a/templates/page.tmpl +++ b/templates/page.tmpl @@ -42,7 +42,7 @@ /* SeekToTime - simple script to add video time jump functionality to timestamp links - Copyright (C) 2020 Grant Shangreaux + Copyright (C) 2020-2024 Grant Shangreaux and Sacha Chua This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as @@ -65,9 +65,7 @@ This could be extended to accept hours in the time stamp as well, but currently does not. */ - let mainVideo; - let qnaVideo; // some pages have a questions and answers video - let timestamps; + let timestamps; // expects a string like "mm:ss.mmm" function parseSeconds(timeString) { @@ -76,34 +74,29 @@ }, 0); } - function handleSubtitleClick(event) { - var video = event.target.attributes['data-video'].value; - var start = event.target.attributes['data-start'].value - var videoElem = document.getElementById(video); - if (videoElem) { - videoElem.currentTime = parseSeconds(start); - videoElem.scrollIntoView(); - } - event.preventDefault(); - } + function handleSubtitleClick(event) { + var video = event.target.getAttribute('data-video'); + var start = event.target.getAttribute('data-start'); + const stickyVideo = document.querySelector('.transcript #' + video); + const indexCardVideo = document.querySelector('.vid #' + video); + if (indexCardVideo) { + indexCardVideo.currentTime = parseSeconds(start); + } + if (stickyVideo && window.getComputedStyle(stickyVideo).display == 'block') { + stickyVideo.currentTime = parseSeconds(start); + } else { + indexCardVideo.scrollIntoView(); + } + if (event.preventDefault) { + event.preventDefault(); + } + } window.onload = function initScript() { - mainVideo = document.getElementById("mainVideo"); - qnaVideo = document.getElementById("qnaVideo"); - timestamps = document.getElementsByClassName("time-link"); - var len = timestamps.length; - for (let i = 0; i < len; i++) { - timestamps[i].onclick = function () { - videoType = this.href.split("/").pop(); - video = (videoType == "#mainVideo") ? mainVideo : qnaVideo; - video.currentTime = parseSeconds(this.innerText) - }; - } let subtitles = document.getElementsByClassName('subtitle'); for (let i = 0; i < subtitles.length; i++) { subtitles[i].onclick = handleSubtitleClick; } - } // @license-end </script> @@ -138,10 +131,11 @@ <TMPL_IF HAVE_ACTIONS> <TMPL_IF HTML5><nav class="actions"><TMPL_ELSE><div class="actions"></TMPL_IF> <ul> +<!-- <li><a href="<TMPL_VAR BASEURL>donate/">❤️ Donate</a></li> --> <TMPL_IF EDITURL> <li><a href="<TMPL_VAR EDITURL>" rel="nofollow">Edit</a></li> <TMPL_ELSE> -<li><a href="/edit/">Edit <span class="muted">(how to)</span></a></li> +<li><a href="<TMPL_VAR BASEURL>edit/">Edit <span class="muted">(how to)</span></a></li> </TMPL_IF> <TMPL_IF RECENTCHANGESURL> <li><a href="<TMPL_VAR RECENTCHANGESURL>">Recent Changes</a></li> @@ -294,23 +288,57 @@ Last edited <TMPL_VAR MTIME> <script> // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 - // Copyright (C) 2021 Sacha Chua - if (document.querySelector('.times')) { document.querySelector('.times').prepend('Your local time: ~ ' + (new Date(document.querySelector('.times').getAttribute('start')).toLocaleString()) + ' to ~ ' + (new Date(document.querySelector('.times').getAttribute('end')).toLocaleString()) + "\n"); } + // Copyright (C) 2021, 2022 Sacha Chua + + if (document.querySelector('.times')) { + var dateOptions = {dateStyle: 'short', timeStyle: 'short'}; + var localStart = (new Date(document.querySelector('.times').getAttribute('start'))).toLocaleString([], dateOptions); + var localEnd = (new Date(document.querySelector('.times').getAttribute('end'))).toLocaleString([], dateOptions); + var dateElem = document.createElement('div'); + dateElem.appendChild(document.createTextNode('Your local time: ~ ' + localStart + ' to ~ ' + localEnd)); + document.querySelector('.times').prepend(dateElem); + if (document.querySelector('.times').querySelector('.others')) { + document.querySelector('.times').querySelector('.others').style.display = 'none'; + } + } + if (document.querySelector('.time-overlay')) { + document.querySelectorAll('.time-overlay').forEach(function (o) { + if (o.getAttribute('title')) return; + var dateOptions = {dateStyle: 'short', timeStyle: 'short'}; + var localStart, localEnd; + if (o.getAttribute('start') && o.getAttribute('end')) { + localStart = (new Date(o.getAttribute('start'))).toLocaleString([], dateOptions); + localEnd = (new Date(o.getAttribute('end'))).toLocaleString([], dateOptions); + o.setAttribute('title', 'Your local time: ~ ' + localStart + ' to ~ ' + localEnd); + } else if (o.getAttribute('start')) { + localStart = (new Date(o.getAttribute('start'))).toLocaleString([], dateOptions); + o.setAttribute('title', 'Your local time: ~ ' + localStart); + } + }); + } + if (document.querySelector('a[name=transcript]')) { var transcriptLink = document.createElement('a'); transcriptLink.setAttribute('href', '#transcript'); transcriptLink.textContent = 'View transcript'; -var video = document.querySelector('.mainVideo video'); -if (video) { - var resources = document.querySelector('.mainVideo video').closest('.vid').querySelector('.resources'); - var transcriptDiv = document.createElement('div'); -transcriptDiv.appendChild(transcriptLink) - if (resources) { resources.prepend(transcriptDiv); } - } -} - if (document.querySelector('.chat-iframe')) { - document.querySelector('.chat-iframe').innerHTML = '<iframe src="https://chat.emacsconf.org" height="600" width="100%"></iframe>'; -} + var video = document.querySelector('.mainVideo video'); + if (video) { + var resources = document.querySelector('.mainVideo video').closest('.vid').querySelector('.resources'); + var transcriptDiv = document.createElement('div'); + transcriptDiv.appendChild(transcriptLink) + if (resources) { resources.prepend(transcriptDiv); } + } + } + var chat = document.querySelector('.chat-iframe'); + if (chat) { + if (chat.getAttribute('data-track')) { + chat.innerHTML = '<iframe src="https://chat.emacsconf.org?join=emacsconf,emacsconf-' + + chat.getAttribute('data-track').replace(/[^A-Za-z]/g, '') + '" height="600" width="100%"></iframe>'; + } else { + chat.innerHTML = '<iframe src="https://chat.emacsconf.org" height="600" width="100%"></iframe>'; + } + } + // @license-end </script> <script> @@ -330,7 +358,7 @@ transcriptDiv.appendChild(transcriptLink) track.mode = 'hidden'; } var chapters = elem.textContent.split(/[ \t]*\n+[ \t]*/).forEach(function(line) { - var m = (line.match(/^(([0-9]+:)?[0-9]+:[0-9]+)[ \t]+(.*)/)); + var m = (line.match(/^(((?:[0-9]+:)?[0-9]+:[0-9]+)(?:\.[0-9]+))[ \t]+(.*)/)); if (m) { var start = m[1]; var text = m[3]; @@ -340,7 +368,7 @@ transcriptDiv.appendChild(transcriptLink) link.setAttribute('data-video', target); link.setAttribute('data-start', start); link.setAttribute('data-start-s', parseSeconds(start)); - link.appendChild(document.createTextNode(m[1] + ' ' + text)); + link.appendChild(document.createTextNode(m[2] + ' ' + text)); link.onclick = handleSubtitleClick; chapter.appendChild(link); list.appendChild(chapter); @@ -370,9 +398,67 @@ transcriptDiv.appendChild(transcriptLink) } elem.parentNode.replaceChild(list, elem); } - - document.querySelectorAll('pre.chapters').forEach(displayChapters); + document.querySelectorAll('pre.chapters').forEach(displayChapters); + + var video = document.querySelector('video.reload'); + if (video) { + var myVar = setInterval(reloadAsNeeded, 1000); + var oldTime = ''; + function reloadAsNeeded() { + if ((video.paused != true && (video.currentTime - oldTime) == 0 && video.currentTime != 0)) { + var source = video.querySelector('source'); + var oldVideo = source.src; + source.src = ''; + source.src = oldVideo; + video.load(); + video.play(); + } + oldTime = video.currentTime; + }; + } + + /* videoType: mainVideo, qanda */ + function addStickyVideo(videoType) { + const transcriptDiv = document.querySelector('.transcript-' + videoType); + const video = document.querySelector('.vid.' + videoType + ' video'); + if (!video || !transcriptDiv) return; + if (transcriptDiv.querySelector('.vid')) + transcriptDiv.querySelector('.vid').remove(); + // already has it + // TODO: Make a copy of the video and place it at the start of the transcript div, positioned to the left, and sticky, but only on large screens. + const videoCopy = video.cloneNode(true); + transcriptDiv.prepend(videoCopy); + videoCopy.classList.add('sticky-video'); + // TODO: fix the ID + + } + + + + // @license-end + // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 + // Copyright (c) 2023 Sacha Chua - CC0 Public Domain + function highlightTalks() { + // highlight any talk mentioned in the highlight URL parameter + var params = new URLSearchParams(window.location.search); + if (!params.get('highlight')) return; + var talks = params.get('highlight').split(',').filter(function(o) { return o.match(/^[-a-z0-9]+$/); }); + var regexp = new RegExp('/talks/(' + talks.join('|') + ')/?$'); + document.querySelectorAll('a[href]').forEach(function(link) { + console.debug(link.getAttribute('href'), link.getAttribute('href').match(regexp)); + if (link.getAttribute('href').match(regexp)) { + console.debug(link); + link.classList.add('highlight'); + } + }); + } + + addEventListener('DOMContentLoaded', highlightTalks); + addEventListener('DOMContentLoaded', function() { + addStickyVideo('mainVideo'); + addStickyVideo('qanda'); + }); // @license-end </script> </body> |