kitabu 1.0.0.rc1 → 1.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/Gemfile.lock +14 -20
  2. data/README.rdoc +54 -23
  3. data/kitabu.gemspec +1 -1
  4. data/lib/kitabu.rb +11 -4
  5. data/lib/kitabu/cli.rb +49 -6
  6. data/lib/kitabu/dependency.rb +19 -0
  7. data/lib/kitabu/exporter.rb +4 -5
  8. data/lib/kitabu/generator.rb +12 -15
  9. data/lib/kitabu/parser.rb +27 -2
  10. data/lib/kitabu/parser/epub.rb +96 -83
  11. data/lib/kitabu/parser/html.rb +51 -16
  12. data/lib/kitabu/parser/mobi.rb +1 -4
  13. data/lib/kitabu/parser/pdf.rb +23 -20
  14. data/lib/kitabu/parser/txt.rb +1 -5
  15. data/lib/kitabu/syntax.rb +5 -3
  16. data/lib/kitabu/syntax/highlight.rb +22 -0
  17. data/lib/kitabu/toc.rb +4 -78
  18. data/lib/kitabu/toc/epub.rb +41 -0
  19. data/lib/kitabu/toc/html.rb +78 -0
  20. data/lib/kitabu/version.rb +1 -1
  21. data/spec/kitabu/cli/export_spec.rb +2 -2
  22. data/spec/kitabu/cli/new_spec.rb +1 -1
  23. data/spec/kitabu/cli/permalinks_spec.rb +1 -1
  24. data/spec/kitabu/cli/version_spec.rb +1 -1
  25. data/spec/kitabu/extensions/redcloth_spec.rb +6 -6
  26. data/spec/kitabu/extensions/string_spec.rb +1 -1
  27. data/spec/kitabu/parser/epub_spec.rb +5 -1
  28. data/spec/kitabu/parser/html_spec.rb +15 -15
  29. data/spec/kitabu/parser/pdf_spec.rb +4 -4
  30. data/spec/kitabu/syntax_spec.rb +78 -74
  31. data/spec/kitabu/{toc_spec.rb → toc/html_spec.rb} +5 -5
  32. data/spec/spec_helper.rb +3 -1
  33. data/spec/support/mybook/output/mybook.pdf.html +83 -0
  34. data/spec/support/mybook/templates/{cover.erb → epub/cover.erb} +1 -1
  35. data/spec/support/mybook/templates/{epub.erb → epub/page.erb} +1 -1
  36. data/spec/support/mybook/templates/epub/style.css +0 -0
  37. data/spec/support/mybook/templates/html/layout.css +353 -0
  38. data/spec/support/mybook/templates/html/layout.erb +50 -0
  39. data/spec/support/mybook/templates/html/syntax.css +58 -0
  40. data/spec/support/mybook/templates/html/user.css +1 -0
  41. data/spec/support/shared.rb +48 -15
  42. data/templates/cover.erb +1 -1
  43. data/templates/cover.png +0 -0
  44. data/templates/epub.css +1 -0
  45. data/templates/epub.erb +1 -1
  46. data/templates/sample.md +6 -0
  47. data/templates/syntax.css +58 -0
  48. metadata +32 -44
  49. data/spec/support/mybook/templates/epub.css +0 -1
  50. data/spec/support/mybook/templates/layout.css +0 -137
  51. data/spec/support/mybook/templates/layout.erb +0 -46
  52. data/spec/support/mybook/templates/syntax.css +0 -186
  53. data/spec/support/mybook/templates/user.css +0 -1
  54. data/templates/styles/active4d.css +0 -114
  55. data/templates/styles/all_hallows_eve.css +0 -72
  56. data/templates/styles/amy.css +0 -147
  57. data/templates/styles/blackboard.css +0 -88
  58. data/templates/styles/brilliance_black.css +0 -605
  59. data/templates/styles/brilliance_dull.css +0 -599
  60. data/templates/styles/cobalt.css +0 -149
  61. data/templates/styles/dawn.css +0 -121
  62. data/templates/styles/eiffel.css +0 -121
  63. data/templates/styles/espresso_libre.css +0 -109
  64. data/templates/styles/idle.css +0 -62
  65. data/templates/styles/iplastic.css +0 -80
  66. data/templates/styles/lazy.css +0 -73
  67. data/templates/styles/mac_classic.css +0 -123
  68. data/templates/styles/magicwb_amiga.css +0 -104
  69. data/templates/styles/pastels_on_dark.css +0 -188
  70. data/templates/styles/slush_poppies.css +0 -85
  71. data/templates/styles/spacecadet.css +0 -51
  72. data/templates/styles/sunburst.css +0 -180
  73. data/templates/styles/twilight.css +0 -137
  74. data/templates/styles/zenburnesque.css +0 -91
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kitabu (1.0.0.rc1)
4
+ kitabu (1.0.0.rc2)
5
5
  RedCloth (~> 4.2)
