summaryrefslogblamecommitdiffstats
path: root/templates/page.tmpl
blob: b0cafcd0fc0d78157f8de5113c261af8217309b1 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                                                                                                                                                   
                                                                                     




























                                                                                                           
        
                                                                                                            
    
 

                                                                                    
 



                                                                      
 














                                                                                           
    
                
                                                                
                 
 
                                      
                                     

                                                           
          

   
                                         
















                                                                         
                                   
       






                                                                
   
                 
         
       
                                                     


                                                                            
                                                                                                        




                                                                                        
                                             




















                                                                              

                                                                      

                          
                                                                 















































                                                                                      
                                                    
 

                   







                                                                                











































                                                                                                  
          
























                                                
                  














                                                     

        

                                                                                                 
                                                                                                                                                                                                                                                                                                         



                                                       


                                                                                                           



                                                        
 


                                                                                                                                      

                 




                                                                                                
























                                                                                                             
                                                                                                                        









                                                                                                        


                                                                                                 

                

       
<!DOCTYPE html>
<TMPL_IF HTML_LANG_CODE><html lang="<TMPL_VAR HTML_LANG_CODE>" dir="<TMPL_VAR HTML_LANG_DIR>" xmlns="http://www.w3.org/1999/xhtml"><TMPL_ELSE><html xmlns="http://www.w3.org/1999/xhtml"></TMPL_IF>
<head>
<TMPL_IF DYNAMIC>
<TMPL_IF FORCEBASEURL><base href="<TMPL_VAR FORCEBASEURL>" /><TMPL_ELSE>
<TMPL_IF BASEURL><base href="<TMPL_VAR BASEURL>" /></TMPL_IF>
</TMPL_IF>
</TMPL_IF>
<TMPL_IF HTML5><meta charset="utf-8" /><TMPL_ELSE><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></TMPL_IF>
<title><TMPL_LOOP PARENTLINKS><TMPL_VAR PAGE> - </TMPL_LOOP> <TMPL_VAR TITLE></title>
<TMPL_IF RESPONSIVE_LAYOUT><meta name="viewport" content="width=device-width, initial-scale=1" /></TMPL_IF>
<TMPL_IF FAVICON>
<link rel="icon" href="<TMPL_VAR BASEURL><TMPL_VAR FAVICON>" type="image/x-icon" />
</TMPL_IF>
<link rel="stylesheet" href="<TMPL_VAR BASEURL>style.css" type="text/css" />
<TMPL_IF LOCAL_CSS>
<link rel="stylesheet" href="<TMPL_VAR BASEURL><TMPL_VAR LOCAL_CSS>" type="text/css" />
<TMPL_ELSE>
<link rel="stylesheet" href="<TMPL_VAR BASEURL>local.css" type="text/css" />
</TMPL_IF>

<TMPL_UNLESS DYNAMIC>
<TMPL_IF EDITURL>
<link rel="alternate" type="application/x-wiki" title="Edit this page" href="<TMPL_VAR EDITURL>" />
</TMPL_IF>
<TMPL_IF FEEDLINKS><TMPL_VAR FEEDLINKS></TMPL_IF>
<TMPL_IF RELVCS><TMPL_VAR RELVCS></TMPL_IF>
<TMPL_IF META><TMPL_VAR META></TMPL_IF>
<TMPL_LOOP TRAILLOOP>
<TMPL_IF PREVPAGE>
<link rel="prev" href="<TMPL_VAR PREVURL>" title="<TMPL_VAR PREVTITLE>" />
</TMPL_IF>
<link rel="up" href="<TMPL_VAR TRAILURL>" title="<TMPL_VAR TRAILTITLE>" />
<TMPL_IF NEXTPAGE>
<link rel="next" href="<TMPL_VAR NEXTURL>" title="<TMPL_VAR NEXTTITLE>" />
</TMPL_IF>
</TMPL_LOOP>
</TMPL_UNLESS>

