WebAPIで構文強調2007年06月30日 04時41分51秒

これはありがたい

geshi_webapi - koshigoe prototype - Trac

MASHUPEDIAの記事になっていた、構文強調WebAPI。 アサブロはサーバ側で構文強調できる機構がないのでソースはベタなPREのままにしていたが、面白そうなので試してみた。

GET? POST?

MASHUPEDIAの記事中にGETメソッドではレスポンスが返らないことがある。POSTを使用したほうがよさそう。とあったので 何も考えず

new Ajax.Updater(
	pre,
	"http://lab.koshigoe.jp/geshi_webapi/syntax_highlight.php",
	{
		method : "post",
		postBody : { //(ry }
	}
);
みたいなことを一生懸命やって「なんでデータとれねーんだろう」とか寝ぼけたことを考えていたが、XSSはダメだっつーの

なので、JSONPでやってみた。

// これは実際のコードからの抜粋。
// 詳細はこのエントリのソースを見てね(コメントないけど)。

// 強調表示する(予定)のファイルタイプ。API側でサポートしてるの全部は使わん。
var langs = [ "javascript", "html", "csharp", "css", "sql", "vb", "xml" ];

$A(document.getElementsByTagName("pre")).each( function(pre) {
	// コールバック関数名はタイムスタンプから生成
	var name = "geshi_callback_" + new Date().valueOf();
	
	// CSSクラス名を言語名にする。クラス名がない場合は処理しない
	var c = pre.getAttribute("class");
	if( ! langs.include( c ) ) throw $continue;
	
	// HTML/XML対応できるかと思って入れてみたが
	// あまりうまくいかない。要検討。
	var src = [ "html", "xml" ].include( c ) ?
		pre.innerHTML.unescapeHTML() : pre.innerHTML;
	
	// GET用のURL作成
	var req = [
		"http://lab.koshigoe.jp/geshi_webapi/syntax_highlight.php?",
		$H( {
			lang : c,
			source : src.escapeHTML(),
			output_mode : "jsonp",
			callback : name
		} ).toQueryString()
	].join("&");
	
	// コールバック関数登録
	window[name] = function(dt) {
		pre.innerHTML = dt.highlighted_source.toElement().innerHTML
		Object.extend( pre.style, {
			backgroundColor : "ghostwhite",
			color : "black"
		} );
	};
	
	// 実行
	var sc = document.createElement("script");
	sc.src = req;
	document.getElementsByTagName("head")[0].appendChild(sc);
} );
結構さくっと変換される。すげー。

と、いうことで

過去のエントリをいくつか対応してみた。上記ソースのコメントにも書いたが 頭使わないコーディングしてるので、HTMLやXMLは対応できず強調なしにしている。 現状はJSのみ。以下のエントリを対応版にしてみた。

JSの構文強調ライブラリもあるんだけど、ソース量が多いとえらく時間かかるのでとりあえずこれでしばらくいってみよう。

追記(2007.06.30 04:55)

Safari3.0.2でレスポンスの日本語部分が化け化けになったので、とりあえずSafariの場合は強調処理を飛ばすようにした。あと、IE6はスクリプトエラーでないのにまったく強調表示されない。Firefox2.0.0.4とOpera9.21はOK。うまくいかん部分は、とりあえず放置。

為末、すげー2007年06月30日 17時28分48秒

なんとなくNHKがつきっぱなしになっていて、別にみちゃいないが音だけは聞こえる状態だったんだけどさ。

日本陸上選手権やっててさ、ハードルで為末が優勝したみたいなのよ。素人のdara-jからすると、「おー、まぁ順当だな」ってなくらいのお話ね。

でね、これに勝ったから世界選手権出場が内定なんだって。

それでね、優勝インタビューするじゃない。たぶん世界選手権の抱負かなにかを聞いたんだろうね。

本番はNHKじゃなくTBSなんですけど、

わざわざ局名いわんでも...さすが侍ハードラー、漢らしすぎ。