6
6
  activesupport (~> 3.0)
7
+ coderay
7
8
  eeepub-with-cover-support (~> 0.8)
8
9
  i18n (~> 0.5)
9
10
  nokogiri (~> 1.5)
10
11
  notifier (~> 0.1)
11
- pygments.rb (~> 0.2)
12
12
  rdiscount (~> 1.6)
13
13
  thor (~> 0.14)
14
14
  watchr (~> 0.7)
@@ -20,36 +20,30 @@ GEM
20
20
  activesupport (3.2.3)
21
21
  i18n (~> 0.6)
22
22
  multi_json (~> 1.0)
23
- blankslate (2.1.2.4)
24
23
  builder (3.0.0)
24
+ coderay (1.0.6)
25
25
  diff-lcs (1.1.3)
26
26
  eeepub-with-cover-support (0.8.7)
27
27
  builder
28
28
  rubyzip
29
- ffi (1.0.11)
30
29
  i18n (0.6.0)
31
- multi_json (1.3.2)
30
+ multi_json (1.3.5)
32
31
  nokogiri (1.5.2)
33
- notifier (0.1.4)
34
- pygments.rb (0.2.12)
35
- rubypython (~> 0.5.3)
32
+ notifier (0.2.1)
36
33
  rake (0.9.2.2)
37
34
  rdiscount (1.6.8)
38
- rspec (2.9.0)
39
- rspec-core (~> 2.9.0)
40
- rspec-expectations (~> 2.9.0)
41
- rspec-mocks (~> 2.9.0)
42
- rspec-core (2.9.0)
43
- rspec-expectations (2.9.1)
35
+ rspec (2.10.0)
36
+ rspec-core (~> 2.10.0)
37
+ rspec-expectations (~> 2.10.0)
38
+ rspec-mocks (~> 2.10.0)
39
+ rspec-core (2.10.1)
40
+ rspec-expectations (2.10.0)
44
41
  diff-lcs (~> 1.1.3)
45
- rspec-mocks (2.9.0)
46
- rubypython (0.5.3)
47
- blankslate (>= 2.1.2.3)
48
- ffi (~> 1.0.7)
49
- rubyzip (0.9.7)
42
+ rspec-mocks (2.10.1)
43
+ rubyzip (0.9.8)
50
44
  test_notifier (1.0.0)
51
45
  notifier
52
- thor (0.14.6)
46
+ thor (0.15.2)
53
47
  watchr (0.7)
54
48
 
55
49
  PLATFORMS
@@ -1,22 +1,42 @@
1
1
  = kitabu
2
2
 
3
- While Prince is too expensive (495USD for a single user license), the free version available at http://www.princexml.com/download/ generates a PDF with a small logo on the first page, which is removed when sent to a printer.
3
+ While Prince is too expensive (495USD for a single user license), the free version available at http://www.princexml.com/download generates a PDF with a small logo on the first page, which is removed when sent to a printer.
4
4
 
5
5
  == Features
6
6
 
7
- * Write PDF using Markdown, Textile or plain HTML
7
+ * Write using Markdown, Textile or plain HTML
8
8
  * Book layout support
9
9
  * Syntax highlight
