/** * @fileoverview 指定のXML要素を子要素を含めてインラインテキストフレーム化する * @author Kenshi Muto <kmuto@debian.org> * @requires libCommon.jsx * @requires libGetBoundsOfPage.jsx */ /* Copyright: 2008 Kenshi Muto ---------------------------------------------------------------------- ソフトウェア使用許諾同意書 本ソフトウェアの利用・変更・再配布にあたっては、下記の使用許諾同意書に 同意する必要があります。 1. 本使用許諾同意書における「ソフトウェア」とは、機械可読の資料 (ライブ ラリ、スクリプト、ソースファイル、データファイル)、実行形式、および 文書を意味します。 2. 本ソフトウェアの使用許諾同意書に同意する限りにおいて、使用者は 本ソフトウェアを自由に利用、変更することができます。 3. 本ソフトウェアに変更を加えない限りにおいて、使用者は本ソフトウェアを 自由にコピー、再配布することができます。 4. 本ソフトウェアは無保証です。作者およびそれに関連する組織、配布者は、 本ソフトウェアの使用に起因する一切の直接損害、間接損害、偶発的損害、 特別損害、懲戒的損害、派生的損害について何らの責任・保証も負いません。 5. 本ソフトウェアを変更した上で再配布するときには、下記の事項すべてに 従わなければなりません。 - 使用許諾同意書の内容に変更を加えてはなりません。技術上の理由で 文字エンコーディングの変換を行うことは許可しますが、その使用者が 特殊な技術的措置なしに可読な形でなければなりません。 - 技術上の理由でバイナリ化・難読化を行う場合も、変更箇所を含めた ソフトウェアを、その使用者が可読可能な形式の形で同一のメディアで 提供しなければなりません。本使用許諾同意書の2条および3条により、 使用者が可読形式の該当ソフトウェアを変更、コピー、再配布することを 妨げてはなりません。 - ソフトウェア構成物の所定の作者名の欄に、変更者のクレジット (個人名、企業名、所属、連絡先など)を「追加」しなければなりません。 6. 本ソフトウェアを変更した上で再配布するときには、変更理由および その内容を明記することが推奨されます。 7. 使用者がソフトウェアに適用可能な特許に対して特許侵害にかかわる何らか の行動を開始した時点で、この使用許諾同意書は自動的に終了し、以降 使用者はこの使用許諾書によって与えられた一切の権利を放棄するものと します。 著作権所有者 Copyright (C) 2008 Kenshi Muto. All rights reserved. 使用許諾同意書バージョン1.0 著作権所有者による書面での事前の許可がない限り、この使用許諾同意書 に変更を加えてはなりません。 ---------------------------------------------------------------------- */ #include "../libs/libCommon.jsx" #include "../libs/libGetBoundsOfPage.jsx" /** * 指定のXML要素を探して、テンポラリマスターページに移動する * @param {Document} document ドキュメントオブジェクト * @param {String} tagname XML要素名。nosplit属性が付いているときには処理しない * @param {Long} boxwidth インラインテキストフレームの横幅 * @param {String} oname オブジェクトスタイル名 * @param {Long[4]} offsets インラインテキストフレームのオフセット * @param {String[]} pnames 段落スタイル名の配列 * @type Nothing */ function makeCodeBlock1(document, tagname, boxwidth, oname, offsets) { if (document.masterSpreads.item("Z-tmpインラインブロック") != null) { document.masterSpreads.item("Z-tmpインラインブロック").remove(); } var tmppage = document.masterSpreads.add(); tmppage.namePrefix = "Z"; tmppage.baseName = "tmpインラインブロック"; var tmpframe = tmppage.textFrames.add(); tmpframe.label = "INDICES-TF"; tmpframe.appliedObjectStyle = getObjectStyleByName(document, oname); processXMLforCodeBlock(document, document.xmlItems, tagname, boxwidth, offsets); } /** * テンポラリマスターページからXML要素の内容をインラインテキストフレームに貼り付ける * @param {Document} document ドキュメントオブジェクト * @type Nothing */ function makeCodeBlock2(document) { var backunit = toMmMode(document); var tmppage = document.masterSpreads.item("Z-tmpインラインブロック"); var ids = tmppage.textFrames.item("INDICES-TF").parentStory.contents.split(/ /); var objstyle = tmppage.textFrames.item("INDICES-TF").appliedObjectStyle; for (var i = 0; i < ids.length; i++) { var id = ids[i].split(/\=/); tf = document.textFrames.itemByID(id[0]); tf2 = document.textFrames.itemByID(id[1]); var unit = getBoundsOfPage(document, document.pages[0]); // FIXME:1ページのを使う tf.select(); var element = tf.associatedXMLElement; app.cut(); tf2.select(); app.pasteInto(); tf2.fit(FitOptions.frameToContent); var unit2 = tf2.geometricBounds; if ((unit2[2] - unit2[0]) > (unit[2] - unit[0])) { alert("版面より大きなブロックがあります! 縦を縮小します"); unit2[2] = unit2[0] + (unit[2] - unit[0]) - 20; // FIXME tf2.geometricBounds = unit2; } element.remove(); // コピー元は削除 tf2.appliedObjectStyle = objstyle; with(tf2) { // 上書きされたオブジェクトスタイルを戻す。FIXME:もっと一発で直せないのか? appliedParagraphStyle = objstyle.appliedParagraphStyle; anchoredObjectSettings.anchoredPosition = objstyle.anchoredObjectSettings.anchoredPosition; applyNextParagraphStyle = objstyle.applyNextParagraphStyle; basedOn = objstyle.basedOn; // baselineFrameGridOptions = objstyle.baselineFrameGridOptions; blendMode = objstyle.blendMode; cornerEffect = objstyle.cornerEffect; cornerRadius = objstyle.cornerRadius; defaultFrameGridObjectStyle = objstyle.defaultFrameGridObjectStyle; defaultObjectStyle = objstyle.defaultObjectStyle; defaultTextObjectStyle = objstyle.defaultTextObjectStyle; enableAnchoredObjectOptions = objstyle.enableAnchoredObjectOptions; // FIXME fillColor = objstyle.fillColor; fillTint = objstyle.fillTint; gapColor = objstyle.gapColor; gapTint = objstyle.gapTint; // FIXME } } revertMmMode(document, backunit); tmppage.remove(); } /** * 指定のXML要素を探して、新規作成したテキストフレームに移動する * @param {Document} document ドキュメントオブジェクト * @param {XMLItems} items XMLItemsオブジェクト * @param {String} tagname XML要素名。nosplit属性が付いているときには処理しない * @param {Long} boxwidth インラインテキストフレームの横幅 * @param {Long[4]} offsets インラインテキストフレームのオフセット * @type boolean * @return 再帰のために関数処理を継続するか(true=継続する、false=継続しない) */ function processXMLforCodeBlock(document, items, tagname, boxwidth, offsets) { if (items == null || items.length == 0) { return false; } for (var i = 0; i < items.length; i++) { if (items[i].xmlElements != null && items[i].xmlElements.length > 0) { for (var i2 = 0; i2 < items[i].xmlElements.length; i2++) { var e = items[i].xmlElements[i2]; if (e.markupTag.name == tagname) { if (e.xmlAttributes.itemByRange("nosplit", "nosplit") != null) continue; // nosplit属性が付いているときにはスキップ try { page = e.parentStory.characters[e.storyOffset - 1].insertionPoints[0].parentTextFrames[0].parent; var unit = getBoundsOfPage(myDocument, page); var tmppage = document.masterSpreads.item("Z-tmpインラインブロック"); var tf = tmppage.textFrames.add(); tf.contentType = ContentType.textType; var backunit = toMmMode(document); if (boxwidth != null) { unit[3] = unit[1] + boxwidth; } tf.textFramePreferences.insetSpacing = offsets; tf.geometricBounds = unit; e2 = e.duplicate(); e2.placeXML(tf.parentStory); tf.fit(FitOptions.frameToContent); var unit2 = tf.geometricBounds; unit2[3] = unit[3]; tf.geometricBounds = unit2; var tf2 = e.parentStory.characters[e.storyOffset - 1].insertionPoints[-1].textFrames.add(); tf2.contentType = ContentType.textType; tf2.contents = "WILL BE REPLACED"; var tmpframe = tmppage.textFrames.item("INDICES-TF"); tmpframe.contents += tf.id + "=" + tf2.id + " " e.remove(); revertMmMode(document, backunit); } catch (exception) {} // XXX: 新規作成したものはinsertionPointsが取れないので例外となる } } } processXMLforCodeBlock(document, items[i].xmlItems, tagname, boxwidth, offsets); } return true; }