簡単にできる方法は得られませんでしたが少し手間をかけた方法ならできましたのでコメントしてみます。
本回答は自分でツールのカスタマイズコードを書く方法ですので手軽とは言い難いです。もし解にならなさそうなら読み捨ててください。
お使いの方法はJavascriptのモジュールjs-beautifyを利用していると思います。ご存知かと思いますがjs-beautifyのオプションにはご質問のようなことをするオプションはないとおもいます。
難読化したソースを解析する記事をいくつか見ましたが基本的な整形ツールを使った後にIDEを使って手で整形するといったものを見かけました、自分はIDEでのjavascript整形について残念ながらコメントできる知識がありません。有償版のIntelliJだとできたりしないのかなと想像する程度です。
そこでjavascriptの構文解析が可能なesprimaとそれに基づく整形ツールescodegenを試してみました。
esprimaとescodegenはいずれもjavascriptでの実装でありnpmでインストールできます。
自分の戦略は以下です。
- escodegenで一旦基本的な整形をする(js-beautifyでもいいと思います)
- 整形後のソースに対してesprimaで構文解析しつつ一部のコードを置き換える
esprimaにはparse関数(AST「=抽象構文木」の生成)と、traverse関数(ASTをトラバースして興味のある構文要素についてのみ特定の処理を行う)があります。本件の処理対象の構文はSequenceExpressionとConditionalExpressionになるのでこの2つについてソースを整形する処理を書きました。
処理のポイントは
- estraverseへASTおよび興味のある構文に対する関数をオプションで渡す
SequenceExpression(カンマで区切られた式の並び)とConditionalExpression(cond ? e1 : e2)の2つについてそれぞれ指定関数を呼び出すようにオプションを渡します。
無条件にカンマで折り曲げるとfor (i = 0, i = 2; i < N; i++, j++)
といったものもi, jで改行されてしまいます。それはうまくないと感じたので上位構文がExpressionStatementのときだけ変換するようにしました。
javascriptはScalaなどと違いif文は式ではありませんので、値を必要とする場所にかかれたConditionalExpressionをif文に変更すると文法エラーになってしまいます。それに注意し上位がExpressionStatementのときだけ変換するようにします。
上記のコールバックが呼ばれた際に構文木の中に元のソース上文字範囲も入っていますので、無関係な部分は結果テキストへ単純マージし、興味のある範囲だけ編集した結果を結果へマージする感じです。
結果は以下の通りです。(ツールは単なるnodejsアプリとして作ってます)
javascript
1// (1)escodegenの整形結果
2for (i = 0, j = 1; i < 10; i++, j++)
3 a = {}, a = 1 * 1, a = 2 * 2, a = 3 * 3, a = 4 * 4, a > 1 ? 1 : 2;
4(n++, n > 0) ? count = 1 : count = 0;
5while (i = 0, j > 1)
6 a = 1, b = 2;
7do {
8 a = 1, b = 2;
9 i == 1 ? 2 : 3;
10} while (i = 1, j > 2);
11a = 1, (b = 1, c = 2), c = 3;
12
13// (2) (1)をesprimaカスタマイズで整形した結果
14for (i = 0, j = 1; i < 10; i++, j++)
15 a = {},
16 a = 1 * 1,
17 a = 2 * 2,
18 a = 3 * 3,
19 a = 4 * 4,
20 a > 1 ? 1 : 2;
21if (n++, n > 0) {
22 count = 1
23} else {
24 count = 0
25};
26while (i = 0, j > 1)
27 a = 1,
28 b = 2;
29do {
30 a = 1,
31 b = 2;
32 if (i == 1) {
33 2
34 } else {
35 3
36 };
37} while (i = 1, j > 2);
38a = 1,
39(b = 1, c = 2),
40c = 3;
esprima/escodegenをうまく使えてないせいかコードは240行程度になってしまい、ここに挙げられるほど短くできてません。それなりに面倒で敷居は低くはないですが、構文まで意識した整形が自分の好きなようにできるという意味では使えるかなと感じました。(escodegenのverbatimオプションを使った方がもう少し短く書けるかも知れません。ちなみに自分のコードは若干配慮が足りてないので無駄なセミコロンが残ったりしてます。)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/10 01:43
2017/04/10 01:47