mg_showoff 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +532 -0
  3. data/Rakefile +7 -0
  4. data/bin/showoff +145 -0
  5. data/lib/commandline_parser.rb +67 -0
  6. data/lib/princely.rb +84 -0
  7. data/lib/showoff.rb +452 -0
  8. data/lib/showoff_utils.rb +369 -0
  9. data/public/css/fg.menu.css +114 -0
  10. data/public/css/onepage.css +60 -0
  11. data/public/css/pdf.css +12 -0
  12. data/public/css/reset.css +53 -0
  13. data/public/css/sh_style.css +66 -0
  14. data/public/css/showoff.css +361 -0
  15. data/public/css/spinner_bar.gif +0 -0
  16. data/public/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png +0 -0
  17. data/public/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png +0 -0
  18. data/public/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png +0 -0
  19. data/public/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png +0 -0
  20. data/public/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png +0 -0
  21. data/public/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png +0 -0
  22. data/public/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png +0 -0
  23. data/public/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
  24. data/public/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png +0 -0
  25. data/public/css/theme/images/ui-icons_808080_256x240.png +0 -0
  26. data/public/css/theme/images/ui-icons_8DC262_256x240.png +0 -0
  27. data/public/css/theme/images/ui-icons_cd0a0a_256x240.png +0 -0
  28. data/public/css/theme/images/ui-icons_e7e6e4_256x240.png +0 -0
  29. data/public/css/theme/images/ui-icons_eeeeee_256x240.png +0 -0
  30. data/public/css/theme/images/ui-icons_ffffff_256x240.png +0 -0
  31. data/public/css/theme/ui.accordion.css +9 -0
  32. data/public/css/theme/ui.all.css +2 -0
  33. data/public/css/theme/ui.base.css +9 -0
  34. data/public/css/theme/ui.core.css +37 -0
  35. data/public/css/theme/ui.datepicker.css +62 -0
  36. data/public/css/theme/ui.dialog.css +13 -0
  37. data/public/css/theme/ui.progressbar.css +4 -0
  38. data/public/css/theme/ui.resizable.css +13 -0
  39. data/public/css/theme/ui.slider.css +17 -0
  40. data/public/css/theme/ui.tabs.css +9 -0
  41. data/public/css/theme/ui.theme.css +245 -0
  42. data/public/favicon.ico +0 -0
  43. data/public/js/core.js +79 -0
  44. data/public/js/fg.menu.js +645 -0
  45. data/public/js/jTypeWriter.js +26 -0
  46. data/public/js/jquery-1.4.2.min.js +154 -0
  47. data/public/js/jquery-print.js +109 -0
  48. data/public/js/jquery.batchImageLoad.js +56 -0
  49. data/public/js/jquery.cookie.js +96 -0
  50. data/public/js/jquery.cycle.all.js +1284 -0
  51. data/public/js/jquery.doubletap-0.1.js +105 -0
  52. data/public/js/jquery.uuid.js +24 -0
  53. data/public/js/jquery.ws-0.3pre.js +201 -0
  54. data/public/js/onepage.js +5 -0
  55. data/public/js/sh_lang/sh_bison.min.js +1 -0
  56. data/public/js/sh_lang/sh_c.min.js +1 -0
  57. data/public/js/sh_lang/sh_caml.min.js +1 -0
  58. data/public/js/sh_lang/sh_changelog.min.js +1 -0
  59. data/public/js/sh_lang/sh_cpp.min.js +1 -0
  60. data/public/js/sh_lang/sh_csharp.min.js +1 -0
  61. data/public/js/sh_lang/sh_css.min.js +1 -0
  62. data/public/js/sh_lang/sh_cucumber.min.js +2 -0
  63. data/public/js/sh_lang/sh_desktop.min.js +1 -0
  64. data/public/js/sh_lang/sh_diff.min.js +1 -0
  65. data/public/js/sh_lang/sh_flex.min.js +1 -0
  66. data/public/js/sh_lang/sh_glsl.min.js +1 -0
  67. data/public/js/sh_lang/sh_haxe.min.js +1 -0
  68. data/public/js/sh_lang/sh_html.min.js +1 -0
  69. data/public/js/sh_lang/sh_java.min.js +1 -0
  70. data/public/js/sh_lang/sh_javascript.min.js +1 -0
  71. data/public/js/sh_lang/sh_javascript_dom.min.js +1 -0
  72. data/public/js/sh_lang/sh_latex.min.js +1 -0
  73. data/public/js/sh_lang/sh_ldap.min.js +1 -0
  74. data/public/js/sh_lang/sh_log.min.js +1 -0
  75. data/public/js/sh_lang/sh_lsm.min.js +1 -0
  76. data/public/js/sh_lang/sh_m4.min.js +1 -0
  77. data/public/js/sh_lang/sh_makefile.min.js +1 -0
  78. data/public/js/sh_lang/sh_oracle.min.js +1 -0
  79. data/public/js/sh_lang/sh_pascal.min.js +1 -0
  80. data/public/js/sh_lang/sh_perl.min.js +1 -0
  81. data/public/js/sh_lang/sh_php.min.js +1 -0
  82. data/public/js/sh_lang/sh_prolog.min.js +1 -0
  83. data/public/js/sh_lang/sh_properties.min.js +1 -0
  84. data/public/js/sh_lang/sh_python.min.js +1 -0
  85. data/public/js/sh_lang/sh_ruby.min.js +1 -0
  86. data/public/js/sh_lang/sh_scala.min.js +1 -0
  87. data/public/js/sh_lang/sh_sh.min.js +1 -0
  88. data/public/js/sh_lang/sh_slang.min.js +1 -0
  89. data/public/js/sh_lang/sh_sml.min.js +1 -0
  90. data/public/js/sh_lang/sh_spec.min.js +1 -0
  91. data/public/js/sh_lang/sh_sql.min.js +1 -0
  92. data/public/js/sh_lang/sh_tcl.min.js +1 -0
  93. data/public/js/sh_lang/sh_xml.min.js +1 -0
  94. data/public/js/sh_lang/sh_xorg.min.js +1 -0
  95. data/public/js/sh_main.min.js +4 -0
  96. data/public/js/showoff.js +623 -0
  97. data/public/js/showoffcore.js +13 -0
  98. data/views/index.erb +85 -0
  99. data/views/onepage.erb +35 -0
  100. metadata +227 -0
