wordsmith 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3ba51f5ebeeeb48a9dfc57e523b20bdfc349c7f3
4
+ data.tar.gz: 085af8ce32876d4a1d6bac36d4db1779482b349d
5
+ SHA512:
6
+ metadata.gz: 64a3a77b9047716d9c88add36d9f417e155a01326c8069e4bed55d9f1cf922f81ecfa54429e8d24652f7750e6c45884220f5abd023adab6318a600d09da9af10
7
+ data.tar.gz: a53b78251c9acd1f669bb483514d5e06dec48f3b1b7ccc9a3599e19591ee4ec48efa69e1d1f08d25a6f6fd9a1eb9f25d57bdbc1f30d023b0a73b44400e7828ea
@@ -1,20 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wordsmith (0.0.1)
4
+ wordsmith (0.0.6)
5
5
  git
6
- kindlegen (>= 2.3.1)
7
- nokogiri (>= 1.5.2)
6
+ kindlegen (~> 2.3)
7
+ nokogiri (~> 1.5)
8
+ sass (~> 3.1)
8
9
 
9
10
  GEM
10
11
  remote: http://rubygems.org/
11
12
  specs:
12
- git (1.2.5)
13
+ git (1.2.6)
13
14
  kindlegen (2.8.0)
14
15
  systemu
15
- nokogiri (1.5.9)
16
+ mini_portile (0.5.2)
17
+ nokogiri (1.6.1)
18
+ mini_portile (~> 0.5.0)
16
19
  rake (0.9.2.2)
17
- systemu (2.5.2)
20
+ sass (3.2.13)
21
+ systemu (2.6.0)
18
22
  test-unit (2.4.8)
19
23
 
20
24
  PLATFORMS
data/README.md CHANGED
@@ -50,8 +50,10 @@ need to start creating your own content without worrying about anything else.
50
50
  images/
51
51
  cover.jpg
52
52
  stylesheets/
53
- default.css
54
- book.css
53
+ master.scss
54
+ _partial.scss
55
+ other.css
56
+ epub.css
55
57
  content/
56
58
  01_chapter_one.md
57
59
  02_chapter_two.md
@@ -69,15 +71,23 @@ You can edit your book metadata inside the **.wordsmith** file:
69
71
  ---
70
72
  edition: 0.1
71
73
  language: en
72
- author: Your Name
74
+ author: Your Name; Additional author
73
75
  title: Your Book Title
74
76
  cover: assets/images/cover.jpg
75
- stylesheet: assets/stylesheets/default.css
77
+
78
+ # Other configuration options
79
+ # font: YOUR_FONT_FAMILY
80
+
81
+ If you are publishing in a language like Chinese, you should specify a `font`
82
+ with Chinese glyphs.
83
+
84
+ You can specify additional authors by separating them with a `;`
76
85
 
77
86
  The **layout** directory contains the header and footer for an
78
87
  online version of your book.
79
88
 
