org2slides 0.2.0
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 +7 -0
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +38 -0
- data/README.MD +39 -0
- data/Rakefile +7 -0
- data/bin/org2slides +17 -0
- data/lib/org2slides.rb +286 -0
- data/org2slides.gemspec +27 -0
- data/templates/reveal_js_template/css/FMtZSYIYoYw.ttf +0 -0
- data/templates/reveal_js_template/css/LqowQDslGv4DmUBAfWa2Vw.ttf +0 -0
- data/templates/reveal_js_template/css/cDxXwCLxiixG1c.ttf +0 -0
- data/templates/reveal_js_template/css/google-fonts.css +24 -0
- data/templates/reveal_js_template/css/main.css +909 -0
- data/templates/reveal_js_template/css/print/paper.css +170 -0
- data/templates/reveal_js_template/css/print/pdf.css +158 -0
- data/templates/reveal_js_template/css/theme/beige.css +179 -0
- data/templates/reveal_js_template/css/theme/default.css +169 -0
- data/templates/reveal_js_template/css/theme/simple.css +164 -0
- data/templates/reveal_js_template/css/v0SdcGFAl2aezM9Vq_aFTQ.ttf +0 -0
- data/templates/reveal_js_template/images/gitorious-org.png +0 -0
- data/templates/reveal_js_template/index.html +231 -0
- data/templates/reveal_js_template/js/reveal.js +1131 -0
- data/templates/reveal_js_template/js/reveal.min.js +70 -0
- data/templates/reveal_js_template/lib/css/zenburn.css +115 -0
- data/templates/reveal_js_template/lib/font/league_gothic-webfont.eot +0 -0
- data/templates/reveal_js_template/lib/font/league_gothic-webfont.svg +230 -0
- data/templates/reveal_js_template/lib/font/league_gothic-webfont.ttf +0 -0
- data/templates/reveal_js_template/lib/font/league_gothic-webfont.woff +0 -0
- data/templates/reveal_js_template/lib/font/league_gothic_license +2 -0
- data/templates/reveal_js_template/lib/js/classList.js +2 -0
- data/templates/reveal_js_template/lib/js/data-markdown.js +27 -0
- data/templates/reveal_js_template/lib/js/head.min.js +8 -0
- data/templates/reveal_js_template/lib/js/highlight.js +5 -0
- data/templates/reveal_js_template/lib/js/html5shiv.js +7 -0
- data/templates/reveal_js_template/lib/js/showdown.js +1341 -0
- data/templates/reveal_js_template/package.json +20 -0
- data/todo.org +33 -0
- metadata +151 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cc9ee98ab1298e1ed3248b649f2ac695591ee3d7
|
4
|
+
data.tar.gz: 27c6e686cf855af5494229d79a44d6865396d3fe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 90da62398212a7c9c17eec20235d4cf67a08d1f3a814bb0c37460fcce5f547e2e996e62782fe2749a577679654b1be8821231cc0dbfe699ee18a7f8cda114124
|
7
|
+
data.tar.gz: 57fdf48e7fc9c77c81617d2dd099d4830bd15c61663e0f1ec1b170f8cdf35838349ed6e386cb7c75f41ee916a43d46032851cf9f10d8aac846ef4debb22379a5
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
org2slides (0.1.0)
|
5
|
+
nokogiri
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (3.2.8)
|
11
|
+
i18n (~> 0.6)
|
12
|
+
multi_json (~> 1.0)
|
13
|
+
i18n (0.6.1)
|
14
|
+
mini_portile (0.6.2)
|
15
|
+
minitest (4.0.0)
|
16
|
+
multi_json (1.3.6)
|
17
|
+
nokogiri (1.6.6.2)
|
18
|
+
mini_portile (~> 0.6.0)
|
19
|
+
org-ruby (0.9.12)
|
20
|
+
rubypants (~> 0.2)
|
21
|
+
rubypants (0.2.0)
|
22
|
+
shoulda (3.1.1)
|
23
|
+
shoulda-context (~> 1.0)
|
24
|
+
shoulda-matchers (~> 1.2)
|
25
|
+
shoulda-context (1.0.0)
|
26
|
+
shoulda-matchers (1.3.0)
|
27
|
+
activesupport (>= 3.0.0)
|
28
|
+
|
29
|
+
PLATFORMS
|
30
|
+
java
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
minitest
|
35
|
+
org-ruby
|
36
|
+
org2slides!
|
37
|
+
shoulda
|
38
|
+
shoulda-context
|
data/README.MD
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
org2slides
|
3
|
+
===
|
4
|
+
|
5
|
+
Turn .org orgmode files into html slides (via Reveal.js)
|
6
|
+
|
7
|
+
|
8
|
+
Dependencies
|
9
|
+
===========
|
10
|
+
|
11
|
+
Ruby.
|
12
|
+
|
13
|
+
|
14
|
+
Install
|
15
|
+
=======
|
16
|
+
|
17
|
+
`gem install org2slides`
|
18
|
+
|
19
|
+
|
20
|
+
Usage
|
21
|
+
=====
|
22
|
+
|
23
|
+
`org2slides ORG_FILE_PATH`
|
24
|
+
|
25
|
+
|
26
|
+
Testing
|
27
|
+
=====
|
28
|
+
|
29
|
+
To hack on this and test the code, clone it, then run the following
|
30
|
+
whenever you need to do a smoketest:
|
31
|
+
|
32
|
+
ruby -Ilib bin/org2slides test.org && open test_generated_slides/index.html
|
33
|
+
|
34
|
+
|
35
|
+
License
|
36
|
+
=======
|
37
|
+
|
38
|
+
org2slides is free software licensed under the
|
39
|
+
[GNU Affero General Public License (AGPL)](http://www.gnu.org/licenses/agpl-3.0.html).
|
data/Rakefile
ADDED
data/bin/org2slides
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "org2slides"
|
4
|
+
|
5
|
+
if ARGV.length != 1
|
6
|
+
puts "Usage: org2slides ORG_FILE_PATH"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
converter = OrgToSlides::Converter.new
|
11
|
+
htmldir_name = converter.convert(ARGV[0])
|
12
|
+
|
13
|
+
puts "\n\nSlides generated here:"
|
14
|
+
puts "#{htmldir_name}_generated_slides/index.html\n\n"
|
15
|
+
|
16
|
+
# TODO Param to display version (-v, --version)
|
17
|
+
#puts OrgToSlides::VERSION
|
data/lib/org2slides.rb
ADDED
@@ -0,0 +1,286 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module OrgToSlides
|
3
|
+
VERSION = "0.2.0"
|
4
|
+
|
5
|
+
|
6
|
+
class Converter
|
7
|
+
|
8
|
+
def body(orgfile_path)
|
9
|
+
`cat #{orgfile_path}`
|
10
|
+
end
|
11
|
+
|
12
|
+
def title(orgfile_path)
|
13
|
+
`cat #{orgfile_path} | grep "#+TITLE:" `.gsub("#+TITLE:", "").strip
|
14
|
+
end
|
15
|
+
|
16
|
+
def layout(title, body)
|
17
|
+
<<MARKUP
|
18
|
+
<!doctype html>
|
19
|
+
<html lang="en">
|
20
|
+
<head>
|
21
|
+
<meta charset="utf-8">
|
22
|
+
<title>#{title}</title>
|
23
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
24
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
25
|
+
<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
|
26
|
+
<link rel="stylesheet" href="css/main.css">
|
27
|
+
<link rel="stylesheet" href="css/theme/default.css">
|
28
|
+
<!-- For syntax highlighting -->
|
29
|
+
<link rel="stylesheet" href="lib/css/zenburn.css">
|
30
|
+
<script>
|
31
|
+
// If the query includes 'print-pdf' we'll use the PDF print sheet
|
32
|
+
document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
|
33
|
+
</script>
|
34
|
+
<!--[if lt IE 9]>
|
35
|
+
<script src="lib/js/html5shiv.js"></script>
|
36
|
+
<![endif]-->
|
37
|
+
</head>
|
38
|
+
<body>
|
39
|
+
<div class="reveal">
|
40
|
+
<!-- Used to fade in a background when a specific slide state is reached -->
|
41
|
+
<div class="state-background"></div>
|
42
|
+
|
43
|
+
<!-- Any section element inside of this container is displayed as a slide -->
|
44
|
+
<div class="slides">
|
45
|
+
|
46
|
+
#{body}
|
47
|
+
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<!-- The navigational controls UI -->
|
51
|
+
<aside class="controls">
|
52
|
+
<a class="left" href="#">◄</a>
|
53
|
+
<a class="right" href="#">►</a>
|
54
|
+
<a class="up" href="#">▲</a>
|
55
|
+
<a class="down" href="#">▼</a>
|
56
|
+
</aside>
|
57
|
+
<!-- Presentation progress bar -->
|
58
|
+
<div class="progress"><span></span></div>
|
59
|
+
</div>
|
60
|
+
<script src="lib/js/head.min.js"></script>
|
61
|
+
<script src="js/reveal.min.js"></script>
|
62
|
+
<script>
|
63
|
+
// Full list of configuration options available here:
|
64
|
+
// https://github.com/hakimel/reveal.js#configuration
|
65
|
+
Reveal.initialize({
|
66
|
+
controls: true,
|
67
|
+
progress: true,
|
68
|
+
history: true,
|
69
|
+
transition: Reveal.getQueryHash().transition || 'linear', // default/cube/page/concave/linear(2d)
|
70
|
+
// Optional libraries used to extend on reveal.js
|
71
|
+
dependencies: [
|
72
|
+
{ src: 'lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
|
73
|
+
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
|
74
|
+
{ src: 'lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
75
|
+
{ src: 'lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
76
|
+
{ src: 'socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
|
77
|
+
{ src: 'plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
|
78
|
+
]
|
79
|
+
});
|
80
|
+
</script>
|
81
|
+
</body>
|
82
|
+
</html>
|
83
|
+
MARKUP
|
84
|
+
end
|
85
|
+
|
86
|
+
def convert_old(orgfile_path)
|
87
|
+
title = "" # TODO derive title from filename and|or org contents
|
88
|
+
puts `org2html #{orgfile_path}`
|
89
|
+
htmlfile_path = orgfile_path.gsub(".org", ".html")
|
90
|
+
htmldir_name = orgfile_path.gsub(".org", "")
|
91
|
+
body = body(htmlfile_path)
|
92
|
+
body = transform_divs_into_sections(body)
|
93
|
+
body = slide_layout(title, body)
|
94
|
+
|
95
|
+
# TODO use path of this file to find dir of template dir where gem is actually located
|
96
|
+
|
97
|
+
gem_root_path = File.expand_path(File.dirname(__FILE__))+"/.."
|
98
|
+
`cp -r #{gem_root_path}/templates/reveal_js_template #{htmldir_name}_generated_slides`
|
99
|
+
File.open("#{htmldir_name}_generated_slides/index.html", 'w') { |file| file.write(body) }
|
100
|
+
`rm #{htmlfile_path}`
|
101
|
+
return htmldir_name
|
102
|
+
end
|
103
|
+
|
104
|
+
def ast_to_reveal_js_structure(ast)
|
105
|
+
slides = []
|
106
|
+
|
107
|
+
# TODO: run to_html on ruby parser ast first, or can we do it after?
|
108
|
+
|
109
|
+
ast.headlines.each do |h|
|
110
|
+
slide_title = h.body_lines[0].to_s
|
111
|
+
slide_body = h.body_lines[1..(h.body_lines.size-1)].map{|l| l.to_s}.join("\n")
|
112
|
+
slides << {:title => slide_title, :body => slide_body}
|
113
|
+
end
|
114
|
+
|
115
|
+
puts slides
|
116
|
+
end
|
117
|
+
|
118
|
+
def convert(orgfile_path)
|
119
|
+
|
120
|
+
org_body = contents = File.read(orgfile_path)
|
121
|
+
ast = Orgmode::Parser.new(org_body)
|
122
|
+
slide_markup_body = ast.to_revealjs_html
|
123
|
+
|
124
|
+
title = "" # TODO derive title from filename and|or org contents
|
125
|
+
full_body = layout(title, slide_markup_body)
|
126
|
+
|
127
|
+
#puts body
|
128
|
+
|
129
|
+
htmldir_name = orgfile_path.gsub(".org", "")
|
130
|
+
gem_root_path = File.expand_path(File.dirname(__FILE__))+"/.."
|
131
|
+
`cp -r #{gem_root_path}/templates/reveal_js_template #{htmldir_name}_generated_slides`
|
132
|
+
File.open("#{htmldir_name}_generated_slides/index.html", 'w') { |file| file.write(full_body) }
|
133
|
+
return htmldir_name
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
# For now, monkeypath in revealjs export into the org-ruby lib
|
142
|
+
|
143
|
+
require 'org-ruby'
|
144
|
+
|
145
|
+
|
146
|
+
module Orgmode
|
147
|
+
class Parser
|
148
|
+
|
149
|
+
@first_slide_done = false
|
150
|
+
|
151
|
+
def translate_to_slides(lines, output_buffer)
|
152
|
+
output_buffer.output_type = :start
|
153
|
+
lines.each do |line|
|
154
|
+
if (line.kind_of?(Headline))
|
155
|
+
|
156
|
+
if(!@first_slide_done)
|
157
|
+
@first_slide_done = true
|
158
|
+
else
|
159
|
+
output_buffer.insert_slide_stop
|
160
|
+
end
|
161
|
+
|
162
|
+
output_buffer.insert_slide_start
|
163
|
+
end
|
164
|
+
output_buffer.insert(line)
|
165
|
+
end
|
166
|
+
output_buffer.flush!
|
167
|
+
output_buffer.pop_mode while output_buffer.current_mode
|
168
|
+
output_buffer.output_footnotes!
|
169
|
+
output_buffer.output
|
170
|
+
end
|
171
|
+
|
172
|
+
def to_revealjs_html
|
173
|
+
mark_trees_for_export
|
174
|
+
export_options = {
|
175
|
+
:decorate_title => @in_buffer_settings["TITLE"],
|
176
|
+
:export_heading_number => export_heading_number?,
|
177
|
+
:export_todo => export_todo?,
|
178
|
+
:use_sub_superscripts => use_sub_superscripts?,
|
179
|
+
:export_footnotes => export_footnotes?,
|
180
|
+
:link_abbrevs => @link_abbrevs,
|
181
|
+
:skip_syntax_highlight => @parser_options[:skip_syntax_highlight],
|
182
|
+
:markup_file => @parser_options[:markup_file]
|
183
|
+
}
|
184
|
+
export_options[:skip_tables] = true if not export_tables?
|
185
|
+
output = ""
|
186
|
+
output_buffer = RevealJsHtmlBuffer.new(output, export_options)
|
187
|
+
|
188
|
+
if @in_buffer_settings["TITLE"]
|
189
|
+
|
190
|
+
# If we're given a new title, then just create a new line
|
191
|
+
# for that title.
|
192
|
+
title = Line.new(@in_buffer_settings["TITLE"], self, :title)
|
193
|
+
translate_to_slides([title], output_buffer)
|
194
|
+
end
|
195
|
+
translate_to_slides(@header_lines, output_buffer) unless skip_header_lines?
|
196
|
+
|
197
|
+
# If we've output anything at all, remove the :decorate_title option.
|
198
|
+
export_options.delete(:decorate_title) if (output.length > 0)
|
199
|
+
@headlines.each do |headline|
|
200
|
+
next if headline.export_state == :exclude
|
201
|
+
case headline.export_state
|
202
|
+
when :exclude
|
203
|
+
# NOTHING
|
204
|
+
when :headline_only
|
205
|
+
translate_to_slides(headline.body_lines[0, 1], output_buffer)
|
206
|
+
when :all
|
207
|
+
translate_to_slides(headline.body_lines, output_buffer)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
output << "\n"
|
211
|
+
|
212
|
+
return output if @parser_options[:skip_rubypants_pass]
|
213
|
+
|
214
|
+
rp = RubyPants.new(output)
|
215
|
+
|
216
|
+
unclosed_html = rp.to_html
|
217
|
+
closed_html = unclosed_html << "END-SLIDE"
|
218
|
+
sectioned_html = closed_html.gsub("START-SLIDE", "\n<section>").gsub("END-SLIDE","\n</section>")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
class RevealJsHtmlBuffer < HtmlOutputBuffer
|
224
|
+
def insert_slide_start
|
225
|
+
@buffer << "START-SLIDE"
|
226
|
+
end
|
227
|
+
|
228
|
+
def insert_slide_stop
|
229
|
+
@buffer << "END-SLIDE"
|
230
|
+
end
|
231
|
+
|
232
|
+
def insert(line)
|
233
|
+
# Prepares the output buffer to receive content from a line.
|
234
|
+
# As a side effect, this may flush the current accumulated text.
|
235
|
+
@logger.debug "Looking at #{line.paragraph_type}|#{line.assigned_paragraph_type}(#{current_mode}) : #{line.to_s}"
|
236
|
+
|
237
|
+
# We try to get the lang from #+BEGIN_SRC blocks
|
238
|
+
@block_lang = line.block_lang if line.begin_block?
|
239
|
+
unless should_accumulate_output?(line)
|
240
|
+
flush!
|
241
|
+
maintain_mode_stack(line)
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
# Adds the current line to the output buffer
|
246
|
+
case
|
247
|
+
when line.assigned_paragraph_type == :comment
|
248
|
+
# Don't add to buffer
|
249
|
+
when line.title?
|
250
|
+
@buffer << line.output_text
|
251
|
+
when line.raw_text?
|
252
|
+
@buffer << "\n" << line.output_text if line.raw_text_tag == @buffer_tag
|
253
|
+
when preserve_whitespace?
|
254
|
+
@buffer << "\n" << line.output_text unless line.block_type
|
255
|
+
when line.assigned_paragraph_type == :code
|
256
|
+
# If the line is contained within a code block but we should
|
257
|
+
# not preserve whitespaces, then we do nothing.
|
258
|
+
when (line.kind_of? Headline)
|
259
|
+
add_line_attributes line
|
260
|
+
@buffer << "\n" << line.output_text.strip
|
261
|
+
when ([:definition_term, :list_item, :table_row, :table_header,
|
262
|
+
:horizontal_rule].include? line.paragraph_type)
|
263
|
+
@buffer << "\n" << line.output_text.strip
|
264
|
+
when line.paragraph_type == :paragraph
|
265
|
+
@buffer << "\n"
|
266
|
+
buffer_indentation
|
267
|
+
@buffer << line.output_text.strip
|
268
|
+
end
|
269
|
+
|
270
|
+
if mode_is_code? current_mode and not line.block_type
|
271
|
+
# Determines the amount of whitespaces to be stripped at the
|
272
|
+
# beginning of each line in code block.
|
273
|
+
if line.paragraph_type != :blank
|
274
|
+
if @code_block_indent
|
275
|
+
@code_block_indent = [@code_block_indent, line.indent].min
|
276
|
+
else
|
277
|
+
@code_block_indent = line.indent
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
@output_type = line.assigned_paragraph_type || line.paragraph_type
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
data/org2slides.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "org2slides"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "org2slides"
|
7
|
+
s.version = OrgToSlides::VERSION
|
8
|
+
s.authors = ["Thomas Kjeldahl Nilsson"]
|
9
|
+
s.email = ["thomas@kjeldahlnilsson.net"]
|
10
|
+
s.homepage = "https://kjeldahlnilsson.net"
|
11
|
+
s.summary = %q{Turn orgfiles into Reveal.js presentations}
|
12
|
+
s.description = %q{Turn orgfiles into Reveal.js presentations}
|
13
|
+
|
14
|
+
s.rubyforge_project = "org2slides"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency "nokogiri"
|
22
|
+
|
23
|
+
s.add_development_dependency "minitest"
|
24
|
+
s.add_development_dependency "shoulda"
|
25
|
+
s.add_development_dependency "shoulda-context"
|
26
|
+
s.add_development_dependency "org-ruby"
|
27
|
+
end
|
Binary file
|