/** * @fileoverview 章扉を作成する * @author Kenshi Muto <kmuto@debian.org> * @requires libCommon.jsx * @requires glue code.jsx * @requires libGetFrameIDs.jsx * @requires libGetBoundsOfPage.jsx */ /* Copyright: 2009-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" #include "../libs/glue code.jsx" #include "../libs/libGetFrameIDs.jsx" #include "../libs/libGetBoundsOfPage.jsx" /** * 要素から処理するハンドラ(各呼び出し側で設定可能) @param {Document} document ドキュメントオブジェクト @param {Object} object パラメータオブジェクト */ /* function doTobiraHandle(document, obj) { } */ /** * 要素名で検索し、ハンドラdoTobiraHandleに渡すXMLプロセッサ * @param {Document} document ドキュメントオブジェクト * @param {Object} object パラメータオブジェクト * @param {String} obj.tagname 要素名 * @type Nothing */ function processTobiraObject(document, obj) { this.name = "ProcessSubset"; this.xpath = "//" + obj.tagname; this.apply = function(myElement, myRuleProcessor) { obj.element = myElement; obj.startpoint = myElement.storyOffset; obj.endpoint = getEndStoryPoint2(myElement); obj.story = myElement.parentStory; doTobiraHandle(document, obj); return true; } } /** * XMLインストラクションを検索して<?dtp level="数値" section="文字列" >形式のものを発見し、levelが指定の値と同一であれば節名として配列に入れる @param {Document} document ドキュメントオブジェクト @param {XMLItems} items XMLItemsオブジェクト @param {String} sects 格納配列。呼び出し時は[]を指定する @param {String[]} p2s getPagenumFromSectionから取得済みのページ/ノンブルの配列 @type String[] @return 新しい格納配列 */ function processXMLforSection(document, items, level, sects, p2s) { if (items == null || items.length == 0) { return sects; } 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("\t", " "); var l = parseInt(e.data.match(/level="(.*?)"/)[1]); if (l == level) { var page = p2s[e.storyOffset.parentTextFrames[0].parent.documentOffset]; sects.push(sectname + "\t" + page); } } } } } sects = processXMLforSection(document, items[i].xmlItems, level, sects, p2s); } return sects; } /** * インストラクションと要素を元に章番号、章タイトル、リードを入れた新規のマスターページを作成し、1ページ目に適用する * @param {Document} document ドキュメントオブジェクト * @param {Object} object パラメータオブジェクト * @param {Spread} obj.stylemaster 扉テンプレートマスターページ * @param {String} obj.chapnoname 章番号として置き換えるオブジェクトラベル(デフォルト:chapno) * @param {String} obj.chapnostr 章番号として置き換える文字列(デフォルト:#) * @param {boolean} obj.nochapno trueにすると章番号を置換しない * @param {Number} obj.chaplevel 章として扱うレベル(デフォルト:1) * @param {String} obj.titlename 章タイトルとして置き換えるオブジェクトラベル(デフォルト:chaptitle) * @param {String} obj.titlestr obj.titlestr 章タイトルとして置き換える文字列(デフォルト:CHAPTITLE) * @param {boolean} obj.notitle trueにすると章タイトルを置換しない * @param {boolean} obj.notitletagremove trueにすると章タイトルタグを削除しない * @param {boolean} obj.section trueにすると節リストを作成する * @param {String} obj.sectionname 節リストを入れるテキストフレームのラベル(デフォルト:sectitles) * @param {boolean} obj.sectionnopage trueにすると節リストにページノンブルは入れない * @param {String} obj.leadtag リード文のタグ(デフォルト:lead) * @param {Integer} obj.dropy テキストフレームの下げ位置。デフォルトのnullでは下げない * @param {boolean} obj.nolead trueにするとリードを置換しない * @param {boolean} obj.modfirst trueにするとテキストフレームの最初の行の空行を削除する(デフォルト:false) * @param {ParagraphStyle} obj.modfirstpara テキストフレーム先頭行に割り当てる段落スタイル。obj.modfirstがtrueのときのみ機能 * @param {boolean} obj.setbound trueにすると版面にテキストフレームを合わせる * @type Spread * @return 作成したスプレッド */ function makeTobira(document, obj) { var spread = null; if (obj.chaplevel == null) { obj.chaplevel = 1; } try { var title = document.xmlItems[0].xmlInstructions[0].data; if (title.search(/section=/) != -1 && title.search(new RegExp("level=\"" + obj.chaplevel + "\"")) != -1) { var chapno = null; try { chapno = title.match(/section="第(.*?)章/)[1]; } catch(e) {} if (chapno == null) { try { chapno = title.match(/section="Part(.*?) /)[1]; } catch(e) {} } if (chapno == null) { try { chapno = title.match(/section="第(.*?)部/)[1]; } catch(e) {} } if (chapno == null) { try { chapno = title.match(/section="付録(.*?) /)[1]; } catch(e) {} } if (chapno != null) { spread = obj.stylemaster.duplicate(); var tf; app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; app.findChangeTextOptions.includeLockedLayersForFind = true; app.findChangeTextOptions.includeMasterPages = true; if (!obj.nochapno) { tf = spread.textFrames.item(obj.chapnoname ? obj.chapnoname : "chapno"); app.findTextPreferences.findWhat = (obj.chapnostr ? obj.chapnostr : "#"); app.changeTextPreferences.changeTo = chapno; tf.changeText(); } if (!obj.notitle) { tf = spread.textFrames.item(obj.titlename ? obj.titlename : "chaptitle"); app.findTextPreferences.findWhat = (obj.titlestr ? obj.titlestr : "CHAPTITLE"); app.changeTextPreferences.changeTo = title.split(/[ \t]/, 2)[1].replace(/\"$/, ""); tf.changeText(); if (!obj.notitletagremove) { document.xmlItems[0].xmlElements[0].remove(); } } if (obj.section) { p2s = getPagenumFromSection(myDocument); var tf = spread.textFrames.item(obj.sectionname ? obj.sectionname : "sectitles"); var sects = processXMLforSection(document, document.xmlItems, obj.sectionlevel, [], p2s); var s = ""; for (var i = 0; i < sects.length; i++) { var item = sects[i]; if (obj.sectionnopage) { item = sects[i].split(/\t/)[0]; } s = s + item + "\r"; // FIXME } tf.contents = s; } if (!obj.nolead) { tf = spread.textFrames.item(obj.leadname ? obj.leadname : "lead"); obj.tagname = obj.leadtag; var myRuleSet = new Array(new processTobiraObject(document, obj)); __processRuleSet(document.xmlElements.item(0), myRuleSet); obj.element.placeXML(tf.parentStory); } spread.baseName = "tmp-tobira-" + chapno + ""; spread.label = "tmp"; document.pages[0].appliedMaster = spread; if (obj.dropy) { var backunit = toMmMode(document); var unit = document.pages[0].textFrames.item("main-content").geometricBounds; unit[0] = obj.dropy; document.pages[0].textFrames.item("main-content").geometricBounds = unit; revertMmMode(document, backunit); } if (obj.setbound) { var unit = getBoundsOfPage(document, document.pages[0]); document.pages[0].textFrames.item("main-content").geometricBounds = unit; } } if (obj.modfirst) { var lines = document.pages[0].textFrames.item("main-content").lines; if (lines.length > 1 && lines[0].characters.length == 2) { lines[0].appliedParagraphStyle = obj.modfirstpara == null ? lines[1].appliedParagraphStyle : obj.modfirstpara; lines[0].characters[1].remove(); lines[0].clearOverrides(); } } return spread; } } catch (e) { return null; } }