80
- The **assets** directory contains images and stylesheets.
89
+ The **assets** directory contains images and stylesheets. Wordsmith has
90
+ built-in support for [Sass](http://sass-lang.com/).
81
91
 
82
92
  In the **content** directory you can:
83
93
 
@@ -107,27 +117,30 @@ This will be available in a site like http://jassa.github.com/wordsmith-demo/
107
117
  Git is an important part of this tool, a typical workflow should look like this:
108
118
 
109
119
  $ wordsmith new ruby_guide
110
- # this command will also create a git repository
111
- # and the first commit, but IT WILL NOT BE PUSHED YET
112
- # since you haven't provided a remote ref
120
+ // this command will also create a git repository
121
+ // and the first commit, but IT WILL NOT BE PUSHED YET
122
+ // since you haven't provided a remote ref
113
123
 
114
124
  $ cd ruby_guide
115
- # Here you edit your 'content' directory with your own chapters
125
+ // Here you edit your 'content' directory with your own chapters
116
126
 
117
- # then when you are ready to commit you do it normally:
127
+ // Generate your output files..
118
128
  $ wordsmith generate
129
+
130
+ // ..and when you are ready to commit, do it normally:
119
131
  $ git commit -am "finished chapter one"
120
132
 
121
- # if you're not ready to publish to github pages, add a ref to a new repo
133
+ // Add a ref to your (newly created) remote repo
122
134
  $ git add remote origin git@github.com:jassa/wordsmith-demo.git
123
135
  $ git push origin master
124
136
 
125
- # and if you are ready, you could do instead:
137
+ // Note that if you want to publish to github pages,
138
+ // you can do this instead:
126
139
  $ wordsmith publish git@github.com:jassa/wordsmith-demo.git
127
140
 
128
- # This will create a branch called 'gh-pages' as github requires,
129
- # you'll still need to run $ git push origin master
130
- # to push your book editables
141
+ // This command will create a branch called 'gh-pages' (as github requires),
142
+ // just remember that you'll still need to run `git push origin master`
143
+ // to push your book editables
131
144
 
132
145
  ## License
133
146
 
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
+ require 'bundler/gem_tasks'
1
2
  require 'rake/testtask'
2
3
 
3
- task :default => :test
4
-
5
4
  Rake::TestTask.new do |t|
6
5
  t.libs << "test"
7
6
  t.test_files = FileList['test/*_test.rb']
8
7
  t.verbose = true
9
8
  end
9
+
10
+ task :default => :test
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
3
- $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
2
+ # encoding: UTF-8
4
3
 
5
4
  begin
6
5
  # resolve bin path, ignoring symlinks
@@ -10,11 +9,10 @@ begin
10
9
  # add self to libpath
11
10
  $:.unshift File.expand_path("../../lib", bin_file)
12
11
 
13
- require 'wordsmith'
14
-
15
12
  # start up the CLI
13
+ require 'wordsmith'
16
14
  require 'wordsmith/cli'
17
15
  Wordsmith.new.run
18
16
  rescue Interrupt
19
17
  puts("\n ! Command cancelled.")
20
- end
18
+ end
@@ -1,40 +1,40 @@
1
1
  require 'rubygems'
2
+ require 'bundler/setup'
3
+
2
4
  require 'nokogiri'
3
5
  require 'kindlegen'
4
6
  require 'yaml'
5
7
  require 'git'
6
8
 
9
+ require 'fileutils'
10
+ require 'pp'
11
+
7
12
  require 'wordsmith/init'
8
13
  require 'wordsmith/generate'
9
14
  require 'wordsmith/publish'
10
15
 
11
- require 'fileutils'
12
- require 'pp'
13
-
14
- class Wordsmith
16
+ class Wordsmith
15
17
  include Init
16
18
  include Generate
17
19
  include Publish
18
-
20
+
19
21
  attr_accessor :subcommand, :args, :options, :name, :files, :stylesheet
20
22
  attr_reader :info
21
-
23
+
22
24
  OUTPUT_TYPES = ['html', 'epub', 'mobi', 'pdf']
23
25
  WORDSMITH_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
24
-
26
+
25
27
  def initialize
26
28
  @subcommand = nil
27
29
  @args = []
28
30
  @options = {}
29
- @config = YAML::parse(File.open(local('.wordsmith'))).transform rescue {}
30
- @name = File.basename(local('.'))
31
31
  end
32
32
 
33
33
  def info(message)
34
34
  @info ||= []
35
35
  @info << message
36
36
  end
37
-
37
+
38
38
  def local(file)
39
39
  File.expand_path(File.join(Dir.pwd, file))
40
40
  end
@@ -43,7 +43,7 @@ class Wordsmith
43
43
  end
44
44
 
45
45
  command :init, :new, :n do |opts|
46
- opts.banner = "Usage: wordsmith new (directory)"
46
+ opts.banner = "Usage: wordsmith new [directory]"
47
47
  opts.description = "initialize a new book layout"
48
48
  end
49
49
 
@@ -1,131 +1,219 @@
1
+ require 'sass/plugin'
2
+
1
3
  class Wordsmith
2
4
  module Generate
3
-
4
- attr_reader :files, :output
5
-
6
- # generate the new media
7
- def generate(args = [])
8
- @output = local(File.join('final', @name))
9
-
10
- content_dir = local(File.join('content'))
11
- @files = Dir.glob(content_dir + '/**/*.*').sort.join(" \\\n")
12
-
13
- if @files.empty?
14
- raise "Exiting.. Nothing to generate in #{content_dir}.\nHave you run 'wordsmith new'?"
15
- end
16
-
17
- build_metadata_xml
18
-
19
- @stylesheet = if @config["stylesheet"] && File.exists?(local(@config["stylesheet"]))
20
- local(@config["stylesheet"])
5
+ attr_reader :config, :files, :name, :output
6
+
7
+ def setup
8
+ @name = File.basename(local("."))
9
+ @config = YAML::parse(File.open(local(".wordsmith"))).
10
+ transform rescue {}
11
+
12
+ run_callback("before_all")
13
+ content_dir = local(File.join("content"))
14
+ @files = Dir.glob(content_dir + "/**/*.*").sort.join(" \\\n")
15
+
16
+ if files.empty?
17
+ raise "Exiting.. Nothing to generate in #{content_dir}." +
18
+ "\nHave you run 'wordsmith new'?"
21
19
  end
22
-
23
- Dir.mkdir(local('final')) unless File.exists?(local('final'))
24
-
20
+
21
+ Dir.mkdir(local("final")) unless File.exists?(local("final"))
22
+ @output = local(File.join("final", name))
23
+ end
24
+
25
+ def generate(args = [])
26
+ setup
27
+
25
28
  formats = args.empty? ? OUTPUT_TYPES : args
29
+
26
30
  formats.each do |format|
27
- if respond_to?("to_#{format}")
28
- if format == 'mobi'
29
- out = to_mobi
30
- else
31
- out = run_command(send("to_#{format}"))
32
- end
33
- if $?.exitstatus == 0 && out == '' || $?.exitstatus == 1 && format == 'mobi'
34
- if format == 'html'
35
- info "Created #{@output}/index.html"
36
- else
37
- info "Created #{@output}.#{format}"
38
- end
39
- else
40
- raise "#{format} generator failed"
41
- end
31
+ raise "No generator found for #{format}" unless respond_to?("to_#{format}")
32
+
33
+ run_callback("before_#{format}")
34
+ out = if format == "mobi"
35
+ send("to_#{format}")
42
36
  else
43
- raise "No generator found for #{format}"
37
+ run_command(send("to_#{format}"))
38
+ end
39
+ run_callback("after_#{format}")
40
+
41
+ if $?.exitstatus == 0 && out.empty? || format == "mobi" && $?.exitstatus == 1
42
+ info "Created #{output}" +
43
+ (format == "html" ? "/index.html" : ".#{format}")
44
+ else
45
+ raise "#{format} generator failed"
44
46
  end
45
47
  end
48
+ run_callback("after_all")
46
49
  end
47
-
48
- def build_metadata_xml
49
- metadata = local(File.join('metadata.xml'))
50
- builder = Nokogiri::XML::Builder.new do |xml|
51
- xml.metadata('xmlns:dc' => 'http://purl.org/dc/elements/1.1/') {
52
- xml['dc'].title { xml.text @config["title"] }
53
- xml['dc'].creator { xml.text @config["author"] }
54
- xml['dc'].language { xml.text @config["language"] }
55
- }
56
- end
57
- frg = Nokogiri::XML.fragment(builder.to_xml)
58
- nodes = frg.search('.//metadata/*')
59
- File.open(metadata, 'w') { |f| f.write(nodes.to_xml) }
50
+
51
+ def run_callback(meth)
52
+ run_command(config[meth]) if config[meth]
60
53
  end
61
-
54
+
62
55
  def to_html
63
56
  info "Generating html..."
64
- html_dir = local(File.join('final', @name))
65
- Dir.mkdir(html_dir) unless File.exists?(html_dir)
66
- header = if File.exists?(local(File.join('layout', 'header.html')))
67
- local(File.join('layout', 'header.html'))
68
- end
69
- footer = if File.exists?(local(File.join('layout', 'footer.html')))
70
- local(File.join('layout', 'footer.html'))
71
- end
72
- `cp -r #{base(File.join('template', 'assets'))} #{html_dir}`
73
- cmd = "pandoc -s -S --toc -o #{File.join(html_dir, 'index.html')} -t html"
74
- puts @config['stylesheet']
75
- cmd += " -c #{@config['stylesheet']}" if @stylesheet
57
+
58
+ compile_stylesheets
59
+ copy_assets
60
+
61
+ cmd = "pandoc -f markdown_mmd -s -S --toc -o #{File.join(output, "index.html")} -t html"
62
+ stylesheets.each { |stylesheet| cmd += " -c #{stylesheet}" }
76
63
  cmd += " -B #{header}" if header
77
64
  cmd += " -A #{footer}" if footer
78
- cmd += " \\\n#{@files}"
65
+ cmd += " \\\n#{files}"
66
+ cmd
79
67
  end
80
-
68
+
81
69
  def to_epub
82
70
  info "Generating epub..."
83
- metadata = if File.exists?(local(File.join('metadata.xml')))
84
- local(File.join('metadata.xml'))
85
- end
86
- cover = if @config["cover"] && File.exists?(local(File.join(@config["cover"])))
87
- local(File.join(@config["cover"]))
88
- end
89
- cmd = "pandoc -S -o #{@output}.epub -t epub"
90
- cmd += " \\\n--epub-metadata=#{metadata}"
71
+
72
+ build_metadata_xml
73
+
74
+ cmd = "pandoc -f markdown_mmd -S -o #{output}.epub -t epub"
75
+ cmd += " \\\n--epub-metadata=#{metadata}" if metadata
91
76
  cmd += " \\\n--epub-cover-image=#{cover}" if cover
92
- cmd += " \\\n--epub-stylesheet=#{@stylesheet}" if @stylesheet
93
- cmd += " \\\n#{@files}"
77
+ cmd += " \\\n--epub-stylesheet=#{epub_stylesheet}" if epub_stylesheet
78
+ cmd += " \\\n#{files}"
79
+ cmd
94
80
  end
95
-
81
+
96
82
  def to_mobi
97
- if File.exists?(@output + '.epub')
83
+ if File.exists?(output + ".epub")
98
84
  info "Generating mobi..."
99
- Kindlegen.run("#{@output}.epub", "-o", "#{@name}.mobi")
85
+ Kindlegen.run("#{output}.epub", "-o", "#{name}.mobi")
100
86
  else
101
- info "Skipping .mobi (#{@name}.epub doesn't exist)"
87
+ info "Skipping .mobi (#{name}.epub doesn't exist)"
102
88
  end
103
89
  end
104
-
90
+
105
91
  def to_pdf
106
92
  info "Generating pdf..."
107
- engine = ''
108
- [['pdftex', 'pdflatex'], ['xetex', 'xelatex'], 'lualatex'].each do |e|
93
+
94
+ engine = ""
95
+
96
+ [["xetex", "xelatex"], ["pdftex", "pdflatex"], "lualatex"].each do |e|
109
97
  if e.is_a? Array
110
98
  cmd, name = e
111
99
  else
112
100
  cmd = name = e
113
101
  end
114
- if can_run?(cmd + ' -v')
102
+ if can_run?(cmd + " -v")
115
103
  engine = name
116
- break
104
+ break
117
105
  end
118
106
  end
119
- cmd = "pandoc -N --toc -o #{@output}.pdf #{@files}"
120
- cmd += " --latex-engine=#{engine}" unless engine == ''
107
+
108
+ cmd = "pandoc -f markdown_mmd -N --toc -o #{output}.pdf #{files}"
109
+ cmd += " --latex-engine=#{engine}" unless engine.empty?
110
+ cmd += " -V mainfont='#{config['font']}'" unless (config.fetch('font', '')).empty?
111
+ cmd
112
+ end
113
+
114
+ private
115
+
116
+ def build_metadata_xml
117
+ metadata = local(File.join("metadata.xml"))
118
+
119
+ builder = Nokogiri::XML::Builder.new do |xml|
120
+ xml.metadata("xmlns:dc" => "http://purl.org/dc/elements/1.1/") {
121
+ xml["dc"].title { xml.text config["title"] }
122
+ config["author"].split(/\s*;\s*/).each do |creator|
123
+ xml["dc"].creator { xml.text creator }
124
+ end if config["author"]
125
+ xml["dc"].language { xml.text config["language"] }
126
+ }
127
+ end
128
+
129
+ frg = Nokogiri::XML.fragment(builder.to_xml)
130
+ nodes = frg.search(".//metadata/*")
131
+ File.open(metadata, "w") { |f| f.write(nodes.to_xml) }
132
+ end
133
+
134
+ def compile_stylesheets
135
+ unless defined?(SASS_LOADED)
136
+ Sass::Plugin.reset!
137
+
138
+ css_location = File.join(output, "assets", "stylesheets")
139
+ sass_location = File.join(local("assets"), "stylesheets")
140
+
141
+ Sass::Plugin.options.merge!(:template_location => sass_location,
142
+ :css_location => css_location,
143
+ :always_update => false,
144
+ :always_check => true)
145
+ end
146
+
147
+ Sass::Plugin.on_updated_stylesheet do |template, css|
148
+ info "Compiling #{template} to #{css}"
149
+ end
150
+
151
+ Sass::Plugin.update_stylesheets
152
+ end
153
+
154
+ def copy_assets
155
+ assets = Dir.glob(File.join("assets", "**", "*"))
156
+ sass = Dir.glob(File.join("assets", "stylesheets", "**", "*.scss"))
157
+
158
+ copies = assets - sass - [epub_stylesheet_location]
159
+ copies.each do |entry|
160
+ dest = File.join(output, File.dirname(entry))
161
+ FileUtils.mkdir_p dest
162
+ FileUtils.cp entry, dest unless File.directory?(entry)
163
+ end
164
+ end
165
+
166
+ def cover
167
+ @cover ||= if config["cover"] && File.exists?(local(File.join(config["cover"])))
168
+ local(File.join(config["cover"]))
169
+ end
170
+ end
171
+
172
+ def epub_stylesheet
173
+ @epub_stylesheet ||= if File.exists?(epub_stylesheet_location)
174
+ local(epub_stylesheet_location)
175
+ end
176
+ end
177
+
178
+ def epub_stylesheet_location
179
+ File.join("assets", "stylesheets", "epub.css")
180
+ end
181
+
182
+ def footer
183
+ @footer ||= if File.exists?(local(File.join("layout", "footer.html")))
184
+ local(File.join("layout", "footer.html"))
185
+ end
186
+ end
187
+
188
+ def header
189
+ @header ||= if File.exists?(local(File.join("layout", "header.html")))
190
+ local(File.join("layout", "header.html"))
191
+ end
192
+ end
193
+
194
+ def metadata
195
+ @metadata ||= if File.exists?(local(File.join("metadata.xml")))
196
+ local(File.join("metadata.xml"))
197
+ end
198
+ end
199
+
200
+ def stylesheets
201
+ @stylesheet ||= begin
202
+ styles = Dir.glob(File.join(output, "assets", "stylesheets", "**", "*.css"))
203
+ partials = Dir.glob(File.join(output, "assets", "stylesheets", "**", "_*.css"))
204
+ all = styles - partials - [epub_stylesheet_location]
205
+
206
+ all.map { |css| css.gsub(output + "/", "") }
207
+ end
121
208
  end
122
-
209
+
123
210
  def run_command(cmd)
124
211
  `#{cmd}`.strip
125
212
  end
126
-
213
+
127
214
  def can_run?(cmd)
128
- `#{cmd} 2>&1`
215
+ out = `#{cmd} 2>&1`
216
+ info out
129
217
  $?.success?
130
218
  end
131
219
  end
@@ -1,6 +1,6 @@
1
1
  class Wordsmith
2
2
  module Init
3
-
3
+
4
4
  # start a new wordsmith directory with skeleton structure
5
5
  def init(args = [])
6
6
  name = Array(args).shift
@@ -11,7 +11,7 @@ class Wordsmith
11
11
  template_dir = File.join(WORDSMITH_ROOT, 'template')
12
12
  ign = Dir.glob(template_dir + '/.[a-z]*')
13
13
  FileUtils.cp_r template_dir, name
14
-
14
+
15
15
  # also copy files that start with .
16
16
  FileUtils.cp_r ign, name
17
17
  if Git.init(local(name))
@@ -24,4 +24,4 @@ class Wordsmith
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -1,3 +1,3 @@
1
- module Wordsmith
2
- VERSION = "0.0.2"
1
+ class Wordsmith
2
+ VERSION = "0.0.6"
3
3
  end
@@ -4,4 +4,7 @@ language: en
4
4
  author: Your Name
5
5
  title: Your Book Title
6
6
  cover: assets/images/cover.jpg
7
- stylesheet: assets/stylesheets/default.css
7
+
8
+ # Other configuration options
9
+ # If you need to specify the font to use non-unicode characters (e.g. Chinese)
10
+ # font: HanaMinA
@@ -3,6 +3,7 @@ html {
3
3
  padding: 40px;
4
4
  background: #DFE1E5;
5
5
  }
6
+
6
7
  body {
7
8
  margin: 0;
8
9
  padding: 30px;
@@ -18,27 +19,12 @@ body {
18
19
  -webkit-border-radius: 3px;
19
20
  -moz-border-radius: 3px;
20
21
  border-radius: 3px;
21
-
22
22
  }
23
+
23
24
  a {
24
25
  color: #1A4882;
25
26
  }
27
+
26
28
  h1, h2, h3 {
27
29
  margin: 30px 0 10px 0;
28
30
  }
29
- body {
30
- display: inline-block;
31
- }
32
- div#TOC {
33
- border: 1px solid #C7C7C7;
34
- -webkit-border-radius: 3px;
35
- -moz-border-radius: 3px;
36
- border-radius: 3px;
37
- }
38
- div#cover {
39
- text-align: center;
40
- padding: 0 0 30px 0;
41
- }
42
- div#cover img {
43
- max-height: 400px;
44
- }
@@ -0,0 +1,8 @@
1
+ div#cover {
2
+ text-align: center;
3
+ padding: 0 0 30px 0;
4
+
5
+ img {
6
+ max-height: 400px;
7
+ }
8
+ }
@@ -0,0 +1,44 @@
1
+ html {
2
+ margin: 0;
3
+ padding: 40px;
4
+ background: #DFE1E5;
5
+ }
6
+ body {
7
+ margin: 0;
8
+ padding: 30px;
9
+ font-family: "Lucida Grande",verdana,arial,helvetica,sans-serif;
10
+ font-size: 14px;
11
+ color: #373737;
12
+ width: 800px;
13
+ background: rgba(255, 255, 255, 0.8);
14
+ -webkit-box-shadow: 2px 2px 6px rgba(0,0,0,.30);
15
+ -moz-box-shadow: 2px 2px 6px rgba(0,0,0,.30);
16
+ box-shadow: 2px 2px 6px rgba(0,0,0,.30);
17
+ border: 1px solid #C7C7C7;
18
+ -webkit-border-radius: 3px;
19
+ -moz-border-radius: 3px;
20
+ border-radius: 3px;
21
+
22
+ }
23
+ a {
24
+ color: #1A4882;
25
+ }
26
+ h1, h2, h3 {
27
+ margin: 30px 0 10px 0;
28
+ }
29
+ body {
30
+ display: inline-block;
31
+ }
32
+ div#TOC {
33
+ border: 1px solid #C7C7C7;
34
+ -webkit-border-radius: 3px;
35
+ -moz-border-radius: 3px;
36
+ border-radius: 3px;
37
+ }
38
+ div#cover {
39
+ text-align: center;
40
+ padding: 0 0 30px 0;
41
+ }
42
+ div#cover img {
43
+ max-height: 400px;
44
+ }
@@ -0,0 +1,2 @@
1
+ @import "_partial";
2
+ @import "_with_sass";
@@ -0,0 +1,10 @@
1
+ body {
2
+ display: inline-block;
3
+ }
4
+
5
+ div#TOC {
6
+ border: 1px solid #C7C7C7;
7
+ -webkit-border-radius: 3px;
8
+ -moz-border-radius: 3px;
9
+ border-radius: 3px;
10
+ }
@@ -0,0 +1,60 @@
1
+ require File.expand_path "../test_helper", __FILE__
2
+
3
+ context "wordsmith css tests" do
4
+
5
+ def wordsmith
6
+ Wordsmith.new
7
+ end
8
+
9
+ test "copies all css files into final assets directory" do
10
+ in_temp_dir do
11
+ wordsmith.init('w')
12
+
13
+ File.rename "w/assets/stylesheets/master.scss",
14
+ "w/assets/stylesheets/_a_css_partial.css"
15
+
16
+ Dir.chdir("w") { wordsmith.generate ["html"] }
17
+ files = Dir.glob('w/final/**/*')
18
+
19
+ assert files.include? "w/final/w/assets/stylesheets/other.css"
20
+ assert files.include? "w/final/w/assets/stylesheets/_a_css_partial.css"
21
+ end
22
+ end
23
+
24
+ test "includes all final css files inside output html" do
25
+ in_temp_dir do
26
+ wordsmith.init('w')
27
+
28
+ File.rename "w/assets/stylesheets/master.scss",
29
+ "w/assets/stylesheets/master.css"
30
+
31
+ FileUtils.cp "w/assets/stylesheets/master.css",
32
+ "w/assets/stylesheets/_a_css_partial.css"
33
+
34
+ assert File.exists?("w/assets/stylesheets/other.css")
35
+
36
+ Dir.chdir("w") { wordsmith.generate ["html"] }
37
+ html_content = File.read("w/final/w/index.html")
38
+
39
+ assert html_content =~ /="assets\/stylesheets\/master\.css"/
40
+ assert html_content =~ /other\.css/
41
+ assert !(html_content =~ /_a_css_partial\.css/)
42
+ end
43
+ end
44
+
45
+ test "ignores epub.css in html" do
46
+ in_temp_dir do
47
+ wordsmith.init('w')
48
+ assert File.exists?("w/assets/stylesheets/epub.css")
49
+
50
+ Dir.chdir("w") { wordsmith.generate ["html"] }
51
+
52
+ html_content = File.read("w/final/w/index.html")
53
+ files = Dir.glob('w/final/**/*')
54
+
55
+ assert !files.include?("w/final/w/assets/stylesheets/epub.css")
56
+ assert !(html_content =~ /epub\.css/)
57
+ end
58
+ end
59
+
60
+ end
@@ -1,7 +1,39 @@
1
1
  require File.expand_path "../test_helper", __FILE__
