045.【ID】作成バージョンを判定
CC13.1.1、CC14.0.2(Windows)で確認。
Array.filter()はES3で使うためのArray.filter - DTPabからお借りしています。
書いたコード
// Production steps of ECMA-262, Edition 5.1, 15.4.4.20 // https://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.20 // from http://javascript.boxsheep.com/polyfills/Array-prototype-filter/ if (!Array.prototype.filter) { Array.prototype.filter = function(callbackfn , thisArg) { "use strict"; var O = Object(this), lenValue = O.length, len = lenValue >>> 0, T, A, k, to, Pk, kPresent, kValue, selected; if (typeof callbackfn !== "function") { throw new TypeError(); } T = thisArg ? thisArg : undefined; A = new Array(); k = 0; to = 0; while(k < len) { Pk = k.toString(); kPresent = O.hasOwnProperty(Pk); if (kPresent) { kValue = O[Pk]; selected = callbackfn.call(T, kValue, k, O); if (!!selected) { A.push(kValue); to += 1; } } k += 1; } return A; }; } var definition = [ { "CCCS": "CS4", "major": "6"}, { "CCCS": "CS5", "major": "7"}, { "CCCS": "CS5.5", "major": "7.5"}, { "CCCS": "CS6", "major": "8"}, { "CCCS": "CC", "major": "9"}, { "CCCS": "CC 2014", "major": "10"}, { "CCCS": "CC 2015", "major": "11"}, { "CCCS": "CC 2016", "major": "12"}, { "CCCS": "CC 2018", "major": "13"}, { "CCCS": "CC 2019", "major": "14"} ] var log = ""; var appMajorVer = getAppVer(); var docMajorVer = getDocVer(app.activeDocument); var appCCCSVer = getCCCSVer(appMajorVer); var docCCCSVer = getCCCSVer(docMajorVer); var docVerPath = decodeURI(app.filePath).replace(appCCCSVer, docCCCSVer); if (appMajorVer === docMajorVer) { log = "作成バージョンは" + docCCCSVer + "です。現在のバージョンと一致しています"; } else { if (new Folder(docVerPath).exists) { log = "作成バージョンは" + docCCCSVer + "です。\rこのバージョンはインストールされています。" } else { log = "作成バージョンは" + docCCCSVer + "です。\rこのバージョンはインストールされていません。" } } alert(log); function getAppVer() { var fullVer = app.version; var majorVer = parseFloat(fullVer).toFixed(1); if (majorVer !== 7.5) { // CS5.5 majorVer = parseInt(majorVer, 10) } return majorVer; } function getDocVer(doc) { var docVer = doc.metadataPreferences.creator; var majorVer = docVer.replace("Adobe InDesign ", "").replace("CC ", "").replace(/ \(.+$/, ""); // 13.1/CS6 if (majorVer.indexOf("CS") === 0) { majorVer = getMajorVer(majorVer) } else { majorVer = parseInt(majorVer, 10); } return majorVer; } function getCCCSVer(ver) { var tmp = definition.filter(function (ele) { return ele.major === ver + ""; }) return tmp[0].CCCS; } function getMajorVer(ver) { var tmp = definition.filter(function (ele) { return ele.CCCS === ver + ""; }) return tmp[0].major; }
メモ
最終目標はバージョンを判定後、作成したバージョンで開いて他のスクリプトを実行する。
積み残しは大きく分けて以下の2点。
①マイナーバージョンの取得
②旧バージョンで開きなおす
マイナーバージョンの取得
- マイナーバージョンまで一致
- メジャーバージョンだけ一致
- 異なるバージョンで、インストールされている
- 異なるバージョンで、インストールされてない
上記4パターンの判定を行ってから別のスクリプトの処理に移りたい。
現状メジャーバージョンの比較しかできていない。
そのほか、
- Documentオブジェクトのマイナーバージョンを取得したい。
- app.verは「14.0.2.324」の形式
- doc.metadataPreferences.creatorは「Adobe InDesign CC 13.1 (Windows)」の形式
- そもそも開かないでバージョンを取得するやり方はないのか。
旧バージョンで開きなおす
var varsion = "13.1" var tmp= "//@target 'indesign-"+ varsion +"'\ralert("テスト")" eval (tmp);
みたいなことがしたい。
- 旧バージョンのInDesignはexecute()で起動できる。
var flag = new File("C:/Program Files/Adobe/Adobe InDesign CC 2018/InDesign.exe"); flag.execute();
- パッケージ版CSはアプリケーションのフォルダがCCとは別のところにあるので、「インストールされているかどうか」の判定のところが未対応。
実際に仕事で使う場面ではVBAと連携させるので、今回jsで積み残したところはVBAでやることになると思う。
①VBAで最新バージョンのInDesignを起動
②VBAから上記InDesignでこのスクリプトを実行
③このスクリプトで作成バージョンを取得し、txtを作成
④VBAで③のtxtを読み、該当バージョンのInDesignを起動
⑤④のInDesignで別のスクリプトを実行
というイメージ(③もVBAでやるべきなのでは…)。
その他
- JSでは後読みが使えない
- マイナーバージョンチェンジをどう考えるべきなのかという方針の問題
- OSの違いは判別しない処理になっている