/** * @fileoverview XMLインストラクションを使い、左右の柱を生成して適用する * @author Kenshi Muto <kmuto@debian.org> * @requires libCommon.jsx * @version 3 */ /* Copyright: 2010 Kenshi Muto ---------------------------------------------------------------------- ソフトウェア使用許諾同意書 本ソフトウェアの利用・変更・再配布にあたっては、下記の使用許諾同意書に 同意する必要があります。 1. 本使用許諾同意書における「ソフトウェア」とは、機械可読の資料 (ライブ ラリ、スクリプト、ソースファイル、データファイル)、実行形式、および 文書を意味します。 2. 本ソフトウェアの使用許諾同意書に同意する限りにおいて、使用者は 本ソフトウェアを自由に利用、変更することができます。 3. 本ソフトウェアに変更を加えない限りにおいて、使用者は本ソフトウェアを 自由にコピー、再配布することができます。 4. 本ソフトウェアは無保証です。作者およびそれに関連する組織、配布者は、 本ソフトウェアの使用に起因する一切の直接損害、間接損害、偶発的損害、 特別損害、懲戒的損害、派生的損害について何らの責任・保証も負いません。 5. 本ソフトウェアを変更した上で再配布するときには、下記の事項すべてに 従わなければなりません。 - 使用許諾同意書の内容に変更を加えてはなりません。技術上の理由で 文字エンコーディングの変換を行うことは許可しますが、その使用者が 特殊な技術的措置なしに可読な形でなければなりません。 - 技術上の理由でバイナリ化・難読化を行う場合も、変更箇所を含めた ソフトウェアを、その使用者が可読可能な形式の形で同一のメディアで 提供しなければなりません。本使用許諾同意書の2条および3条により、 使用者が可読形式の該当ソフトウェアを変更、コピー、再配布することを 妨げてはなりません。 - ソフトウェア構成物の所定の作者名の欄に、変更者のクレジット (個人名、企業名、所属、連絡先など)を「追加」しなければなりません。 6. 本ソフトウェアを変更した上で再配布するときには、変更理由および その内容を明記することが推奨されます。 7. 使用者がソフトウェアに適用可能な特許に対して特許侵害にかかわる何らか の行動を開始した時点で、この使用許諾同意書は自動的に終了し、以降 使用者はこの使用許諾書によって与えられた一切の権利を放棄するものと します。 著作権所有者 Copyright (C) 2008-2010 Kenshi Muto. All rights reserved. 使用許諾同意書バージョン1.0 著作権所有者による書面での事前の許可がない限り、この使用許諾同意書 に変更を加えてはなりません。 ---------------------------------------------------------------------- */ #include "../libs/libCommon.jsx" /** * マスターページのコピーを作成し、左右柱のテンプレート文字列を置換する * @param {Document} document ドキュメントオブジェクト * @param {Object} obj パラメータオブジェクト * @param {Spread} obj.template 元にするマスターページ * @param {String} obj.secprefix マスターページのプリフィクス名 * @param {String} obj.leftname 左柱のテンプレート文字列 * @param {String} obj.leftcontent 左柱に挿入する文字列 * @param {String} ob.leftnumstylename 左柱文字列から全角空白文字列が見つかるまで適用する文字スタイル名(空にした場合は適用しない) * @param {boolean} obj.leftnumonly 左柱に文字スタイルを適用する際に数値とA-Zだけに適用する * @param {boolean} obj.leftsplit 左柱を全角空白文字で分割し、左側を切り取る * @param {String} obj.leftnumlabel leftsplitがtrueのときに切り取った部分(章番号)を張り付けるテキストフレーム名 * @param {String} obj.leftnumname leftsplitがtrueのときに切り取った部分(章番号)で置き換える文字列 * @param {String} obj.rightname 左柱のテンプレート文字列 * @param {String} obj.rightcontent 左柱に挿入する文字列 * @param {String} obj.rightnumstylename 右柱文字列から全角空白文字列が見つかるまで適用する文字スタイル名(空にした場合は適用しない) * @param {boolean} obj.rightnumonly 右柱に文字スタイルを適用する際に数値とA-Zだけに適用する * @param {boolean} obj.rightsplit 右柱を全角空白文字で分割し、左側を切り取る * @param {String} obj.rightnumlabel rightsplitがtrueのときに切り取った部分(節番号)を張り付けるテキストフレーム名 * @param {String} obj.rightnumname rightsplitがtrueのときに切り取った部分(節番号)で置き換える文字列 * @type Spread * @return 生成したマスターページ */ function makeMasterPage2(document, obj) { var spread = obj.template.duplicate(LocationOptions.atEnd, obj.template); var secname = obj.rightcontent + ""; if (secname == "") secname = obj.leftcontent; var no = null; if ((obj.rightcontent + "").search(/[ \t]/) > -1) { var array = obj.rightcontent.split(/[ \t]/, 2); no = array[0]; secname = array[1]; } try { spread.baseName = secname + ""; } catch (e) { // 同じ名前のマスターページがある場合に退避 spread.baseName = secname + "2"; } spread.namePrefix = obj.secprefix + ""; app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; app.findChangeTextOptions.includeMasterPages = true; var tf; if (obj.leftname != null && obj.leftname != "") { tf = findStringFromObject(spread, obj.leftname)[0]; app.findTextPreferences.findWhat = obj.leftname; var content = obj.leftcontent + ""; var no = null; if (obj.leftsplit == true) { var array = content.split(/[ \t]/, 2); if (array.length > 1) { content = array[1]; no = array[0].replace("第", "").replace("章", "").replace("付録", ""); } } app.changeTextPreferences.changeTo = content; if (tf != null) { tf.changeText(); if (obj.forcereplace == true) { tf.contents = content; } if (obj.leftnumstylename != null && obj.leftsplit != true) setCharacterStyle(document, tf, " ", obj.leftnumstylename, obj.leftnumonly); } if (no != null && obj.leftnumlabel != null) { tf = spread.textFrames.item(obj.leftnumlabel); if (tf != null) { app.findTextPreferences.findWhat = obj.leftnumname; app.changeTextPreferences.changeTo = no; tf.changeText(); } } } if (obj.rightname != null && obj.rightname != "") { tf = findStringFromObject(spread, obj.rightname)[0]; app.findTextPreferences.findWhat = obj.rightname; var content = obj.rightcontent + ""; var no = null; if (obj.rightsplit == true) { var array = content.split(/[ \t]/, 2); if (array.length > 1) { content = array[1]; no = array[0].replace("第", "").replace("章", "").replace("付録", ""); } } app.changeTextPreferences.changeTo = content + ""; if (tf != null) { tf.changeText(); if (obj.forcereplace == true) { tf.contents = content; } if (obj.rightnumstylename != null && obj.rightsplit != true) setCharacterStyle(document, tf, " ", obj.rightnumstylename, obj.rightnumonly); } if (no != null && obj.rightnumlabel != null) { tf = spread.textFrames.item(obj.rightnumlabel); if (tf != null) { app.findTextPreferences.findWhat = obj.rightnumname; app.changeTextPreferences.changeTo = no; tf.changeText(); } } } return spread; } /** * XMLインストラクションを検索して<?dtp level="数値" section="文字列" ?>形式のものを発見したら柱とする * @param {Document} document ドキュメントオブジェクト * @param {XMLItems} items XMLItemsオブジェクト * @param{Object} obj パラメータオブジェクト * @param {String} obj.secprefix マスターページのプリフィクス名 * @param {Spread} obj.template 元にするマスターページ * @param {String} obj.tobira 扉ページのドキュメントオフセット値(このページには柱を適用しない) * @param {String} obj.leftname 左柱のテンプレート文字列 * @param {Long} obj.leftlevel 左柱に使うレベルの深さ * @param {String} obj.leftnumstylename 左柱文字列から全角空白文字列が見つかるまで適用する文字スタイル名(空にした場合は適用しない) * @param {boolean} obj.leftnumonly 左柱に文字スタイルを適用する際に数値とA-Zだけに適用する * @param {String} obj.leftcontent 左柱に挿入する文字列 * @param {String} obj.rightname 右柱のテンプレート文字列 * @param {Long} obj.rightlevel 右柱に使うレベルの深さ * @param {String} obj.rightnumstylename 右柱文字列から全角空白文字列が見つかるまで適用する文字スタイル名(空にした場合は適用しない) * @param {boolean} obj.rightnumonly 右柱に文字スタイルを適用する際に数値とA-Zだけに適用する * @param {String} obj.rightcontent 右柱に挿入する文字列 * @type boolean * @return 再帰のために関数処理を継続するか(true=継続する、false=継続しない) */ function processXMLforHashira3(document, items, obj) { if (items == null || items.length == 0) { return false; } for (var i = 0; i < items.length; i++) { if (items[i].xmlInstructions != null && items[i].xmlInstructions.length > 0) { for (var i2 = 0; i2 < items[i].xmlInstructions.length; i2++) { var e = items[i].xmlInstructions[i2]; if (e.target == "dtp") { if (e.data.search(/section=/) != -1 && e.data.search(/level=/) != -1) { var sectname = e.data.match(/section="(.*?)"/)[1].replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'); var level = parseInt(e.data.match(/level="(.*?)"/)[1]); if (level <= obj.rightlevel) { // 柱の対象 if (obj.leftlevel == level) { obj.leftcontent = sectname; if (obj.leftlevel == obj.rightlevel || obj.rightcontent == "" || obj.rightcontent == null) obj.rightcontent = sectname; // 右柱がないときにはとりあえず章名で埋めておく } else obj.rightcontent = sectname; spread = makeMasterPage2(document, obj); spread.label = "tmp"; obj.secprefix = obj.secprefix + 1; var page; page = e.storyOffset.parentTextFrames[0].parent.documentOffset + 1; // FIXME:documentOffsetのカウントが異なる? var pages = document.pages; for (var i3 = page - 1; i3 < pages.length; i3++) { if (i3 == obj.tobira - 1) continue; pages[i3].appliedMaster = spread; // 位置から後ろ全部にマスター付け } } } } } } processXMLforHashira3(document, items[i].xmlItems, obj); } return true; }