dancroak-slidedown 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -74,6 +74,11 @@ Or for JavaScript
74
74
  * Generate PDFs (maybe via cucumber)
75
75
  * Stop making Nokogiri sad when parsing out snippets
76
76
 
77
+ ## Contributors
78
+
79
+ * Pat Nakajima
80
+ * Dan Croak
81
+
77
82
  (c) Copyright 2009 Pat Nakajima
78
83
 
79
84
  Permission is hereby granted, free of charge, to any person
data/lib/slide.rb CHANGED
@@ -1,12 +1,24 @@
1
1
  class Slide
2
- attr_accessor :text, :classes
2
+ attr_accessor :text, :classes, :notes
3
3
 
4
4
  def initialize(text, *classes)
5
5
  @text = text
6
6
  @classes = classes
7
+ @notes = nil
8
+
9
+ extract_notes!
7
10
  end
8
11
 
9
12
  def html
10
13
  MakersMark::Generator.new(@text).to_html
11
14
  end
15
+
16
+ private
17
+
18
+ def extract_notes!
19
+ @text.gsub!(/^!NOTES\s*(.*\n)$/m) do |note|
20
+ @notes = note.to_s.chomp.gsub('!NOTES', '')
21
+ ''
22
+ end
23
+ end
12
24
  end
data/lib/slidedown.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'optparse'
3
3
  require 'nokogiri'
4
- require 'rdiscount'
5
4
  require 'makers-mark'
6
5
  require 'erb'
7
6
  require File.join(File.dirname(__FILE__), 'slide')
@@ -10,8 +9,9 @@ $SILENT = true
10
9
 
11
10
  class SlideDown
12
11
  USAGE = "The SlideDown command line interface takes a .md (Markdown) file as its only required argument. It will convert the file to HTML in standard out. Options:
13
- -t, --template [TEMPLATE] the .erb files in /templates directory. Default is -t default, which prints stylesheets and javascripts inline. The import template uses link and script tags."
12
+ -t, --template [TEMPLATE] the .erb files in /templates directory. Default is -t default, which prints stylesheets and javascripts inline. The import template uses link and script tags. This can also accept an absolute path for templates outside the /templates directory."
14
13
 
14
+ attr_accessor :stylesheets, :title
15
15
  attr_reader :classes
16
16
 
17
17
  def self.run!(argv = ARGV)
@@ -46,9 +46,12 @@ class SlideDown
46
46
  end
47
47
 
48
48
  # Ensures that the first slide has proper !SLIDE declaration
49
- def initialize(raw)
49
+ def initialize(raw, opts = {})
50
50
  @raw = raw =~ /\A!SLIDE/ ? raw : "!SLIDE\n#{raw}"
51
51
  extract_classes!
52
+
53
+ self.stylesheets = opts[:stylesheets] || local_stylesheets
54
+ self.title = opts[:title] || "Slides"
52
55
  end
53
56
 
54
57
  def slides
@@ -60,9 +63,13 @@ class SlideDown
60
63
  end
61
64
 
62
65
  def render(name)
63
- directory = File.join(File.dirname(__FILE__), "..", "templates")
64
- path = File.join(directory, "#{name}.erb")
65
- template = File.read(path)
66
+ if is_absolute_path?(name)
67
+ template = File.read("#{name}.erb")
68
+ else
69
+ directory = File.join(File.dirname(__FILE__), "..", "templates")
70
+ path = File.join(directory, "#{name}.erb")
71
+ template = File.read(path)
72
+ end
66
73
  ERB.new(template).result(binding)
67
74
  end
68
75
 
@@ -72,11 +79,11 @@ class SlideDown
72
79
  @lines ||= @raw.split(/^!SLIDE\s*([a-z\s]*)$/).reject { |line| line.empty? }
73
80
  end
74
81
 
75
- def stylesheets
76
- Dir[Dir.pwd + '/*.stylesheets'].map { |path| File.read(path) }
82
+ def local_stylesheets
83
+ Dir[Dir.pwd + '/*.stylesheets']
77
84
  end
78
85
 
79
- def jabascripts
86
+ def javascripts
80
87
  Dir[Dir.pwd + '/*.javascripts'].map { |path| File.read(path) }