10
- * Generate a HTML, PDF and e-Pub files
10
+ * Generate HTML, PDF, e-Pub, Mobi and Text files
11
11
  * Table of Contents automatically generated from chapter titles
12
12
 
13
13
  == Installation
14
14
 
15
- To install Kitabu, you’ll need a working Ruby installation with Rubygems.
15
+ To install Kitabu, you’ll need a working Ruby 1.9+ installation.
16
16
  If you’re cool with it, just run the following command to install it.
17
17
 
18
18
  gem install kitabu --pre
19
19
 
20
+ After installing Kitabu, run the following command to check your external
21
+ dependencies.
22
+
23
+ $ kitabu check
24
+
25
+ Prince XML: Converts HTML files into PDF files.
26
+ Installed.
27
+
28
+ KindleGen: Converts ePub e-books into .mobi files.
29
+ Installed.
30
+
31
+ html2text: Converts HTML documents into plain text.
32
+ Not installed.
33
+
34
+ pygments.rb: A generic syntax highlight. If installed, replaces CodeRay.
35
+ Not installed.
36
+
37
+ There's no requirements here; just make sure you cleared the correct dependency based
38
+ on the formats you want to export to.
39
+
20
40
  == Usage
21
41
 
22
42
  To create a new e-book, just run
@@ -25,20 +45,26 @@ To create a new e-book, just run
25
45
 
26
46
  This command creates a directory <tt>mybook</tt> with the following structure:
27
47
 
28
- * mypdf
29
- * code
30
- * config
31
- * kitabu.yml
32
- * helper.rb
33
- * images
34
- * output
35
- * Rakefile
36
- * templates
37
- * layout.css
38
- * layout.html
39
- * syntax.css
40
- * user.css
41
- * text
48
+ mybook
49
+ ├── code
50
+ ├── config
51
+ │   ├── helper.rb
52
+ │   └── kitabu.yml
53
+ ├── images
54
+ ├── output
55
+ ├── templates
56
+ │   ├── epub
57
+ │   │   ├── cover.erb
58
+ │   │   ├── cover.png
59
+ │   │   ├── page.erb
60
+ │   │   └── user.css
61
+ │   └── html
62
+ │   ├── layout.css
63
+ │   ├── layout.erb
64
+ │   ├── syntax.css
65
+ │   └── user.css
66
+ └── text
67
+ └── 01_Welcome.md
42
68
 
43
69
  The <tt>config/kitabu.yml</tt> file holds some information about your book; so you'll always change it.
44
70
 
@@ -76,7 +102,7 @@ To print the TOC, you need to print a variable called +toc+, using the eRb tag.
76
102
 
77
103
  === Syntax Highlighting
78
104
 
