ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

InDesignのJavaScriptのenumを解析してわかりやすい形にしてみる

こんばんは。

急に寒くなって稼働限界を超えているこうちゃんです。

レノくんが側から離れません。

レノくんカイロ、完全始動。

さて。

InDesignのプロパティなどをJavaScriptで取得したときにenumで返されることがあります。

9桁、もしくは10桁の数値の並びのアレです。

たとえばStoryTypesのREGULAR_STORYのenumは1919382388です。

こんなの数値で返されてもなんぞコレ?です。

で、なんか簡単に調べる方法がないかなーと調べてたら下記を見つけました。

カネムーメモ: ExtendScript ToolKitのヘルプから、10桁数値→人間語のハッシュマップを生成する

早速CS4のXMLファイルで試してみたんだけど、うまくいかない。

どうやら読み込んでいるXMLファイルが大きすぎて開けない模様。

試しに行数を半分にしたら読み込めた。

そこでPerlで読み込んでJavaScriptに渡そうと思ったんだけど、これもうまくいかない。

やっぱりでかすぎるんだなー。

いろいろ試しているうちに面倒くさくなったので結局PerlでXMLファイルを解析してハッシュを作成することに。

PerlでXML解析するにあたってXML::LibXMLというモジュールをインストールした。

perlbrewでcpanmを入れているので下記で簡単にインストールできたよ。

cpanm XML::LibXML

パスもすんなり通るし、便利だわー。

XML::LibXMLは何度か使ったことあるのですが、メソッドとか覚えてないw

CPANのXML::LibXMLを見ながら書けばなんとかなりますね。

英語読まなくてもなんとかなりますw

XML::LibXML - search.cpan.org

そんなこんなしながら気づいたら数時間かかってた…。

寒いし、手が冷たいよぉ。

試しにモジュールにして他のPerlスクリプトから呼び出せるようにしてみた。

勉強勉強。

コードはこちら。

IDJS_enumAnalyze.pm

package IDJS_enumAnalyze;

use strict;

use warnings;

use XML::LibXML;

sub make($) {

my %enumHash;

my $self = shift; # 1つ目は自分のModule名が入っている

my $xmlFilePath = shift; # 渡された引数を変数に代入

my $parser = XML::LibXML->new(); # オブジェクト生成

my $xmlDoc = $parser->parse_file($xmlFilePath);

my @classdefNodeList = $xmlDoc->findnodes('//dictionary/package/classdef');

foreach my $classdefNode (@classdefNodeList) {

if ($classdefNode->exists('@enumeration')) {

my $classdefName = $classdefNode->findvalue('@name');

my @propertyNodeList = $classdefNode->findnodes('elements/property');

foreach my $propertyNode (@propertyNodeList) {

my $propertyName = $propertyNode->findvalue('@name');

my @valueNodeList = $propertyNode->findnodes('datatype/value');

foreach my $valueNode (@valueNodeList) {

my $enumValue = $valueNode->textContent;

$enumHash{$classdefName}{$enumValue} = $classdefName.'.'.$propertyName;

}

}

}

}

# print $enumHash{'storyTypes'}{1919382388};

return \%enumHash;

}

1;

書いてみたらすごいシンプルなので、あっけない感じ。

んで、このモジュールを呼び出すコードがこちら。

test.pl

use FindBin qw($Bin);

use lib "$Bin";

use IDJS_enumAnalyze;

my $property = shift;

my $enum = shift;

# CS4

my $xmlFilePath = $ENV{HOME}.'/Library/Preferences/ExtendScript Toolkit/3.0/omv$indesign-6.0$6.0.xml';

my $hash = IDJS_enumAnalyze->make($xmlFilePath);

# print %hash;

# print $$hash{'StoryTypes'}{1919382388}."\n";

print $$hash{$property}{$enum}."\n";

<使い方>

1.先ほどのモジュールを「IDJS_enumAnalyze.pm」という名前で「test.pl」と同階層に保存してください。

2.ターミナルで下記を実行。

perl test.plを保存したパス class名 enumの値
例。

perl test.pl StoryTypes 1919382388

3.下記結果が出れば成功。

StoryTypes.REGULAR_STORY

あ、MountainLionで書いているので、Windowsでの動作確認はしていません。

でもXMLファイルのパスを書き換えればいけるんじゃないかしら。

これをどう使うかまでは考えてないのですが、ハッシュじゃなくて再度XMLファイルに保存してそれをJavaScriptで再度解析すればJavaScriptとすんなり連携できて便利かなーと思っていたりします。

余談。

このPerlはCotEditorで書いたんだけど、書きやすいですね。

シンタックススタイルも効きますし、コード補完も効きます。

ただPerlのシンタックススタイルは少し手を加えています。

あとキーバインドも手を加えていて「Ctrl+/」で「# 」を入力するようにしています。

#は普通に打ってもいいんですが、ショートカットのほうが実際使いやすいのでw

あ、ちなみにRubyもCotEditorで書いてますよ。