xpub 0.0.7 → 0.0.8
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +23 -0
- data/README.md +2 -2
- data/bin/xpub +52 -55
- data/lib/xpub.rb +1 -1
- data/lib/xpub/dsl/book.rb +97 -113
- data/lib/xpub/dsl/builder.rb +307 -307
- data/lib/xpub/dsl/checker.rb +53 -58
- data/lib/xpub/dsl/page.rb +71 -82
- data/lib/xpub/dsl/src_file.rb +99 -119
- data/lib/xpub/dsl_accessor.rb +1 -1
- data/lib/xpub/version.rb +1 -1
- data/skel/theme/default/latex/template.tex +3 -1
- data/xpub.gemspec +12 -12
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fc9eae42fc7bda94dd9691a0e7f18773f46887e
|
4
|
+
data.tar.gz: d2fd3a9da17e69da7b1ccc5452f2441b00a85953
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cea43745ecc2537ee921aba38f7f5c24d460430764ea3cebb22693ef164cfd4cc250c7d2b498fcd8c3af70c3b6830b78de74cba6abd4fc7b063a832949dbea6d
|
7
|
+
data.tar.gz: 0a4ed1b9d0a07a74df850c14473a358cc95c0d6a7c83835a5b54c7bc8eb1a0b5b003baf9626872cda490aff5d8e846f7832de52184d5cda72c1211a050feaa59
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
AsciiComments:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Metrics/LineLength:
|
5
|
+
Max: 160
|
6
|
+
|
7
|
+
Metrics/AbcSize:
|
8
|
+
Max: 30
|
9
|
+
|
10
|
+
Metrics/ClassLength:
|
11
|
+
Max: 102
|
12
|
+
|
13
|
+
Style/MethodLength:
|
14
|
+
Max: 30
|
15
|
+
|
16
|
+
Style/Documentation:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
AllCops:
|
20
|
+
Exclude:
|
21
|
+
- 'cookbooks/**'
|
22
|
+
- '.chef/**'
|
23
|
+
- '.bundle/**'
|
data/README.md
CHANGED
@@ -50,7 +50,7 @@ $ sudo tlmgr update --self --all
|
|
50
50
|
インストールディレクトリは
|
51
51
|
|
52
52
|
* 基本インストール
|
53
|
-
/usr/local/texlive/
|
53
|
+
/usr/local/texlive/2015
|
54
54
|
* TEXMFLOCAL
|
55
55
|
/usr/local/texlive/texmf-local
|
56
56
|
* TEXMFHOME
|
@@ -64,7 +64,7 @@ $ kpsewhich -var-value TEXMF
|
|
64
64
|
で検索の優先順位がわかるらしい。
|
65
65
|
|
66
66
|
|
67
|
-
### pandoc 1.
|
67
|
+
### pandoc 1.15.2.1
|
68
68
|
|
69
69
|
https://github.com/jgm/pandoc/releases
|
70
70
|
|
data/bin/xpub
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'bundler/setup'
|
4
4
|
|
5
5
|
require 'rainbow/ext/string'
|
6
|
-
require
|
6
|
+
require 'open3'
|
7
7
|
require 'optparse'
|
8
8
|
require 'fileutils'
|
9
9
|
require 'pathname'
|
@@ -15,69 +15,66 @@ require 'levenshtein'
|
|
15
15
|
|
16
16
|
require 'xpub/version.rb'
|
17
17
|
|
18
|
-
option={}
|
19
|
-
opt = OptionParser.new do |
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
opt.permute!(ARGV)
|
18
|
+
option = {}
|
19
|
+
opt = OptionParser.new do |o|
|
20
|
+
o.version = Xpub::VERSION
|
21
|
+
o.summary_indent = ' ' * 4
|
22
|
+
o.banner = 'Usage: xpub [cmd] [options]'
|
23
|
+
o.on_head('[cmd]',
|
24
|
+
' init Xpubファイルの生成',
|
25
|
+
' build ビルド',
|
26
|
+
' clean テンポラリフォルダと出力フォルダをクリア',
|
27
|
+
' check ソースコードを検証')
|
28
|
+
o.on('-v', '出力を詳細にする') { |v| option[:v] = v }
|
29
|
+
o.on('--book=VALUE', 'ビルドするbookを指定する') { |v| option[:book] = v }
|
30
|
+
o.on('--builder=VALUE', 'ビルドするbuilderを指定する') { |v| option[:builder] = v }
|
31
|
+
o.on('--checker=VALUE', 'チェックするcheckerを指定する') { |v| option[:checker] = v }
|
32
|
+
o.on('--pandoc-json-output', 'ビルド時にpandocのjsonを出力') { |v| option['pandoc-json-output'] = v }
|
33
|
+
o.permute!(ARGV)
|
35
34
|
end
|
36
35
|
|
37
|
-
|
36
|
+
cur_dir = Dir.getwd
|
38
37
|
|
39
|
-
unless File.file?("#{
|
40
|
-
|
41
|
-
|
38
|
+
unless File.file?("#{cur_dir}/Xpub") || ARGV[0] == 'init'
|
39
|
+
puts "File does not exist. #{cur_dir}/Xpub".color :red
|
40
|
+
exit
|
42
41
|
end
|
43
42
|
|
44
|
-
$:.unshift "#{
|
45
|
-
$:.unshift File.dirname(__FILE__) +
|
43
|
+
$:.unshift "#{cur_dir}/lib"
|
44
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
46
45
|
|
47
|
-
require
|
48
|
-
require
|
49
|
-
require
|
50
|
-
require
|
51
|
-
require
|
52
|
-
require
|
46
|
+
require 'xpub/dsl_accessor'
|
47
|
+
require 'xpub/dsl/book'
|
48
|
+
require 'xpub/dsl/src_file'
|
49
|
+
require 'xpub/dsl/builder'
|
50
|
+
require 'xpub/dsl/page'
|
51
|
+
require 'xpub/dsl/checker'
|
53
52
|
|
54
|
-
if File.file?("#{
|
55
|
-
load "#{curDir}/Xpub"
|
56
|
-
end
|
53
|
+
load "#{cur_dir}/Xpub" if File.file?("#{cur_dir}/Xpub") && ARGV[0] != 'init'
|
57
54
|
|
58
55
|
if ARGV.length != 1
|
59
|
-
|
60
|
-
exit
|
61
|
-
elsif ARGV[0] == "build"
|
62
|
-
puts "build...".color :green
|
63
|
-
Xpub::BookManager.instance.build option
|
64
|
-
elsif ARGV[0] == "clean"
|
65
|
-
puts "clean...".color :green
|
66
|
-
FileUtils.remove_entry_secure("#{curDir}/tmp")
|
67
|
-
Dir::mkdir("#{curDir}/tmp")
|
68
|
-
FileUtils.remove_entry_secure("#{curDir}/output")
|
69
|
-
Dir::mkdir("#{curDir}/output")
|
70
|
-
elsif ARGV[0] == "init"
|
71
|
-
if File.file?("#{curDir}/Xpub")
|
72
|
-
puts "File exist. #{curDir}/Xpub".color :red
|
56
|
+
puts opt.help
|
73
57
|
exit
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
elsif ARGV[0] ==
|
78
|
-
|
79
|
-
|
58
|
+
elsif ARGV[0] == 'build'
|
59
|
+
puts 'build...'.color :green
|
60
|
+
Xpub::BookManager.instance.build option
|
61
|
+
elsif ARGV[0] == 'clean'
|
62
|
+
puts 'clean...'.color :green
|
63
|
+
FileUtils.remove_entry_secure("#{cur_dir}/tmp")
|
64
|
+
Dir.mkdir("#{cur_dir}/tmp")
|
65
|
+
FileUtils.remove_entry_secure("#{cur_dir}/output")
|
66
|
+
Dir.mkdir("#{cur_dir}/output")
|
67
|
+
elsif ARGV[0] == 'init'
|
68
|
+
if File.file?("#{cur_dir}/Xpub")
|
69
|
+
puts "File exist. #{cur_dir}/Xpub".color :red
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
puts 'init...'.color :green
|
73
|
+
FileUtils.cp_r(Dir.glob(File.dirname(__FILE__) + '/../skel/*'), './')
|
74
|
+
elsif ARGV[0] == 'check'
|
75
|
+
puts 'check...'.color :green
|
76
|
+
Xpub::BookManager.instance.check option
|
80
77
|
else
|
81
|
-
|
82
|
-
|
78
|
+
puts opt.help
|
79
|
+
exit
|
83
80
|
end
|
data/lib/xpub.rb
CHANGED
data/lib/xpub/dsl/book.rb
CHANGED
@@ -1,138 +1,122 @@
|
|
1
1
|
module Xpub
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
2
|
+
class CallBook
|
3
|
+
attr_reader :name, :src_files, :resource_files, :creators, :contributors, :identifiers
|
4
|
+
|
5
|
+
dsl_accessor :title, default: 'UNTITLED'
|
6
|
+
dsl_accessor :subtitle
|
7
|
+
dsl_accessor :short
|
8
|
+
dsl_accessor :collection
|
9
|
+
dsl_accessor :edition
|
10
|
+
dsl_accessor :extended
|
11
|
+
dsl_accessor :publisher
|
12
|
+
dsl_accessor :rights
|
13
|
+
dsl_accessor :publication
|
14
|
+
dsl_accessor :modification
|
15
|
+
dsl_accessor :lang, default: 'ja'
|
16
|
+
dsl_accessor :description
|
17
|
+
|
18
|
+
def initialize(name)
|
19
|
+
@name = name
|
20
|
+
@creators = []
|
21
|
+
@contributors = []
|
22
|
+
@identifiers = []
|
23
|
+
@src_files = []
|
24
|
+
@resource_files = []
|
25
|
+
@builders = []
|
26
|
+
@checkers = []
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
def validate
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
def build(option)
|
33
|
+
puts "build #{@name} book.".color :green
|
34
|
+
@builders.each do |b|
|
35
|
+
b.build option if !option[:builder] || option[:builder] == b.name
|
36
|
+
end
|
37
37
|
end
|
38
|
-
}
|
39
|
-
end
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
def check(option)
|
40
|
+
puts "check #{@name} book.".color :green
|
41
|
+
@checkers.each do |c|
|
42
|
+
c.check option if !option[:checker] || option[:checker] == c.name
|
43
|
+
end
|
46
44
|
end
|
47
|
-
}
|
48
|
-
end
|
49
45
|
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
class CallAuthor
|
47
|
+
attr_reader :name
|
48
|
+
dsl_accessor :role
|
53
49
|
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
def initialize(name)
|
51
|
+
@name = name
|
52
|
+
end
|
57
53
|
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
def validate
|
55
|
+
end
|
56
|
+
end
|
61
57
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@creators << call
|
69
|
-
end
|
58
|
+
def creator(name, &block)
|
59
|
+
call = CallAuthor.new name
|
60
|
+
call.instance_eval(&block) if block
|
61
|
+
call.validate
|
62
|
+
@creators << call
|
63
|
+
end
|
70
64
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
@contributors << call
|
78
|
-
end
|
65
|
+
def contributor(name, &block)
|
66
|
+
call = CallAuthor.new name
|
67
|
+
call.instance_eval(&block) if block
|
68
|
+
call.validate
|
69
|
+
@contributors << call
|
70
|
+
end
|
79
71
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
72
|
+
class CallIdentifier
|
73
|
+
attr_reader :identifier
|
74
|
+
dsl_accessor :scheme
|
75
|
+
dsl_accessor :type_value
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
77
|
+
def initialize(identifier)
|
78
|
+
@identifier = identifier
|
79
|
+
end
|
88
80
|
|
89
|
-
|
90
|
-
|
91
|
-
|
81
|
+
def validate
|
82
|
+
end
|
83
|
+
end
|
92
84
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
@identifiers << call
|
85
|
+
def identifier(identifier, &block)
|
86
|
+
call = CallIdentifier.new identifier
|
87
|
+
call.instance_eval(&block) if block
|
88
|
+
call.validate
|
89
|
+
@identifiers << call
|
90
|
+
end
|
100
91
|
end
|
101
|
-
end
|
102
92
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
call.validate
|
109
|
-
BookManager.instance.add call
|
110
|
-
end
|
111
|
-
|
112
|
-
class BookManager
|
113
|
-
include Singleton
|
114
|
-
def initialize
|
115
|
-
@books = []
|
93
|
+
def self.book(name, &block)
|
94
|
+
call = CallBook.new name
|
95
|
+
call.instance_eval(&block) if block
|
96
|
+
call.validate
|
97
|
+
BookManager.instance.add call
|
116
98
|
end
|
117
99
|
|
118
|
-
|
119
|
-
|
120
|
-
|
100
|
+
class BookManager
|
101
|
+
include Singleton
|
102
|
+
def initialize
|
103
|
+
@books = []
|
104
|
+
end
|
121
105
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
106
|
+
def add(b)
|
107
|
+
@books << b
|
108
|
+
end
|
109
|
+
|
110
|
+
def build(option)
|
111
|
+
@books.each do |book|
|
112
|
+
book.build option if !option[:book] || option[:book] == book.name
|
113
|
+
end
|
126
114
|
end
|
127
|
-
}
|
128
|
-
end
|
129
115
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
116
|
+
def check(option)
|
117
|
+
@books.each do |book|
|
118
|
+
book.check option if !option[:book] || option[:book] == book.name
|
119
|
+
end
|
134
120
|
end
|
135
|
-
}
|
136
121
|
end
|
137
|
-
end
|
138
122
|
end
|
data/lib/xpub/dsl/builder.rb
CHANGED
@@ -1,319 +1,319 @@
|
|
1
1
|
module Xpub
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
2
|
+
class CallBook
|
3
|
+
class CallBuilder
|
4
|
+
attr_reader :name
|
5
|
+
dsl_accessor :theme, default: 'default'
|
6
|
+
dsl_accessor :output
|
7
|
+
|
8
|
+
def initialize(name, book)
|
9
|
+
@name = name
|
10
|
+
@book = book
|
11
|
+
end
|
12
|
+
|
13
|
+
def build
|
14
|
+
raise 'This method is not implement.'
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate
|
18
|
+
raise 'src_file is empty.' if @book.src_files.count == 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def src_path(file)
|
22
|
+
"#{Dir.getwd}/src/#{file}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def tmp_path(file)
|
26
|
+
"#{Dir.getwd}/tmp/#{@book.name}/#{file}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def output_path(file)
|
30
|
+
"#{Dir.getwd}/output/#{file}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def copy_to_tmp(files)
|
34
|
+
files.each do |file|
|
35
|
+
pn = Pathname.new tmp_path(file.file)
|
36
|
+
FileUtils.mkdir_p(pn.dirname) unless FileTest.exist?(pn.dirname)
|
37
|
+
|
38
|
+
unless FileTest.exist?(tmp_path(file.file)) && File.mtime(src_path(file.file)) <= File.mtime(tmp_path(file.file))
|
39
|
+
puts "copy #{file.file} to tmp/".color :white
|
40
|
+
FileUtils.copy_entry(src_path(file.file), tmp_path(file.file))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def cmd_exec(cmd, args, option)
|
46
|
+
cmd_line = cmd + ' ' + args.map do |arg|
|
47
|
+
Shellwords.shellescape(arg)
|
48
|
+
end.join(' ')
|
49
|
+
puts cmd_line.color :cyan
|
50
|
+
stdout, stderr, status = Open3.capture3 cmd_line
|
51
|
+
puts stdout.color :green if option[:v] || status != 0
|
52
|
+
if status != 0
|
53
|
+
puts stderr.color :red
|
54
|
+
puts 'error!'.color :red
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
end
|
20
58
|
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def src_path file
|
24
|
-
"#{Dir::getwd}/src/#{file}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def tmp_path file
|
28
|
-
"#{Dir::getwd}/tmp/#{@book.name}/#{file}"
|
29
|
-
end
|
30
|
-
|
31
|
-
def output_path file
|
32
|
-
"#{Dir::getwd}/output/#{file}"
|
33
|
-
end
|
34
|
-
|
35
|
-
def copy_to_tmp files
|
36
|
-
files.each { |file|
|
37
|
-
pn = Pathname.new tmp_path(file.file)
|
38
|
-
FileUtils.mkdir_p(pn.dirname) unless FileTest.exist?(pn.dirname)
|
39
|
-
|
40
|
-
unless FileTest.exist?(tmp_path(file.file)) && File::mtime(src_path(file.file)) <= File::mtime(tmp_path(file.file))
|
41
|
-
puts "copy #{file.file} to tmp/".color :white
|
42
|
-
FileUtils.copy_entry(src_path(file.file), tmp_path(file.file))
|
43
|
-
end
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
def cmd_exec cmd, args, option
|
48
|
-
cmd_line = cmd + " " + args.map { |arg|
|
49
|
-
Shellwords.shellescape(arg)
|
50
|
-
}.join(" ")
|
51
|
-
puts cmd_line.color :cyan
|
52
|
-
stdout, stderr, status = Open3.capture3 cmd_line
|
53
|
-
if option[:v] || status != 0
|
54
|
-
puts stdout.color :green
|
55
|
-
end
|
56
|
-
if status != 0
|
57
|
-
puts stderr.color :red
|
58
|
-
puts "error!".color :red
|
59
|
-
exit
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
59
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
60
|
+
class CallEpubBuilder < CallBuilder
|
61
|
+
dsl_accessor :template, default: 'template.html'
|
62
|
+
dsl_accessor :filter, default: 'pandoc-filter.rb'
|
63
|
+
dsl_accessor :stylesheet, default: 'epub.css'
|
64
|
+
dsl_accessor :metadata, default: 'metadata.dat'
|
65
|
+
dsl_accessor :page_progression_direction, default: 'rtl'
|
66
|
+
dsl_accessor :cover_image
|
67
|
+
dsl_accessor :pandoc_cmd, default: 'pandoc'
|
68
|
+
|
69
|
+
def initialize(name, book)
|
70
|
+
@vars = []
|
71
|
+
@meta = []
|
72
|
+
@vars << ['title', book.title] if book.title != ''
|
73
|
+
super name, book
|
74
|
+
end
|
75
|
+
|
76
|
+
def meta_option
|
77
|
+
result = []
|
78
|
+
@meta.concat([['page-progression-direction', page_progression_direction]]).each do |m|
|
79
|
+
result << '-M'
|
80
|
+
result << "#{m[0]}=#{m[1]}"
|
81
|
+
end
|
82
|
+
result
|
83
|
+
end
|
84
|
+
|
85
|
+
def vars_option
|
86
|
+
result = []
|
87
|
+
@vars.concat([[:book_name, @book.name]]).each do |v|
|
88
|
+
result << '-V'
|
89
|
+
result << "#{v[0]}=#{v[1]}"
|
90
|
+
end
|
91
|
+
result
|
92
|
+
end
|
93
|
+
|
94
|
+
def template_option
|
95
|
+
"--template=#{Dir.getwd}/theme/#{theme}/#{@name}/#{template}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def filter_option
|
99
|
+
"--filter=#{Dir.getwd}/theme/#{theme}/#{@name}/#{filter}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def stylesheet_option
|
103
|
+
"--epub-stylesheet=#{Dir.getwd}/theme/#{theme}/#{@name}/#{stylesheet}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def metadata_option
|
107
|
+
'--epub-metadata=' + metadata_path
|
108
|
+
end
|
109
|
+
|
110
|
+
def metadata_path
|
111
|
+
tmp_path("#{@book.name}.#{metadata}")
|
112
|
+
end
|
113
|
+
|
114
|
+
def metadata_template_path
|
115
|
+
"#{Dir.getwd}/theme/#{theme}/#{@name}/#{metadata}.erb"
|
116
|
+
end
|
117
|
+
|
118
|
+
def epub_path
|
119
|
+
output_path(@book.name) + '.epub'
|
120
|
+
end
|
121
|
+
|
122
|
+
def json_path
|
123
|
+
tmp_path(@book.name) + '.json'
|
124
|
+
end
|
125
|
+
|
126
|
+
def _build_resource(files, _option)
|
127
|
+
copy_to_tmp files
|
128
|
+
end
|
129
|
+
|
130
|
+
def pandoc_option(option)
|
131
|
+
option = [
|
132
|
+
'--epub-chapter-level=1',
|
133
|
+
'--toc',
|
134
|
+
'-f',
|
135
|
+
'markdown_phpextra+hard_line_breaks+raw_html',
|
136
|
+
'-s',
|
137
|
+
template_option,
|
138
|
+
filter_option,
|
139
|
+
stylesheet_option,
|
140
|
+
metadata_option
|
141
|
+
]
|
142
|
+
option << '--epub-cover-image=' + src_path(cover_image) if cover_image
|
143
|
+
option
|
144
|
+
end
|
145
|
+
|
146
|
+
def build_epub_metadata(option)
|
147
|
+
f = open metadata_template_path
|
148
|
+
erb = ERB.new f.read, nil, '-'
|
149
|
+
f.close
|
150
|
+
f = open metadata_path, 'w'
|
151
|
+
f.write erb.result(binding)
|
152
|
+
f.close
|
153
|
+
end
|
154
|
+
|
155
|
+
def build(option)
|
156
|
+
FileUtils.mkdir_p(tmp_path('')) unless FileTest.exist?(tmp_path(''))
|
157
|
+
|
158
|
+
build_epub_metadata option
|
159
|
+
|
160
|
+
pandoc_option = pandoc_option(option).concat(vars_option).concat(meta_option).concat(@book.src_files.map(&:full_path))
|
161
|
+
|
162
|
+
cmd_exec "cd #{tmp_path ''};" + pandoc_cmd, ['-o', json_path, '-t', 'json'].concat(pandoc_option), option if option['pandoc-json-output']
|
163
|
+
cmd_exec "cd #{tmp_path ''};" + pandoc_cmd, ['-o', epub_path, '-t', 'epub3'].concat(pandoc_option), option
|
164
|
+
end
|
78
165
|
end
|
79
|
-
super name, book
|
80
|
-
end
|
81
|
-
|
82
|
-
def meta_option
|
83
|
-
result = []
|
84
|
-
@meta.concat([["page-progression-direction", page_progression_direction]]).each { |m|
|
85
|
-
result << "-M"
|
86
|
-
result << "#{m[0]}=#{m[1]}"
|
87
|
-
}
|
88
|
-
result
|
89
|
-
end
|
90
|
-
|
91
|
-
def vars_option
|
92
|
-
result = []
|
93
|
-
@vars.concat([[:book_name, @book.name]]).each { |v|
|
94
|
-
result << "-V"
|
95
|
-
result << "#{v[0]}=#{v[1]}"
|
96
|
-
}
|
97
|
-
result
|
98
|
-
end
|
99
|
-
|
100
|
-
def template_option
|
101
|
-
"--template=#{Dir::getwd}/theme/#{theme}/#{@name}/#{template}"
|
102
|
-
end
|
103
|
-
|
104
|
-
def filter_option
|
105
|
-
"--filter=#{Dir::getwd}/theme/#{theme}/#{@name}/#{filter}"
|
106
|
-
end
|
107
|
-
|
108
|
-
def stylesheet_option
|
109
|
-
"--epub-stylesheet=#{Dir::getwd}/theme/#{theme}/#{@name}/#{stylesheet}"
|
110
|
-
end
|
111
|
-
|
112
|
-
def metadata_option
|
113
|
-
"--epub-metadata=" + metadata_path
|
114
|
-
end
|
115
|
-
|
116
|
-
def metadata_path
|
117
|
-
tmp_path("#{@book.name}.#{metadata}")
|
118
|
-
end
|
119
|
-
|
120
|
-
def metadata_template_path
|
121
|
-
"#{Dir::getwd}/theme/#{theme}/#{@name}/#{metadata}.erb"
|
122
|
-
end
|
123
|
-
|
124
|
-
def epub_path
|
125
|
-
output_path(@book.name) + '.epub'
|
126
|
-
end
|
127
|
-
|
128
|
-
def json_path
|
129
|
-
tmp_path(@book.name) + '.json'
|
130
|
-
end
|
131
|
-
|
132
|
-
def _build_resource files, option
|
133
|
-
copy_to_tmp files
|
134
|
-
end
|
135
|
-
|
136
|
-
def pandoc_option option
|
137
|
-
option = [
|
138
|
-
"--epub-chapter-level=1",
|
139
|
-
"--toc",
|
140
|
-
"-f",
|
141
|
-
"markdown_phpextra+hard_line_breaks+raw_html",
|
142
|
-
"-s",
|
143
|
-
template_option,
|
144
|
-
filter_option,
|
145
|
-
stylesheet_option,
|
146
|
-
metadata_option
|
147
|
-
]
|
148
|
-
if cover_image
|
149
|
-
option << "--epub-cover-image=" + src_path(cover_image)
|
150
|
-
end
|
151
|
-
option
|
152
|
-
end
|
153
|
-
|
154
|
-
def build_epub_metadata option
|
155
|
-
f = open metadata_template_path
|
156
|
-
erb = ERB.new f.read, nil, "-"
|
157
|
-
f.close
|
158
|
-
f = open metadata_path, "w"
|
159
|
-
f.write erb.result(binding)
|
160
|
-
f.close
|
161
|
-
end
|
162
166
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
167
|
+
class CallLatexBuilder < CallBuilder
|
168
|
+
dsl_accessor :template, default: 'template.tex'
|
169
|
+
dsl_accessor :filter, default: 'pandoc-filter.rb'
|
170
|
+
dsl_accessor :extractbb_cmd, default: 'extractbb'
|
171
|
+
dsl_accessor :pandoc_cmd, default: 'pandoc'
|
172
|
+
dsl_accessor :latex_cmd, default: 'uplatex'
|
173
|
+
dsl_accessor :dvipdfm_cmd, default: 'dvipdfmx'
|
174
|
+
|
175
|
+
def initialize(name, book)
|
176
|
+
@vars = []
|
177
|
+
@hyoushi = []
|
178
|
+
@urahyoushi = []
|
179
|
+
super name, book
|
180
|
+
end
|
181
|
+
|
182
|
+
def documentclass(param)
|
183
|
+
@vars << [:documentclass, param]
|
184
|
+
end
|
185
|
+
|
186
|
+
def classoption(param)
|
187
|
+
@vars << [:classoption, param]
|
188
|
+
end
|
189
|
+
|
190
|
+
def prepartname(param)
|
191
|
+
@vars << [:prepartname, param]
|
192
|
+
end
|
193
|
+
|
194
|
+
def postpartname(param)
|
195
|
+
@vars << [:postpartname, param]
|
196
|
+
end
|
197
|
+
|
198
|
+
def prechaptername(param)
|
199
|
+
@vars << [:prechaptername, param]
|
200
|
+
end
|
201
|
+
|
202
|
+
def postchaptername(param)
|
203
|
+
@vars << [:postchaptername, param]
|
204
|
+
end
|
205
|
+
|
206
|
+
def vars_option
|
207
|
+
result = []
|
208
|
+
@vars.concat([[:book_name, @book.name]]).each do |v|
|
209
|
+
result << '-V'
|
210
|
+
result << "#{v[0]}=#{v[1]}"
|
211
|
+
end
|
212
|
+
result
|
213
|
+
end
|
214
|
+
|
215
|
+
def template_option
|
216
|
+
"--template=#{Dir.getwd}/theme/#{theme}/#{@name}/#{template}"
|
217
|
+
end
|
218
|
+
|
219
|
+
def filter_option
|
220
|
+
"--filter=#{Dir.getwd}/theme/#{theme}/#{@name}/#{filter}"
|
221
|
+
end
|
222
|
+
|
223
|
+
def tex_path
|
224
|
+
tmp_path(@book.name) + '.tex'
|
225
|
+
end
|
226
|
+
|
227
|
+
def json_path
|
228
|
+
tmp_path(@book.name) + '.json'
|
229
|
+
end
|
230
|
+
|
231
|
+
def dvi_path
|
232
|
+
tmp_path(@book.name) + '.dvi'
|
233
|
+
end
|
234
|
+
|
235
|
+
def pdf_path
|
236
|
+
if output
|
237
|
+
output_path(output) + '.pdf'
|
238
|
+
else
|
239
|
+
output_path(@book.name) + '.pdf'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def _build_resource(files, option)
|
244
|
+
copy_to_tmp files
|
245
|
+
files.each do |file|
|
246
|
+
xbb = File.dirname(tmp_path(file.file)) + '/' + File.basename(tmp_path(file.file), '.*') + '.xbb'
|
247
|
+
unless FileTest.exist?(xbb) && File.mtime(tmp_path(file.file)) <= File.mtime(xbb)
|
248
|
+
cmd_exec "cd #{Shellwords.shellescape(File.dirname(tmp_path(file.file)))};#{extractbb_cmd}", [File.basename(file.file)], option
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def build_resource(option)
|
254
|
+
_build_resource @book.resource_files, option
|
255
|
+
end
|
256
|
+
|
257
|
+
def pandoc_option(_option)
|
258
|
+
[
|
259
|
+
'--chapters',
|
260
|
+
'-f',
|
261
|
+
'markdown_phpextra+hard_line_breaks+raw_tex',
|
262
|
+
'-s',
|
263
|
+
template_option,
|
264
|
+
filter_option
|
265
|
+
]
|
266
|
+
end
|
267
|
+
|
268
|
+
def build(option)
|
269
|
+
FileUtils.mkdir_p(tmp_path('')) unless FileTest.exist?(tmp_path(''))
|
270
|
+
|
271
|
+
build_pandoc option
|
272
|
+
build_resource option
|
273
|
+
build_hyoushi option
|
274
|
+
build_latex option
|
275
|
+
build_pdf option
|
276
|
+
end
|
277
|
+
|
278
|
+
def build_pandoc(option)
|
279
|
+
pandoc_option = pandoc_option(option).concat(vars_option).concat(@book.src_files.map(&:full_path))
|
280
|
+
cmd_exec pandoc_cmd, ['-o', json_path, '-t', 'json'].concat(pandoc_option), option if option['pandoc-json-output']
|
281
|
+
cmd_exec pandoc_cmd, ['-o', tex_path, '-t', 'latex'].concat(pandoc_option), option
|
282
|
+
end
|
283
|
+
|
284
|
+
def build_latex(option)
|
285
|
+
cmd_exec latex_cmd, ["-output-directory=#{tmp_path('')}", tex_path], option
|
286
|
+
cmd_exec latex_cmd, ["-output-directory=#{tmp_path('')}", tex_path], option
|
287
|
+
end
|
288
|
+
|
289
|
+
def build_hyoushi(option)
|
290
|
+
open(tmp_path(@book.name + '.before_body.tex'), 'w') do |io|
|
291
|
+
io.puts @hyoushi.map { |h| h.latex @book, self } .join
|
292
|
+
end
|
293
|
+
open(tmp_path(@book.name + '.after_body.tex'), 'w') do |io|
|
294
|
+
io.puts @urahyoushi.map { |h| h.latex @book, self }.join
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
def build_pdf(option)
|
299
|
+
unless FileTest.exist?(pdf_path) && (File.mtime(dvi_path) <= File.mtime(pdf_path))
|
300
|
+
cmd_exec "cd #{Shellwords.shellescape(tmp_path(''))};#{dvipdfm_cmd}", ['-o', pdf_path, dvi_path], option
|
301
|
+
end
|
302
|
+
end
|
170
303
|
end
|
171
|
-
cmd_exec "cd #{tmp_path ""};"+ pandoc_cmd, ["-o", epub_path, "-t", "epub3"].concat(pandoc_option option).concat(vars_option).concat(meta_option).concat(@book.src_files.map{ |f| f.full_path }), option
|
172
|
-
end
|
173
|
-
end
|
174
304
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
dsl_accessor :latex_cmd, :default => "uplatex"
|
181
|
-
dsl_accessor :dvipdfm_cmd, :default => "dvipdfmx"
|
182
|
-
|
183
|
-
def initialize name, book
|
184
|
-
@vars = []
|
185
|
-
@hyoushi = []
|
186
|
-
@urahyoushi = []
|
187
|
-
super name, book
|
188
|
-
end
|
189
|
-
|
190
|
-
def documentclass param
|
191
|
-
@vars << [:documentclass, param]
|
192
|
-
end
|
193
|
-
|
194
|
-
def classoption param
|
195
|
-
@vars << [:classoption, param]
|
196
|
-
end
|
197
|
-
|
198
|
-
def prepartname param
|
199
|
-
@vars << [:prepartname, param]
|
200
|
-
end
|
201
|
-
|
202
|
-
def postpartname param
|
203
|
-
@vars << [:postpartname, param]
|
204
|
-
end
|
205
|
-
|
206
|
-
def prechaptername param
|
207
|
-
@vars << [:prechaptername, param]
|
208
|
-
end
|
209
|
-
|
210
|
-
def postchaptername param
|
211
|
-
@vars << [:postchaptername, param]
|
212
|
-
end
|
213
|
-
|
214
|
-
|
215
|
-
def vars_option
|
216
|
-
result = []
|
217
|
-
@vars.concat([[:book_name, @book.name]]).each { |v|
|
218
|
-
result << "-V"
|
219
|
-
result << "#{v[0]}=#{v[1]}"
|
220
|
-
}
|
221
|
-
result
|
222
|
-
end
|
223
|
-
|
224
|
-
def template_option
|
225
|
-
"--template=#{Dir::getwd}/theme/#{theme}/#{@name}/#{template}"
|
226
|
-
end
|
227
|
-
|
228
|
-
def filter_option
|
229
|
-
"--filter=#{Dir::getwd}/theme/#{theme}/#{@name}/#{filter}"
|
230
|
-
end
|
231
|
-
|
232
|
-
def tex_path
|
233
|
-
tmp_path(@book.name) + '.tex'
|
234
|
-
end
|
235
|
-
|
236
|
-
def json_path
|
237
|
-
tmp_path(@book.name) + '.json'
|
238
|
-
end
|
239
|
-
|
240
|
-
def dvi_path
|
241
|
-
tmp_path(@book.name) + '.dvi'
|
242
|
-
end
|
243
|
-
|
244
|
-
def pdf_path
|
245
|
-
if output
|
246
|
-
output_path(output) + '.pdf'
|
247
|
-
else
|
248
|
-
output_path(@book.name) + '.pdf'
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
def _build_resource files, option
|
253
|
-
copy_to_tmp files
|
254
|
-
files.each { |file|
|
255
|
-
xbb = File.dirname(tmp_path(file.file)) + "/" + File.basename(tmp_path(file.file), ".*") + ".xbb"
|
256
|
-
unless FileTest.exist?(xbb) && File::mtime(tmp_path(file.file)) <= File::mtime(xbb)
|
257
|
-
cmd_exec extractbb_cmd, [tmp_path(file.file)], option
|
258
|
-
end
|
259
|
-
}
|
260
|
-
end
|
261
|
-
|
262
|
-
def build_resource option
|
263
|
-
_build_resource @book.resource_files, option
|
264
|
-
end
|
265
|
-
|
266
|
-
def pandoc_option option
|
267
|
-
[
|
268
|
-
"--chapters",
|
269
|
-
"-f",
|
270
|
-
"markdown_phpextra+hard_line_breaks+raw_tex",
|
271
|
-
"-s",
|
272
|
-
template_option,
|
273
|
-
filter_option
|
274
|
-
]
|
275
|
-
end
|
276
|
-
|
277
|
-
def build option
|
278
|
-
FileUtils.mkdir_p(tmp_path "") unless FileTest.exist?(tmp_path "")
|
279
|
-
if option['pandoc-json-output']
|
280
|
-
cmd_exec pandoc_cmd, ["-o", json_path, "-t", "json"].concat(pandoc_option option).concat(vars_option).concat(@book.src_files.map{ |f| f.full_path }), option
|
305
|
+
def epub_builder(name, &block)
|
306
|
+
call = CallEpubBuilder.new name, self
|
307
|
+
call.instance_eval(&block) if block
|
308
|
+
call.validate
|
309
|
+
@builders << call
|
281
310
|
end
|
282
|
-
cmd_exec pandoc_cmd, ["-o", tex_path, "-t", "latex"].concat(pandoc_option option).concat(vars_option).concat(@book.src_files.map{ |f| f.full_path }), option
|
283
311
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
f = open(tmp_path(@book.name + ".after_body.tex"), "w") do |io|
|
291
|
-
io.puts @urahyoushi.map { |h| h.latex @book, self }.join()
|
292
|
-
end
|
293
|
-
cmd_exec latex_cmd, ["-output-directory=#{tmp_path ""}", tex_path], option
|
294
|
-
cmd_exec latex_cmd, ["-output-directory=#{tmp_path ""}", tex_path], option
|
295
|
-
unless FileTest.exist?(pdf_path) && (File::mtime(dvi_path) <= File::mtime(pdf_path))
|
296
|
-
cmd_exec "cd #{Shellwords.shellescape(tmp_path "")};#{dvipdfm_cmd}", ["-o", pdf_path, dvi_path], option
|
312
|
+
def latex_builder(name, &block)
|
313
|
+
call = CallLatexBuilder.new name, self
|
314
|
+
call.instance_eval(&block) if block
|
315
|
+
call.validate
|
316
|
+
@builders << call
|
297
317
|
end
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
def epub_builder name, &block
|
302
|
-
call = CallEpubBuilder.new name, self
|
303
|
-
if block
|
304
|
-
call.instance_eval &block
|
305
|
-
end
|
306
|
-
call.validate
|
307
|
-
@builders << call
|
308
|
-
end
|
309
|
-
|
310
|
-
def latex_builder name, &block
|
311
|
-
call = CallLatexBuilder.new name, self
|
312
|
-
if block
|
313
|
-
call.instance_eval &block
|
314
|
-
end
|
315
|
-
call.validate
|
316
|
-
@builders << call
|
317
318
|
end
|
318
|
-
end
|
319
319
|
end
|