keydown 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/{LICENSE → LICENSE.md} +0 -0
- data/README.md +2 -0
- data/keydown.gemspec +1 -0
- data/lib/keydown.rb +2 -0
- data/lib/keydown/classnames.rb +30 -0
- data/lib/keydown/code_map.rb +69 -0
- data/lib/keydown/slide.rb +13 -49
- data/lib/keydown/tasks/slides.rb +10 -2
- data/lib/version.rb +1 -1
- data/spec/lib/classnames_spec.rb +102 -0
- data/spec/lib/code_map_spec.rb +105 -0
- data/spec/lib/slide_spec.rb +47 -13
- data/spec/lib/slidedeck_spec.rb +7 -7
- data/spec/tasks/slides_spec.rb +7 -1
- data/templates/deck.js/index.html.haml +16 -17
- data/templates/deck.js/slide.html.haml +5 -3
- data/templates/generate/deck.js/core/deck.core.css +1 -1
- data/templates/keydown.scss.erb +208 -0
- metadata +41 -25
- data/VERSION +0 -1
- data/templates/keydown.css.erb +0 -46
data/{LICENSE → LICENSE.md}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -7,6 +7,8 @@ It uses the excellent [deck.js](http://imakewebthings.github.com/deck.js) and it
|
|
7
7
|
|
8
8
|
[![Build Status](https://secure.travis-ci.org/infews/keydown.png)](http://travis-ci.org/infews/keydown) at [Travis](http://travis-ci.org).
|
9
9
|
|
10
|
+
Our Github Pages is a [Sample Presentation](http://infews.github.com/keydown)
|
11
|
+
|
10
12
|
## Usage
|
11
13
|
$ gem install keydown
|
12
14
|
|
data/keydown.gemspec
CHANGED
data/lib/keydown.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Keydown
|
2
|
+
class Classnames
|
3
|
+
|
4
|
+
def initialize(names = '')
|
5
|
+
@names = []
|
6
|
+
add(names)
|
7
|
+
end
|
8
|
+
|
9
|
+
def add(names)
|
10
|
+
@names += names.split(" ")
|
11
|
+
@names.uniq!
|
12
|
+
end
|
13
|
+
|
14
|
+
def remove(names)
|
15
|
+
@names -= names.split(' ')
|
16
|
+
end
|
17
|
+
|
18
|
+
def include?(name)
|
19
|
+
@names.include? name
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash
|
23
|
+
@names.empty? ? {} : { :class => self.to_s }
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
@names.sort.join(' ')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Keydown
|
2
|
+
class CodeMap
|
3
|
+
|
4
|
+
attr_reader :mapped_text
|
5
|
+
|
6
|
+
def initialize(text)
|
7
|
+
@text = text
|
8
|
+
@map = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(id, node)
|
12
|
+
@map[id] = node
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](id)
|
16
|
+
@map[id]
|
17
|
+
end
|
18
|
+
|
19
|
+
def each(&blk)
|
20
|
+
@map.send(:each, &blk)
|
21
|
+
end
|
22
|
+
|
23
|
+
def length
|
24
|
+
@map.keys.length
|
25
|
+
end
|
26
|
+
|
27
|
+
def nodes
|
28
|
+
@map
|
29
|
+
end
|
30
|
+
|
31
|
+
def build
|
32
|
+
@mapped_text = @text.gsub(/^(```|@@@) ?(.+?)\r?\n(.+?)\r?\n(```|@@@)\r?$/m) do
|
33
|
+
language = $2
|
34
|
+
code = $3
|
35
|
+
id = Digest::SHA1.hexdigest(code)
|
36
|
+
|
37
|
+
add(id, highlight(code, language))
|
38
|
+
id
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def put_code_in(html)
|
43
|
+
each do |id, code|
|
44
|
+
html.sub!(id, code)
|
45
|
+
end
|
46
|
+
|
47
|
+
html
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.build_from(text)
|
51
|
+
map = CodeMap.new(text)
|
52
|
+
map.build
|
53
|
+
map
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
def highlight(code, language)
|
59
|
+
if code.lines.all? { |line| line =~ /\A\r?\n\Z/ || line =~ /^( |\t)/ }
|
60
|
+
code.gsub!(/^( |\t)/m, '')
|
61
|
+
end
|
62
|
+
|
63
|
+
context = OpenStruct.new :language => language, :code => code
|
64
|
+
template = Tilt.new(File.join(Tasks.template_dir, 'code.html.haml'))
|
65
|
+
|
66
|
+
template.render(context)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/keydown/slide.rb
CHANGED
@@ -4,40 +4,25 @@ module Keydown
|
|
4
4
|
attr_reader :content
|
5
5
|
attr_reader :notes
|
6
6
|
attr_reader :background_image
|
7
|
+
attr_reader :classnames
|
7
8
|
|
8
9
|
def initialize(text, classnames = '')
|
9
|
-
@content = text
|
10
10
|
@notes = ''
|
11
|
-
@codemap = {}
|
12
11
|
@background_image = {}
|
13
12
|
|
14
|
-
@
|
15
|
-
|
16
|
-
css_classnames << name
|
17
|
-
css_classnames
|
18
|
-
end
|
13
|
+
@codemap = CodeMap.build_from(text)
|
14
|
+
@content = @codemap.mapped_text
|
19
15
|
|
20
16
|
extract_notes!
|
21
17
|
extract_content!
|
22
|
-
extract_code!
|
23
18
|
extract_background_image!
|
24
|
-
highlight_code!
|
25
|
-
end
|
26
|
-
|
27
|
-
def classnames
|
28
|
-
@classnames.length > 0 ? { :class => @classnames.join(' ') } : {}
|
29
|
-
end
|
30
19
|
|
31
|
-
|
32
|
-
@
|
33
|
-
names = ['slide']
|
20
|
+
@classnames = Classnames.new('slide')
|
21
|
+
@classnames.add(classnames)
|
34
22
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
names.join(' ')
|
23
|
+
unless @background_image.empty?
|
24
|
+
@classnames.add('full-background')
|
25
|
+
@classnames.add(@background_image[:classname])
|
41
26
|
end
|
42
27
|
end
|
43
28
|
|
@@ -53,13 +38,14 @@ module Keydown
|
|
53
38
|
|
54
39
|
markdown = RDiscount.new(@content)
|
55
40
|
context = OpenStruct.new(:html_content => markdown.to_html,
|
56
|
-
:
|
57
|
-
:classnames => classnames,
|
41
|
+
:classnames => classnames.to_hash,
|
58
42
|
:background_attribution_classnames => background_attribution_classnames,
|
59
43
|
:background_image => background_image)
|
60
44
|
|
61
45
|
slide = Tilt.new(File.join(Tasks.template_dir, 'slide.html.haml'))
|
62
|
-
slide.render(context)
|
46
|
+
html = slide.render(context)
|
47
|
+
|
48
|
+
@codemap.put_code_in html
|
63
49
|
end
|
64
50
|
|
65
51
|
private
|
@@ -75,12 +61,7 @@ module Keydown
|
|
75
61
|
@content.gsub!(/^!NOTE(S)?\s*(.*\n)$/m, '')
|
76
62
|
end
|
77
63
|
|
78
|
-
def extract_code
|
79
|
-
@content.gsub!(/^(```|@@@) ?(.+?)\r?\n(.+?)\r?\n(```|@@@)\r?$/m) do
|
80
|
-
id = Digest::SHA1.hexdigest($3)
|
81
|
-
@codemap[id] = {:lang => $2, :code => $3}
|
82
|
-
id
|
83
|
-
end
|
64
|
+
def extract_code(text)
|
84
65
|
end
|
85
66
|
|
86
67
|
def extract_background_image!
|
@@ -104,22 +85,5 @@ module Keydown
|
|
104
85
|
:attribution_link => split_line[3]})
|
105
86
|
end
|
106
87
|
end
|
107
|
-
|
108
|
-
require "coderay"
|
109
|
-
|
110
|
-
def highlight_code!
|
111
|
-
@codemap.each do |id, code_block|
|
112
|
-
language = code_block[:lang]
|
113
|
-
code = code_block[:code]
|
114
|
-
if code.lines.all? { |line| line =~ /\A\r?\n\Z/ || line =~ /^( |\t)/ }
|
115
|
-
code.gsub!(/^( |\t)/m, '')
|
116
|
-
end
|
117
|
-
|
118
|
-
context = OpenStruct.new :language => language, :code => code
|
119
|
-
template = Tilt.new(File.join(Tasks.template_dir, 'code.html.haml'))
|
120
|
-
|
121
|
-
@content.gsub!(id, template.render(context))
|
122
|
-
end
|
123
|
-
end
|
124
88
|
end
|
125
89
|
end
|
data/lib/keydown/tasks/slides.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'sass'
|
2
|
+
require 'compass'
|
3
|
+
|
1
4
|
module Keydown
|
2
5
|
class Tasks < Thor
|
3
6
|
|
@@ -21,9 +24,14 @@ module Keydown
|
|
21
24
|
slide.background_image unless slide.background_image.empty?
|
22
25
|
end.compact
|
23
26
|
|
24
|
-
|
27
|
+
context = OpenStruct.new({ :backgrounds => backgrounds })
|
28
|
+
scss_template = Tilt.new(File.join(Tasks.template_dir, '..', 'keydown.scss.erb'))
|
29
|
+
scss = scss_template.render(context)
|
30
|
+
|
31
|
+
compass_path = File.join(Gem.loaded_specs['compass'].full_gem_path, 'frameworks', 'compass', 'stylesheets')
|
32
|
+
|
25
33
|
create_file 'css/keydown.css', :force => true do
|
26
|
-
|
34
|
+
Sass::Engine.new(scss, :syntax => :scss, :load_paths => [compass_path]).render
|
27
35
|
end
|
28
36
|
|
29
37
|
presentation = file.gsub('md', 'html')
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keydown::Classnames do
|
4
|
+
|
5
|
+
describe "#add" do
|
6
|
+
before do
|
7
|
+
@classnames = Keydown::Classnames.new
|
8
|
+
@classnames.add("foo")
|
9
|
+
@classnames.add("bar baz")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return an empty hash" do
|
13
|
+
@classnames.to_hash.should == {:class => "bar baz foo"}
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not duplicate classnames" do
|
17
|
+
@classnames.add("foo")
|
18
|
+
@classnames.to_hash.should == {:class => "bar baz foo"}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#remove" do
|
23
|
+
before do
|
24
|
+
@classnames = Keydown::Classnames.new
|
25
|
+
@classnames.add("foo")
|
26
|
+
@classnames.add("bar baz")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should remove a classname" do
|
30
|
+
@classnames.remove("foo")
|
31
|
+
@classnames.to_s.should_not match(/foo/)
|
32
|
+
@classnames.to_hash[:class].should_not match(/foo/)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should remove multiple classnames" do
|
36
|
+
@classnames.remove("bar baz")
|
37
|
+
@classnames.to_s.should_not match(/bar/)
|
38
|
+
@classnames.to_s.should_not match(/baz/)
|
39
|
+
@classnames.to_hash[:class].should_not match(/bar/)
|
40
|
+
@classnames.to_hash[:class].should_not match(/baz/)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#include?" do
|
45
|
+
before do
|
46
|
+
@classnames = Keydown::Classnames.new
|
47
|
+
@classnames.add("foo")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return true if the class is present" do
|
51
|
+
@classnames.include?('foo').should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should return false if the class is not present" do
|
55
|
+
@classnames.include?('bar').should be_false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#to_s" do
|
60
|
+
describe "with no classnames" do
|
61
|
+
before do
|
62
|
+
@classnames = Keydown::Classnames.new
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return an empty hash" do
|
66
|
+
@classnames.to_s.should == ''
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "with classnames" do
|
71
|
+
before do
|
72
|
+
@classnames = Keydown::Classnames.new("foo bar baz")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should return a hash of classnames for use in HAML" do
|
76
|
+
@classnames.to_s.should == 'bar baz foo'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#to_hash" do
|
82
|
+
describe "with no classnames" do
|
83
|
+
before do
|
84
|
+
@classnames = Keydown::Classnames.new
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should return an empty hash" do
|
88
|
+
@classnames.to_hash.should == {}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "with classnames" do
|
93
|
+
before do
|
94
|
+
@classnames = Keydown::Classnames.new("foo bar baz")
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should return a hash of classnames for use in HAML" do
|
98
|
+
@classnames.to_hash.should == {:class => "bar baz foo"}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keydown::CodeMap do
|
4
|
+
before :each do
|
5
|
+
module Keydown
|
6
|
+
class Tasks
|
7
|
+
def self.template_dir
|
8
|
+
File.join(Keydown::Tasks.source_root, 'templates', 'deck.js')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
let :ruby_block do
|
15
|
+
%{@@@ ruby
|
16
|
+
def a_method(options)
|
17
|
+
puts "I can has options " + options
|
18
|
+
end
|
19
|
+
@@@}
|
20
|
+
end
|
21
|
+
|
22
|
+
let :md_block do
|
23
|
+
%{``` Markdown
|
24
|
+
# I'm an H1
|
25
|
+
|
26
|
+
* list item 1
|
27
|
+
* list item 2
|
28
|
+
* list item 3
|
29
|
+
```}
|
30
|
+
end
|
31
|
+
|
32
|
+
let :slide_text do
|
33
|
+
slide_text = <<-SLIDE
|
34
|
+
# A Slide
|
35
|
+
With some text
|
36
|
+
|
37
|
+
#{ruby_block}
|
38
|
+
|
39
|
+
#{md_block}
|
40
|
+
|
41
|
+
!NOTES
|
42
|
+
a simple note
|
43
|
+
|
44
|
+
SLIDE
|
45
|
+
end
|
46
|
+
|
47
|
+
before :each do
|
48
|
+
@map = Keydown::CodeMap.new(slide_text)
|
49
|
+
@map.build
|
50
|
+
@text = @map.mapped_text
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should replace each code block with a marker" do
|
54
|
+
@text.should_not match(/ruby/)
|
55
|
+
@text.should_not match(/@@@/)
|
56
|
+
@text.should match(@map.nodes.keys[0])
|
57
|
+
@text.should_not match(/Markdown/)
|
58
|
+
@text.should_not match(/```/)
|
59
|
+
@text.should match(@map.nodes.keys[1])
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should find all the code segments" do
|
63
|
+
@map.length.should == 2
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should find and encode a code block in @@@" do
|
67
|
+
code_id = @map.nodes.keys[0]
|
68
|
+
@html = Nokogiri(@map[code_id])
|
69
|
+
|
70
|
+
@html.css('textarea.code').length.should == 1
|
71
|
+
@html.css('textarea').attr('mode').value.should == 'ruby'
|
72
|
+
@html.css('textarea').text.should match(/a_method/)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should find a code block in ```" do
|
76
|
+
code_id = @map.nodes.keys[1]
|
77
|
+
@html = Nokogiri(@map[code_id])
|
78
|
+
|
79
|
+
@html.css('textarea.code').length.should == 1
|
80
|
+
@html.css('textarea').attr('mode').value.should == 'Markdown'
|
81
|
+
@html.css('textarea').text.should match(/I'm an H1/)
|
82
|
+
end
|
83
|
+
|
84
|
+
describe ".build_form" do
|
85
|
+
before :each do
|
86
|
+
@map = Keydown::CodeMap.build_from(slide_text)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should return a built CodeMap" do
|
90
|
+
@map.length.should == 2
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#put_code_in" do
|
95
|
+
|
96
|
+
before :each do
|
97
|
+
converted = "<div>#{@map.put_code_in(@text)}</div>"
|
98
|
+
@doc = Nokogiri(converted)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should put the highligheted code back into the html" do
|
102
|
+
@doc.css('textarea.code').length.should == 2
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/spec/lib/slide_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe Keydown::Slide do
|
|
14
14
|
shared_examples_for 'extracting slide data' do
|
15
15
|
|
16
16
|
it "should set the CSS classnames" do
|
17
|
-
@slide.classnames.should == @classnames
|
17
|
+
@slide.classnames.to_s.should == @classnames
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should extract the slide content" do
|
@@ -68,7 +68,7 @@ With some text
|
|
68
68
|
a simple note
|
69
69
|
SLIDE
|
70
70
|
|
71
|
-
@classnames =
|
71
|
+
@classnames = 'slide'
|
72
72
|
@slide = Keydown::Slide.new(@slide_text)
|
73
73
|
end
|
74
74
|
|
@@ -96,7 +96,7 @@ With some text
|
|
96
96
|
a simple note
|
97
97
|
SLIDE
|
98
98
|
|
99
|
-
@classnames =
|
99
|
+
@classnames = ['foo', 'slide'].sort.join(' ')
|
100
100
|
@slide = Keydown::Slide.new(@slide_text, 'foo')
|
101
101
|
end
|
102
102
|
|
@@ -106,7 +106,7 @@ a simple note
|
|
106
106
|
before :each do
|
107
107
|
@html = @slide.to_html
|
108
108
|
@doc = Nokogiri(@html)
|
109
|
-
@slide_selector = "section.#{@classnames
|
109
|
+
@slide_selector = "section.#{@classnames}"
|
110
110
|
end
|
111
111
|
|
112
112
|
it_should_behave_like "generating HTML"
|
@@ -124,7 +124,7 @@ With some text
|
|
124
124
|
a simple note
|
125
125
|
SLIDE
|
126
126
|
|
127
|
-
@classnames =
|
127
|
+
@classnames = ['slide', 'foo', 'bar'].sort.join(' ')
|
128
128
|
@slide = Keydown::Slide.new(@slide_text, 'foo bar')
|
129
129
|
|
130
130
|
end
|
@@ -135,12 +135,46 @@ a simple note
|
|
135
135
|
before :each do
|
136
136
|
@html = @slide.to_html
|
137
137
|
@doc = Nokogiri(@html)
|
138
|
-
@slide_selector = "section.#{@classnames
|
138
|
+
@slide_selector = "section.#{@classnames}"
|
139
139
|
end
|
140
140
|
it_should_behave_like "generating HTML"
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
+
describe "with the classname of 'left'" do
|
145
|
+
before :each do
|
146
|
+
@slide_text = <<-SLIDE
|
147
|
+
|
148
|
+
# A Slide
|
149
|
+
With some text
|
150
|
+
|
151
|
+
!NOTES
|
152
|
+
a simple note
|
153
|
+
SLIDE
|
154
|
+
|
155
|
+
@classnames = ['slide', 'left', 'foo'].sort.join(' ')
|
156
|
+
@slide = Keydown::Slide.new(@slide_text, 'foo left')
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
it_should_behave_like "extracting slide data"
|
161
|
+
|
162
|
+
describe "generating HTML" do
|
163
|
+
before :each do
|
164
|
+
@html = @slide.to_html
|
165
|
+
@doc = Nokogiri(@html)
|
166
|
+
@slide_selector = "section.#{@classnames}"
|
167
|
+
end
|
168
|
+
|
169
|
+
it_should_behave_like "generating HTML"
|
170
|
+
|
171
|
+
it "should add the classname 'left' to the section (in order to justify the whole slide)" do
|
172
|
+
@doc.css('section')[0]['class'].should include('left')
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
144
178
|
describe "without a note" do
|
145
179
|
before :each do
|
146
180
|
@slide_text = <<-SLIDE
|
@@ -149,12 +183,12 @@ a simple note
|
|
149
183
|
With some text
|
150
184
|
SLIDE
|
151
185
|
|
152
|
-
@classnames =
|
186
|
+
@classnames = 'slide'
|
153
187
|
@slide = Keydown::Slide.new(@slide_text)
|
154
188
|
end
|
155
189
|
|
156
190
|
it "should set the CSS classnames" do
|
157
|
-
@slide.classnames.should == @classnames
|
191
|
+
@slide.classnames.to_s.should == @classnames
|
158
192
|
end
|
159
193
|
|
160
194
|
it "should extract the slide content" do
|
@@ -192,8 +226,8 @@ a simple note
|
|
192
226
|
|
193
227
|
SLIDE
|
194
228
|
|
195
|
-
@classnames =
|
196
|
-
template_dir = File.join(Keydown::Tasks.source_root, 'templates', '
|
229
|
+
@classnames = 'slide'
|
230
|
+
template_dir = File.join(Keydown::Tasks.source_root, 'templates', 'deck.js')
|
197
231
|
@slide = Keydown::Slide.new(@slide_text)
|
198
232
|
end
|
199
233
|
|
@@ -229,7 +263,7 @@ a simple note
|
|
229
263
|
|
230
264
|
SLIDE
|
231
265
|
|
232
|
-
@classnames =
|
266
|
+
@classnames = 'slide'
|
233
267
|
@slide = Keydown::Slide.new(@slide_text)
|
234
268
|
end
|
235
269
|
|
@@ -266,7 +300,7 @@ a simple note
|
|
266
300
|
|
267
301
|
SLIDE
|
268
302
|
|
269
|
-
@classnames =
|
303
|
+
@classnames = 'full-background my_background slide'
|
270
304
|
@slide = Keydown::Slide.new(@slide_text.chomp)
|
271
305
|
end
|
272
306
|
|
@@ -319,7 +353,7 @@ a simple note
|
|
319
353
|
|
320
354
|
SLIDE
|
321
355
|
|
322
|
-
@classnames =
|
356
|
+
@classnames = 'full-background my_background slide'
|
323
357
|
@slide = Keydown::Slide.new(@slide_text.chomp)
|
324
358
|
end
|
325
359
|
|
data/spec/lib/slidedeck_spec.rb
CHANGED
@@ -72,16 +72,16 @@ and this
|
|
72
72
|
end
|
73
73
|
|
74
74
|
it "should set the CSS classnames of each slide" do
|
75
|
-
|
75
|
+
slides = @doc.css('.slide')
|
76
76
|
|
77
|
-
first_slide =
|
78
|
-
first_slide['class'].should
|
77
|
+
first_slide = slides[0]
|
78
|
+
first_slide['class'].should == 'slide'
|
79
79
|
|
80
|
-
second_slide =
|
81
|
-
second_slide['class'].should == 'foo'
|
80
|
+
second_slide = slides[1]
|
81
|
+
second_slide['class'].should == 'foo slide'
|
82
82
|
|
83
|
-
third_slide =
|
84
|
-
third_slide['class'].should == 'foo
|
83
|
+
third_slide = slides[2]
|
84
|
+
third_slide['class'].should == 'bar foo slide'
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
data/spec/tasks/slides_spec.rb
CHANGED
@@ -79,7 +79,7 @@ describe Keydown, "`slides`" do
|
|
79
79
|
|
80
80
|
describe "should have one slide that" do
|
81
81
|
before :each do
|
82
|
-
@third_slide = @doc.css('
|
82
|
+
@third_slide = @doc.css('.slide')[2]
|
83
83
|
end
|
84
84
|
|
85
85
|
it "should have the correct css class(es)" do
|
@@ -203,6 +203,12 @@ describe Keydown, "`slides`" do
|
|
203
203
|
File.exist?("#{tmp_dir}/test/css/keydown.css").should be_true
|
204
204
|
end
|
205
205
|
|
206
|
+
it "should build a CSS file with the custom background images definitions" do
|
207
|
+
css_contents = File.read("#{tmp_dir}/test/css/keydown.css")
|
208
|
+
|
209
|
+
css_contents.should match(/\.slide\.full-background\.one/)
|
210
|
+
end
|
211
|
+
|
206
212
|
it "should add the keydown.css file to the HTML file" do
|
207
213
|
@doc.css('link[@href="css/keydown.css"]').length.should == 1
|
208
214
|
end
|
@@ -19,23 +19,22 @@
|
|
19
19
|
/ Modernizr (provided for legacy browsers)
|
20
20
|
= script "deck.js/support/modernizr.custom.js"
|
21
21
|
|
22
|
-
%body{ :class =>
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
%
|
36
|
-
|
37
|
-
|
38
|
-
%span.deck-status-total
|
22
|
+
%body{ :class => "deck-container keydown" }
|
23
|
+
- slides.each do |slide|
|
24
|
+
= slide.to_html
|
25
|
+
|
26
|
+
/ deck.js navigation extension
|
27
|
+
%a{ :href => '#', :class => 'deck-prev-link', :title => 'Previous' } ←
|
28
|
+
%a{ :href => '#', :class => 'deck-next-link', :title => 'Next' } →
|
29
|
+
|
30
|
+
/ deck.js hash extension
|
31
|
+
%a{ :href => '.', :class => 'deck-permalink', :title => 'Permalink to this slide' } #
|
32
|
+
|
33
|
+
/ deck.js status extension
|
34
|
+
%p.deck-status
|
35
|
+
%span.deck-status-current
|
36
|
+
\/
|
37
|
+
%span.deck-status-total
|
39
38
|
|
40
39
|
/ jQuery & deck.js
|
41
40
|
= script "deck.js/support/jquery.1.6.4.min.js"
|
@@ -1,6 +1,8 @@
|
|
1
|
-
%section{
|
2
|
-
|
1
|
+
%section{classnames}
|
2
|
+
.spacer.top
|
3
|
+
.content
|
3
4
|
= html_content
|
5
|
+
.spacer.bottom
|
4
6
|
- if background_attribution_classnames.length > 2
|
5
7
|
%div{:class => background_attribution_classnames}
|
6
|
-
%a{:href => background_image[:attribution_link], :target => "_blank"}= background_image[:attribution_text]
|
8
|
+
%a{:href => background_image[:attribution_link], :target => "_blank"}= background_image[:attribution_text]
|
@@ -0,0 +1,208 @@
|
|
1
|
+
@import "compass/css3";
|
2
|
+
|
3
|
+
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,700,800);
|
4
|
+
|
5
|
+
/* Reset deck.core.css */
|
6
|
+
.keydown.deck-container h1 {
|
7
|
+
font-weight: normal;
|
8
|
+
text-align: left;
|
9
|
+
padding-top: 0;
|
10
|
+
}
|
11
|
+
|
12
|
+
/* Reset deck.core.css */
|
13
|
+
.csstransforms .deck-container .slide {
|
14
|
+
|
15
|
+
h1 {
|
16
|
+
padding: 0;
|
17
|
+
left: auto;
|
18
|
+
right: auto;
|
19
|
+
top: auto;
|
20
|
+
position: relative;
|
21
|
+
|
22
|
+
@include transform(none);
|
23
|
+
}
|
24
|
+
|
25
|
+
h2 {
|
26
|
+
border: none;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
// Keydown Styles
|
31
|
+
|
32
|
+
@mixin box-vertical-center {
|
33
|
+
@include display-box;
|
34
|
+
@include box-orient(vertical);
|
35
|
+
@include box-align(center);
|
36
|
+
@include box-pack(center);
|
37
|
+
}
|
38
|
+
|
39
|
+
@mixin box-vertical-left {
|
40
|
+
@include display-box;
|
41
|
+
@include box-orient(vertical);
|
42
|
+
@include box-align(start);
|
43
|
+
@include box-pack(start);
|
44
|
+
}
|
45
|
+
|
46
|
+
html {
|
47
|
+
font-size: 20px; // allows all fonts to be in rems from here on down
|
48
|
+
}
|
49
|
+
|
50
|
+
// Presentation fills the window
|
51
|
+
body {
|
52
|
+
height: 100%;
|
53
|
+
margin: 0;
|
54
|
+
padding: 0;
|
55
|
+
background-color: #d7d7d7;
|
56
|
+
}
|
57
|
+
|
58
|
+
.keydown.deck-container {
|
59
|
+
|
60
|
+
@include box-vertical-center;
|
61
|
+
|
62
|
+
h1 {
|
63
|
+
font-family: "Open Sans", "Helvetica Neue", sans-serif;
|
64
|
+
font-size: 4.5rem;
|
65
|
+
font-weight: 800;
|
66
|
+
color: black;
|
67
|
+
text-align: none;
|
68
|
+
}
|
69
|
+
|
70
|
+
h2, h3, h4, h5, p, li {
|
71
|
+
font-family: "Open Sans", "Helvetica Neue", sans-serif;
|
72
|
+
font-weight: normal;
|
73
|
+
}
|
74
|
+
|
75
|
+
h2 {
|
76
|
+
font-size: 3.75rem;
|
77
|
+
}
|
78
|
+
|
79
|
+
h3 {
|
80
|
+
font-size: 3rem;
|
81
|
+
}
|
82
|
+
|
83
|
+
h4 {
|
84
|
+
font-size: 2.25rem;
|
85
|
+
}
|
86
|
+
|
87
|
+
p, li {
|
88
|
+
font-size: 2rem;
|
89
|
+
}
|
90
|
+
|
91
|
+
.deck-status {
|
92
|
+
font-size: .75rem;
|
93
|
+
}
|
94
|
+
|
95
|
+
.slide {
|
96
|
+
|
97
|
+
@include box-vertical-center;
|
98
|
+
|
99
|
+
background-color: white;
|
100
|
+
|
101
|
+
// for full-background images slides
|
102
|
+
&.full-background {
|
103
|
+
@include background-size(cover);
|
104
|
+
@include box-vertical-left;
|
105
|
+
|
106
|
+
<% backgrounds.each do |background| %>
|
107
|
+
&.<%= background[:classname] %> {
|
108
|
+
background-image: url(../<%= background[:path] %>);
|
109
|
+
}
|
110
|
+
<% end %>
|
111
|
+
|
112
|
+
h1 {
|
113
|
+
display: inline;
|
114
|
+
position: absolute;
|
115
|
+
background-color: rgba(0, 0, 0, 0.7);
|
116
|
+
font-weight: normal;
|
117
|
+
font-size: 3.5rem;
|
118
|
+
padding: 1rem;
|
119
|
+
color: #eee;
|
120
|
+
}
|
121
|
+
|
122
|
+
&.bottom-left {
|
123
|
+
h1 {
|
124
|
+
left: 0;
|
125
|
+
bottom: 20%;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
&.top-left {
|
130
|
+
h1 {
|
131
|
+
left: 0;
|
132
|
+
top: 20%;
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
&.bottom-right {
|
137
|
+
h1 {
|
138
|
+
right: 0;
|
139
|
+
bottom: 20%;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
&.top-right {
|
144
|
+
h1 {
|
145
|
+
right: 0;
|
146
|
+
top: 20%;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
// left justified slides
|
152
|
+
&.left {
|
153
|
+
@include box-vertical-left;
|
154
|
+
|
155
|
+
.spacer {
|
156
|
+
&.top {
|
157
|
+
@include box-flex(1);
|
158
|
+
}
|
159
|
+
&.bottom {
|
160
|
+
@include box-flex(5);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
.content {
|
165
|
+
@include box-vertical-left;
|
166
|
+
|
167
|
+
> * {
|
168
|
+
@include box-vertical-left;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
// slide content - where the Markdown goes
|
174
|
+
.content {
|
175
|
+
@include box-vertical-center;
|
176
|
+
|
177
|
+
> * {
|
178
|
+
@include box-vertical-center;
|
179
|
+
}
|
180
|
+
|
181
|
+
.CodeMirror {
|
182
|
+
font-size: 1rem;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
.attribution {
|
187
|
+
@include background-size(contain);
|
188
|
+
position: absolute;
|
189
|
+
bottom: 0;
|
190
|
+
font-size: 1.25rem;
|
191
|
+
font-family: "Open Sans", "Helvetica Neue", sans-serif;
|
192
|
+
|
193
|
+
&.flickr {
|
194
|
+
background: url(../images/flickr.png) left top no-repeat;
|
195
|
+
padding-left: 60px;
|
196
|
+
}
|
197
|
+
|
198
|
+
&.cc {
|
199
|
+
background: url(../images/cc.large.png) left top no-repeat;
|
200
|
+
padding-left: 36px;
|
201
|
+
}
|
202
|
+
|
203
|
+
a {
|
204
|
+
color: #c7c7c7;
|
205
|
+
}
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keydown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-12-04 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &70268241495180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70268241495180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: tilt
|
27
|
-
requirement: &
|
27
|
+
requirement: &70268241494760 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70268241494760
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: haml
|
38
|
-
requirement: &
|
38
|
+
requirement: &70268241494340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70268241494340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sass
|
49
|
-
requirement: &
|
49
|
+
requirement: &70268241493920 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,21 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70268241493920
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: compass
|
60
|
+
requirement: &70268241493500 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70268241493500
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: rdiscount
|
60
|
-
requirement: &
|
71
|
+
requirement: &70268241493000 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: 1.6.8
|
66
77
|
type: :runtime
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70268241493000
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: rake
|
71
|
-
requirement: &
|
82
|
+
requirement: &70268241492580 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70268241492580
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: rspec
|
82
|
-
requirement: &
|
93
|
+
requirement: &70268241492120 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70268241492120
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: fuubar
|
93
|
-
requirement: &
|
104
|
+
requirement: &70268241491700 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70268241491700
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: nokogiri
|
104
|
-
requirement: &
|
115
|
+
requirement: &70268241491280 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: '0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70268241491280
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: gem-release
|
115
|
-
requirement: &
|
126
|
+
requirement: &70268241490860 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ! '>='
|
@@ -120,7 +131,7 @@ dependencies:
|
|
120
131
|
version: '0'
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *70268241490860
|
124
135
|
description: Bastard child of Slidedown, deck.js and organic fair trade Bolivian coffee
|
125
136
|
email:
|
126
137
|
- dwfrank@infe.ws
|
@@ -134,13 +145,14 @@ files:
|
|
134
145
|
- .rvmrc
|
135
146
|
- .travis.yml
|
136
147
|
- Gemfile
|
137
|
-
- LICENSE
|
148
|
+
- LICENSE.md
|
138
149
|
- README.md
|
139
150
|
- Rakefile
|
140
|
-
- VERSION
|
141
151
|
- bin/keydown
|
142
152
|
- keydown.gemspec
|
143
153
|
- lib/keydown.rb
|
154
|
+
- lib/keydown/classnames.rb
|
155
|
+
- lib/keydown/code_map.rb
|
144
156
|
- lib/keydown/html_helpers.rb
|
145
157
|
- lib/keydown/slide.rb
|
146
158
|
- lib/keydown/slidedeck.rb
|
@@ -155,6 +167,8 @@ files:
|
|
155
167
|
- spec/fixtures/with_code.md
|
156
168
|
- spec/fixtures/with_title.md
|
157
169
|
- spec/fixtures/without_title.md
|
170
|
+
- spec/lib/classnames_spec.rb
|
171
|
+
- spec/lib/code_map_spec.rb
|
158
172
|
- spec/lib/html_helpers_spec.rb
|
159
173
|
- spec/lib/slide_spec.rb
|
160
174
|
- spec/lib/slidedeck_spec.rb
|
@@ -274,7 +288,7 @@ files:
|
|
274
288
|
- templates/generate/images/flickr.png
|
275
289
|
- templates/generate/js/%presentation_name%.js
|
276
290
|
- templates/generate/slides.md.tt
|
277
|
-
- templates/keydown.
|
291
|
+
- templates/keydown.scss.erb
|
278
292
|
homepage: http://rubygems.org/gems/keydown
|
279
293
|
licenses: []
|
280
294
|
post_install_message:
|
@@ -306,6 +320,8 @@ test_files:
|
|
306
320
|
- spec/fixtures/with_code.md
|
307
321
|
- spec/fixtures/with_title.md
|
308
322
|
- spec/fixtures/without_title.md
|
323
|
+
- spec/lib/classnames_spec.rb
|
324
|
+
- spec/lib/code_map_spec.rb
|
309
325
|
- spec/lib/html_helpers_spec.rb
|
310
326
|
- spec/lib/slide_spec.rb
|
311
327
|
- spec/lib/slidedeck_spec.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.9.0
|
data/templates/keydown.css.erb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
body.keydown {
|
2
|
-
height: 100%;
|
3
|
-
margin: 0;
|
4
|
-
padding: 0;
|
5
|
-
}
|
6
|
-
|
7
|
-
/* Full slide backgrounds */
|
8
|
-
.slide.full-background {
|
9
|
-
-webkit-background-size: cover;
|
10
|
-
-moz-background-size: cover;
|
11
|
-
background-size: cover;
|
12
|
-
background-position: center;
|
13
|
-
}
|
14
|
-
|
15
|
-
<% backgrounds.each do |background| %>
|
16
|
-
.slide.full-background.<%= background[:classname] %> {
|
17
|
-
background-image: url(../<%= background[:path] %>);
|
18
|
-
}
|
19
|
-
|
20
|
-
<% end %>
|
21
|
-
|
22
|
-
/* image attribution with service logos */
|
23
|
-
.attribution {
|
24
|
-
font-size: 24px;
|
25
|
-
position: fixed;
|
26
|
-
bottom: 8px;
|
27
|
-
left: 40px;
|
28
|
-
-webkit-background-size: contain;
|
29
|
-
-moz-background-size: contain;
|
30
|
-
background-size: contain;
|
31
|
-
}
|
32
|
-
|
33
|
-
.attribution.flickr {
|
34
|
-
background: url(../images/flickr.png) left top no-repeat;
|
35
|
-
padding-left: 60px;
|
36
|
-
}
|
37
|
-
|
38
|
-
.attribution.cc {
|
39
|
-
background: url(../images/cc.large.png) left top no-repeat;
|
40
|
-
padding-left: 36px;
|
41
|
-
}
|
42
|
-
|
43
|
-
/* Happy generic hiding class */
|
44
|
-
.hidden {
|
45
|
-
display: none;
|
46
|
-
}
|