2
2
 
3
3
  context "wordsmith generate tests" do
4
- setup do
5
- @wordsmith = Wordsmith.new
4
+
5
+ def wordsmith
6
+ Wordsmith.new
7
+ end
8
+
9
+ test "fails without files" do
10
+ assert_raise RuntimeError do
11
+ wordsmith.generate
12
+ end
13
+ end
14
+
15
+ %w(epub html pdf).each do |format|
16
+ test "generates book.#{format}" do
17
+ in_temp_dir do
18
+ wordsmith.init "book"
19
+ Dir.chdir("book") { wordsmith.generate [format] }
20
+ end
21
+ end
6
22
  end
7
- end
23
+
24
+ # mobi requires epub
25
+ test "generates book.mobi" do
26
+ in_temp_dir do
27
+ wordsmith.init "book"
28
+ Dir.chdir("book") { wordsmith.generate ["epub", "mobi"] }
29
+ end
30
+ end
31
+
32
+ test "generates all" do
33
+ in_temp_dir do
34
+ wordsmith.init "book"
35
+ Dir.chdir("book") { wordsmith.generate }
36
+ end
37
+ end
38
+
39
+ end
@@ -31,4 +31,12 @@ context "wordsmith init tests" do
31
31
  assert files.include? "w/.gitignore"
