[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> </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);">»<
>> \/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