/** * @fileoverview 指定のXML要素の内容を吹き出しとしてテキストフレーム化し、線を引く * @author Kenshi Muto <kmuto@debian.org> * @requires libCommon.jsx * @requires libGetBoundsOfPage.jsx * @requires libGetFrameIDs.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" #include "../libs/libGetFrameIDs.jsx" var _balloonarray = new Array(); // XXX: グローバル変数 /** * 指定のXML要素を探して、新規作成したテキストフレームに移動し、線を引く * @param {Document} document ドキュメントオブジェクト * @param {XMLItems} items XMLItemsオブジェクト * @param {String} layername 構成レイヤー名 * @param {String} tagname 側注化XML要素名 * @param {ObjectStyle} ostyle コメントテキストフレームのオブジェクトスタイル。コメントに使いたい段落スタイルを割り当てておくこと * @param {ObjectStyle} lstyle 線のオブジェクトスタイル * @param {String} reftagname コメントへの参照XML要素名 * @param {Float} xoffset 版面右から空けるスペース * @param {Float} yoffset 参照位置ベースラインと吹き出し上位置とのオフセット * @param {Float} lxoffset 参照位置と線の開始の間のスペース * @param {Float} lyoffset 参照位置ベースラインと線とのオフセット * @type boolean * @return 再帰のために関数処理を継続するか(true=継続する、false=継続しない) */ function processXMLforBalloon(document, items, layername, tagname, ostyle, lstyle, reftagname, xoffset, yoffset, lxoffset, lyoffset) { 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) { var refe; if (e.parent.xmlElements.nextItem(e) != null && e.parent.xmlElements.nextItem(e).markupTag.name == reftagname) { refe = e.parent.xmlElements.nextItem(e); } else { refe = items[i].parent.xmlElements.add(reftagname); } // refe.paragraphs[0].appliedParagraphStyle = e.paragraphs[0].appliedParagraphStyle; var attr = refe.xmlAttributes.itemByRange("idref", "idref"); try { if (attr != null) { attr.value = (_balloonarray.length + 1).toString(); } else { refe.xmlAttributes.add("idref", (_balloonarray.length + 1).toString()); } } catch (e) { refe.xmlAttributes.add("idref", (_balloonarray.length + 1).toString()); } refe.move(LocationOptions.after, e); var page; if (getCSVersion() == 2) { page = e.parentStory.characters[e.storyOffset - 1].insertionPoints[0].parentTextFrames[0].parent; } else { page = e.storyOffset.insertionPoints[0].parentTextFrames[0].parent; } var backunit = toMmMode(document); var backruler = document.viewPreferences.rulerOrigin; document.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin; var x0, y0, y; if (getCSVersion() == 2) { y0 = refe.parentStory.characters[e.storyOffset - 1].insertionPoints[0].baseline + yoffset; x0 = refe.parentStory.characters[e.storyOffset - 1].insertionPoints[0].horizontalOffset + lxoffset; y = refe.parentStory.characters[e.storyOffset - 1].insertionPoints[0].baseline + lyoffset; } else { y0 = e.storyOffset.baseline + yoffset; x0 = e.storyOffset.horizontalOffset + lxoffset; y = e.storyOffset.baseline + lyoffset; } var tf, x1, y1; if (layername != null) { var layer = e.parentStory.parent.layers.itemByRange(layername, layername); if (layer == null) { layer = document.layers.add(); layer.label = layername; layer.name = layername; } tf = page.textFrames.add({itemLayer: layer}); } else { tf = page.textFrames.add(); } tf.contentType = ContentType.textType; tf.appliedObjectStyle = ostyle; var unit = getBoundsOfPage(myDocument, page); tf.geometricBounds = [ y0, 0, unit[2], unit[3] ]; tf.placeXML(e); for (var i3 = 0; i3 < tf.paragraphs.length; i3++) { tf.paragraphs[i3].appliedParagraphStyle = ostyle.appliedParagraphStyle; } tf.fit(FitOptions.frameToContent); tf.label = "tmp-bal-" + (_balloonarray.length + 1); var unit2 = tf.geometricBounds; tf.geometricBounds = [unit2[0], unit[3] - (unit2[3] -unit2[1]) - xoffset, unit2[2], unit[3] - xoffset]; var line = page.graphicLines.add(tf.itemLayer, undefined, undefined, { label: "tmp-balline-" + tf.id, appliedObjectStyle: lstyle, geometricBounds: [ y, x0, y, unit[3] - (unit2[3] - unit2[1]) - xoffset] }); _balloonarray.push([page.documentOffset, tf.id, y0, unit2[2]]); revertMmMode(document, backunit); document.viewPreferences.rulerOrigin = backruler; } } } processXMLforBalloon(document, items[i].xmlItems, layername, tagname, ostyle, lstyle, reftagname, xoffset, yoffset, lxoffset, lyoffset); } return true; } /** * 指定のXML要素を探して、吹き出しと線の場所を移動する * @param {Document} document ドキュメントオブジェクト * @param {XMLItems} items XMLItemsオブジェクト * @param {String} layername 構成レイヤー名 * @param {String} tagname 側注化XML要素名 * @param {String} reftagname コメントへの参照XML要素名 * @param {ObjectStyle} lstyle 線のオブジェクトスタイル * @param {Float} xoffset 版面右から空けるスペース * @param {Float} yoffset 参照位置ベースラインと吹き出し上位置とのオフセット * @param {Float} lxoffset 参照位置と線の開始の間のスペース * @param {Float} lyoffset 参照位置ベースラインと線とのオフセット * @type boolean * @return 再帰のために関数処理を継続するか(true=継続する、false=継続しない) */ function redrawProcessXMLforBalloon(document, items, reftagname, lstyle, xoffset, yoffset, lxoffset, lyoffset) { 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 == reftagname) { var attr = e.xmlAttributes.itemByRange("idref", "idref"); if (attr != null) { var backunit = toMmMode(document); var backruler = document.viewPreferences.rulerOrigin; document.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin; var page; if (getCSVersion() == 2) { page = e.parentStory.characters[e.storyOffset - 1].insertionPoints[0].parentTextFrames[0].parent; } else { page = e.storyOffset.parentTextFrames[0].parent; } var tf = document.textFrames.item("tmp-bal-" + attr.value); var line = document.graphicLines.item("tmp-balline-" + tf.id); var page2 = tf.parent; var unit = getBoundsOfPage(myDocument, page); if (page2 instanceof Spread || page.documentOffset != page2.documentOffset) { // ページが変わった tf.move(page); line.move(page); } var y0, x0, y; if (getCSVersion() == 2) { y0 = e.parentStory.characters[e.storyOffset - 1].insertionPoints[0].baseline + yoffset; x0 = refe.parentStory.characters[e.storyOffset - 1].insertionPoints[0].horizontalOffset + lxoffset; y = refe.parentStory.characters[e.storyOffset - 1].insertionPoints[0].baseline + lyoffset; } else { y0 = e.storyOffset.baseline + yoffset; x0 = e.storyOffset.horizontalOffset + lxoffset; y = e.storyOffset.baseline + lyoffset; } var unit2 = tf.geometricBounds; var width = unit2[3] - unit2[1]; var height = unit2[2] - unit2[0]; var unit = getBoundsOfPage(myDocument, page); var unit2 = tf.geometricBounds; tf.geometricBounds = [y0, unit[3] - (unit2[3] - unit2[1]) - xoffset, y0 + (unit2[2] - unit2[0]), unit[3] - xoffset]; if (line != null) { line.remove(); } //line.geometricBounds = [ y, x0, y, unit[3] - (unit2[3] - unit2[1]) - xoffset ] ; line = page.graphicLines.add(tf.itemLayer, undefined, undefined, { label: "tmp-balline-" + tf.id, appliedObjectStyle: lstyle, geometricBounds: [ y, x0, y, unit[3] - (unit2[3] - unit2[1]) - xoffset] }); line.sendToBack(); _balloonarray.push([page.documentOffset, tf.id, y0, (y0 + unit2[2] - unit2[0])]); revertMmMode(document, backunit); document.viewPreferences.rulerOrigin = backruler; } } } } redrawProcessXMLforBalloon(document, items[i].xmlItems, reftagname, lstyle, xoffset, yoffset, lxoffset, lyoffset); } }