32
32
  end
33
33
  end
34
- end
34
+
35
+ test "creates git repo" do
36
+ in_temp_dir do
37
+ @wordsmith.init('w')
38
+ files = Dir.glob('w/**/*', File::FNM_DOTMATCH)
39
+ assert files.include? "w/.git"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path "../test_helper", __FILE__
2
+
3
+ context "wordsmith sass tests" do
4
+
5
+ def wordsmith
6
+ Wordsmith.new
7
+ end
8
+
9
+ test "compiles sass files" do
10
+ in_temp_dir do
11
+ wordsmith.init('w')
12
+ Dir.chdir("w") { wordsmith.generate ["html"] }
13
+
14
+ sass1 = File.read("w/assets/stylesheets/_partial.scss")
15
+ sass2 = File.read("w/assets/stylesheets/_with_sass.scss")
16
+ compiled_css = File.read("w/final/w/assets/stylesheets/master.css")
17
+
18
+ assert compiled_css =~ /#{sass1.split("\n").first}/
19
+ assert compiled_css =~ /#{sass2.split("\n").first}/
20
+ end
21
+ end
22
+
23
+ test "doesn't copy sass assets to final" do
24
+ in_temp_dir do
25
+ wordsmith.init('w')
26
+ Dir.chdir("w") { wordsmith.generate ["html"] }
27
+
28
+ files = Dir.glob('w/final/**/*')
29
+
30
+ assert files.include?("w/final/w/assets/stylesheets/master.css")
31
+ assert files.include?("w/final/w/assets/stylesheets/other.css")
32
+
33
+ assert files.grep(/.scss$/).empty?
34
+ end
35
+ end
36
+
37
+ test "includes compiled css files inside final html" do
38
+ in_temp_dir do
39
+ wordsmith.init('w')
40
+ assert File.exists?("w/assets/stylesheets/master.scss")
41
+
42
+ Dir.chdir("w") { wordsmith.generate ["html"] }
43
+ html_content = File.read("w/final/w/index.html")
44
+
45
+ assert html_content =~ /master.css/
46
+ end
47
+ end
48
+
49
+ end
@@ -15,9 +15,11 @@ Gem::Specification.new do |gem|
15
15
  gem.files = `git ls-files`.split("\n")