81
88
  end
82
89
 
@@ -88,4 +95,17 @@ class SlideDown
88
95
  end
89
96
  @classes
90
97
  end
98
+
99
+ def extract_notes!
100
+ @raw.gsub!(/^!NOTES\s*(.*)!SLIDE$/m) do |note|
101
+ '!SLIDE'
102
+ end
103
+ @raw.gsub!(/^!NOTES\s*(.*\n)$/m) do |note|
104
+ ''
105
+ end
106
+ end
107
+
108
+ def is_absolute_path?(path)
109
+ path == File.expand_path(path)
110
+ end
91
111
  end
@@ -0,0 +1,64 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+ require 'tempfile'
3
+ require 'ftools'
4
+
5
+ describe 'slidedown commandline tool' do
6
+ include TestHelp
7
+
8
+ it "converts MD to HTML" do
9
+ run_slidedown
10
+ result_file_content.should == reference_file_content
11
+ end
12
+
13
+ it "accepts -t template-filename" do
14
+ run_slidedown("-t import")
15
+ result_file_content.should == reference_file_content("slides-import")
16
+ end
17
+
18
+ it "defaults to default template" do
19
+ run_slidedown("-t default")
20
+ result_file_content.should == reference_file_content
21
+ end
22
+
23
+ it "accepts -t /full/path/to/template-filename" do
24
+ import_template_path = File.join(root_path, 'templates', 'import.erb')
25
+ other_template_path = Tempfile.new("slidedown-template").path
26
+ File.copy(import_template_path, "#{other_template_path}.erb")
27
+
28
+ run_slidedown("-t #{other_template_path}")
29
+
30
+ result_file_content.should == reference_file_content("slides-import")
31
+ end
32
+
33
+ def run_slidedown(opts = "")
34
+ `#{slidedown_path} #{source_path} #{opts} > #{result_file_path}`
35
+ end
36
+
37
+ def slidedown_path
38
+ File.join(root_path, 'bin', 'slidedown')
39
+ end
40
+
41
+ def source_path
42
+ File.join(root_path, 'example', 'slides.md')
43
+ end
44
+
45
+ def root_path
46
+ File.join(File.dirname(__FILE__), '..')
47
+ end
48
+
49
+ def reference_file_content(basename = 'slides')
50
+ open(reference_file_path(basename)).read
51
+ end
52
+
53
+ def reference_file_path(basename = 'slides')
54
+ File.join(root_path, 'example', "#{basename}.html")
55
+ end
56
+
57
+ def result_file_content
58
+ open(result_file_path).read
59
+ end
60
+
61
+ def result_file_path
62
+ @result_file_path_for_current_test ||= Tempfile.new("slidedown-specs").path
63
+ end
64
+ end
data/spec/helper.rb ADDED
@@ -0,0 +1,20 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), *%w[.. lib])
2
+
3
+ require 'rubygems'
4
+ require 'nokogiri'
5
+ require 'spec'
6
+ require File.join(File.dirname(__FILE__), *%w[.. lib slidedown])
7
+
8
+ module TestHelp
9
+ def slide(*args)
10
+ Slide.new(@markdown, *args)
11
+ end
12
+
13
+ def slidedown
14
+ SlideDown.new(@markdown)
15
+ end
16
+
17
+ def with_markdown(markdown)
18
+ @markdown = markdown.gsub(/^\s*\|/, '')
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ describe 'SlideDown' do
4
+ include TestHelp
5
+
6
+ it 'has text' do
7
+ with_markdown <<-MD
8
+ |# foo
9
+ MD
10
+ slide.text.should include('# foo')
11
+ end
12
+
13
+ it 'gets class names' do
14
+ with_markdown <<-MD
15
+ |# foo
16
+ MD
17
+ slide('code').classes.should == ['code']
18
+ end
19
+
20
+ it 'gets html' do
21
+ with_markdown <<-MD
22
+ |# foo
23
+ MD
24
+ Nokogiri(slide.html).at('h1').text.should == 'foo'
25
+ end
26
+
27
+ it 'syntax highlights' do
28
+ with_markdown <<-MD
29
+ |@@@ ruby
30
+ | def foo
31
+ | :bar
32
+ | end
33
+ |@@@
34
+ MD
35
+ Nokogiri(slide.html).at('.code.ruby').should_not be_nil
36
+ end
37
+ end
@@ -0,0 +1,87 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ describe 'SlideDown' do
4
+ include TestHelp
5
+
6
+ it 'finds slides' do
7
+ with_markdown <<-MD
8
+ |# First
9
+ |
10
+ |!SLIDE
11
+ |
12
+ |# Second
13
+ MD
14
+ slidedown.slides.length.should == 2
15
+ end
16
+
17
+ it 'generates HTML from markdown' do
18
+ with_markdown <<-MD
19
+ |!SLIDE
20
+ |# The title
21
+ |!SLIDE
22
+ MD
23
+ Nokogiri::HTML(slidedown.render('default')).at('h1').should_not be_nil
24
+ end
25
+
26
+ it 'adds class names to slides' do
27
+ with_markdown <<-MD
28
+ |# This is the title
29
+ |!SLIDE awesome
30
+ |# The title
31
+ MD
32
+ second_slide = Nokogiri::HTML(slidedown.render('default')).search('#track > div')[1]
33
+ second_slide['class'].should include('awesome')
34
+ end
35
+
36
+ it 'ignores content after !NOTES declaration' do
37
+ with_markdown <<-MD
38
+ |# The Title
39
+ |!NOTES
40
+ |# Some Notes
41
+ |!SLIDE
42
+ |# Another Title
43
+ |!NOTES
44
+ |# More Notes
45
+ |!SLIDE
46
+ |# Yet Another Title
47
+ MD
48
+
49
+ slidedown.slides.length.should == 3
50
+
51
+ first_slide = Nokogiri::HTML(slidedown.render('default')).search('#track > div')[0].content
52
+ second_slide = Nokogiri::HTML(slidedown.render('default')).search('#track > div')[1].content
53
+
54
+ first_slide.should_not include('Some Notes')
55
+ second_slide.should_not include('More Notes')
56
+ end
57
+
58
+ # this one is hard
59
+ it 'allows custom lexer' do
60
+ with_markdown <<-MD
61
+ |@@@ js
62
+ | (function() { })();
63
+ |@@@
64
+ MD
65
+ # slidedown.render('default')
66
+ Nokogiri(slidedown.render('default')).at('.highlight.js').should_not be_nil
67
+ end
68
+
69
+ it 'links css files' do
70
+ stylesheets = ["reset.css", "my.css"]
71
+ doggles = SlideDown.new("# doggles", :stylesheets => stylesheets)
72
+
73
+ stylesheets.each do |stylesheet|
74
+ Nokogiri(doggles.render('default')).at("link[rel='stylesheet'][href='#{stylesheet}']").should_not be_nil
75
+ end
76
+ end
77
+
78
+ it 'has a default title' do
79
+ with_markdown("# broccoli")
80
+ Nokogiri(slidedown.render('default')).at("title").text.should == "Slides"
81
+ end
82
+
83
+ it 'can be given a custom title' do
84
+ broccoli = SlideDown.new("# broccoli", :title => "Choppin")
85
+ Nokogiri(broccoli.render('default')).at("title").text.should == "Choppin"
86
+ end
87
+ end
@@ -1,13 +1,11 @@
1
1
  <html>
