Monday, February 27, 2012

スニペット


Word のオートコレクト機能は、スペルミスを修正するためのものだけど、それを、入力支援に使うこともできる。ただ、登録や管理が面倒なので、マクロやデータの直接編集などで対応できないかと、いろいろ考えてはいる(Wordのオートコレクトで用語変換)。


そちらの方は、まだ進捗がないのだけど、EmEditorのスニペット機能なら、登録や管理がもう少し楽な気がして、ちょっとやってみた。

スニペットも、ふつうは個別に登録していくのだけど、インポート/エクスポート機能があるので、このあたりで工夫できそうだ。試しに、今登録してあるスニペットデータをエクスポートしてみると、比較的単純なフォーマットになっている。なので、用語集のような簡単なデータを、スニペットのインポート用データに変換する方針でやってみた。

EmEditorのマクロ(JavaScript)を使ってもよいのだけど、どうせJavaScriptならということで、WSH上でやってみることにした。JavaScriptもWSHも勉強しはじめたところなので、「マンガで分かる JavaScriptプログラミング講座」(25)のコードを読みながら、というか、そこに載っているコードを修正して、なんとか動くものができた。

WSH用のスクリプトは、単に、VBScript だけとか、Jscript (JavaScript) だけでも書けるが、ファイルの関連付けなどで不具合が起きないように、講座では、"sample.wsf"から、"cmnFunc.js" を利用するやり方が紹介されている。簡単なコードなんだろうけど、自分にはまだ難しいので、"cmnFunc.js"をそのまま使わせてもらい、"sample.wsf"を修正することにした(ファイル名"snpgen.wsf")。

エラー処理もテストも不十分なので、公開するようなものではないのだけど、自分用のメモということで(笑)

[snpgen.wsf]
<job id="main">
  <script language="JavaScript" src="cmnFunc.js"></script>
  <script language="JavaScript">
    // グローバル変数
    var args;        // 引数
    var dropFilePath = "";  // ドロップ ファイルのパス
    var dropFileStr  = "";  // ドロップ ファイルの中身の文字列

    // メイン ルーチン
    init();      // 初期化処理
    main();      // メイン処理

    // 初期化処理
    function init() {
      args = WScript.Arguments;  // 引数のオブジェクト
      if (args.length >= 1) {
        dropFilePath = args(0);
        dropFileStr  = cmnFunc.readFile(dropFilePath);
      }
    }

    // メイン処理
    function main() {
      if (dropFilePath == "") {
        WScript.Echo("ドロップ ファイルなし");
      } else {
        var i, j, wkstr, pwkstr, pwlen, opstr, opfn, wfpath, tempstr, namelet, nameflgm;
        var opH1 ="<?xml version=\"1.0\"?>\n<!--EmEditor Snippets file-->\n<Snippets>\n<SnippetTree>\n\t<Folder Name="
        var opH2 = " Flags=\"1\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\">\n";
        var opM1 ="\t\t<Item Name=\""
        var opM2 ="\" Flags=\"4\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\\\" Text=\"";
        var opM3 ="\" Trigger=\"";
        var opM4 ="\" Tip=\"\" ShortcutKey=\"0\" ShortcutVirt=\"0\"/>\n"
        var opT ="\t"+"</Folder>"+"\n"+"</SnippetTree>\n</Snippets>";

        namelet = dropFilePath.split(".");
        nameflgm = namelet[0].split("\\");
        opfn = nameflgm[nameflgm.length - 1];
        wfpath = namelet[0] +".eesnip"

        opstr = opH1 + "\"" + opfn + "\"" +opH2;
        pwkstr = (dropFileStr + " ").split("\n");
        pwlen = pwkstr.length;
        wkstr = new Array(pwlen);
        for(i = 0; i < pwlen; i++) {
          wkstr[i]=pwkstr[i].split("\t");
          tempstr = wkstr[i][1];
          wkstr[i][1] = tempstr.slice(0, tempstr.length-1);
          opstr = opstr + opM1 + wkstr[i][0] + opM2 + wkstr[i][1] + opM3 + wkstr[i][0] + opM4;
        }
        opstr = opstr + opT;
        cmnFunc.writeFile(wfpath, opstr);
      }
    }
  </script>
</job>

お見苦しいコードで恐縮です。。


で、用語集のような元ファイルを、snpgen.wsfのアイコンにドラッグ&ドロップすると、スニペットデータが出来る(上記講座の"cmnFunc.js"も予めダウンロードしておく必要があります)。

元ファイルというのは、タブ区切りのテキストファイルで、例えば、

[test.txt]
tpi(タブ)the present invention
1e (タブ) first embodiment
2e (タブ) second embodiment
3e (タブ) third embodiment
wrt (タブ) with reference to
iaw (タブ) in accordance with

