shining 1.2.0 → 1.3.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 1.3.0
data/bin/shine CHANGED
@@ -8,7 +8,6 @@ ACTIONS = {
8
8
  :new_on! => ['build'],
9
9
  :new_slide! => ['slide'],
10
10
  :compile_templates! => ['compile'],
11
- :vendorize => ['vendor', 'vendorize'],
12
11
  :play => ['play', 'go'],
13
12
  :deploy => ['deploy']
14
13
  }
@@ -48,12 +47,6 @@ def new_slide! name, format = 'html'
48
47
  preso.new_slide "#{name}.#{format}", :with => ['styles', 'script']
49
48
  end
50
49
 
51
- def vendorize
52
- preso = Shining::Preso.open Dir.pwd
53
- bail! 'This preso seems vendorized already.' if preso.vendorized?
54
- preso.vendorize!
55
- end
56
-
57
50
  def compile_templates!
58
51
  preso = Shining::Preso.open Dir.pwd
59
52
  preso.compile_templates!
data/css/base.css CHANGED
@@ -8,19 +8,8 @@ ol, ul { list-style-type : none; }
8
8
  ins { text-decoration : none; }
9
9
  del { text-decoration : line-through }
10
10
 
11
- body {
12
- font: 12px/1.5 "Lucida Grande", Tahoma, serif;
13
- overflow: hidden;
14
- text-align: center;
15
- }
16
-
17
- #stage {
18
- position: relative;
19
- display: inline-block;
20
- padding: 40px 20px;
21
- max-width: 90%;
22
- text-align: left;
23
- }
11
+ body { font: 12px/1.5 "Lucida Grande", Tahoma, serif; overflow: hidden; text-align: center }
12
+ #stage { position: absolute; display: inline-block; padding: 40px 20px; max-width: 90%; text-align: left }
24
13
 
25
14
  .no-text-shadow { text-shadow: none }
26
15
  .no-drop-shadow {}
