xpub 0.0.1
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 +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +161 -0
- data/Rakefile +2 -0
- data/bin/xpub +74 -0
- data/lib/xpub.rb +5 -0
- data/lib/xpub/dsl/book.rb +261 -0
- data/lib/xpub/dsl/builder.rb +370 -0
- data/lib/xpub/dsl/page.rb +159 -0
- data/lib/xpub/dsl/src_file.rb +139 -0
- data/lib/xpub/version.rb +3 -0
- data/skel/.gitignore +2 -0
- data/skel/Xpub +68 -0
- data/skel/output/.gitkeep +0 -0
- data/skel/src/.gitkeep +0 -0
- data/skel/src/sample.md +47 -0
- data/skel/src/sample1.jpg +0 -0
- data/skel/theme/default/epub/epub.css +204 -0
- data/skel/theme/default/epub/metadata.dat.erb +43 -0
- data/skel/theme/default/epub/pandoc-filter.rb +206 -0
- data/skel/theme/default/epub/template.html +57 -0
- data/skel/theme/default/latex/pandoc-filter.rb +269 -0
- data/skel/theme/default/latex/template.tex +376 -0
- data/skel/tmp/.gitkeep +0 -0
- data/xpub.gemspec +25 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5c84badd5401427653a180811baaa090496227d5
|
4
|
+
data.tar.gz: 052e466221750865095a8e09961aa93a925a46df
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a254fa14825cd92a0852893951428e1a89c3848134baaca5ec9ce64d25706a71c2e1e006d0b4f75263597ac0973ef82308dfeb51678fd46c628f19f6eb1c6ec9
|
7
|
+
data.tar.gz: dd6b91f65f41b3f0ce57d85a90ecb1800644de9e235a8f48f9f43ce0bc5f8560d67979ab750df105fc4e0165b1d41eb51c5b5aecb49400a1fb9143b367bbce93
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Yoshihisa AMAKATA
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
# Xpub
|
2
|
+
|
3
|
+
Markdownから、PDFやEPUBを生成するためのフレームワークのプロトタイプです。
|
4
|
+
|
5
|
+
Ruby DSLによって1ファイルで生成のためのルールを設定できるようにし、
|
6
|
+
PDFやEPUB3の生成を自動化します。
|
7
|
+
|
8
|
+
このプロトタイプの目的は
|
9
|
+
|
10
|
+
* 多様化する出力フォーマットを1ソースで生成できるようにする場合のシンプルで、柔軟な定義方法の検証
|
11
|
+
|
12
|
+
です。
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
動作確認はMacでしています。それ以外の環境については把握していませんがおそらくLinuxでも利用できると思います。
|
17
|
+
|
18
|
+
```
|
19
|
+
$ gem install xpub
|
20
|
+
```
|
21
|
+
|
22
|
+
でインストールします。
|
23
|
+
|
24
|
+
このツールを使うには他にPandocとLatexが必要です。
|
25
|
+
|
26
|
+
|
27
|
+
### TeX Live
|
28
|
+
|
29
|
+
#### MacTex.pkgをダウンロードしてインストール
|
30
|
+
|
31
|
+
http://tug.org/mactex/
|
32
|
+
|
33
|
+
参考) http://tandoori.hatenablog.com/entry/20130802/1375451791
|
34
|
+
|
35
|
+
#### TeX Live Utility.appを起動して、アップデート
|
36
|
+
|
37
|
+
```
|
38
|
+
Yosemiteを使う場合は、まずTeX Live Utilityを更新すること、メニューの「TeX Liveユーティリティ > 更新があるか確認」で更新すること。
|
39
|
+
そうしないとうまくTeXをアップデートできない
|
40
|
+
```
|
41
|
+
|
42
|
+
または
|
43
|
+
|
44
|
+
```
|
45
|
+
$ sudo tlmgr update --self --all
|
46
|
+
```
|
47
|
+
|
48
|
+
でもよいかも。
|
49
|
+
|
50
|
+
インストールディレクトリは
|
51
|
+
|
52
|
+
* 基本インストール
|
53
|
+
/usr/local/texlive/2014
|
54
|
+
* TEXMFLOCAL
|
55
|
+
/usr/local/texlive/texmf-local
|
56
|
+
* TEXMFHOME
|
57
|
+
~/Library/texmf
|
58
|
+
|
59
|
+
になるらしい。
|
60
|
+
|
61
|
+
```
|
62
|
+
$ kpsewhich -var-value TEXMF
|
63
|
+
```
|
64
|
+
で検索の優先順位がわかるらしい。
|
65
|
+
|
66
|
+
|
67
|
+
### pandoc 1.13.2
|
68
|
+
|
69
|
+
https://github.com/jgm/pandoc/releases
|
70
|
+
|
71
|
+
からダウンロードしてインストールしたり、 brew等でインストールしてください。
|
72
|
+
|
73
|
+
```
|
74
|
+
$ brew install pandoc
|
75
|
+
```
|
76
|
+
|
77
|
+
## Usage
|
78
|
+
|
79
|
+
## 初期化
|
80
|
+
|
81
|
+
```
|
82
|
+
$ mkdir project
|
83
|
+
$ cd project
|
84
|
+
$ xpub init
|
85
|
+
```
|
86
|
+
|
87
|
+
上記コマンドを実行することで、Xpubファイル、サンプルデータ、デフォルトテーマや各種からディレクトリをスケルトンを元に作成します。
|
88
|
+
|
89
|
+
## ビルド
|
90
|
+
|
91
|
+
```
|
92
|
+
$ xpub build
|
93
|
+
```
|
94
|
+
|
95
|
+
カレントディレクトリのXpub設定ファイルを元にビルドします。
|
96
|
+
|
97
|
+
```
|
98
|
+
$ xpub book --book=sample
|
99
|
+
```
|
100
|
+
|
101
|
+
Xpub設定ファイルのbook sampleのみビルドします。
|
102
|
+
|
103
|
+
```
|
104
|
+
$ xpub book --builder=epub
|
105
|
+
```
|
106
|
+
|
107
|
+
Xpub設定ファイルのbuilder epubのみビルドします。
|
108
|
+
|
109
|
+
```
|
110
|
+
$ xpub book -v
|
111
|
+
```
|
112
|
+
|
113
|
+
コマンドラインの実行結果を結果にかかわらず詳細に出力します。
|
114
|
+
|
115
|
+
```
|
116
|
+
$ xpub book --pandoc-json-output
|
117
|
+
```
|
118
|
+
|
119
|
+
pandocのjsonオブジェクトをtmpフォルダに生成します。デバック用です。
|
120
|
+
|
121
|
+
|
122
|
+
## クリア
|
123
|
+
|
124
|
+
```
|
125
|
+
$ xpub clean
|
126
|
+
```
|
127
|
+
|
128
|
+
カレントディレクトリのtmpディレクトリ、outputディレクトリをクリアします。
|
129
|
+
|
130
|
+
|
131
|
+
# メモ
|
132
|
+
|
133
|
+
## MacでのTeXのフォントの設定メモ
|
134
|
+
|
135
|
+
### 游明朝体・游ゴシック体
|
136
|
+
|
137
|
+
```
|
138
|
+
$ sudo mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/yu-osx
|
139
|
+
$ cd /usr/local/texlive/texmf-local/fonts/opentype/yu-osx
|
140
|
+
$ sudo ln -fs "/Library/Fonts/Yu Gothic Bold.otf" YuGo-Bold.otf
|
141
|
+
$ sudo ln -fs "/Library/Fonts/Yu Gothic Medium.otf" YuGo-Medium.otf
|
142
|
+
$ sudo ln -fs "/Library/Fonts/Yu Mincho Demibold.otf" YuMin-Demibold.otf
|
143
|
+
$ sudo ln -fs "/Library/Fonts/Yu Mincho Medium.otf" YuMin-Medium.otf
|
144
|
+
$ sudo mktexlsr
|
145
|
+
$ sudo updmap-sys --setoption kanjiEmbed yu-osx
|
146
|
+
```
|
147
|
+
|
148
|
+
### ヒラギノフォント
|
149
|
+
|
150
|
+
```
|
151
|
+
$ sudo mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/hiragino/
|
152
|
+
$ cd /usr/local/texlive/texmf-local/fonts/opentype/hiragino/
|
153
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ明朝 Pro W3.otf" ./HiraMinPro-W3.otf
|
154
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ明朝 Pro W6.otf" ./HiraMinPro-W6.otf
|
155
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ丸ゴ Pro W4.otf" ./HiraMaruPro-W4.otf
|
156
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Pro W3.otf" ./HiraKakuPro-W3.otf
|
157
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Pro W6.otf" ./HiraKakuPro-W6.otf
|
158
|
+
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Std W8.otf" ./HiraKakuStd-W8.otf
|
159
|
+
$ sudo mktexlsr
|
160
|
+
$ sudo updmap-sys --setoption kanjiEmbed hiragino
|
161
|
+
```
|
data/Rakefile
ADDED
data/bin/xpub
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
|
5
|
+
require 'rainbow/ext/string'
|
6
|
+
require "open3"
|
7
|
+
require 'optparse'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'pathname'
|
10
|
+
require 'shellwords'
|
11
|
+
require 'erb'
|
12
|
+
require 'time'
|
13
|
+
|
14
|
+
require 'xpub/version.rb'
|
15
|
+
|
16
|
+
option={}
|
17
|
+
opt = OptionParser.new do |opt|
|
18
|
+
opt.version = Xpub::VERSION
|
19
|
+
opt.summary_indent = ' ' * 4
|
20
|
+
opt.banner = 'Usage: xpub [cmd] [options]'
|
21
|
+
opt.on_head('[cmd]',
|
22
|
+
' init Xpubファイルの生成',
|
23
|
+
' build ビルド',
|
24
|
+
' clean テンポラリフォルダと出力フォルダをクリア')
|
25
|
+
opt.on('-v', '出力を詳細にする') { |v| option[:v] = v }
|
26
|
+
opt.on('--book=VALUE', 'ビルドするbookを指定する') { |v| option[:book] = v }
|
27
|
+
opt.on('--builder=VALUE', 'ビルドするbuilderを指定する') { |v| option[:builder] = v }
|
28
|
+
opt.on('--pandoc-json-output', 'ビルド時にpandocのjsonを出力') { |v| option['pandoc-json-output'] = v }
|
29
|
+
opt.permute!(ARGV)
|
30
|
+
end
|
31
|
+
|
32
|
+
curDir = Dir::getwd
|
33
|
+
|
34
|
+
unless File.file?("#{curDir}/Xpub") || ARGV[0] == "init"
|
35
|
+
puts "File does not exist. #{curDir}/Xpub".color :red
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
|
39
|
+
$:.unshift "#{curDir}/lib"
|
40
|
+
$:.unshift File.dirname(__FILE__) + "/../lib"
|
41
|
+
|
42
|
+
require "xpub/dsl/book"
|
43
|
+
require "xpub/dsl/src_file"
|
44
|
+
require "xpub/dsl/builder"
|
45
|
+
require "xpub/dsl/page"
|
46
|
+
|
47
|
+
if File.file?("#{curDir}/Xpub") && ARGV[0] != "init"
|
48
|
+
load "#{curDir}/Xpub"
|
49
|
+
end
|
50
|
+
|
51
|
+
if ARGV.length != 1
|
52
|
+
puts opt.help
|
53
|
+
exit
|
54
|
+
elsif ARGV[0] == "build"
|
55
|
+
puts "build...".color :green
|
56
|
+
Xpub::BookManager.instance.build option
|
57
|
+
elsif ARGV[0] == "clean"
|
58
|
+
puts "clean...".color :green
|
59
|
+
FileUtils.remove_entry_secure("#{curDir}/tmp")
|
60
|
+
Dir::mkdir("#{curDir}/tmp")
|
61
|
+
FileUtils.remove_entry_secure("#{curDir}/output")
|
62
|
+
Dir::mkdir("#{curDir}/output")
|
63
|
+
elsif ARGV[0] == "init"
|
64
|
+
if File.file?("#{curDir}/Xpub")
|
65
|
+
puts "File exist. #{curDir}/Xpub".color :red
|
66
|
+
exit
|
67
|
+
end
|
68
|
+
puts "init...".color :green
|
69
|
+
FileUtils.cp_r(Dir.glob(File.dirname(__FILE__) + "/../skel/*"),"./")
|
70
|
+
else
|
71
|
+
puts opt.help
|
72
|
+
exit
|
73
|
+
end
|
74
|
+
|
data/lib/xpub.rb
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Xpub
|
4
|
+
class CallBook
|
5
|
+
attr_reader :name, :src_files, :resource_files, :creators, :contributors, :identifiers
|
6
|
+
|
7
|
+
def initialize name
|
8
|
+
@name = name
|
9
|
+
@title = "UNTITLED"
|
10
|
+
@subtitle = nil
|
11
|
+
@short = nil
|
12
|
+
@collection = nil
|
13
|
+
@edition = nil
|
14
|
+
@extended = nil
|
15
|
+
@publisher = nil
|
16
|
+
@rights = nil
|
17
|
+
@publication = nil
|
18
|
+
@modification = nil
|
19
|
+
@lang = "ja"
|
20
|
+
@creators = []
|
21
|
+
@contributors = []
|
22
|
+
@identifiers = []
|
23
|
+
@description = nil
|
24
|
+
|
25
|
+
@src_files = []
|
26
|
+
@resource_files = []
|
27
|
+
@builders = []
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def validate
|
32
|
+
end
|
33
|
+
|
34
|
+
def _set_or_get values
|
35
|
+
# 引数が 2 つ以上ならエラー
|
36
|
+
raise ArgumentError, "wrong number of arguments (#{ values.length} for 0..1)" if values.length > 1
|
37
|
+
values.empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
def title *values
|
41
|
+
if _set_or_get values
|
42
|
+
@title
|
43
|
+
else
|
44
|
+
@title = values[0]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def subtitle *values
|
49
|
+
if _set_or_get values
|
50
|
+
@subtitle
|
51
|
+
else
|
52
|
+
@subtitle = values[0]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def short *values
|
57
|
+
if _set_or_get values
|
58
|
+
@short
|
59
|
+
else
|
60
|
+
@short = values[0]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def collection *values
|
65
|
+
if _set_or_get values
|
66
|
+
@collection
|
67
|
+
else
|
68
|
+
@collection = values[0]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def edition *values
|
73
|
+
if _set_or_get values
|
74
|
+
@edition
|
75
|
+
else
|
76
|
+
@edition = values[0]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def extended *values
|
81
|
+
if _set_or_get values
|
82
|
+
@extended
|
83
|
+
else
|
84
|
+
@extended = values[0]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def publisher *values
|
89
|
+
if _set_or_get values
|
90
|
+
@publisher
|
91
|
+
else
|
92
|
+
@publisher = values[0]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def rights *values
|
97
|
+
if _set_or_get values
|
98
|
+
@rights
|
99
|
+
else
|
100
|
+
@rights = values[0]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def publication *values
|
105
|
+
if _set_or_get values
|
106
|
+
@publication
|
107
|
+
else
|
108
|
+
@publication = values[0]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def modification *values
|
113
|
+
if _set_or_get values
|
114
|
+
@modification
|
115
|
+
else
|
116
|
+
@modification = values[0]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def lang *values
|
121
|
+
if _set_or_get values
|
122
|
+
@lang
|
123
|
+
else
|
124
|
+
@lang = values[0]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def description *values
|
129
|
+
if _set_or_get values
|
130
|
+
@description
|
131
|
+
else
|
132
|
+
@description = values[0]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def build option
|
137
|
+
puts "build #{@name} book.".color :green
|
138
|
+
@builders.each { |b|
|
139
|
+
if !option[:builder] || option[:builder] == b.name
|
140
|
+
b.build option
|
141
|
+
end
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
class CallAuthor
|
146
|
+
attr_reader :name
|
147
|
+
|
148
|
+
def initialize name
|
149
|
+
@name = name
|
150
|
+
@role = nil
|
151
|
+
end
|
152
|
+
|
153
|
+
def validate
|
154
|
+
end
|
155
|
+
|
156
|
+
def _set_or_get values
|
157
|
+
# 引数が 2 つ以上ならエラー
|
158
|
+
raise ArgumentError, "wrong number of arguments (#{ values.length} for 0..1)" if values.length > 1
|
159
|
+
values.empty?
|
160
|
+
end
|
161
|
+
|
162
|
+
def role *values
|
163
|
+
if _set_or_get values
|
164
|
+
@role
|
165
|
+
else
|
166
|
+
@role = values[0]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def creator name, &block
|
172
|
+
call = CallAuthor.new name
|
173
|
+
if block
|
174
|
+
call.instance_eval &block
|
175
|
+
end
|
176
|
+
call.validate
|
177
|
+
@creators << call
|
178
|
+
end
|
179
|
+
|
180
|
+
def contributor name, &block
|
181
|
+
call = CallAuthor.new name
|
182
|
+
if block
|
183
|
+
call.instance_eval &block
|
184
|
+
end
|
185
|
+
call.validate
|
186
|
+
@contributors << call
|
187
|
+
end
|
188
|
+
|
189
|
+
class CallIdentifier
|
190
|
+
attr_reader :identifier
|
191
|
+
|
192
|
+
def initialize identifier
|
193
|
+
@identifier = identifier
|
194
|
+
@scheme = nil
|
195
|
+
@type_value = nil
|
196
|
+
end
|
197
|
+
|
198
|
+
def validate
|
199
|
+
end
|
200
|
+
|
201
|
+
def _set_or_get values
|
202
|
+
# 引数が 2 つ以上ならエラー
|
203
|
+
raise ArgumentError, "wrong number of arguments (#{ values.length} for 0..1)" if values.length > 1
|
204
|
+
values.empty?
|
205
|
+
end
|
206
|
+
|
207
|
+
def scheme *values
|
208
|
+
if _set_or_get values
|
209
|
+
@scheme
|
210
|
+
else
|
211
|
+
@scheme = values[0]
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
def type_value *values
|
216
|
+
if _set_or_get values
|
217
|
+
@type_value
|
218
|
+
else
|
219
|
+
@type_value = values[0]
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def identifier identifier, &block
|
225
|
+
call = CallIdentifier.new identifier
|
226
|
+
if block
|
227
|
+
call.instance_eval &block
|
228
|
+
end
|
229
|
+
call.validate
|
230
|
+
@identifiers << call
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def self.book name, &block
|
235
|
+
call = CallBook.new name
|
236
|
+
if block
|
237
|
+
call.instance_eval &block
|
238
|
+
end
|
239
|
+
call.validate
|
240
|
+
BookManager.instance.add call
|
241
|
+
end
|
242
|
+
|
243
|
+
class BookManager
|
244
|
+
include Singleton
|
245
|
+
def initialize
|
246
|
+
@books = []
|
247
|
+
end
|
248
|
+
|
249
|
+
def add c
|
250
|
+
@books << c
|
251
|
+
end
|
252
|
+
|
253
|
+
def build option
|
254
|
+
@books.each { |book|
|
255
|
+
if !option[:book] || option[:book] == book.name
|
256
|
+
book.build option
|
257
|
+
end
|
258
|
+
}
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|