2012-10-17

EmEditorマクロでJavaScriptのコードを整形する

EmEditorでJavaScriptの整形用のマクロを作成してみました。
JavaScriptの整形はjsbeautifier.orgの整形が良さそうだったので、jsbeautifierのコードを利用してマクロを作成しました。

■目的
JavaScriptのコードをEmEditor上で整形する。
整形には、jsbeautifierの整形コード(beautify.js)を使用する。

■環境
OS Windows XP
EmEditor EmEditor Professional (32-bit) Version 11.0.5

■JavaScritp整形コード(beautify.js)のダウンロード
jsbeautifier.orgが使用しているJavaScriptを整形するJavaScriptのコード「beautify.js」をhttps://github.com/einars/js-beautifyからダウンロードします(*1)。
*1:この説明では、2012-10-04時点での「beautify.js」を使用しています。

■EmEditor用JavaScritp整形マクロファイルの作成
EmEditor用のマクロファイル(beautity-js.jsee)を作成します。

【マクロファイル(beautity-js.jsee)のコード】
#include "include/beautify.js";
/*
 beautify for EmEditor
 JavaScript
 Created by Shinichi Yamaura.
*/
document.selection.SelectAll();
// beautifyのオプション設定
var options = {
 'indent_size': 1,
 'indent_char': '\t',
 'preserve_newlines': false,
 'break_chained_methods': false,
 'jslint_happy': true,
 'brace_style': "collapse",
 'space_before_conditional': true,
 'unescape_strings': false
}
code = document.selection.Text;
// 整形前に改行コードをLFに変換(beautifyのコードを実行用)
code = code.replace(/\r\n/g, '\n');
// beautifyの実行
var code = js_beautify(code, options);
// 整形後に改行コードをCR+LFに変換
code = code.replace(/\n/g, '\r\n');
document.selection.DestructiveInsert(code);
document.selection.StartOfDocument(false);

■整形マクロの説明
「beautify.js」をインクルードして、マクロから「beautify.js」を利用しています。
【注意】#includeは、スクリプトのメイン コードの上の最初の行に指定する必要があります。

編集しているコードを「beautify.js」の関数「js_beautify()」を使用して整形し、整形前のコードを上書きして整形後のコードを挿入します。

「js_beautify()」では、二番目の引数に整形のオプションを指定します。マクロの中で、beautifyのオプション指定をしているので、好みに合わせて設定してください。
beautifyのオプションは「beautify.js」のコメントに記載されています。補足説明にコメントに記載されているオプションの説明を整理しました。

マクロ内で、改行コードの置換をしています。これは補足説明を参照してください。

■ファイルの配置
「JavaScritp整形コード(beautify.js)」と「マクロファイル(beautify-js.jsee)」をEmEditorマクロフォルダに配置します。
「JavaScritp整形コード」は、EmEditorマクロフォルダ内にサブフォルダ(include)を作成して配置します。

My Macros
│  beautify-js.jsee
│
└─include
        beautify.js

■実行方法
EmEditorのマクロで、マクロファイル(beautify-js.jsee)を実行してください。

■補足説明

●改行コード
マクロを作成している時に、改行コードで問題が発生したので、問題とその対応についての説明を記載しておきます。
EmEditorは、改行コードの混在ができるため「js_beautify()」での整形前に、編集しているテキストのコードの改行コードをLFに変換してから整形しています。
「js_beautify()」で出力されるコードは、改行コードをLFで出力されます。Windowsでは、改行コードをCR+LFにしたいので「js_beautify()」の整形後に改行コードをCR-LFに変換しています。

●js_beautify()のオプション
2012-10-04時点
オプション 既定値 説明
indent_size 4 indentation size
indent_char space character to indent with
preserve_newlines true whether existing line breaks should be preserved
max_preserve_newlines unlimited maximum number of line breaks to be preserved in one chunk
jslint_happy false if true, then jslint-stricter mode is enforced
brace_style "collapse" "collapse" | "expand" | "end-expand" | "expand-strict" put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line.
space_before_conditional true should the space before conditional statement be added, "if(true)" vs "if (true)"
unescape_strings false should printable characters in strings encoded in \xNN notation be unescaped, "example" vs "\x65\x78\x61\x6d\x70\x6c\x65"
opt_break_chained_methods false 2012-10-04時点でコメントに記載がないがコード内では実装されている。メソッドチェーンに関するオプション。

1 件のコメント:

ponta さんのコメント...

最新のものにアップデートしていただけないでしょうか。うまくいきません。