16
16
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
 
18
- gem.add_dependency "nokogiri", ">= 1.5.2"
19
- gem.add_dependency "kindlegen", ">= 2.3.1"
20
18
  gem.add_dependency "git"
19
+ gem.add_dependency "kindlegen", "~> 2.3"
20
+ gem.add_dependency "nokogiri", "~> 1.5"
21
+ gem.add_dependency "sass", "~> 3.1"
22
+
21
23
  gem.add_development_dependency "rake"
22
24
  gem.add_development_dependency "test-unit"
23
25
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordsmith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Amed Rodriguez
@@ -11,86 +10,90 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2013-03-26 00:00:00.000000000 Z
13
+ date: 2014-05-23 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
- name: nokogiri
16
+ name: git
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
- - - ! '>='
19
+ - - ">="
22
20
  - !ruby/object:Gem::Version
23
- version: 1.5.2
21
+ version: '0'
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
- - - ! '>='
26
+ - - ">="
30
27
  - !ruby/object:Gem::Version
31
- version: 1.5.2
28
+ version: '0'
32
29
  - !ruby/object:Gem::Dependency
33
30
  name: kindlegen
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
- - - ! '>='
33
+ - - "~>"
38
34
  - !ruby/object:Gem::Version
39
- version: 2.3.1
35
+ version: '2.3'
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
- - - ! '>='
40
+ - - "~>"
46
41
  - !ruby/object:Gem::Version
