review 3.2.0 → 4.0.0
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 +26 -4
- data/.travis.yml +1 -1
- data/NEWS.ja.md +97 -1
- data/NEWS.md +97 -1
- data/bin/review-catalog-converter +1 -1
- data/bin/review-check +5 -5
- data/bin/review-checkdep +1 -1
- data/bin/review-compile +5 -5
- data/bin/review-idgxmlmaker +16 -0
- data/bin/review-index +7 -7
- data/bin/review-preproc +9 -9
- data/bin/review-validate +2 -2
- data/bin/review-vol +5 -5
- data/doc/config.yml.sample +14 -6
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +15 -5
- data/doc/format.md +30 -18
- data/doc/pdfmaker.ja.md +1 -1
- data/doc/pdfmaker.md +1 -1
- data/lib/review/book.rb +1 -1
- data/lib/review/book/base.rb +23 -63
- data/lib/review/book/chapter.rb +18 -3
- data/lib/review/book/compilable.rb +5 -0
- data/lib/review/book/index.rb +26 -65
- data/lib/review/book/index/item.rb +40 -0
- data/lib/review/book/part.rb +22 -2
- data/lib/review/builder.rb +60 -40
- data/lib/review/catalog.rb +12 -15
- data/lib/review/compiler.rb +68 -36
- data/lib/review/configure.rb +10 -7
- data/lib/review/epubmaker.rb +5 -2
- data/lib/review/htmlbuilder.rb +24 -71
- data/lib/review/htmlutils.rb +2 -3
- data/lib/review/i18n.rb +2 -2
- data/lib/review/idgxmlbuilder.rb +101 -55
- data/lib/review/idgxmlmaker.rb +184 -0
- data/lib/review/init-web/finish.html +10 -0
- data/lib/review/init-web/index.html +190 -0
- data/lib/review/init-web/review-layout-design.js +691 -0
- data/lib/review/init.rb +110 -26
- data/lib/review/latexbuilder.rb +76 -54
- data/lib/review/lineinput.rb +1 -1
- data/lib/review/logger.rb +4 -8
- data/lib/review/makerhelper.rb +6 -4
- data/lib/review/markdownbuilder.rb +25 -38
- data/lib/review/md2inaobuilder.rb +3 -5
- data/lib/review/pdfmaker.rb +15 -15
- data/lib/review/plaintextbuilder.rb +67 -76
- data/lib/review/preprocessor.rb +13 -13
- data/lib/review/rstbuilder.rb +31 -31
- data/lib/review/textmaker.rb +13 -3
- data/lib/review/textutils.rb +77 -2
- data/lib/review/tocparser.rb +17 -17
- data/lib/review/tocprinter.rb +8 -8
- data/lib/review/topbuilder.rb +76 -57
- data/lib/review/update.rb +16 -16
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +2 -2
- data/lib/review/yamlloader.rb +3 -0
- data/review.gemspec +4 -3
- data/samples/sample-book/README.md +7 -2
- data/samples/sample-book/src/.gitignore +153 -0
- data/samples/sample-book/src/config-jlreq.yml +6 -0
- data/samples/sample-book/src/lib/tasks/review.rake +20 -9
- data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
- data/samples/syntax-book/ch03.re +3 -6
- data/samples/syntax-book/config-jlreq.yml +5 -0
- data/samples/syntax-book/lib/tasks/review.rake +7 -7
- data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
- data/templates/latex/config.erb +6 -0
- data/templates/latex/layout.tex.erb +1 -0
- data/templates/latex/review-jlreq/review-base.sty +93 -31
- data/templates/latex/review-jlreq/review-jlreq.cls +6 -0
- data/templates/latex/review-jlreq/review-style.sty +3 -0
- data/templates/latex/review-jsbook/README.md +39 -0
- data/templates/latex/review-jsbook/review-base.sty +65 -10
- data/templates/latex/review-jsbook/review-jsbook.cls +4 -0
- data/templates/latex/review-jsbook/review-style.sty +4 -1
- data/test/assets/test_template.tex +11 -3
- data/test/assets/test_template_backmatter.tex +11 -3
- data/test/test_book.rb +65 -19
- data/test/test_catalog.rb +18 -42
- data/test/test_catalog_converter_cmd.rb +1 -1
- data/test/test_epubmaker_cmd.rb +2 -2
- data/test/test_helper.rb +1 -1
- data/test/test_htmlbuilder.rb +144 -55
- data/test/test_i18n.rb +25 -25
- data/test/test_idgxmlbuilder.rb +60 -18
- data/test/test_image_finder.rb +6 -6
- data/test/test_latexbuilder.rb +128 -24
- data/test/test_latexbuilder_v2.rb +23 -23
- data/test/test_logger.rb +14 -1
- data/test/test_makerhelper.rb +3 -3
- data/test/test_markdownbuilder.rb +45 -4
- data/test/test_md2inaobuilder.rb +12 -2
- data/test/test_pdfmaker.rb +1 -1
- data/test/test_pdfmaker_cmd.rb +1 -1
- data/test/test_plaintextbuilder.rb +31 -6
- data/test/test_rstbuilder.rb +33 -4
- data/test/test_textutils.rb +109 -2
- data/test/test_topbuilder.rb +35 -7
- data/test/test_update.rb +17 -8
- data/test/test_yamlloader.rb +13 -0
- metadata +26 -2
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Copyright (c) 2019 Kenshi Muto
|
|
2
|
+
#
|
|
3
|
+
# This program is free software.
|
|
4
|
+
# You can distribute or modify this program under the terms of
|
|
5
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
6
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
7
|
+
#
|
|
8
|
+
require 'optparse'
|
|
9
|
+
require 'yaml'
|
|
10
|
+
require 'fileutils'
|
|
11
|
+
|
|
12
|
+
require 'review/converter'
|
|
13
|
+
require 'review/configure'
|
|
14
|
+
require 'review/book'
|
|
15
|
+
require 'review/yamlloader'
|
|
16
|
+
require 'review/idgxmlbuilder'
|
|
17
|
+
require 'review/version'
|
|
18
|
+
|
|
19
|
+
module ReVIEW
|
|
20
|
+
class IDGXMLMaker
|
|
21
|
+
attr_accessor :config, :basedir
|
|
22
|
+
|
|
23
|
+
def initialize
|
|
24
|
+
@basedir = nil
|
|
25
|
+
@logger = ReVIEW.logger
|
|
26
|
+
@plaintext = nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def error(msg)
|
|
30
|
+
@logger.error "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
|
|
31
|
+
exit 1
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def warn(msg)
|
|
35
|
+
@logger.warn "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.execute(*args)
|
|
39
|
+
self.new.execute(*args)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def parse_opts(args)
|
|
43
|
+
cmd_config = {}
|
|
44
|
+
opts = OptionParser.new
|
|
45
|
+
@table = nil
|
|
46
|
+
@filter = nil
|
|
47
|
+
|
|
48
|
+
opts.banner = 'Usage: review-idgxmlmaker [options] configfile'
|
|
49
|
+
opts.version = ReVIEW::VERSION
|
|
50
|
+
opts.on('-w', '--width widthoftypepage', 'Specify the width of type page for layouting tables (mm).') { |v| @table = v }
|
|
51
|
+
opts.on('-f', '--filter filterprogrampath', 'Specify the filter path.') { |v| @filter = v }
|
|
52
|
+
opts.on('--help', 'Prints this message and quit.') do
|
|
53
|
+
puts opts.help
|
|
54
|
+
exit 0
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
opts.parse!(args)
|
|
58
|
+
if args.size != 1
|
|
59
|
+
puts opts.help
|
|
60
|
+
exit 0
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
[cmd_config, args[0]]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def build_path
|
|
67
|
+
"#{@config['bookname']}-idgxml"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def remove_old_files(path)
|
|
71
|
+
FileUtils.rm_rf(path)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def execute(*args)
|
|
75
|
+
@config = ReVIEW::Configure.values
|
|
76
|
+
@config.maker = 'idgxmlmaker'
|
|
77
|
+
cmd_config, yamlfile = parse_opts(args)
|
|
78
|
+
error "#{yamlfile} not found." unless File.exist?(yamlfile)
|
|
79
|
+
|
|
80
|
+
begin
|
|
81
|
+
loader = ReVIEW::YAMLLoader.new
|
|
82
|
+
@config.deep_merge!(loader.load_file(yamlfile))
|
|
83
|
+
rescue => e
|
|
84
|
+
error "yaml error #{e.message}"
|
|
85
|
+
end
|
|
86
|
+
# YAML configs will be overridden by command line options.
|
|
87
|
+
@config.deep_merge!(cmd_config)
|
|
88
|
+
I18n.setup(@config['language'])
|
|
89
|
+
begin
|
|
90
|
+
generate_idgxml_files(yamlfile)
|
|
91
|
+
rescue ApplicationError => e
|
|
92
|
+
raise if @config['debug']
|
|
93
|
+
error(e.message)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def generate_idgxml_files(yamlfile)
|
|
98
|
+
@basedir = File.dirname(yamlfile)
|
|
99
|
+
@path = build_path
|
|
100
|
+
remove_old_files(@path)
|
|
101
|
+
Dir.mkdir(@path)
|
|
102
|
+
|
|
103
|
+
@book = ReVIEW::Book.load(@basedir)
|
|
104
|
+
@book.config = @config
|
|
105
|
+
if @table
|
|
106
|
+
@book.config['tableopt'] = @table
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
build_body(@path, yamlfile)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def apply_filter(xmlfile)
|
|
113
|
+
return unless @filter
|
|
114
|
+
|
|
115
|
+
# pass filename information to filter by environment variable
|
|
116
|
+
ENV['REVIEW_FNAME'] = File.basename(xmlfile).sub(/.xml\Z/, '.re')
|
|
117
|
+
begin
|
|
118
|
+
o, e, s = Open3.capture3(@filter, stdin_data: File.read(xmlfile))
|
|
119
|
+
if s.success?
|
|
120
|
+
File.write(xmlfile, o) # override
|
|
121
|
+
else
|
|
122
|
+
warn("filter error for #{xmlfile}: #{e.message}")
|
|
123
|
+
end
|
|
124
|
+
rescue => e
|
|
125
|
+
warn("filter error for #{xmlfile}: #{e}")
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def build_body(basetmpdir, _yamlfile)
|
|
130
|
+
base_path = Pathname.new(@basedir)
|
|
131
|
+
@converter = ReVIEW::Converter.new(@book, ReVIEW::IDGXMLBuilder.new)
|
|
132
|
+
@book.parts.each do |part|
|
|
133
|
+
if part.name.present?
|
|
134
|
+
if part.file?
|
|
135
|
+
build_chap(part, base_path, basetmpdir, true)
|
|
136
|
+
else
|
|
137
|
+
xmlfile = "part_#{part.number}.xml"
|
|
138
|
+
build_part(part, basetmpdir, xmlfile)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
part.chapters.each { |chap| build_chap(chap, base_path, basetmpdir, false) }
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def build_part(part, basetmpdir, xmlfile)
|
|
147
|
+
File.open(File.join(basetmpdir, xmlfile), 'w') do |f|
|
|
148
|
+
title = ReVIEW::I18n.t('part', part.number)
|
|
149
|
+
if part.name.strip.present?
|
|
150
|
+
title << ReVIEW::I18n.t('chapter_postfix')
|
|
151
|
+
title << part.name.strip
|
|
152
|
+
end
|
|
153
|
+
f.puts '<?xml version="1.0" encoding="UTF-8"?>'
|
|
154
|
+
f.print '<doc xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"><title aid:pstyle="h1">'
|
|
155
|
+
f.print CGI.escapeHTML(title)
|
|
156
|
+
f.print '</title><?dtp level="1" section="'
|
|
157
|
+
f.print CGI.escapeHTML(title)
|
|
158
|
+
f.puts '"?></doc>'
|
|
159
|
+
end
|
|
160
|
+
apply_filter(File.join(basetmpdir, xmlfile))
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def build_chap(chap, base_path, basetmpdir, ispart)
|
|
164
|
+
filename = ''
|
|
165
|
+
|
|
166
|
+
if ispart.present?
|
|
167
|
+
filename = chap.path
|
|
168
|
+
else
|
|
169
|
+
filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
|
|
170
|
+
end
|
|
171
|
+
id = File.basename(filename).sub(/\.re\Z/, '')
|
|
172
|
+
|
|
173
|
+
xmlfile = "#{id}.xml"
|
|
174
|
+
|
|
175
|
+
begin
|
|
176
|
+
@converter.convert(filename, File.join(basetmpdir, xmlfile))
|
|
177
|
+
apply_filter(File.join(basetmpdir, xmlfile))
|
|
178
|
+
rescue => e
|
|
179
|
+
warn "compile error in #{filename} (#{e.class})"
|
|
180
|
+
warn e.message
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ja">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<title>Re:VIEWレイアウトデザイナ</title>
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
|
7
|
+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" />
|
|
8
|
+
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
|
9
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
|
10
|
+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
|
11
|
+
<script src="https://code.createjs.com/1.0.0/easeljs.min.js" charset="UTF-8"></script>
|
|
12
|
+
<script src="review-layout-design.js" charset="UTF-8"></script>
|
|
13
|
+
</head>
|
|
14
|
+
<body onload="init();">
|
|
15
|
+
<div class="container">
|
|
16
|
+
<form method="post" name="reviewform" action="/finish">
|
|
17
|
+
<div class="form-group row">
|
|
18
|
+
<div class="col-auto">
|
|
19
|
+
<label for="cls" data-toggle="tooltip" data-placement="bottom" title="文書基本テンプレート。jsbookはよく使われているクラス。jlreqは紙面をカスタマイズしやすい新しいクラス">クラス</label>
|
|
20
|
+
<select id="cls" name="cls" class="btn btn-outline-dark" onchange="change_cls();">
|
|
21
|
+
<option value="review-jsbook" selected="true">review-jsbook (jsbook派生)</option>
|
|
22
|
+
<option value="review-jlreq">review-jlreq (jlreq派生)</option>
|
|
23
|
+
</select>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="col-auto">
|
|
26
|
+
<label for="papersize" data-toggle="tooltip" data-placement="bottom" title="仕上がりサイズ。他のサイズ指定はsty/README.md参照">紙のサイズ</label>
|
|
27
|
+
<select id="papersize" name="papersize" class="btn btn-outline-dark" onchange="change_paper();">
|
|
28
|
+
<option value="a5" selected="true">A5 (148mm×210mm)</option>
|
|
29
|
+
<option value="b5">B5 (182mm×257mm)</option>
|
|
30
|
+
<option value="a4">A4 (210mm×297mm)</option>
|
|
31
|
+
</select>
|
|
32
|
+
</div>
|
|
33
|
+
<div class="col-auto">
|
|
34
|
+
<input type="button" id="reset" name="reset" class="btn btn-danger" value="初期値に戻す" onclick="reset_all();" data-toggle="tooltip" data-placement="bottom" title="クラスおよび紙に基づく初期値に復帰" />
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<hr />
|
|
38
|
+
|
|
39
|
+
<div class="form-group row">
|
|
40
|
+
<div class="col-auto" style="padding-right: 0;">
|
|
41
|
+
<label for="fontsize" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="基本の文字の大きさ。review-jsbookでは8,9,10,11,12,14,17,20,21,25,30,36,43のみ">文字サイズ</label>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="col-auto">
|
|
44
|
+
<input type="number" id="fontsize" name="fontsize" class="form-control" style="width: 4em;" min="0" max="100" step="any" onchange="change_fontsize();" />
|
|
45
|
+
</div>
|
|
46
|
+
<label for="fontsize" class="col-form-label">pt </label>
|
|
47
|
+
<label for="baselineskip" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="行のベースライン間の幅">行送り</label>
|
|
48
|
+
<div class="col-auto">
|
|
49
|
+
<input type="number" id="baselineskip" name="baselineskip" class="form-control" style="width: 4em;" min="0" max="100" step="any" onchange="change_baselineskip();" />
|
|
50
|
+
</div>
|
|
51
|
+
<label for="baselineskip" class="col-form-label">pt</label>
|
|
52
|
+
<div class="col-auto">
|
|
53
|
+
<label class="col-form-label">(<span id="fontsize_q" data-toggle="tooltip" data-placement="bottom" title="1Q=1H=0.25mm。1pt=0.35146mm(英米ポイント)"></span>)</label>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="form-group row">
|
|
58
|
+
<div class="col-auto">
|
|
59
|
+
<input type="number" id="line_length" name="line_length" class="form-control" min="1" max="400" step="1" style="width: 4em;" onchange="change_line_length();" />
|
|
60
|
+
</div>
|
|
61
|
+
<label for="line_length" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="和文字での1行あたりの文字数">文字 ×</label>
|
|
62
|
+
<div class="col-auto">
|
|
63
|
+
<input type="number" id="number_of_lines" name="number_of_lines" class="form-control" min="1" max="400" step="1" style="width: 4em;" onchange="change_number_of_lines();" />
|
|
64
|
+
</div>
|
|
65
|
+
<label for="number_of_lines" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ページあたりの行の数">行</label>
|
|
66
|
+
<div class="col-auto">
|
|
67
|
+
<label class="col-form-label">(版面 <span id="hanmen" data-toggle="tooltip" data-placement="bottom" title="主となるコンテンツの入る領域。下画面の方眼の箇所"></span>)</label>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<hr/>
|
|
72
|
+
|
|
73
|
+
<div class="form-group row">
|
|
74
|
+
<div class="col-auto" style="padding-right: 0;">
|
|
75
|
+
<label for="gutter" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ページ内側から版面までの余白">ノド</label>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="col-auto">
|
|
78
|
+
<input type="number" id="gutter" name="gutter" class="form-control" style="width: 5em;" min="0" max="1000" step="any" onchange="change_gutter();" />
|
|
79
|
+
</div>
|
|
80
|
+
<label for="gutter" class="col-form-label">mm </label>
|
|
81
|
+
<label for="edge" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ページ外側から版面までの余白。ノドと版面横幅から導出">小口</label>
|
|
82
|
+
<div class="col-auto">
|
|
83
|
+
<input type="number" id="edge" name="edge" class="form-control" style="width: 5em;" min="0" max="1000" step="any" readonly="true" />
|
|
84
|
+
</div>
|
|
85
|
+
<label for="edge" class="col-form-label">mm </label>
|
|
86
|
+
|
|
87
|
+
<label for="head_space" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ページ上側から版面までの余白">天 </label>
|
|
88
|
+
<div class="col-auto">
|
|
89
|
+
<input type="number" id="head_space" name="head_space" class="form-control" style="width: 5em;" min="0" max="1000" step="any" onchange="change_head_space();" />
|
|
90
|
+
</div>
|
|
91
|
+
<label for="head_space" class="col-form-label">mm </label>
|
|
92
|
+
<label for="bottom_space" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ページ下側から版面までの余白。天と版面縦幅から導出">地 </label>
|
|
93
|
+
<div class="col-auto">
|
|
94
|
+
<input type="number" id="bottom_space" name="bottom_space" class="form-control" style="width: 5em;" min="0" max="1000" step="any" readonly="true" />
|
|
95
|
+
</div>
|
|
96
|
+
<label for="bottom_space" class="col-form-label">mm</label>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="form-group row">
|
|
100
|
+
<div class="col-auto" style="padding-right: 0;">
|
|
101
|
+
<label for="headsep" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="ヘッダ領域下部と版面上との間隔">ヘッダ下/本文上間隔</label>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="col-auto">
|
|
104
|
+
<input type="number" id="headsep" name="headsep" class="form-control" style="width: 4em;" min="-1000" max="1000" step="any" onchange="change_headsep();" />
|
|
105
|
+
</div>
|
|
106
|
+
<label for="headsep" class="col-form-label">mm </label>
|
|
107
|
+
<label for="footskip" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="フッタ領域下部と版面下との間隔">本文下/フッタ下間隔</label>
|
|
108
|
+
<div class="col-auto">
|
|
109
|
+
<input type="number" id="footskip" name="footskip" class="form-control" style="width: 4em;" min="-1000" max="1000" step="any" onchange="change_footskip();" />
|
|
110
|
+
</div>
|
|
111
|
+
<label for="footskip" class="col-form-label">mm</label>
|
|
112
|
+
</div>
|
|
113
|
+
<hr/>
|
|
114
|
+
|
|
115
|
+
<div class="form-group row">
|
|
116
|
+
<div class="col-auto">
|
|
117
|
+
<input type="button" id="showdetails" name="showdatails" class="btn btn-secondary" value="詳細設定を表示" onclick="show_details();" data-toggle="tooltip" data-placement="bottom" title="版面設計以外の設定" />
|
|
118
|
+
</div>
|
|
119
|
+
<div class="col-auto">
|
|
120
|
+
<input type="button" id="fordoujin" name="fordoujin" class="btn btn-secondary" value="技術系同人誌印刷の設定" onclick="set_doujin();" data-toggle="tooltip" data-placement="bottom" title="技術系同人誌の印刷所でよく使われる設定をマーク" />
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div id="details">
|
|
125
|
+
<div class="form-group form-check">
|
|
126
|
+
<input type="checkbox" id="ebook" name="ebook" class="form-check-input" checked="true" />
|
|
127
|
+
<label for="ebook" class="form-check-label" data-toggle="tooltip" data-placement="bottom" title="表紙あり・トンボなしの電子配布版のための設定ファイルを準備">電子版の設定ファイル (config-ebook.yml) も作成</label>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<div class="form-group form-check">
|
|
131
|
+
<input type="checkbox" id="openany" name="openany" class="form-check-input" />
|
|
132
|
+
<label for="openany" data-toggle="tooltip" data-placement="bottom" title="標準では章や目次は常に奇数(右)ページ開始">章や目次が左右どちらのページからも始まることを許可する</label>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="form-group form-check">
|
|
135
|
+
<input type="checkbox" id="fleqno" name="fleqno" class="form-check-input" />
|
|
136
|
+
<label for="fleqno" class="form-check-label" data-toggle="tooltip" data-placement="bottom" title="標準では式は左右中央揃え">数式を左寄せにする</label>
|
|
137
|
+
</div>
|
|
138
|
+
<div class="form-group row">
|
|
139
|
+
<div class="col-auto">
|
|
140
|
+
<label for="startpage" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="通常は1(本文から数えたい場合)または3(表紙から数えたい場合)">冒頭ページ番号</label>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="col-auto">
|
|
143
|
+
<input type="number" id="startpage" name="startpage" class="form-control" style="width: 4em;" value="1" min="1" max="999" />
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="form-group form-check">
|
|
147
|
+
<input type="checkbox" id="serial_pagination" name="serial_pagination" class="form-check-input" />
|
|
148
|
+
<label for="serial_pagination" class="form-check-label" data-toggle="tooltip" data-placement="bottom" title="標準では前付け(PREDEF)部分はローマ数字">最初からページ番号にアラビア数字を使う</label>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="form-group form-check">
|
|
151
|
+
<input type="checkbox" id="hiddenfolio" name="hiddenfolio" class="form-check-input" />
|
|
152
|
+
<label for="hiddenfolio" class="form-check-label" data-toggle="tooltip" data-placement="bottom" title="ノドのきわにページ番号を埋め込む。印刷所によっては隠しノンブルは不要">ノドへの隠しノンブルの設置 (日光企画等)</label>
|
|
153
|
+
</div>
|
|
154
|
+
<div class="form-group row">
|
|
155
|
+
<div class="col-auto">
|
|
156
|
+
<label for="tombopaper" class="form-check-label" data-toggle="tooltip" data-placement="bottom" title="「自動」の場合は仕上がりのひとまわり大きな紙が選ばれる">トンボ付きの紙サイズ</label>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="col-auto">
|
|
159
|
+
<select id="tombopaper" name="tombopaper" class="btn btn-outline-dark" onchange="change_tombopaper();">
|
|
160
|
+
<option value="auto">自動</option>
|
|
161
|
+
<option value="b5">B5</option>
|
|
162
|
+
<option value="a4">A4</option>
|
|
163
|
+
<option value="b4">B4</option>
|
|
164
|
+
<option value="a3">A3</option>
|
|
165
|
+
</select>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="form-group row">
|
|
169
|
+
<div class="col-auto">
|
|
170
|
+
<label for="bleed_margin" class="col-form-label" data-toggle="tooltip" data-placement="bottom" title="通常は3。印刷所によって異なることがある">塗り足し幅(mm)</label>
|
|
171
|
+
</div>
|
|
172
|
+
<div class="col-auto">
|
|
173
|
+
<input type="number" id="bleed_margin" name="bleed_margin" style="width: 4em;" value="3" min="1" max="8" class="form-control" />
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<div id="result" style="display: none;">
|
|
179
|
+
print: <input type="text" id="result_print" name="result_print" value="" size="80" /><br/>
|
|
180
|
+
ebook: <input type="text" id="result_ebook" name="result_ebook" value="" size="80" />
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<hr/>
|
|
184
|
+
<input type="button" class="btn btn-success" value="作成" onclick="update_result();" data-toggle="tooltip" data-placement="bottom" title="入力に基づいて設定ファイルを作成"/>
|
|
185
|
+
</form>
|
|
186
|
+
<hr/>
|
|
187
|
+
<canvas id="mainCanvas"></canvas>
|
|
188
|
+
</div>
|
|
189
|
+
</body>
|
|
190
|
+
</html>
|
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
/*
|
|
2
|
+
# Copyright (c) 2019 Kenshi Muto
|
|
3
|
+
#
|
|
4
|
+
# This program is free software.
|
|
5
|
+
# You can distribute or modify this program under the terms of
|
|
6
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
7
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// パラメータオブジェクト
|
|
11
|
+
var p = new Object;
|
|
12
|
+
|
|
13
|
+
// 初期実行
|
|
14
|
+
function init() {
|
|
15
|
+
$('[data-toggle="tooltip"]').tooltip();
|
|
16
|
+
document.getElementById("details").style.display = "none";
|
|
17
|
+
p.cls = "review-jsbook";
|
|
18
|
+
p.scale = 1;
|
|
19
|
+
update_paper_info("a5");
|
|
20
|
+
|
|
21
|
+
reset_all();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// パラメータ初期化
|
|
25
|
+
function init_val() {
|
|
26
|
+
p.textwidth = p.o_textwidth;
|
|
27
|
+
p.textheight = p.o_textheight;
|
|
28
|
+
p.head_space = p.o_head_space;
|
|
29
|
+
p.topmargin = p.o_topmargin;
|
|
30
|
+
p.headheight = p.o_headheight;
|
|
31
|
+
p.headsep = p.o_headsep;
|
|
32
|
+
p.footskip = p.o_footskip;
|
|
33
|
+
p.footheight = p.headheight; // もう存在しないものだけど高さは必要
|
|
34
|
+
p.oddsidemargin = p.o_oddsidemargin;
|
|
35
|
+
p.evensidemargin = p.o_evensidemargin;
|
|
36
|
+
p.gutter = p.o_gutter;
|
|
37
|
+
|
|
38
|
+
p.fontsize = p.o_fontsize;
|
|
39
|
+
p.baselineskip = p.o_baselineskip;
|
|
40
|
+
|
|
41
|
+
p.line_length = null;
|
|
42
|
+
p.number_of_lines = null;
|
|
43
|
+
|
|
44
|
+
p.edge = p.paperwidth - p.textwidth - p.gutter;
|
|
45
|
+
p.bottom_space = p.paperheight - p.textheight - p.head_space;
|
|
46
|
+
|
|
47
|
+
p.ebookyaml = true;
|
|
48
|
+
|
|
49
|
+
update_fontsize();
|
|
50
|
+
write_values();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// クラス変更
|
|
54
|
+
function change_cls() {
|
|
55
|
+
var v = document.getElementById("cls").value;
|
|
56
|
+
if (v == "review-jsbook" || v == "review-jlreq") {
|
|
57
|
+
p.cls = v;
|
|
58
|
+
change_paper();
|
|
59
|
+
init_val();
|
|
60
|
+
base_draw();
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 初期化
|
|
66
|
+
function reset_all() {
|
|
67
|
+
init_val();
|
|
68
|
+
base_draw();
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 詳細表示切り替え
|
|
73
|
+
function show_details() {
|
|
74
|
+
if (document.getElementById("details").style.display == "none") {
|
|
75
|
+
document.getElementById("details").style.display = "block";
|
|
76
|
+
document.getElementById("showdetails").value = "詳細設定を隠す";
|
|
77
|
+
|
|
78
|
+
} else {
|
|
79
|
+
document.getElementById("details").style.display = "none";
|
|
80
|
+
document.getElementById("showdetails").value = "詳細設定を表示";
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 同人誌基本設定
|
|
86
|
+
function set_doujin() {
|
|
87
|
+
if (document.getElementById("details").style.display == "none") {
|
|
88
|
+
show_details();
|
|
89
|
+
}
|
|
90
|
+
document.getElementById("ebook").checked = true;
|
|
91
|
+
document.getElementById("serial_pagination").checked = true;
|
|
92
|
+
document.getElementById("hiddenfolio").checked = true;
|
|
93
|
+
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 文字サイズ変更
|
|
98
|
+
function change_fontsize() {
|
|
99
|
+
var v = Number(document.getElementById("fontsize").value);
|
|
100
|
+
if (v == NaN || v < 0.1 || v >= 100) {
|
|
101
|
+
write_values();
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (v > p.baselineskip) {
|
|
105
|
+
var baselineskip = dp2(v * ((p.cls == "review-jlreq") ? 1.7 : 1.6));
|
|
106
|
+
p.baselineskip = baselineskip;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (p.cls == "review-jsbook") {
|
|
110
|
+
var v2 = round_fontsize_jsbook(v);
|
|
111
|
+
if (v != v2) {
|
|
112
|
+
// alert(v + " は、jsbook で許容するpt値 " + v2 + " に丸められます");
|
|
113
|
+
v = v2;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
p.fontsize = v;
|
|
118
|
+
update_fontsize();
|
|
119
|
+
write_values();
|
|
120
|
+
base_draw();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// jsbookのQ数丸め
|
|
125
|
+
function round_fontsize_jsbook(v) {
|
|
126
|
+
if (v < 8.5) {
|
|
127
|
+
return 8;
|
|
128
|
+
} else if (v < 9.5) {
|
|
129
|
+
return 9;
|
|
130
|
+
} else if (v < 10.5) {
|
|
131
|
+
return 10;
|
|
132
|
+
} else if (v < 11.5) {
|
|
133
|
+
return 11;
|
|
134
|
+
} else if (v < 12.5) {
|
|
135
|
+
return 12;
|
|
136
|
+
} else if (v < 15.5) {
|
|
137
|
+
return 14;
|
|
138
|
+
} else if (v < 18.5) {
|
|
139
|
+
return 17;
|
|
140
|
+
} else if (v < 20.5) {
|
|
141
|
+
return 20;
|
|
142
|
+
} else if (v < 23.5) {
|
|
143
|
+
return 21;
|
|
144
|
+
} else if (v < 27.5) {
|
|
145
|
+
return 25;
|
|
146
|
+
} else if (v < 33) {
|
|
147
|
+
return 30;
|
|
148
|
+
} else if (v < 39.5) {
|
|
149
|
+
return 36;
|
|
150
|
+
} else {
|
|
151
|
+
return 43;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 行送りの変更
|
|
156
|
+
function change_baselineskip() {
|
|
157
|
+
var v = Number(document.getElementById("baselineskip").value);
|
|
158
|
+
if (v == NaN || v < p.fontsize || v >= 100) {
|
|
159
|
+
write_values();
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
p.baselineskip = v;
|
|
163
|
+
update_fontsize();
|
|
164
|
+
write_values();
|
|
165
|
+
base_draw();
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// 文字数の変更
|
|
170
|
+
function change_line_length() {
|
|
171
|
+
var v = Number(document.getElementById("line_length").value);
|
|
172
|
+
if (v == NaN || v < 1 || v >= 400) {
|
|
173
|
+
write_values();
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
p.line_length = Math.floor(v);
|
|
177
|
+
update_wl();
|
|
178
|
+
// 小口を変える
|
|
179
|
+
update_sidemargin();
|
|
180
|
+
write_values();
|
|
181
|
+
base_draw();
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 行数の変更
|
|
186
|
+
function change_number_of_lines() {
|
|
187
|
+
var v = Number(document.getElementById("number_of_lines").value);
|
|
188
|
+
if (v == NaN || v < 1 || v >= 400) {
|
|
189
|
+
write_values();
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
p.number_of_lines = Math.floor(v);
|
|
194
|
+
update_wl();
|
|
195
|
+
// 地を変える
|
|
196
|
+
write_values();
|
|
197
|
+
base_draw();
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ノドの変更
|
|
202
|
+
function change_gutter() {
|
|
203
|
+
var v = Number(document.getElementById("gutter").value);
|
|
204
|
+
if (v == NaN) {
|
|
205
|
+
write_values();
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
v = mmtopt(v);
|
|
210
|
+
var edge = p.paperwidth - v - p.textwidth;
|
|
211
|
+
if (v < 0 || v > mmtopt(p.paperwidth) || edge < 0) {
|
|
212
|
+
write_values(); // はみだし
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
p.gutter = v;
|
|
217
|
+
p.edge = edge;
|
|
218
|
+
update_sidemargin();
|
|
219
|
+
write_values();
|
|
220
|
+
base_draw();
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// 天変更
|
|
225
|
+
function change_head_space() {
|
|
226
|
+
var v = Number(document.getElementById("head_space").value);
|
|
227
|
+
if (v == NaN) {
|
|
228
|
+
write_values();
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
v = mmtopt(v);
|
|
233
|
+
var bottom_space = p.paperheight - v - p.textheight;
|
|
234
|
+
if (v < 0 || v > mmtopt(p.paperheight) || bottom_space < 0) {
|
|
235
|
+
write_values();
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
p.head_space = v;
|
|
240
|
+
p.bottom_space = bottom_space;
|
|
241
|
+
update_head();
|
|
242
|
+
write_values();
|
|
243
|
+
base_draw();
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ヘッダ下/本文上アキ変更
|
|
248
|
+
function change_headsep() {
|
|
249
|
+
var v = Number(document.getElementById("headsep").value);
|
|
250
|
+
if (v == NaN) {
|
|
251
|
+
write_values();
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
v = mmtopt(v);
|
|
256
|
+
if (v < -1 * mmtopt(p.paperheight) || v > p.head_space) {
|
|
257
|
+
write_values();
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
p.headsep = v;
|
|
262
|
+
update_head();
|
|
263
|
+
base_draw();
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// 本文下/フッタ下変更
|
|
268
|
+
function change_footskip() {
|
|
269
|
+
var v = Number(document.getElementById("footskip").value);
|
|
270
|
+
if (v == NaN) {
|
|
271
|
+
write_values();
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
v = mmtopt(v);
|
|
276
|
+
if (v < 0 || v > p.edge) {
|
|
277
|
+
write_values();
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
p.footskip = v;
|
|
282
|
+
base_draw();
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// 紙変更
|
|
287
|
+
function change_paper() {
|
|
288
|
+
var paper = document.getElementById("papersize").value;
|
|
289
|
+
update_paper_info(paper);
|
|
290
|
+
p.textwidth = p.o_textwidth;
|
|
291
|
+
p.textheight = p.o_textheight;
|
|
292
|
+
p.topmargin = p.o_topmargin;
|
|
293
|
+
p.head_space = p.o_head_space;
|
|
294
|
+
p.gutter = p.o_gutter;
|
|
295
|
+
|
|
296
|
+
update_fontsize();
|
|
297
|
+
p.edge = p.paperwidth - p.textwidth - p.gutter;
|
|
298
|
+
update_sidemargin();
|
|
299
|
+
p.bottom_space = p.paperheight - p.head_space - p.textheight;
|
|
300
|
+
write_values();
|
|
301
|
+
change_tombopaper();
|
|
302
|
+
base_draw();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// トンボ紙変更
|
|
306
|
+
function change_tombopaper() {
|
|
307
|
+
var f = document.getElementById("tombopaper");
|
|
308
|
+
var papersize = document.getElementById("papersize").value;
|
|
309
|
+
if (f.value != "auto") {
|
|
310
|
+
if (papersize == "b5" && f.value == "b5") {
|
|
311
|
+
f.value = "auto";
|
|
312
|
+
} else if (papersize == "a4" && (f.value == "b5" || f.value == "a4")) {
|
|
313
|
+
f.value = "auto";
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// フォームへの値書き込み
|
|
320
|
+
function write_values() {
|
|
321
|
+
document.getElementById("fontsize").value = p.fontsize;
|
|
322
|
+
document.getElementById("baselineskip").value = p.baselineskip;
|
|
323
|
+
document.getElementById("line_length").value = p.line_length;
|
|
324
|
+
document.getElementById("number_of_lines").value = p.number_of_lines;
|
|
325
|
+
document.getElementById("gutter").value = pttomm(p.gutter);
|
|
326
|
+
document.getElementById("edge").value = pttomm(p.edge);
|
|
327
|
+
document.getElementById("head_space").value = pttomm(p.head_space);
|
|
328
|
+
document.getElementById("bottom_space").value = pttomm(p.bottom_space);
|
|
329
|
+
document.getElementById("headsep").value = pttomm(p.headsep);
|
|
330
|
+
document.getElementById("footskip").value = pttomm(p.footskip);
|
|
331
|
+
update_qh();
|
|
332
|
+
update_hanmen();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// 紙情報の初期情報
|
|
336
|
+
function update_paper_info(paper) {
|
|
337
|
+
switch(p.cls + "-" + paper) {
|
|
338
|
+
case "review-jsbook-a5":
|
|
339
|
+
p.o_fontsize = 10;
|
|
340
|
+
p.o_baselineskip = 16;
|
|
341
|
+
p.papersize = "a5";
|
|
342
|
+
p.paperwidth = mmtopt(148);
|
|
343
|
+
p.paperheight = mmtopt(210);
|
|
344
|
+
p.o_textwidth = 314.39209;
|
|
345
|
+
p.o_textheight = 460.86066;
|
|
346
|
+
p.o_headsep = 14.31091;
|
|
347
|
+
p.o_headheight = 20.0;
|
|
348
|
+
p.o_topmargin = -16.10184;
|
|
349
|
+
p.o_oddsidemargin = -18.91565;
|
|
350
|
+
p.o_evensidemargin = -18.91565;
|
|
351
|
+
p.o_footskip = 0;
|
|
352
|
+
break;
|
|
353
|
+
|
|
354
|
+
case "review-jlreq-a5":
|
|
355
|
+
p.o_fontsize = 10;
|
|
356
|
+
p.o_baselineskip = 17;
|
|
357
|
+
p.papersize = "a5";
|
|
358
|
+
p.paperwidth = mmtopt(148);
|
|
359
|
+
p.paperheight = mmtopt(210);
|
|
360
|
+
p.o_textwidth = 310.0;
|
|
361
|
+
p.o_textheight = 435.0;
|
|
362
|
+
p.o_headsep = 18.79999;
|
|
363
|
+
p.o_headheight = 10.0;
|
|
364
|
+
p.o_topmargin = -21.01604;
|
|
365
|
+
p.o_oddsidemargin = -16.7196;
|
|
366
|
+
p.o_evensidemargin = -16.7196;
|
|
367
|
+
p.o_footskip = 30;
|
|
368
|
+
break;
|
|
369
|
+
|
|
370
|
+
case "review-jsbook-b5":
|
|
371
|
+
p.o_fontsize = 10;
|
|
372
|
+
p.o_baselineskip = 16;
|
|
373
|
+
p.papersize = "b5";
|
|
374
|
+
p.paperwidth = mmtopt(182);
|
|
375
|
+
p.paperheight = mmtopt(257);
|
|
376
|
+
p.o_textwidth = 369.87305;
|
|
377
|
+
p.o_textheight = 572.86066;
|
|
378
|
+
p.o_headsep = 14.31091;
|
|
379
|
+
p.o_headheight = 20.0;
|
|
380
|
+
p.o_topmargin = -5.23787;
|
|
381
|
+
p.o_oddsidemargin = -16.78009;
|
|
382
|
+
p.o_evensidemargin = 20.20721;
|
|
383
|
+
p.o_footskip = 0;
|
|
384
|
+
break;
|
|
385
|
+
|
|
386
|
+
case "review-jlreq-b5":
|
|
387
|
+
p.o_fontsize = 10;
|
|
388
|
+
p.o_baselineskip = 17;
|
|
389
|
+
p.papersize = "b5";
|
|
390
|
+
p.paperwidth = mmtopt(182);
|
|
391
|
+
p.paperheight = mmtopt(257);
|
|
392
|
+
p.o_textwidth = 380.0;
|
|
393
|
+
p.o_textheight = 537.0;
|
|
394
|
+
p.o_headsep = 18.79999;
|
|
395
|
+
p.o_headheight = 10.0;
|
|
396
|
+
p.o_topmargin = -5.15207;
|
|
397
|
+
p.o_oddsidemargin = -3.34991;
|
|
398
|
+
p.o_evensidemargin = -3.34991;
|
|
399
|
+
p.o_footskip = 30;
|
|
400
|
+
break;
|
|
401
|
+
|
|
402
|
+
case "review-jsbook-a4":
|
|
403
|
+
p.o_fontsize = 10;
|
|
404
|
+
p.o_baselineskip = 16;
|
|
405
|
+
p.papersize = "a4";
|
|
406
|
+
p.paperwidth = mmtopt(210);
|
|
407
|
+
p.paperheight = mmtopt(297);
|
|
408
|
+
p.o_textwidth = 369.87305;
|
|
409
|
+
p.o_textheight = 572.86066;
|
|
410
|
+
p.o_headsep = 14.31091;
|
|
411
|
+
p.o_headheight = 20.0;
|
|
412
|
+
p.o_topmargin = -5.23787;
|
|
413
|
+
p.o_oddsidemargin = -18.55695;
|
|
414
|
+
p.o_evensidemargin = 101.6518;
|
|
415
|
+
p.o_footskip = 0;
|
|
416
|
+
break;
|
|
417
|
+
|
|
418
|
+
case "review-jlreq-a4":
|
|
419
|
+
p.o_fontsize = 10;
|
|
420
|
+
p.o_baselineskip = 17;
|
|
421
|
+
p.papersize = "a4";
|
|
422
|
+
p.paperwidth = mmtopt(210);
|
|
423
|
+
p.paperheight = mmtopt(297);
|
|
424
|
+
p.o_textwidth = 440.0;
|
|
425
|
+
p.o_textheight = 622.0;
|
|
426
|
+
p.o_headsep = 18.79999;
|
|
427
|
+
p.o_headheight = 10.0;
|
|
428
|
+
p.o_topmargin = 9.25345;
|
|
429
|
+
p.o_oddsidemargin = 6.48395;
|
|
430
|
+
p.o_evensidemargin = 6.48395;
|
|
431
|
+
p.o_footskip = 30;
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
p.o_head_space = inchpt() + p.o_topmargin + p.o_headheight + p.o_headsep;
|
|
436
|
+
p.o_gutter = inchpt() + p.o_oddsidemargin;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// 文字サイズに伴う行・列更新
|
|
440
|
+
function update_fontsize() {
|
|
441
|
+
p.jfontsize = p.fontsize;
|
|
442
|
+
if (p.cls == "review-jsbook") p.jfontsize = p.fontsize * 0.9246895759999999; // http://akahana-1.hatenablog.jp/entry/2017/12/06/234615
|
|
443
|
+
|
|
444
|
+
p.line_length = Math.floor(nearlyRound(p.textwidth / p.jfontsize)); // .99→繰り上げにする
|
|
445
|
+
p.number_of_lines = Math.floor(nearlyRound((p.textheight + p.headsep) / p.baselineskip));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// 小口、地の追従更新
|
|
449
|
+
function update_wl() {
|
|
450
|
+
p.textwidth = p.jfontsize * p.line_length;
|
|
451
|
+
p.textheight = p.baselineskip * p.number_of_lines;
|
|
452
|
+
p.edge = p.paperwidth - p.textwidth - p.gutter;
|
|
453
|
+
p.bottom_space = p.paperheight - p.textheight - p.head_space;
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// 文字サイズのQ/H表示
|
|
458
|
+
function update_qh() {
|
|
459
|
+
document.getElementById("fontsize_q").innerText = dp2(pttoq(p.fontsize)) + "Q, " + dp2(pttoq(p.baselineskip)) + "H";
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// 版面表示
|
|
463
|
+
function update_hanmen() {
|
|
464
|
+
document.getElementById("hanmen").innerText = dp2(pttomm(p.textwidth)) + "mm×" + dp2(pttomm(p.textheight)) + "mm";
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// oddside,evensideを変える
|
|
468
|
+
function update_sidemargin() {
|
|
469
|
+
p.oddsidemargin = p.gutter - inchpt();
|
|
470
|
+
p.evensidemargin = p.paperwidth - 2 * inchpt() - p.oddsidemargin - p.textwidth;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// topmarginを変える
|
|
474
|
+
function update_head() {
|
|
475
|
+
p.topmargin = p.head_space - inchpt() - p.headheight - p.headsep;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// 描画
|
|
479
|
+
function base_draw() {
|
|
480
|
+
canvas = document.getElementById("mainCanvas");
|
|
481
|
+
stage = new createjs.Stage(canvas);
|
|
482
|
+
stage.scaleX = p.scale;
|
|
483
|
+
stage.scaleY = p.scale;
|
|
484
|
+
|
|
485
|
+
canvas.width = p.paperwidth * 2 + 10;
|
|
486
|
+
canvas.height = p.paperheight + 10;
|
|
487
|
+
|
|
488
|
+
p.paper_left = new createjs.Shape();
|
|
489
|
+
p.paper_left.graphics.beginStroke("black").beginFill("#fffff0").drawRect(0, 0, p.paperwidth, p.paperheight);
|
|
490
|
+
stage.addChild(p.paper_left);
|
|
491
|
+
p.paper_right = new createjs.Shape();
|
|
492
|
+
p.paper_right.graphics.beginStroke("black").beginFill("#fffff0").drawRect(p.paperwidth, 0, p.paperwidth, p.paperheight);
|
|
493
|
+
stage.addChild(p.paper_right);
|
|
494
|
+
|
|
495
|
+
p.paper_left_text = new createjs.Text("左ページ(偶数)", "sans serif", "black");
|
|
496
|
+
p.paper_left_text.x = 10;
|
|
497
|
+
p.paper_left_text.y = 10;
|
|
498
|
+
p.paper_left_text.textAlign = "left";
|
|
499
|
+
p.paper_left_text.textBaseline = "top";
|
|
500
|
+
stage.addChild(p.paper_left_text);
|
|
501
|
+
p.paper_right_text = new createjs.Text("右ページ(奇数)", "sans serif", "black");
|
|
502
|
+
p.paper_right_text.x = p.paperwidth * 2 - 10;
|
|
503
|
+
p.paper_right_text.y = 10;
|
|
504
|
+
p.paper_right_text.textAlign = "right";
|
|
505
|
+
p.paper_right_text.textBaseline = "top";
|
|
506
|
+
stage.addChild(p.paper_right_text);
|
|
507
|
+
|
|
508
|
+
// ヘッダ領域
|
|
509
|
+
p.head_left = new createjs.Container();
|
|
510
|
+
p.head_left.x = inchpt() + p.evensidemargin;
|
|
511
|
+
p.head_left.y = inchpt() + p.topmargin;
|
|
512
|
+
stage.addChild(p.head_left);
|
|
513
|
+
|
|
514
|
+
p.head_left_box = new createjs.Shape();
|
|
515
|
+
p.head_left_box.alpha = 0.8;
|
|
516
|
+
p.head_left_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.headheight);
|
|
517
|
+
p.head_left.addChild(p.head_left_box);
|
|
518
|
+
p.head_left_text = new createjs.Text("ヘッダ領域", "sans serif", "black");
|
|
519
|
+
p.head_left_text.x = p.textwidth / 2;
|
|
520
|
+
p.head_left_text.y = p.headheight / 2;
|
|
521
|
+
p.head_left_text.textAlign = "center";
|
|
522
|
+
p.head_left_text.textBaseline = "middle";
|
|
523
|
+
p.head_left.addChild(p.head_left_text);
|
|
524
|
+
|
|
525
|
+
p.head_right = new createjs.Container();
|
|
526
|
+
p.head_right.x = p.paperwidth + inchpt() + p.oddsidemargin;
|
|
527
|
+
p.head_right.y = inchpt() + p.topmargin;
|
|
528
|
+
stage.addChild(p.head_right);
|
|
529
|
+
|
|
530
|
+
p.head_right_box = new createjs.Shape();
|
|
531
|
+
p.head_right_box.alpha = 0.8;
|
|
532
|
+
p.head_right_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.headheight);
|
|
533
|
+
p.head_right.addChild(p.head_right_box);
|
|
534
|
+
p.head_right_text = new createjs.Text("ヘッダ領域", "sans serif", "black");
|
|
535
|
+
p.head_right_text.x = p.textwidth / 2;
|
|
536
|
+
p.head_right_text.y = p.headheight / 2;
|
|
537
|
+
p.head_right_text.textAlign = "center";
|
|
538
|
+
p.head_right_text.textBaseline = "middle";
|
|
539
|
+
p.head_right.addChild(p.head_right_text);
|
|
540
|
+
|
|
541
|
+
// 本文
|
|
542
|
+
var border_col = "black";
|
|
543
|
+
var border_width = 1;
|
|
544
|
+
if ((p.textwidth + p.gutter) > p.paperwidth || (p.textheight + p.head_space) > p.paperheight) {
|
|
545
|
+
border_col = "red";
|
|
546
|
+
border_width = 2;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
p.body_left = new createjs.Container();
|
|
550
|
+
p.body_left.x = inchpt() + p.evensidemargin;
|
|
551
|
+
p.body_left.y = inchpt() + p.topmargin + p.headheight + p.headsep;
|
|
552
|
+
stage.addChild(p.body_left);
|
|
553
|
+
|
|
554
|
+
p.body_left_box = new createjs.Shape();
|
|
555
|
+
p.body_left_box.alpha = 0.8;
|
|
556
|
+
p.body_left_box.graphics.beginStroke(border_col).setStrokeStyle(border_width).beginFill("#e0ffe0").drawRect(0, 0, p.textwidth, p.textheight);
|
|
557
|
+
p.body_left.addChild(p.body_left_box);
|
|
558
|
+
makelines(p.body_left);
|
|
559
|
+
|
|
560
|
+
p.body_right = new createjs.Container();
|
|
561
|
+
p.body_right.x = p.paperwidth + inchpt() + p.oddsidemargin;
|
|
562
|
+
p.body_right.y = inchpt() + p.topmargin + p.headheight + p.headsep;
|
|
563
|
+
stage.addChild(p.body_right);
|
|
564
|
+
|
|
565
|
+
p.body_right_box = new createjs.Shape();
|
|
566
|
+
p.body_right_box.alpha = 0.8;
|
|
567
|
+
p.body_right_box.graphics.beginStroke(border_col).setStrokeStyle(border_width).beginFill("#e0ffe0").drawRect(0, 0, p.textwidth, p.textheight);
|
|
568
|
+
p.body_right.addChild(p.body_right_box);
|
|
569
|
+
makelines(p.body_right);
|
|
570
|
+
|
|
571
|
+
// フッタ
|
|
572
|
+
p.foot_left = new createjs.Container();
|
|
573
|
+
p.foot_left.x = inchpt() + p.evensidemargin;
|
|
574
|
+
p.foot_left.y = inchpt() + p.topmargin + p.headheight + p.headsep + p.textheight + p.footskip - p.footheight;
|
|
575
|
+
stage.addChild(p.foot_left);
|
|
576
|
+
|
|
577
|
+
p.foot_left_box = new createjs.Shape();
|
|
578
|
+
p.foot_left_box.alpha = 0.5;
|
|
579
|
+
p.foot_left_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.footheight);
|
|
580
|
+
p.foot_left.addChild(p.foot_left_box);
|
|
581
|
+
p.foot_left_text = new createjs.Text("フッタ領域", "sans serif", "black");
|
|
582
|
+
p.foot_left_text.x = p.textwidth / 2;
|
|
583
|
+
p.foot_left_text.y = p.footheight / 2;
|
|
584
|
+
p.foot_left_text.textAlign = "center";
|
|
585
|
+
p.foot_left_text.textBaseline = "middle";
|
|
586
|
+
p.foot_left.addChild(p.foot_left_text);
|
|
587
|
+
|
|
588
|
+
p.foot_right = new createjs.Container();
|
|
589
|
+
p.foot_right.x = p.paperwidth + inchpt() + p.oddsidemargin;
|
|
590
|
+
p.foot_right.y = inchpt() + p.topmargin + p.headheight + p.headsep + p.textheight + p.footskip - p.footheight;
|
|
591
|
+
stage.addChild(p.foot_right);
|
|
592
|
+
|
|
593
|
+
p.foot_right_box = new createjs.Shape();
|
|
594
|
+
p.foot_right_box.alpha = 0.5;
|
|
595
|
+
p.foot_right_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.footheight);
|
|
596
|
+
p.foot_right.addChild(p.foot_right_box);
|
|
597
|
+
p.foot_right_text = new createjs.Text("フッタ領域", "sans serif", "black");
|
|
598
|
+
p.foot_right_text.x = p.textwidth / 2;
|
|
599
|
+
p.foot_right_text.y = p.footheight / 2;
|
|
600
|
+
p.foot_right_text.textAlign = "center";
|
|
601
|
+
p.foot_right_text.textBaseline = "middle";
|
|
602
|
+
p.foot_right.addChild(p.foot_right_text);
|
|
603
|
+
|
|
604
|
+
stage.update();
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// 行文字配置
|
|
608
|
+
function makelines(container) {
|
|
609
|
+
for (var y = 0; y < p.number_of_lines; y++) {
|
|
610
|
+
for (var x = 0; x < p.line_length; x++) {
|
|
611
|
+
var ch = new createjs.Shape();
|
|
612
|
+
ch.alpha = 0.2;
|
|
613
|
+
var fcolor = "#ffffff";
|
|
614
|
+
if ((x + 1) % 10 == 0) fcolor = "#000000";
|
|
615
|
+
ch.graphics.beginStroke("#0000ff").beginFill(fcolor).drawRect(x * p.jfontsize, y * p.baselineskip, p.jfontsize - 1, p.jfontsize - 1);
|
|
616
|
+
container.addChild(ch);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
var s = new createjs.Text("本文領域:" + p.line_length + "文字×" + p.number_of_lines + "行", "sans serif", "black");
|
|
620
|
+
s.x = p.textwidth / 2;
|
|
621
|
+
s.y = p.textheight / 2;
|
|
622
|
+
s.textAlign = "center";
|
|
623
|
+
s.textBaseline = "middle";
|
|
624
|
+
container.addChild(s);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// texdocumentclass出力
|
|
628
|
+
function update_result() {
|
|
629
|
+
var ra = ["media=print"];
|
|
630
|
+
ra.push("paper=" + document.getElementById("papersize").value);
|
|
631
|
+
if (p.fontsize != p.o_fontsize) ra.push("fontsize=" + p.fontsize + "pt");
|
|
632
|
+
if (p.baselineskip != p.o_baselineskip) ra.push("baselineskip=" + p.baselineskip + "pt");
|
|
633
|
+
ra.push("line_length=" + p.line_length + "zw");
|
|
634
|
+
ra.push("number_of_lines=" + p.number_of_lines);
|
|
635
|
+
if (p.head_space != p.o_head_space) ra.push("head_space=" + dp2(pttomm(p.head_space)) + "mm");
|
|
636
|
+
if (p.gutter != p.o_gutter) ra.push("gutter=" + dp2(pttomm(p.gutter)) + "mm");
|
|
637
|
+
if (p.headsep != p.o_headsep) ra.push("headheight=" + dp2(pttomm(p.headheight)) + "mm");
|
|
638
|
+
if (p.headsep != p.o_headsep) ra.push("headsep=" + dp2(pttomm(p.headsep)) + "mm");
|
|
639
|
+
if (p.footskip != p.o_footskip) ra.push("footskip=" + dp2(pttomm(p.footskip)) + "mm");
|
|
640
|
+
if (document.getElementById("openany").checked) ra.push("openany");
|
|
641
|
+
if (document.getElementById("fleqno").checked) ra.push("fleqno");
|
|
642
|
+
if (document.getElementById("startpage").value != "1") ra.push("startpage=" + document.getElementById("startpage").value);
|
|
643
|
+
if (document.getElementById("serial_pagination").checked) ra.push("serial_pagination=true");
|
|
644
|
+
if (document.getElementById("hiddenfolio").checked) ra.push("hiddenfolio=nikko-pc");
|
|
645
|
+
if (document.getElementById("tombopaper").value != "auto") ra.push("tombopaper=" + document.getElementById("tombopaper").value);
|
|
646
|
+
if (document.getElementById("bleed_margin").value != "3") ra.push("bleed_margin=" + document.getElementById("bleed_margin").value + "mm");
|
|
647
|
+
var result = ra.join(",");
|
|
648
|
+
document.getElementById("result_print").value = result;
|
|
649
|
+
if (document.getElementById("ebook").checked) {
|
|
650
|
+
document.getElementById("result_ebook").value = result.replace("media=print", "media=ebook");
|
|
651
|
+
} else {
|
|
652
|
+
document.getElementById("result_ebook").value = "";
|
|
653
|
+
}
|
|
654
|
+
document.reviewform.submit();
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// インチ→pt
|
|
658
|
+
function inchpt() {
|
|
659
|
+
return 72.2712035135135;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// mm→pt
|
|
663
|
+
function mmtopt(mm) {
|
|
664
|
+
return mm * 2.8453229729729728;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// Q→pt
|
|
668
|
+
function qtopt(q) {
|
|
669
|
+
return q * 0.25 * 2.8453229729729728;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// pt→mm
|
|
673
|
+
function pttomm(pt) {
|
|
674
|
+
return pt * 0.3514598096921122;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// pt→Q
|
|
678
|
+
function pttoq(pt) {
|
|
679
|
+
return pt * 0.3514598096921122 * 4;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// 99→1、.98→0にする
|
|
683
|
+
function nearlyRound(n) {
|
|
684
|
+
var r = (((n + 0.01) * 10) >> 0) / 10;
|
|
685
|
+
return (r > n) ? r : n;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// 小数点2桁化
|
|
689
|
+
function dp2(v) {
|
|
690
|
+
return Math.round(v * 100) / 100;
|
|
691
|
+
}
|