LoginSignup
1
0

More than 1 year has passed since last update.

InDesign スクリプト テーブルをXMLに変換

Last updated at Posted at 2021-06-15

テーブルをXMLに変換するスクリプトは、これで良いのかな・・・?

/*
更新 2021/06/15
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "テーブルをXMLに変換";

//スクリプトの動作指定(一つのアンドゥ履歴にする、及び、アンドゥ名)
app.doScript(function () {

    // XMLのエンコーディング
    var encoding = "Shift_JIS"

    // ダイアログ
    var dialogueFlg = confirm("選択したテキストフレームにある最初のテーブルをXMLに変換します。"
    + "\r\r" + "ヘッダー(最上段の行)は変換されません。"
    + "\r\r" + "要素名の最初には数字(0~9)や空白等が使えませんので注意して下さい。"
    + "\r\r" + "テーブルの例"
    + "\r" + "要素名" + "\t" + "要素の内容" + "\t" + "属性1" + "\t" + "属性1の内容" + "・・・等々","", scriptName);

    // Noの場合
    if (dialogueFlg == false) {

        // 終了
        exit();
    }

    // タグ名のプレフィックスを入力
    var tagNamePrefix = prompt("要素名のプレフィックスが必要な場合は入力して下さい。","",scriptName);

    // キャンセルされた時の処理
    if(tagNamePrefix == null){

        // スクリプトを終了
        exit();
    }

    // 対象のストーリー
    var targetStory;

    // 成型されたXML
    var moldXML = "<?xml version='1.0' encoding='" + encoding + "' standalone='yes'?>" + "\r" + "<Root>";

    // 選択がある場合
    if(app.activeDocument.selection.length > 0){

        // 選択オブジェクトのストーリーを入れる
        targetStory = getStory(app.activeDocument.selection[0]);

        // テーブルがある場合
        if(targetStory.tables.length > 0){

            // ヘッダーを除いた行の数だけ繰り返す
            for(var i = 1; i < targetStory.tables[0].rows.length; i++){

                // 行にセルが2つ以上ある場合
                if(targetStory.tables[0].rows[i].cells.length >= 2){

                    // セルが空ではない場合
                    if(targetStory.tables[0].rows[i].cells[0].contents != ""){

                        // XML成型
                        moldXML += "\r" + "<" + tagNamePrefix + targetStory.tables[0].rows[i].cells[0].contents;

                        // 三っ目のセルから初めて一つ飛ばしてセルの数だけ繰り返す
                        for(var ii = 2; ii < targetStory.tables[0].rows[i].cells.length; ii += 2){

                            // セルに内容がない場合
                            if(targetStory.tables[0].rows[i].cells[ii].contents != ""){

                                // 次のセルが存在する場合
                                if(ii + 1 < targetStory.tables[0].rows[i].cells.length){

                                    // XML成型
                                    moldXML += " " + targetStory.tables[0].rows[i].cells[ii].contents + "='" + targetStory.tables[0].rows[i].cells[ii+1].contents + "'";
                                }
                            }
                        }

                        // XML成型
                        moldXML += ">"  + targetStory.tables[0].rows[i].cells[1].contents + "</" + tagNamePrefix + targetStory.tables[0].rows[i].cells[0].contents + ">"
                    }
                }
            }
        }

        // 文字を追加
        moldXML += "\r" + "</Root>";

        // ダイアログX座標
        var dialogWidthXCoordinates = 0;

        // ダイアログY座標 
        var dialogWidthYCoordinates = 0;

        // ダイアログ幅
        var dialogWidth = (app.activeDocument.layoutWindows[0].bounds[3] - app.activeDocument.layoutWindows[0].bounds[1]) / 2

        // ダイアログ高さ
        var dialogHeight = (app.activeDocument.layoutWindows[0].bounds[2] - app.activeDocument.layoutWindows[0].bounds[0]) / 2

        // 段落スタイル選択用ダイアログ作成
        var textWindow = new Window("dialog", scriptName, [dialogWidthXCoordinates, dialogWidthYCoordinates, dialogWidthXCoordinates + dialogWidth, dialogWidthYCoordinates + dialogHeight]);

        // エディットテキスト追加
        textWindow.add("edittext",[ 20, 20, dialogWidth - 20, dialogHeight - 20],moldXML,{readonly:true,multiline:true});

        // 中央に
        textWindow.center();

        // 表示
        textWindow.show();
    }


//スクリプトの動作指定の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);

/* ストーリーを取得する関数、引数(オブジェクト)の宣言 */
function getStory(anyObject) {

    // parentStoryプロパティが存在する場合
    if (anyObject.hasOwnProperty("parentStory") == true) {

        // エラー処理
        try{

            // parentStoryの値がある場合
            if (anyObject.parentStory) {

                // コンストラクタ名を戻す
                return anyObject.parentStory;
            }

        // エラーの場合
        }catch(e){

            // 抜ける
            return;
        }

    // Applicationの場合
    } else if (anyObject.constructor.name == "Application") {

        // 抜ける
        return;
    }

    // オブジェクトの階層を一つ上げて再帰関数
    return getStoryConstructorName(anyObject.parent);
}
/* ストーリーを取得する関数の宣言終了 */
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0