47
- version: 2.3.1
42
+ version: '2.3'
48
43
  - !ruby/object:Gem::Dependency
49
- name: git
44
+ name: nokogiri
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
- - - ! '>='
47
+ - - "~>"
54
48
  - !ruby/object:Gem::Version
55
- version: '0'
49
+ version: '1.5'
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
- - - ! '>='
54
+ - - "~>"
62
55
  - !ruby/object:Gem::Version
63
- version: '0'
56
+ version: '1.5'
57
+ - !ruby/object:Gem::Dependency
58
+ name: sass
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '3.1'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '3.1'
64
71
  - !ruby/object:Gem::Dependency
65
72
  name: rake
66
73
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
74
  requirements:
69
- - - ! '>='
75
+ - - ">="
70
76
  - !ruby/object:Gem::Version
71
77
  version: '0'
72
78
  type: :development
73
79
  prerelease: false
74
80
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
81
  requirements:
77
- - - ! '>='
82
+ - - ">="
78
83
  - !ruby/object:Gem::Version
79
84
  version: '0'
80
85
  - !ruby/object:Gem::Dependency
81
86
  name: test-unit
82
87
  requirement: !ruby/object:Gem::Requirement
83
- none: false
84
88
  requirements:
85
- - - ! '>='
89
+ - - ">="
86
90
  - !ruby/object:Gem::Version
