mg_showoff 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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>