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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -4
  3. data/.travis.yml +1 -1
  4. data/NEWS.ja.md +97 -1
  5. data/NEWS.md +97 -1
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +5 -5
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +5 -5
  10. data/bin/review-idgxmlmaker +16 -0
  11. data/bin/review-index +7 -7
  12. data/bin/review-preproc +9 -9
  13. data/bin/review-validate +2 -2
  14. data/bin/review-vol +5 -5
  15. data/doc/config.yml.sample +14 -6
  16. data/doc/config.yml.sample-simple +1 -1
  17. data/doc/format.ja.md +15 -5
  18. data/doc/format.md +30 -18
  19. data/doc/pdfmaker.ja.md +1 -1
  20. data/doc/pdfmaker.md +1 -1
  21. data/lib/review/book.rb +1 -1
  22. data/lib/review/book/base.rb +23 -63
  23. data/lib/review/book/chapter.rb +18 -3
  24. data/lib/review/book/compilable.rb +5 -0
  25. data/lib/review/book/index.rb +26 -65
  26. data/lib/review/book/index/item.rb +40 -0
  27. data/lib/review/book/part.rb +22 -2
  28. data/lib/review/builder.rb +60 -40
  29. data/lib/review/catalog.rb +12 -15
  30. data/lib/review/compiler.rb +68 -36
  31. data/lib/review/configure.rb +10 -7
  32. data/lib/review/epubmaker.rb +5 -2
  33. data/lib/review/htmlbuilder.rb +24 -71
  34. data/lib/review/htmlutils.rb +2 -3
  35. data/lib/review/i18n.rb +2 -2
  36. data/lib/review/idgxmlbuilder.rb +101 -55
  37. data/lib/review/idgxmlmaker.rb +184 -0
  38. data/lib/review/init-web/finish.html +10 -0
  39. data/lib/review/init-web/index.html +190 -0
  40. data/lib/review/init-web/review-layout-design.js +691 -0
  41. data/lib/review/init.rb +110 -26
  42. data/lib/review/latexbuilder.rb +76 -54
  43. data/lib/review/lineinput.rb +1 -1
  44. data/lib/review/logger.rb +4 -8
  45. data/lib/review/makerhelper.rb +6 -4
  46. data/lib/review/markdownbuilder.rb +25 -38
  47. data/lib/review/md2inaobuilder.rb +3 -5
  48. data/lib/review/pdfmaker.rb +15 -15
  49. data/lib/review/plaintextbuilder.rb +67 -76
  50. data/lib/review/preprocessor.rb +13 -13
  51. data/lib/review/rstbuilder.rb +31 -31
  52. data/lib/review/textmaker.rb +13 -3
  53. data/lib/review/textutils.rb +77 -2
  54. data/lib/review/tocparser.rb +17 -17
  55. data/lib/review/tocprinter.rb +8 -8
  56. data/lib/review/topbuilder.rb +76 -57
  57. data/lib/review/update.rb +16 -16
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/webmaker.rb +2 -2
  60. data/lib/review/yamlloader.rb +3 -0
  61. data/review.gemspec +4 -3
  62. data/samples/sample-book/README.md +7 -2
  63. data/samples/sample-book/src/.gitignore +153 -0
  64. data/samples/sample-book/src/config-jlreq.yml +6 -0
  65. data/samples/sample-book/src/lib/tasks/review.rake +20 -9
  66. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  67. data/samples/syntax-book/ch03.re +3 -6
  68. data/samples/syntax-book/config-jlreq.yml +5 -0
  69. data/samples/syntax-book/lib/tasks/review.rake +7 -7
  70. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  71. data/templates/latex/config.erb +6 -0
  72. data/templates/latex/layout.tex.erb +1 -0
  73. data/templates/latex/review-jlreq/review-base.sty +93 -31
  74. data/templates/latex/review-jlreq/review-jlreq.cls +6 -0
  75. data/templates/latex/review-jlreq/review-style.sty +3 -0
  76. data/templates/latex/review-jsbook/README.md +39 -0
  77. data/templates/latex/review-jsbook/review-base.sty +65 -10
  78. data/templates/latex/review-jsbook/review-jsbook.cls +4 -0
  79. data/templates/latex/review-jsbook/review-style.sty +4 -1
  80. data/test/assets/test_template.tex +11 -3
  81. data/test/assets/test_template_backmatter.tex +11 -3
  82. data/test/test_book.rb +65 -19
  83. data/test/test_catalog.rb +18 -42
  84. data/test/test_catalog_converter_cmd.rb +1 -1
  85. data/test/test_epubmaker_cmd.rb +2 -2
  86. data/test/test_helper.rb +1 -1
  87. data/test/test_htmlbuilder.rb +144 -55
  88. data/test/test_i18n.rb +25 -25
  89. data/test/test_idgxmlbuilder.rb +60 -18
  90. data/test/test_image_finder.rb +6 -6
  91. data/test/test_latexbuilder.rb +128 -24
  92. data/test/test_latexbuilder_v2.rb +23 -23
  93. data/test/test_logger.rb +14 -1
  94. data/test/test_makerhelper.rb +3 -3
  95. data/test/test_markdownbuilder.rb +45 -4
  96. data/test/test_md2inaobuilder.rb +12 -2
  97. data/test/test_pdfmaker.rb +1 -1
  98. data/test/test_pdfmaker_cmd.rb +1 -1
  99. data/test/test_plaintextbuilder.rb +31 -6
  100. data/test/test_rstbuilder.rb +33 -4
  101. data/test/test_textutils.rb +109 -2
  102. data/test/test_topbuilder.rb +35 -7
  103. data/test/test_update.rb +17 -8
  104. data/test/test_yamlloader.rb +13 -0
  105. 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,10 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="UTF-8" />
4
+ <title>Re:VIEWレイアウトデザイナ</title>
5
+ </head>
6
+ <body>
7
+ <p>プロジェクトフォルダを作成しました。このウィンドウを閉じてください。</p>
8
+ </body>
9
+ </html>
10
+
@@ -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
+ }