質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1951閲覧

難読化(minify)したJavaScriptを整形

hydra

総合スコア25

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2017/03/24 02:22

編集2017/03/27 08:00

難読化(minify)したJavaScriptを整形するためsublime text の HTML-CSS-JS Prettifyプラグインを用いています。
.jsbeautifyrc を設定をしていますが以下の2つがわかりません。

1: カンマ演算子を用いた式の連続を改行する設定

for (f = 0; f < 15; f++) e = {}, e.fac = 0, e.kiro = 0, e.reactance1 = 0, e.reactance2 = 0, e.name = 0, e.count = 0, e.doubletrack = 0, e.post = 0; // カンマ演算子を用いた式の連続を改行する for (f = 0; f < 15; f++) e = {}, e.fac = 0, e.kiro = 0, e.reactance1 = 0, e.reactance2 = 0, e.name = 0, e.count = 0, e.doubletrack = 0, e.post = 0;

2: 三項演算子をif文にする設定

n > 0 ? count = 1 : count = 0; // 三項演算子をif文にする↓ if (n > 0) { count = 1; } else { count = 1; }

代替え方法があればお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

簡単にできる方法は得られませんでしたが少し手間をかけた方法ならできましたのでコメントしてみます。
本回答は自分でツールのカスタマイズコードを書く方法ですので手軽とは言い難いです。もし解にならなさそうなら読み捨ててください。

お使いの方法は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つについてそれぞれ指定関数を呼び出すようにオプションを渡します。

  • SequenceExpression

無条件にカンマで折り曲げるとfor (i = 0, i = 2; i < N; i++, j++)といったものもi, jで改行されてしまいます。それはうまくないと感じたので上位構文がExpressionStatementのときだけ変換するようにしました。

  • ConditionalExpression

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/09 03:08

編集2017/04/09 03:49
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hydra

2017/04/10 01:43

実用とするには開発、デバッグが必要でコスト的に難しいですね。
KSwordOfHaste

2017/04/10 01:47

そんな気はしましたw; ご質問のような整形を望む方が多くいらっしゃるのであれば誰かがしかるべきデバッグをしたものをOSSとしてgithubにupするといった動きがあっても不思議でない気がしたのですが、自分にはそうしたものは見つけられませんでした。何かのIDEでこういう整形が既に簡単にできるのではないのかなぁと想像しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問