ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

WinMergeのJSONプラグインを作成してみた

JSONファイルが何かと便利!と色々使ってみてるけど、元データとの比較が面倒だったりしたのでWinMergeJSONプラグインを作成したときのメモ。

JSONファイルを整形して比較する。
整形には、JavaScriptJSONを使用する。
WinMergeプラグインは、VBScriptで作成されている。
WinMergeプラグインで、JavaScriptは動くのか?(動いた!)
でも、JSONを使用すると「'JSON' は宣言されていません」と出る。
json2.jsを使用すれば出来た!

json2.js
https://github.com/douglascrockford/JSON-js

作成したプラグインと、json2.jsをMergePluginsフォルダに入れます。

ファイル名:CompareJsonFiles.sct

<scriptlet>

<implements type="Automation" id="dispatcher">
    <property name="PluginEvent">
        <get/>
    </property>
    <property name="PluginDescription">
        <get/>
    </property>
    <property name="PluginFileFilters">
        <get/>
    </property>
    <property name="PluginIsAutomatic">
        <get/>
    </property>
    <method name="UnpackFile"/>
    <method name="PackFile"/>
</implements>

<script language="JavaScript" src="json2.js"></script>
<script language="JavaScript">
function getJson(filename) {
    return jsonParse(adoLoadText(filename, "utf-8"));
}
function jsonParse(text) {
    try {
        var obj = JSON.parse(text); 
        return JSON.stringify(obj, null, "    ");
    } catch(e) {
        return e.message;
    }
}
function adoLoadText(filename, charset) {
    var stream, text;
    stream = new ActiveXObject("ADODB.Stream");
    stream.type = 2;
    stream.charset = charset;
    stream.open();
    stream.loadFromFile(filename);
    text = stream.readText(-1);
    stream.close();
    return text;
}
</script>

<script language="VBS">

Option Explicit

Function get_PluginEvent()
    get_PluginEvent = "FILE_PACK_UNPACK"
End Function

Function get_PluginDescription()
    get_PluginDescription = "Json形式のファイルを整形し比較をする。"
End Function

Function get_PluginFileFilters()
    get_PluginFileFilters = "\.json$"
End Function

Function get_PluginIsAutomatic()
    get_PluginIsAutomatic = True
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
    Dim fso
    Dim foDst
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Set foDst = fso.OpenTextFile(fileDst, 2, True)
    foDst.Write(getJson(fileSrc))
    foDst.Close
    
    Set foDst = Nothing
    Set fso = Nothing
    
    pbChanged = True
    pSubcode = 0
    UnpackFile = True
End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
    PackFile = False
End Function

</script>
</scriptlet>

WinMergeプラグインは、JavaScriptでも良いんじゃないのかな?