maliq 0.0.8 → 0.0.9
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.
- data/bin/maliq +1 -1
- data/bin/maliq_gepub +19 -110
- data/lib/maliq.rb +3 -3
- data/lib/maliq/epub.rb +109 -0
- data/lib/maliq/version.rb +1 -1
- metadata +3 -2
data/bin/maliq
CHANGED
@@ -36,7 +36,7 @@ class OptionParser
|
|
36
36
|
EOS
|
37
37
|
|
38
38
|
opt :liquid, "Liquid plugin path", :type => :string
|
39
|
-
opt :seq, "Build consecutive filenames", :default =>
|
39
|
+
opt :seq, "Build consecutive filenames", :default => true
|
40
40
|
opt :nav, "Create nav.xhtml(TOC)", :default => true
|
41
41
|
opt :toc, "Set title for TOC", :default => ''
|
42
42
|
end
|
data/bin/maliq_gepub
CHANGED
@@ -2,127 +2,36 @@
|
|
2
2
|
# encoding: UTF-8
|
3
3
|
require "maliq"
|
4
4
|
require "trollop"
|
5
|
-
require "gepub"
|
6
5
|
|
7
6
|
class OptionParser
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def self.parse!
|
8
|
+
Trollop::options do
|
9
|
+
version "Maliq #{Maliq::VERSION} (c) 2012 kyoendo"
|
10
|
+
banner ~<<-EOS
|
11
|
+
Maliq is a markdown, liquid converter for EPUB's xhtml.
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
metadata = read_metadata(markdowns.first)
|
15
|
-
generate(metadata, files, opts)
|
16
|
-
end
|
17
|
-
|
18
|
-
def build_opts
|
19
|
-
Trollop::options do
|
20
|
-
version "Maliq #{Maliq::VERSION} (c) 2012 kyoendo"
|
21
|
-
banner ~<<-EOS
|
22
|
-
Maliq is a markdown, liquid converter for EPUB's xhtml.
|
23
|
-
|
24
|
-
'maliq_gepub' command is a tool for generating a EPUB package
|
25
|
-
using Gepub gem.
|
26
|
-
|
27
|
-
Usage:
|
28
|
-
|
29
|
-
1. Install gepub gem(gem install gepub)
|
30
|
-
|
31
|
-
2. Set meta data required for Epub generation in Yaml Front
|
32
|
-
Matter(YFM) of your markdown file.
|
33
|
-
|
34
|
-
3. Create xhtml files with 'maliq' command(see maliq -h).
|
13
|
+
'maliq_gepub' command is a tool for generating a EPUB package
|
14
|
+
using Gepub gem.
|
35
15
|
|
36
|
-
|
16
|
+
Usage:
|
37
17
|
|
38
|
-
|
39
|
-
EOS
|
40
|
-
|
41
|
-
opt :output, "Output Epub filename", :default => 'out.epub'
|
42
|
-
opt :toc, "Add Table of Contents page", :default => true
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns a Hash, in which filenames are grouped by extname.
|
47
|
-
def read_files
|
48
|
-
Dir['*', '*/*'].group_by { |f| f.ext || :_dir }.to_symkey
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns a Hash of metadata.
|
52
|
-
def read_metadata(path)
|
53
|
-
unless path
|
54
|
-
abort "Must exist a markdown filename which have Yaml Front Matter."
|
55
|
-
end
|
56
|
-
yml, _ = Maliq::FileUtils.retrieveYFM(File.read path)
|
57
|
-
return nil if yml.empty?
|
58
|
-
YAML.load(yml).to_symkey
|
59
|
-
end
|
18
|
+
1. Install gepub gem(gem install gepub)
|
60
19
|
|
61
|
-
|
62
|
-
|
63
|
-
metadata.select! { |k, _| meta_nodes.include? k.to_s }
|
64
|
-
csses = files.values_atx(:css)
|
65
|
-
images = files.values_atx(:png, :jpg, :jpeg, :gif, :bmp, :tiff)
|
66
|
-
cover_images, images = images.partition { |f| File.basename(f, '.*').match /^cover/ }
|
67
|
-
xhtmls = files.values_atx(:xhtml, :html)
|
68
|
-
cover_xhtml = xhtmls.delete('cover.xhtml')
|
20
|
+
2. Set meta data required for Epub generation in Yaml Front
|
21
|
+
Matter(YFM) of your markdown file.
|
69
22
|
|
70
|
-
|
71
|
-
if (cover = cover_images.first) && !cover_xhtml
|
72
|
-
cover_xhtml = create_cover_page(cover)
|
73
|
-
end
|
23
|
+
3. Create xhtml files with 'maliq' command(see maliq -h).
|
74
24
|
|
75
|
-
|
25
|
+
4. fire up 'maliq_gepub' on the direcroty.
|
76
26
|
|
77
|
-
|
78
|
-
|
79
|
-
xhtmls.map! { |f| xhtml_with_heading f }
|
80
|
-
|
81
|
-
GEPUB::Builder.new do
|
82
|
-
metadata.each { |k, v| send k, *Array(v) }
|
83
|
-
|
84
|
-
resources(:workdir => '.') {
|
85
|
-
csses.each { |f| file f }
|
86
|
-
cover_image cover if cover
|
87
|
-
images.each { |f| file(f) }
|
88
|
-
ordered {
|
89
|
-
if cover_xhtml
|
90
|
-
file 'cover.xhtml' => cover_xhtml
|
91
|
-
heading 'Cover'
|
92
|
-
end
|
93
|
-
|
94
|
-
nav navfile if navfile
|
95
|
-
|
96
|
-
xhtmls.each do |fname, head|
|
97
|
-
file fname
|
98
|
-
heading head if !navfile || heading_files.include?(fname)
|
99
|
-
end
|
100
|
-
}
|
101
|
-
}
|
102
|
-
end.generate_epub(opts[:output])
|
103
|
-
end
|
104
|
-
|
105
|
-
def create_cover_page(cover)
|
106
|
-
out = Maliq::Converter.new("", title:'Cover').run
|
107
|
-
StringIO.new(out)
|
108
|
-
end
|
109
|
-
|
110
|
-
def pick_nav_file(xhtmls)
|
111
|
-
navs, xhtmls = xhtmls.partition { |fname| fname.match /^(nav|toc)\.x*html$/ }
|
112
|
-
nav = navs.empty? ? nil : navs.first
|
113
|
-
return nav, xhtmls
|
114
|
-
end
|
115
|
-
|
116
|
-
def get_heading_files(navfile)
|
117
|
-
File.read(navfile).scan(/\w+\.xhtml(?=.*?<\/li>)/) if navfile
|
118
|
-
end
|
27
|
+
where [options] are:
|
28
|
+
EOS
|
119
29
|
|
120
|
-
|
121
|
-
|
122
|
-
File.read(xhtml).match(/<h(?:1|2|3)>(.*?)<\/h(?:1|2|3)>/) { heading = $1 }
|
123
|
-
[xhtml, heading]
|
30
|
+
opt :output, "Output Epub filename", :default => 'out.epub'
|
31
|
+
opt :toc, "Add Table of Contents page", :default => true
|
124
32
|
end
|
125
33
|
end
|
126
34
|
end
|
127
35
|
|
128
|
-
OptionParser.parse!
|
36
|
+
opts = OptionParser.parse!
|
37
|
+
Maliq::Epub.new(opts).create!
|
data/lib/maliq.rb
CHANGED
data/lib/maliq/epub.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require "gepub"
|
3
|
+
|
4
|
+
class Maliq::Epub
|
5
|
+
def initialize(opts)
|
6
|
+
@opts = opts
|
7
|
+
@output = @opts.delete(:output) || 'out.epub'
|
8
|
+
@path = opts[:path] || '.'
|
9
|
+
set_files_by_type(@path)
|
10
|
+
@metadata = read_metadata
|
11
|
+
end
|
12
|
+
|
13
|
+
def create!
|
14
|
+
# Instance variables need to be locals, because a block of,
|
15
|
+
# GEPUB::Builder.new changes its context with instance_eval.
|
16
|
+
metadata = @metadata
|
17
|
+
csses = @csses
|
18
|
+
cover_img = @cover_image
|
19
|
+
images = @images
|
20
|
+
cover_xhtml = @cover_xhtml
|
21
|
+
navfile = @navfile
|
22
|
+
heading_files = @heading_files
|
23
|
+
xhtmls = @xhtmls
|
24
|
+
path = @path
|
25
|
+
|
26
|
+
GEPUB::Builder.new do
|
27
|
+
metadata.each { |k, *v| send k, *v }
|
28
|
+
|
29
|
+
resources(:workdir => path) {
|
30
|
+
csses.each { |f| file f }
|
31
|
+
cover_image cover_img if cover_img
|
32
|
+
images.each { |f| file(f) }
|
33
|
+
ordered {
|
34
|
+
if cover_xhtml
|
35
|
+
file 'cover.xhtml' => cover_xhtml
|
36
|
+
heading 'Cover'
|
37
|
+
end
|
38
|
+
|
39
|
+
nav navfile if navfile
|
40
|
+
|
41
|
+
xhtmls.each do |fname, head|
|
42
|
+
file fname
|
43
|
+
heading head if !navfile || heading_files.include?(fname)
|
44
|
+
end
|
45
|
+
}
|
46
|
+
}
|
47
|
+
end.generate_epub(@output)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
# Returns a Hash, in which filenames are grouped by extname.
|
52
|
+
def set_files_by_type(path)
|
53
|
+
files = Dir.chdir(path) { Dir["*", "*/*"].group_by { |f| f.ext || :_dir }.to_symkey }
|
54
|
+
@mds = files.values_atx(:md, :markdown)
|
55
|
+
xhtmls = files.values_atx(:xhtml, :html)
|
56
|
+
@csses = files.values_atx(:css)
|
57
|
+
images = files.values_atx(:png, :jpg, :jpeg, :gif, :bmp, :tiff)
|
58
|
+
(@cover_image, *_), @images =
|
59
|
+
images.partition { |f| File.basename(f, '.*').match /^cover/ }
|
60
|
+
|
61
|
+
@cover_xhtml =
|
62
|
+
if cover = xhtmls.delete('cover.xhtml')
|
63
|
+
cover
|
64
|
+
elsif @cover_image
|
65
|
+
# Create cover page if page not provided for a cover image.
|
66
|
+
create_cover_page(@cover_image)
|
67
|
+
end
|
68
|
+
|
69
|
+
@navfile, xhtmls = pick_nav_file(xhtmls)
|
70
|
+
|
71
|
+
@heading_files = get_heading_files(@navfile)
|
72
|
+
|
73
|
+
@xhtmls = xhtmls.map { |f| xhtml_with_heading f }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns a Hash of metadata.
|
77
|
+
def read_metadata
|
78
|
+
path = @mds.first
|
79
|
+
unless path
|
80
|
+
abort "Must exist a markdown filename which have Yaml Front Matter."
|
81
|
+
end
|
82
|
+
yml, _ = Maliq::FileUtils.retrieveYFM(File.read path)
|
83
|
+
return nil if yml.empty?
|
84
|
+
metadata = YAML.load(yml).to_symkey
|
85
|
+
|
86
|
+
meta_nodes = GEPUB::Metadata::CONTENT_NODE_LIST + ["unique_identifier"]
|
87
|
+
metadata.select { |k, _| meta_nodes.include? k.to_s }
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_cover_page(cover)
|
91
|
+
out = Maliq::Converter.new("", title:'Cover').run
|
92
|
+
StringIO.new(out)
|
93
|
+
end
|
94
|
+
|
95
|
+
def pick_nav_file(xhtmls)
|
96
|
+
(nav, *_), xhtmls = xhtmls.partition { |fname| fname.match /^(nav|toc)\.x*html$/ }
|
97
|
+
return nav, xhtmls
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_heading_files(navfile)
|
101
|
+
File.read(navfile).scan(/\w+\.xhtml(?=.*?<\/li>)/) if navfile
|
102
|
+
end
|
103
|
+
|
104
|
+
def xhtml_with_heading(xhtml)
|
105
|
+
heading = File.basename(xhtml, '.*').capitalize
|
106
|
+
File.read(xhtml).match(/<h(?:1|2|3)>(.*?)<\/h(?:1|2|3)>/) { heading = $1 }
|
107
|
+
[xhtml, heading]
|
108
|
+
end
|
109
|
+
end
|
data/lib/maliq/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maliq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: trollop
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- lib/maliq.rb
|
111
111
|
- lib/maliq/converter.rb
|
112
112
|
- lib/maliq/create.rb
|
113
|
+
- lib/maliq/epub.rb
|
113
114
|
- lib/maliq/file_utils.rb
|
114
115
|
- lib/maliq/system_extensions.rb
|
115
116
|
- lib/maliq/version.rb
|