/** * @fileoverview XPathにマッチする要素を切り出してテキストフレーム化する * @author Kenshi Muto <kmuto@debian.org> * @requires glue code.jsx * @requires libCommon.jsx * @requires libGetBoundsOfPage.jsx * @version 3 */ /* Copyright: 2009 Kenshi Muto ---------------------------------------------------------------------- ソフトウェア使用許諾同意書 本ソフトウェアの利用・変更・再配布にあたっては、下記の使用許諾同意書に 同意する必要があります。 1. 本使用許諾同意書における「ソフトウェア」とは、機械可読の資料 (ライブ ラリ、スクリプト、ソースファイル、データファイル)、実行形式、および 文書を意味します。 2. 本ソフトウェアの使用許諾同意書に同意する限りにおいて、使用者は 本ソフトウェアを自由に利用、変更することができます。 3. 本ソフトウェアに変更を加えない限りにおいて、使用者は本ソフトウェアを 自由にコピー、再配布することができます。 4. 本ソフトウェアは無保証です。作者およびそれに関連する組織、配布者は、 本ソフトウェアの使用に起因する一切の直接損害、間接損害、偶発的損害、 特別損害、懲戒的損害、派生的損害について何らの責任・保証も負いません。 5. 本ソフトウェアを変更した上で再配布するときには、下記の事項すべてに 従わなければなりません。 - 使用許諾同意書の内容に変更を加えてはなりません。技術上の理由で 文字エンコーディングの変換を行うことは許可しますが、その使用者が 特殊な技術的措置なしに可読な形でなければなりません。 - 技術上の理由でバイナリ化・難読化を行う場合も、変更箇所を含めた ソフトウェアを、その使用者が可読可能な形式の形で同一のメディアで 提供しなければなりません。本使用許諾同意書の2条および3条により、 使用者が可読形式の該当ソフトウェアを変更、コピー、再配布することを 妨げてはなりません。 - ソフトウェア構成物の所定の作者名の欄に、変更者のクレジット (個人名、企業名、所属、連絡先など)を「追加」しなければなりません。 6. 本ソフトウェアを変更した上で再配布するときには、変更理由および その内容を明記することが推奨されます。 7. 使用者がソフトウェアに適用可能な特許に対して特許侵害にかかわる何らか の行動を開始した時点で、この使用許諾同意書は自動的に終了し、以降 使用者はこの使用許諾書によって与えられた一切の権利を放棄するものと します。 著作権所有者 Copyright (C) 2008-2009 Kenshi Muto. All rights reserved. 使用許諾同意書バージョン1.0 著作権所有者による書面での事前の許可がない限り、この使用許諾同意書 に変更を加えてはなりません。 ---------------------------------------------------------------------- */ #include "../libs/glue code.jsx" #include "../libs/libCommon.jsx" #include "../libs/libGetBoundsOfPage.jsx" var _obj = new Object; var _myDocument; var _zoom = app.activeWindow.zoomPercentage; /** * ドキュメント情報とXPathを受けて、独立したテキストフレームを作成する * @param {Document} document ドキュメントオブジェクト * @param {String} xpath 対象のXPath * @param {Object} obj パラメータオブジェクト * @param {ObjectStyle} obj.objectStyle フレームに適用するオブジェクトスタイル * @param {String} obj.label アンカータグに付ける識別子 * @param {Float} obj.width フレームの幅。0のときは自動合わせ * @param {boolean} obj.inline インラインフレーム化の有無(true:インラインフレーム化) * @type Nothing */ function MakeBlock(document, xpath, obj) { _myDocument = document; _obj = obj; if (_obj.label == null) _obj.label = ""; var myRuleSet = new Array(new ProcessSubset(xpath)); __processRuleSet(_myDocument.xmlElements.item(0), myRuleSet); var myRuleSet = new Array(new ProcessPlaceBlock); __processRuleSet(_myDocument.xmlElements.item(0), myRuleSet); } /** * XPathにマッチする要素を切り出して独立したテキストフレームを作成するコールバック * @param {String} xpath 対象のXPath * @type Nothing */ function ProcessSubset(xpath) { this.name = "ProcessSubset"; this.xpath = xpath; this.apply = function(myElement, myRuleProcessor) { var myBounds =getBoundsOfPage(_myDocument, myElement.storyOffset.parentTextFrames[0].parent); var markElement = myElement.parent.xmlElements.add("_blockanchor_" + obj.label); var newFrame = myElement.storyOffset.parentTextFrames[0].parent.textFrames.add(); if (_obj.width > 0) { var backunit = toMmMode(_myDocument); myBounds[3] = myBounds[1] + _obj.width; revertMmMode(_myDocument, backunit); } newFrame.geometricBounds = myBounds; markElement.xmlAttributes.add("ref", newFrame.id + ""); markElement.move(LocationOptions.AFTER, myElement); app.activeWindow.zoomPercentage = _zoom; // ズームを変更することで再描画 myElement.placeXML(newFrame); return true; } } /** * 切り出されたテキストフレームを適切な位置・大きさで配置するコールバック * @type Nothing */ function ProcessPlaceBlock() { this.name = "ProcessPlaceBlock"; this.xpath = "//_blockanchor_" + _obj.label; this.apply = function(myElement, myRuleProcessor) { var tid = Number(myElement.xmlAttributes.itemByName("ref").value); var tf = _myDocument.textFrames.itemByID(tid); if (tf != null) { tf.appliedObjectStyle = _obj.objectStyle; tf.fit(FitOptions.FRAME_TO_CONTENT); if (_obj.inline == true) { // インラインはコピーペーストでなければ埋め込めない var element = tf.associatedXMLElement; var tf2 = myElement.storyOffset.textFrames.add(); tf2.appliedObjectStyle = tf.appliedObjectStyle; tf.select(); app.cut(); tf2.select(); app.pasteInto(); tf2.fit(FitOptions.FRAME_TO_CONTENT); element.remove(); } } else { alert("テキストID " + myElement.xmlAttributes.itemByName("ref").value + " は見つかりませんでした"); } return true; } }