slidemgr 1.0.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.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +13 -0
  6. data/LICENCE +674 -0
  7. data/README.md +153 -0
  8. data/Rakefile +3 -0
  9. data/bin/setup +7 -0
  10. data/bin/slidemgr +10 -0
  11. data/config.yml +0 -0
  12. data/lib/command_router.rb +27 -0
  13. data/lib/commands/create.rb +61 -0
  14. data/lib/commands/init.rb +78 -0
  15. data/lib/commands/list.rb +12 -0
  16. data/lib/commands/refresh.rb +49 -0
  17. data/lib/commands/remove.rb +32 -0
  18. data/lib/commands/rename.rb +31 -0
  19. data/lib/commands/start.rb +36 -0
  20. data/lib/commands/sync.rb +31 -0
  21. data/lib/template/config.yml.erb +4 -0
  22. data/lib/template/content.md.erb +2 -0
  23. data/lib/template/index.erb +103 -0
  24. data/lib/template/overview_index.erb +9 -0
  25. data/lib/template/reveal.js-3.0.0/.DS_Store +0 -0
  26. data/lib/template/reveal.js-3.0.0/Gruntfile.js +174 -0
  27. data/lib/template/reveal.js-3.0.0/LICENSE +19 -0
  28. data/lib/template/reveal.js-3.0.0/css/print/paper.css +202 -0
  29. data/lib/template/reveal.js-3.0.0/css/print/pdf.css +157 -0
  30. data/lib/template/reveal.js-3.0.0/css/reveal.css +1141 -0
  31. data/lib/template/reveal.js-3.0.0/css/reveal.scss +1316 -0
  32. data/lib/template/reveal.js-3.0.0/css/theme/README.md +25 -0
  33. data/lib/template/reveal.js-3.0.0/css/theme/beige.css +265 -0
  34. data/lib/template/reveal.js-3.0.0/css/theme/black.css +261 -0
  35. data/lib/template/reveal.js-3.0.0/css/theme/blood.css +291 -0
  36. data/lib/template/reveal.js-3.0.0/css/theme/league.css +267 -0
  37. data/lib/template/reveal.js-3.0.0/css/theme/moon.css +265 -0
  38. data/lib/template/reveal.js-3.0.0/css/theme/night.css +259 -0
  39. data/lib/template/reveal.js-3.0.0/css/theme/serif.css +261 -0
  40. data/lib/template/reveal.js-3.0.0/css/theme/simple.css +261 -0
  41. data/lib/template/reveal.js-3.0.0/css/theme/sky.css +268 -0
  42. data/lib/template/reveal.js-3.0.0/css/theme/solarized.css +265 -0
  43. data/lib/template/reveal.js-3.0.0/css/theme/source/beige.scss +39 -0
  44. data/lib/template/reveal.js-3.0.0/css/theme/source/black.scss +49 -0
  45. data/lib/template/reveal.js-3.0.0/css/theme/source/blood.scss +91 -0
  46. data/lib/template/reveal.js-3.0.0/css/theme/source/league.scss +34 -0
  47. data/lib/template/reveal.js-3.0.0/css/theme/source/moon.scss +57 -0
  48. data/lib/template/reveal.js-3.0.0/css/theme/source/night.scss +35 -0
  49. data/lib/template/reveal.js-3.0.0/css/theme/source/serif.scss +35 -0
  50. data/lib/template/reveal.js-3.0.0/css/theme/source/simple.scss +38 -0
  51. data/lib/template/reveal.js-3.0.0/css/theme/source/sky.scss +46 -0
  52. data/lib/template/reveal.js-3.0.0/css/theme/source/solarized.scss +63 -0
  53. data/lib/template/reveal.js-3.0.0/css/theme/source/white.scss +49 -0
  54. data/lib/template/reveal.js-3.0.0/css/theme/template/mixins.scss +29 -0
  55. data/lib/template/reveal.js-3.0.0/css/theme/template/settings.scss +43 -0
  56. data/lib/template/reveal.js-3.0.0/css/theme/template/theme.scss +339 -0
  57. data/lib/template/reveal.js-3.0.0/css/theme/white.css +261 -0
  58. data/lib/template/reveal.js-3.0.0/js/reveal.js +4276 -0
  59. data/lib/template/reveal.js-3.0.0/lib/css/zenburn.css +117 -0
  60. data/lib/template/reveal.js-3.0.0/lib/font/league-gothic/LICENSE +2 -0
  61. data/lib/template/reveal.js-3.0.0/lib/font/league-gothic/league-gothic.css +10 -0
  62. data/lib/template/reveal.js-3.0.0/lib/font/league-gothic/league-gothic.eot +0 -0
  63. data/lib/template/reveal.js-3.0.0/lib/font/league-gothic/league-gothic.ttf +0 -0
  64. data/lib/template/reveal.js-3.0.0/lib/font/league-gothic/league-gothic.woff +0 -0
  65. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/LICENSE +45 -0
  66. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-italic.eot +0 -0
  67. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-italic.ttf +0 -0
  68. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-italic.woff +0 -0
  69. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-regular.eot +0 -0
  70. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-regular.ttf +0 -0
  71. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-regular.woff +0 -0
  72. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibold.eot +0 -0
  73. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibold.ttf +0 -0
  74. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibold.woff +0 -0
  75. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot +0 -0
  76. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf +0 -0
  77. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff +0 -0
  78. data/lib/template/reveal.js-3.0.0/lib/font/source-sans-pro/source-sans-pro.css +39 -0
  79. data/lib/template/reveal.js-3.0.0/lib/js/classList.js +2 -0
  80. data/lib/template/reveal.js-3.0.0/lib/js/head.min.js +8 -0
  81. data/lib/template/reveal.js-3.0.0/lib/js/html5shiv.js +7 -0
  82. data/lib/template/reveal.js-3.0.0/plugin/highlight/highlight.js +30 -0
  83. data/lib/template/reveal.js-3.0.0/plugin/leap/leap.js +159 -0
  84. data/lib/template/reveal.js-3.0.0/plugin/markdown/example.html +129 -0
  85. data/lib/template/reveal.js-3.0.0/plugin/markdown/example.md +31 -0
  86. data/lib/template/reveal.js-3.0.0/plugin/markdown/markdown.js +393 -0
  87. data/lib/template/reveal.js-3.0.0/plugin/markdown/marked.js +37 -0
  88. data/lib/template/reveal.js-3.0.0/plugin/math/math.js +64 -0
  89. data/lib/template/reveal.js-3.0.0/plugin/multiplex/client.js +13 -0
  90. data/lib/template/reveal.js-3.0.0/plugin/multiplex/index.js +56 -0
  91. data/lib/template/reveal.js-3.0.0/plugin/multiplex/master.js +51 -0
  92. data/lib/template/reveal.js-3.0.0/plugin/notes/notes.html +406 -0
  93. data/lib/template/reveal.js-3.0.0/plugin/notes/notes.js +122 -0
  94. data/lib/template/reveal.js-3.0.0/plugin/notes-server/client.js +60 -0
  95. data/lib/template/reveal.js-3.0.0/plugin/notes-server/index.js +66 -0
  96. data/lib/template/reveal.js-3.0.0/plugin/notes-server/notes.html +396 -0
  97. data/lib/template/reveal.js-3.0.0/plugin/print-pdf/print-pdf.js +48 -0
  98. data/lib/template/reveal.js-3.0.0/plugin/remotes/remotes.js +39 -0
  99. data/lib/template/reveal.js-3.0.0/plugin/search/search.js +196 -0
  100. data/lib/template/reveal.js-3.0.0/plugin/zoom-js/zoom.js +278 -0
  101. data/lib/template/reveal.js-3.0.0/test/examples/assets/image1.png +0 -0
  102. data/lib/template/reveal.js-3.0.0/test/examples/assets/image2.png +0 -0
  103. data/lib/template/reveal.js-3.0.0/test/examples/barebones.html +41 -0
  104. data/lib/template/reveal.js-3.0.0/test/examples/embedded-media.html +49 -0
  105. data/lib/template/reveal.js-3.0.0/test/examples/math.html +185 -0
  106. data/lib/template/reveal.js-3.0.0/test/examples/slide-backgrounds.html +144 -0
  107. data/lib/template/reveal.js-3.0.0/test/qunit-1.12.0.css +244 -0
  108. data/lib/template/reveal.js-3.0.0/test/qunit-1.12.0.js +2212 -0
  109. data/lib/template/reveal.js-3.0.0/test/test-markdown-element-attributes.html +134 -0
  110. data/lib/template/reveal.js-3.0.0/test/test-markdown-element-attributes.js +46 -0
  111. data/lib/template/reveal.js-3.0.0/test/test-markdown-slide-attributes.html +128 -0
  112. data/lib/template/reveal.js-3.0.0/test/test-markdown-slide-attributes.js +47 -0
  113. data/lib/template/reveal.js-3.0.0/test/test-markdown.html +52 -0
  114. data/lib/template/reveal.js-3.0.0/test/test-markdown.js +15 -0
  115. data/lib/template/reveal.js-3.0.0/test/test-pdf.html +83 -0
  116. data/lib/template/reveal.js-3.0.0/test/test-pdf.js +15 -0
  117. data/lib/template/reveal.js-3.0.0/test/test.html +82 -0
  118. data/lib/template/reveal.js-3.0.0/test/test.js +572 -0
  119. data/lib/util.rb +99 -0
  120. data/lib/version.rb +3 -0
  121. data/slidemgr.gemspec +24 -0
  122. metadata +193 -0
