slideoff 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 (214) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +218 -0
  5. data/bin/slideoff +127 -0
  6. data/lib/slideoff/config_builder.rb +60 -0
  7. data/lib/slideoff/flickr_api.rb +50 -0
  8. data/lib/slideoff/flickr_image.rb +92 -0
  9. data/lib/slideoff/markdown.rb +145 -0
  10. data/lib/slideoff/presentation.rb +90 -0
  11. data/lib/slideoff/remote_api.rb +53 -0
  12. data/lib/slideoff/routes.rb +20 -0
  13. data/lib/slideoff/server.rb +50 -0
  14. data/lib/slideoff/slides_api.rb +59 -0
  15. data/lib/slideoff/utils.rb +453 -0
  16. data/lib/slideoff.rb +15 -0
  17. data/themes/3d_slideshow/README +2 -0
  18. data/themes/3d_slideshow/css/main.css +232 -0
  19. data/themes/3d_slideshow/css/reset.css +57 -0
  20. data/themes/3d_slideshow/index.erb +31 -0
  21. data/themes/3d_slideshow/js/slideshow.js +288 -0
  22. data/themes/CSSS/README +2 -0
  23. data/themes/CSSS/css/slideshow.css +304 -0
  24. data/themes/CSSS/css/theme.css +250 -0
  25. data/themes/CSSS/images/rainbow-wood.jpg +0 -0
  26. data/themes/CSSS/index.erb +36 -0
  27. data/themes/CSSS/js/classList.js +116 -0
  28. data/themes/CSSS/js/prefixfree.min.js +5 -0
  29. data/themes/CSSS/js/slideshow.js +621 -0
  30. data/themes/common/css/pygments/colorful.css +62 -0
  31. data/themes/common/css/pygments/manni.css +61 -0
  32. data/themes/common/css/pygments/native.css +70 -0
  33. data/themes/common/css/pygments/solarized.css +66 -0
  34. data/themes/common/fonts/DroidSansMono.svg +626 -0
  35. data/themes/common/fonts/DroidSansMono.ttf +0 -0
  36. data/themes/common/fonts/Lato-BoldItalic.woff +0 -0
  37. data/themes/common/fonts/Lato-Italic.woff +0 -0
  38. data/themes/common/fonts/Lato-bold.woff +0 -0
  39. data/themes/common/fonts/Lato.woff +0 -0
  40. data/themes/common/fonts/OpenSans-Bold.woff +0 -0
  41. data/themes/common/fonts/OpenSans-BoldItalic.woff +0 -0
  42. data/themes/common/fonts/OpenSans-Italic.woff +0 -0
  43. data/themes/common/fonts/OpenSans.woff +0 -0
  44. data/themes/common/fonts/PTMono.woff +0 -0
  45. data/themes/common/fonts/PTSans.Bold.Italic.woff +0 -0
  46. data/themes/common/fonts/PTSans.Bold.woff +0 -0
  47. data/themes/common/fonts/PTSans.Italic.woff +0 -0
  48. data/themes/common/fonts/PTSans.Narrow.Bold.woff +0 -0
  49. data/themes/common/fonts/PTSans.Narrow.woff +0 -0
  50. data/themes/common/fonts/PTSans.woff +0 -0
  51. data/themes/common/fonts/TargetBlank.otf +0 -0
  52. data/themes/common/fonts/TargetBlank.svg +14 -0
  53. data/themes/common/fonts/YanoneKaffeesatz-Bold.woff +0 -0
  54. data/themes/common/fonts/YanoneKaffeesatz-Regular.woff +0 -0
  55. data/themes/common/fonts/crimson_text.ttf +0 -0
  56. data/themes/common/fonts/crimson_text_bold.ttf +0 -0
  57. data/themes/common/fonts/crimson_text_semibold.ttf +0 -0
  58. data/themes/common/fonts/league_gothic-webfont.ttf +0 -0
  59. data/themes/html5rocks/README +2 -0
  60. data/themes/html5rocks/css/default.css +501 -0
  61. data/themes/html5rocks/css/moon.css +543 -0
  62. data/themes/html5rocks/css/sand.css +508 -0
  63. data/themes/html5rocks/css/sea_wave.css +492 -0
  64. data/themes/html5rocks/index.erb +64 -0
  65. data/themes/html5rocks/js/slides.js +464 -0
  66. data/themes/io2012/README +2 -0
  67. data/themes/io2012/css/default.css +1481 -0
  68. data/themes/io2012/css/fonts.css +24 -0
  69. data/themes/io2012/css/phone.css +27 -0
  70. data/themes/io2012/images/google_developers_icon_128.png +0 -0
  71. data/themes/io2012/images/io2012_logo.png +0 -0
  72. data/themes/io2012/index.erb +73 -0
  73. data/themes/io2012/js/hammer.js +586 -0
  74. data/themes/io2012/js/modernizr.custom.45394.js +4 -0
  75. data/themes/io2012/js/order.js +8 -0
  76. data/themes/io2012/js/polyfills/classList.min.js +2 -0
  77. data/themes/io2012/js/polyfills/dataset.min.js +2 -0
  78. data/themes/io2012/js/polyfills/history.min.js +1 -0
  79. data/themes/io2012/js/prettify/lang-apollo.js +2 -0
  80. data/themes/io2012/js/prettify/lang-clj.js +18 -0
  81. data/themes/io2012/js/prettify/lang-css.js +2 -0
  82. data/themes/io2012/js/prettify/lang-go.js +1 -0
  83. data/themes/io2012/js/prettify/lang-hs.js +2 -0
  84. data/themes/io2012/js/prettify/lang-lisp.js +3 -0
  85. data/themes/io2012/js/prettify/lang-lua.js +2 -0
  86. data/themes/io2012/js/prettify/lang-ml.js +2 -0
  87. data/themes/io2012/js/prettify/lang-n.js +4 -0
  88. data/themes/io2012/js/prettify/lang-proto.js +1 -0
  89. data/themes/io2012/js/prettify/lang-scala.js +2 -0
  90. data/themes/io2012/js/prettify/lang-sql.js +2 -0
  91. data/themes/io2012/js/prettify/lang-tex.js +1 -0
  92. data/themes/io2012/js/prettify/lang-vb.js +2 -0
  93. data/themes/io2012/js/prettify/lang-vhdl.js +3 -0
  94. data/themes/io2012/js/prettify/lang-wiki.js +2 -0
  95. data/themes/io2012/js/prettify/lang-xq.js +3 -0
  96. data/themes/io2012/js/prettify/lang-yaml.js +2 -0
  97. data/themes/io2012/js/prettify/prettify.css +1 -0
  98. data/themes/io2012/js/prettify/prettify.js +28 -0
  99. data/themes/io2012/js/require-1.0.8.min.js +33 -0
  100. data/themes/io2012/js/slide-controller.js +109 -0
  101. data/themes/io2012/js/slide-deck.js +768 -0
  102. data/themes/io2012/js/slides.js +5 -0
  103. data/themes/memories/README +5 -0
  104. data/themes/memories/css/fonts.css +25 -0
  105. data/themes/memories/css/slideshow.css +286 -0
  106. data/themes/memories/css/theme.css +183 -0
  107. data/themes/memories/index.erb +37 -0
  108. data/themes/memories/js/prefixfree.min.js +13 -0
  109. data/themes/memories/js/slideshow.js +577 -0
  110. data/themes/modern/LICENSE +20 -0
  111. data/themes/modern/README.md +52 -0
  112. data/themes/modern/css/GENERATED_CONTENT +0 -0
  113. data/themes/modern/css/defaults.css +0 -0
  114. data/themes/modern/css/fonts.css +166 -0
  115. data/themes/modern/css/pygments/colorful.css +215 -0
  116. data/themes/modern/css/pygments/github.css +208 -0
  117. data/themes/modern/css/pygments/solarized-dark.css +213 -0
  118. data/themes/modern/css/pygments/solarized-light.css +213 -0
  119. data/themes/modern/css/reset.css +41 -0
  120. data/themes/modern/css/screen.css +1183 -0
  121. data/themes/modern/fonts/Collegiate.woff +0 -0
  122. data/themes/modern/fonts/GoudyBookletter.1911.woff +0 -0
  123. data/themes/modern/fonts/Inconsolata.Bold.woff +0 -0
  124. data/themes/modern/fonts/Inconsolata.woff +0 -0
  125. data/themes/modern/fonts/Junction.woff +0 -0
  126. data/themes/modern/fonts/LiberationMono.Bold.woff +0 -0
  127. data/themes/modern/fonts/LiberationMono.BoldItalic.woff +0 -0
  128. data/themes/modern/fonts/LiberationMono.Italic.woff +0 -0
  129. data/themes/modern/fonts/LiberationMono.Regular.woff +0 -0
  130. data/themes/modern/fonts/OpenSans.Bold.woff +0 -0
  131. data/themes/modern/fonts/OpenSans.BoldItalic.woff +0 -0
  132. data/themes/modern/fonts/OpenSans.ExtraBold.woff +0 -0
  133. data/themes/modern/fonts/OpenSans.ExtraBoldItalic.woff +0 -0
  134. data/themes/modern/fonts/OpenSans.Italic.woff +0 -0
  135. data/themes/modern/fonts/OpenSans.Light.woff +0 -0
  136. data/themes/modern/fonts/OpenSans.LightItalic.woff +0 -0
  137. data/themes/modern/fonts/OpenSans.Regular.woff +0 -0
  138. data/themes/modern/fonts/OpenSans.Semibold.woff +0 -0
  139. data/themes/modern/fonts/OpenSans.SemiboldItalic.woff +0 -0
  140. data/themes/modern/fonts/PTMono.woff +0 -0
  141. data/themes/modern/fonts/PTSans.Bold.Italic.woff +0 -0
  142. data/themes/modern/fonts/PTSans.Bold.woff +0 -0
  143. data/themes/modern/fonts/PTSans.Italic.woff +0 -0
  144. data/themes/modern/fonts/PTSans.Narrow.Bold.woff +0 -0
  145. data/themes/modern/fonts/PTSans.woff +0 -0
  146. data/themes/modern/fonts/Raleway.Thin.woff +0 -0
  147. data/themes/modern/fonts/STIXGeneral.Bold.woff +0 -0
  148. data/themes/modern/fonts/STIXGeneral.BoldItalic.woff +0 -0
  149. data/themes/modern/fonts/STIXGeneral.Italic.woff +0 -0
  150. data/themes/modern/fonts/STIXGeneral.Regular.woff +0 -0
  151. data/themes/modern/fonts/YanoneKaffeesatz.Bold.woff +0 -0
  152. data/themes/modern/fonts/YanoneKaffeesatz.ExtraLight.woff +0 -0
  153. data/themes/modern/fonts/YanoneKaffeesatz.Light.woff +0 -0
  154. data/themes/modern/fonts/YanoneKaffeesatz.Regular.woff +0 -0
  155. data/themes/modern/images/cc/by.svg +29 -0
  156. data/themes/modern/images/cc/cc-white.svg +23 -0
  157. data/themes/modern/images/cc/cc.svg +23 -0
  158. data/themes/modern/images/cc/nc-eu.svg +21 -0
  159. data/themes/modern/images/cc/nc-jp.svg +18 -0
  160. data/themes/modern/images/cc/nc.svg +23 -0
  161. data/themes/modern/images/cc/nd.svg +20 -0
  162. data/themes/modern/images/cc/pd.svg +24 -0
  163. data/themes/modern/images/cc/remix.svg +20 -0
  164. data/themes/modern/images/cc/sa.svg +22 -0
  165. data/themes/modern/images/cc/sampling.plus.svg +33 -0
  166. data/themes/modern/images/cc/sampling.svg +36 -0
  167. data/themes/modern/images/cc/share.svg +22 -0
  168. data/themes/modern/images/cc/zero.svg +24 -0
  169. data/themes/modern/images/flickr.svg +65 -0
  170. data/themes/modern/images/mesh.png +0 -0
  171. data/themes/modern/images/mesh@2x.png +0 -0
  172. data/themes/modern/images/progress-grayDark.svg +55 -0
  173. data/themes/modern/images/progress.svg +3 -0
  174. data/themes/modern/index.erb +76 -0
  175. data/themes/modern/js/highcharts.js +294 -0
  176. data/themes/modern/js/jquery-2.1.0.min.js +4 -0
  177. data/themes/modern/js/script.coffee +480 -0
  178. data/themes/modern/js/script.js +678 -0
  179. data/themes/modern/styles/_box.scss +89 -0
  180. data/themes/modern/styles/_figure.scss +81 -0
  181. data/themes/modern/styles/_full.scss +74 -0
  182. data/themes/modern/styles/_increment.scss +38 -0
  183. data/themes/modern/styles/_list.scss +129 -0
  184. data/themes/modern/styles/_progress.scss +19 -0
  185. data/themes/modern/styles/defaults.scss +46 -0
  186. data/themes/modern/styles/fonts.scss +197 -0
  187. data/themes/modern/styles/pygments/_solarized.scss +82 -0
  188. data/themes/modern/styles/pygments/colorful.scss +67 -0
  189. data/themes/modern/styles/pygments/github.scss +67 -0
  190. data/themes/modern/styles/pygments/solarized-dark.scss +15 -0
  191. data/themes/modern/styles/pygments/solarized-light.scss +15 -0
  192. data/themes/modern/styles/reset.scss +46 -0
  193. data/themes/modern/styles/screen.scss +841 -0
  194. data/themes/reveal/README +2 -0
  195. data/themes/reveal/css/main.css +1029 -0
  196. data/themes/reveal/css/reset.css +57 -0
  197. data/themes/reveal/index.erb +102 -0
  198. data/themes/reveal/js/classList.js +2 -0
  199. data/themes/reveal/js/head.min.js +8 -0
  200. data/themes/reveal/js/reveal.js +951 -0
  201. data/themes/shower/README +2 -0
  202. data/themes/shower/css/fonts.css +50 -0
  203. data/themes/shower/css/reset.css +42 -0
  204. data/themes/shower/css/style.css +418 -0
  205. data/themes/shower/images/grid.png +0 -0
  206. data/themes/shower/images/linen.png +0 -0
  207. data/themes/shower/images/ribbon.svg +4 -0
  208. data/themes/shower/index.erb +35 -0
  209. data/themes/shower/js/script.js +325 -0
  210. data/themes/template/README +5 -0
  211. data/themes/template/css/reset.css +42 -0
  212. data/themes/template/index.erb +35 -0
  213. data/themes/template/js/prefixfree.min.js +13 -0
  214. metadata +343 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 87edcce9bece900268c1ae4cb9470fa69283d469
