showoff 0.19.4 → 0.19.6
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/keymap.rb +19 -5
- data/lib/showoff.rb +16 -0
- data/lib/showoff/version.rb +1 -1
- data/views/index.erb +54 -54
- data/views/presenter.erb +112 -111
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7d89a81580e427dec3aeac374f270da7d41086f
|
4
|
+
data.tar.gz: 05d8ae0e8cc50901278c78b9a4863aca8229dece
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ef1768cbda7e7162c7a0002be3d05c6b7ac8ef4853daa05d0b7f141bd778c2820326538318d2cab87288a4b2a3fa0572989504ac4e05a2d291abfe5a5227415
|
7
|
+
data.tar.gz: 0d005aa1173803fb79356db0cd0f882c2f493f071931ff48a9ddcd79791cc9884fbd702ce5026d63c9a97b2ab0bbcc5e06211bdc0a6f147f81d9d7f32dce78aa
|
data/lib/keymap.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
module Keymap
|
2
2
|
def self.default()
|
3
3
|
{
|
4
|
-
'space' => 'NEXT',
|
5
4
|
'd' => 'DEBUG',
|
6
|
-
'
|
7
|
-
'left' => 'PREV',
|
8
|
-
'pageup' => 'PREVSEC',
|
5
|
+
'space' => 'NEXT',
|
9
6
|
'down' => 'NEXT',
|
10
7
|
'right' => 'NEXT',
|
11
|
-
'pagedown' => '
|
8
|
+
'pagedown' => 'NEXT',
|
9
|
+
'up' => 'PREV',
|
10
|
+
'left' => 'PREV',
|
11
|
+
'pageup' => 'PREV',
|
12
|
+
'SPACE' => 'NEXTSEC',
|
13
|
+
'DOWN' => 'NEXTSEC',
|
14
|
+
'RIGHT' => 'NEXTSEC',
|
15
|
+
'PAGEDOWN' => 'NEXTSEC',
|
16
|
+
'UP' => 'PREVSEC',
|
17
|
+
'LEFT' => 'PREVSEC',
|
18
|
+
'PAGEUP' => 'PREVSEC',
|
12
19
|
'R' => 'RELOAD',
|
13
20
|
'r' => 'REFRESH',
|
14
21
|
'c' => 'CONTENTS',
|
@@ -169,6 +176,13 @@ module Keymap
|
|
169
176
|
"`" => "~",
|
170
177
|
"=" => "+",
|
171
178
|
"-" => "_",
|
179
|
+
"space" => "SPACE",
|
180
|
+
"down" => "DOWN",
|
181
|
+
"right" => "RIGHT",
|
182
|
+
"pagedown" => "PAGEDOWN",
|
183
|
+
"up" => "UP",
|
184
|
+
"left" => "LEFT",
|
185
|
+
"pageup" => "PAGEUP",
|
172
186
|
}
|
173
187
|
end
|
174
188
|
|
data/lib/showoff.rb
CHANGED
@@ -506,6 +506,7 @@ class ShowOff < Sinatra::Application
|
|
506
506
|
|
507
507
|
# Apply the template to the slide and replace the key to generate the content of the slide
|
508
508
|
sl = process_content_for_replacements(template.gsub(/~~~CONTENT~~~/, slide.text))
|
509
|
+
sl = process_content_for_language(sl, I18n.locale)
|
509
510
|
sl = Tilt[:markdown].new(nil, nil, @engine_options) { sl }.render
|
510
511
|
sl = build_forms(sl, content_classes)
|
511
512
|
sl = update_p_classes(sl)
|
@@ -535,6 +536,21 @@ class ShowOff < Sinatra::Application
|
|
535
536
|
final
|
536
537
|
end
|
537
538
|
|
539
|
+
def process_content_for_language(content, locale)
|
540
|
+
lang = locale.to_s.split('-').first
|
541
|
+
result = content
|
542
|
+
|
543
|
+
content.scan(/^((~~~LANG:([\w-]+)~~~\n)(.+?)(\n~~~ENDLANG~~~\n))/m).each do |match|
|
544
|
+
if match[2] == lang or match[2] == locale.to_s
|
545
|
+
result.sub!(match[0], match[3])
|
546
|
+
else
|
547
|
+
result.sub!(match[0], "\n")
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
result
|
552
|
+
end
|
553
|
+
|
538
554
|
# This method processes the content of the slide and replaces
|
539
555
|
# content markers with their actual value information
|
540
556
|
def process_content_for_replacements(content)
|
data/lib/showoff/version.rb
CHANGED
data/views/index.erb
CHANGED
@@ -3,60 +3,6 @@
|
|
3
3
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
4
|
<head>
|
5
5
|
<%= erb :header %>
|
6
|
-
|
7
|
-
<script type="text/javascript">
|
8
|
-
// We want the audience members to see automatic tours. We can assume that they won't be
|
9
|
-
// using many server domains like the presenter might.
|
10
|
-
var autoTour = true;
|
11
|
-
|
12
|
-
$( document ).ready(function() {
|
13
|
-
if(presenter && !window.opener) {
|
14
|
-
alert('This is an audience view designed for interactivity. If you are placing this window on a projector, you should use the Display View instead.');
|
15
|
-
}
|
16
|
-
|
17
|
-
tours['showoff:activity'] = [
|
18
|
-
{
|
19
|
-
element: ".currentSlide .activityToggle",
|
20
|
-
intro: I18n.t('tour.activity.complete')
|
21
|
-
}
|
22
|
-
];
|
23
|
-
|
24
|
-
tours['showoff:form'] = [
|
25
|
-
{
|
26
|
-
element: ".currentSlide input.save",
|
27
|
-
intro: I18n.t('tour.form.save')
|
28
|
-
}
|
29
|
-
];
|
30
|
-
|
31
|
-
tours['showoff:menu'] = [
|
32
|
-
{
|
33
|
-
element: "#hamburger",
|
34
|
-
intro: I18n.t('tour.menu.start')
|
35
|
-
},
|
36
|
-
{
|
37
|
-
element: "#navToggle",
|
38
|
-
intro: I18n.t('tour.menu.navigation')
|
39
|
-
},
|
40
|
-
{
|
41
|
-
element: "#fileDownloads",
|
42
|
-
intro: I18n.t('tour.menu.download')
|
43
|
-
},
|
44
|
-
{
|
45
|
-
element: "#paceFaster",
|
46
|
-
intro: I18n.t('tour.menu.pace')
|
47
|
-
},
|
48
|
-
{
|
49
|
-
element: "#questionToggle",
|
50
|
-
intro: I18n.t('tour.menu.questions')
|
51
|
-
},
|
52
|
-
{
|
53
|
-
element: "#feedbackToggle",
|
54
|
-
intro: I18n.t('tour.menu.feedback')
|
55
|
-
}
|
56
|
-
].filter(function(item) { return (document.querySelector(item['element'])) });
|
57
|
-
// display tips for only the enabled features
|
58
|
-
});
|
59
|
-
</script>
|
60
6
|
</head>
|
61
7
|
|
62
8
|
<body>
|
@@ -175,5 +121,59 @@
|
|
175
121
|
<%= @pause_msg %>
|
176
122
|
</div>
|
177
123
|
|
124
|
+
<script defer type="text/javascript">
|
125
|
+
// We want the audience members to see automatic tours. We can assume that they won't be
|
126
|
+
// using many server domains like the presenter might.
|
127
|
+
var autoTour = true;
|
128
|
+
|
129
|
+
$( document ).ready(function() {
|
130
|
+
if(presenter && !window.opener) {
|
131
|
+
alert('This is an audience view designed for interactivity. If you are placing this window on a projector, you should use the Display View instead.');
|
132
|
+
}
|
133
|
+
|
134
|
+
tours['showoff:activity'] = [
|
135
|
+
{
|
136
|
+
element: ".currentSlide .activityToggle",
|
137
|
+
intro: I18n.t('tour.activity.complete')
|
138
|
+
}
|
139
|
+
];
|
140
|
+
|
141
|
+
tours['showoff:form'] = [
|
142
|
+
{
|
143
|
+
element: ".currentSlide input.save",
|
144
|
+
intro: I18n.t('tour.form.save')
|
145
|
+
}
|
146
|
+
];
|
147
|
+
|
148
|
+
tours['showoff:menu'] = [
|
149
|
+
{
|
150
|
+
element: "#hamburger",
|
151
|
+
intro: I18n.t('tour.menu.start')
|
152
|
+
},
|
153
|
+
{
|
154
|
+
element: "#navToggle",
|
155
|
+
intro: I18n.t('tour.menu.navigation')
|
156
|
+
},
|
157
|
+
{
|
158
|
+
element: "#fileDownloads",
|
159
|
+
intro: I18n.t('tour.menu.download')
|
160
|
+
},
|
161
|
+
{
|
162
|
+
element: "#paceFaster",
|
163
|
+
intro: I18n.t('tour.menu.pace')
|
164
|
+
},
|
165
|
+
{
|
166
|
+
element: "#questionToggle",
|
167
|
+
intro: I18n.t('tour.menu.questions')
|
168
|
+
},
|
169
|
+
{
|
170
|
+
element: "#feedbackToggle",
|
171
|
+
intro: I18n.t('tour.menu.feedback')
|
172
|
+
}
|
173
|
+
].filter(function(item) { return (document.querySelector(item['element'])) });
|
174
|
+
// display tips for only the enabled features
|
175
|
+
});
|
176
|
+
</script>
|
177
|
+
|
178
178
|
</body>
|
179
179
|
</html>
|
data/views/presenter.erb
CHANGED
@@ -8,117 +8,6 @@
|
|
8
8
|
|
9
9
|
<script type="text/javascript" src="<%= @asset_path %>/js/TimeCircles-89ac5ae.js"></script>
|
10
10
|
<script type="text/javascript" src="<%= @asset_path %>/js/presenter.js?v=<%= SHOWOFF_VERSION %>"></script>
|
11
|
-
|
12
|
-
<script type="text/javascript">
|
13
|
-
editUrl = "<%= @edit %>";
|
14
|
-
issueUrl = "<%= @issues %>";
|
15
|
-
autoTour = false;
|
16
|
-
|
17
|
-
// increment this each time we add features with new tour stops.
|
18
|
-
tourVersion = 1;
|
19
|
-
|
20
|
-
$(function() {
|
21
|
-
tours['showoff:activity'] = [
|
22
|
-
{
|
23
|
-
element: ".currentSlide .count",
|
24
|
-
intro: I18n.t('tour.activity.count')
|
25
|
-
}
|
26
|
-
];
|
27
|
-
|
28
|
-
tours['showoff:form'] = [
|
29
|
-
{
|
30
|
-
element: "#notes",
|
31
|
-
intro: I18n.t('tour.form.responses'),
|
32
|
-
scrollToElement: false
|
33
|
-
},
|
34
|
-
{
|
35
|
-
element: ".currentSlide input.display",
|
36
|
-
intro: I18n.t('tour.form.display')
|
37
|
-
}
|
38
|
-
];
|
39
|
-
|
40
|
-
tours['showoff:presenter'] = [
|
41
|
-
{
|
42
|
-
intro: I18n.t('tour.welcome'),
|
43
|
-
version: 1
|
44
|
-
},
|
45
|
-
{
|
46
|
-
element: "#slaveWindow",
|
47
|
-
intro: I18n.t('tour.displayview'),
|
48
|
-
version: 1
|
49
|
-
},
|
50
|
-
{
|
51
|
-
element: "#annotationLabel",
|
52
|
-
intro: I18n.t('tour.annotations'),
|
53
|
-
version: 1
|
54
|
-
},
|
55
|
-
{
|
56
|
-
element: "#timerSection",
|
57
|
-
intro: I18n.t('tour.timer'),
|
58
|
-
version: 1
|
59
|
-
},
|
60
|
-
{
|
61
|
-
element: "#feedbackPace",
|
62
|
-
intro: I18n.t('tour.pace'),
|
63
|
-
version: 1
|
64
|
-
},
|
65
|
-
{
|
66
|
-
element: "#questions",
|
67
|
-
intro: I18n.t('tour.questions'),
|
68
|
-
version: 1
|
69
|
-
},
|
70
|
-
{
|
71
|
-
element: "#notes-controls",
|
72
|
-
intro: I18n.t('tour.notes'),
|
73
|
-
highlightClass: "tourDark",
|
74
|
-
version: 1
|
75
|
-
},
|
76
|
-
{
|
77
|
-
element: "#slideSource",
|
78
|
-
intro: I18n.t('tour.slidesource'),
|
79
|
-
version: 1
|
80
|
-
},
|
81
|
-
{
|
82
|
-
element: "#settings",
|
83
|
-
intro: I18n.t('tour.settings'),
|
84
|
-
version: 1
|
85
|
-
},
|
86
|
-
{
|
87
|
-
element: "#edit",
|
88
|
-
intro: I18n.t('tour.edit'),
|
89
|
-
version: 1
|
90
|
-
},
|
91
|
-
{
|
92
|
-
element: "#report",
|
93
|
-
intro: I18n.t('tour.report'),
|
94
|
-
version: 1
|
95
|
-
}
|
96
|
-
].filter(function(item) {
|
97
|
-
// filter out tips for features that have been turned off
|
98
|
-
return ((item['element'] == undefined) || document.querySelector(item['element']));
|
99
|
-
});
|
100
|
-
|
101
|
-
// Only autoshow when served from localhost, since we don't know if we have a consistent domain for our cookie otherwise.
|
102
|
-
if ( location.hostname == 'localhost' || location.hostname == '127.0.0.1' ) {
|
103
|
-
|
104
|
-
// enables the flag that shows feature tours
|
105
|
-
autoTour = true;
|
106
|
-
|
107
|
-
var clientTour = document.cookieHash['tourVersion'] || 0;
|
108
|
-
if(clientTour < tourVersion) {
|
109
|
-
// now make a temporary duplicate of only recent items
|
110
|
-
tours['showoff:presenter:auto'] = tours['showoff:presenter'].filter(function(item) {
|
111
|
-
return (item['version'] > clientTour);
|
112
|
-
});
|
113
|
-
|
114
|
-
// we don't need to let this record, because we've already tested clientTour
|
115
|
-
showTour('showoff:presenter:auto', false);
|
116
|
-
}
|
117
|
-
|
118
|
-
}
|
119
|
-
});
|
120
|
-
|
121
|
-
</script>
|
122
11
|
</head>
|
123
12
|
|
124
13
|
<body class="presenter">
|
@@ -311,5 +200,117 @@
|
|
311
200
|
<%= @slides %>
|
312
201
|
</div>
|
313
202
|
</div><!-- end pagewrapper -->
|
203
|
+
|
204
|
+
<script defer type="text/javascript">
|
205
|
+
editUrl = "<%= @edit %>";
|
206
|
+
issueUrl = "<%= @issues %>";
|
207
|
+
autoTour = false;
|
208
|
+
|
209
|
+
// increment this each time we add features with new tour stops.
|
210
|
+
tourVersion = 1;
|
211
|
+
|
212
|
+
$(function() {
|
213
|
+
tours['showoff:activity'] = [
|
214
|
+
{
|
215
|
+
element: ".currentSlide .count",
|
216
|
+
intro: I18n.t('tour.activity.count')
|
217
|
+
}
|
218
|
+
];
|
219
|
+
|
220
|
+
tours['showoff:form'] = [
|
221
|
+
{
|
222
|
+
element: "#notes",
|
223
|
+
intro: I18n.t('tour.form.responses'),
|
224
|
+
scrollToElement: false
|
225
|
+
},
|
226
|
+
{
|
227
|
+
element: ".currentSlide input.display",
|
228
|
+
intro: I18n.t('tour.form.display')
|
229
|
+
}
|
230
|
+
];
|
231
|
+
|
232
|
+
tours['showoff:presenter'] = [
|
233
|
+
{
|
234
|
+
intro: I18n.t('tour.welcome'),
|
235
|
+
version: 1
|
236
|
+
},
|
237
|
+
{
|
238
|
+
element: "#slaveWindow",
|
239
|
+
intro: I18n.t('tour.displayview'),
|
240
|
+
version: 1
|
241
|
+
},
|
242
|
+
{
|
243
|
+
element: "#annotationLabel",
|
244
|
+
intro: I18n.t('tour.annotations'),
|
245
|
+
version: 1
|
246
|
+
},
|
247
|
+
{
|
248
|
+
element: "#timerSection",
|
249
|
+
intro: I18n.t('tour.timer'),
|
250
|
+
version: 1
|
251
|
+
},
|
252
|
+
{
|
253
|
+
element: "#feedbackPace",
|
254
|
+
intro: I18n.t('tour.pace'),
|
255
|
+
version: 1
|
256
|
+
},
|
257
|
+
{
|
258
|
+
element: "#questions",
|
259
|
+
intro: I18n.t('tour.questions'),
|
260
|
+
version: 1
|
261
|
+
},
|
262
|
+
{
|
263
|
+
element: "#notes-controls",
|
264
|
+
intro: I18n.t('tour.notes'),
|
265
|
+
highlightClass: "tourDark",
|
266
|
+
version: 1
|
267
|
+
},
|
268
|
+
{
|
269
|
+
element: "#slideSource",
|
270
|
+
intro: I18n.t('tour.slidesource'),
|
271
|
+
version: 1
|
272
|
+
},
|
273
|
+
{
|
274
|
+
element: "#settings",
|
275
|
+
intro: I18n.t('tour.settings'),
|
276
|
+
version: 1
|
277
|
+
},
|
278
|
+
{
|
279
|
+
element: "#edit",
|
280
|
+
intro: I18n.t('tour.edit'),
|
281
|
+
version: 1
|
282
|
+
},
|
283
|
+
{
|
284
|
+
element: "#report",
|
285
|
+
intro: I18n.t('tour.report'),
|
286
|
+
version: 1
|
287
|
+
}
|
288
|
+
].filter(function(item) {
|
289
|
+
// filter out tips for features that have been turned off
|
290
|
+
return ((item['element'] == undefined) || document.querySelector(item['element']));
|
291
|
+
});
|
292
|
+
|
293
|
+
// Only autoshow when served from localhost, since we don't know if we have a consistent domain for our cookie otherwise.
|
294
|
+
if ( location.hostname == 'localhost' || location.hostname == '127.0.0.1' ) {
|
295
|
+
|
296
|
+
// enables the flag that shows feature tours
|
297
|
+
autoTour = true;
|
298
|
+
|
299
|
+
var clientTour = document.cookieHash['tourVersion'] || 0;
|
300
|
+
if(clientTour < tourVersion) {
|
301
|
+
// now make a temporary duplicate of only recent items
|
302
|
+
tours['showoff:presenter:auto'] = tours['showoff:presenter'].filter(function(item) {
|
303
|
+
return (item['version'] > clientTour);
|
304
|
+
});
|
305
|
+
|
306
|
+
// we don't need to let this record, because we've already tested clientTour
|
307
|
+
showTour('showoff:presenter:auto', false);
|
308
|
+
}
|
309
|
+
|
310
|
+
}
|
311
|
+
});
|
312
|
+
|
313
|
+
</script>
|
314
|
+
|
314
315
|
</body>
|
315
316
|
</html>
|
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.19.
|
4
|
+
version: 0.19.6
|
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: 2018-
|
12
|
+
date: 2018-03-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -211,16 +211,16 @@ dependencies:
|
|
211
211
|
name: commonmarker
|
212
212
|
requirement: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
|
-
- - "
|
214
|
+
- - ">="
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version: 0
|
216
|
+
version: '0'
|
217
217
|
type: :runtime
|
218
218
|
prerelease: false
|
219
219
|
version_requirements: !ruby/object:Gem::Requirement
|
220
220
|
requirements:
|
221
|
-
- - "
|
221
|
+
- - ">="
|
222
222
|
- !ruby/object:Gem::Version
|
223
|
-
version: 0
|
223
|
+
version: '0'
|
224
224
|
- !ruby/object:Gem::Dependency
|
225
225
|
name: mg
|
226
226
|
requirement: !ruby/object:Gem::Requirement
|