@@ -52,10 +41,4 @@ div.slice { position: absolute; display: block; width: 0; top: -10px; bottom: -1
52
41
  background-color: rgba(0, 0, 0, 0.2);
53
42
  color: #fff;
54
43
  padding: 10px;
55
- }
56
-
57
- @media all and (min-width: 480px) { #stage { font-size: 80% } }
58
- @media all and (min-width: 640px) { #stage { font-size: 100% } }
59
- @media all and (min-width: 800px) { #stage { font-size: 130% } }
60
- @media all and (min-width: 1024px) { #stage { font-size: 160% } }
61
- @media all and (min-width: 1280px) { #stage { font-size: 180% } }
44
+ }
data/lib/config.ru CHANGED
@@ -1,4 +1,10 @@
1
- use Rack::Static, :root => File.dirname(__FILE__), :urls => %w(/vendor/css /vendor/lib /slides /config.json /vendor/themes)
2
- run lambda { |env|
3
- [200, { 'Content-Type' => 'text/html', 'Cache-Control' => 'public, max-age=86400' }, [File.read('index.html')]]
1
+ use Rack::Static,
2
+ :root => File.dirname(__FILE__),
3
+ :urls => %w(/vendor/css /vendor/lib /slides /config.json /vendor/themes)
4
+ run lambda { |env|
5
+ [
6
+ 200,
7
+ { 'Content-Type' => 'text/html', 'Cache-Control' => 'public, max-age=86400' },
8
+ [File.read('index.html')]
9
+ ]
4
10
  }
@@ -11,22 +11,28 @@ module FileMethods
11
11
  def dir? dir
12
12
  File.directory? dir
13
13
  end
14
-
14
+
15
15
  def change_dir to
16
16
  Dir.chdir to
17
17
  end
18
-
18
+
19
19
  def move from, to
20
- Shining.say("Moving #{from} to #{to}") { FileUtils.mv(from, to) }
20
+ Shining.say(" Moving\t#{from} to #{to}") {
21
+ Dir[from].each do |something| FileUtils.mv something, to end
22
+ }
21
23
  end
22
24
 
23
25
  def copy from, to
24
- Shining.say("Copying #{from} to #{to}") { File.directory?(from) ? FileUtils.cp_r(from, to) : FileUtils.cp(from, to) }
26
+ Shining.say(" Copying\t#{from} to #{to}") {
27
+ Dir[from].each do |something|
28
+ File.directory?(something) ? FileUtils.cp_r(something, to) : FileUtils.cp(something, to)
29
+ end
30
+ }
25
31
  end
26
32
 
27
33
  def new_dir dir, careful = true
28
34
  confirm "#{dir} already exists. Proceed?" if careful and dir?(dir)
29
- Shining.say("Creating directory #{dir}") { FileUtils.mkdir_p dir }
35
+ Shining.say(" Creating\t#{dir}") { FileUtils.mkdir_p dir }
30
36
  end
31
37
 
32
38
  def read_file file
@@ -36,7 +42,7 @@ module FileMethods
36
42
  def erb file
37
43
  ERB.new(read_file(file)).result(binding)
38
44
  end
39
-
45
+
40
46
  def json file
41
47
  JSON.parse read_file(file)
42
48
  end
@@ -48,15 +54,15 @@ module FileMethods
48
54
  def dirname file
49
55
  File.dirname file
50
56
  end
51
-
57
+
52
58
  def extname file
53
59
  File.extname file
54
60
  end
55
-
61
+
56
62
  def basename file, take = ''
57
63
  File.basename file, take
58
64
  end
59
-
65
+
60
66
  def delete! file
61
67
  dir?(file) ? FileUtils.rm_rf(file) : FileUtils.rm(file)
62
68
  end
@@ -0,0 +1,23 @@
1
+ // resize.js: Shining plugin for resizing the font sizes depending
2
+ // on the available screen dimensions
3
+
4
+ $(window).resize(function() {
5
+ $.throttle(function() {
6
+ var width = $(window).width();
7
+ if (width < 480) {
8
+ $('#stage').css({fontSize: '80%'});
9
+ } else if (width >= 480 && width < 640) {
10
+ $('#stage').css({fontSize: '80%'});
11
+ } else if (width >= 640 && width < 800) {
12
+ $('#stage').css({fontSize: '100%'});
13
+ } else if (width >= 800 && width < 640) {
14
+ $('#stage').css({fontSize: '130%'});
15
+ } else if (width >= 1024 && width < 800) {
16
+ $('#stage').css({fontSize: '160%'});
17
+ } else if (width >= 1280 & width < 1024) {
18
+ $('#stage').css({fontSize: '180%'});
19
+ } else if (width > 1280) {
20
+ $('#stage').css({fontSize: '180%'});
21
+ }
22
+ }, 500);
23
+ })
@@ -0,0 +1,3 @@
1
+ Shining.when('slideplay', function() {
2
+ if (SyntaxHighlighter) SyntaxHighlighter.highlight();
3
+ })
data/lib/shining.js ADDED
@@ -0,0 +1,358 @@
1
+ (function($) {
2
+ String.prototype.markup = function() { return this + '.html' };
3
+ String.prototype.script = function() { return this + '.js' };
4
+ String.prototype.style = function() { return this + '.css' };
5
+ var KEY = { SPACE: 32, RIGHT: 39, LEFT: 37 };
6
+
7
+ // jQuery extensions
8
+ $.fn.effect = function(name) { return this.each(function() { applyEffect(this, name) }); };
9
+ $.fn.hasClasses = function(classes) {
10
+ var classes = classes.split(/\s+/), yes = true, element = this.get(0);
11
+ for (var i = 0; i < classes.length && yes; i++) { yes = $(element).hasClass(classes[i]) }
12
+ return yes;
13
+ };
14
+ $.throttle = function(method, interval) {
15
+ if (!$.throttle.throttling) $.throttle.throttling = {};
16
+ var now = new Date().getTime();
17
+ if (!(method.toString() in $.throttle.throttling)) {
18
+ $.throttle.throttling[method.toString()] = { interval: interval, last: now };
19
+ return method();
20
+ } else {
21
+ var throttled = $.throttle.throttling[method.toString()];
22
+ if (now - throttled.last < throttled.interval) {
23
+ return false;
24
+ } else {
25
+ $.throttle.throttling[method.toString()].last = now;
26
+ return method();
27
+ }
28
+ }
29
+ };
30
+
31
+ Shining = {
32
+ // slides
33
+ slides: {
34
+ length: function() { return this._slides.length },
35
+ current: function() {
36
+ if (arguments.length) {
37
+ this._current = this._slides.indexOf(arguments[0]);
38
+ return this.current();
39
+ } else {
40
+ return (typeof this._current == 'undefined' ? this._slides[0] : this._slides[this._current]);
41
+ }
42
+ },
43
+ all: function() { return this._slides },
44
+ first: function() { return this._slides[0] },
45
+ last: function() { return this._slides[ this._slides.length - 1 ] },
46
+ next: function() { return this._slides[ this._slides.indexOf(this.current()) + 1 ] },
47
+ previous: function() {
48
+ var previous = this._slides[ this._slides.indexOf(this.current()) - 1 ];
49
+ return previous ? previous : this.first();
50
+ },
51
+ add: function(slides) { return Array.prototype.push.apply(this._slides, slides) },
52
+ loaded: function(name) { return !!Shining.slides._loaded[name] },
53
+ _slides: [],
54
+ _loaded: {},
55
+ _current: 0
56
+ },
57
+
58
+ // public methods
59
+ firstSlide: function() { getSlide(Shining.slides.first()) },
60
+ lastSlide: function() { getSlide(Shining.slides.last() ) },
61
+ nextSlide: function() {
62
+ if (Shining.slides.next()) {
63
+ document.location.hash = Shining.slides.next();
64
+ trigger('next');
65
+ }
66
+ },
67
+ previousSlide: function() {
68
+ if (Shining.slides.previous()) {
69
+ document.location.hash = Shining.slides.previous();
70
+ trigger('previous');
71
+ }
72
+ },
73
+ getSlide: function(slide) { getSlide(slide) },
74
+ help: help,
75
+ init: init,
76
+ when: when,
77
+ trigger: trigger,
78
+ // slide scripts
79
+ scripts: {
80
+ LINE: /^(\d[.\d]*),[\s]*(.*)/,
81
+ parsed: [], processes: [],
82
+ nextSlide: function() { Shining.nextSlide() },
83
+ previousSlide: function() { Shining.previousSlide() },
84
+ at: function(seconds, method) {
85
+ Shining.scripts.processes.push(setTimeout(method, parseFloat(seconds) * 1000))
86
+ },
87
+ parse: function(script) {
88
+ var lines = script.split("\n"), tokens, parsed = [];
89
+ for (var i = 0; lines.length > i; i++) {
90
+ if (Shining.scripts.LINE.test(lines[i])) {
91
+ var tokens = lines[i].match(Shining.scripts.LINE);
92
+ var time = tokens[1], code = tokens[2];
93
+ parsed.push(time);
94
+ if (code.length) parsed.push(code);
95
+ } else {
96
+ if (isNaN(parsed[parsed.length - 1])) {
97
+ parsed[parsed.length - 1] += ("; " + lines[i]);
98
+ } else {
99
+ parsed.push(lines[i]);
100
+ }
101
+ }
102
+ }
103
+ return parsed;
104
+ },
105
+ run: function(script) {
106
+ if (typeof script == 'undefined' || script == '') return false;
107
+ var parsed = Shining.scripts.parse(script), all = [];
108
+ for (var i = 0; parsed.length > i; i += 2) {
109
+ all.push(["at(", parsed[i], ", function() { ", parsed[i+1], " })"].join(''));
110
+ }
111
+ with(Shining.scripts) { eval(all.join(';')) };
112
+ },
113
+ reap: function() {
114
+ $(Shining.scripts.processes).each(function() { clearTimeout(this) });
115
+ return Shining.scripts.processes = [];
116
+ }
117
+ }
118
+ };
119
+
120
+ function applyTransition(enter, leave) {
121
+ switch(Shining.config.transitions) {
122
+ case 'fade':
123
+ $('#stage').fadeOut(200, function() {
124
+ enter.call();
125
+ $('#stage').fadeIn(200, function() {
126
+ leave.call();
127
+ })
128
+ })
129
+ break;
130
+ case 'slide':
131
+ $('#stage').animate(
132
+ { opacity: 0, marginLeft: '-200' },
133
+ 200,
134
+ function() {
135
+ enter.call();
136
+ $('#stage')
137
+ .css({ marginLeft: null, marginRight: '-200px' })
138
+ .animate({ opacity: 1, marginRight: '0' }, 200, function() {
139
+ leave.call();
140
+ })
141
+ }
142
+ );
143
+ break;
144
+ case 'slice':
145
+ var width = $('#stage').width() / 10;
146
+ for (var i = 0; i <= 10; i++) {
147
+ $('#stage').append(
148
+ $('<div class="slice"></div>').css({
149
+ backgroundColor: $('body').css('background-color'),
150
+ left: (i * width) - 10
151
+ }).delay(i * 50).animate({width: width + 1})
152
+ );
153
+ }
154
+ setTimeout(enter, 900);
155
+ var reversed = Array.prototype.reverse.call($('#stage .slice'));
156
+ for (var i = 0; i < reversed.length; i++) {
157
+ $(reversed[i]).delay(i * 50).animate({width: '0'})
158
+ }
159
+ setTimeout(leave, 4200);
160
+ break;
161
+ default:
162
+ enter();
163
+ setTimeout(leave, 200);
164
+ break;
165
+ }
166
+ }
167
+
168
+ // For the "slice" transition
169
+ function slice() {
170
+ var width = $('#stage').width() / 10;
171
+ for (var i = 0; i <= 10; i++) {
172
+ $('#stage').append(
173
+ $('<div class="slice"></div>').css({
174
+ backgroundColor: $('body').css('background-color'),
175
+ left: (i * width) - 10
176
+ }).delay(i * 100).animate({width: width + 1})
177
+ );
178
+ }
179
+ }
180
+
181
+ function unslice() {
182
+ var reversed = Array.prototype.reverse.call($('#stage .slice'));
183
+ for (var i = 0; i < reversed.length; i++) {
184
+ $(reversed[i]).delay(i * 100).animate({width: '0'})
185
+ }
186
+ }
187
+
188
+ function help(message, duration) {
189
+ if (Shining.config.help == false) return false;
190
+ var duration = duration || 500;
191
+ $('#help').remove();
192
+ $('<div id="help"></div>')
193
+ .html(message)
194
+ .css({display: 'inline-block'})
195
+ .appendTo('body')
196
+ .animate({opacity: 1})
197
+ .delay(duration)
198
+ .fadeOut(200, function() { $('#help').remove() })
199
+ }
200
+
201
+ function local() { document.location.protocol == 'file:' }
202
+
203
+ function init() {
204
+ $(document).ready(function() {
205
+ $(window).resize(function(){
206
+ $('#stage').css({
207
+ position: 'absolute',
208
+ left: ($(window).width() - $('#stage').outerWidth()) / 2,
209
+ top: ($(window).height() - $('#stage').outerHeight()) / 2
210
+ });
211
+ });
212
+ bindKeys();
213
+ when('previous', function() { help('←') });
214
+ when('next', function() { help('→') });
215
+ loadConfig(function() {
216
+ loadPlugins();
217
+ var startAt = document.location.hash.replace('#', ''),
218
+ first = startAt ? startAt : Shining.slides.current();
219
+ loadSlide(first, function() { playSlide(first) });
220
+ if (!local() && !(Shining.config.help == false)) preloadSlides();
221
+ setTitle(Shining.config.title);
222
+ setTheme(Shining.config.theme);
223
+ trigger('init.shining');
224
+ help('← (previous slide), → or SPACE BAR (next slide)', 3000);
225
+ });
226
+ });
227
+ }
228
+
229
+ function trigger(event, data) { $(document).trigger(event + '.shining', data) }
230
+ function when(event, method) { $(document).bind(event + '.shining', method) }
231
+
232
+ function applyEffect(element, name) {
233
+ $(element).addClass(name);
234
+ }
235
+
236
+ function getSlide(name) {
237
+ if (!name) return false;
238
+ applyTransition(
239
+ function() { loadSlide(name, function() { playSlide(name) }) },
240
+ function() { Shining.scripts.run(Shining.slides._loaded[Shining.slides.current()].script) }
241
+ )
242
+ }
243
+
244
+ function setTitle(title) {
245
+ if (!title || title == '') return false;
246
+ $.browser.msie ? document.title = title : $('title').text(title);
247
+ }
248
+
249
+ function setTheme(name) {
250
+ if (!name || name == "default") { return false };
251
+ var path = $('link.theme').attr('href').replace('default.css', name + 'css');
252
+ return $('link.theme').attr('href', path);
253
+ }
254
+
255
+ function slide(name) {
256
+ return 'slides/' + name;
257
+ }
258
+
259
+ function loadSlide(name, afterLoad) {
260
+ if (!Shining.slides.loaded(name)) {
261
+ $.get(
262
+ slide(name).markup(),
263
+ function(data) {
264
+ Shining.slides._loaded[name] = {};
265
+ Shining.slides._loaded[name].markup = data;
266
+ if (data) {
267
+ loadSlideScript(name, afterLoad);
268
+ loadSlideStyle(name);
269
+ }
270
+ }
271
+ );
272
+ } else {
273
+ if ($.isFunction(afterLoad)) afterLoad.call();
274
+ loadSlideStyle(name);
275
+ }
276
+ }
277
+
278
+ function preloadSlides() {
279
+ $(Shining.config.slides).each(function() { loadSlide(this) })
280
+ }
281
+
282
+ function playSlide(name) {
283
+ var slide = Shining.slides._loaded[name];
284
+ Shining.slides.current(name);
285
+ $('#stage .contents').html(slide.markup);
286
+ trigger('slideplay');
287
+ $(window).trigger('resize');
288
+ Shining.scripts.run(slide.script);
289
+ }
290
+
291
+ function loadPlugins() {
292
+ if (Shining.config.plugins && Shining.config.plugins.length) {
293
+ $(Shining.config.plugins).each(function() {
294
+ $('head').append('<script type="text/javascript" src="' + pluginPath(this) + '"></script>');
295
+ })
296
+ }
297
+ }
298
+
299
+ function installPath() { return $('script[src$=shining.js]').attr('src').replace('/shining.js', '') }
300
+ function pluginPath(name) { return installPath() + '/plugins/' + name + '.js' }
301
+
302
+ function loadSlideScript(name, afterLoad) {
303
+ $.ajax({
304
+ url: slide(name).script(),
305
+ type: 'GET',
306
+ success: function(script) { Shining.slides._loaded[name].script = script },
307
+ complete: function() { if ($.isFunction(afterLoad)) afterLoad.call() }
308
+ })
309
+ }
310
+
311
+ function loadSlideStyle(name) {
312
+ $('link.slide').remove();
313
+ $('head').append('<link rel="stylesheet" type="text/css" href="' + slide(name).style() + '" media="all" class="slide"/>')
314
+ }
315
+
316
+ function loadConfig(callback) {
317
+ $.getJSON('config.json', function(config) {
318
+ Shining.config = config;
319
+ Shining.slides.add(config.slides);
320
+ callback.call();
321
+ });
322
+ }
323
+
324
+ function bindKeys() {
325
+ $(document).keydown(function(event) {
326
+ switch(event.keyCode) {
327
+ case KEY.RIGHT:
328
+ case KEY.SPACE:
329
+ Shining.nextSlide();
330
+ break;
331
+ case KEY.LEFT:
332
+ Shining.previousSlide();
333
+ break;
334
+ }
335
+ })
336
+ }
337
+
338
+ Shining.init();
339
+ })(jQuery);
340
+
341
+ // Dependencies!!
342
+ /*
343
+ * jQuery hashchange event - v1.2 - 2/11/2010
344
+ * http://benalman.com/projects/jquery-hashchange-plugin/
345
+ *
346
+ * Copyright (c) 2010 "Cowboy" Ben Alman
347
+ * Dual licensed under the MIT and GPL licenses.
348
+ * http://benalman.com/about/license/
349
+ */
350
+ (function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
351
+
352
+ $(window).bind('hashchange', function(event) {
353
+ var slide = document.location.hash.replace('#', '');
354
+ if (slide) { Shining.getSlide(slide) };
355
+ });
356
+
357
+ // IE Array.prototype.indexOf fix
358
+ if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elt,from){var len=this.length;var from=Number(arguments[1])||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++){if(from in this&&this[from]===elt)return from;} return-1;};}
data/lib/shining.rb CHANGED
@@ -8,7 +8,6 @@ require 'shining/player'
8
8
  require 'shining/heroku'
9
9
 
10
10
  module Shining
11
-
12
11
  class << self
13
12
  def say something
14
13
  STDOUT.puts(something) unless defined?(Spec) # shush when running tests
@@ -16,7 +15,7 @@ module Shining
16
15
  end
17
16
 
18
17
  def error message
19
- STDERR.puts red(bold(message))
18
+ STDERR.puts message
20
19
  end
21
20
 
22
21
  def root
@@ -47,4 +46,4 @@ This is a new slide. It needs some lovin'!
47
46
  end
48
47
  end
49
48
  end
50
- end
49
+ end
data/lib/shining/preso.rb CHANGED
@@ -16,6 +16,7 @@ class Preso
16
16
  if fresh
17
17
  new_dir dir
18
18
  copy_templates
19
+ vendorize!
19
20
  end
20
21
  @config = json(@path/'config.json')
21
22
  end
@@ -38,10 +39,9 @@ class Preso
38
39
  end
39
40
 
40
41
  def copy_templates
41
- %w(config.json slides).each do |template|
42
+ %w(config.json slides index.html).each do |template|
42
43
  copy Shining.templates_path/template, @path + '/'
43
44
  end
44
- new_file @path/'index.html' do erb(Shining.templates_path/'index.html') end
45
45
  true
46
46
  end
47
47
 
@@ -81,28 +81,14 @@ class Preso
81
81
 
82
82
  def vendorize!
83
83
  new_dir @path/'vendor'
84
- %w(lib css images themes).each do |required|
84
+ new_dir @path/'vendor'/'lib'
85
+ copy Shining.root/'lib'/'*.js', @path/'vendor'/'lib'
86
+ copy Shining.root/'lib'/'plugins', @path/'vendor'/'lib/'
87
+ %w(css images themes).each do |required|
85
88
  copy Shining.root/required, @path/'vendor/'
86
89
  end
87
- new_file @path/'index.html' do erb(Shining.templates_path/'index.html') end
88
90
  true
89
91
  end
90
-
91
- def vendorized?
92
- dir? @path/'vendor'
93
- end
94
-
95
- def unvendorize!
96
- delete! @path/'vendor'
97
- copy_templates
98
- end
99
-
100
- def vendorized?
101
- dir? @path/'vendor'/'lib' and
102
- dir? @path/'vendor'/'themes' and
103
- dir? @path/'vendor'/'css' and
104
- dir? @path/'vendor'/'images'
105
- end
106
92
  end
107
93
 
108
94
  end
data/shining.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shining}
8
- s.version = "1.2.0"
8
+ s.version = "1.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julio Cesar Ody"]
12
- s.date = %q{2010-04-23}
12
+ s.date = %q{2010-05-10}
13
13
  s.description = %q{Webkit + CSS + Javascript = awesome presos}
14
14
  s.email = %q{julio.ody@gmail.com}
15
15
  s.executables = ["console", "shine"]
@@ -35,16 +35,18 @@ Gem::Specification.new do |s|
35
35
  "lib/ext/filemethods.rb",
36
36
  "lib/ext/string.rb",
37
37
  "lib/jquery-1.4.1.min.js",
38
- "lib/jquery.shining.js",
39
- "lib/plugins/jquery.shining-audio-0.0.1.js",
38
+ "lib/plugins/resize.js",
39
+ "lib/plugins/syntaxhighlighter.js",
40
40
  "lib/shBrushAll.js",
41
41
  "lib/shCore.js",
42
+ "lib/shining.js",
42
43
  "lib/shining.rb",
43
44
  "lib/shining/heroku.rb",
44
45
  "lib/shining/player.rb",
45
46
  "lib/shining/preso.rb",
46
47
  "shining.gemspec",
47
48
  "spec/cli_spec.rb",
49
+ "spec/filemethods_spec.rb",
48
50
  "spec/generators_spec.rb",
49
51
  "spec/javascripts/dom.html",
50
52
  "spec/javascripts/rhino.js",
@@ -84,6 +86,7 @@ Gem::Specification.new do |s|
84
86
  s.summary = %q{Webkit + CSS + Javascript = awesome presos}
85
87
  s.test_files = [
86
88
  "spec/cli_spec.rb",
89
+ "spec/filemethods_spec.rb",
87
90
  "spec/generators_spec.rb",
88
91
  "spec/preso_spec.rb",
89
92
  "spec/spec_helper.rb"
data/spec/cli_spec.rb CHANGED
@@ -62,20 +62,13 @@ describe 'shine' do
62
62
  end
63
63
  end
64
64
 
65
- it "vendorizes Shining to #{PRESO/'vendor'} with the 'vendor' option" do
66
- vendorize
67
- %w(lib themes css).each do |required|
68
- File.exists?(PRESO/'vendor'/required).should be_true
69
- end
70
- end
71
-
72
65
  it "compiles a Haml template if there is one in #{'PRESO_ROOT'/'slides'/'test.haml'} with the 'compile' option" do
73
66
  make_haml_template! 'test'
74
67
  compile_templates
75
68
  File.read(PRESO/'slides'/'test.html').should == "<p>LOOK MA</p>\n"
76
69
  end
77
70
 
78
- describe 'go' do
71
+ context 'go' do
79
72
  it "for now it only works on Mac OSX" do
80
73
  player = Shining::Player.new Shining::Preso.open(PRESO)
81
74
  player.should_receive(:osx?).and_return(false)
@@ -0,0 +1,57 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe Shining::FileMethods do
4
+ include Shining::FileMethods
5
+
6
+ before :all do
7
+ TMP = Dir.tmpdir/'shining-tmp' unless defined?(TMP)
8
+ FileUtils.rm_rf TMP
9
+ FileUtils.mkdir_p TMP
10
+ end
11
+
12
+ before :each do
13
+ FileUtils.rm_rf TMP/'temp'
14
+ @preso = Shining::Preso.new TMP/'temp'
15
+ end
16
+
17
+ it '#file? returns true if the argument is a file' do
18
+ FileUtils.touch TMP/'temp'/'moo'
19
+ file?(TMP/'temp'/'moo').should be_true
20
+ end
21
+
22
+ it '#dir? returns true if the argument is a directory' do
23
+ FileUtils.mkdir TMP/'temp'/'adir'
24
+ dir?(TMP/'temp'/'adir').should be_true
25
+ end
26
+
27
+ context '#move and #copy' do
28
+ before do
29
+ FileUtils.mkdir TMP/'temp'/'dir1'
30
+ FileUtils.mkdir TMP/'temp'/'dir2'
31
+ FileUtils.touch TMP/'temp'/'dir1'/'jquery.js'
32
+ FileUtils.touch TMP/'temp'/'dir1'/'shining.js'
33
+ FileUtils.touch TMP/'temp'/'dir1'/'shining.rb'
34
+ end
35
+
36
+ it '#move moves specific files or directories from one directory to another' do
37
+ move TMP/'temp'/'dir1'/'jquery.js', TMP/'temp'/'dir2/'
38
+ File.exists?(TMP/'temp'/'dir2'/'jquery.js').should be_true
39
+ end
40
+
41
+ it '#move moves files by wildcard from another directory to another' do
42
+ move TMP/'temp'/'dir1'/'*.js', TMP/'temp'/'dir2/'
43
+ File.exists?(TMP/'temp'/'dir2'/'shining.js').should be_true
44
+ end
45
+
46
+ it '#copy copies specific files or directories from one directory to another' do
47
+ copy TMP/'temp'/'dir1'/'jquery.js', TMP/'temp'/'dir2/'
48
+ File.exists?(TMP/'temp'/'dir2'/'jquery.js').should be_true
49
+ end
50
+
51
+ it '#copy copies files by wildcard from another directory to another' do
52
+ copy TMP/'temp'/'dir1'/'*.js', TMP/'temp'/'dir2/'
53
+ File.exists?(TMP/'temp'/'dir2'/'shining.js').should be_true
54
+ end
55
+ end
56
+
57
+ end
@@ -7,7 +7,7 @@
7
7
  <script src="../../lib/jquery-1.4.1.min.js"></script>
8
8
  <script src="../../lib/shCore.js"></script>
9
9
  <script src="../../lib/shBrushAll.js"></script>
10
- <script src="../../lib/jquery.shining.js"></script>
10
+ <script src="../../lib/shining.js"></script>
11
11
  <script>
12
12
  function runSuites() {
13
13
  JSpec
@@ -23,36 +23,36 @@ describe 'Shining'
23
23
 
24
24
  describe "config file"
25
25
  it 'gets read when shining gets loaded'
26
- $.shining.config.constructor.should.be Object
26
+ Shining.config.constructor.should.be Object
27
27
  end
28
28
  end
29
29
 
30
30
  describe "slides"
31
31
  it '#current() returns the first slide by default'
32
- $.shining.slides.current().should.be 'welcome'
32
+ Shining.slides.current().should.be 'welcome'
33
33
  end
34
34
 
35
35
  it '#current("slide1") sets the current slide to "slide1"'
36
- $.shining.slides.current('slide1')
37
- $.shining.slides.current().should.be 'slide1'
36
+ Shining.slides.current('slide1')
37
+ Shining.slides.current().should.be 'slide1'
38
38
  end
39
39
 
40
40
  it "#last() returns the last slide in the slides array"
41
- $.shining.slides.last().should.be 'slide2'
41
+ Shining.slides.last().should.be 'slide2'
42
42
  end
43
43
  end
44
44
 
45
45
  describe 'navigating slides'
46
- it 'navigates to slide1 on $.shining.nextSlide()'
47
- $.shining.slides.current('welcome')
46
+ it 'navigates to slide1 on Shining.nextSlide()'
47
+ Shining.slides.current('welcome')
48
48
  mockRequest().and_return('<h1>Slide1</h1>');
49
- $.shining.nextSlide();
49
+ Shining.nextSlide();
50
50
  $('#stage .contents h1').text().should.be 'Slide1'
51
51
  end
52
52
 
53
- it 'navigates to slide2 on $.shining.nextSlide()'
53
+ it 'navigates to slide2 on Shining.nextSlide()'
54
54
  mockRequest().and_return('<h1>Slide2</h1>');
55
- $.shining.nextSlide();
55
+ Shining.nextSlide();
56
56
  $('#stage .contents h1').text().should.be 'Slide2'
57
57
  end
58
58
  end
data/spec/preso_spec.rb CHANGED
@@ -18,11 +18,13 @@ describe 'Shining::Preso' do
18
18
  File.directory?(TMP/'temp').should be_true
19
19
  end
20
20
 
21
- it "copies an initial set of templates to the presentation folder" do
22
- (File.exists?(TMP/'temp'/'config.json')
23
- File.exists?(TMP/'temp'/'index.html')
24
- File.directory?(TMP/'temp'/'slides')
25
- File.exists?(TMP/'temp'/'slides'/'welcome.html')).should be_true
21
+ it "copies everything necessary to run the preso to the target folder" do
22
+ %w(lib themes css).each do |required|
23
+ File.directory?(TMP/'temp'/'vendor'/required).should be_true
24
+ end
25
+ %w(config.json index.html slides/welcome.html).each do |required|
26
+ File.exists?(TMP/'temp'/required).should be_true
27
+ end
26
28
  end
27
29
  end
28
30
 
@@ -37,33 +39,6 @@ describe 'Shining::Preso' do
37
39
  end
38
40
  end
39
41
 
40
- describe 'vendorization' do
41
- before do
42
- @preso.vendorize!
43
- end
44
-
45
- it "#vendorize! copies everything necessary for the presentation to run without the gem being installed" do
46
- (File.directory?(@preso.path/'vendor'/'lib') and
47
- File.directory?(@preso.path/'vendor'/'themes') and
48
- File.directory?(@preso.path/'vendor'/'css') and
49
- File.directory?(@preso.path/'vendor'/'images')).should be_true
50
- end
51
-
52
- it "returns true on #vendorized? if a presentation is vendorized, false when not" do
53
- @preso.vendorized?.should be_true
54
- File.read(@preso.path/'index.html').should =~ /vendor\/lib/
55
- end
56
-
57
- it "\"unvendorizes\" a gem on #unvendorize!" do
58
- @preso.unvendorize!
59
- (File.directory?(@preso.path/'vendor'/'lib') and
60
- File.directory?(@preso.path/'vendor'/'themes') and
61
- File.directory?(@preso.path/'vendor'/'css') and
62
- File.directory?(@preso.path/'vendor'/'images')).should be_false
63
- File.read(@preso.path/'index.html').should_not =~ /vendor\/lib/
64
- end
65
- end
66
-
67
42
  describe 'config' do
68
43
  it "#config(true) force loads from config.json" do
69
44
  @preso.should_receive :json
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "slides": ["welcome"],
3
3
  "title": "Your presentation",
4
+ "plugins": ["resize", "syntaxhighlighter"],
4
5
  "transitions": "fade"
5
6
  }
data/templates/index.html CHANGED
@@ -2,20 +2,20 @@
2
2
  <html>
3
3
  <head>
4
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
- <title>Genesis</title>
6
- <link rel="stylesheet" type="text/css" href="<%= vendorized? ? 'vendor' : Shining.root %>/css/base.css" media="all"/>
7
- <link rel="stylesheet" type="text/css" href="<%= vendorized? ? 'vendor' : Shining.root %>/css/effects.css" media="all"/>
8
- <link rel="stylesheet" type="text/css" href="<%= vendorized? ? 'vendor' : Shining.root %>/css/shCore.css" media="all"/>
9
- <link rel="stylesheet" type="text/css" href="<%= vendorized? ? 'vendor' : Shining.root %>/css/shThemeFadeToGrey.css" media="all"/>
10
- <link rel="stylesheet" type="text/css" href="<%= vendorized? ? 'vendor' : Shining.root %>/themes/default.css" media="all" class="theme"/>
11
- <script type="text/javascript" charset="utf-8" src="<%= vendorized? ? 'vendor' : Shining.root %>/lib/jquery-1.4.1.min.js"></script>
12
- <script type="text/javascript" charset="utf-8" src="<%= vendorized? ? 'vendor' : Shining.root %>/lib/shCore.js"></script>
13
- <script type="text/javascript" charset="utf-8" src="<%= vendorized? ? 'vendor' : Shining.root %>/lib/shBrushAll.js"></script>
14
- <script type="text/javascript" charset="utf-8" src="<%= vendorized? ? 'vendor' : Shining.root %>/lib/jquery.shining.js"></script>
5
+ <title>Your presentation</title>
6
+ <link rel="stylesheet" type="text/css" href="vendor/css/base.css" media="all"/>
7
+ <link rel="stylesheet" type="text/css" href="vendor/css/effects.css" media="all"/>
8
+ <link rel="stylesheet" type="text/css" href="vendor/css/shCore.css" media="all"/>
9
+ <link rel="stylesheet" type="text/css" href="vendor/css/shThemeFadeToGrey.css" media="all"/>
10
+ <link rel="stylesheet" type="text/css" href="vendor/themes/default.css" media="all" class="theme"/>
11
+ <script type="text/javascript" charset="utf-8" src="vendor/lib/jquery-1.4.1.min.js"></script>
12
+ <script type="text/javascript" charset="utf-8" src="vendor/lib/shCore.js"></script>
13
+ <script type="text/javascript" charset="utf-8" src="vendor/lib/shBrushAll.js"></script>
14
+ <script type="text/javascript" charset="utf-8" src="vendor/lib/shining.js"></script>
15
15
  </head>
16
16
  <body>
17
17
  <div id="stage">
18
18
  <div class="contents"></div>
19
19
  </div>
20
20
  </body>
21
- </html>
21
+ </html>
data/themes/default.css CHANGED
@@ -10,15 +10,8 @@ body {
10
10
  border-radius: 5px;
11
11
  }
12
12
 
13
- h1, h2, h3, p, li {
14
- color: #EEEEEE;
15
- text-shadow: #000 2px 2px 4px
16
- }
17
- a {
18
- color: #499DFF;
19
- text-decoration: none
20
- }
21
- ul { list-style-type: disc }
22
-
23
- em { color: rgb(73, 255, 80) }
24
- strong { color: rgb(255, 171, 73); font-weight: bold }
13
+ h1, h2, h3, p, li { color: #EEEEEE; text-shadow: #000 2px 2px 4px }
14
+ a { color: #499DFF; text-decoration: none }
15
+ ul { list-style-type: disc }
16
+ em { color: #4BFF50 }
17
+ strong { color: #FFAB49; font-weight: bold }
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 1.2.0
9
+ version: 1.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Julio Cesar Ody
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-23 00:00:00 +10:00
17
+ date: 2010-05-10 00:00:00 +10:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -156,16 +156,18 @@ files:
156
156
  - lib/ext/filemethods.rb
157
157
  - lib/ext/string.rb
158
158
  - lib/jquery-1.4.1.min.js
159
- - lib/jquery.shining.js
160
- - lib/plugins/jquery.shining-audio-0.0.1.js
159
+ - lib/plugins/resize.js
160
+ - lib/plugins/syntaxhighlighter.js
161
161
  - lib/shBrushAll.js
162
162
  - lib/shCore.js
163
+ - lib/shining.js
163
164
  - lib/shining.rb
164
165
  - lib/shining/heroku.rb
165
166
  - lib/shining/player.rb
166
167
  - lib/shining/preso.rb
167
168
  - shining.gemspec
168
169
  - spec/cli_spec.rb
170
+ - spec/filemethods_spec.rb
169
171
  - spec/generators_spec.rb
170
172
  - spec/javascripts/dom.html
171
173
  - spec/javascripts/rhino.js
@@ -229,6 +231,7 @@ specification_version: 3
229
231
  summary: Webkit + CSS + Javascript = awesome presos
230
232
  test_files:
231
233
  - spec/cli_spec.rb
234
+ - spec/filemethods_spec.rb
232
235
  - spec/generators_spec.rb
233
236
  - spec/preso_spec.rb
234
237
  - spec/spec_helper.rb
@@ -1,361 +0,0 @@
1
- (function($) {
2
- $.shining = function() {
3
- $.shining.slides = {
4
- length: function() { return this._slides.length },
5
- current: function() {
6
- if (arguments.length) {
7
- this._current = this._slides.indexOf(arguments[0]);
8
- return this.current();
9
- } else {
10
- return (typeof this._current == 'undefined' ? this._slides[0] : this._slides[this._current]);
11
- }
12
- },
13
- all: function() { return this._slides },
14
- first: function() { return this._slides[0] },
15
- last: function() { return this._slides[ this._slides.length - 1 ] },
16
- next: function() {
17
- window.sli = this._slides;
18
- return this._slides[ this._slides.indexOf(this.current()) + 1 ]
19
- },
20
- previous: function() {
21
- var previous = this._slides[ this._slides.indexOf(this.current()) - 1 ];
22
- return previous ? previous : this.first();
23
- },
24
- add: function(slides) { return Array.prototype.push.apply(this._slides, slides) },
25
- loaded: function(name) { return !!$.shining.slides._loaded[name] },
26
- _slides: [],
27
- _loaded: {},
28
- _current: 0
29
- };
30
-
31
- function applyTransition(enter, leave) {
32
- switch($.shining.config.transitions) {
33
- case 'fade':
34
- $('#stage').fadeOut(200, function() {
35
- enter.call();
36
- $('#stage').fadeIn(200, function() {
37
- leave.call();
38
- })
39
- })
40
- break;
41
- case 'slide':
42
- $('#stage').animate(
43
- { opacity: 0, marginLeft: '-200' },
44
- 200,
45
- function() {
46
- enter.call();
47
- $('#stage')
48
- .css({ marginLeft: null, marginRight: '-200px' })
49
- .animate({ opacity: 1, marginRight: '0' }, 200, function() {
50
- leave.call();
51
- })
52
- }
53
- );
54
- break;
55
- case 'slice':
56
- var width = $('#stage').width() / 10;
57
- for (var i = 0; i <= 10; i++) {
58
- $('#stage').append(
59
- $('<div class="slice"></div>').css({
60
- backgroundColor: $('body').css('background-color'),
61
- left: (i * width) - 10
62
- }).delay(i * 50).animate({width: width + 1})
63
- );
64
- }
65
- setTimeout(enter, 900);
66
- var reversed = Array.prototype.reverse.call($('#stage .slice'));
67
- for (var i = 0; i < reversed.length; i++) {
68
- $(reversed[i]).delay(i * 50).animate({width: '0'})
69
- }
70
- setTimeout(leave, 4200);
71
- break;
72
- default:
73
- enter();
74
- setTimeout(leave, 200);
75
- break;
76
- }
77
- }
78
-
79
- function slice() {
80
- var width = $('#stage').width() / 10;
81
- for (var i = 0; i <= 10; i++) {
82
- $('#stage').append(
83
- $('<div class="slice"></div>').css({
84
- backgroundColor: $('body').css('background-color'),
85
- left: (i * width) - 10
86
- }).delay(i * 100).animate({width: width + 1})
87
- );
88
- }
89
- }
90
-
91
- function unslice() {
92
- var reversed = Array.prototype.reverse.call($('#stage .slice'));
93
- for (var i = 0; i < reversed.length; i++) {
94
- $(reversed[i]).delay(i * 100).animate({width: '0'})
95
- }
96
- }
97
-
98
- String.prototype.markup = function() { return this + '.html' };
99
- String.prototype.script = function() { return this + '.js' };
100
- String.prototype.style = function() { return this + '.css' };
101
-
102
- var KEY = { SPACE: 32, RIGHT: 39, LEFT: 37 };
103
-
104
- $.fn.effect = function(name) { return this.each(function() { applyEffect(this, name) }); };
105
- $.fn.hasClasses = function(classes) {
106
- var classes = classes.split(/\s+/), yes = true, element = this.get(0);
107
- for (var i = 0; i < classes.length && yes; i++) { yes = $(element).hasClass(classes[i]) }
108
- return yes;
109
- }
110
-
111
- $.extend($.shining, {
112
- firstSlide: function() { getSlide($.shining.slides.first()) },
113
- lastSlide: function() { getSlide($.shining.slides.last() ) },
114
- nextSlide: function() {
115
- if ($.shining.slides.next()) {
116
- document.location.hash = $.shining.slides.next();
117
- trigger('next');
118
- }
119
- },
120
- previousSlide: function() {
121
- if ($.shining.slides.previous()) {
122
- document.location.hash = $.shining.slides.previous();
123
- trigger('previous');
124
- }
125
- },
126
- getSlide: function(slide) { getSlide(slide) },
127
- help: help
128
- });
129
-
130
- var FILTERS = {
131
- // reads: "fades-out" can be achieved by removing "fades-in" if the element hasClass "transparent"
132
- 'fades-out': { remove: 'fades-in', when: 'fades-in transparent' }
133
- }
134
-
135
- function init() {
136
- $(document).ready(function() {
137
- $(window).resize(function() { $('#stage').centralize() });
138
- $('#stage').centralize();
139
- bindKeys();
140
- loadConfig(function() {
141
- var startAt = document.location.hash.replace('#', ''),
142
- first = startAt ? startAt : $.shining.slides.current();
143
- loadSlide(first, function() { playSlide(first) });
144
- if (!local() && !($.shining.config.help == false)) preloadSlides();
145
- setTitle($.shining.config.title);
146
- setTheme($.shining.config.theme);
147
- trigger('init.shining');
148
- help('← (previous slide), → or SPACE BAR (next slide)', 3000);
149
- });
150
- });
151
- }
152
-
153
- function trigger(event, data) {
154
- $(document).trigger(event + '.shining', data);
155
- }
156
-
157
- function bind(event, method) {
158
- $(document).bind(event + '.shining', method);
159
- }
160
-
161
- function applyEffect(element, name) {
162
- if (name in FILTERS) {
163
- if ($(element).hasClasses(FILTERS[name].when)) $(element).removeClass(FILTERS[name].remove)
164
- } else {
165
- $(element).addClass(name);
166
- }
167
- }
168
-
169
- function getSlide(name) {
170
- if (!name) return false;
171
- applyTransition(
172
- function() { loadSlide(name, function() { playSlide(name) }) },
173
- function() {
174
- $.shining.scripts.run($.shining.slides._loaded[$.shining.slides.current()].script)
175
- }
176
- )
177
- }
178
-
179
- function setTitle(title) {
180
- if (!title || title == '') return false;
181
- $.browser.msie ? document.title = title : $('title').text(title);
182
- }
183
-
184
- function setTheme(name) {
185
- if (!name || name == "default") { return false };
186
- var path = $('link.theme').attr('href').replace('default.css', name + 'css');
187
- return $('link.theme').attr('href', path);
188
- }
189
-
190
- function slide(name) {
191
- return 'slides/' + name;
192
- }
193
-
194
- function loadSlide(name, afterLoad) {
195
- if (!$.shining.slides.loaded(name)) {
196
- $.get(
197
- slide(name).markup(),
198
- function(data) {
199
- $.shining.slides._loaded[name] = {};
200
- $.shining.slides._loaded[name].markup = data;
201
- if (data) {
202
- loadSlideScript(name, afterLoad);
203
- loadSlideStyle(name);
204
- }
205
- }
206
- );
207
- } else {
208
- if ($.isFunction(afterLoad)) afterLoad.call();
209
- loadSlideStyle(name);
210
- }
211
- }
212
-
213
- function preloadSlides() {
214
- $($.shining.config.slides).each(function() {
215
- loadSlide(this);
216
- })
217
- }
218
-
219
- function playSlide(name) {
220
- var slide = $.shining.slides._loaded[name];
221
- $('#stage .contents').html(slide.markup);
222
- $.shining.scripts.run(slide.script);
223
- }
224
-
225
- function loadSlideScript(name, afterLoad) {
226
- $.ajax({
227
- url: slide(name).script(),
228
- type: 'GET',
229
- success: function(script) {
230
- $.shining.slides._loaded[name].script = script;
231
- },
232
- complete: function() {
233
- if ($.isFunction(afterLoad)) afterLoad.call();
234
- }
235
- })
236
- }
237
-
238
- function loadSlideStyle(name) {
239
- $('link.slide').remove();
240
- $('head').append('<link rel="stylesheet" type="text/css" href="' + slide(name).style() + '" media="all" class="slide"/>')
241
- }
242
-
243
- function loadConfig(callback) {
244
- $.getJSON('config.json', function(config) {
245
- $.shining.config = config;
246
- $.shining.slides.add(config.slides);
247
- callback.call();
248
- });
249
- }
250
-
251
- function bindKeys() {
252
- $(document).keydown(function(event) {
253
- switch(event.keyCode) {
254
- case KEY.RIGHT:
255
- case KEY.SPACE:
256
- $.shining.nextSlide();
257
- break;
258
- case KEY.LEFT:
259
- $.shining.previousSlide();
260
- break;
261
- }
262
- })
263
- }
264
-
265
- function help(message, duration) {
266
- if ($.shining.config.help == false) return false;
267
- var duration = duration || 500;
268
- $('#help').remove();
269
- $('<div id="help"></div>')
270
- .html(message)
271
- .css({display: 'inline-block'})
272
- .appendTo('body')
273
- .animate({opacity: 1})
274
- .delay(duration)
275
- .fadeOut(200, function() { $('#help').remove() })
276
- }
277
-
278
- function local() {
279
- document.location.protocol == 'file:'
280
- }
281
-
282
- $.shining.scripts = {
283
- LINE: /^(\d[.\d]*),[\s]*(.*)/,
284
- parsed: [], processes: [],
285
- nextSlide: function() { $.shining.nextSlide() },
286
- previousSlide: function() { $.shining.previousSlide() },
287
- at: function(seconds, method) {
288
- $.shining.scripts.processes.push(setTimeout(method, parseFloat(seconds) * 1000))
289
- },
290
- parse: function(script) {
291
- var lines = script.split("\n"), tokens, parsed = [];
292
- for (var i = 0; lines.length > i; i++) {
293
- if ($.shining.scripts.LINE.test(lines[i])) {
294
- var tokens = lines[i].match($.shining.scripts.LINE);
295
- var time = tokens[1], code = tokens[2];
296
- parsed.push(time);
297
- if (code.length) parsed.push(code);
298
- } else {
299
- if (isNaN(parsed[parsed.length - 1])) {
300
- parsed[parsed.length - 1] += ("; " + lines[i]);
301
- } else {
302
- parsed.push(lines[i]);
303
- }
304
- }
305
- }
306
- return parsed;
307
- },
308
- run: function(script) {
309
- if (typeof script == 'undefined' || script == '') return false;
310
- var parsed = $.shining.scripts.parse(script), all = [];
311
- for (var i = 0; parsed.length > i; i += 2) {
312
- all.push(["at(", parsed[i], ", function() { ", parsed[i+1], " })"].join(''));
313
- }
314
- with($.shining.scripts) { eval(all.join(';')) };
315
- },
316
- reap: function() {
317
- $($.shining.scripts.processes).each(function() { clearTimeout(this) });
318
- return $.shining.scripts.processes = [];
319
- }
320
- }
321
-
322
- bind('previous', function() { help('←') });
323
- bind('next', function() { help('→') });
324
-
325
- init();
326
- }
327
- // boots!
328
- $.shining();
329
- })(jQuery);
330
-
331
- // Dependencies!!
332
-
333
- /*
334
- * JSizes - JQuery plugin v0.33
335
- *
336
- * Licensed under the revised BSD License.
337
- * Copyright 2008-2010 Bram Stein
338
- * All rights reserved.
339
- */
340
- (function(b){var a=function(c){return parseInt(c,10)||0};b.each(["min","max"],function(d,c){b.fn[c+"Size"]=function(g){var f,e;if(g){if(g.width!==undefined){this.css(c+"-width",g.width)}if(g.height!==undefined){this.css(c+"-height",g.height)}return this}else{f=this.css(c+"-width");e=this.css(c+"-height");return{width:(c==="max"&&(f===undefined||f==="none"||a(f)===-1)&&Number.MAX_VALUE)||a(f),height:(c==="max"&&(e===undefined||e==="none"||a(e)===-1)&&Number.MAX_VALUE)||a(e)}}}});b.fn.isVisible=function(){return this.is(":visible")};b.each(["border","margin","padding"],function(d,c){b.fn[c]=function(e){if(e){if(e.top!==undefined){this.css(c+"-top"+(c==="border"?"-width":""),e.top)}if(e.bottom!==undefined){this.css(c+"-bottom"+(c==="border"?"-width":""),e.bottom)}if(e.left!==undefined){this.css(c+"-left"+(c==="border"?"-width":""),e.left)}if(e.right!==undefined){this.css(c+"-right"+(c==="border"?"-width":""),e.right)}return this}else{return{top:a(this.css(c+"-top"+(c==="border"?"-width":""))),bottom:a(this.css(c+"-bottom"+(c==="border"?"-width":""))),left:a(this.css(c+"-left"+(c==="border"?"-width":""))),right:a(this.css(c+"-right"+(c==="border"?"-width":"")))}}}})})(jQuery);
341
-
342
- // centralizes an element vertically
343
- (function($){$.fn.centralize=function(){var self=this.get(0);windowHeight=document.documentElement.clientHeight,elementHeight=(self.offsetHeight+$(self).padding().top+$(self).padding().bottom);$(self).css('position','relative').css('top',(windowHeight/2)-(elementHeight/2)+'px');};})(jQuery);
344
-
345
- /*
346
- * jQuery hashchange event - v1.2 - 2/11/2010
347
- * http://benalman.com/projects/jquery-hashchange-plugin/
348
- *
349
- * Copyright (c) 2010 "Cowboy" Ben Alman
350
- * Dual licensed under the MIT and GPL licenses.
351
- * http://benalman.com/about/license/
352
- */
353
- (function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
354
-
355
- // IE Array.prototype.indexOf fix
356
- if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elt,from){var len=this.length;var from=Number(arguments[1])||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++){if(from in this&&this[from]===elt)return from;} return-1;};}
357
-
358
- $(window).bind('hashchange', function(event) {
359
- var slide = document.location.hash.replace('#', '');
360
- if (slide) { $.shining.getSlide(slide) };
361
- });
File without changes