87
91
  version: '0'
88
92
  type: :development
89
93
  prerelease: false
90
94
  version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
95
  requirements:
93
- - - ! '>='
96
+ - - ">="
94
97
  - !ruby/object:Gem::Version
95
98
  version: '0'
96
99
  description: Create, collaborate and publish ebooks easily.
@@ -103,7 +106,7 @@ executables:
103
106
  extensions: []
104
107
  extra_rdoc_files: []
105
108
  files:
106
- - .gitignore
109
+ - ".gitignore"
107
110
  - Gemfile
108
111
  - Gemfile.lock
109
112
  - README.md
@@ -120,45 +123,52 @@ files:
120
123
  - template/.wordsmith
121
124
  - template/README.md
122
125
  - template/assets/images/cover.jpg
123
- - template/assets/stylesheets/default.css
126
+ - template/assets/stylesheets/_partial.scss
127
+ - template/assets/stylesheets/_with_sass.scss
128
+ - template/assets/stylesheets/epub.css
129
+ - template/assets/stylesheets/master.scss
130
+ - template/assets/stylesheets/other.css
124
131
  - template/content/01_manifesto.md
125
132
  - template/content/02_read_read_read.md
126
133
  - template/content/03_pay_special_attention/01_intro.md
127
134
  - template/content/03_pay_special_attention/02_conclusion.md
