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.
- data/LICENSE +20 -0
- data/README.rdoc +532 -0
- data/Rakefile +7 -0
- data/bin/showoff +145 -0
- data/lib/commandline_parser.rb +67 -0
- data/lib/princely.rb +84 -0
- data/lib/showoff.rb +452 -0
- data/lib/showoff_utils.rb +369 -0
- data/public/css/fg.menu.css +114 -0
- data/public/css/onepage.css +60 -0
- data/public/css/pdf.css +12 -0
- data/public/css/reset.css +53 -0
- data/public/css/sh_style.css +66 -0
- data/public/css/showoff.css +361 -0
- data/public/css/spinner_bar.gif +0 -0
- data/public/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png +0 -0
- data/public/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png +0 -0
- data/public/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png +0 -0
- data/public/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png +0 -0
- data/public/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png +0 -0
- data/public/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png +0 -0
- data/public/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png +0 -0
- data/public/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png +0 -0
- data/public/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png +0 -0
- data/public/css/theme/images/ui-icons_808080_256x240.png +0 -0
- data/public/css/theme/images/ui-icons_8DC262_256x240.png +0 -0
- data/public/css/theme/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/css/theme/images/ui-icons_e7e6e4_256x240.png +0 -0
- data/public/css/theme/images/ui-icons_eeeeee_256x240.png +0 -0
- data/public/css/theme/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/css/theme/ui.accordion.css +9 -0
- data/public/css/theme/ui.all.css +2 -0
- data/public/css/theme/ui.base.css +9 -0
- data/public/css/theme/ui.core.css +37 -0
- data/public/css/theme/ui.datepicker.css +62 -0
- data/public/css/theme/ui.dialog.css +13 -0
- data/public/css/theme/ui.progressbar.css +4 -0
- data/public/css/theme/ui.resizable.css +13 -0
- data/public/css/theme/ui.slider.css +17 -0
- data/public/css/theme/ui.tabs.css +9 -0
- data/public/css/theme/ui.theme.css +245 -0
- data/public/favicon.ico +0 -0
- data/public/js/core.js +79 -0
- data/public/js/fg.menu.js +645 -0
- data/public/js/jTypeWriter.js +26 -0
- data/public/js/jquery-1.4.2.min.js +154 -0
- data/public/js/jquery-print.js +109 -0
- data/public/js/jquery.batchImageLoad.js +56 -0
- data/public/js/jquery.cookie.js +96 -0
- data/public/js/jquery.cycle.all.js +1284 -0
- data/public/js/jquery.doubletap-0.1.js +105 -0
- data/public/js/jquery.uuid.js +24 -0
- data/public/js/jquery.ws-0.3pre.js +201 -0
- data/public/js/onepage.js +5 -0
- data/public/js/sh_lang/sh_bison.min.js +1 -0
- data/public/js/sh_lang/sh_c.min.js +1 -0
- data/public/js/sh_lang/sh_caml.min.js +1 -0
- data/public/js/sh_lang/sh_changelog.min.js +1 -0
- data/public/js/sh_lang/sh_cpp.min.js +1 -0
- data/public/js/sh_lang/sh_csharp.min.js +1 -0
- data/public/js/sh_lang/sh_css.min.js +1 -0
- data/public/js/sh_lang/sh_cucumber.min.js +2 -0
- data/public/js/sh_lang/sh_desktop.min.js +1 -0
- data/public/js/sh_lang/sh_diff.min.js +1 -0
- data/public/js/sh_lang/sh_flex.min.js +1 -0
- data/public/js/sh_lang/sh_glsl.min.js +1 -0
- data/public/js/sh_lang/sh_haxe.min.js +1 -0
- data/public/js/sh_lang/sh_html.min.js +1 -0
- data/public/js/sh_lang/sh_java.min.js +1 -0
- data/public/js/sh_lang/sh_javascript.min.js +1 -0
- data/public/js/sh_lang/sh_javascript_dom.min.js +1 -0
- data/public/js/sh_lang/sh_latex.min.js +1 -0
- data/public/js/sh_lang/sh_ldap.min.js +1 -0
- data/public/js/sh_lang/sh_log.min.js +1 -0
- data/public/js/sh_lang/sh_lsm.min.js +1 -0
- data/public/js/sh_lang/sh_m4.min.js +1 -0
- data/public/js/sh_lang/sh_makefile.min.js +1 -0
- data/public/js/sh_lang/sh_oracle.min.js +1 -0
- data/public/js/sh_lang/sh_pascal.min.js +1 -0
- data/public/js/sh_lang/sh_perl.min.js +1 -0
- data/public/js/sh_lang/sh_php.min.js +1 -0
- data/public/js/sh_lang/sh_prolog.min.js +1 -0
- data/public/js/sh_lang/sh_properties.min.js +1 -0
- data/public/js/sh_lang/sh_python.min.js +1 -0
- data/public/js/sh_lang/sh_ruby.min.js +1 -0
- data/public/js/sh_lang/sh_scala.min.js +1 -0
- data/public/js/sh_lang/sh_sh.min.js +1 -0
- data/public/js/sh_lang/sh_slang.min.js +1 -0
- data/public/js/sh_lang/sh_sml.min.js +1 -0
- data/public/js/sh_lang/sh_spec.min.js +1 -0
- data/public/js/sh_lang/sh_sql.min.js +1 -0
- data/public/js/sh_lang/sh_tcl.min.js +1 -0
- data/public/js/sh_lang/sh_xml.min.js +1 -0
- data/public/js/sh_lang/sh_xorg.min.js +1 -0
- data/public/js/sh_main.min.js +4 -0
- data/public/js/showoff.js +623 -0
- data/public/js/showoffcore.js +13 -0
- data/views/index.erb +85 -0
- data/views/onepage.erb +35 -0
- 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, →</td><td>next slide</td></tr>
|
|
57
|
+
<tr><td class="key">shift-space, ←</td><td>previous slide</td></tr>
|
|
58
|
+
<tr><td class="key">d</td><td>toggle debug mode</td></tr>
|
|
59
|
+
<tr><td class="key">## <ret></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>
|