@@ -0,0 +1,572 @@
1
+
2
+ // These tests expect the DOM to contain a presentation
3
+ // with the following slide structure:
4
+ //
5
+ // 1
6
+ // 2 - Three sub-slides
7
+ // 3 - Three fragment elements
8
+ // 3 - Two fragments with same data-fragment-index
9
+ // 4
10
+
11
+
12
+ Reveal.addEventListener( 'ready', function() {
13
+
14
+ // ---------------------------------------------------------------
15
+ // DOM TESTS
16
+
17
+ QUnit.module( 'DOM' );
18
+
19
+ test( 'Initial slides classes', function() {
20
+ var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
21
+
22
+ strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
23
+ strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
24
+ strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
25
+
26
+ strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
27
+
28
+ ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
29
+ });
30
+
31
+ // ---------------------------------------------------------------
32
+ // API TESTS
33
+
34
+ QUnit.module( 'API' );
35
+
36
+ test( 'Reveal.isReady', function() {
37
+ strictEqual( Reveal.isReady(), true, 'returns true' );
38
+ });
39
+
40
+ test( 'Reveal.isOverview', function() {
41
+ strictEqual( Reveal.isOverview(), false, 'false by default' );
42
+
43
+ Reveal.toggleOverview();
44
+ strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
45
+
46
+ Reveal.toggleOverview();
47
+ strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
48
+ });
49
+
50
+ test( 'Reveal.isPaused', function() {
51
+ strictEqual( Reveal.isPaused(), false, 'false by default' );
52
+
53
+ Reveal.togglePause();
54
+ strictEqual( Reveal.isPaused(), true, 'true after pausing' );
55
+
56
+ Reveal.togglePause();
57
+ strictEqual( Reveal.isPaused(), false, 'false after resuming' );
58
+ });
59
+
60
+ test( 'Reveal.isFirstSlide', function() {
61
+ Reveal.slide( 0, 0 );
62
+ strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
63
+
64
+ Reveal.slide( 1, 0 );
65
+ strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
66
+
67
+ Reveal.slide( 0, 0 );
68
+ strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
69
+ });
70
+
71
+ test( 'Reveal.isFirstSlide after vertical slide', function() {
72
+ Reveal.slide( 1, 1 );
73
+ Reveal.slide( 0, 0 );
74
+ strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( 0, 0 )' );
75
+ });
76
+
77
+ test( 'Reveal.isLastSlide', function() {
78
+ Reveal.slide( 0, 0 );
79
+ strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
80
+
81
+ var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
82
+
83
+ Reveal.slide( lastSlideIndex, 0 );
84
+ strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( '+ lastSlideIndex +', 0 )' );
85
+
86
+ Reveal.slide( 0, 0 );
87
+ strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
88
+ });
89
+
90
+ test( 'Reveal.isLastSlide after vertical slide', function() {
91
+ var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
92
+
93
+ Reveal.slide( 1, 1 );
94
+ Reveal.slide( lastSlideIndex );
95
+ strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' );
96
+ });
97
+
98
+ test( 'Reveal.getTotalSlides', function() {
99
+ strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' );
100
+ });
101
+
102
+ test( 'Reveal.getIndices', function() {
103
+ var indices = Reveal.getIndices();
104
+
105
+ ok( indices.hasOwnProperty( 'h' ), 'h exists' );
106
+ ok( indices.hasOwnProperty( 'v' ), 'v exists' );
107
+ ok( indices.hasOwnProperty( 'f' ), 'f exists' );
108
+
109
+ Reveal.slide( 1, 0 );
110
+ strictEqual( Reveal.getIndices().h, 1, 'h 1' );
111
+ strictEqual( Reveal.getIndices().v, 0, 'v 0' );
112
+
113
+ Reveal.slide( 1, 2 );
114
+ strictEqual( Reveal.getIndices().h, 1, 'h 1' );
115
+ strictEqual( Reveal.getIndices().v, 2, 'v 2' );
116
+
117
+ Reveal.slide( 0, 0 );
118
+ strictEqual( Reveal.getIndices().h, 0, 'h 0' );
119
+ strictEqual( Reveal.getIndices().v, 0, 'v 0' );
120
+ });
121
+
122
+ test( 'Reveal.getSlide', function() {
123
+ equal( Reveal.getSlide( 0 ), document.querySelector( '.reveal .slides>section:first-child' ), 'gets correct first slide' );
124
+ equal( Reveal.getSlide( 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)' ), 'no v index returns stack' );
125
+ equal( Reveal.getSlide( 1, 0 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(1)' ), 'v index 0 returns first vertical child' );
126
+ equal( Reveal.getSlide( 1, 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(2)' ), 'v index 1 returns second vertical child' );
127
+
128
+ strictEqual( Reveal.getSlide( 100 ), undefined, 'undefined when out of horizontal bounds' );
129
+ strictEqual( Reveal.getSlide( 1, 100 ), undefined, 'undefined when out of vertical bounds' );
130
+ });
131
+
132
+ test( 'Reveal.getSlideBackground', function() {
133
+ equal( Reveal.getSlideBackground( 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ), 'gets correct first background' );
134
+ equal( Reveal.getSlideBackground( 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2)' ), 'no v index returns stack' );
135
+ equal( Reveal.getSlideBackground( 1, 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(1)' ), 'v index 0 returns first vertical child' );
136
+ equal( Reveal.getSlideBackground( 1, 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(2)' ), 'v index 1 returns second vertical child' );
137
+
138
+ strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'undefined when out of horizontal bounds' );
139
+ strictEqual( Reveal.getSlideBackground( 1, 100 ), undefined, 'undefined when out of vertical bounds' );
140
+ });
141
+
142
+ test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
143
+ Reveal.slide( 0, 0 );
144
+ Reveal.slide( 1, 0 );
145
+
146
+ var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
147
+ var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
148
+
149
+ equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
150
+ equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
151
+ });
152
+
153
+ test( 'Reveal.getProgress', function() {
154
+ Reveal.slide( 0, 0 );
155
+ strictEqual( Reveal.getProgress(), 0, 'progress is 0 on first slide' );
156
+
157
+ var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
158
+
159
+ Reveal.slide( lastSlideIndex, 0 );
160
+ strictEqual( Reveal.getProgress(), 1, 'progress is 1 on last slide' );
161
+ });
162
+
163
+ test( 'Reveal.getScale', function() {
164
+ ok( typeof Reveal.getScale() === 'number', 'has scale' );
165
+ });
166
+
167
+ test( 'Reveal.getConfig', function() {
168
+ ok( typeof Reveal.getConfig() === 'object', 'has config' );
169
+ });
170
+
171
+ test( 'Reveal.configure', function() {
172
+ strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
173
+
174
+ Reveal.configure({ loop: true });
175
+ strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
176
+
177
+ Reveal.configure({ loop: false, customTestValue: 1 });
178
+ strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
179
+ });
180
+
181
+ test( 'Reveal.availableRoutes', function() {
182
+ Reveal.slide( 0, 0 );
183
+ deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
184
+
185
+ Reveal.slide( 1, 0 );
186
+ deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
187
+ });
188
+
189
+ test( 'Reveal.next', function() {
190
+ Reveal.slide( 0, 0 );
191
+
192
+ // Step through vertical child slides
193
+ Reveal.next();
194
+ deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
195
+
196
+ Reveal.next();
197
+ deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
198
+
199
+ Reveal.next();
200
+ deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
201
+
202
+ // Step through fragments
203
+ Reveal.next();
204
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
205
+
206
+ Reveal.next();
207
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
208
+
209
+ Reveal.next();
210
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
211
+
212
+ Reveal.next();
213
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
214
+ });
215
+
216
+ test( 'Reveal.next at end', function() {
217
+ Reveal.slide( 3 );
218
+
219
+ // We're at the end, this should have no effect
220
+ Reveal.next();
221
+ deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
222
+
223
+ Reveal.next();
224
+ deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
225
+ });
226
+
227
+
228
+ // ---------------------------------------------------------------
229
+ // FRAGMENT TESTS
230
+
231
+ QUnit.module( 'Fragments' );
232
+
233
+ test( 'Sliding to fragments', function() {
234
+ Reveal.slide( 2, 0, -1 );
235
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
236
+
237
+ Reveal.slide( 2, 0, 0 );
238
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
239
+
240
+ Reveal.slide( 2, 0, 2 );
241
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
242
+
243
+ Reveal.slide( 2, 0, 1 );
244
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
245
+ });
246
+
247
+ test( 'Hiding all fragments', function() {
248
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
249
+
250
+ Reveal.slide( 2, 0, 0 );
251
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
252
+
253
+ Reveal.slide( 2, 0, -1 );
254
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
255
+ });
256
+
257
+ test( 'Current fragment', function() {
258
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
259
+
260
+ Reveal.slide( 2, 0 );
261
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
262
+
263
+ Reveal.slide( 2, 0, 0 );
264
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
265
+
266
+ Reveal.slide( 1, 0, 0 );
267
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
268
+
269
+ Reveal.slide( 3, 0, 0 );
270
+ strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
271
+ });
272
+
273
+ test( 'Stepping through fragments', function() {
274
+ Reveal.slide( 2, 0, -1 );
275
+
276
+ // forwards:
277
+
278
+ Reveal.next();
279
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
280
+
281
+ Reveal.right();
282
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
283
+
284
+ Reveal.down();
285
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
286
+
287
+ Reveal.down(); // moves to f #3
288
+
289
+ // backwards:
290
+
291
+ Reveal.prev();
292
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
293
+
294
+ Reveal.left();
295
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
296
+
297
+ Reveal.up();
298
+ deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
299
+ });
300
+
301
+ test( 'Stepping past fragments', function() {
302
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
303
+
304
+ Reveal.slide( 0, 0, 0 );
305
+ equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
306
+
307
+ Reveal.slide( 3, 0, 0 );
308
+ equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
309
+ });
310
+
311
+ test( 'Fragment indices', function() {
312
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
313
+
314
+ Reveal.slide( 3, 0, 0 );
315
+ equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
316
+
317
+ // This slide has three fragments, first one is index 0, second and third have index 1
318
+ Reveal.slide( 2, 2, 0 );
319
+ equal( Reveal.getIndices().f, 0, 'returns correct index for first fragment' );
320
+
321
+ Reveal.slide( 2, 2, 1 );
322
+ equal( Reveal.getIndices().f, 1, 'returns correct index for two fragments with same index' );
323
+ });
324
+
325
+ test( 'Index generation', function() {
326
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
327
+
328
+ // These have no indices defined to start with
329
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
330
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
331
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
332
+ });
333
+
334
+ test( 'Index normalization', function() {
335
+ var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
336
+
337
+ // These start out as 1-4-4 and should normalize to 0-1-1
338
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
339
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
340
+ equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
341
+ });
342
+
343
+ asyncTest( 'fragmentshown event', function() {
344
+ expect( 2 );
345
+
346
+ var _onEvent = function( event ) {
347
+ ok( true, 'event fired' );
348
+ }
349
+
350
+ Reveal.addEventListener( 'fragmentshown', _onEvent );
351
+
352
+ Reveal.slide( 2, 0 );
353
+ Reveal.slide( 2, 0 ); // should do nothing
354
+ Reveal.slide( 2, 0, 0 ); // should do nothing
355
+ Reveal.next();
356
+ Reveal.next();
357
+ Reveal.prev(); // shouldn't fire fragmentshown
358
+
359
+ start();
360
+
361
+ Reveal.removeEventListener( 'fragmentshown', _onEvent );
362
+ });
363
+
364
+ asyncTest( 'fragmenthidden event', function() {
365
+ expect( 2 );
366
+
367
+ var _onEvent = function( event ) {
368
+ ok( true, 'event fired' );
369
+ }
370
+
371
+ Reveal.addEventListener( 'fragmenthidden', _onEvent );
372
+
373
+ Reveal.slide( 2, 0, 2 );
374
+ Reveal.slide( 2, 0, 2 ); // should do nothing
375
+ Reveal.prev();
376
+ Reveal.prev();
377
+ Reveal.next(); // shouldn't fire fragmenthidden
378
+
379
+ start();
380
+
381
+ Reveal.removeEventListener( 'fragmenthidden', _onEvent );
382
+ });
383
+
384
+
385
+ // ---------------------------------------------------------------
386
+ // AUTO-SLIDE TESTS
387
+
388
+ QUnit.module( 'Auto Sliding' );
389
+
390
+ test( 'Reveal.isAutoSliding', function() {
391
+ strictEqual( Reveal.isAutoSliding(), false, 'false by default' );
392
+
393
+ Reveal.configure({ autoSlide: 10000 });
394
+ strictEqual( Reveal.isAutoSliding(), true, 'true after starting' );
395
+
396
+ Reveal.configure({ autoSlide: 0 });
397
+ strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' );
398
+ });
399
+
400
+ test( 'Reveal.toggleAutoSlide', function() {
401
+ Reveal.configure({ autoSlide: 10000 });
402
+
403
+ Reveal.toggleAutoSlide();
404
+ strictEqual( Reveal.isAutoSliding(), false, 'false after first toggle' );
405
+ Reveal.toggleAutoSlide();
406
+ strictEqual( Reveal.isAutoSliding(), true, 'true after second toggle' );
407
+
408
+ Reveal.configure({ autoSlide: 0 });
409
+ });
410
+
411
+ asyncTest( 'autoslidepaused', function() {
412
+ expect( 1 );
413
+
414
+ var _onEvent = function( event ) {
415
+ ok( true, 'event fired' );
416
+ }
417
+
418
+ Reveal.addEventListener( 'autoslidepaused', _onEvent );
419
+ Reveal.configure({ autoSlide: 10000 });
420
+ Reveal.toggleAutoSlide();
421
+
422
+ start();
423
+
424
+ // cleanup
425
+ Reveal.configure({ autoSlide: 0 });
426
+ Reveal.removeEventListener( 'autoslidepaused', _onEvent );
427
+ });
428
+
429
+ asyncTest( 'autoslideresumed', function() {
430
+ expect( 1 );
431
+
432
+ var _onEvent = function( event ) {
433
+ ok( true, 'event fired' );
434
+ }
435
+
436
+ Reveal.addEventListener( 'autoslideresumed', _onEvent );
437
+ Reveal.configure({ autoSlide: 10000 });
438
+ Reveal.toggleAutoSlide();
439
+ Reveal.toggleAutoSlide();
440
+
441
+ start();
442
+
443
+ // cleanup
444
+ Reveal.configure({ autoSlide: 0 });
445
+ Reveal.removeEventListener( 'autoslideresumed', _onEvent );
446
+ });
447
+
448
+
449
+ // ---------------------------------------------------------------
450
+ // CONFIGURATION VALUES
451
+
452
+ QUnit.module( 'Configuration' );
453
+
454
+ test( 'Controls', function() {
455
+ var controlsElement = document.querySelector( '.reveal>.controls' );
456
+
457
+ Reveal.configure({ controls: false });
458
+ equal( controlsElement.style.display, 'none', 'controls are hidden' );
459
+
460
+ Reveal.configure({ controls: true });
461
+ equal( controlsElement.style.display, 'block', 'controls are visible' );
462
+ });
463
+
464
+ test( 'Progress', function() {
465
+ var progressElement = document.querySelector( '.reveal>.progress' );
466
+
467
+ Reveal.configure({ progress: false });
468
+ equal( progressElement.style.display, 'none', 'progress are hidden' );
469
+
470
+ Reveal.configure({ progress: true });
471
+ equal( progressElement.style.display, 'block', 'progress are visible' );
472
+ });
473
+
474
+ test( 'Loop', function() {
475
+ Reveal.configure({ loop: true });
476
+
477
+ Reveal.slide( 0, 0 );
478
+
479
+ Reveal.left();
480
+ notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
481
+
482
+ Reveal.right();
483
+ equal( Reveal.getIndices().h, 0, 'looped from end to start' );
484
+
485
+ Reveal.configure({ loop: false });
486
+ });
487
+
488
+
489
+ // ---------------------------------------------------------------
490
+ // LAZY-LOADING TESTS
491
+
492
+ QUnit.module( 'Lazy-Loading' );
493
+
494
+ test( 'img with data-src', function() {
495
+ strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' );
496
+ });
497
+
498
+ test( 'background images', function() {
499
+ var imageSource1 = Reveal.getSlide( 0 ).getAttribute( 'data-background-image' );
500
+ var imageSource2 = Reveal.getSlide( 1, 0 ).getAttribute( 'data-background' );
501
+
502
+ // check that the images are applied to the background elements
503
+ ok( Reveal.getSlideBackground( 0 ).style.backgroundImage.indexOf( imageSource1 ) !== -1, 'data-background-image worked' );
504
+ ok( Reveal.getSlideBackground( 1, 0 ).style.backgroundImage.indexOf( imageSource2 ) !== -1, 'data-background worked' );
505
+ });
506
+
507
+
508
+ // ---------------------------------------------------------------
509
+ // EVENT TESTS
510
+
511
+ QUnit.module( 'Events' );
512
+
513
+ asyncTest( 'slidechanged', function() {
514
+ expect( 3 );
515
+
516
+ var _onEvent = function( event ) {
517
+ ok( true, 'event fired' );
518
+ }
519
+
520
+ Reveal.addEventListener( 'slidechanged', _onEvent );
521
+
522
+ Reveal.slide( 1, 0 ); // should trigger
523
+ Reveal.slide( 1, 0 ); // should do nothing
524
+ Reveal.next(); // should trigger
525
+ Reveal.slide( 3, 0 ); // should trigger
526
+ Reveal.next(); // should do nothing
527
+
528
+ start();
529
+
530
+ Reveal.removeEventListener( 'slidechanged', _onEvent );
531
+
532
+ });
533
+
534
+ asyncTest( 'paused', function() {
535
+ expect( 1 );
536
+
537
+ var _onEvent = function( event ) {
538
+ ok( true, 'event fired' );
539
+ }
540
+
541
+ Reveal.addEventListener( 'paused', _onEvent );
542
+
543
+ Reveal.togglePause();
544
+ Reveal.togglePause();
545
+
546
+ start();
547
+
548
+ Reveal.removeEventListener( 'paused', _onEvent );
549
+ });
550
+
551
+ asyncTest( 'resumed', function() {
552
+ expect( 1 );
553
+
554
+ var _onEvent = function( event ) {
555
+ ok( true, 'event fired' );
556
+ }
557
+
558
+ Reveal.addEventListener( 'resumed', _onEvent );
559
+
560
+ Reveal.togglePause();
561
+ Reveal.togglePause();
562
+
563
+ start();
564
+
565
+ Reveal.removeEventListener( 'resumed', _onEvent );
566
+ });
567
+
568
+
569
+ } );
570
+
571
+ Reveal.initialize();
572
+
data/lib/util.rb ADDED
@@ -0,0 +1,99 @@
1
+ require 'pathname'
2
+ require 'git'
3
+ require 'net/http'
4
+ require 'json'
5
+ require 'yaml'
6
+
7
+ module Util
8
+ Token = Struct.new(:socket_id,:secret)
9
+ Config = Struct.new(:host,:port,:project_name)
10
+ def content_root
11
+ return @root_dir if @root_dir
12
+ search_dir = Dir.pwd
13
+ while search_dir && !File.exist?("#{search_dir}/config.yml")
14
+ parent = File.dirname(search_dir)
15
+ # project_root wird entweder der Root-pfad oder false. Wenn es false
16
+ # wird, bricht die Schleife ab. Vgl. Rails
17
+ search_dir = (parent != search_dir) && parent
18
+ end
19
+ project_root = search_dir if File.exist? "#{search_dir}/config.yml"
20
+ raise 'you are not within a presentation-project.' unless project_root
21
+ @root_dir = Pathname.new(File.realpath project_root)
22
+ end
23
+
24
+
25
+ def parse_config
26
+ config = YAML.load_file("#{content_root}/config.yml")
27
+ Config.new(config['host'],config['port'],config['project_name'])
28
+ end
29
+
30
+ def request_token
31
+ host = parse_config.host
32
+ puts "request token from: http://#{host}"
33
+ hash = JSON.parse(Net::HTTP.get(host, '/token'))
34
+ Token.new(hash['socketId'],hash['secret'])
35
+ end
36
+
37
+
38
+ def each_presentation(&block)
39
+ path = "#{content_root}/master/slides"
40
+ Dir.entries(path)
41
+ .select { |entry| !entry.start_with? '.'}
42
+ .each{ | entry | presentation(entry,&block) }
43
+ end
44
+
45
+
46
+ def presentation(name,&block)
47
+ master_path = "#{content_root}/master/slides/#{name}"
48
+ client_path = "#{content_root}/client/slides/#{name}"
49
+ block.call master_path,client_path
50
+ end
51
+
52
+
53
+ def alter_index_html
54
+ index = "#{content_root}/client/index.html"
55
+ doc = nil
56
+ File.open index,"r+" do |file|
57
+ doc = Nokogiri::HTML(file)
58
+ yield doc
59
+ end
60
+ File.open(index,'w+') { |file| file.write(doc.to_html)} if doc
61
+ end
62
+
63
+ def alter_link(name)
64
+ alter_index_html do | doc |
65
+ link = doc.search(%Q(a[href="slides/#{name}/"])).first
66
+ yield link
67
+ end
68
+ end
69
+
70
+ # git stuff
71
+
72
+ def git_repository?
73
+ File.exist? "#{content_root}/.git"
74
+ end
75
+
76
+ def init_git(project_path,remote=nil)
77
+ g = Git.init project_path
78
+ g.add_remote 'origin',remote if remote
79
+ end
80
+
81
+ def add_to_git
82
+ g = Git.open content_root
83
+ g.add(:all=>true)
84
+ g.commit('autocommit')
85
+ g.push(g.remote('origin'),opts = {force: true}) if has_remote?(g)
86
+
87
+ rescue Git::GitExecuteError => error
88
+ puts error.message.split(":")[1]
89
+ end
90
+
91
+ def has_remote?(git)
92
+ git.remotes.count > 0
93
+ end
94
+
95
+ def pull_from_git(path)
96
+ g = Git.open(path)
97
+ g.pull('origin','master')
98
+ end
99
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module CommandRouter
2
+ VERSION = '1.0.1'
3
+ end
data/slidemgr.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'slidemgr'
8
+ spec.version = CommandRouter::VERSION
9
+ spec.authors = ['Rene Richter']
10
+ spec.email = ['Richterrettich@gmail.com']
11
+
12
+ spec.summary = 'A little programm to generate layouts for reveal.js presentations'
13
+ spec.description = 'A little programm to generate layouts for reveal.js presentations'
14
+ spec.homepage = 'https://github.com/Richterrettich/slidemgr'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.executables = 'slidemgr'
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.license = "GPLv3"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.9"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ end