showoff 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.txt CHANGED
@@ -19,6 +19,7 @@ It can:
19
19
  * bullets with incremental advancing
20
20
  * re-enact command line interactions
21
21
  * call up a menu of sections/slides at any time to jump around
22
+ * execute javascript or ruby live and display results
22
23
 
23
24
  It might will can:
24
25
 
@@ -102,6 +103,8 @@ Some useful styles for each slide are:
102
103
  will incrementally update elements on arrow key rather than switch slides
103
104
  * small - make all slide text 80%
104
105
  * smaller - make all slide text 70%
106
+ * execute - on ruby or js highlighted code slides, you can click on the code
107
+ to execute it and display the results on the slide
105
108
 
106
109
  Check out the example directory included to see examples of most of these.
107
110
 
data/lib/showoff.rb CHANGED
@@ -146,5 +146,10 @@ class ShowOff < Sinatra::Application
146
146
  end
147
147
  data
148
148
  end
149
+
150
+ post '/code' do
151
+ rv = eval(params[:code])
152
+ return rv.to_s
153
+ end
149
154
 
150
155
  end
@@ -188,4 +188,22 @@ a.fg-button { float:left; }
188
188
  .code .vc { color: #008080 } /* Name.Variable.Class */
189
189
  .code .vg { color: #008080 } /* Name.Variable.Global */
190
190
  .code .vi { color: #008080 } /* Name.Variable.Instance */
191
- .code .il { color: #009999 } /* Literal.Number.Integer.Long */
191
+ .code .il { color: #009999 } /* Literal.Number.Integer.Long */
192
+
193
+ .results {
194
+ background-color:#002200;
195
+ color:#00AA00;
196
+ font-size:2em;
197
+ border:2px solid black;
198
+ position: fixed;
199
+ top:0px;
200
+ width:100%;
201
+ padding:15px;
202
+ margin:0px;
203
+ font-family: monospace;
204
+ }
205
+
206
+ .executing {
207
+ color:#0000FF !important;
208
+ background-color: yellow;
209
+ }
@@ -0,0 +1,109 @@
1
+ (function($) {
2
+
3
+ function print_array(obj, opts) {
4
+ var result = [];
5
+ for (var i = 0; i < Math.min(opts.max_array, obj.length); i++)
6
+ result.push($.print(obj[i], $.extend({}, opts, { max_array: 3, max_string: 40 })));
7
+
8
+ if (obj.length > opts.max_array)
9
+ result.push((obj.length - opts.max_array) + ' more...');
10
+ if (result.length == 0) return "[]"
11
+ return "[ " + result.join(", ") + " ]";
12
+ }
13
+
14
+ function print_element(obj) {
15
+ if (obj.nodeType == 1) {
16
+ var result = [];
17
+ var properties = [ 'className', 'id' ];
18
+ var extra = {
19
+ 'input': ['type', 'name', 'value'],
20
+ 'a': ['href', 'target'],
21
+ 'form': ['method', 'action'],
22
+ 'script': ['src'],
23
+ 'link': ['href'],
24
+ 'img': ['src']
25
+ };
26
+
27
+ $.each(properties.concat(extra[obj.tagName.toLowerCase()] || []), function(){
28
+ if (obj[this])
29
+ result.push(' ' + this.replace('className', 'class') + "=" + $.print(obj[this]))
30
+ });
31
+ return "<" + obj.tagName.toLowerCase()
32
+ + result.join('') + ">";
33
+ }
34
+ }
35
+
36
+ function print_object(obj, opts) {
37
+ var seen = opts.seen || [ obj ];
38
+
39
+ var result = [], key, value;
40
+ for (var k in obj) {
41
+ if (obj.hasOwnProperty(k) && $.inArray(obj[k], seen) < 0) {
42
+ seen.push(obj[k]);
43
+ value = $.print(obj[k], $.extend({}, opts, { max_array: 6, max_string: 40, seen: seen }));
44
+ } else
45
+ value = "...";
46
+ result.push(k + ": " + value);
47
+ }
48
+ if (result.length == 0) return "{}";
49
+ return "{ " + result.join(", ") + " }";
50
+ }
51
+
52
+ function print_string(value, opts) {
53
+ var character_substitutions = {
54
+ '\b': '\\b',
55
+ '\t': '\\t',
56
+ '\n': '\\n',
57
+ '\f': '\\f',
58
+ '\r': '\\r',
59
+ '"' : '\\"',
60
+ '\\': '\\\\'
61
+ };
62
+ var r = /["\\\x00-\x1f\x7f-\x9f]/g;
63
+
64
+ var str = r.test(value)
65
+ ? value.replace(r, function (a) {
66
+ var c = character_substitutions[a];
67
+ if (c) return c;
68
+ c = a.charCodeAt();
69
+ return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
70
+ })
71
+ : value;
72
+ if (str.length > opts.max_string)
73
+ return str.slice(0, opts.max_string + 1) + '...';
74
+ else
75
+ return str;
76
+ }
77
+
78
+ $.print = function(obj, options) {
79
+ var opts = $.extend({}, { max_array: 10, max_string: 100 }, options);
80
+
81
+ if (typeof obj == 'undefined')
82
+ return "undefined";
83
+ else if (typeof obj == 'boolean')
84
+ return obj.toString();
85
+ else if (typeof obj == 'number')
86
+ return obj.toString();
87
+ else if (!obj)
88
+ return "null";
89
+ else if (typeof obj == 'string')
90
+ return print_string(obj, opts);
91
+ else if (obj instanceof RegExp)
92
+ return obj.toString();
93
+ else if (obj instanceof Array || obj.callee || obj.item)
94
+ return print_array(obj, opts);
95
+ else if (typeof obj == 'function' || obj instanceof Function)
96
+ return obj.toString().match(/^([^)]*\))/)[1];
97
+ else if (obj.nodeType)
98
+ return print_element(obj);
99
+ else if (obj instanceof jQuery)
100
+ return "$(" + $.print(obj.get()) + ")";
101
+ else if (obj instanceof Error)
102
+ return print_object(obj, $.extend({}, options, { max_string: 200 }));
103
+ else if (obj instanceof Object)
104
+ return print_object(obj, opts);
105
+ else
106
+ return obj.toString().replace(/\n\s*/g, '');
107
+ }
108
+
109
+ })(jQuery);
data/public/js/showoff.js CHANGED
@@ -94,12 +94,14 @@ function showSlide(back_step) {
94
94
  // TODO: calculate and set the height margins on slide load, not here
95
95
 
96
96
  $("#preso").html(slides.eq(slidenum).clone())
97
- $("#slideInfo").text((slidenum + 1) + ' / ' + slideTotal)
98
97
  curr_slide = $("#preso > .slide")
99
98
  var slide_height = curr_slide.height()
100
99
  var mar_top = (0.5 * parseFloat($("#preso").height())) - (0.5 * parseFloat(slide_height))
101
100
  $("#preso > .slide").css('margin-top', mar_top)
102
101
 
102
+ percent = Math.ceil(((slidenum + 1) / slideTotal) * 100)
103
+ $("#slideInfo").text((slidenum + 1) + '/' + slideTotal + ' - ' + percent + '%')
104
+
103
105
  if(!back_step) {
104
106
  // determine if there are incremental bullets to show
105
107
  // unless we are moving backward
@@ -108,6 +110,8 @@ function showSlide(back_step) {
108
110
  incrCurr = 0
109
111
  incrSteps = 0
110
112
  }
113
+
114
+ removeResults()
111
115
  }
112
116
 
113
117
  function determineIncremental()
@@ -204,6 +208,10 @@ function keyDown(event)
204
208
  {
205
209
  $('#footer').toggle()
206
210
  }
211
+ else if (key == 27) // esc
212
+ {
213
+ removeResults();
214
+ }
207
215
  return true
208
216
  }
209
217
 
@@ -252,3 +260,43 @@ function ListMenuItem(t, s)
252
260
  this.slide = s
253
261
  this.textName = t
254
262
  }
263
+
264
+ var removeResults = function() {
265
+ $('.results').remove();
266
+ };
267
+
268
+ var print = function(text) {
269
+ removeResults();
270
+ var _results = $('<div>').addClass('results').text($.print(text));
271
+ $('body').append(_results);
272
+ _results.click(removeResults);
273
+ };
274
+
275
+ var executeJavaScript = function() {
276
+ result = null;
277
+ var codeDiv = $(this);
278
+ codeDiv.addClass("executing");
279
+ eval(codeDiv.text());
280
+ setTimeout(function() { codeDiv.removeClass("executing");}, 250 );
281
+ if (result != null) print(result);
282
+ };
283
+
284
+ var executeRuby = function() {
285
+ result = null;
286
+ var codeDiv = $(this);
287
+ codeDiv.addClass("executing");
288
+ $.ajax({
289
+ type: 'POST',
290
+ url: "/code",
291
+ data: {code: codeDiv.text()},
292
+ success: function(data) {
293
+ result = data;
294
+ if (result) print(result);
295
+ },
296
+ dataType: 'html'
297
+ });
298
+ setTimeout(function() { codeDiv.removeClass("executing");}, 250 );
299
+ };
300
+
301
+ $('.execute > .sh_javaScript code').live("click", executeJavaScript);
302
+ $('.execute > .sh_ruby code').live("click", executeRuby);
data/views/index.erb CHANGED
@@ -10,6 +10,7 @@
10
10
  <link rel="stylesheet" href="css/showoff.css" type="text/css"/>
11
11
 
12
12
  <script type="text/javascript" src="/js/jquery-1.4.min.js"></script>
13
+ <script type="text/javascript" src="/js/jquery-print.js"></script>
13
14
  <script type="text/javascript" src="/js/fg.menu.js"></script>
14
15
  <script type="text/javascript" src="/js/showoff.js"></script>
15
16
  <script type="text/javascript" src="/js/jTypeWriter.js"> </script>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: showoff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon
@@ -99,6 +99,7 @@ files:
99
99
  - public/css/theme/ui.theme.css
100
100
  - public/js/fg.menu.js
101
101
  - public/js/jquery-1.4.min.js
102
+ - public/js/jquery-print.js
102
103
  - public/js/jTypeWriter.js
103
104
  - public/js/sh_lang/sh_bison.min.js
104
105
  - public/js/sh_lang/sh_c.min.js