という感じ。各行の先頭に、トリガの符号を入れ、タブを打ってから、変換後の語句を入れ、行末に改行コード(当たり前か…)。なお、最終行の行末には、改行コードを入れない「仕様」になっています(苦笑)
このtest.txtを、snpgen.wsfにドラッグ&ドロップすると、こんなのが出来る。

[test.eesnip]
<?xml version="1.0"?> <!--EmEditor Snippets file--> <Snippets> <SnippetTree> <Folder Name="test" Flags="1" ConfigEdit="" ConfigMacro="" ConfigsAssociate=""> <Item Name="tpi" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="the present invention" Trigger="tpi" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="1e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="first embodiment" Trigger="1e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="2e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="second embodiment" Trigger="2e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="3e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="third embodiment" Trigger="3e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="wrt" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="with reference to" Trigger="wrt" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="iaw" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="in accordance with" Trigger="iaw" Tip="" ShortcutKey="0" ShortcutVirt="0"/> </Folder> </SnippetTree> </Snippets>

この test.eesnipを、EmEditorのスニペットインポート機能で取り込む。
すると、"tpi"+tab と打つだけで、"the present invention"と自動変換される。


それから、特許の場合には、構成要素に参照番号がついたものを入力することが多いので、それに特化したものも作った。

[snppat.wsf]
<job id="main">
  <script language="JavaScript" src="cmnFunc.js"></script>
  <script language="JavaScript">
    // グローバル変数
    var args;        // 引数
    var dropFilePath = "";  // ドロップ ファイルのパス
    var dropFileStr  = "";  // ドロップ ファイルの中身の文字列

    // メイン ルーチン
    init();      // 初期化処理
    main();      // メイン処理

    // 初期化処理
    function init() {
      args = WScript.Arguments;  // 引数のオブジェクト
      if (args.length >= 1) {
        dropFilePath = args(0);
        dropFileStr  = cmnFunc.readFile(dropFilePath);
      }
    }

    // メイン処理
    function main() {
      if (dropFilePath == "") {
        WScript.Echo("ドロップ ファイルなし");
      } else {
        var i, j, wkstr, pwkstr, pwlen, opstr, opfn, wfpath, tempstr, namelet, nameflgm;
        var opH1 ="<?xml version=\"1.0\"?>\n<!--EmEditor Snippets file-->\n<Snippets>\n<SnippetTree>\n\t<Folder Name="
        var opH2 = " Flags=\"1\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\">\n";
        var opM1 ="\t\t<Item Name=\""
        var opM2 ="\" Flags=\"4\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\\\" Text=\"";
        var opM3 ="\" Trigger=\"";
        var opM4 ="\" Tip=\"\" ShortcutKey=\"0\" ShortcutVirt=\"0\"/>\n"
        var opT ="\t"+"</Folder>"+"\n"+"</SnippetTree>\n</Snippets>";

        namelet = dropFilePath.split(".");
        nameflgm = namelet[0].split("\\");
        opfn = nameflgm[nameflgm.length - 1];
        wfpath = namelet[0]+".eesnip"

        opstr = opH1 + "\""+ opfn + "\""+opH2;
        pwkstr = (dropFileStr + " ").split("\n");
        pwlen = pwkstr.length;
        wkstr = new Array(pwlen);
        for(i = 0; i < pwlen; i++) {
          wkstr[i]=pwkstr[i].split("\t");
          tempstr = wkstr[i][1];
          wkstr[i][1] = tempstr.slice(0, tempstr.length-1);
          opstr = opstr + opM1+wkstr[i][0]+opM2+wkstr[i][1]+" "+wkstr[i][0]+opM3+wkstr[i][0]+opM4;
        }
        opstr = opstr + opT;
        cmnFunc.writeFile(wfpath, opstr);
      }
    }
  </script>
</job>

元データのサンプルは、こんな感じ。

[test2.txt]
100 (タブ) information processing apparatus
110 (タブ) imaging device
120 (タブ) A/D converter
130 (タブ) controller

これを、 snppat.wsfにドラッグ&ドロップすると、

[test2.eesnp]
<?xml version="1.0"?>
<!--EmEditor Snippets file-->
<Snippets>
<SnippetTree>
  <Folder Name="test2" Flags="1" ConfigEdit="" ConfigMacro="" ConfigsAssociate="">
    <Item Name="100" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="information processing apparatus 100" Trigger="100" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="110" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="imaging device 110" Trigger="110" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="120" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="A/D converter 120" Trigger="120" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="130" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="controller 130" Trigger="130" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
  </Folder>
</SnippetTree>
</Snippets>

が出来る。これを、EmEditorにインポートすると、"100"+tab と打つだけで、"information processing apparatus 100" と、名称+参照符号の形式で入力される。

インポートしたスニペットは、1つのスニペットフォルダにまとまっているので、参照番号用のスニペットのように、案件単位でしか使わないものは、フォルダ単位ですぐに削除できるので、管理が簡単。

こんな稚拙なコードではなくて(笑)、標準でサポートしてもらえるといいんだけど。

No comments:

Post a Comment