0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TL; DR

1. JSONを選んでマクロを起動

テキスト中のJSONを選択した状態でマクロを起動

2. フィルタを書くと

「jqで選択範囲を整形」のプロンプトにjqのfilterを指定

3. 置き換わる!

expressionにしたがって選択範囲のJSONが変換され、その結果で置換される

はじめに

Meryは無料のテキストエディタで、軽量ながら正規表現検索やシンタックスハイライトが利用可能です。「VSCodeを開くほどでもないけどちょっとファイルを加工したい」というときに重宝しています。

今回は、Mery上でjqを適用できるようにするマクロを紹介します。

バージョン

  • Mery v2.6.7

jqは別途インストールしておいてください。

使い方

上記リポジトリをダウンロードし、Meryで jq.js を開いてください。

続いて、メニューバーの「マクロ」から「これを選択」を実行してください。マクロが登録されます。

image.png

以後、F4 を押すことで実行できます。文章中のJSONを選択した状態でマクロを実行してください。

実装

マクロはJScriptで記述しています。注意点として、最新のJSの文法 (const、アロー関数等)は使えません。

jq.js
function runJq(json, src) {
	var shell = new ActiveXObject('WScript.Shell');
	var cmd = 'jq.exe ' + src;
	
	// trim breaklines
	json = json.replace(/\s/g, '');

	var exec = shell.Exec(cmd);
	exec.StdIn.Write(json);
	exec.StdIn.Close();

	var out = exec.StdOut.ReadLine();
	while (exec.StdOut.AtEndOfStream == false) {
		out += exec.StdOut.ReadLine();
	}
	return out;
}

var json = document.selection.Text;
var src = Prompt("jqで選択範囲を整形", '-c "."');
var modified = runJq(json, src);
document.selection.Text = modified;

選択範囲を取得

まず、document.selection.Text で画面上の選択範囲のテキストを取得します。

var json = document.selection.Text;

jqのフィルタを受け取る

続いて、JSONを加工するためのフィルタを受け取ります。Prompt で入力画面を表示し、受け取った内容をjqの引数に使用します。

// デフォルト値は `-c "."` (空白を除去しそのまま表示)
var src = Prompt("jqで選択範囲を整形", '-c "."');

jqを起動する

本体の実装、jqを呼び出す処理です。wscriptを呼び出してシェルを実行しています。
組み込みAPIの shell.run でもシェル操作ができますが、標準出力が取得できないため今回は採用しませんでした。

var modified = runJq(json, src);
function runJq(json, src) {
	var shell = new ActiveXObject('WScript.Shell');
	var cmd = 'jq.exe ' + src;
	
	// 標準入力は1行で渡さないと上手く処理できないため、空白を除去
	json = json.replace(/\s/g, '');

    // シェル実行
	var exec = shell.Exec(cmd);
	exec.StdIn.Write(json);
	exec.StdIn.Close();

    // 標準出力を末尾まで読み込み
	var out = exec.StdOut.ReadLine();
	while (exec.StdOut.AtEndOfStream == false) {
		out += exec.StdOut.ReadLine();
	}
	return out;
}

結果を書き戻す

最後に、整形後のJSONを再び document.selection.Text に代入することで、選択範囲を更新します。
これで、整形結果に置換することができました。

おわりに

以上、jqをMeryで使用するマクロの紹介でした。応用すれば他のコマンド (awk, grep 等)でも使えそうなので、機会があれば改造してみたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?