[S5-discuss] Some S5 patches

ryan king ryan at theryanking.com
Mon Nov 13 11:27:21 CST 2006


Sorry, business + accidentally deleting a bunch of email.

-ryan

On Nov 13, 2006, at 2:29 AM, Stefan Rank wrote:

> bump.
>
> (wow, no response in more than a month.
>  either everybody is very busy,
>  or the patches are just too scary ;-)
>
> on 03.10.2006 14:52 Stefan Rank said the following:
>> Hi there sleepy list,
>> I recently did a docutils-rst --> S5 presentation,
>> and wanted to use the most recent version from s5project.org  
>> (silly me :)
>> So attached are some of the changes I made / had to make.
>> The file uses a darcs changes format.
>> I tried to separate the changes into meaningful patches, see the  
>> descriptions below. If applying them is difficult, I can resend a  
>> simple diff-patch (all mixed in one).
>> Patches:
>>   * moving MochiKit into the default skin
>>     I thought this makes more sense than having a top-level ./lib/  
>> dir.
>>     (I also think that, for sharing stuff between skins, the shared
>>      files, such as MochiKit.js should be in default, or at least in
>>      ./ui/ )
>>   * missing bg-shade.png
>>   * small function for opening in a new window
>>     useful for example in Firefox. put something like:
>>     <a class="reference" href="javascript:openInUnadornedWindow 
>> ()">████</a>
>>     on your first slide, and you can open a new window without  
>> toolbar
>>     or statusbar with a click.
>>   * always use var
>>   * missing clear:left's and handout class in notes.css
>>     this keeps handout material from the slides in the notes window.
>>     mixed with fixing some layout problems.
>>   * notes window can be a little bit more compact
>>     (that's a matter of taste;, but I wanted to see more of the  
>> notes)
>>   * make the times in the notes window line up
>>   * another useful debugging aid
>>   * missing thises
>>     a lot of 'this.' were missing in slides.js.
>>   * bugs in keys method
>>     update the onkeyup handler to really use mochikit, et al..
>>   * slight change to delayed note loading
>>     busy-waiting forever is not funny, so i simplified the delaying.
>>   * commenting log message
>>   * hide currentslide indicator AND footer on first slide
>>     I think hiding the footer on the first slide was in the  
>> original s5
>>   * update leftclick handling
>>     ... to use MochiKt events
>>   * some comment updates
>>   * arbitrary slideIDs (docutils), special case last slide on  
>> notes, hide footer on slide0
>>     this is the biggest patch. it allows arbitrary ids on the
>>     class="slide" tags, not just the generated "slide1"..."slideN".
>>     the docutils rst2s5.py generator needs that, because it uses the
>>     slide title as id. The patch also simplifies some things.
>>     also: special case bug for the last slide in the notes window.
>> cheers,
>> stefan
>> --------------------------------------------------------------------- 
>> ---
>> New patches:
>> [moving MochiKit into the default skin
>> stefan.rank at ofai.at**20061002154230] <
>>> {
>> move ./lib/MochiKit.js ./ui/default/MochiKit.js
>> hunk ./index.html 32
>>    img#me05 {top: 43px;left: 36px;}
>>  </style>
>>  <!-- S5 JS -->
>> -<script src="lib/MochiKit.js" type="text/javascript"></script>
>> +<script src="ui/default/MochiKit.js" type="text/javascript"></ 
>> script>
>>  <script src="ui/default/slides.js" type="text/javascript"></script>
>>  </head>
>>  <body>
>> hunk ./ui/s5-notes.html 8
>>  <head>
>>  <title>Notes</title>
>>  <link rel="stylesheet" href="default/notes.css" type="text/css" />
>> -<script src="../lib/MochiKit.js" type="text/javascript"></script>
>> +<script src="default/MochiKit.js" type="text/javascript"></script>
>>  <script type="text/javascript">
>>  // <![CDATA[
>>    connect(document, 'onkeyup', opener.s, 'keys');
>> }
>> [missing bg-shade.png
>> stefan.rank at ofai.at**20061002175704] <
>>> {
>> addfile ./pix/bg-shade.png
>> hunk ./index.html 134
>>  <h1>PNG Alpha Tests</h1>
>>  <div style="width: 400px; height: 150px; text-align: center;  
>> background: url(pix/bg-shade.png)">
>>  <p>DIV with PNG background followed by foreground PNG</p>
>> -<img src="ui/bg-shade.png" alt="" title="A translucent image" />
>> +<img src="pix/bg-shade.png" alt="" title="A translucent image" />
>>  </div>
>>  <div style="width: 100%; height: 150px; text-align: center;  
>> background: url(pix/bg-shade.png)">
>>  <p>DIV with PNG background followed by foreground PNG</p>
>> hunk ./index.html 138
>> -<img src="ui/bg-shade.png" alt="" title="A translucent image" />
>> +<img src="pix/bg-shade.png" alt="" title="A translucent image" />
>>  </div>
>>  </li>
>>  binary ./pix/bg-shade.png
>> oldhex
>> *
>> newhex
>> *89504e470d0a1a0a0000000d49484452000000c8000000c80806000000ad58ae9e00 
>> 0002194944
>> *4154789cedd3b111802000c04064171a7be7737516e0d26af13f419a5ceb7ede011c 
>> cdaf03e0cf
>> *0c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120 
>> 100c02c120
>> *100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c1 
>> 20100c02c1
>> *20100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02 
>> c120100c02
>> *c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c 
>> 02c120100c
>> *02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c12010 
>> 0c02c12010
>> *0c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120 
>> 100c02c120
>> *100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c1 
>> 20100c02c1
>> *20100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02 
>> c120100c02
>> *c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c 
>> 02c120100c
>> *02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c12010 
>> 0c02c12010
>> *0c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120 
>> 100c02c120
>> *100c02c120100c02c120100c02c120100c02c120100c02c120100c02c120100c02c1 
>> 20100c02c1
>> *20100c02c120100c02c120100c02c120100c02c120100c02c1201036b2280293a867 
>> 9474000000
>> *0049454e44ae426082
>> }
>> [small function for opening in a new window
>> stefan.rank at ofai.at**20061002182704] <
>>> {
>> hunk ./ui/default/slides.js 5
>>  //
>>  // Please see http://www.meyerweb.com/eric/tools/s5/credits.html  
>> for information
>>  // about all the wonderful and talented contributors to this code!
>> +
>> +// StefanRank: a simple function for opening in a new nearly  
>> empty window:
>> +function openInUnadornedWindow() {
>> +  window.open(window.location, "newPresentationWindow",  
>> 'toolbar=no,menubar=no');
>> +  return void(0);
>> +}
>> +
>>  var undef;
>>   var S5 = function() {
>> }
>> [always use var
>> stefan.rank at ofai.at**20061002184042] <
>>> {
>> hunk ./ui/default/slides.js 14
>>   var undef;
>>  -var S5 = function() {
>> +S5 = function() {
>>    this.slides;
>>    this.slideCSS = '';
>>    this.snum = 0;
>> }
>> [missing clear:left's and handout class in notes.css
>> stefan.rank at ofai.at**20061003082701] <
>>> {
>> hunk ./ui/default/notes.css 23
>>  }
>>   #current-slide {
>> +  clear:left;
>>  }
>>   #next-slide {
>> hunk ./ui/default/notes.css 69
>>    color:red;
>>  }
>>  -.slide .notes {
>> +.slide .notes, .slide .handout {
>>   display:none;
>>   float:none;
>>  }
>> hunk ./ui/default/notes.css 167
>>  }
>>   div#elapsed {
>> +  clear: left;
>>    width: 12.1em;
>>  }
>>  }
>> [notes window can be a little bit more compact
>> stefan.rank at ofai.at**20061003082750] <
>>> {
>> hunk ./ui/default/notes.css 5
>>   body {
>>    margin: 0;
>> -  padding: 1.0em;
>> +  padding: 0.5em;
>>    background: #333;    color: #FFF;
>>    font: 2em/1.4em 'Lucida Grande', Verdana, sans-serif;
>> hunk ./ui/default/notes.css 14
>>  /*slide preview styles*/
>>   .slide {
>> - font-size:50%;
>> + font-size:40%;
>>   border:1px solid black;
>>   padding-left:1em;
>>   float:left;
>> hunk ./ui/default/notes.css 22
>>   height:40%;
>>  }
>>  +.slide ul, .slide ol, .slide pre, .slide p, .slide, .slide  
>> dl, .slide dt, .slide dd {
>> +  margin: 0; line-height: 1.9em;
>> +}
>> +
>>  #current-slide {
>>    clear:left;
>>  }
>> hunk ./ui/default/notes.css 44
>>  #current-notes,
>>  #next-notes {
>>    font-size: 0.75em;
>> -  line-height: 1.4em;
>> +  line-height: 1.3em;
>>    text-shadow: 0.1em 0.1em 0.1em #111;
>>  }
>>  hunk ./ui/default/notes.css 90
>>   div.timer h1 {
>>    text-align: left;
>> -  font-size: 0.6em;
>> -  line-height: 1.4em;
>> +  font-size: 0.4em;
>> +  line-height: 1.2em;
>>    background-color: #FF9;
>>    border: 1px solid #EE8;
>>  }
>> hunk ./ui/default/notes.css 97
>>   div.timer div.controls {
>> -  line-height: 1em;
>> +  line-height: 0.9em;
>>  }
>>   div.timer h1 a {
>> hunk ./ui/default/notes.css 106
>>  }
>>   div.timer div.controls a {
>> -  font-size: 0.5em;
>> +  font-size: 0.4em;
>>    padding: 0;
>>    color: #330;
>>  }
>> hunk ./ui/default/notes.css 135
>>  }
>>   div.timer h2 {
>> -  font-size: 0.6em;
>> -  line-height: 1.0em;
>> +  font-size: 0.4em;
>> +  line-height: 0.8em;
>>    font-weight: normal;
>>    margin: 0 0 -0.25em;
>> hunk ./ui/default/notes.css 139
>> -  padding-top: 0.5em;
>> +  padding-top: 0.3em;
>>    color: #666;
>>  }
>>  }
>> [make the times in the notes window line up
>> stefan.rank at ofai.at**20061003083017] <
>>> {
>> hunk ./ui/s5-notes.html 65
>>      <h1>
>>        <a href="#minimize-remaining" id="minimize-remaining"  
>> title="Minimize this box">Remaining Time</a>
>>      </h1>
>> +    <h2>&nbsp;</h2>
>>      <p>
>>        <a href="#subtract-remaining" class="control" id="minus"  
>> title="Subtract 5 Minutes">-</a>
>>        <span class="clock" id="timeLeft">00:00:00</span>
>> }
>> [another useful debugging aid
>> stefan.rank at ofai.at**20061003083105] <
>>> {
>> hunk ./ui/default/pretty.css 263
>>  /* diagnostics
>>   li:after {content: " [" attr(class) "]"; color: #F88;}
>> +div:before {content: "[" attr(class) "]"; color: #F88;}
>>   */
>> hunk ./ui/default/pretty.css 265
>> +
>> }
>> [missing thises
>> stefan.rank at ofai.at**20061003090315] <
>>> {
>> hunk ./ui/default/slides.js 64
>>    if (node.nodeType == 1) { //TODO: lookup these node types,  
>> eliminate the magic numbers
>>      var children = node.childNodes;
>>      for (var i = 0, l = children.length; i < l; i++) {
>> -      result += nodeValue(children[i]);
>> +      result += this.nodeValue(children[i]);
>>      }
>>    } else if (node.nodeType == 3) {
>>      result = node.nodeValue;
>> hunk ./ui/default/slides.js 604
>>    }
>>    this.resetElapsedSlide(); // TODO: odd place for these,  
>> probably need to be refactored out
>>    this.resetRemainingTime();
>> -  window.setInterval('S5.prototype.updateElaspedTime()', 1000);
>> +  window.setInterval('window.s.updateElaspedTime()', 1000);
>>  }
>>   S5.prototype.createNotesWindow = function() { hunk ./ui/default/ 
>> slides.js 665
>>   S5.prototype.resetElapsedTime = function() {
>>    this.presentationStart = new Date();
>> -  slideStart = new Date();
>> -  updateElaspedTime();
>> +  this.slideStart = new Date();
>> +  this.updateElapsedTime();
>>  }
>>   S5.prototype.resetElapsedSlide = function() {
>> hunk ./ui/default/slides.js 689
>>  S5.prototype.resetRemainingTime = function() {
>>    if (!this.s5NotesWindowLoaded || !this.s5NotesWindow ||  
>> this.s5NotesWindow.closed) return;
>>    var startField = this.s5NotesWindow.document.getElementById 
>> ('startFrom');
>> -  var startFrom = readTime(startField.value);
>> +  var startFrom = this.readTime(startField.value);
>>    this.countdown.remaining = startFrom * 60000;  // convert to msecs
>>    this.countdown.start = new Date().valueOf();
>>    this.countdown.end = this.countdown.start +  
>> this.countdown.remaining;
>> hunk ./ui/default/slides.js 694
>>    var tl = this.s5NotesWindow.document.getElementById('timeLeft');
>> -  var timeLeft = this.formatTime(countdown.remaining);
>> +  var timeLeft = this.formatTime(this.countdown.remaining);
>>    tl.innerHTML = timeLeft;
>>  }
>>  hunk ./ui/default/slides.js 702
>>    if (!this.s5NotesWindowLoaded || !this.s5NotesWindow ||  
>> this.s5NotesWindow.closed) return;
>>    var tl = this.s5NotesWindow.document.getElementById('timeLeft');
>>    var now = new Date();
>> -  if (countdown.state == 'run') {
>> -    countdown.remaining = countdown.end - now;
>> +  if (this.countdown.state == 'run') {
>> +    this.countdown.remaining = this.countdown.end - now;
>>    }
>>    tl.style.color = '';
>>    tl.style.backgroundColor = '';
>> hunk ./ui/default/slides.js 707
>> -  if (countdown.remaining >= 0) {
>> -    var timeLeft = this.formatTime(countdown.remaining);
>> +  if (this.countdown.remaining >= 0) {
>> +    var timeLeft = this.formatTime(this.countdown.remaining);
>>      removeElementClass(tl,'overtime');
>> hunk ./ui/default/slides.js 710
>> -    if (countdown.remaining < 300000) {
>> -      tl.style.color = 'rgb(' + (255-Math.round 
>> (countdown.remaining/2000)) + ',0,0)';
>> -      tl.style.backgroundColor = 'rgb(255,255,' + (Math.round 
>> (countdown.remaining/2000)) + ')';
>> +    if (this.countdown.remaining < 300000) {
>> +      tl.style.color = 'rgb(' + (255-Math.round 
>> (this.countdown.remaining/2000)) + ',0,0)';
>> +      tl.style.backgroundColor = 'rgb(255,255,' + (Math.round 
>> (this.countdown.remaining/2000)) + ')';
>>      }
>>    } else {
>> hunk ./ui/default/slides.js 715
>> -    var timeLeft = '-' + this.formatTime(-countdown.remaining);
>> +    var timeLeft = '-' + this.formatTime(-this.countdown.remaining);
>>      addElementClass(tl,'overtime');
>>    }
>>    tl.innerHTML = timeLeft;
>> hunk ./ui/default/slides.js 722
>>  }
>>   S5.prototype.toggleRemainingTime = function() {
>> -  if (countdown.state == 'pause') countdown.state = 'run'; else  
>> countdown.state = 'pause';
>> -  if (countdown.state == 'pause') {
>> -    window.clearInterval(countdown.timer);
>> -  }
>> -  if (countdown.state == 'run') {
>> -    countdown.start = new Date().valueOf();
>> -    countdown.end = countdown.start + countdown.remaining;
>> -    countdown.timer = window.setInterval('updateRemainingTime()',  
>> 1000);
>> +  if (this.countdown.state == 'pause') {
>> +    this.countdown.state = 'run';
>> +    this.countdown.start = new Date().valueOf();
>> +    this.countdown.end = this.countdown.start +  
>> this.countdown.remaining;
>> +    this.countdown.timer = window.setInterval 
>> ('window.s.updateRemainingTime()', 1000);
>> +  } else {
>> +    this.countdown.state = 'pause';
>> +    window.clearInterval(this.countdown.timer);
>>    }
>>  }
>>  hunk ./ui/default/slides.js 736
>>  S5.prototype.alterRemainingTime = function(amt) {
>>    //takes an integer, `amt` and then updates the remaining time  
>> in the other window
>>    var change = amt * 60000;  // convert to msecs
>> -  countdown.end += change;
>> -  countdown.remaining += change;
>> -  updateRemainingTime();
>> +  this.countdown.end += change;
>> +  this.countdown.remaining += change;
>> +  this.updateRemainingTime();
>>  }
>>   S5.prototype.formatTime = function(msecs) {
>> hunk ./ui/default/slides.js 799
>>    if (!this.isOp) this.notOperaFix();
>>    this.slideJump();
>>    if (this.defaultView == 'outline') {
>> -    toggle();
>> +    this.toggle();
>>    }
>>    connect(document, 'onkeyup', this, 'keys');
>>    connect(document, 'onkeypress', this, 'trap');
>> }
>> [bugs in keys method
>> stefan.rank at ofai.at**20061003104010] <
>>> {
>> hunk ./ui/default/slides.js 248
>>  //TODO: reseach mozpoint
>>  S5.prototype.keys = function(e) {
>>    //handles keypresses
>> -  //TODO: could this be cleaned up?
>> -  key = e.key()
>> -  if (!key) {
>> -    key = event;
>> -    key.which = key.keyCode;
>> -  }
>> -  if (key.which == 84) {
>> +  var key = e.key(); // MochiKit key event: {code, string}
>> +  if (key.code == 84) { // 't'
>>      this.toggle();
>>      return;
>>    }
>> hunk ./ui/default/slides.js 253
>> -  if(!key.which){
>> -    key.which = key.code;
>> -  }
>>    if (this.s5mode) {
>> hunk ./ui/default/slides.js 254
>> -    switch (key.which) {
>> +    var underControls = false;
>> +    if ((e.src() && this.isParentOrSelf(e.src(), 'controls')) ||
>> +        (e.target() && this.isParentOrSelf(e.target(),  
>> 'controls'))) {
>> +        // don't react to certain keys if focus in controls area  
>> (jumplist)
>> +        underControls = true;
>> +    }
>> +    switch (key.code) {
>>        case 10: // return
>>        case 13: // enter
>> hunk ./ui/default/slides.js 263
>> -        if (window.event && this.isParentOrSelf 
>> (window.event.srcElement, 'controls')) return;
>> -        if (key.target && this.isParentOrSelf(key.target,  
>> 'controls')) return;
>> +        if (underControls) return;
>>          if(this.number != undef) {
>>            this.goTo(this.number);
>>            break;
>> hunk ./ui/default/slides.js 272
>>        case 34: // page down
>>        case 39: // rightkey
>>        case 40: // downkey
>> +        if (underControls) return;
>>          if(this.number != undef) {
>>            this.go(this.number);
>>          } else if (!this.incrementals[this.snum] || this.incpos  
>> >= this.incrementals[this.snum].length) {
>> hunk ./ui/default/slides.js 284
>>        case 33: // page up
>>        case 37: // leftkey
>>        case 38: // upkey
>> +        if (underControls) return;
>>          if(this.number != undef) {
>>            this.go(-1 * this.number);
>>          } else if (!this.incrementals[this.snum] || this.incpos  
>> <= 0) {
>> hunk ./ui/default/slides.js 294
>>          }
>>          break;
>>        case 36: // home
>> +        if (underControls) return;
>>          this.goTo(0);
>>          break;
>>        case 35: // end
>> hunk ./ui/default/slides.js 298
>> +        if (underControls) return;
>>          this.goTo(this.smax - 1);
>>          break;
>>        case 67: // c
>> hunk ./ui/default/slides.js 302
>> +        if (underControls) return;
>>          this.showHide('k');
>>          break;
>>        case 78: // n
>> hunk ./ui/default/slides.js 309
>>          this.createNotesWindow();
>>          break;
>>      }
>> -    if (key.which < 48 || key.which > 57) {
>> +    if (key.code < 48 || key.code > 57) {
>>        this.number = undef;
>>      } else {
>> hunk ./ui/default/slides.js 312
>> -      if (window.event && this.isParentOrSelf 
>> (window.event.srcElement, 'controls')) return;
>> -      if (key.target && this.isParentOrSelf(key.target,  
>> 'controls')) return;
>> -      this.number = (((this.number != undef) ? this.number : 0) *  
>> 10) + (key.which - 48);
>> +      if (underControls) return;
>> +      this.number = (((this.number != undef) ? this.number : 0) *  
>> 10) + (key.code - 48);
>>      }
>>    }
>>    return false;
>> }
>> [slight change to delayed note loading
>> stefan.rank at ofai.at**20061003112619] <
>>> {
>> hunk ./ui/default/slides.js 615
>>      // Note: Safari has a tendency to ignore window options  
>> preferring to default to the settings of the parent window, grr.
>>      this.s5NotesWindow = window.open('ui/s5-notes.html',  
>> 'this.s5NotesWindow', 'top=0,left=0');
>>    }
>> -  while(!this.s5NotesWindow || !this.s5NotesWindow.document) {
>> -    wait(1000);
>> +  if (this.s5NotesWindowLoaded) { // Load the current note if the  
>> Note HTML has loaded
>> +    this.loadNotes();
>> +  } else { // DONT Keep trying... (because its annoying, for  
>> example, with popup blockers)
>> +    // just try loading a little bit later. if it fails, it fails.
>> +    window.setTimeout('window.s.loadNotes()', 500);
>>    }
>> hunk ./ui/default/slides.js 621
>> -  this.loadNotes();
>>  }
>>   S5.prototype.loadNotes = function() {
>> }
>> [commenting log message
>> stefan.rank at ofai.at**20061003112802] <
>>> {
>> hunk ./ui/default/slides.js 624
>>  }
>>   S5.prototype.loadNotes = function() {
>> -  log(this.snum);
>> +  //log(this.snum);
>>    // Loads a note into the note window
>>    var notes = nextNotes = '<em class="disclaimer">There are no  
>> notes for this slide.</em>';
>>    if ($('note' + this.snum.toString())) {
>> }
>> [hide currentslide indicator AND footer on first slide
>> stefan.rank at ofai.at**20061003113106] <
>>> {
>> hunk ./ui/default/slides.js 104
>>   S5.prototype.currentSlide = function() {
>>    //builds the HTML shown on the slide to indicate the current slide
>> -  var cs = $('currentSlide');
>> -  cs.innerHTML = '<a id="plink" href="">' + -    '<span  
>> id="csHere">' + this.snum + '<\/span> ' + -    '<span id="csSep">\/ 
>> <\/span> ' + -    '<span id="csTotal">' + (this.smax - 1) + '<\/ 
>> span>' +
>> -    '<\/a>'
>> -    ;
>> +  var current_slide = $('currentSlide');
>> +  var footer_nodes = $('footer').childNodes;
>> +  replaceChildNodes(current_slide,
>> +    A(
>> +      {'id':'plink', 'href':''},
>> +      SPAN({'id':'csHere'}, this.snum)
>> +      /* don't want a slide total? comment the following 3 lines:
>> +         TODO: make this a (meta) parameter */
>> +      ,
>> +      SPAN({'id':'csSep'},'/'),
>> +      SPAN({'id':'csTotal'}, this.smax - 1)
>> +    ));
>> +  var vis = 'visible';
>>    if (this.snum == 0) {
>> hunk ./ui/default/slides.js 118
>> -    cs.style.visibility = 'hidden';
>> -  } else {
>> -    cs.style.visibility = 'visible';
>> +    vis = 'hidden';
>> +  }
>> +  current_slide.style.visibility = vis;
>> +  for (var i = 0; i < footer_nodes.length; i++) {
>> +    if (footer_nodes[i].nodeType == 1) {
>> +      footer_nodes[i].style.visibility = vis;
>> +    }
>>    }
>>  }
>>  }
>> [update leftclick handling
>> stefan.rank at ofai.at**20061003120153] <
>>> {
>> hunk ./ui/default/slides.js 332
>>  S5.prototype.clicker = function(e) {
>>    //handles mouse clicks
>>    this.number = undef;
>> -  var target;
>> -  //not sure what the point was in the following
>> -/*  if (window.event) {
>> -    target = window.event.srcElement;
>> -    e = window.event;
>> -  } else {
>> -    target = e.target;
>> -  }*/
>> -  if (e.target().href != null ||
>> -      this.hasValue(e.target().rel, 'external') ||
>> -      this.isParentOrSelf(e.target(), 'controls') ||
>> -      this.isParentOrSelf(e.target(),'embed') ||
>> -      this.isParentOrSelf(e.target(),'object'))
>> +  // don't want a mouse click to advance, only to unset a slide  
>> number jump?
>> +  // then uncomment this: (TODO: make this a meta-parameter)
>> +  //return true;
>> +  var target = e.target(); // MochiKit event object
>> +  if (target.href != null ||
>> +      this.hasValue(target.rel, 'external') ||
>> +      this.isParentOrSelf(target, 'controls') ||
>> +      this.isParentOrSelf(target, 'embed') ||
>> +      this.isParentOrSelf(target, 'object')) {
>>      return true;
>> hunk ./ui/default/slides.js 342
>> -  if (!e.which || e.which == 1) {
>> +  }
>> +  if (e.mouse().button.left) {
>>      if (!this.incrementals[this.snum] || this.incpos >=  
>> this.incrementals[this.snum].length) {
>>        this.go(1);
>>      } else {
>> }
>> [some comment updates
>> stefan.rank at ofai.at**20061003120653] <
>>> {
>> hunk ./ui/default/slides.js 239
>>  }
>>   S5.prototype.showHide = function(action) {
>> -  //not sure what this is used for, isn't demonstrated in the  
>> default slideshow
>> +  //Shows or hides the controls (bound to pressing 'c').
>>    var obj = getElementsByTagAndClassName('*','hideme')[0];
>>    switch (action) {
>>      case 's': obj.style.visibility = 'visible'; break;
>> hunk ./ui/default/slides.js 452
>>    '<a accesskey="x" id="next" href="javascript:s.go(1);">&raquo;< 
>> \/a>' +
>>    '<div id="navList"' + hideList + '><select id="jumplist"  
>> onchange="s.go(\'j\');"><\/select><\/div>' +
>>    '<\/div><\/form>';
>> +  /* with the following mochikit version the hide events do not  
>> work:
>> +  replaceChildNodes(controlsDiv,
>> +    FORM({'action':'#', 'id':'controlForm'},
>> +      DIV({'id':'navLinks'},
>> +        A({'accesskey':'n', 'id':'show-notes',  
>> 'href':'javascript:s.createNotesWindow();', 'title':'Show Notes'},  
>> '\u2261'),
>> +        A({'accesskey':'t', 'id':'toggle',  
>> 'href':'javascript:s.toggle();'}, '\u00d8'),
>> +        A({'accesskey':'z', 'id':'prev', 'href':'javascript:s.go 
>> (-1);'}, '\u00ab'),
>> +        A({'accesskey':'x', 'id':'next', 'href':'javascript:s.go 
>> (1);'}, '\u00bb'),
>> +        DIV({'id':'navList'},
>> +          SELECT({'id':'jumplist', 'onchange':'s.go(\'j\');'})
>> +        )
>> +      )
>> +    )
>> +  );
>> +  */
>> +     if (this.controlVis == 'hidden') {
>>      var hidden = $('navLinks');
>>    } else {
>> hunk ./ui/default/slides.js 618
>>    return modifierKey || e.which == 0;
>>  }
>>  +// note that this labelling is currently very very brittle,
>> +// it allows only one notes child element per slide! --StefanRank
>>  S5.prototype.noteLabel = function() {    // Gives notes id's to  
>> match parent slides
>>    var notes = getElementsByTagAndClassName('div','notes');
>> }
>> [arbitrary slideIDs (docutils), special case last slide on notes,  
>> hide footer on slide0
>> stefan.rank at ofai.at**20061003121152] <
>>> {
>> hunk ./ui/default/slides.js 19
>>    this.slideCSS = '';
>>    this.snum = 0;
>>    this.smax = 1;
>> +  this.slideIDs = new Array(); /* needed for rst, allows  
>> different ids than slideX on slides */
>>    this.incpos = 0;
>>    this.number = undef;
>>    this.s5mode = true;
>> hunk ./ui/default/slides.js 83
>>      var obj = slideColl[i];
>>       var did = 'slide' + i.toString();
>> -    obj.setAttribute('id', did);
>> +    if (obj.getAttribute('id')) {
>> +      this.slideIDs[i] = obj.getAttribute('id');
>> +    } else {
>> +      obj.setAttribute('id', did);
>> +      this.slideIDs[i] = did;
>> +    }
>>       //if (isOp) continue;   // Opera fix (hallvord)
>>  hunk ./ui/default/slides.js 139
>>    //TODO: cleanup and split up
>>    if ($('slideProj').disabled || step == 0) return;
>>    var jl = $('jumplist');
>> -  var cid = 'slide' + this.snum;
>> -  var ce = $(cid);
>> +  var current_id = this.slideIDs[this.snum];
>> +  var current_element = $(current_id);
>>    if (this.incrementals[this.snum].length > 0) {
>>      for (var i = 0, l = this.incrementals[this.snum].length; i <  
>> l; i++) {
>>        removeElementClass(this.incrementals[this.snum][i],  
>> 'current');
>> hunk ./ui/default/slides.js 156
>>      //apparently, 'j' means to look for the value in the jump list.
>>      this.snum = parseInt(jl.value);
>>    }
>> -  var nid = 'slide' + this.snum;
>> -  var ne = $(nid);
>> -  if (!ne) {
>> -    ne = $('slide0');
>> +  var next_id = this.slideIDs[this.snum];
>> +  var next_element = $(next_id);
>> +  if (!next_element) {
>> +    next_element = $(this.slideIDs[0]);
>>      this.snum = 0;
>>    }
>>    if (step < 0) {
>> hunk ./ui/default/slides.js 180
>>      addElementClass(this.incrementals[this.snum][this.incpos -  
>> 1], 'current');
>>    }
>>    if (this.isOp) { //hallvord
>> -    location.hash = nid;
>> +    location.hash = next_id; // why? --StefanRank
>>    } else {
>> hunk ./ui/default/slides.js 182
>> -    ce.style.visibility = 'hidden'; -    ne.style.visibility =  
>> 'visible';
>> -    location.hash = nid;
>> +    current_element.style.visibility = 'hidden'; +     
>> next_element.style.visibility = 'visible';
>>    } // /hallvord
>>    jl.selectedIndex = this.snum;
>>    this.currentSlide();
>> hunk ./ui/default/slides.js 359
>>   S5.prototype.findSlide = function(hash) {
>>    //finds a slide based on `hash` - not sure of the constrains on  
>> `hash`
>> -  var target = null;
>> -  for (var i = 0, l = this.slides.length; i < l; i++) {
>> -    var targetSlide = this.slides[i];
>> -    //TODO: should we support @name? why?
>> -    if ((targetSlide.name && targetSlide.name == hash)
>> -     || (targetSlide.id && targetSlide.id == hash)) {
>> -      target = targetSlide;
>> -      break;
>> -    }
>> -  }
>> -  while(target != null && target.nodeName != 'BODY') {
>> -    if (hasElementClass(target, 'slide')) {
>> -      return parseInt(target.id.slice(5));
>> +  var target = $(hash);
>> +  if (target) {
>> +    for (var i = 0; i < this.slideIDs.length; i++) {
>> +      if (target.id == this.slideIDs[i]) return i;
>>      }
>> hunk ./ui/default/slides.js 364
>> -    target = target.parentNode;
>>    }
>>    return null;
>>  }
>> hunk ./ui/default/slides.js 370
>>   S5.prototype.slideJump = function() {
>>    //jumps to the slide specified by the fragment identifier in  
>> the URL
>> -  if (window.location.hash == null) return;
>> +  if (window.location.hash == null || window.location.hash == '') {
>> +    this.currentSlide(); // hides footer on slide0
>> +    return;
>> +  }
>>    var sregex = /^#slide(\d+)$/;
>>    var matches = sregex.exec(window.location.hash);
>>    var dest = null;
>> hunk ./ui/default/slides.js 394
>>    var aelements = getElementsByTagAndClassName('a');
>>    for (var i = 0, l = aelements.length; i < l; i++) {
>>      var a = aelements[i].href;
>> -    var slideID = a.match('\#slide[0-9]{1,2}');
>> +    var slideID = a.match('\#.+');
>>      if ((slideID) && (slideID[0].slice(0,1) == '#')) { //TODO:  
>> put this second part in the regex
>>        var dest = this.findSlide(slideID[0].slice(1));
>>        if (dest != null) {
>> hunk ./ui/default/slides.js 428
>>   S5.prototype.permaLink = function() {
>>    //sets the permalink for the current slide
>> -  $('plink').href = window.location.pathname + '#slide' +  
>> this.snum.toString();
>> +  $('plink').href = window.location.pathname + '#' + this.slideIDs 
>> [this.snum];
>>  }
>>   S5.prototype.createControls = function() {
>> hunk ./ui/default/slides.js 582
>>  S5.prototype.createIncrementals = function() {
>>    var incrementals = new Array();
>>    for (var i = 0; i < this.smax; i++) {
>> -    incrementals[i] = this.getIncrementals($('slide' + i));
>> +    incrementals[i] = this.getIncrementals($(this.slideIDs[i]));
>>    }
>>    return incrementals;
>>  }
>> hunk ./ui/default/slides.js 623
>>    var notes = getElementsByTagAndClassName('div','notes');
>>    for (var i = 0; i < notes.length; i++) {
>>      var note = notes[i];
>> -    var id = 'note' + note.parentNode.id.substring(5); //assumes  
>> that there's no levels between the slide and the notes
>> -    note.setAttribute('id', id);
>> +    // assumes that there's no levels between the slide and the  
>> notes:
>> +    var index = findIdentical(this.slideIDs, note.parentNode.id);
>> +    if (index != -1) {
>> +      var id = 'note' + index;
>> +      note.setAttribute('id', id);
>> +    }
>>    }
>>    this.resetElapsedSlide(); // TODO: odd place for these,  
>> probably need to be refactored out
>>    this.resetRemainingTime();
>> hunk ./ui/default/slides.js 660
>>    if ($('note' + (this.snum + 1))) {
>>      nextNotes = $('note' + (this.snum + 1)).innerHTML;
>>    }
>> +  var finalfinalSlide = '<em class="disclaimer">There are no more  
>> slides beyond this point. Move along, nothing to see here.</em>'
>>     //I've removed the slide titles from the notes (since we now  
>> have the entire slides, w/ titles) --ryan
>>  //  var jl = $('jumplist');
>> hunk ./ui/default/slides.js 677
>>    if (this.s5NotesWindow && !this.s5NotesWindow.closed &&  
>> this.s5NotesWindow.document) {
>>      this.s5NotesWindow.document.getElementById('current- 
>> notes').innerHTML = notes;
>>      this.s5NotesWindow.document.getElementById('next- 
>> notes').innerHTML = nextNotes;
>> -    this.s5NotesWindow.document.getElementById('current- 
>> slide').innerHTML = $('slide' + this.snum).innerHTML
>> -    this.s5NotesWindow.document.getElementById('next- 
>> slide').innerHTML = $('slide' + (this.snum + 1)).innerHTML
>> +    this.s5NotesWindow.document.getElementById('current- 
>> slide').innerHTML = $(this.slideIDs[this.snum]).innerHTML;
>> +    this.s5NotesWindow.document.getElementById('next- 
>> slide').innerHTML = ((this.snum + 1 < this.smax) ? $(this.slideIDs 
>> [this.snum + 1]).innerHTML : finalfinalSlide);
>>    }
>>    this.resetElapsedSlide();
>>  }
>> }
>> Context:
>> [initial
>> stefan.rank at ofai.at**20061002153818] Patch bundle hash:
>> 863e09d1b9de67dccac988ddbb6bf531826a9875
>> --------------------------------------------------------------------- 
>> ---
>> _______________________________________________
>> S5-discuss mailing list
>> S5-discuss at s5project.org
>> http://s5project.org/lists/listinfo/s5-discuss
> _______________________________________________
> S5-discuss mailing list
> S5-discuss at s5project.org
> http://s5project.org/lists/listinfo/s5-discuss




More information about the S5-discuss mailing list