2015年10月15日

AltHSPをMeryのマクロ内で動かす

(2016/04/23 追記)

 AltHSPの公開サイトがGitHubに変更されたのに合わせて記事を修正。

AltHSPとは

 AltHSPは、HSPよりも簡潔な独自の構文で書かれたスクリプトをHSPスクリプトに変換するコンバーターです。AltHSPの構文は、主にHSPのモジュール機能がらみのコードを簡潔に書くために作られていますが、その他にループを簡潔に書ける構文なども用意されています。独自の構文が用意されていない部分については、HSPの構文でそのまま書くことができます。

 AltHSP自体はJavaScriptで書かれていて、簡単にウェブページに組み込んで利用できる形で公開されており、動作確認のためのサンプルのhtmlファイルも本体と共にダウンロードできます。

AltHSPはデフォルトの利用方法ではMeryマクロ内で動かせない

 私が普段使っているMeryというテキストエディタが、JavaScript(JScript)でマクロを書いて機能を拡張できるようになっているので、このAltHSPを組み込んで、AltHSPスクリプトを一発で「コンバート→コンパイル→デバッグ実行」できるマクロを作りたいと思ったのですが、デフォルトで想定されているjQueryをインクルードする形では、(JavaScriptをよく知っている人からすれば当然のことなのだろうとは思いますが)Meryのマクロ内では動かすことができません。

AltHSPをMeryマクロに組み込む方法

 そこで、幸いAltHSPで使われているjQueryの機能が$.trim、$.grep、$.mapの3つのメソッドだけだったので、jQueryをインクルードする代わりに、これらのメソッドを自分で書いて、それをくっつける形でマクロに組み込むことにしました。以下がそのコードです(jQueryのマニュアルを参考にして書きましたが、完璧ではないかも)。

var $ = 
{
trim: function( t )
{
var newt = t.replace( /^(\s+|\s+|\u3000+)/g, '' );
return newt.replace( /(\s+|\s+|\u3000+)$/g, '' );
},
map: function( a, f )
{
var newa = [];
for( var i in a )
newa.push( f( a[i] ) );
return newa;
},
grep: function( a, f )
{
var newa = [];
for( var i in a )
{
if ( f( a[i] ) )
newa.push( a[i] );
}
return newa;
}
};


このコードを例えば、AltHSPのコードの前にくっつけて、さらにそれを自作のマクロのコードにコピペするなりインクルードするなりして使います。

AltHSPを組み込んで作った、AltHSPスクリプトを一発でデバッグ実行するMeryマクロのサンプル

#include "myalthsp-0.0.1.js" // 上に載せた独自コードをくっつけたAltHSP

var fs = new ActiveXObject('Scripting.FileSystemObject');
var shell = new ActiveXObject('WScript.Shell');
var doc = Document;

//althspスクリプト保存
doc.Save();

//hspスクリプト保存
var hspScr = convertAltHSP( doc.text );
var hspScrPath = doc.FullName + ".hsp";
var ts = fs.CreateTextFile( hspScrPath, true, false );
ts.Write( hspScr );
ts.Close();

//保存したhspスクリプトを実行
var cmd = "C:\\Users\\hoge\\hsp34\\chspcomp.exe /id"; // 自分の環境に合わせて書き換える
shell.Run( cmd + ' "' + hspScrPath + '"' );


 サンプルなので、単一ファイルのコンバートしかできません。マクロ自体と処理対象のAltHSPスクリプトをUTF-8の文字コードで書いたものを使って、Windows7で最低限の動作確認をしました。

 HSPスクリプトをコンパイル・実行するために使っているプログラムは、こちらで公開している自作のプログラムです。似たような別のプログラムでもいけるはずです。
posted by chrono at 13:45| Comment(0) | TrackBack(0) | HSP