2
2
  <head>
3
- <title>Slides</title>
3
+ <title><%= title %></title>
4
4
  <style type="text/css" media="screen">
5
5
  <%= read('stylesheets/slides.css') %>
6
6
  </style>
7
7
  <% stylesheets.each do |style| %>
8
- <style type="text/css" media="screen">
9
- <%= style %>
10
- </style>
8
+ <link rel="stylesheet" href="<%= style %>" type="text/css" media="screen" charset="utf-8" />
11
9
  <% end %>
12
10
  <script type="text/javascript">
13
11
  <%= read('javascripts/jquery-1.3.2.js') %>
@@ -21,9 +19,9 @@
21
19
  <script type="text/javascript" charset="utf-8">
22
20
  <%= read('javascripts/slides.js') %>
23
21
  </script>
24
- <% jabascripts.each do |jaba| %>
22
+ <% javascripts.each do |javascript| %>
25
23
  <script type="text/javascript" charset="utf-8">
26
- <%= jaba %>
24
+ <%= javascript %>
27
25
  </script>
28
26
  <% end %>
29
27
  </head>
@@ -72,17 +72,28 @@
72
72
  37: -1, // ARROW LEFT
73
73
  39: 1, // ARROW RIGHT
74
74
  32: 1, // SPACE BAR
