kitabu 1.0.0.rc1 → 1.0.0.rc2

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.
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