79
- We use Ultraviolet[http://rubygems.org/gems/ultraviolet] for syntax highlighting. To highlight a given code snippet, just do something like
105
+ We use CodeRay[http://rubygems.org/gems/coderay] for syntax highlighting. To highlight a given code snippet, just do something like
80
106
 
81
107
  @@@ ruby
82
108
  class User < ActiveRecord::Base
@@ -85,7 +111,7 @@ We use Ultraviolet[http://rubygems.org/gems/ultraviolet] for syntax highlighting
85
111
  end
86
112
  @@@
87
113
 
88
- Run @kitabu syntaxes@ to list all available syntaxes.
114
+ If can replace CodeRay by Pygments; just install the gem pygments.rb[http://rubygems.org/pygments.rb].
89
115
 
90
116
  <b>Don't indent</b> the source block or will end up with unexpected results.
91
117
 
@@ -121,18 +147,23 @@ By default, RDiscount[http://github.com/rtomayko/rdiscount/tree/master] is the M
121
147
  * Maruku: https://rubygems.org/gems/maruku
122
148
  * PEGMarkdown: https://rubygems.org/gems/rpeg-markdown
123
149
  * BlueCloth: https://rubygems.org/gems/bluecloth
150
+ * Redcarpet: https://rubygems.org/gems/redcarpet
151
+
152
+ Note: RDiscount will always be installed as Kitabu's dependency but only used when no
153
+ alternative library is available.
124
154
 
125
155
  === References
126
156
 
127
- * Textile: http://hobix.com/textile/
157
+ * Textile: http://hobix.com/textile
128
158
  * Markdown: http://daringfireball.net/projects/markdown/syntax
129
159
 
130
160
  == Samples
131
161
 
132
162
  I published two PDFs (portuguese only) exploring lots of features. Check it out:
133
163
 
134
- * http://howtocode.com.br/downloads/rdoc.pdf
135
- * http://howtocode.com.br/downloads/rails-application-templates.pdf
164
+ * http://cl.ly/3j1s2g1O1b1c0S3M0n20
165
+ * http://cl.ly/1L1o123L3Z0p3P0L1Q3t
166
+ * http://cl.ly/0a2W3s3u2T2P1V0C0c3g
136
167
 
137
168
  There's also an (probably) outdated Rails Guide section in the <tt>examples</tt> directory.
138
169
 
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
28
28
  s.add_dependency "eeepub-with-cover-support", "~> 0.8"
29
29
  s.add_dependency "watchr", "~> 0.7"
30
30
  s.add_dependency "notifier", "~> 0.1"
31
- s.add_dependency "pygments.rb", "~> 0.2"
31
+ s.add_dependency "coderay"
32
32
 
33
33
  s.add_development_dependency "rspec"
34
34
  s.add_development_dependency "test_notifier"
@@ -16,6 +16,14 @@ require "watchr"
16
16
  require "yaml"
17
17
  require "cgi"
18
18
 
19
+ %w[pygments.rb coderay].each do |lib|
20
+ begin
21
+ require lib
22
+ rescue LoadError => e
23
+ next
24
+ end
25
+ end
26
+
19
27
  %w[maruku peg_markdown bluecloth redcarpet rdiscount].each do |lib|
20
28
  begin
21
29
  require lib
@@ -28,8 +36,6 @@ end
28
36
  Encoding.default_internal = "utf-8"
29
37
  Encoding.default_external = "utf-8"
30
38
 
31
- require 'pygments.rb'
32
-
33
39
  module Kitabu
34
40
  require "kitabu/extensions/string"
35
41
  require "kitabu/extensions/redcloth"
@@ -39,12 +45,13 @@ module Kitabu
39
45
 
40
46
  autoload :Version, "kitabu/version"
41
47
  autoload :Generator, "kitabu/generator"
42
- autoload :Toc, "kitabu/toc"
48
+ autoload :TOC, "kitabu/toc"
43
49
  autoload :Cli, "kitabu/cli"
44
50
  autoload :Parser, "kitabu/parser"
45
51
  autoload :Exporter, "kitabu/exporter"
46
52
  autoload :Syntax, "kitabu/syntax"
47
53
  autoload :Stream, "kitabu/stream"
54
+ autoload :Dependency, "kitabu/dependency"
48
55
 
49
56
  def self.config(root_dir = nil)
50
57
  root_dir ||= Pathname.new(Dir.pwd)
@@ -57,6 +64,6 @@ module Kitabu
57
64
  end
58
65
 
59
66
  def self.logger
60
- @logger ||= Logger.new(File.open("/tmp/kitabu.log", "a+"))
67
+ @logger ||= Logger.new(File.open("/tmp/kitabu.log", "a"))
61
68
  end
62
69
  end
@@ -46,13 +46,48 @@ module Kitabu
46
46
  say "Kitabu version #{Version::STRING}"
47
47
  end
48
48
 
49
+ desc "check", "Check if all external dependencies are installed"
50
+
51
+ def check
52
+ result = []
53
+
54
+ result << {
55
+ :description => "Prince XML: Converts HTML files into PDF files.",
56
+ :installed => Kitabu::Dependency.prince?
57
+ }
58
+
59
+ result << {
60
+ :description => "KindleGen: Converts ePub e-books into .mobi files.",
61
+ :installed => Kitabu::Dependency.kindlegen?
62
+ }
63
+
64
+ result << {
65
+ :description => "html2text: Converts HTML documents into plain text.",
66
+ :installed => Kitabu::Dependency.html2text?
67
+ }
68
+
69
+ result << {
70
+ :description => "pygments.rb: A generic syntax highlight. If installed, replaces CodeRay.",
71
+ :installed => Kitabu::Dependency.pygments_rb?
72
+ }
73
+
74
+ result.each do |result|
75
+ text = color(result[:name], :blue)
76
+ text << "\n" << result[:description]
77
+ text << "\n" << (result[:installed] ? color("Installed.", :green) : color("Not installed.", :red))
78
+ text << "\n"
79
+
80
+ say(text)
81
+ end
82
+ end
83
+
49
84
  desc "permalinks", "List title permalinks"
50
85
 
51
86
  def permalinks
52
- html = Kitabu::Parser::Html.new(root_dir).content
53
- toc = Kitabu::Toc.generate(html)
87
+ inside_ebook!
54
88
 
55
- color_support = shell.instance_of?(Thor::Shell::Color)
89
+ html = Kitabu::Parser::HTML.new(root_dir).content
90
+ toc = Kitabu::TOC::HTML.generate(html)
56
91
 
57
92
  toc.toc.each do |options|
58
93
  level = options[:level] - 1
@@ -60,8 +95,8 @@ module Kitabu
60
95
  permalink = "##{options[:permalink]}"
61
96
 
62
97
  text = "*" * level
63
- text << (color_support ? shell.set_color(title, :blue) : title)
64
- text << (color_support ? shell.set_color(permalink, :yellow) : permalink)
98
+ text << color(title, :blue)
99
+ text << color(permalink, :yellow)
65
100
  say(text)
66
101
  end
67
102
  end
@@ -69,7 +104,7 @@ module Kitabu
69
104
  private
70
105
  def inside_ebook!
71
106
  unless File.exist?(config_path)
72
- raise Error, "You can't export files when you're outside an e-book directory"
107
+ raise Error, "You have to run this command from inside an e-book directory."
73
108
  end
74
109
  end
75
110
 
@@ -84,5 +119,13 @@ module Kitabu
84
119
  def root_dir
85
120
  @root ||= Pathname.new(Dir.pwd)
86
121
  end
122
+
123
+ def color(text, color)
124
+ color? ? shell.set_color(text, color) : text
125
+ end
126
+
127
+ def color?
128
+ shell.instance_of?(Thor::Shell::Color)
129
+ end
87
130
  end
88
131
  end
@@ -0,0 +1,19 @@
1
+ module Kitabu
2
+ class Dependency
3
+ def self.kindlegen?
4
+ @kindlegen ||= `which kindlegen` && $?.success?
5
+ end
6
+
7
+ def self.prince?
8
+ @prince ||= `which prince` && $?.success?
9
+ end
10
+
11
+ def self.html2text?
12
+ @html2text ||= `which html2text` && $?.success?
13
+ end
14
+
15
+ def self.pygments_rb?
16
+ @pygments_rb ||= defined?(Pygments)
17
+ end
18
+ end
19
+ end
@@ -27,18 +27,17 @@ module Kitabu
27
27
  helper = root_dir.join("config/helper.rb")
28
28
  load(helper) if helper.exist?
29
29
 
30
- export_html = [nil, "pdf", "txt", "html"].include?(options[:only])
31
30
  export_pdf = [nil, "pdf"].include?(options[:only])
32
31
  export_epub = [nil, "mobi", "epub"].include?(options[:only])
33
32
  export_mobi = [nil, "mobi"].include?(options[:only])
34
33
  export_txt = [nil, "txt"].include?(options[:only])
35
34
 
36
35
  exported = []
37
- exported << Parser::Html.parse(root_dir) if export_html
38
- exported << Parser::Pdf.parse(root_dir) if export_pdf
36
+ exported << Parser::HTML.parse(root_dir)
37
+ exported << Parser::PDF.parse(root_dir) if export_pdf && Dependency.prince?
39
38
  exported << Parser::Epub.parse(root_dir) if export_epub
40
- exported << Parser::Mobi.parse(root_dir) if export_mobi
41
- exported << Parser::Txt.parse(root_dir) if export_txt
39
+ exported << Parser::Mobi.parse(root_dir) if export_mobi && Dependency.kindlegen?
40
+ exported << Parser::Txt.parse(root_dir) if export_txt && Dependency.html2text?
42
41
 
43
42
  if exported.all?
44
43
  color = :green
@@ -14,23 +14,22 @@ module Kitabu
14
14
  File.dirname(__FILE__) + "/../../templates"
15
15
  end
16
16
 
17
- def copy_template_files
17
+ def copy_html_templates
18
18
  copy_file "layout.erb" , "templates/html/layout.erb"
19
19
  copy_file "layout.css" , "templates/html/layout.css"
20
20
  copy_file "user.css" , "templates/html/user.css"
21
+ copy_file "syntax.css" , "templates/html/syntax.css"
22
+ end
23
+
24
+ def copy_epub_templates
21
25
  copy_file "cover.erb" , "templates/epub/cover.erb"
22
- copy_file "epub.css" , "templates/epub/style.css"
26
+ copy_file "epub.css" , "templates/epub/user.css"
23
27
  copy_file "epub.erb" , "templates/epub/page.erb"
24
-
25
- create_file "templates/html/syntax.css" do
26
- String.new.tap do |s|
27
- Dir[File.dirname(__FILE__) + "/../../templates/styles/*.css"].each do |file|
28
- s << "/*== #{File.basename(file)} ==*/\n"
29
- s << File.read(file)
30
- s << "\n\n"
31
- end
32
- end
33
- end
28
+ copy_file "cover.png" , "templates/epub/cover.png"
29
+ end
30
+
31
+ def copy_sample_page
32
+ copy_file "sample.md" , "text/01_Welcome.md"
34
33
  end
35
34
 
36
35
  def copy_config_file
@@ -47,18 +46,16 @@ module Kitabu
47
46
  def create_directories
48
47
  empty_directory "output"
49
48
  empty_directory "images"
50
- empty_directory "text"
51
49
  empty_directory "code"
52
50
  end
53
51
 
54
52
  def create_git_files
55
53
  create_file ".gitignore" do
56
- "output/*.{html,epub,pdf}\n"
54
+ "output/*.{html,epub,pdf}\noutput/tmp"
57
55
  end
58
56
 
59
57
  create_file "output/.gitkeep"
60
58
  create_file "images/.gitkeep"
61
- create_file "text/.gitkeep"
62
59
  create_file "code/.gitkeep"
63
60
  end
64
61
 
@@ -1,7 +1,9 @@
1
+ require 'open3'
2
+
1
3
  module Kitabu
2
4
  module Parser
3
- autoload :Html , "kitabu/parser/html"
4
- autoload :Pdf , "kitabu/parser/pdf"
5
+ autoload :HTML , "kitabu/parser/html"
6
+ autoload :PDF , "kitabu/parser/pdf"
5
7
  autoload :Epub , "kitabu/parser/epub"
6
8
  autoload :Mobi , "kitabu/parser/mobi"
7
9
  autoload :Txt , "kitabu/parser/txt"
@@ -29,6 +31,29 @@ module Kitabu
29
31
  def name
30
32
  File.basename(root_dir)
31
33
  end
34
+
35
+ # Return the configuration file.
36
+ #
37
+ def config
38
+ Kitabu.config(root_dir)
39
+ end
40
+
41
+ # Render a eRb template using +locals+ as data seed.
42
+ #
43
+ def render_template(file, locals = {})
44
+ ERB.new(File.read(file)).result OpenStruct.new(locals).instance_eval{ binding }
45
+ end
46
+
47
+ def spawn_command(cmd)
48
+ begin
49
+ stdout_and_stderr, status = Open3.capture2e(*cmd)
50
+ rescue Errno::ENOENT => e
51
+ puts e.message
52
+ else
53
+ puts stdout_and_stderr unless status.success?
54
+ status.success?
55
+ end
56
+ end
32
57
  end
33
58
  end
34
59
  end