監視しているSwiffyHTMLからJSONを抽出するnode.jsスクリプトを書いてみる
ここのところ、JSFLでSwiffy出力後に手を加えたり抽出したりする仕組みを書いているのですが、実行し忘れたりすることも多いので、node.jsのファイル監視を利用して「監視しているSwiffyHTMLからJSONを抽出する」node.jsスクリプトを書いてみました。
今回の仕組み
- node.jsスクリプト名はswiffywatch.jsとする
- 特定のファイルを監視します
- 今回はtest.flaから出力されるtest.swf.htmlをターゲットとします
- 変化があるとtest.swf.html内のswiffyJSONをとりだす
- 抽出したJSONはtest.jsonとして保存する
ファイル監視
当初、fs.watchを使っていたのだけどWindowsのせいかファイル監視タイミングが複数走るので以下のスクリプトを参考(というかそのままに)実装しました。
- 学ばない日があろうか: windowsのnode.jsで自動化のすゝめ
- 実際にはこの症状が起きた。
- Windowsでのwatchによるファイル更新監視 #Node.js #JavaScript - Qiita
- 回避コードありがたや。
- fs.watch
- fs.watchfile
Swiffyの抽出
Swiffyの抽出部分はswiffyobject = 以降を正規表現で拾います。JSFLで整えた処理をそのまま使うことが出来ました。JavaScriptで出来ているコードで共通化できていいところ。
var pattern = new RegExp( 'swiffyobject = {(.*)}' , 'gi' );
var results = pattern.exec( htmlStr );
var swiffyStr = '{' + results[1] + '}';
参考までに最近のSwiffyHTMLを載せておきます。(JSON部分は大量なので省略)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Swiffy output</title>
<script src="https://www.gstatic.com/swiffy/v5.0/runtime.js"></script>
<script>
swiffyobject = {"tags":~~~(省略)~~~};
</script>
<style>html, body {width: 100%; height: 100%}</style>
</head>
<body style="margin: 0; overflow: hidden">
<div id="swiffycontainer" style="width: 240px; height: 320px">
</div>
<script>
var stage = new swiffy.Stage(document.getElementById('swiffycontainer'),
swiffyobject);
stage.start();
</script>
</body>
</html>
実際に書いたスクリプト
上記の事を加味して以下のように書いてみました。
swiffywatch.js
// 監視するファイル名
var filename = 'test.swf.html';
// __________________________________________________________________
// requireを使ったモジュール読み込み
var fs = require('fs');
var path = require('path')
// 対象ファイル
var file = __dirname + path.sep + filename;
// 開始タイトル
console.log( '[' + filename + '] ファイル監視');
console.log( '--------------------------------' );
// ファイル更新チェックプロセスの開始
if ( process.platform === 'win32' ) {
// Windows用
fs.watchFile( file, SaveSwiffyJSON );
} else {
fs.watch( file, SaveSwiffyJSON );
}
// 対象のファイルからSwiffyの抽出
function SaveSwiffyJSON(){
// readFileで対象ファイルを読み込んで処理開始
fs.readFile( file , function ( err , data ) {
// エラー処理
if( err ) {
console.error( 'ファイルが存在しません。' );
process.exit(1);
}
// 実際の抽出
var htmlStr = data;
var pattern = new RegExp( 'swiffyobject = {(.*)}' , 'gi' );
var results = pattern.exec( htmlStr );
var swiffyStr = '{' + results[1] + '}';
// 抽出したJSONデータの保存
var jsonPath = path.dirname( file ) + path.sep + path.basename( file , '.swf.html' ) + '.json';
var writableStream = fs.createWriteStream( jsonPath );
writableStream.write( swiffyStr );
writableStream.end();
// 結果表示
console.log( 'ファイルが更新されました' );
console.log( '[' + jsonPath + '] に保存しました' );
console.log( '--------------------------------' );
});
}
実行してみた
実際に動かしてみます。
ファイル構成
ファイル構成はtest.flaと同階層にswiffywatch.jsがある構成となっています。
監視開始
コマンドプロンプトを開いて
node 実行するフォルダパス\swiffywatch.js
と打って監視を開始します。
[test.swf.html] ファイル監視
--------------------------------
と出てきます。
test.flaからSwiffyを書き出す
早速、test.flaからSwiffyを書き出してみます。すると、SwiffyHTMLを書きだしたと同時に、先ほどのコマンドプロンプトでは以下のように反応します。
[test.swf.html] ファイル監視
--------------------------------
ファイルが更新されました
[C:\**********************\test.json] に保存しました
--------------------------------
と出て、フォルダ内以下のようになります。
無事にtest.jsonにはtest.swf.htmlから抽出したJSONデータが出力されました!
以後、ファイル監視なので変更されれば随時書きだされます
このコードは当然ファイル監視なのでSwiffyHTMLの内容が変更されれば随時書きだされます。
おわりに
いかがでしたでしょうか。
node.jsはサーバーサイドスクリプトとして注目されていますが、このように手元の処理もフォローできるコードがすぐ書けるのも魅力ですね~。いろいろ使えそう。
今回もファイル一式置いておきます。
ファイル一式ダウンロード:node.js_swiffy_watch.zip
それでは、よき node.js Life を!

