JavaScript でコードを色づけしてくれるライブラリ google-code-prettify

JavaScript でコードを色づけしてくれるライブラリ google-code-prettify

2007/06/15 9:08am

Ruby のコードを色づけしてくれる Syntax を試しているうちに、このブログでもコードの色づけ(いわゆるシンタックス・ハイライト。はてなダイアリーのスーパー pre 記法みたいなやつね)をやってみたくなった。

誰でも普段は、エディタで色づけされたコードを見慣れてるわけで、やっぱり黒べったりは読みづらいといえば読みづらい。

JavaScript によるコード色づけ

ただ、このブログは WordPress で動作している。

WordPress といえば、あれか … PHP か。なので、Ruby の Syntax ライブラリは使えない。それに、そもそも Syntax は Ruby の字句解析ライブラリとしての用途に重きを置いているためか、デフォルトで対応している言語が少ない(Ruby と XML, YAML だけ)。そのへんの不満もある。

色々迷った末(五分くらい)、JavaScript によるコード色づけを試してみることにした(WordPress のプラグインはですね、種類が多すぎて比較する気にもなれませんでした)。

問題はどのライブラリを使うか。検索してみると、Google Code にいくつか見つかった。

syntaxhighlighter対応言語は申し分ないのだが、ちょっとオーバースペック気味だ。行番号表示やクリップボードへのコピーとかは、とりあえずいらないだろう。

一方の google-code-prettify はシンプルでいい感じ。早速、試してみることにする。

google-code-prettify

使い方は README を読めば問題ないと思う。このブログでは prototype.js を使って、こんなふうに組み込んだ。

<script src="http://metareal.org/javascripts/prototype.js" type="text/javascript" charset="utf-8"></script>
<script src="http://metareal.org/javascripts/prettify.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
  Event.observe(window, 'load', function() {
    prettyPrint();
  });
</script>

この通り、HTML も色づけしてくれる。HTML に埋め込んだ JavaScript も認識されてるのはすごいな。しかも、コード部分の指定は pre 要素か code 要素の class 属性に prettyprint を指定するだけ。シンプル。

おまけ: Ruby コードの色づけ

ちなみに、Ruby コードの色づけはどうだろう。

冒頭にあげた Syntax のコードで試してみよう。

syntax-1.0.0/lib/syntax/convertors/abstract.rb

require 'syntax'

module Syntax
  module Convertors

    # The abstract ancestor class for all convertors. It implements a few
    # convenience methods to provide a common interface for all convertors.
    class Abstract

      # A reference to the tokenizer used by this convertor.
      attr_reader :tokenizer

      # A convenience method for instantiating a new convertor for a
      # specific syntax.
      def self.for_syntax( syntax )
        new( Syntax.load( syntax ) )
      end

      # Creates a new convertor that uses the given tokenizer.
      def initialize( tokenizer )
        @tokenizer = tokenizer
      end

    end

  end
end

十分だな。シンボルは色づけされてないようだけど、インスタンス変数は認識されている。