/* # Copyright © 2019 Kenshi Muto # # This program is free software. # You can distribute or modify this program under the terms of # the GNU LGPL, Lesser General Public License version 2.1. # For details of the GNU LGPL, see the file “COPYING”. */
// パラメータオブジェクトvar p = new Object
;
// 初期実行function init() {
$('[data-toggle="tooltip"]').tooltip(); document.getElementById("details").style.display = "none"; p.cls = "review-jsbook"; p.scale = 1; update_paper_info("a5"); reset_all();
}
// パラメータ初期化function init_val() {
p.textwidth = p.o_textwidth; p.textheight = p.o_textheight; p.head_space = p.o_head_space; p.topmargin = p.o_topmargin; p.headheight = p.o_headheight; p.headsep = p.o_headsep; p.footskip = p.o_footskip; p.footheight = p.headheight; // もう存在しないものだけど高さは必要 p.oddsidemargin = p.o_oddsidemargin; p.evensidemargin = p.o_evensidemargin; p.gutter = p.o_gutter; p.fontsize = p.o_fontsize; p.baselineskip = p.o_baselineskip; p.line_length = null; p.number_of_lines = null; p.edge = p.paperwidth - p.textwidth - p.gutter; p.bottom_space = p.paperheight - p.textheight - p.head_space; p.ebookyaml = true; update_fontsize(); write_values();
}
// クラス変更function change_cls() {
var v = document.getElementById("cls").value; if (v == "review-jsbook" || v == "review-jlreq") { p.cls = v; change_paper(); init_val(); base_draw(); } return true;
}
// 初期化function reset_all() {
init_val(); base_draw(); return true;
}
// 詳細表示切り替えfunction show_details() {
if (document.getElementById("details").style.display == "none") { document.getElementById("details").style.display = "block"; document.getElementById("showdetails").value = "詳細設定を隠す"; } else { document.getElementById("details").style.display = "none"; document.getElementById("showdetails").value = "詳細設定を表示"; } return true;
}
// 同人誌基本設定function set_doujin() {
if (document.getElementById("details").style.display == "none") { show_details(); } document.getElementById("ebook").checked = true; document.getElementById("serial_pagination").checked = true; document.getElementById("hiddenfolio").checked = true; return true;
}
// 文字サイズ変更function change_fontsize() {
var v = Number(document.getElementById("fontsize").value); if (v == NaN || v < 0.1 || v >= 100) { write_values(); return true; } if (v > p.baselineskip) { var baselineskip = dp2(v * ((p.cls == "review-jlreq") ? 1.7 : 1.6)); p.baselineskip = baselineskip; } if (p.cls == "review-jsbook") { var v2 = round_fontsize_jsbook(v); if (v != v2) { // alert(v + " は、jsbook で許容するpt値 " + v2 + " に丸められます"); v = v2; } } p.fontsize = v; update_fontsize(); write_values(); base_draw(); return true;
}
// jsbookのQ数丸めfunction round_fontsize_jsbook(v) {
if (v < 8.5) { return 8; } else if (v < 9.5) { return 9; } else if (v < 10.5) { return 10; } else if (v < 11.5) { return 11; } else if (v < 12.5) { return 12; } else if (v < 15.5) { return 14; } else if (v < 18.5) { return 17; } else if (v < 20.5) { return 20; } else if (v < 23.5) { return 21; } else if (v < 27.5) { return 25; } else if (v < 33) { return 30; } else if (v < 39.5) { return 36; } else { return 43; }
}
// 行送りの変更function change_baselineskip() {
var v = Number(document.getElementById("baselineskip").value); if (v == NaN || v < p.fontsize || v >= 100) { write_values(); return true; } p.baselineskip = v; update_fontsize(); write_values(); base_draw(); return true;
}
// 文字数の変更function change_line_length() {
var v = Number(document.getElementById("line_length").value); if (v == NaN || v < 1 || v >= 400) { write_values(); return true; } p.line_length = Math.floor(v); update_wl(); // 小口を変える update_sidemargin(); write_values(); base_draw(); return true;
}
// 行数の変更function change_number_of_lines() {
var v = Number(document.getElementById("number_of_lines").value); if (v == NaN || v < 1 || v >= 400) { write_values(); return true; } p.number_of_lines = Math.floor(v); update_wl(); // 地を変える write_values(); base_draw(); return true;
}
// ノドの変更function change_gutter() {
var v = Number(document.getElementById("gutter").value); if (v == NaN) { write_values(); return true; } v = mmtopt(v); var edge = p.paperwidth - v - p.textwidth; if (v < 0 || v > mmtopt(p.paperwidth) || edge < 0) { write_values(); // はみだし return true; } p.gutter = v; p.edge = edge; update_sidemargin(); write_values(); base_draw(); return true;
}
// 天変更function change_head_space() {
var v = Number(document.getElementById("head_space").value); if (v == NaN) { write_values(); return true; } v = mmtopt(v); var bottom_space = p.paperheight - v - p.textheight; if (v < 0 || v > mmtopt(p.paperheight) || bottom_space < 0) { write_values(); return true; } p.head_space = v; p.bottom_space = bottom_space; update_head(); write_values(); base_draw(); return true;
}
// ヘッダ下/本文上アキ変更function change_headsep() {
var v = Number(document.getElementById("headsep").value); if (v == NaN) { write_values(); return true; } v = mmtopt(v); if (v < -1 * mmtopt(p.paperheight) || v > p.head_space) { write_values(); return true; } p.headsep = v; update_head(); base_draw(); return true;
}
// 本文下/フッタ下変更function change_footskip() {
var v = Number(document.getElementById("footskip").value); if (v == NaN) { write_values(); return true; } v = mmtopt(v); if (v < 0 || v > p.edge) { write_values(); return true; } p.footskip = v; base_draw(); return true;
}
// 紙変更function change_paper() {
var paper = document.getElementById("papersize").value; update_paper_info(paper); p.textwidth = p.o_textwidth; p.textheight = p.o_textheight; p.topmargin = p.o_topmargin; p.head_space = p.o_head_space; p.gutter = p.o_gutter; update_fontsize(); p.edge = p.paperwidth - p.textwidth - p.gutter; update_sidemargin(); p.bottom_space = p.paperheight - p.head_space - p.textheight; write_values(); change_tombopaper(); base_draw();
}
// トンボ紙変更function change_tombopaper() {
var f = document.getElementById("tombopaper"); var papersize = document.getElementById("papersize").value; if (f.value != "auto") { if (papersize == "b5" && f.value == "b5") { f.value = "auto"; } else if (papersize == "a4" && (f.value == "b5" || f.value == "a4")) { f.value = "auto"; } } return true;
}
// フォームへの値書き込みfunction write_values() {
document.getElementById("fontsize").value = p.fontsize; document.getElementById("baselineskip").value = p.baselineskip; document.getElementById("line_length").value = p.line_length; document.getElementById("number_of_lines").value = p.number_of_lines; document.getElementById("gutter").value = pttomm(p.gutter); document.getElementById("edge").value = pttomm(p.edge); document.getElementById("head_space").value = pttomm(p.head_space); document.getElementById("bottom_space").value = pttomm(p.bottom_space); document.getElementById("headsep").value = pttomm(p.headsep); document.getElementById("footskip").value = pttomm(p.footskip); update_qh(); update_hanmen();
}
// 紙情報の初期情報function update_paper_info(paper) {
switch(p.cls + "-" + paper) { case "review-jsbook-a5": p.o_fontsize = 10; p.o_baselineskip = 16; p.papersize = "a5"; p.paperwidth = mmtopt(148); p.paperheight = mmtopt(210); p.o_textwidth = 314.39209; p.o_textheight = 460.86066; p.o_headsep = 14.31091; p.o_headheight = 20.0; p.o_topmargin = -16.10184; p.o_oddsidemargin = -18.91565; p.o_evensidemargin = -18.91565; p.o_footskip = 0; break; case "review-jlreq-a5": p.o_fontsize = 10; p.o_baselineskip = 17; p.papersize = "a5"; p.paperwidth = mmtopt(148); p.paperheight = mmtopt(210); p.o_textwidth = 310.0; p.o_textheight = 435.0; p.o_headsep = 18.79999; p.o_headheight = 10.0; p.o_topmargin = -21.01604; p.o_oddsidemargin = -16.7196; p.o_evensidemargin = -16.7196; p.o_footskip = 30; break; case "review-jsbook-b5": p.o_fontsize = 10; p.o_baselineskip = 16; p.papersize = "b5"; p.paperwidth = mmtopt(182); p.paperheight = mmtopt(257); p.o_textwidth = 369.87305; p.o_textheight = 572.86066; p.o_headsep = 14.31091; p.o_headheight = 20.0; p.o_topmargin = -5.23787; p.o_oddsidemargin = -16.78009; p.o_evensidemargin = 20.20721; p.o_footskip = 0; break; case "review-jlreq-b5": p.o_fontsize = 10; p.o_baselineskip = 17; p.papersize = "b5"; p.paperwidth = mmtopt(182); p.paperheight = mmtopt(257); p.o_textwidth = 380.0; p.o_textheight = 537.0; p.o_headsep = 18.79999; p.o_headheight = 10.0; p.o_topmargin = -5.15207; p.o_oddsidemargin = -3.34991; p.o_evensidemargin = -3.34991; p.o_footskip = 30; break; case "review-jsbook-a4": p.o_fontsize = 10; p.o_baselineskip = 16; p.papersize = "a4"; p.paperwidth = mmtopt(210); p.paperheight = mmtopt(297); p.o_textwidth = 369.87305; p.o_textheight = 572.86066; p.o_headsep = 14.31091; p.o_headheight = 20.0; p.o_topmargin = -5.23787; p.o_oddsidemargin = -18.55695; p.o_evensidemargin = 101.6518; p.o_footskip = 0; break; case "review-jlreq-a4": p.o_fontsize = 10; p.o_baselineskip = 17; p.papersize = "a4"; p.paperwidth = mmtopt(210); p.paperheight = mmtopt(297); p.o_textwidth = 440.0; p.o_textheight = 622.0; p.o_headsep = 18.79999; p.o_headheight = 10.0; p.o_topmargin = 9.25345; p.o_oddsidemargin = 6.48395; p.o_evensidemargin = 6.48395; p.o_footskip = 30; break; } p.o_head_space = inchpt() + p.o_topmargin + p.o_headheight + p.o_headsep; p.o_gutter = inchpt() + p.o_oddsidemargin;
}
// 文字サイズに伴う行・列更新function update_fontsize() {
p.jfontsize = p.fontsize; if (p.cls == "review-jsbook") p.jfontsize = p.fontsize * 0.9246895759999999; // http://akahana-1.hatenablog.jp/entry/2017/12/06/234615 p.line_length = Math.floor(nearlyRound(p.textwidth / p.jfontsize)); // .99→繰り上げにする p.number_of_lines = Math.floor(nearlyRound((p.textheight + p.headsep) / p.baselineskip));
}
// 小口、地の追従更新function update_wl() {
p.textwidth = p.jfontsize * p.line_length; p.textheight = p.baselineskip * p.number_of_lines; p.edge = p.paperwidth - p.textwidth - p.gutter; p.bottom_space = p.paperheight - p.textheight - p.head_space; return true;
}
// 文字サイズのQ/H表示function update_qh() {
document.getElementById("fontsize_q").innerText = dp2(pttoq(p.fontsize)) + "Q, " + dp2(pttoq(p.baselineskip)) + "H";
}
// 版面表示function update_hanmen() {
document.getElementById("hanmen").innerText = dp2(pttomm(p.textwidth)) + "mm×" + dp2(pttomm(p.textheight)) + "mm";
}
// oddside,evensideを変えるfunction update_sidemargin() {
p.oddsidemargin = p.gutter - inchpt(); p.evensidemargin = p.paperwidth - 2 * inchpt() - p.oddsidemargin - p.textwidth;
}
// topmarginを変えるfunction update_head() {
p.topmargin = p.head_space - inchpt() - p.headheight - p.headsep;
}
// 描画function base_draw() {
canvas = document.getElementById("mainCanvas"); stage = new createjs.Stage(canvas); stage.scaleX = p.scale; stage.scaleY = p.scale; canvas.width = p.paperwidth * 2 + 10; canvas.height = p.paperheight + 10; p.paper_left = new createjs.Shape(); p.paper_left.graphics.beginStroke("black").beginFill("#fffff0").drawRect(0, 0, p.paperwidth, p.paperheight); stage.addChild(p.paper_left); p.paper_right = new createjs.Shape(); p.paper_right.graphics.beginStroke("black").beginFill("#fffff0").drawRect(p.paperwidth, 0, p.paperwidth, p.paperheight); stage.addChild(p.paper_right); p.paper_left_text = new createjs.Text("左ページ(偶数)", "sans serif", "black"); p.paper_left_text.x = 10; p.paper_left_text.y = 10; p.paper_left_text.textAlign = "left"; p.paper_left_text.textBaseline = "top"; stage.addChild(p.paper_left_text); p.paper_right_text = new createjs.Text("右ページ(奇数)", "sans serif", "black"); p.paper_right_text.x = p.paperwidth * 2 - 10; p.paper_right_text.y = 10; p.paper_right_text.textAlign = "right"; p.paper_right_text.textBaseline = "top"; stage.addChild(p.paper_right_text); // ヘッダ領域 p.head_left = new createjs.Container(); p.head_left.x = inchpt() + p.evensidemargin; p.head_left.y = inchpt() + p.topmargin; stage.addChild(p.head_left); p.head_left_box = new createjs.Shape(); p.head_left_box.alpha = 0.8; p.head_left_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.headheight); p.head_left.addChild(p.head_left_box); p.head_left_text = new createjs.Text("ヘッダ領域", "sans serif", "black"); p.head_left_text.x = p.textwidth / 2; p.head_left_text.y = p.headheight / 2; p.head_left_text.textAlign = "center"; p.head_left_text.textBaseline = "middle"; p.head_left.addChild(p.head_left_text); p.head_right = new createjs.Container(); p.head_right.x = p.paperwidth + inchpt() + p.oddsidemargin; p.head_right.y = inchpt() + p.topmargin; stage.addChild(p.head_right); p.head_right_box = new createjs.Shape(); p.head_right_box.alpha = 0.8; p.head_right_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.headheight); p.head_right.addChild(p.head_right_box); p.head_right_text = new createjs.Text("ヘッダ領域", "sans serif", "black"); p.head_right_text.x = p.textwidth / 2; p.head_right_text.y = p.headheight / 2; p.head_right_text.textAlign = "center"; p.head_right_text.textBaseline = "middle"; p.head_right.addChild(p.head_right_text); // 本文 var border_col = "black"; var border_width = 1; if ((p.textwidth + p.gutter) > p.paperwidth || (p.textheight + p.head_space) > p.paperheight) { border_col = "red"; border_width = 2; } p.body_left = new createjs.Container(); p.body_left.x = inchpt() + p.evensidemargin; p.body_left.y = inchpt() + p.topmargin + p.headheight + p.headsep; stage.addChild(p.body_left); p.body_left_box = new createjs.Shape(); p.body_left_box.alpha = 0.8; p.body_left_box.graphics.beginStroke(border_col).setStrokeStyle(border_width).beginFill("#e0ffe0").drawRect(0, 0, p.textwidth, p.textheight); p.body_left.addChild(p.body_left_box); makelines(p.body_left); p.body_right = new createjs.Container(); p.body_right.x = p.paperwidth + inchpt() + p.oddsidemargin; p.body_right.y = inchpt() + p.topmargin + p.headheight + p.headsep; stage.addChild(p.body_right); p.body_right_box = new createjs.Shape(); p.body_right_box.alpha = 0.8; p.body_right_box.graphics.beginStroke(border_col).setStrokeStyle(border_width).beginFill("#e0ffe0").drawRect(0, 0, p.textwidth, p.textheight); p.body_right.addChild(p.body_right_box); makelines(p.body_right); // フッタ p.foot_left = new createjs.Container(); p.foot_left.x = inchpt() + p.evensidemargin; p.foot_left.y = inchpt() + p.topmargin + p.headheight + p.headsep + p.textheight + p.footskip - p.footheight; stage.addChild(p.foot_left); p.foot_left_box = new createjs.Shape(); p.foot_left_box.alpha = 0.5; p.foot_left_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.footheight); p.foot_left.addChild(p.foot_left_box); p.foot_left_text = new createjs.Text("フッタ領域", "sans serif", "black"); p.foot_left_text.x = p.textwidth / 2; p.foot_left_text.y = p.footheight / 2; p.foot_left_text.textAlign = "center"; p.foot_left_text.textBaseline = "middle"; p.foot_left.addChild(p.foot_left_text); p.foot_right = new createjs.Container(); p.foot_right.x = p.paperwidth + inchpt() + p.oddsidemargin; p.foot_right.y = inchpt() + p.topmargin + p.headheight + p.headsep + p.textheight + p.footskip - p.footheight; stage.addChild(p.foot_right); p.foot_right_box = new createjs.Shape(); p.foot_right_box.alpha = 0.5; p.foot_right_box.graphics.beginStroke("black").beginFill("#c0c0c0").drawRect(0, 0, p.textwidth, p.footheight); p.foot_right.addChild(p.foot_right_box); p.foot_right_text = new createjs.Text("フッタ領域", "sans serif", "black"); p.foot_right_text.x = p.textwidth / 2; p.foot_right_text.y = p.footheight / 2; p.foot_right_text.textAlign = "center"; p.foot_right_text.textBaseline = "middle"; p.foot_right.addChild(p.foot_right_text); stage.update();
}
// 行文字配置function makelines(container) {
for (var y = 0; y < p.number_of_lines; y++) { for (var x = 0; x < p.line_length; x++) { var ch = new createjs.Shape(); ch.alpha = 0.2; var fcolor = "#ffffff"; if ((x + 1) % 10 == 0) fcolor = "#000000"; ch.graphics.beginStroke("#0000ff").beginFill(fcolor).drawRect(x * p.jfontsize, y * p.baselineskip, p.jfontsize - 1, p.jfontsize - 1); container.addChild(ch); } } var s = new createjs.Text("本文領域:" + p.line_length + "文字×" + p.number_of_lines + "行", "sans serif", "black"); s.x = p.textwidth / 2; s.y = p.textheight / 2; s.textAlign = "center"; s.textBaseline = "middle"; container.addChild(s);
}
// texdocumentclass出力function update_result() {
var ra = ["media=print"]; ra.push("paper=" + document.getElementById("papersize").value); if (p.fontsize != p.o_fontsize) ra.push("fontsize=" + p.fontsize + "pt"); if (p.baselineskip != p.o_baselineskip) ra.push("baselineskip=" + p.baselineskip + "pt"); ra.push("line_length=" + p.line_length + "zw"); ra.push("number_of_lines=" + p.number_of_lines); if (p.head_space != p.o_head_space) ra.push("head_space=" + dp2(pttomm(p.head_space)) + "mm"); if (p.gutter != p.o_gutter) ra.push("gutter=" + dp2(pttomm(p.gutter)) + "mm"); if (p.headsep != p.o_headsep) ra.push("headheight=" + dp2(pttomm(p.headheight)) + "mm"); if (p.headsep != p.o_headsep) ra.push("headsep=" + dp2(pttomm(p.headsep)) + "mm"); if (p.footskip != p.o_footskip) ra.push("footskip=" + dp2(pttomm(p.footskip)) + "mm"); if (document.getElementById("openany").checked) ra.push("openany"); if (document.getElementById("fleqno").checked) ra.push("fleqno"); if (document.getElementById("startpage").value != "1") ra.push("startpage=" + document.getElementById("startpage").value); if (document.getElementById("serial_pagination").checked) ra.push("serial_pagination=true"); if (document.getElementById("hiddenfolio").checked) ra.push("hiddenfolio=nikko-pc"); if (document.getElementById("tombopaper").value != "auto") ra.push("tombopaper=" + document.getElementById("tombopaper").value); if (document.getElementById("bleed_margin").value != "3") ra.push("bleed_margin=" + document.getElementById("bleed_margin").value + "mm"); var result = ra.join(","); document.getElementById("result_print").value = result; if (document.getElementById("ebook").checked) { document.getElementById("result_ebook").value = result.replace("media=print", "media=ebook"); } else { document.getElementById("result_ebook").value = ""; } document.reviewform.submit();
}
// インチ→pt function inchpt() {
return 72.2712035135135;
}
// mm→pt function mmtopt(mm) {
return mm * 2.8453229729729728;
}
// Q→pt function qtopt(q) {
return q * 0.25 * 2.8453229729729728;
}
// pt→mm function pttomm(pt) {
return pt * 0.3514598096921122;
}
// pt→Q function pttoq(pt) {
return pt * 0.3514598096921122 * 4;
}
// 99→1、.98→0にするfunction nearlyRound(n) {
var r = (((n + 0.01) * 10) >> 0) / 10; return (r > n) ? r : n;
}
// 小数点2桁化function dp2(v) {
return Math.round(v * 100) / 100;
}