Pages

Jun 25, 2004

プログラムのソースコードを色分け、強調表示する

自分で書いたソースを
・見易く色を付けて表示したい。
・綺麗にカラー印刷したい。
・ブログに美しく貼り付けたい。

そんな欲求を満たすために、俺が実際にやっている方法。

まずカラー表示・カラー印刷は全てvimにお任せしてます。こんな感じ↓
codeformatvim.jpg

vimが優れているのは
・色分けの精度が高い。
  ソースのカラー表示の機能はほとんどのエディタが備えていると思いますが
  vimはより細かく色分けを行います。
  vimのSyntaxに染まってからemacsのC/C++ modeですら見難く感じるようになりました。
・カラースキーマを変更することにより、表示のテイストを変更化
  例えが悪すぎるかもしれませんがWindowsのデスクトップテーマチックです。
  名無しのVIM使い/VIM スクリーンショットに多数のサンプルスクリーンショットがまとまっています。
・強調表示の指定がSyntaxファイルという独立したファイルになっている。
  自分でSyntaxを作ることも、既存のものを改良することも可能です。
  ただし日常考えられるほぼ全ての言語・設定ファイルに関してすでにSyntaxがあるはずです。

そしてこれらが標準のvimパッケージの中に予め含まれています。すごい。

印刷も通常の印刷とSyntaxを有効にした状態での印刷が可能です。
Syntaxを有効にした状態でカラープリンターに出力してやれば、クライアントもビックリ。

唯一の問題はこれがvimの機能だということ笑
「vimだと作業効率が落ちまくる!」という方はまた別の手を考えてください。

で、最後の課題「ブログにソースを載せる時」はどうしようと色々スタイルシートを弄っていたら
今日いいサイトを発見しました。

SorceCode Formatter http://www.manoli.net/csharpformat/

このサイトの入力欄に自分のソースコードをペーストすると、それがスタイルシートで装飾されて出力されます。
出力例↓
codeformat.jpg

出力されたHTMLのソースをブログの入力欄にコピペするだけで↓こんな感じ



   1:  #region Copyright ゥ 2001-2003 Jean-Claude Manoli [jc@manoli.net]

   2:  /*

   3:   */ 

   4:  #endregion

   5:   

   6:  using System;

   7:  using System.IO;

   8:  using System.Text;

   9:  using System.Text.RegularExpressions;

  10:   

  11:  namespace Manoli.Utils.CSharpFormat

  12:  {

  13:      /// <summary>

  14:      /// Provides a base class for formatting most programming languages.

  15:      /// </summary>

  16:      public abstract class CodeFormat : SourceFormat

  17:      {

  18:          protected abstract string Keywords 

  19:          {

  20:              get;

  21:          }

  22:   

  23:   

  24:   

  25:          /// <summary/>

  26:          public CodeFormat()

  27:          {

  28:              //generate the keyword and preprocessor regexes from the keyword lists

  29:              Regex r;

  30:              r = new Regex(@"\w+|#\w+|#(\\s\*\w+)+");

  31:              string regKeyword = r.Replace(Keywords, @"(?<=^|\W)$0(?=\W)");

  32:              string regPreproc = r.Replace(Preprocessors, @"(?<=^|\s)$0(?=\s|$)");

  33:              r = new Regex(@" +");

  34:              regKeyword = r.Replace(regKeyword, @"|");

  35:              regPreproc = r.Replace(regPreproc, @"|");

  36:              

  37:  //            Regex r = new Regex(@" +");

  38:  //            string regKeyword = r.Replace(Keywords, @"|");

  39:  //            string regPreproc = r.Replace(Preprocessors, @"|");

  40:   

  41:              //build a master regex with capturing groups

  42:              StringBuilder regAll = new StringBuilder();

  43:              regAll.Append("(");

  44:              regAll.Append(CommentRegEx);

  45:              regAll.Append(")|(");

  46:              regAll.Append(StringRegEx);

  47:              if (regPreproc != string.Empty)

  48:              {

  49:                  regAll.Append(")|(");

  50:                  regAll.Append(regPreproc);

  51:              }



かなりスッキリ見やすいです。

対応しているのはC#,VB,HTML,XMLとありますが、ソースを見たところ他の言語に対応させる事を
想定しているようで、作者の今後に期待。(自分で追加するのもそれほど大変ではないはずです。)

あたりまえですが、何を使っても見易く綺麗になるのは見た目だけ。
中身がスパゲッティだと効果も半減です。

・・・厳し〜