128
135
  - template/layout/footer.html
129
136
  - template/layout/header.html
137
+ - test/css_test.rb
130
138
  - test/generate_test.rb
131
139
  - test/init_test.rb
132
140
  - test/publish_test.rb
141
+ - test/sass_test.rb
133
142
  - test/test_helper.rb
134
143
  - wordsmith.gemspec
135
144
  homepage: https://github.com/tractical/wordsmith
136
145
  licenses:
137
146
  - MIT
147
+ metadata: {}
138
148
  post_install_message:
139
149
  rdoc_options: []
140
150
  require_paths:
141
151
  - lib
142
152
  required_ruby_version: !ruby/object:Gem::Requirement
143
- none: false
144
153
  requirements:
145
- - - ! '>='
154
+ - - ">="
146
155
  - !ruby/object:Gem::Version
147
156
  version: '0'
148
157
  required_rubygems_version: !ruby/object:Gem::Requirement
149
- none: false
150
158
  requirements:
151
- - - ! '>='
159
+ - - ">="
152
160
  - !ruby/object:Gem::Version
153
161
  version: '0'
154
162
  requirements: []
155
163
  rubyforge_project:
156
- rubygems_version: 1.8.23
164
+ rubygems_version: 2.2.2
157
165
  signing_key:
158
- specification_version: 3
166
+ specification_version: 4
159
167
  summary: The best way to publish ebooks. No, really.
160
168
  test_files:
169
+ - test/css_test.rb
161
170
  - test/generate_test.rb
162
171
  - test/init_test.rb
163
172
  - test/publish_test.rb
173
+ - test/sass_test.rb
164
174
  - test/test_helper.rb