こんばんは。
急に寒くなって稼働限界を超えているこうちゃんです。
レノくんが側から離れません。
レノくんカイロ、完全始動。
さて。
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
そんなこんなしながら気づいたら数時間かかってた…。
寒いし、手が冷たいよぉ。
試しにモジュールにして他の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で書いてますよ。