Hatena::Groupsubtech

冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

Jul 08, 2011 (Fri)

JSを編集してエディタで保存するとき、JSHint でコーディングバリデーションをかける 19:41 はてなブックマーク - JSを編集してエディタで保存するとき、JSHint でコーディングバリデーションをかける - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

errormaker.vim を使って JS 保存時に末尾カンマチェックとかをやっていたのだけれど、今までチェックに使っていた Spidermonkey の最近のバージョンだと、strict モードにしても末尾カンマを warn しなくなって意味がなくなっていたので、JSHint でやるようにした。

setlocal makeprg=$HOME/.vim/vimparse.js\ %\ $*
setlocal errorformat=%f:%l:%m

は今までのままにして、vimparse.js を以下のようにした。JSHintJSLint よりはマイルドというか偏執さがないのだけど、まだ癖が強くて「実害のある」という警告と「単に好み」という警告がごっちゃになっていてうざいので、できるだけ自分でカスタマイズできるようにした。

node.js を実行環境にしているのは、node.js のインストールが特に依存もなく簡単だから (clone して make するだけでいいから) です。

#!/usr/bin/env node


var JSHINT = require("./jshint.js").JSHINT;
var fs = require("fs");

var argv = process.argv;
argv.shift();
argv.shift();

argv.forEach(function (filename) {
	var source = fs.readFileSync(filename, 'utf-8');
	var result = JSHINT(source, {
		browser : true,
		jquery  : true,
		evil    : true,
		passfail : false
	});
	if (!result) {
		JSHINT.errors.forEach(function (error) {
			if (!error) return;

			if (error.reason.indexOf('Stopping, unable to continue.') != -1) return;

			// 何これ?
			if (error.reason.indexOf("Confusing use of '!'.") != -1) return;

			// for (var i...) は何度も書きたい
			if (error.reason.indexOf("'i' is already defined.") != -1) return;
			if (error.reason.indexOf("'it' is already defined.") != -1) return;

			// 可読性のために意図的にそうしているのでうざいし、そういう最適化は実行エンジンがすべきこと
			if (error.reason.indexOf('is better written in dot notation') != -1) return;

			// 根拠がわからないので保留
			if (error.reason.indexOf("Don't make functions within a loop") != -1) return;

			if (error.evidence) {
				error.evidence = error.evidence.replace(/\t/g, '    ');

				// 明示的に抑止されてるなら無視
				if (error.evidence.indexOf('no warnings') != -1) return;

				// やたら長い行は圧縮されたJSコードとみなす
				if (error.evidence.length > 1000) return;

				// 閉じブレース前のセミコロンは省略可能に
				if (error.reason.indexOf('Missing semicolon') != -1 && error.evidence.substring(error.character).match(/^\s*\}/)) return;
			}

			console.log([filename, error.line, error.character].join(':') + "\t" + error.reason);
		});
	}
});

gerry++ 13:57 はてなブックマーク - gerry++ - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

スポンサード リンク

書いてる人

cho45 (佐藤広央) (www.lowreal.net)

Perl, JavaScript, Ruby, HTML, CSS, Web etc


スポンサード リンク