4
+ data.tar.gz: 128ac25f3d45253eb3ec9a48109a916c409c5724
5
+ SHA512:
6
+ metadata.gz: ef2ff59adab75e9f16ea05d26243ea442975057818ccd5b2b3731babbc305e5873926a23b8f4f1a4bb6d392b086d21967e64923d6994ce2dabbda129742c05f3
7
+ data.tar.gz: 0498a98e72099a68672d5dbfe29b558471f1a9fe04186d2297a96fdb760bfcf968ca8840f5162f468c4dbfb5bbb576e272d1ab2dae7bdede68a6cf9fe8518980
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Bruno Michel <bruno.michel@af83.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,218 @@
1
+ # Slideoff
2
+
3
+ Slideoff is a presentation tool. You write some slides in markdown, choose
4
+ a style and it displays it in HTML5. With a browser in full-screen, you can
5
+ make amazing presentations!
6
+
7
+ ## Requirements
8
+
9
+ * **Ruby 1.9.3** or higher
10
+ * **Sass** for themes with sass files
11
+ * **CoffeeScript** for themes with coffee files
12
+ * **pygments** for syntax highlighting
13
+ * **wget** for static site generation
14
+ * **python3** for serving static presentation
15
+ * **git** for installing themes and make your slides version controled
16
+ * **scp** for uploading to remote host
17
+ * **Browser** for viewing presentation
18
+
19
+
20
+ ## First presentation
21
+
22
+ 1. `gem install slideoff` Install Slideoff
23
+ 1. `slideoff init mypres` Initialize presentation in `mypres/`
24
+ 1. `$EDITOR presentation.json` and add your Flickr API key
25
+ 1. `$EDITOR main/index.md` Edit your slides
26
+ 1. `slideoff serve` Start server
27
+ 1. Open <http://localhost:9000/>
28
+ 1. Use the arrows keys to navigate between slides
29
+
30
+ ## Themes
31
+
32
+ Several themes are available: `io2012`, `shower`, `3d_slideshow`, `reveal`,
33
+ `html5rocks`, `CSSS`, `memories` and `modern`. To choose the theme for your
34
+ presentation, edit the `presentation.json` file and change the `"theme"`
35
+ element.
36
+
37
+ You can also create your own theme, for example, by copying the template:
38
+
39
+ ```sh
40
+ mkdir -p ~/.slideoff
41
+ cp -r themes/template ~/.slideoff/my-theme
42
+ $EDITOR ~/.slideoff/my-theme/README
43
+ ```
44
+
45
+
46
+ ## Markup for the slides
47
+
48
+ This slides are writen in [Markdown](http://daringfireball.net/projects/markdown/syntax)
49
+ and `!SLIDE` is the indicator for a new slide.
50
+
51
+ Example:
52
+
53
+ !SLIDE
54
+ # Title of the first slide #
55
+ ## A subtitle ##
56
+ And some text...
57
+
58
+ !SLIDE
59
+ # Another slide #
60
+
61
+ * a
62
+ * bullet
63
+ * list
64
+
65
+ !SLIDE
66
+ # Third slide #
67
+
68
+ 1. **bold**
69
+ 2. _italics_
70
+ 3. https://github.com/
71
+
72
+ Many more additional elements are added. See `main/index.md` after initialization to get an example.
73
+
74
+
75
+ ## Syntax Highlighting
76
+
77
+ To highlight some code in your slides, you have to install
78
+ [pygments](http://pygments.org/). Then, surround your code with backticks
79
+ like this:
80
+
81
+ ```ruby
82
+ class Foobar
83
+ def baz
84
+ puts "Foobar says baz"
85
+ end
86
+ end
87
+ ```
88
+
89
+
90
+ ##Flickr integration
91
+
92
+ To integrate this [Flickr photo (22565509)](https://secure.flickr.com/photos/scoobymoo/22565509) you have to write this:
93
+
94
+ ```
95
+ !F[22565509]
96
+ ```
97
+
98
+ Only the ID of the photo is relevant. All other information like image source, title, author or license are requested via the Flickr
99
+ API. So it's important to generate a Flickr API key to have access to the API. You can do it on
100
+ <https://secure.flickr.com/services/apps/create/>. You have to specify this key in your `presentation.json`.
101
+
102
+
103
+ ##Boxes
104
+
105
+ ```
106
+ !SLIDE
107
+ #Boxes
108
+
109
+ +++
110
+ +++Normal box
111
+ +++Content
112
+
113
+ +++shadow
114
+ +++Box with shadow
115
+ +++Content
116
+
117
+ +++box-alert
118
+ +++Alert box
119
+ +++Content
120
+ ```
121
+
122
+
123
+ ##Description list
124
+
125
+ ```
126
+ !SLIDE
127
+ #Description list
128
+
129
+ Elephant
130
+ : big animal
131
+ House
132
+ : big garage
133
+ Car
134
+ : big bike with four wheels
135
+ Smartphone
136
+ : smart mobile phone with touch display
137
+ ```
138
+
139
+
140
+ ##Change colors
141
+
142
+ Highlighting text with red background:
143
+
144
+ ```
145
+ ==red==text==
146
+ ```
147
+
148
+ Red text:
149
+
150
+ ```
151
+ __red__text__
152
+ ```
153
+
154
+
155
+ ##Incremental view of slide
156
+
157
+ If you like to display some information incrementally, you can do it! If you specify an additional slide class `incr-list`
158
+ and all `li`-HTML-Elements will be displayed after some key strokes. For example:
159
+
160
+ ```
161
+ !SLIDE incr-list
162
+
163
+ * First item will be displayed after first key stroke
164
+ * Second item will be displayed after second key stroke
165
+ * Third item will be displayed after third key stroke
166
+ ```
167
+
168
+ If you like to add some opacity to visited elements, you can add `incr-list hover` to `!SLIDE`.
169
+
170
+ If you don't like to increment list items only, you can do it more precise. You only have to add `!PAUSE` in your slide. For example:
171
+
172
+ ```
173
+ !SLIDE
174
+
175
+ This paragraph will be displayed first.
176
+
177
+ !PAUSE
178
+
179
+ +++box-red shadow
180
+ +++Box
181
+ +++This box is displayed after one next key stroke.
182
+ ```
183
+
184
+ Try it in your example presentation after initialization.
185
+
186
+ ## Export to PDF
187
+
188
+ Change to list mode with stroking `esc` key and use your normal printer dialog. You have to specify the correct margins and paper dimensions. I added a custom "PX 1024x640" and set width to 270mm and height to 169mm and all margins to 0.
189
+
190
+ You can export your presentation to PDF by installing
191
+ [phantomjs](http://phantomjs.org/) and then run `slideoff2pdf`.
192
+
193
+
194
+ ## Issues or Suggestions
195
+
196
+ Found an issue or have a suggestion? Please report it on
197
+ [Github's issue tracker](http://github.com/DSIW/slideoff/issues).
198
+
199
+ If you wants to make a pull request, please check the specs before:
200
+
201
+ bundle exec spec/slideoff_spec.rb
202
+
203
+
204
+ ## Credits
205
+
206
+ Bruno Michel is the guy who made [Slide'em up](https://github.com/nono/slide-em-up) and Scott Chacon is the guy who made
207
+ [ShowOff](https://github.com/schacon/showoff). Slideoff is based on Slide'em up and Showoff.
208
+
209
+ Themes were picked from the internet. Thanks to:
210
+
211
+ - Hakim El Hattab for 3d_slideshow and reveal
212
+ - Google for html5rocks
213
+ - Vadim Makeev for shower
214
+ - Lea Verou for CSSS (and its modified version, memories)
215
+ - Google for io2012
216
+
217
+ ♡2014 by DSIW. Copying is an act of love. Please copy and share.
218
+ Released under the MIT license
data/bin/slideoff ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'gli'
5
+
6
+ require "slideoff"
7
+
8
+ include GLI::App
9
+
10
+ version "0.3.5" # Slideoff::VERSION
11
+
12
+
13
+ desc 'Create new slideoff presentation'
14
+ arg_name 'dir_name'
15
+ long_desc 'This command helps start a new slideoff presentation by setting up the proper directory structure for you. It takes the directory name you would like slideoff to create for you.'
16
+ command [:init] do |c|
17
+
18
+ c.action do |global_options,options,args|
19
+ raise "dir_name is required" if args.empty?
20
+ Slideoff::Utils.init_directory(args[0])
21
+ puts "Done. Run 'slideoff serve' in #{args[0]}/ dir to see slideshow"
22
+ end
23
+ end
24
+
25
+
26
+ desc 'Install new slideoff theme'
27
+ arg_name 'repository_url'
28
+ long_desc 'Installs theme under ~/.slideoff.'
29
+ command [:install_theme] do |c|
30
+ c.action do |global_options,options,args|
31
+ raise "repository_url is required" if args.empty?
32
+ Slideoff::Utils.install_theme(args[0])
33
+ puts "Done."
34
+ end
35
+ end
36
+
37
+
38
+ desc 'Puts your slideoff presentation into a gh-pages branch'
39
+ long_desc 'Generates a static version of your presentation into your gh-pages branch for publishing to GitHub Pages'
40
+ command :upload do |c|
41
+ c.desc 'Port on which to run'
42
+ c.default_value Slideoff::Server::DEFAULT_PORT
43
+ c.flag [:p,:port]
44
+
45
+ c.action do |global_options,options,args|
46
+ puts "Generating static content"
47
+ Slideoff::Utils.upload(options)
48
+ puts "Uploaded!"
49
+ end
50
+ end
51
+
52
+
53
+ desc 'Serves the slideoff presentation in the current directory'
54
+ command :serve do |c|
55
+ c.desc 'Show verbose messaging'
56
+ c.switch :verbose
57
+
58
+ c.desc 'Port on which to run'
59
+ c.default_value Slideoff::Server::DEFAULT_PORT
60
+ c.flag [:p,:port]
61
+
62
+ c.desc 'Host or ip to run on'
63
+ c.default_value Slideoff::Server::DEFAULT_ADDRESS
64
+ c.flag [:h,:host]
65
+
66
+ c.desc 'API key for remote access'
67
+ c.flag [:remote_key]
68
+
69
+ c.action do |global_options,options,args|
70
+ server = Slideoff::Server.new(options)
71
+ puts "Your remote key is #{server.remote_key}\n\n"
72
+ server.start
73
+ end
74
+ end
75
+
76
+
77
+ desc 'Generate static version of presentation'
78
+ long_desc 'Creates a static version of the presentation in "static" directory'
79
+ command [:static] do |c|
80
+ c.desc 'Port on which to run'
81
+ c.default_value Slideoff::Server::DEFAULT_PORT
82
+ c.flag [:p,:port]
83
+
84
+ c.action do |global_options,options,args|
85
+ Slideoff::Utils.generate_static(options)
86
+ end
87
+ end
88
+
89
+
90
+ desc 'Serves static version of presentation'
91
+ long_desc 'Serves static version of presentation'
92
+ command [:serve_static] do |c|
93
+ c.desc 'Port on which to run'
94
+ c.default_value "4242"
95
+ c.flag [:p,:port]
96
+
97
+ c.action do |global_options,options,args|
98
+ if File.basename(Dir.pwd) =~ /^static/
99
+ Slideoff::Utils.serve_static(options[:port], verbose: true)
100
+ else
101
+ Dir.chdir(Slideoff::Utils.static_dir) do |dir|
102
+ Slideoff::Utils.serve_static(options[:port], verbose: true)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+
109
+ pre do |global,command,options,args|
110
+ # Pre logic here
111
+ # Return true to proceed; false to abourt and not call the
112
+ # chosen command
113
+ true
114
+ end
115
+
116
+ post do |global,command,options,args|
117
+ # Post logic here
118
+ end
119
+
120
+ on_error do |exception|
121
+ # Error logic here
122
+ # return false to skip default error handling
123
+ true
124
+ end
125
+
126
+
127
+ exit run(ARGV)
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ require "yajl"
4
+ require "ostruct"
5
+
6
+ module Slideoff
7
+ class ConfigBuilder < OpenStruct
8
+ DEFAULT = {
9
+ "title" => "No title",
10
+ "theme" => "shower",
11
+ "duration" => 60,
12
+ "author" => "Max Mustermann",
13
+ "pygments_style" => "colorful"
14
+ }
15
+ SECTION_DEFAULT = {
16
+ "show_chapter" => true,
17
+ "show_toc" => true
18
+ }
19
+
20
+ def initialize(_dir)
21
+ infos = extract_normal_infos(_dir) || extract_infos_from_showoff(_dir) || {}
22
+
23
+ unless infos.empty?
24
+ infos = DEFAULT.merge({dir: _dir}.merge(infos))
25
+ infos['sections'] = infos['sections'].reduce({}) do |new_hash, (k, hash)|
26
+ new_hash.merge!(k => SECTION_DEFAULT.merge(hash))
27
+ end
28
+ Dir.chdir(_dir) do
29
+ infos['css'] = Dir["**/*.css"]
30
+ infos['js'] = Dir["**/*.js"]
31
+ end
32
+ ENV["FLICKR_API_KEY"] = infos['flickr_api_key']
33
+ end
34
+
35
+ super(infos)
36
+ end
37
+
38
+ private
39
+
40
+ def extract_normal_infos(dir)
41
+ parse_file(dir, "presentation")
42
+ end
43
+
44
+ def extract_infos_from_showoff(dir)
45
+ infos = parse_file(dir, "showoff")
46
+ sections = infos["sections"].map {|s| s["section"] }
47
+ {
48
+ "title" => infos["name"],
49
+ "theme" => "showoff",
50
+ "sections" => sections
51
+ }
52
+ end
53
+
54
+ def parse_file(dir, file)
55
+ filename = "#{dir}/#{file}.json"
56
+ return {} unless File.exists?(filename)
57
+ Yajl::Parser.parse(File.read filename)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'net/http'
4
+ require 'json'
5
+
6
+ module Slideoff
7
+ class FlickrAPIException < Exception
8
+ def initialize(code, message)
9
+ @code = code
10
+ @message = message
11
+ end
12
+
13
+ def self.from_json(json)
14
+ new(json['code'], json['message'])
15
+ end
16
+
17
+ def to_s
18
+ "#{@message} [Code: #{@code}]"
19
+ end
20
+ end
21
+
22
+ class FlickrAPI
23
+ ENDPOINT = "https://api.flickr.com/services/rest/"
24
+
25
+ DEFAULT_PARAMS = {
26
+ :api_key => CONFIG.flickr_api_key,
27
+ :format => :json,
28
+ :nojsoncallback => 1
29
+ }
30
+
31
+ def initialize(params = {})
32
+ raise "Please specify your Flickr API key in presentation.json" unless CONFIG.flickr_api_key
33
+ @params = params
34
+ end
35
+
36
+ def uri
37
+ _uri = URI(ENDPOINT)
38
+ _uri.query = URI.encode_www_form(DEFAULT_PARAMS.merge(@params))
39
+ _uri
40
+ end
41
+
42
+ def json
43
+ @json ||= begin
44
+ _json = JSON.parse(Net::HTTP.get(uri))
45
+ raise FlickrAPIException.from_json(_json) unless _json['stat'] == 'ok'
46
+ _json
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideoff
4
+ class FlickrImage
5
+ def initialize(id)
6
+ @id = id
7
+ end
8
+
9
+ def image_src
10
+ # Prefer m else lagest size
11
+ size = sizes.select { |size| %w[Large Original].include?(size["label"]) }.first || sizes.last
12
+ size["source"]
13
+ end
14
+
15
+ def sizes
16
+ @sizes ||= FlickrAPI.new(method: 'flickr.photos.getSizes', photo_id: @id).json["sizes"]["size"]
17
+ end
18
+
19
+ def author
20
+ realname = info["owner"]["realname"]
21
+ !realname.strip.empty? ? realname : info["owner"]["username"]
22
+ end
23
+
24
+ def title
25
+ info["title"]["_content"]
26
+ end
27
+
28
+ def license
29
+ license_id = info["license"]
30
+ license_id = license_id.to_i rescue 0
31
+ flickr_licenses[license_id]
32
+ end
33
+
34
+ def page
35
+ info["urls"]["url"].first["_content"]
36
+ end
37
+
38
+ private
39
+
40
+ # Source: https://secure.flickr.com/services/api/explore/flickr.photos.licenses.getInfo
41
+ def flickr_licenses
42
+ [
43
+ {
44
+ "name" => "All Rights Reserved",
45
+ "url" => ""
46
+ },
47
+ {
48
+ "name" => "Attribution-NonCommercial-ShareAlike License",
49
+ "url" => "http://creativecommons.org/licenses/by-nc-sa/2.0/",
50
+ "cc_attributes" => %w[by nc sa]
51
+ },
52
+ {
53
+ "name" => "Attribution-NonCommercial License",
54
+ "url" => "http://creativecommons.org/licenses/by-nc/2.0/",
55
+ "cc_attributes" => %w[by nc]
56
+ },
57
+ {
58
+ "name" => "Attribution-NonCommercial-NoDerivs License",
59
+ "url" => "http://creativecommons.org/licenses/by-nc-nd/2.0/",
60
+ "cc_attributes" => %w[by nc nd]
61
+ },
62
+ {
63
+ "name" => "Attribution License",
64
+ "url" => "http://creativecommons.org/licenses/by/2.0/",
65
+ "cc_attributes" => %w[by]
66
+ },
67
+ {
68
+ "name" => "Attribution-ShareAlike License",
69
+ "url" => "http://creativecommons.org/licenses/by-sa/2.0/",
70
+ "cc_attributes" => %w[by sa]
71
+ },
72
+ {
73
+ "name" => "Attribution-NoDerivs License",
74
+ "url" => "http://creativecommons.org/licenses/by-nd/2.0/",
75
+ "cc_attributes" => %w[by nd]
76
+ },
77
+ {
78
+ "name" => "No known copyright restrictions",
79
+ "url" => "http://www.flickr.com/commons/usage/"
80
+ },
81
+ {
82
+ "name" => "United States Government Work",
83
+ "url" => "http://www.usa.gov/copyright.shtml"
84
+ }
85
+ ]
86
+ end
87
+
88
+ def info
89
+ @info ||= FlickrAPI.new(method: 'flickr.photos.getInfo', photo_id: @id).json["photo"]
90
+ end
91
+ end
92
+ end