<script>
  // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later
  /*

  SeekToTime - simple script to add video time jump functionality to timestamp links
  Copyright (C) 2020  Grant Shangreaux

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as
  published by the Free Software Foundation, either version 3 of the
  License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.

  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <https://www.gnu.org/licenses/>.

  This script enables wiki editors to create anchor tags with the class "time-link"
  that will be parsed for seeking to specific time stamps in the main video on a page.
  The tag should look like this:

   <a href="#mainVideo" class="time-link">mm:ss</a>

  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;

  // expects a string like "mm:ss.mmm"
  function parseSeconds(timeString) {
    return timeString.split(":").reduce(function(prev, o) {
      return prev * 60 + parseFloat(o);
    }, 0);
  }

  window.onload = function initScript() {
    mainVideo = document.getElementById("mainVideo");
    qnaVideo = document.getElementById("qnaVideo");
    timestamps = document.getElementsByClassName("time-link");
    let len = timestamps.length;
    for (let i = 0; i < len; i++) {
      timestamps[i].onclick = function () {
        const videoType = this.href.split("/").pop();
        const video = (videoType == "#mainVideo") ? mainVideo : qnaVideo;
        video.currentTime = parseSeconds(this.innerText)
      };
    }
    let handleSubtitleClick = function(event) {
      let video = event.target.attributes['data-video'].value;
      let start = event.target.attributes['data-start'].value
      let videoElem = document.getElementById(video);
      if (videoElem) {
        videoElem.currentTime = parseSeconds(start);
        videoElem.scrollIntoView();
      }
    }

    let subtitles = document.getElementsByClassName('subtitle');
    for (let i = 0; i < subtitles.length; i++) {
      subtitles[i].onclick = handleSubtitleClick;
    }

  }
  // @license-end
</script>
</head>
<body <TMPL_IF SIDEBAR>class="has-sidebar"</TMPL_IF>>

<TMPL_IF HTML5><article class="page"><TMPL_ELSE><div class="page"></TMPL_IF>

<TMPL_IF HTML5><section class="pageheader-wrapper"><TMPL_ELSE><div class="pageheader-wrapper"></TMPL_IF>
<TMPL_IF HTML5><section class="pageheader"><TMPL_ELSE><div class="pageheader"></TMPL_IF>
<TMPL_IF HTML5><header class="header"><TMPL_ELSE><div class="header"></TMPL_IF>
<span>
<span class="parentlinks">
<TMPL_LOOP PARENTLINKS>
<a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>/
</TMPL_LOOP>
</span>
<span class="title">
<TMPL_VAR TITLE>
<TMPL_IF ISTRANSLATION>
&nbsp;(<TMPL_VAR PERCENTTRANSLATED>%)
</TMPL_IF>
</span>
</span>
<TMPL_UNLESS DYNAMIC>
<TMPL_IF SEARCHFORM>
<TMPL_VAR SEARCHFORM>
</TMPL_IF>
</TMPL_UNLESS>
<TMPL_IF HTML5></header><TMPL_ELSE></div></TMPL_IF>

<TMPL_IF HAVE_ACTIONS>
<TMPL_IF HTML5><nav class="actions"><TMPL_ELSE><div class="actions"></TMPL_IF>
<ul>
<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>
</TMPL_IF>
<TMPL_IF RECENTCHANGESURL>
<li><a href="<TMPL_VAR RECENTCHANGESURL>">Recent Changes</a></li>
</TMPL_IF>
<TMPL_IF HISTORYURL>
<li><a rel="nofollow" href="<TMPL_VAR HISTORYURL>">History</a></li>
</TMPL_IF>
<TMPL_IF GETSOURCEURL>
<li><a rel="nofollow" href="<TMPL_VAR GETSOURCEURL>">Source</a></li>
</TMPL_IF>
<TMPL_IF PREFSURL>
<li><a rel="nofollow" href="<TMPL_VAR PREFSURL>">Preferences</a></li>
</TMPL_IF>
<TMPL_IF ACTIONS>
<TMPL_LOOP ACTIONS>
<li><TMPL_VAR ACTION></li>
</TMPL_LOOP>
</TMPL_IF>
<TMPL_IF COMMENTSLINK>
<li><TMPL_VAR COMMENTSLINK></li>
<TMPL_ELSE>
<TMPL_IF DISCUSSIONLINK>
<li><TMPL_VAR DISCUSSIONLINK></li>
</TMPL_IF>
</TMPL_IF>
</ul>
<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>

<TMPL_IF OTHERLANGUAGES>
<TMPL_IF HTML5><nav id="otherlanguages"><TMPL_ELSE><div id="otherlanguages"></TMPL_IF>
<ul>
<TMPL_LOOP OTHERLANGUAGES>
<li>
<a href="<TMPL_VAR URL>"><TMPL_VAR LANGUAGE></a>
<TMPL_IF MASTER>
(master)
<TMPL_ELSE>
&nbsp;(<TMPL_VAR PERCENT>%)
</TMPL_IF>
</li>
</TMPL_LOOP>
</ul>
<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>

<TMPL_UNLESS DYNAMIC>
<TMPL_VAR TRAILS>
</TMPL_UNLESS>

<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>

<div id="pagebody">

<TMPL_UNLESS DYNAMIC>
<TMPL_IF SIDEBAR>
<TMPL_IF HTML5><aside class="sidebar"><TMPL_ELSE><div class="sidebar"></TMPL_IF>
<TMPL_VAR SIDEBAR>
<TMPL_IF HTML5></aside><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>
</TMPL_UNLESS>

<TMPL_IF HTML5><section<TMPL_ELSE><div</TMPL_IF> id="content" role="main">
<TMPL_VAR CONTENT>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>

<TMPL_IF ENCLOSURE>
<TMPL_IF HTML5><section id="enclosure"><TMPL_ELSE><div id="enclosure"></TMPL_IF>
<a href="<TMPL_VAR ENCLOSURE>">Download</a>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>

<TMPL_UNLESS DYNAMIC>
<TMPL_IF COMMENTS>
<TMPL_IF HTML5><section<TMPL_ELSE><div</TMPL_IF> id="comments" role="complementary">
<TMPL_VAR COMMENTS>
<TMPL_IF ADDCOMMENTURL>
<div class="addcomment">
<a rel="nofollow" href="<TMPL_VAR ADDCOMMENTURL>">Add a comment</a>
</div>
<TMPL_ELSE>
<div class="addcomment">Comments on this page are closed.</div>
</TMPL_IF>
<TMPL_IF HTML5></section><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>
</TMPL_UNLESS>

</div>

<TMPL_IF HTML5><footer<TMPL_ELSE><div</TMPL_IF> id="footer" class="pagefooter" role="contentinfo">
<TMPL_UNLESS DYNAMIC>
<TMPL_IF HTML5><nav id="pageinfo"><TMPL_ELSE><div id="pageinfo"></TMPL_IF>

<TMPL_VAR TRAILS>

<TMPL_IF TAGS>
<TMPL_IF HTML5><nav class="tags"><TMPL_ELSE><div class="tags"></TMPL_IF>
Tags:
<TMPL_LOOP TAGS>
<TMPL_VAR LINK>
</TMPL_LOOP>
<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>

<TMPL_IF BACKLINKS>
<TMPL_IF HTML5><nav id="backlinks"><TMPL_ELSE><div id="backlinks"></TMPL_IF>
Backlinks:
<TMPL_LOOP BACKLINKS>
<a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>
</TMPL_LOOP>
<TMPL_IF MORE_BACKLINKS>
<span class="popup">...
<span class="balloon">
<TMPL_LOOP MORE_BACKLINKS>
<a href="<TMPL_VAR URL>"><TMPL_VAR PAGE></a>
</TMPL_LOOP>
</span>
</span>
</TMPL_IF>
<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
</TMPL_IF>

<TMPL_IF COPYRIGHT>
<div class="pagecopyright">
<a name="pagecopyright"></a>
<TMPL_VAR COPYRIGHT>
</div>
</TMPL_IF>

<TMPL_IF LICENSE>
<div class="pagelicense">
<a name="pagelicense"></a>
<TMPL_VAR LICENSE>
</div>
</TMPL_IF>

<div class="pagedate">
Last edited <TMPL_VAR MTIME>
<!-- Created <TMPL_VAR CTIME> -->
</div>

<TMPL_IF HTML5></nav><TMPL_ELSE></div></TMPL_IF>
<TMPL_IF EXTRAFOOTER><TMPL_VAR EXTRAFOOTER></TMPL_IF>
</TMPL_UNLESS>
<!-- from <TMPL_VAR WIKINAME> -->
<TMPL_IF HTML5></footer><TMPL_ELSE></div></TMPL_IF>

<TMPL_IF HTML5></article><TMPL_ELSE></div></TMPL_IF>

<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"); }
  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>';
}
  // @license-end
</script>
<script>
 // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0
 // Copyright (c) 2021 Sacha Chua
 // Based on http://thenewcode.com/977/Create-Interactive-HTML5-Video-with-WebVTT-Chapters
 function displayChapters(trackElement){
   if ((trackElement) && (textTrack = trackElement.track)){
     if (textTrack.kind === "chapters"){
       textTrack.mode = 'hidden';
       var video = trackElement.closest('video');
       var chapterList = trackElement.closest('.video-card').querySelector('ol');
       for (var i = 0; i < textTrack.cues.length; ++i) {
         cue = textTrack.cues[i],
         chapterName = cue.text,
         start = cue.startTime,
         chapter = document.createElement("li");
         chapter.setAttribute('data-start', start);
         date = new Date(0);
         date.setSeconds(cue.startTime);
         var chapterDescription = document.createTextNode(date.toISOString().substr(14, 5) + ' ' + cue.text);
         chapter.appendChild(chapterDescription);
         //locationList.insertBefore(newLocale);
         chapter.addEventListener("click",
                                  function() {
                                    video.currentTime = this.getAttribute('data-start');
                                  },false);
         chapterList.append(chapter);
       }
       textTrack.addEventListener("cuechange",
                                  function() {
                                    var currentLocation = this.activeCues[0].startTime;
                                    if (chapter = chapterList.querySelector('data-start=["' + currentLocation + '"]')) {
                                      var locations = [].slice.call(chapterList.querySelectorAll("li"));
                                      for (var i = 0; i < locations.length; ++i) { 
                                        locations[i].classList.remove("current");
                                      }
                                      chapter.classList.add("current");
                                    }
                                  },false);
     }
   }
 }
document.addEventListener('DOMContentLoaded', function() {
  document.querySelectorAll('track[kind=chapters]').forEach(function(e) { displayChapters(e); });
}, false);
 // @license-end
</script>
</body>
</html>