tp 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Readme.md CHANGED
@@ -20,7 +20,7 @@ Terminal Presenter
20
20
 
21
21
  # tp
22
22
 
23
- Presents Markdown in your terminal
23
+ Presents Markdown slides in your terminal
24
24
 
25
25
  # Installation
26
26
 
@@ -52,6 +52,16 @@ There can also be...
52
52
 
53
53
  ...multiple paragraphs.
54
54
 
55
+ # Code
56
+
57
+ \```rb
58
+ class And
59
+ def it
60
+ highlights(:code)
61
+ end
62
+ end
63
+ \```
64
+
55
65
  #
56
66
 
57
67
  Headers can also be blank
@@ -1,6 +1,6 @@
1
1
  class String
2
2
  def wrap(width)
3
- self.split("\n").collect { |line|
3
+ split("\n").collect { |line|
4
4
  if line.length > width
5
5
  line.gsub(/(.{1,#{width}})(\s+|$)/, "\\1\n").strip
6
6
  else
data/lib/tp.rb CHANGED
@@ -1,10 +1,15 @@
1
+ require 'coderay'
2
+
1
3
  require 'keyboard'
2
4
  require 'screen'
3
5
  require 'string'
4
-
5
6
  require 'tp/presenter'
6
7
  require 'tp/renderer'
7
8
  require 'tp/slide'
9
+ require 'tp/slide/bulleted'
10
+ require 'tp/slide/code'
11
+ require 'tp/slide/header_only'
12
+ require 'tp/slide/paragraph'
8
13
  require 'tp/slide_deck'
14
+ require 'tp/slide_factory'
9
15
  require 'tp/version'
10
-
@@ -1,9 +1,9 @@
1
1
  module TP
2
2
  class Presenter
3
- attr_accessor :markdown
3
+ attr_reader :markdown
4
4
 
5
5
  def initialize(markdown)
6
- self.markdown = markdown
6
+ @markdown = markdown
7
7
  end
8
8
 
9
9
  def present
@@ -33,7 +33,7 @@ module TP
33
33
  result.reject! &:empty?
34
34
  result.map! { |string| string.prepend "#" }
35
35
 
36
- result.map { |string| Slide.new string }
36
+ result.map { |string| SlideFactory.from_markdown string }
37
37
  end
38
38
 
39
39
  def slide_deck
@@ -1,36 +1,23 @@
1
1
  module TP
2
2
  class Renderer
3
- BULLET = "\u2022 "
3
+ attr_reader :text
4
4
 
5
- attr_accessor :slide
6
-
7
- def initialize(slide)
8
- self.slide = slide
5
+ def initialize(text)
6
+ @text = text
9
7
  end
10
8
 
11
9
  def render
12
10
  Screen.clear!
13
11
 
14
- return unless slide
15
-
16
- buffer = slide.header.center Screen.width
17
-
18
- if slide.body
19
- buffer << "\n\n"
20
-
21
- if slide.paragraph
22
- paragraph = slide.paragraph.wrap Screen.width
23
- paragraph = paragraph.center Screen.width if paragraph.lines.one?
12
+ return unless text
24
13
 
25
- buffer << paragraph
26
- else
27
- slide.bullets.each { |string| buffer << "#{BULLET}#{string}\n" }
28
- end
29
- end
30
-
31
- print buffer unless ENV['RUBY_ENV'] == 'test'
14
+ print text unless testing?
32
15
 
33
16
  true
34
17
  end
18
+
19
+ def testing?
20
+ ENV['RUBY_ENV'] == 'test'
21
+ end
35
22
  end
36
23
  end
@@ -1,9 +1,9 @@
1
1
  module TP
2
2
  class Slide
3
- attr_accessor :markdown
3
+ attr_reader :markdown
4
4
 
5
5
  def initialize(markdown)
6
- self.markdown = markdown.strip
6
+ @markdown = markdown.strip
7
7
  end
8
8
 
9
9
  def header
@@ -11,40 +11,34 @@ module TP
11
11
  line[1, line.length - 1].to_s.strip
12
12
  end
13
13
 
14
- def body
14
+ def centered_header
15
+ header.center Screen.width
16
+ end
17
+
18
+ def content
15
19
  result = lines[2, lines.count - 2]
16
20
 
17
- result.join "" if result
21
+ result.join if result
18
22
  end
19
23
 
20
- def bullets
21
- return unless body
22
-
23
- result = body.scan(/^\*\s+(.+)/).flatten
24
+ def frames
25
+ [render]
26
+ end
24
27
 
25
- result if result.any?
28
+ def lines
29
+ markdown.lines.to_a
26
30
  end
27
31
 
28
- def paragraph
29
- body unless bullets
32
+ def render
33
+ raise NotImplementedError
30
34
  end
31
35
 
32
36
  def width
33
- return header.length unless body
34
-
35
- (body.lines.to_a.collect(&:length) + [header.length]).max
37
+ raise NotImplementedError
36
38
  end
37
39
 
38
40
  def height
39
- return 1 unless body
40
-
41
- body.lines.count + 2
42
- end
43
-
44
- private
45
-
46
- def lines
47
- markdown.lines.to_a
41
+ lines.count
48
42
  end
49
43
  end
50
44
  end
@@ -0,0 +1,33 @@
1
+ class TP::Slide::Bulleted < TP::Slide
2
+ BULLET = "\u2022 "
3
+
4
+ def render
5
+ frames.last
6
+ end
7
+
8
+ def width
9
+ header_length = header.length
10
+ longest_bullet = bullets.collect(&:length).max + 2
11
+ [header_length, longest_bullet].max
12
+ end
13
+
14
+ def bullets
15
+ content.lines.to_a.map { |line| line.gsub(/^\*\s/, "").strip }
16
+ end
17
+
18
+ def frames
19
+ return @frames if @frames
20
+
21
+ buffer = centered_header
22
+ buffer << "\n\n"
23
+
24
+ @frames = [buffer.dup]
25
+
26
+ bullets.each do |bullet|
27
+ buffer << "#{BULLET} #{bullet}\n"
28
+ @frames << buffer.dup
29
+ end
30
+
31
+ @frames
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ class TP::Slide::Code < TP::Slide
2
+ def render
3
+ centered_header +
4
+ "\n\n" +
5
+ highlighted_code
6
+ end
7
+
8
+ def height
9
+ code.lines.count + 2
10
+ end
11
+
12
+ def width
13
+ lines.collect { |line| line.rstrip.length }.max
14
+ end
15
+
16
+ def code
17
+ content.lines.to_a.reject { |line| line.start_with? "```" }.join
18
+ end
19
+
20
+ def highlighted_code
21
+ CodeRay.encode(code, language, :terminal)
22
+ end
23
+
24
+ def raw_language
25
+ match = lines[2].match(/^\`{3}(\w+)/)
26
+
27
+ match[1] if match
28
+ end
29
+
30
+ def language
31
+ case raw_language
32
+ when nil then "text"
33
+ when "clj" then "clojure"
34
+ when "objc" then "cpp"
35
+ when "rb" then "ruby"
36
+ else
37
+ raw_language
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ class TP::Slide::HeaderOnly < TP::Slide
2
+ def render
3
+ centered_header
4
+ end
5
+
6
+ def width
7
+ header.length
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ class TP::Slide::Paragraph < TP::Slide
2
+ def render
3
+ centered_header +
4
+ "\n\n" +
5
+ paragraph
6
+ end
7
+
8
+ def paragraph
9
+ buffer = content.wrap Screen.width
10
+ buffer = buffer.center Screen.width if buffer.lines.one?
11
+
12
+ buffer
13
+ end
14
+
15
+ def width
16
+ content.length
17
+ end
18
+ end
@@ -1,10 +1,10 @@
1
1
  module TP
2
2
  class SlideDeck
3
- attr_accessor :cursor, :slides
3
+ attr_reader :cursor, :slides
4
4
 
5
5
  def initialize(slides)
6
- self.cursor = 0
7
- self.slides = slides
6
+ @cursor = 0
7
+ @slides = slides
8
8
  end
9
9
 
10
10
  def [](index)
@@ -26,39 +26,26 @@ module TP
26
26
  @frames = []
27
27
 
28
28
  slides.each do |slide|
29
- if slide.bullets
30
- buffer = "# #{slide.header}"
31
-
32
- @frames << Slide.new(buffer)
33
-
34
- buffer << "\n"
35
-
36
- slide.bullets.each do |bullet|
37
- buffer << "\n* #{bullet}"
38
- @frames << Slide.new(buffer)
39
- end
40
- else
41
- @frames << Slide.new("# #{slide.header}\n\n#{slide.body}")
42
- end
29
+ @frames |= slide.frames
43
30
  end
44
31
 
45
32
  @frames
46
33
  end
47
34
 
48
35
  def next
49
- self.cursor += 1
36
+ @cursor += 1
50
37
 
51
38
  current
52
39
  end
53
40
 
54
41
  def previous
55
- self.cursor -= 1
42
+ @cursor -= 1
56
43
 
57
44
  current
58
45
  end
59
46
 
60
47
  def width
61
- slides_without_paragraphs = slides.reject(&:paragraph)
48
+ slides_without_paragraphs = slides.reject { |slide| slide.class == TP::Slide::Paragraph }
62
49
 
63
50
  if slides_without_paragraphs.empty?
64
51
  [slides.collect(&:width).max, 80].min
@@ -0,0 +1,20 @@
1
+ module TP
2
+ class SlideFactory
3
+ def self.from_markdown(markdown)
4
+ lines = markdown.lines.to_a
5
+
6
+ return Slide::HeaderOnly.new markdown if lines.count < 3
7
+
8
+ content = lines[2, lines.count - 2].join
9
+
10
+ case content.lines.first
11
+ when /^\*\s/
12
+ Slide::Bulleted.new markdown
13
+ when /^\`{3}/
14
+ Slide::Code.new markdown
15
+ else
16
+ Slide::Paragraph.new markdown
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module TP
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/slides.md CHANGED
@@ -6,7 +6,7 @@ Terminal Presenter
6
6
 
7
7
  # tp
8
8
 
9
- Presents Markdown in your terminal
9
+ Presents Markdown slides in your terminal
10
10
 
11
11
  # Installation
12
12
 
@@ -38,6 +38,16 @@ There can also be...
38
38
 
39
39
  ...multiple paragraphs.
40
40
 
41
+ # Code
42
+
43
+ ```rb
44
+ class And
45
+ def it
46
+ highlights(:code)
47
+ end
48
+ end
49
+ ```
50
+
41
51
  #
42
52
 
43
53
  Headers can also be blank
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::Slide::Bulleted do
4
+ subject { slide }
5
+
6
+ let(:markdown) { "# Bullets\n\n* Bullet 1\n* Bullet 2" }
7
+ let(:slide) { klass.new markdown }
8
+
9
+ before do
10
+ Screen.stub width: 20
11
+ end
12
+
13
+ its(:width) { should == 10 }
14
+ its(:height) { should == 4 }
15
+
16
+ describe "#render" do
17
+ subject(:lines) { slide.render.lines.to_a }
18
+
19
+ it { lines.count.should == 4 }
20
+
21
+ it "centers the header" do
22
+ lines[0].should == "Bullets".center(20) + "\n"
23
+ end
24
+
25
+ it "renders bullets" do
26
+ lines[2].should == "#{TP::Slide::Bulleted::BULLET} Bullet 1\n"
27
+ lines[3].should == "#{TP::Slide::Bulleted::BULLET} Bullet 2\n"
28
+ end
29
+ end
30
+
31
+ describe "#frames" do
32
+ subject(:frames) { slide.frames }
33
+
34
+ its(:count) { should == 3 }
35
+
36
+ it "incrementally shows bullets" do
37
+ frames[0].should == "Bullets".center(20) + "\n\n"
38
+
39
+ frames[1].should == "Bullets".center(20) + "\n\n" +
40
+ "#{TP::Slide::Bulleted::BULLET} Bullet 1\n"
41
+
42
+ frames[2].should == "Bullets".center(20) + "\n\n" +
43
+ "#{TP::Slide::Bulleted::BULLET} Bullet 1\n" +
44
+ "#{TP::Slide::Bulleted::BULLET} Bullet 2\n"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::Slide::Code do
4
+ subject { slide }
5
+
6
+ let(:markdown) { "# Code\n\n```rb\nclass Thing\nend\n```" }
7
+ let(:slide) { klass.new markdown }
8
+
9
+ before do
10
+ Screen.stub width: 20
11
+ end
12
+
13
+ its(:width) { should == 11 }
14
+ its(:height) { should == 4 }
15
+
16
+ its(:code) { should == "class Thing\nend\n" }
17
+ its(:language) { should == "ruby" }
18
+
19
+ describe "#highlighted_code" do
20
+ subject(:highlighted_code) { slide.highlighted_code }
21
+
22
+ it "uses CodeRay" do
23
+ CodeRay.should_receive(:encode).with("class Thing\nend\n", "ruby", :terminal)
24
+
25
+ highlighted_code
26
+ end
27
+
28
+ context "with no language" do
29
+ let(:markdown) { "# Code\n\n```\nThis is a code block\n```" }
30
+
31
+ it "doesn't raise an error" do
32
+ highlighted_code
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "#render" do
38
+ subject(:render) { slide.render }
39
+
40
+ before do
41
+ slide.stub highlighted_code: "Highlighted code"
42
+ end
43
+
44
+ it { should == "Code".center(20) + "\n\n" + "Highlighted code" }
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::Slide::HeaderOnly do
4
+ subject { slide }
5
+
6
+ let(:markdown) { "# Header" }
7
+ let(:slide) { klass.new markdown }
8
+
9
+ before do
10
+ Screen.stub width: 20
11
+ end
12
+
13
+ its(:width) { should == 6 }
14
+ its(:height) { should == 1 }
15
+
16
+ describe "#render" do
17
+ subject(:lines) { slide.render.lines.to_a }
18
+
19
+ it { lines.count.should == 1 }
20
+
21
+ it "centers the header" do
22
+ lines[0].should == "Header".center(20)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::Slide::Paragraph do
4
+ subject { slide }
5
+
6
+ let(:markdown) { "# Paragraph\n\nShort paragraph" }
7
+ let(:slide) { klass.new markdown }
8
+
9
+ before do
10
+ Screen.stub width: 20
11
+ end
12
+
13
+ its(:width) { should == 15 }
14
+ its(:height) { should == 3 }
15
+
16
+ describe "#render" do
17
+ subject(:lines) { slide.render.lines.to_a }
18
+
19
+ it { lines.count.should == 3 }
20
+
21
+ it "centers the header" do
22
+ lines[0].should == "Paragraph".center(20) + "\n"
23
+ end
24
+
25
+ it "centers short paragraphs" do
26
+ lines[2].should == "Short paragraph".center(20)
27
+ end
28
+
29
+ context "with long paragraphs" do
30
+ let(:markdown) { "# Paragraph\n\nThis is a very long paragraph" }
31
+
32
+ it "wraps" do
33
+ lines[2].should == "This is a very long\n"
34
+ lines[3].should == "paragraph"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5,8 +5,8 @@ describe TP::SlideDeck do
5
5
 
6
6
  let(:slides) {
7
7
  [
8
- TP::Slide.new("# First Slide\n\n* Bullet 1\n* Bullet 2"),
9
- TP::Slide.new("# Second Slide\n\nThis is a paragraph")
8
+ TP::SlideFactory.from_markdown("# First Slide\n\n* Bullet 1\n* Bullet 2"),
9
+ TP::SlideFactory.from_markdown("# Second Slide\n\nThis is a paragraph")
10
10
  ]
11
11
  }
12
12
 
@@ -15,7 +15,7 @@ describe TP::SlideDeck do
15
15
 
16
16
  context "with only really long paragraphs" do
17
17
  let (:slides) {
18
- [TP::Slide.new("# First Slide\n\n#{'word ' * 100}")]
18
+ [TP::SlideFactory.from_markdown("# First Slide\n\n#{'word ' * 100}")]
19
19
  }
20
20
 
21
21
  its(:width) { should == 80 }
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::SlideFactory do
4
+ describe ".from_markdown" do
5
+ subject(:from_markdown) { klass.from_markdown markdown }
6
+
7
+ context "with only a header" do
8
+ let(:markdown) { "# Header" }
9
+
10
+ it { should be_a TP::Slide::HeaderOnly }
11
+ end
12
+
13
+ context "with a paragraph" do
14
+ let(:markdown) { "# Paragraph\n\nThis is a paragraph" }
15
+
16
+ it { should be_a TP::Slide::Paragraph }
17
+ end
18
+
19
+ context "with bullets" do
20
+ let(:markdown) { "# Bullets\n\n* Bullet" }
21
+
22
+ it { should be_a TP::Slide::Bulleted }
23
+ end
24
+
25
+ context "with a code block" do
26
+ let(:markdown) { "# Code\n\n```rb\n:test\n```" }
27
+
28
+ it { should be_a TP::Slide::Code }
29
+ end
30
+ end
31
+ end
@@ -4,86 +4,11 @@ describe TP::Slide do
4
4
  subject(:slide) { klass.new markdown }
5
5
 
6
6
  let(:markdown) {
7
- "# First Slide\n\n* Bullet 1\n* Bullet 2"
7
+ "# First Slide\n\nThis is a slide with a paragraph"
8
8
  }
9
9
 
10
10
  its(:markdown) { should == markdown }
11
11
 
12
- context "with bullets" do
13
- let(:markdown) {
14
- "# First Slide\n\n* Bullet 1\n* Bullet 2"
15
- }
16
-
17
- its(:header) { should == "First Slide" }
18
- its(:body) { should == "* Bullet 1\n* Bullet 2" }
19
-
20
- its(:bullets) { should =~ ["Bullet 1", "Bullet 2"] }
21
- its(:paragraph) { should be_nil }
22
-
23
- its(:width) { should == 11 }
24
- its(:height) { should == 4 }
25
- end
26
-
27
- context "with a paragraph" do
28
- let(:markdown) {
29
- "# First Slide\n\nThis is a paragraph of text"
30
- }
31
-
32
- its(:header) { should == "First Slide" }
33
- its(:body) { should == "This is a paragraph of text" }
34
-
35
- its(:bullets) { should be_nil }
36
- its(:paragraph) { should == "This is a paragraph of text" }
37
-
38
- its(:width) { should == 27 }
39
- its(:height) { should == 3 }
40
- end
41
-
42
- context "with just a header" do
43
- let(:markdown) {
44
- "# First Slide"
45
- }
46
-
47
- its(:header) { should == "First Slide" }
48
- its(:body) { should be_nil }
49
-
50
- its(:bullets) { should be_nil }
51
- its(:paragraph) { should be_nil }
52
-
53
- its(:width) { should == 11 }
54
- its(:height) { should == 1 }
55
- end
56
-
57
- context "with a header longer than the paragraph" do
58
- let(:markdown) {
59
- "# This is a very long header\n\nand short paragraph"
60
- }
61
-
62
- its(:width) { should == 26 }
63
- end
64
-
65
- context "with a blank header" do
66
- let(:markdown) {
67
- "#\n\nFirst Slide"
68
- }
69
-
70
- its(:header) { should be_empty }
71
- its(:body) { should == "First Slide" }
72
-
73
- its(:bullets) { should be_nil }
74
- its(:paragraph) { should == "First Slide" }
75
-
76
- its(:width) { should == 11 }
77
- its(:height) { should == 3 }
78
- end
79
-
80
- context "with trailing newlines" do
81
- let(:markdown) {
82
- "# First Slide\n\n* Bullet 1\n* Bullet 2\n\n"
83
- }
84
-
85
- it "strips whitespace" do
86
- slide.markdown.should == "# First Slide\n\n* Bullet 1\n* Bullet 2"
87
- end
88
- end
12
+ its(:header) { should == "First Slide" }
13
+ its(:content) { should == "This is a slide with a paragraph" }
89
14
  end
data/tp.gemspec CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |gem|
10
10
  gem.version = TP::VERSION
11
11
  gem.authors = ["Justin Campbell"]
12
12
  gem.email = ["justin@justincampbell.me"]
13
- gem.description = "tp"
14
- gem.summary = "tp"
13
+ gem.summary = "Terminal Presenter"
14
+ gem.description = "Presents Markdown slides in your terminal"
15
15
  gem.homepage = "http://github.com/justincampbell/tp"
16
16
 
17
17
  gem.files = `git ls-files`.split $/
@@ -19,6 +19,8 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
20
  gem.require_paths = ["lib"]
21
21
 
22
+ gem.add_dependency "coderay"
23
+
22
24
  gem.add_development_dependency "guard-rspec"
23
25
  gem.add_development_dependency "rake"
24
26
  gem.add_development_dependency "rspec"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,6 +11,22 @@ bindir: bin
11
11
  cert_chain: []
12
12
  date: 2013-01-28 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: coderay
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: guard-rspec
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -75,7 +91,7 @@ dependencies:
75
91
  - - ! '>='
76
92
  - !ruby/object:Gem::Version
77
93
  version: '0'
78
- description: tp
94
+ description: Presents Markdown slides in your terminal
79
95
  email:
80
96
  - justin@justincampbell.me
81
97
  executables:
@@ -99,14 +115,24 @@ files:
99
115
  - lib/tp/presenter.rb
100
116
  - lib/tp/renderer.rb
101
117
  - lib/tp/slide.rb
118
+ - lib/tp/slide/bulleted.rb
119
+ - lib/tp/slide/code.rb
120
+ - lib/tp/slide/header_only.rb
121
+ - lib/tp/slide/paragraph.rb
102
122
  - lib/tp/slide_deck.rb
123
+ - lib/tp/slide_factory.rb
103
124
  - lib/tp/version.rb
104
125
  - slides.md
105
126
  - spec/lib/keyboard_spec.rb
106
127
  - spec/lib/screen_spec.rb
107
128
  - spec/lib/string_spec.rb
108
129
  - spec/lib/tp/presenter_spec.rb
130
+ - spec/lib/tp/slide/bulleted_spec.rb
131
+ - spec/lib/tp/slide/code_spec.rb
132
+ - spec/lib/tp/slide/header_only_spec.rb
133
+ - spec/lib/tp/slide/paragraph_spec.rb
109
134
  - spec/lib/tp/slide_deck_spec.rb
135
+ - spec/lib/tp/slide_factory_spec.rb
110
136
  - spec/lib/tp/slide_spec.rb
111
137
  - spec/lib/tp_spec.rb
112
138
  - spec/spec_helper.rb
@@ -135,13 +161,18 @@ rubyforge_project:
135
161
  rubygems_version: 1.8.23
136
162
  signing_key:
137
163
  specification_version: 3
138
- summary: tp
164
+ summary: Terminal Presenter
139
165
  test_files:
140
166
  - spec/lib/keyboard_spec.rb
141
167
  - spec/lib/screen_spec.rb
142
168
  - spec/lib/string_spec.rb
143
169
  - spec/lib/tp/presenter_spec.rb
170
+ - spec/lib/tp/slide/bulleted_spec.rb
171
+ - spec/lib/tp/slide/code_spec.rb
172
+ - spec/lib/tp/slide/header_only_spec.rb
173
+ - spec/lib/tp/slide/paragraph_spec.rb
144
174
  - spec/lib/tp/slide_deck_spec.rb
175
+ - spec/lib/tp/slide_factory_spec.rb
145
176
  - spec/lib/tp/slide_spec.rb
146
177
  - spec/lib/tp_spec.rb
147
178
  - spec/spec_helper.rb