softcover 0.9.23 → 1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.pull_requests/1403289532 +0 -0
- data/Gemfile +1 -1
- data/lib/softcover/builders/epub.rb +28 -19
- data/lib/softcover/builders/html.rb +2 -1
- data/lib/softcover/builders/mobi.rb +20 -7
- data/lib/softcover/cli.rb +3 -3
- data/lib/softcover/template/chapters/a_chapter.md +2 -2
- data/lib/softcover/template/chapters/a_chapter.tex +1 -1
- data/lib/softcover/template/latex_styles/softcover.sty +3 -2
- data/lib/softcover/utils.rb +1 -1
- data/lib/softcover/version.rb +1 -1
- data/softcover.gemspec +1 -1
- data/spec/builders/mobi_spec.rb +15 -2
- data/spec/cli_spec.rb +6 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07316c46b4a5618e9456de93af46e5bbb111ba9c
|
4
|
+
data.tar.gz: 915b545aaa9fdaf36207fb95d8a7671d8627939c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f02e3ee81191ad6d8731df6c1bcd6a94c134a7e0595a1039671e0f94bb2158dd581fa606127324e08db7a9c9e9fbfb2ad6cf64d4e2c3f172b580b23b97b780d8
|
7
|
+
data.tar.gz: d0770ea2d5d9c20f45ca27fef220431ea7f489b59976d1a4b1ef23557ae2a327856902aba861b7fcfe3e643920e51766f200c43ea757ef5f8c6fadda3689405f
|
File without changes
|
data/Gemfile
CHANGED
@@ -1,7 +1,35 @@
|
|
1
1
|
module Softcover
|
2
|
+
|
3
|
+
module EpubUtils
|
4
|
+
|
5
|
+
# Returns the name of the cover file.
|
6
|
+
# We support (in order) JPG/JPEG, PNG, and TIFF.
|
7
|
+
def cover_img
|
8
|
+
extensions = %w[jpg jpeg png tiff]
|
9
|
+
extensions.each do |ext|
|
10
|
+
file = Dir[path("#{images_dir}/cover.#{ext}")].first
|
11
|
+
return File.basename(file) if file
|
12
|
+
end
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
def cover?
|
17
|
+
cover_img
|
18
|
+
end
|
19
|
+
|
20
|
+
def cover_img_path
|
21
|
+
path("#{images_dir}/#{cover_img}")
|
22
|
+
end
|
23
|
+
|
24
|
+
def images_dir
|
25
|
+
path('epub/OEBPS/images')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
2
29
|
module Builders
|
3
30
|
class Epub < Builder
|
4
31
|
include Softcover::Output
|
32
|
+
include Softcover::EpubUtils
|
5
33
|
|
6
34
|
def build!(options={})
|
7
35
|
@preview = options[:preview]
|
@@ -121,10 +149,6 @@ module Softcover
|
|
121
149
|
end
|
122
150
|
end
|
123
151
|
|
124
|
-
def images_dir
|
125
|
-
File.join('epub', 'OEBPS', 'images')
|
126
|
-
end
|
127
|
-
|
128
152
|
# Returns HTML for HTML source that includes math.
|
129
153
|
# As a side-effect, html_with_math creates PNGs corresponding to any
|
130
154
|
# math in the given source. The technique involves using PhantomJS to
|
@@ -398,25 +422,10 @@ module Softcover
|
|
398
422
|
)
|
399
423
|
end
|
400
424
|
|
401
|
-
# Returns the name of the cover file.
|
402
|
-
# We support (in order) JPG/JPEG, PNG, and TIFF.
|
403
|
-
def cover_img
|
404
|
-
extensions = %w[jpg jpeg png tiff]
|
405
|
-
extensions.each do |ext|
|
406
|
-
file = Dir[path("#{images_dir}/cover.#{ext}")].first
|
407
|
-
return File.basename(file) if file
|
408
|
-
end
|
409
|
-
return false
|
410
|
-
end
|
411
|
-
|
412
425
|
def cover_id
|
413
426
|
"img-#{cover_img.sub('.', '-')}"
|
414
427
|
end
|
415
428
|
|
416
|
-
def cover?
|
417
|
-
cover_img
|
418
|
-
end
|
419
|
-
|
420
429
|
# Returns the Table of Contents for the spine.
|
421
430
|
def toc_ncx
|
422
431
|
title = manifest.title
|
@@ -88,7 +88,8 @@ module Softcover
|
|
88
88
|
# interim.
|
89
89
|
unless (File.exist?(chapter.cache_filename) &&
|
90
90
|
File.read(chapter.cache_filename) == digest(markdown) &&
|
91
|
-
File.exist?(polytex_filename)
|
91
|
+
File.exist?(polytex_filename) &&
|
92
|
+
!markdown.include?('\input'))
|
92
93
|
File.write(polytex_filename, polytex(chapter, markdown))
|
93
94
|
end
|
94
95
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Softcover
|
2
2
|
module Builders
|
3
3
|
class Mobi < Builder
|
4
|
+
include Softcover::Utils
|
5
|
+
include Softcover::EpubUtils
|
4
6
|
|
5
7
|
def build!(options={})
|
6
8
|
Softcover::Builders::Epub.new.build!(options)
|
@@ -12,10 +14,6 @@ module Softcover
|
|
12
14
|
else
|
13
15
|
system(command)
|
14
16
|
end
|
15
|
-
if options[:calibre]
|
16
|
-
FileUtils.mv("ebooks/#{filename}.azw3", "ebooks/#{filename}.mobi")
|
17
|
-
puts "MOBI saved to ebooks/#{filename}.mobi" unless silent
|
18
|
-
end
|
19
17
|
end
|
20
18
|
|
21
19
|
# Returns the filename of the MOBI (preview if necessary).
|
@@ -25,10 +23,11 @@ module Softcover
|
|
25
23
|
|
26
24
|
# Returns the command for making a MOBI, based on the options.
|
27
25
|
def mobi_command(filename, options={})
|
28
|
-
if options[:
|
29
|
-
"#{calibre} ebooks/#{filename}.epub ebooks/#{filename}.azw3"
|
30
|
-
else
|
26
|
+
if options[:kindlegen]
|
31
27
|
"#{kindlegen} ebooks/#{filename}.epub"
|
28
|
+
else
|
29
|
+
"#{calibre} ebooks/#{filename}.epub ebooks/#{filename}.mobi" +
|
30
|
+
" #{calibre_options}"
|
32
31
|
end
|
33
32
|
end
|
34
33
|
|
@@ -38,6 +37,20 @@ module Softcover
|
|
38
37
|
@calibre ||= executable(dependency_filename(:calibre))
|
39
38
|
end
|
40
39
|
|
40
|
+
# Returns the options for the Calibre `ebook-convert` CLI.
|
41
|
+
def calibre_options
|
42
|
+
# Include both Mobipocket & KF8 formats.
|
43
|
+
# It took me forever to figure this out. It really should be
|
44
|
+
# the Calibre default.
|
45
|
+
opts = "--mobi-file-type both"
|
46
|
+
if cover?
|
47
|
+
opts += " --cover #{cover_img_path}"
|
48
|
+
# Get covers to work in Kindle desktop app.
|
49
|
+
opts += " --share-not-sync"
|
50
|
+
end
|
51
|
+
opts
|
52
|
+
end
|
53
|
+
|
41
54
|
def kindlegen
|
42
55
|
@kindlegen ||= executable(dependency_filename(:kindlegen))
|
43
56
|
end
|
data/lib/softcover/cli.rb
CHANGED
@@ -42,9 +42,9 @@ module Softcover
|
|
42
42
|
desc: "Find overfull hboxes",
|
43
43
|
type: :boolean
|
44
44
|
elsif format == 'mobi'
|
45
|
-
method_option :
|
46
|
-
|
47
|
-
|
45
|
+
method_option :kindlegen, aliases: '-k',
|
46
|
+
desc: "Use KindleGen to build the MOBI",
|
47
|
+
type: :boolean
|
48
48
|
end
|
49
49
|
method_option :quiet, aliases: '-q',
|
50
50
|
desc: "Quiet output", type: :boolean
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# A chapter
|
2
2
|
\label{cha:a_chapter}
|
3
3
|
|
4
|
-
This is the first paragraph of the Softcover Markdown template produced with the \softcover\ command-line interface. It shows how to write a document in Markdown, a lightweight markup language, augmented with the [kramdown](http://kramdown.rubyforge.org/) converter and some custom extensions, including support for embedded \PolyTeX, a subset of the powerful \LaTeX\ typesetting system. For more information, see [*The Softcover Book*](http://manual.softcover.io/book). To learn how to easily publish (and optionally sell) documents produced with Softcover, visit [Softcover.io](http://softcover.io/).
|
4
|
+
This is the first paragraph of the Softcover Markdown template produced with the \softcover\ command-line interface. It shows how to write a document in Markdown, a lightweight markup language, augmented with the [kramdown](http://kramdown.rubyforge.org/) converter and some custom extensions, including support for embedded \PolyTeX, a subset of the powerful \LaTeX\ typesetting system. For more information, see [*The Softcover Book*](http://manual.softcover.io/book). To learn how to easily publish (and optionally sell) documents produced with Softcover, visit [Softcover.io](http://softcover.io/).
|
5
5
|
|
6
|
-
This is the *second* paragraph, showing how to emphasize text.[^sample-footnote] You can also make text **bold** or _emphasize a second way_.
|
6
|
+
This is the *second* paragraph, showing how to emphasize text.[^sample-footnote] You can also make text **bold** or _emphasize a second way_. Via embedded \PolyTeX, Softcover also supports colored text, such as \coloredtext{red}{red}, \coloredtext{CornflowerBlue}{cornflower blue}, and \coloredtexthtml{E8AB3A}{arbitrary HTML colors}.
|
7
7
|
|
8
8
|
## A section
|
9
9
|
\label{sec:a_section}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
\chapter{A chapter}
|
2
2
|
\label{cha:a_chapter}
|
3
3
|
|
4
|
-
This is the first paragraph of the Softcover template. It shows how to write a document in \PolyTeX, a subset of the \LaTeX\ typesetting language optimized for ebooks. For more information, see \href{http://manual.softcover.org/book}{\emph{The Softcover Book}}. To learn how to easily publish (and optionally sell) documents produced with Softcover, visit \href{http://softcover.io/}{Softcover.io}.
|
4
|
+
This is the first paragraph of the Softcover template. It shows how to write a document in \PolyTeX, a subset of the \LaTeX\ typesetting language optimized for ebooks. For more information, see \href{http://manual.softcover.org/book}{\emph{The Softcover Book}}. To learn how to easily publish (and optionally sell) documents produced with Softcover, visit \href{http://softcover.io/}{Softcover.io}.
|
5
5
|
|
6
6
|
This is the \emph{second} paragraph, showing how to emphasize text.\footnote{This is a footnote. It is numbered automatically.} You can also make text \textbf{bold} or \textit{italicized} (which looks the same as emphasized text).
|
7
7
|
|
@@ -11,10 +11,10 @@
|
|
11
11
|
|
12
12
|
% Font encodings
|
13
13
|
\usepackage[T1]{fontenc}
|
14
|
+
% Be able to define colors
|
15
|
+
\usepackage[svgnames]{xcolor}
|
14
16
|
% Be able to include book covers
|
15
17
|
\usepackage{pdfpages}
|
16
|
-
% Be able to define colors
|
17
|
-
\usepackage{xcolor}
|
18
18
|
% Include graphics
|
19
19
|
\usepackage{graphicx}
|
20
20
|
\def\maxwidth#1{\ifdim\Gin@nat@width>#1 #1\else\Gin@nat@width\fi}
|
@@ -129,6 +129,7 @@
|
|
129
129
|
\newcommand{\kodesize}{\smaller[0.75]}
|
130
130
|
\newcommand{\kode}[1]{\textcolor{darkgreen}{\textbf{\texttt{\kodesize #1}}}}
|
131
131
|
\newcommand{\coloredtext}[2]{\textcolor{#1}{#2}}
|
132
|
+
\newcommand{\coloredtexthtml}[2]{\textcolor[HTML]{#1}{#2}}
|
132
133
|
|
133
134
|
% Subtitle command
|
134
135
|
\usepackage{titling}
|
data/lib/softcover/utils.rb
CHANGED
@@ -197,7 +197,7 @@ module Softcover::Utils
|
|
197
197
|
# Returns the system-independent file path.
|
198
198
|
# It's nicer to write `path('foo/bar/baz')` than
|
199
199
|
# `File.join('foo', 'bar', 'baz')`.
|
200
|
-
def path(path_string)
|
200
|
+
def path(path_string='')
|
201
201
|
File.join(*path_string.split('/'))
|
202
202
|
end
|
203
203
|
|
data/lib/softcover/version.rb
CHANGED
data/softcover.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_dependency 'polytexnic', '~> 0.
|
21
|
+
gem.add_dependency 'polytexnic', '~> 1.0.beta1'
|
22
22
|
gem.add_dependency 'msgpack', '~> 0.4.2'
|
23
23
|
gem.add_dependency 'nokogiri', '~> 1.6.0'
|
24
24
|
gem.add_dependency 'thor', '~> 0.18.1'
|
data/spec/builders/mobi_spec.rb
CHANGED
@@ -17,16 +17,29 @@ describe Softcover::Builders::Mobi do
|
|
17
17
|
describe "MOBI command" do
|
18
18
|
context "default" do
|
19
19
|
let(:command) do
|
20
|
-
@builder.mobi_command(@builder.mobi_filename
|
20
|
+
@builder.mobi_command(@builder.mobi_filename)
|
21
21
|
end
|
22
|
+
|
22
23
|
it "should use Calibre's ebook-convert" do
|
23
24
|
expect(command).to include 'ebook-convert'
|
24
25
|
end
|
26
|
+
|
27
|
+
it "should build both kinds of Kindle files" do
|
28
|
+
expect(command).to include ' --mobi-file-type both'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should include the cover" do
|
32
|
+
expect(command).to include ' --cover epub/OEBPS/images/cover.jpg'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should configure the cover to work with Kindle desktop app" do
|
36
|
+
expect(command).to include ' --share-not-sync'
|
37
|
+
end
|
25
38
|
end
|
26
39
|
|
27
40
|
context "kindlegen" do
|
28
41
|
let(:command) do
|
29
|
-
@builder.mobi_command(@builder.mobi_filename)
|
42
|
+
@builder.mobi_command(@builder.mobi_filename, kindlegen: true)
|
30
43
|
end
|
31
44
|
it "should use Amazon.com's kindlegen" do
|
32
45
|
expect(command).to include 'kindlegen'
|
data/spec/cli_spec.rb
CHANGED
@@ -120,6 +120,12 @@ describe Softcover::CLI do
|
|
120
120
|
expect(path('ebooks/book.mobi')).to exist
|
121
121
|
end
|
122
122
|
end
|
123
|
+
|
124
|
+
context "command-line options" do
|
125
|
+
subject(:options) { `softcover help build:mobi` }
|
126
|
+
it { should_not include 'calibre' }
|
127
|
+
it { should include 'kindlegen' }
|
128
|
+
end
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: softcover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Hartl
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: polytexnic
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.
|
20
|
+
version: 1.0.beta1
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.
|
27
|
+
version: 1.0.beta1
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: msgpack
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -384,6 +384,7 @@ files:
|
|
384
384
|
- .pull_requests/1388713504
|
385
385
|
- .pull_requests/1388804598
|
386
386
|
- .pull_requests/1395697365
|
387
|
+
- .pull_requests/1403289532
|
387
388
|
- .rspec
|
388
389
|
- .travis.yml
|
389
390
|
- Gemfile
|
@@ -1051,9 +1052,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1051
1052
|
version: '0'
|
1052
1053
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1053
1054
|
requirements:
|
1054
|
-
- - '
|
1055
|
+
- - '>'
|
1055
1056
|
- !ruby/object:Gem::Version
|
1056
|
-
version:
|
1057
|
+
version: 1.3.1
|
1057
1058
|
requirements: []
|
1058
1059
|
rubyforge_project:
|
1059
1060
|
rubygems_version: 2.0.14
|