75
- 13: 1 // RETURN
75
+ 13: 1, // RETURN
76
+ left: -1,
77
+ right: 1
76
78
  }
77
79
 
78
- if (dir = DIRECTIONS[event.which]) {
80
+ if (dir = DIRECTIONS[event.which || event]) {
79
81
  setIndex(getIndex() + dir);
80
82
  }
81
83
  }
82
84
 
85
+ function clickMove(e) {
86
+ if (e.pageX < ($(window).width() / 2)) {
87
+ move('left');
88
+ } else {
89
+ move('right');
90
+ }
91
+ }
92
+
83
93
  $(window).bind('resize', function() { adjustSlides(); });
84
94
  $(document).bind('keydown', move);
85
95
  $(document).bind('hash.changed', adjustSlides);
96
+ $(document).bind('click', clickMove);
86
97
  $(document).ready(function() {
87
98
  setIndex(getIndex() || 0);
88
99
  $(this).trigger('hash.changed');
data/vendor/albino.rb CHANGED
@@ -41,7 +41,7 @@
41
41
  # Chris Wanstrath // chris@ozmm.org
42
42
  # GitHub // http://github.com
43
43
  #
44
- require 'open4'
44
+ require 'open3'
45
45
 
46
46
  class Albino
47
47
  @@bin = '/usr/local/bin/pygmentize'
@@ -60,7 +60,7 @@ class Albino
60
60
  end
61
61
 
62
62
  def execute(command)
63
- pid, stdin, stdout, stderr = Open4.popen4(command)
63
+ stdin, stdout, stderr = Open3.popen3(command)
64
64
  stdin.puts @target
65
65
  stdin.close
66
66
  stdout.read.strip
metadata CHANGED
@@ -1,19 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dancroak-slidedown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Nakajima
8
+ - Dan Croak
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-03-09 21:00:00 -07:00
13
+ date: 2009-09-24 00:00:00 -07:00
13
14
  default_executable: slidedown
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
- name: rdiscount
17
+ name: makers-mark
17
18
  type: :runtime
18
19
  version_requirement:
19
20
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,8 +39,8 @@ executables:
38
39
  - slidedown
39
40
  extensions: []
40
41
 
41
- extra_rdoc_files: []
42
-
42
+ extra_rdoc_files:
43
+ - README.md
43
44
  files:
44
45
  - README.md
45
46
  - bin/slidedown
@@ -47,20 +48,19 @@ files:
47
48
  - lib/slidedown.rb
48
49
  - templates/default.erb
49
50
  - templates/import.erb
50
- - templates/javascripts
51
51
  - templates/javascripts/jquery-1.3.2.js
52
52
  - templates/javascripts/jquery.easing.js
53
53
  - templates/javascripts/jquery.hash-changed.js
54
54
  - templates/javascripts/slides.js
55
- - templates/stylesheets
56
55
  - templates/stylesheets/screen.css
57
56
  - templates/stylesheets/slides.css
58
57
  - vendor/albino.rb
59
- has_rdoc: true
60
- homepage:
58
+ has_rdoc: false
59
+ homepage: http://github.com/nakajima/slidedown
60
+ licenses:
61
61
  post_install_message:
62
- rdoc_options: []
63
-
62
+ rdoc_options:
63
+ - --charset=UTF-8
64
64
  require_paths:
65
65
  - lib
66
66
  - vendor
@@ -79,9 +79,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  requirements: []
80
80
 
81
81
  rubyforge_project:
82
- rubygems_version: 1.2.0
82
+ rubygems_version: 1.3.5
83
83
  signing_key:
84
84
  specification_version: 2
85
85
  summary: Create slides with Markdown
86
- test_files: []
87
-
86
+ test_files:
87
+ - spec/commandline_spec.rb
88
+ - spec/helper.rb
89
+ - spec/slide_spec.rb
90
+ - spec/slidedown_spec.rb