@@ -0,0 +1,623 @@
1
+ /* ShowOff JS Logic */
2
+
3
+ var ShowOff = {};
4
+
5
+ var preso_started = false
6
+ var slidenum = 0
7
+ var slideTotal = 0
8
+ var slides
9
+ var currentSlide
10
+ var totalslides = 0
11
+ var slidesLoaded = false
12
+ var incrSteps = 0
13
+ var incrElem
14
+ var incrCurr = 0
15
+ var incrCode = false
16
+ var debugMode = false
17
+ var gotoSlidenum = 0
18
+ var shiftKeyActive = false
19
+
20
+ var loadSlidesBool
21
+ var loadSlidesPrefix
22
+
23
+ function setupPreso(load_slides, prefix) {
24
+ if (preso_started)
25
+ {
26
+ alert("already started")
27
+ return
28
+ }
29
+ preso_started = true
30
+
31
+ loadSlidesBool = load_slides
32
+ loadSlidesPrefix = prefix
33
+ loadSlides(loadSlidesBool, loadSlidesPrefix)
34
+
35
+ doDebugStuff()
36
+
37
+ // bind event handlers
38
+ document.onkeydown = keyDown
39
+ document.onkeyup = keyUp
40
+ /* window.onresize = resized; */
41
+ /* window.onscroll = scrolled; */
42
+ /* window.onunload = unloaded; */
43
+
44
+ $('body').addSwipeEvents().
45
+ bind('tap', swipeLeft). // next
46
+ bind('swipeleft', swipeLeft). // next
47
+ bind('swiperight', swipeRight); // prev
48
+ }
49
+
50
+ function loadSlides(load_slides, prefix) {
51
+ //load slides offscreen, wait for images and then initialize
52
+ if (load_slides) {
53
+ $("#slides").load("slides", false, function(){
54
+ $("#slides img").batchImageLoad({
55
+ loadingCompleteCallback: initializePresentation(prefix)
56
+ })
57
+ })
58
+ } else {
59
+ $("#slides img").batchImageLoad({
60
+ loadingCompleteCallback: initializePresentation(prefix)
61
+ })
62
+ }
63
+ }
64
+
65
+ function initializePresentation(prefix) {
66
+ // unhide for height to work in static mode
67
+ $("#slides").show();
68
+
69
+ //center slides offscreen
70
+ centerSlides($('#slides > .slide'))
71
+
72
+ //copy into presentation area
73
+ $("#preso").empty()
74
+ $('#slides > .slide').appendTo($("#preso"))
75
+
76
+ //populate vars
77
+ slides = $('#preso > .slide')
78
+ slideTotal = slides.size()
79
+
80
+ //setup manual jquery cycle
81
+ $('#preso').cycle({
82
+ timeout: 0
83
+ })
84
+
85
+ setupMenu()
86
+ if (slidesLoaded) {
87
+ showSlide()
88
+ } else {
89
+ showFirstSlide();
90
+ slidesLoaded = true
91
+ }
92
+ setupSlideParamsCheck();
93
+ sh_highlightDocument(prefix+'/js/sh_lang/', '.min.js')
94
+ $("#preso").trigger("showoff:loaded");
95
+ }
96
+
97
+ function centerSlides(slides) {
98
+ slides.each(function(s, slide) {
99
+ centerSlide(slide)
100
+ })
101
+ }
102
+
103
+ function centerSlide(slide) {
104
+ var slide_content = $(slide).children(".content").first()
105
+ var height = slide_content.height()
106
+ var mar_top = (0.5 * parseFloat($(slide).height())) - (0.5 * parseFloat(height))
107
+ if (mar_top < 0) {
108
+ mar_top = 0
109
+ }
110
+ slide_content.css('margin-top', mar_top)
111
+ }
112
+
113
+ function setupMenu() {
114
+ $('#navmenu').hide();
115
+
116
+ var currSlide = 0
117
+ var menu = new ListMenu()
118
+
119
+ slides.each(function(s, elem) {
120
+ content = $(elem).children(".content")
121
+ shortTxt = $(content).text().substr(0, 20)
122
+ path = $(content).attr('ref').split('/')
123
+ currSlide += 1
124
+ menu.addItem(path, shortTxt, currSlide)
125
+ })
126
+
127
+ $('#navigation').html(menu.getList())
128
+ $('#navmenu').menu({
129
+ content: $('#navigation').html(),
130
+ flyOut: true
131
+ });
132
+ }
133
+
134
+ function checkSlideParameter() {
135
+ if (slideParam = currentSlideFromParams()) {
136
+ slidenum = slideParam;
137
+ }
138
+ }
139
+
140
+ function currentSlideFromParams() {
141
+ var result;
142
+ if (result = window.location.hash.match(/#([0-9]+)/)) {
143
+ return result[result.length - 1] - 1;
144
+ }
145
+ }
146
+
147
+ function setupSlideParamsCheck() {
148
+ var check = function() {
149
+ var currentSlide = currentSlideFromParams();
150
+ if (slidenum != currentSlide) {
151
+ slidenum = currentSlide;
152
+ showSlide();
153
+ }
154
+ setTimeout(check, 100);
155
+ }
156
+ setTimeout(check, 100);
157
+ }
158
+
159
+ function gotoSlide(slideNum) {
160
+ slidenum = parseInt(slideNum)
161
+ if (!isNaN(slidenum)) {
162
+ showSlide()
163
+ }
164
+ }
165
+
166
+ function showFirstSlide() {
167
+ slidenum = 0
168
+ checkSlideParameter();
169
+ showSlide()
170
+ }
171
+
172
+ function showSlide(back_step) {
173
+
174
+ if(slidenum < 0) {
175
+ slidenum = 0
176
+ return
177
+ }
178
+
179
+ if(slidenum > (slideTotal - 1)) {
180
+ slidenum = slideTotal - 1
181
+ return
182
+ }
183
+
184
+ currentSlide = slides.eq(slidenum)
185
+
186
+ var transition = currentSlide.attr('data-transition')
187
+ var fullPage = currentSlide.find(".content").is('.full-page');
188
+
189
+ if (back_step || fullPage) {
190
+ transition = 'none'
191
+ }
192
+
193
+ $('#preso').cycle(slidenum, transition)
194
+
195
+ if (fullPage) {
196
+ $('#preso').css({'width' : '100%', 'overflow' : 'visible'});
197
+ currentSlide.css({'width' : '100%', 'text-align' : 'center', 'overflow' : 'visible'});
198
+ }
199
+
200
+ percent = getSlidePercent()
201
+ $("#slideInfo").text((slidenum + 1) + '/' + slideTotal + ' - ' + percent + '%')
202
+
203
+ if(!back_step) {
204
+ // determine if there are incremental bullets to show
205
+ // unless we are moving backward
206
+ determineIncremental()
207
+ } else {
208
+ incrCurr = 0
209
+ incrSteps = 0
210
+ }
211
+ location.hash = slidenum + 1;
212
+
213
+ removeResults();
214
+
215
+ $(currentSlide).find(".content").trigger("showoff:show");
216
+
217
+ return getCurrentNotes()
218
+ }
219
+
220
+ function getSlideProgress()
221
+ {
222
+ return (slidenum + 1) + '/' + slideTotal
223
+ }
224
+
225
+ function getCurrentNotes()
226
+ {
227
+ var notes = currentSlide.find("p.notes").text()
228
+ $('#notesInfo').text(notes)
229
+ return notes
230
+ }
231
+
232
+ function getSlidePercent()
233
+ {
234
+ return Math.ceil(((slidenum + 1) / slideTotal) * 100)
235
+ }
236
+
237
+ function determineIncremental()
238
+ {
239
+ incrCurr = 0
240
+ incrCode = false
241
+ incrElem = currentSlide.find(".incremental > ul > li")
242
+ incrSteps = incrElem.size()
243
+ if(incrSteps == 0) {
244
+ // also look for commandline
245
+ incrElem = currentSlide.find(".incremental > pre > code > code")
246
+ incrSteps = incrElem.size()
247
+ incrCode = true
248
+ }
249
+ incrElem.each(function(s, elem) {
250
+ $(elem).hide()
251
+ })
252
+ }
253
+
254
+ function prevStep()
255
+ {
256
+
257
+ var event = jQuery.Event("showoff:prev");
258
+ $(currentSlide).find(".content").trigger(event);
259
+ if (event.isDefaultPrevented()) {
260
+ return;
261
+ }
262
+
263
+ slidenum--
264
+ return showSlide(true) // We show the slide fully loaded
265
+ }
266
+
267
+ function nextStep()
268
+ {
269
+ var event = jQuery.Event("showoff:next");
270
+ $(currentSlide).find(".content").trigger(event);
271
+ if (event.isDefaultPrevented()) {
272
+ return;
273
+ }
274
+
275
+ if (incrCurr >= incrSteps) {
276
+ slidenum++
277
+ return showSlide()
278
+ } else {
279
+ elem = incrElem.eq(incrCurr)
280
+ if (incrCode && elem.hasClass('command')) {
281
+ incrElem.eq(incrCurr).show().jTypeWriter({duration:1.0})
282
+ } else {
283
+ incrElem.eq(incrCurr).show()
284
+ }
285
+ incrCurr++
286
+ }
287
+ }
288
+
289
+ function doDebugStuff()
290
+ {
291
+ if (debugMode) {
292
+ $('#debugInfo').show()
293
+ debug('debug mode on')
294
+ } else {
295
+ $('#debugInfo').hide()
296
+ }
297
+ }
298
+
299
+ var notesMode = false
300
+ function toggleNotes()
301
+ {
302
+ notesMode = !notesMode
303
+ if (notesMode) {
304
+ $('#notesInfo').show()
305
+ debug('notes mode on')
306
+ } else {
307
+ $('#notesInfo').hide()
308
+ }
309
+ }
310
+
311
+ function debug(data)
312
+ {
313
+ $('#debugInfo').text(data)
314
+ }
315
+
316
+ // See e.g. http://www.quirksmode.org/js/keys.html for keycodes
317
+ function keyDown(event)
318
+ {
319
+ var key = event.keyCode;
320
+
321
+ if (event.ctrlKey || event.altKey || event.metaKey)
322
+ return true;
323
+
324
+ debug('keyDown: ' + key)
325
+
326
+ if (key >= 48 && key <= 57) // 0 - 9
327
+ {
328
+ gotoSlidenum = gotoSlidenum * 10 + (key - 48);
329
+ return true;
330
+ }
331
+
332
+ if (key == 13) {
333
+ if (gotoSlidenum > 0) {
334
+ debug('go to ' + gotoSlidenum);
335
+ slidenum = gotoSlidenum - 1;
336
+ showSlide(true);
337
+ gotoSlidenum = 0;
338
+ } else {
339
+ debug('executeCode');
340
+ var $jsCode = $('.execute .sh_javascript code:visible')
341
+ if ($jsCode.length > 0) {
342
+ executeCode.call($jsCode);
343
+ }
344
+ var $rubyCode = $('.execute .sh_ruby code:visible')
345
+ if ($rubyCode.length > 0) {
346
+ executeRuby.call($rubyCode);
347
+ }
348
+ }
349
+
350
+ }
351
+
352
+
353
+ if (key == 16) // shift key
354
+ {
355
+ shiftKeyActive = true;
356
+ }
357
+
358
+ if (key == 32) // space bar
359
+ {
360
+ if (shiftKeyActive) {
361
+ prevStep()
362
+ } else {
363
+ nextStep()
364
+ }
365
+ }
366
+ else if (key == 68) // 'd' for debug
367
+ {
368
+ debugMode = !debugMode
369
+ doDebugStuff()
370
+ }
371
+ else if (key == 37 || key == 33 || key == 38) // Left arrow, page up, or up arrow
372
+ {
373
+ prevStep()
374
+ }
375
+ else if (key == 39 || key == 34 || key == 40) // Right arrow, page down, or down arrow
376
+ {
377
+ nextStep()
378
+ }
379
+ else if (key == 82) // R for reload
380
+ {
381
+ if (confirm('really reload slides?')) {
382
+ loadSlides(loadSlidesBool, loadSlidesPrefix)
383
+ showSlide()
384
+ }
385
+ }
386
+ else if (key == 84 || key == 67) // T or C for table of contents
387
+ {
388
+ $('#navmenu').toggle().trigger('click')
389
+ }
390
+ else if (key == 90 || key == 191) // z or ? for help
391
+ {
392
+ $('#help').toggle()
393
+ }
394
+ else if (key == 66 || key == 70) // f for footer (also "b" which is what kensington remote "stop" button sends
395
+ {
396
+ toggleFooter()
397
+ }
398
+ else if (key == 78) // 'n' for notes
399
+ {
400
+ toggleNotes()
401
+ }
402
+ else if (key == 27) // esc
403
+ {
404
+ removeResults();
405
+ }
406
+ else if (key == 80) // 'p' for preshow
407
+ {
408
+ runPreShow();
409
+ }
410
+ return true
411
+ }
412
+
413
+ function toggleFooter()
414
+ {
415
+ $('#footer').toggle()
416
+ }
417
+
418
+ function keyUp(event) {
419
+ var key = event.keyCode;
420
+ debug('keyUp: ' + key);
421
+ if (key == 16) // shift key
422
+ {
423
+ shiftKeyActive = false;
424
+ }
425
+ }
426
+
427
+ function swipeLeft() {
428
+ nextStep();
429
+ }
430
+
431
+ function swipeRight() {
432
+ prevStep();
433
+ }
434
+
435
+ function ListMenu(s)
436
+ {
437
+ this.slide = s
438
+ this.typeName = 'ListMenu'
439
+ this.itemLength = 0;
440
+ this.items = new Array();
441
+ this.addItem = function (key, text, slide) {
442
+ if (key.length > 1) {
443
+ thisKey = key.shift()
444
+ if (!this.items[thisKey]) {
445
+ this.items[thisKey] = new ListMenu(slide)
446
+ }
447
+ this.items[thisKey].addItem(key, text, slide)
448
+ } else {
449
+ thisKey = key.shift()
450
+ this.items[thisKey] = new ListMenuItem(text, slide)
451
+ }
452
+ }
453
+ this.getList = function() {
454
+ var newMenu = $("<ul>")
455
+ for(var i in this.items) {
456
+ var item = this.items[i]
457
+ var domItem = $("<li>")
458
+ if (item.typeName == 'ListMenu') {
459
+ choice = $("<a rel=\"" + (item.slide - 1) + "\" href=\"#\">" + i + "</a>")
460
+ domItem.append(choice)
461
+ domItem.append(item.getList())
462
+ }
463
+ if (item.typeName == 'ListMenuItem') {
464
+ choice = $("<a rel=\"" + (item.slide - 1) + "\" href=\"#\">" + item.slide + '. ' + item.textName + "</a>")
465
+ domItem.append(choice)
466
+ }
467
+ newMenu.append(domItem)
468
+ }
469
+ return newMenu
470
+ }
471
+ }
472
+
473
+ function ListMenuItem(t, s)
474
+ {
475
+ this.typeName = "ListMenuItem"
476
+ this.slide = s
477
+ this.textName = t
478
+ }
479
+
480
+ var removeResults = function() {
481
+ $('.results').remove();
482
+ };
483
+
484
+ var print = function(text) {
485
+ removeResults();
486
+ var _results = $('<div>').addClass('results').html($.print(text, {max_string:500}));
487
+ $('body').append(_results);
488
+ _results.click(removeResults);
489
+ };
490
+
491
+ function executeCode () {
492
+ result = null;
493
+ var codeDiv = $(this);
494
+ codeDiv.addClass("executing");
495
+ eval(codeDiv.text());
496
+ setTimeout(function() { codeDiv.removeClass("executing");}, 250 );
497
+ if (result != null) print(result);
498
+ }
499
+ $('.execute .sh_javascript code').live("click", executeCode);
500
+
501
+ function executeRuby () {
502
+ var codeDiv = $(this);
503
+ codeDiv.addClass("executing");
504
+ $.get('/eval_ruby', {code: codeDiv.text()}, function(result) {
505
+ if (result != null) print(result);
506
+ codeDiv.removeClass("executing");
507
+ });
508
+ }
509
+ $('.execute .sh_ruby code').live("click", executeRuby);
510
+
511
+
512
+ /********************
513
+ PreShow Code
514
+ ********************/
515
+
516
+ var preshow_seconds = 0;
517
+ var preshow_secondsLeft = 0;
518
+ var preshow_secondsPer = 8;
519
+ var preshow_running = false;
520
+ var preshow_timerRunning = false;
521
+ var preshow_current = 0;
522
+ var preshow_images;
523
+ var preshow_imagesTotal = 0;
524
+ var preshow_des = null;
525
+
526
+ function runPreShow() {
527
+ if(preshow_running) {
528
+ stopPreShow()
529
+ } else {
530
+ var minutes = prompt("Minutes from now to start")
531
+ preshow_secondsLeft = parseFloat(minutes) * 60
532
+ toggleFooter()
533
+ $.getJSON("preshow_files", false, function(data) {
534
+ $('#preso').after("<div id='preshow'></div><div id='tips'></div><div id='preshow_timer'></div>")
535
+ $.each(data, function(i, n) {
536
+ if(n == "preshow.json") {
537
+ // has a descriptions file
538
+ $.getJSON("/file/_preshow/preshow.json", false, function(data) {
539
+ preshow_des = data
540
+ })
541
+ } else {
542
+ $('#preshow').append('<img ref="' + n + '" src="/file/_preshow/' + n + '"/>')
543
+ }
544
+ })
545
+ startPreShow()
546
+ })
547
+ }
548
+ }
549
+
550
+ function startPreShow() {
551
+ if (!preshow_running) {
552
+ preshow_running = true
553
+ preshow_seconds = 0
554
+ preshow_images = $('#preshow > img')
555
+ preshow_imagesTotal = preshow_images.size()
556
+ nextPreShowImage()
557
+
558
+ if(!preshow_timerRunning) {
559
+ setInterval(function() {
560
+ preshow_timerRunning = true
561
+ if (!preshow_running) { return }
562
+ preshow_seconds++
563
+ preshow_secondsLeft--
564
+ if (preshow_secondsLeft < 0) {
565
+ stopPreShow()
566
+ }
567
+ if (preshow_seconds == preshow_secondsPer) {
568
+ preshow_seconds = 0
569
+ nextPreShowImage()
570
+ }
571
+ addPreShowTips()
572
+ }, 1000)
573
+ }
574
+ }
575
+ }
576
+
577
+ function addPreShowTips() {
578
+ time = secondsToTime(preshow_secondsLeft)
579
+ $('#preshow_timer').text(time + ' to go-time')
580
+ var des = preshow_des && preshow_des[tmpImg.attr("ref")]
581
+ if(des) {
582
+ $('#tips').show()
583
+ $('#tips').text(des)
584
+ } else {
585
+ $('#tips').hide()
586
+ }
587
+ }
588
+
589
+ function secondsToTime(sec) {
590
+ min = Math.floor(sec / 60)
591
+ sec = sec - (min * 60)
592
+ if(sec < 10) {
593
+ sec = "0" + sec
594
+ }
595
+ return min + ":" + sec
596
+ }
597
+
598
+ function stopPreShow() {
599
+ preshow_running = false
600
+
601
+ $('#preshow').remove()
602
+ $('#tips').remove()
603
+ $('#preshow_timer').remove()
604
+
605
+ toggleFooter()
606
+ loadSlides(loadSlidesBool, loadSlidesPrefix);
607
+ }
608
+
609
+ function nextPreShowImage() {
610
+ preshow_current += 1
611
+ if((preshow_current + 1) > preshow_imagesTotal) {
612
+ preshow_current = 0
613
+ }
614
+
615
+ $("#preso").empty()
616
+ tmpImg = preshow_images.eq(preshow_current).clone()
617
+ $(tmpImg).attr('width', '1020')
618
+ $("#preso").html(tmpImg)
619
+ }
620
+
621
+ /********************
622
+ End PreShow Code
623
+ ********************/
@@ -0,0 +1,13 @@
1
+ // Make CORE.out() write to showoff 'result' global variable http://github.com/scottbale/showoff
2
+ (function(CORE){
3
+
4
+ CORE.require = function(toImport){
5
+ //nothing to do
6
+ };
7
+ CORE.out = function(output){
8
+ result = result || '';
9
+ result = result + '<p>' + output + '</p>';
10
+ };
11
+
12
+ return CORE;
13
+ }(CORE));
data/views/index.erb ADDED
@@ -0,0 +1,85 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+ <title><%= @title %></title>
8
+
9
+ <meta name="viewport" content="width=device-width"/>
10
+
11
+ <link rel="stylesheet" href="<%= @asset_path %>css/reset.css" type="text/css"/>
12
+ <link rel="stylesheet" href="<%= @asset_path %>css/showoff.css" type="text/css"/>
13
+
14
+ <script type="text/javascript" src="<%= @asset_path %>js/jquery-1.4.2.min.js"></script>
15
+ <script type="text/javascript" src="<%= @asset_path %>js/jquery.cycle.all.js"></script>
16
+ <script type="text/javascript" src="<%= @asset_path %>js/jquery-print.js"></script>
17
+ <script type="text/javascript" src="<%= @asset_path %>js/jquery.batchImageLoad.js"></script>
18
+
19
+ <script type="text/javascript" src="<%= @asset_path %>js/jquery.doubletap-0.1.js"></script>
20
+
21
+ <script type="text/javascript" src="<%= @asset_path %>js/fg.menu.js"></script>
22
+ <script type="text/javascript" src="<%= @asset_path %>js/showoff.js"></script>
23
+ <script type="text/javascript" src="<%= @asset_path %>js/jTypeWriter.js"> </script>
24
+ <script type="text/javascript" src="<%= @asset_path %>js/sh_main.min.js"></script>
25
+ <script type="text/javascript" src="<%= @asset_path %>js/core.js"></script>
26
+ <script type="text/javascript" src="<%= @asset_path %>js/showoffcore.js"></script>
27
+
28
+ <link type="text/css" href="<%= @asset_path %>css/fg.menu.css" media="screen" rel="stylesheet" />
29
+ <link type="text/css" href="<%= @asset_path %>css/theme/ui.all.css" media="screen" rel="stylesheet" />
30
+ <link type="text/css" href="<%= @asset_path %>css/sh_style.css" rel="stylesheet" >
31
+
32
+ <% css_files.each do |css_file| %>
33
+ <link rel="stylesheet" href="file/<%= css_file %>" type="text/css"/>
34
+ <% end %>
35
+
36
+ <% js_files.each do |js_file| %>
37
+ <script type="text/javascript" src="file/<%= js_file %>"></script>
38
+ <% end %>
39
+
40
+ <script type="text/javascript">
41
+ $(function(){
42
+ setupPreso(<%= @slides.nil? ? "true" : "false"%>, '<%= @asset_path %>');
43
+ });
44
+ </script>
45
+ </head>
46
+
47
+ <body>
48
+
49
+
50
+ <a tabindex="0" href="#search-engines" class="fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all" id="navmenu"><span class="ui-icon ui-icon-triangle-1-s"></span>slides</a>
51
+ <div id="navigation" class="hidden"></div>
52
+
53
+ <div id="help">
54
+ <table>
55
+ <tr><td class="key">z, ?</td><td>toggle help (this)</td></tr>
56
+ <tr><td class="key">space, &rarr;</td><td>next slide</td></tr>
57
+ <tr><td class="key">shift-space, &larr;</td><td>previous slide</td></tr>
58
+ <tr><td class="key">d</td><td>toggle debug mode</td></tr>
59
+ <tr><td class="key">## &lt;ret&gt;</td><td>go to slide #</td></tr>
60
+ <tr><td class="key">c, t</td><td>table of contents (vi)</td></tr>
61
+ <tr><td class="key">f</td><td>toggle footer</td></tr>
62
+ <tr><td class="key">r</td><td>reload slides</td></tr>
63
+ <tr><td class="key">n</td><td>toggle notes</td></tr>
64
+ <tr><td class="key">p</td><td>run preshow</td></tr>
65
+ </table>
66
+ </div>
67
+
68
+ <div class="buttonNav">
69
+ <input type="submit" onClick="prevStep();" value="prev"/>
70
+ <input type="submit" onClick="nextStep();" value="next"/>
71
+ </div>
72
+
73
+ <div id="preso">loading presentation...</div>
74
+ <div id="footer">
75
+ <span id="slideInfo"></span>
76
+ <span id="debugInfo"></span>
77
+ <span id="notesInfo"></span>
78
+ </div>
79
+
80
+ <div id="slides" class="offscreen" <%= 'style="display:none;"' if @slides %>>
81
+ <%= @slides %>
82
+ </div>
83
+
84
+ </body>
85
+ </html>