ブックマークレットを作るコマンドラインツール

azu/bookmarkletter という既存のJavaScriptからブックマークレットを作るコマンドラインツールを作りました。

Installation

Node.jsで書かれているので、npmからインストールできます。

npm install bookmarkletter -g

使い方

使い方は簡単で、ファイル名を渡すかパイプでJavaScriptコードを渡せば、javascript: から始まるブックマークレットとして使える文字列を返してくれます。

$ bookmarkletter code.js
# or
$ cat code.js | bookmarkletter
# Broserifyと合わせるケース
$ browserify code.js | bookmarkletter

例えば、以下のようなindex.jsというファイルをブックマークレットしてみます。

var hello = function(){
  alert(document.title)
}
hello()

これをbookmarkletterってブックマークレット化してみます。

$ bookmarkletter index.js
javascript:(function(){var%20hello=function(){alert(document.title)};hello()}())

正しくブックマークレットで実行出来るコードが生成されました。

気づいた人もいるかも知れませんが、bookmarkletterは単純に改行をなくしたりするのではなく、それが正しく動くような形で圧縮されています。

var hello=function(){alert(document.title)}hello()
// SyntaxError: missing ; before statement

;


bookmarkletter  3








esmangle

javascript: 

AST




 esmangle 使AST


wrap-anonymous-ast.js


ast-types使

ast-typesFacebookregeneratorJSTransform使ASTJavaScript使DSL

ast-typesAST


buildersDSLAST

traverseeachField

DSL

ES5Parser API



JSXfb-harmonyES7Parser API




DSL使ASTcheckassertion

JavaScript AST

ast-types/core.js at master · benjamn/ast-types TypeScriptd.ts

AST


esmangle  UglifyJS JavaScript

esmangleParser APIASTASTNodeesmangleJavaScript AST

esmangle使

AST


ASTEscodegen使
escodegen.generate(result, {
    format: {
        renumber: true,
        hexadecimal: true,
        escapeless: true,
        compact: true,
        semicolons: false,
        parentheses: false
    }
});

最初に言っていたスペースを詰めたりやセミコロンの補完(詰めてしまうとエラーになる場合は入れる、イラない場合は入れない)というのは実はEscodegenの出力オプションで決めています。 (これはASTは抽象構文木であって、Concrete Syntax Treeではないからだと思います)

API

bookmarkletterはモジュールとして使うことも出来ます。

npm install bookmarkletter

モジュールとして使う

モジュールとして使う場合は単純にコード文字列を渡せば、ブックマークレット化したコードを返してくれます。

var bookmarkletter = require("bookmarkletter");
var code = "var a = 1;";
var result = bookmarkletter(code);
assert.equal(result, "javascript:(function(){var%20a=1}())");

オプション

bookmarkletter 関数にはオプションオブジェクトを渡せます。

var options = {
    // @type {string} 圧縮した文字列に付けるprefixです
    // Default : `javascript:`
    "prefix-string": "javascript:",
    // @type {boolean} 即時実行関数でラップするかをきめられます。
    // Default : `true`
    "wrap-anonymous-function": true
};
var code = "var a = 1;";
var result = bookmarkletter(code, options);
assert.equal(result, "javascript:(function(){var%20a=1}())");

ライセンス

azu/bookmarkletter のライセンスはMITです

参考にしたもの

無名関数で囲んだり、URLエンコードする文字などはchriszarate/bookmarkleterを参考にしました。

ブラウザ上で使いたい場合は、http://chriszarate.github.io/bookmarkleter/が殆ど同じ機能なのでこちらを利用したほうが早いかもしれません。