記事一覧

google-code-prettify

google-code-prettify を導入してみた。

これはプログラムやHTMLを色分けしてくれるJavaScriptなのですが、対応言語が多くて良い感じです。
例えば、Perlのコードがこんな風に色分けされます。↓(要JavaScript。)

# In "WebApp.pm"...
package WebApp;
use base 'CGI::Application';

# ( setup() can even be skipped for common cases. See docs below. )
sub setup {
  my $self = shift;
  $self->start_mode('mode1');
  $self->mode_param('rm');
  $self->run_modes(
    'mode1' => 'do_stuff',
    'mode2' => 'do_more_stuff',
    'mode3' => 'do_something_else'
  );
}
sub do_stuff { ... }
sub do_more_stuff { ... }
sub do_something_else { ... }
1;

ただ、初期状態ではPerlの関数は一部しか色分けされないので、全部反映されるようにJavaScriptをいじっておいた。(全部はやりすぎ?)
コードの色や強調表示の設定はCSSから変更できるので、自分が読みやすいように少し編集。JavaScriptもこんな感じ。↓

var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new function() {
  try {
    return new ActiveXObject('Msxml2.XMLHTTP');
  } catch (e) {
    return new ActiveXObject('Microsoft.XMLHTTP');
  }
};

HTMLまで対応しているのが素敵。↓

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <title>HTMLのサンプル</title>
</head>

<body>
  <h1>HTMLのサンプル</h1>
  <p>google-code-prettifyのテスト。</p>
</body>

</html>

簡単に使えるように、はてな記法もどきでコードを書くと勝手に装飾されるようにしておいた。(Decoration.pm を編集。)今後、プログラムを掲載するのがちょっと楽しくなりそうです。(ぉ

追記

このJavaScript、IEではコード中の空行が反映されないのですね…。あと、同じくIEでコードをコピー&ペーストしたときに改行が反映されない…。

でも、これは google-code-prettify の問題というよりIEの問題みたい。
色々試してみたら、IEでは pre に対して innerHTML でコードを流し込むと、改行が正しく反映されないみたい。仕様なのか不具合なのかは判らないけど、IE6・IE7の両方で同じ結果になった。他のブラウザでは大丈夫なのに。(T T)

で、空行が無いのは凄く気持ちが悪いし読みにくいので、JavaScriptを少し弄っておいた。prettify.js の1450行目あたりにある

cs.innerHTML = newContent;

この部分を以下のように変更。

if (navigator.userAgent.indexOf('MSIE') >= 0) { 
  cs.innerHTML = newContent.replace(/<br>/g, '&nbsp;<br>');
} else {
  cs.innerHTML = newContent;
}

ちょっと無理やりだけど、これで空行が反映された。
コピー&ペーストの問題は解決が難しそうだけど、また色々試してみるとします。

さらに追記

「IEでコードをコピー&ペーストしたときに改行が反映されない」が解決できないので、一旦外しておきます…。
もし解決できたら、また導入したいと思います。

トラックバック一覧

コメント一覧