review 3.2.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|