showoff 0.15.2 → 0.15.3
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.
- checksums.yaml +4 -4
- data/lib/showoff/version.rb +1 -1
- data/public/js/bigtext-0.1.8.js +292 -0
- data/public/js/presenter.js +5 -0
- data/public/js/showoff.js +14 -0
- data/views/header.erb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1045e98280df58f247a2bd2cbfc6cfd8737edad
|
4
|
+
data.tar.gz: 6a2b723b8f401ce9807f27eb0b8b85e6022e5f0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db4bbe7b17021c6365a15cb3281022a642ae6d2c3fb82749a47a74958bbff4206b1e1b0d3d852989764428dfa259bf3ca360efed48d1efc608e49c98584cb5a8
|
7
|
+
data.tar.gz: 951a2673da40ab2cc7b39eebe4708f9646a3dbd040619aa9cffdd3dde0bad37af14ae1f922ae0b78588ebeaf9199ba7f0cd4209f67874d4916fec78c0601aaa7
|
data/lib/showoff/version.rb
CHANGED
@@ -0,0 +1,292 @@
|
|
1
|
+
/*! BigText - v0.1.8 - 2015-04-01
|
2
|
+
* https://github.com/zachleat/bigtext
|
3
|
+
* Copyright (c) 2015 Zach Leatherman (@zachleat)
|
4
|
+
* MIT License */
|
5
|
+
|
6
|
+
(function(window, $) {
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
var counter = 0,
|
10
|
+
$headCache = $('head'),
|
11
|
+
oldBigText = window.BigText,
|
12
|
+
oldjQueryMethod = $.fn.bigtext,
|
13
|
+
BigText = {
|
14
|
+
DEBUG_MODE: false,
|
15
|
+
DEFAULT_MIN_FONT_SIZE_PX: null,
|
16
|
+
DEFAULT_MAX_FONT_SIZE_PX: 528,
|
17
|
+
GLOBAL_STYLE_ID: 'bigtext-style',
|
18
|
+
STYLE_ID: 'bigtext-id',
|
19
|
+
LINE_CLASS_PREFIX: 'bigtext-line',
|
20
|
+
EXEMPT_CLASS: 'bigtext-exempt',
|
21
|
+
noConflict: function(restore)
|
22
|
+
{
|
23
|
+
if(restore) {
|
24
|
+
$.fn.bigtext = oldjQueryMethod;
|
25
|
+
window.BigText = oldBigText;
|
26
|
+
}
|
27
|
+
return BigText;
|
28
|
+
},
|
29
|
+
supports: {
|
30
|
+
wholeNumberFontSizeOnly: (function() {
|
31
|
+
if( !( 'getComputedStyle' in window ) ) {
|
32
|
+
return true;
|
33
|
+
}
|
34
|
+
var test = $('<div/>').css({
|
35
|
+
position: 'absolute',
|
36
|
+
'font-size': '14.1px'
|
37
|
+
}).insertBefore( $('script').eq(0) ),
|
38
|
+
computedStyle = window.getComputedStyle( test[0], null );
|
39
|
+
|
40
|
+
var ret = computedStyle && computedStyle.getPropertyValue( 'font-size' ) === '14px';
|
41
|
+
test.remove();
|
42
|
+
return ret;
|
43
|
+
})()
|
44
|
+
},
|
45
|
+
init: function() {
|
46
|
+
if(!$('#'+BigText.GLOBAL_STYLE_ID).length) {
|
47
|
+
$headCache.append(BigText.generateStyleTag(BigText.GLOBAL_STYLE_ID, ['.bigtext * { white-space: nowrap; } .bigtext > * { display: block; }',
|
48
|
+
'.bigtext .' + BigText.EXEMPT_CLASS + ', .bigtext .' + BigText.EXEMPT_CLASS + ' * { white-space: normal; }']));
|
49
|
+
}
|
50
|
+
},
|
51
|
+
bindResize: function(eventName, resizeFunction) {
|
52
|
+
var timeoutId;
|
53
|
+
$(window).unbind(eventName).bind(eventName, function() {
|
54
|
+
if( timeoutId ) {
|
55
|
+
clearTimeout( timeoutId );
|
56
|
+
}
|
57
|
+
timeoutId = setTimeout( resizeFunction, 100 );
|
58
|
+
});
|
59
|
+
},
|
60
|
+
getStyleId: function(id)
|
61
|
+
{
|
62
|
+
return BigText.STYLE_ID + '-' + id;
|
63
|
+
},
|
64
|
+
generateStyleTag: function(id, css)
|
65
|
+
{
|
66
|
+
return $('<style>' + css.join('\n') + '</style>').attr('id', id);
|
67
|
+
},
|
68
|
+
clearCss: function(id)
|
69
|
+
{
|
70
|
+
var styleId = BigText.getStyleId(id);
|
71
|
+
$('#' + styleId).remove();
|
72
|
+
},
|
73
|
+
generateCss: function(id, linesFontSizes, lineWordSpacings, minFontSizes)
|
74
|
+
{
|
75
|
+
var css = [];
|
76
|
+
|
77
|
+
BigText.clearCss(id);
|
78
|
+
|
79
|
+
for(var j=0, k=linesFontSizes.length; j<k; j++) {
|
80
|
+
css.push('#' + id + ' .' + BigText.LINE_CLASS_PREFIX + j + ' {' +
|
81
|
+
(minFontSizes[j] ? ' white-space: normal;' : '') +
|
82
|
+
(linesFontSizes[j] ? ' font-size: ' + linesFontSizes[j] + 'px;' : '') +
|
83
|
+
(lineWordSpacings[j] ? ' word-spacing: ' + lineWordSpacings[j] + 'px;' : '') +
|
84
|
+
'}');
|
85
|
+
}
|
86
|
+
|
87
|
+
return BigText.generateStyleTag(BigText.getStyleId(id), css);
|
88
|
+
},
|
89
|
+
jQueryMethod: function(options)
|
90
|
+
{
|
91
|
+
BigText.init();
|
92
|
+
|
93
|
+
options = $.extend({
|
94
|
+
minfontsize: BigText.DEFAULT_MIN_FONT_SIZE_PX,
|
95
|
+
maxfontsize: BigText.DEFAULT_MAX_FONT_SIZE_PX,
|
96
|
+
childSelector: '',
|
97
|
+
resize: true
|
98
|
+
}, options || {});
|
99
|
+
|
100
|
+
this.each(function()
|
101
|
+
{
|
102
|
+
var $t = $(this).addClass('bigtext'),
|
103
|
+
maxWidth = $t.width(),
|
104
|
+
id = $t.attr('id'),
|
105
|
+
$children = options.childSelector ? $t.find( options.childSelector ) : $t.children();
|
106
|
+
|
107
|
+
if(!id) {
|
108
|
+
id = 'bigtext-id' + (counter++);
|
109
|
+
$t.attr('id', id);
|
110
|
+
}
|
111
|
+
|
112
|
+
if(options.resize) {
|
113
|
+
BigText.bindResize('resize.bigtext-event-' + id, function()
|
114
|
+
{
|
115
|
+
// TODO only call this if the width has changed.
|
116
|
+
BigText.jQueryMethod.call($('#' + id), options);
|
117
|
+
});
|
118
|
+
}
|
119
|
+
|
120
|
+
BigText.clearCss(id);
|
121
|
+
|
122
|
+
$children.addClass(function(lineNumber, className)
|
123
|
+
{
|
124
|
+
// remove existing line classes.
|
125
|
+
return [className.replace(new RegExp('\\b' + BigText.LINE_CLASS_PREFIX + '\\d+\\b'), ''),
|
126
|
+
BigText.LINE_CLASS_PREFIX + lineNumber].join(' ');
|
127
|
+
});
|
128
|
+
|
129
|
+
var sizes = calculateSizes($t, $children, maxWidth, options.maxfontsize, options.minfontsize);
|
130
|
+
$headCache.append(BigText.generateCss(id, sizes.fontSizes, sizes.wordSpacings, sizes.minFontSizes));
|
131
|
+
});
|
132
|
+
|
133
|
+
return this.trigger('bigtext:complete');
|
134
|
+
}
|
135
|
+
};
|
136
|
+
|
137
|
+
function testLineDimensions($line, maxWidth, property, size, interval, units, previousWidth)
|
138
|
+
{
|
139
|
+
var width;
|
140
|
+
previousWidth = typeof previousWidth === 'number' ? previousWidth : 0;
|
141
|
+
$line.css(property, size + units);
|
142
|
+
|
143
|
+
width = $line.width();
|
144
|
+
|
145
|
+
if(width >= maxWidth) {
|
146
|
+
// console.log(width, ' previous: ' + previousWidth, property + ' at ' + interval, 'prior: ' + (parseFloat(size) - interval), 'new:' + parseFloat(size));
|
147
|
+
$line.css(property, '');
|
148
|
+
|
149
|
+
if(width === maxWidth) {
|
150
|
+
return {
|
151
|
+
match: 'exact',
|
152
|
+
size: parseFloat((parseFloat(size) - 0.1).toFixed(3))
|
153
|
+
};
|
154
|
+
}
|
155
|
+
|
156
|
+
// Since this is an estimate, we calculate how far over the width we went with the new value.
|
157
|
+
// If this is word-spacing (our last resort guess) and the over is less than the under, we keep the higher value.
|
158
|
+
// Otherwise, we revert to the underestimate.
|
159
|
+
var under = maxWidth - previousWidth,
|
160
|
+
over = width - maxWidth;
|
161
|
+
|
162
|
+
return {
|
163
|
+
match: 'estimate',
|
164
|
+
size: parseFloat((parseFloat(size) - (property === 'word-spacing' && previousWidth && ( over < under ) ? 0 : interval)).toFixed(3))
|
165
|
+
};
|
166
|
+
}
|
167
|
+
|
168
|
+
return width;
|
169
|
+
}
|
170
|
+
|
171
|
+
function calculateSizes($t, $children, maxWidth, maxFontSize, minFontSize)
|
172
|
+
{
|
173
|
+
var $c = $t.clone(true)
|
174
|
+
.addClass('bigtext-cloned')
|
175
|
+
.css({
|
176
|
+
fontFamily: $t.css('font-family'),
|
177
|
+
textTransform: $t.css('text-transform'),
|
178
|
+
wordSpacing: $t.css('word-spacing'),
|
179
|
+
letterSpacing: $t.css('letter-spacing'),
|
180
|
+
position: 'absolute',
|
181
|
+
left: BigText.DEBUG_MODE ? 0 : -9999,
|
182
|
+
top: BigText.DEBUG_MODE ? 0 : -9999
|
183
|
+
})
|
184
|
+
.appendTo(document.body);
|
185
|
+
|
186
|
+
// font-size isn't the only thing we can modify, we can also mess with:
|
187
|
+
// word-spacing and letter-spacing. WebKit does not respect subpixel
|
188
|
+
// letter-spacing, word-spacing, or font-size.
|
189
|
+
// TODO try -webkit-transform: scale() as a workaround.
|
190
|
+
var fontSizes = [],
|
191
|
+
wordSpacings = [],
|
192
|
+
minFontSizes = [],
|
193
|
+
ratios = [];
|
194
|
+
|
195
|
+
$children.css('float', 'left').each(function() {
|
196
|
+
var $line = $(this),
|
197
|
+
// TODO replace 8, 4 with a proportional size to the calculated font-size.
|
198
|
+
intervals = BigText.supports.wholeNumberFontSizeOnly ? [8, 4, 1] : [8, 4, 1, 0.1],
|
199
|
+
lineMax,
|
200
|
+
newFontSize;
|
201
|
+
|
202
|
+
if($line.hasClass(BigText.EXEMPT_CLASS)) {
|
203
|
+
fontSizes.push(null);
|
204
|
+
ratios.push(null);
|
205
|
+
minFontSizes.push(false);
|
206
|
+
return;
|
207
|
+
}
|
208
|
+
|
209
|
+
// TODO we can cache this ratio?
|
210
|
+
var autoGuessSubtraction = 32, // font size in px
|
211
|
+
currentFontSize = parseFloat($line.css('font-size')),
|
212
|
+
ratio = ( $line.width() / currentFontSize ).toFixed(6);
|
213
|
+
|
214
|
+
newFontSize = parseInt( maxWidth / ratio, 10 ) - autoGuessSubtraction;
|
215
|
+
|
216
|
+
outer: for(var m=0, n=intervals.length; m<n; m++) {
|
217
|
+
inner: for(var j=1, k=10; j<=k; j++) {
|
218
|
+
if(newFontSize + j*intervals[m] > maxFontSize) {
|
219
|
+
newFontSize = maxFontSize;
|
220
|
+
break outer;
|
221
|
+
}
|
222
|
+
|
223
|
+
lineMax = testLineDimensions($line, maxWidth, 'font-size', newFontSize + j*intervals[m], intervals[m], 'px', lineMax);
|
224
|
+
if(typeof lineMax !== 'number') {
|
225
|
+
newFontSize = lineMax.size;
|
226
|
+
|
227
|
+
if(lineMax.match === 'exact') {
|
228
|
+
break outer;
|
229
|
+
}
|
230
|
+
break inner;
|
231
|
+
}
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
ratios.push(maxWidth / newFontSize);
|
236
|
+
|
237
|
+
if(newFontSize > maxFontSize) {
|
238
|
+
fontSizes.push(maxFontSize);
|
239
|
+
minFontSizes.push(false);
|
240
|
+
} else if(!!minFontSize && newFontSize < minFontSize) {
|
241
|
+
fontSizes.push(minFontSize);
|
242
|
+
minFontSizes.push(true);
|
243
|
+
} else {
|
244
|
+
fontSizes.push(newFontSize);
|
245
|
+
minFontSizes.push(false);
|
246
|
+
}
|
247
|
+
}).each(function(lineNumber) {
|
248
|
+
var $line = $(this),
|
249
|
+
wordSpacing = 0,
|
250
|
+
interval = 1,
|
251
|
+
maxWordSpacing;
|
252
|
+
|
253
|
+
if($line.hasClass(BigText.EXEMPT_CLASS)) {
|
254
|
+
wordSpacings.push(null);
|
255
|
+
return;
|
256
|
+
}
|
257
|
+
|
258
|
+
// must re-use font-size, even though it was removed above.
|
259
|
+
$line.css('font-size', fontSizes[lineNumber] + 'px');
|
260
|
+
|
261
|
+
for(var m=1, n=3; m<n; m+=interval) {
|
262
|
+
maxWordSpacing = testLineDimensions($line, maxWidth, 'word-spacing', m, interval, 'px', maxWordSpacing);
|
263
|
+
if(typeof maxWordSpacing !== 'number') {
|
264
|
+
wordSpacing = maxWordSpacing.size;
|
265
|
+
break;
|
266
|
+
}
|
267
|
+
}
|
268
|
+
|
269
|
+
$line.css('font-size', '');
|
270
|
+
wordSpacings.push(wordSpacing);
|
271
|
+
}).removeAttr('style');
|
272
|
+
|
273
|
+
if( !BigText.DEBUG_MODE ) {
|
274
|
+
$c.remove();
|
275
|
+
} else {
|
276
|
+
$c.css({
|
277
|
+
'background-color': 'rgba(255,255,255,.4)'
|
278
|
+
});
|
279
|
+
}
|
280
|
+
|
281
|
+
return {
|
282
|
+
fontSizes: fontSizes,
|
283
|
+
wordSpacings: wordSpacings,
|
284
|
+
ratios: ratios,
|
285
|
+
minFontSizes: minFontSizes
|
286
|
+
};
|
287
|
+
}
|
288
|
+
|
289
|
+
$.fn.bigtext = BigText.jQueryMethod;
|
290
|
+
window.BigText = BigText;
|
291
|
+
|
292
|
+
})(this, jQuery);
|
data/public/js/presenter.js
CHANGED
@@ -35,6 +35,7 @@ $(document).ready(function(){
|
|
35
35
|
$('#layoutSelector').change(function(e) {
|
36
36
|
chooseLayout(e.target.value);
|
37
37
|
});
|
38
|
+
chooseLayout(null);
|
38
39
|
|
39
40
|
|
40
41
|
// Bind events for mobile viewing
|
@@ -783,6 +784,9 @@ function openNext() {
|
|
783
784
|
********************/
|
784
785
|
function chooseLayout(layout)
|
785
786
|
{
|
787
|
+
// yay for half-baked data storage schemes
|
788
|
+
layout = layout || document.cookieHash['layout'] || 'default';
|
789
|
+
|
786
790
|
// in case we're being called externally, make the UI match
|
787
791
|
$('#layoutSelector').val(layout);
|
788
792
|
$("#nextWindowConfirmation").slideUp(125);
|
@@ -846,6 +850,7 @@ function chooseLayout(layout)
|
|
846
850
|
|
847
851
|
}
|
848
852
|
|
853
|
+
document.cookie = "layout="+layout
|
849
854
|
mode.layout = layout;
|
850
855
|
zoom(true);
|
851
856
|
}
|
data/public/js/showoff.js
CHANGED
@@ -25,6 +25,17 @@ var loadSlidesPrefix
|
|
25
25
|
|
26
26
|
var mode = { track: true, follow: true };
|
27
27
|
|
28
|
+
// since javascript doesn't have a built-in way to get to cookies easily,
|
29
|
+
// let's just add our own data structure.
|
30
|
+
document.cookieHash = {}
|
31
|
+
document.cookie.split(';').forEach( function(item) {
|
32
|
+
var pos = item.indexOf('=');
|
33
|
+
var key = item.slice(0,pos).trim();
|
34
|
+
var val = item.slice(pos+1).trim();
|
35
|
+
|
36
|
+
document.cookieHash[key] = val;
|
37
|
+
});
|
38
|
+
|
28
39
|
$(document).on('click', 'code.execute', executeCode);
|
29
40
|
|
30
41
|
function setupPreso(load_slides, prefix) {
|
@@ -568,6 +579,9 @@ function showSlide(back_step, updatepv) {
|
|
568
579
|
// copy notes to the notes field for mobile.
|
569
580
|
postSlide();
|
570
581
|
|
582
|
+
// make all bigly text tremendous
|
583
|
+
currentSlide.children('.content.bigtext').bigtext();
|
584
|
+
|
571
585
|
return ret;
|
572
586
|
}
|
573
587
|
|
data/views/header.erb
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
<script type="text/javascript" src="<%= @asset_path %>/js/jquery.parsequery.min-6a20f83.js"></script>
|
20
20
|
<script type="text/javascript" src="<%= @asset_path %>/js/jquery.doubletap-4ff02c5.js"></script>
|
21
21
|
<script type="text/javascript" src="<%= @asset_path %>/js/jTypeWriter-1.1.js"></script>
|
22
|
+
<script type="text/javascript" src="<%= @asset_path %>/js/bigtext-0.1.8.js"></script>
|
22
23
|
<script type="text/javascript" src="<%= @asset_path %>/js/highlight.pack-9.2.0.js"></script>
|
23
24
|
|
24
25
|
<script type="text/javascript" src="<%= @asset_path %>/js/coffee-script-1.1.3-pre.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.15.
|
4
|
+
version: 0.15.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Chacon
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-12-
|
12
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -328,6 +328,7 @@ files:
|
|
328
328
|
- public/favicon.ico
|
329
329
|
- public/js/TimeCircles-89ac5ae.js
|
330
330
|
- public/js/annotations.js
|
331
|
+
- public/js/bigtext-0.1.8.js
|
331
332
|
- public/js/coffee-script-1.1.3-pre.js
|
332
333
|
- public/js/highlight.pack-9.2.0.js
|
333
334
|
- public/js/jTypeWriter-1.1.js
|