google-code-prettifyでブログのコードシンタックスハイライト

google-code-prettify はブログなどにコードを記述するときに、言語に合わせてコードのシンタックスハイライトをおこなってくれるJavaScriptライブラリ。

ここからダウンロードしたファイルを解凍し、prettify.js および prettify.css を読み込み、prettyPrint() を body のonloadなどから呼び出すことで、pre タグに prettyprint クラスを指定したコードがシンタックスハイライトされる。どんな言語かはスクリプトが判定してくれる。

   <script type="text/javascript" src="/jslib/prettify.js"></script> 
   <link href="/jslib/prettify.css" rel="stylesheet" type="text/css"/>
</head>
<body onload="prettyPrint()">

               :
<pre class="prettyprint">
#include <stdio.h>
/* Convert temperature Celsius to Fahrenheit
F = 9/5 * C + 32 */
int main()
{
             :

 

以下、適当なコードで実際にやってみる。SQLやさすがにCOBOLは対応してないか・・・

C

#include <stdio.h>
/* Convert temperature Celsius to Fahrenheit
   F = 9/5 * C + 32 */
int main()
{
  int celsius;  int fahren;  int lower;  int upper;  int step;
  lower = 0;     /* lower limit of temperature */  
  upper = 300;   /* upper limit of temperature */
  step  = 20;

  celsius = lower;
  while (celsius <= upper) {
    fahren = celsius  * 9 / 5 + 32;
    printf("%d\t%d\n", celsius, fahren);
    celsius = celsius + step;
  }
}

C++

#include <iostream>

using namespace std;

void sort();

// ポインタパラメータを宣言
void order(int*, int*);

int main() 
{
    sort();
}

void sort() 
{
    int nums[] = { 2, 34, 656, 767, 893, 123, 5, 7, 892, 4, 6, 81, 1134, 56, 3 };
    int len = sizeof(nums) / sizeof(nums[0]);

    for (int i=0; i<len; i++) {
        for (int j=i; j<len; j++) {
            // 引数としてアドレスを渡す
            order(&nums[i], &nums[j]);        
        }
    }
    for (int i=0; i<len; i++) {
        cout << nums[i] << endl;
    }
}
 
void order(int* n, int* m)
{
    int tmp;
    // ポインタを間接参照する
    if (*n > *m) {
        tmp = *n;
        *n  = *m;
        *m  = tmp;
    } 
}

Java

package innerclass;

public class InnerClassTest3 {
    private int memberInt = 123;
    private Object obj;
    public void testMethodLocalInnerClass() {
        int       localInt = 456;
        final int finalInt = 789;
        
        class MethodInner {
            void printInt() {
                // (1) Outerクラスのメンバにアクセス可能
                System.out.println("Member :" + memberInt);
                // (2) ローカル変数にはアクセスできない
                //     インナークラスはヒープに置かれるため、メソッドから抜けるとスタックにアクセスできなくなる
             // System.out.println("Local  :" + localInt);
                // (3) final なローカル変数にはアクセスできる
                System.out.println("Final  :" + finalInt);
            }
            public String toString() {
                return "MethodInner";
            }
        }
        
        MethodInner mi = new MethodInner();
        mi.printInt();
        obj = mi;
    }
    
    public static void main(String[] args) {
        InnerClassTest3 me = new InnerClassTest3();
        me.testMethodLocalInnerClass();
        // (4) メソッドを抜けても生存している
        System.out.println(me.obj.toString());
    }
}

Javascript

function printMapKey() {
    // 配列は、連想配列として利用できる
    var map = new Object(); // new Array() でもよい(注1)
    map["a"] = 1;
    map["b"] = 2;
    map["c"] = 3;
  
    // 配列のキーを取り出す
    for (var k in map) {
        alert(k);
    }
    
    // キーで値を取得 (1 を表示)
    alert(map["a"]);
    
    // プロパティとして値を取得 (4 を表示)
    alert(map.a + map.c);
}

Perl

open IN, "<c:\\test.java";
open OUT, ">c:\\test.html";

print OUT "<style>";
print OUT ".kwd{ color:blue;font-weight:bold; }";
print OUT ".cmt{ color:green; }";
print OUT ".lin{ color:#808080; }";
print OUT ".lit{ color:#00ffff; }";
print OUT ".code{ background-color:#efefff;border:1px solid lightgrey;font-family:monospace; }";
print OUT "</style>";

print OUT "<div class='code'>";
$c = 1;
$isCmt = 0;
while ( $line = <IN> ) {
    
    $line =~ s/\s*$//;
    
    $line =~ s/(&)/&amp;/g;
    $line =~ s/(<)/&lt;/g;
    $line =~ s/(>)/&gt;/g;
    $line =~ s/([ ])/&nbsp;/g;
    $line =~ s/(\t)/&nbsp;&nbsp;&nbsp;&nbsp;/g;

    if ($line =~ /(\/\*)/) {
        $line =~ s/(\/\*)/<span class='cmt'>\1/;
        $isCmt = 1;
    }
    
    if ($isCmt) {
        if ($line =~ /(\*\/)/) {
            $line =~ s/(\*\/)/\1<\/span>/;
            $isCmt = 0;
        }
    } else {
        $line =~ s/(\bString\b|\babstract\b|\bcontinue\b|\bfor\b|\bnew\b|\bswitch\b|\bassert\b|\bdefault\b|\bif\b|\bpackage\b|\bsynchronized\b|\bboolean\b|\bdo\b|\bgoto\b|\bprivate\b|\bthis\b|\bbreak\b|\bdouble\b|\bimplements\b|\bprotected\b|\bthrow\b|\bbyte\b|\belse\b|\bimport\b|\bpublic\b|\bthrows\b|\bcase\b|\benum\b|\binstanceof\b|\breturn\b|\btransient\b|\bcatch\b|\bextends\b|\bint\b|\bshort\b|\btry\b|\bchar\b|\bfinal\b|\binterface\b|\bstatic\b|\bvoid\b|\bclass\b|\bfinally\b|\blong\b|\bstrictfp\b|\bvolatile\b|\bconst\b|\bfloat\b|\bnative\b|\bsuper\b|\bwhile\b)/<span class='kwd'>\1<\/span>/g;
        $line =~ s/(\/\/.*)/<span class='cmt'>\1<\/span>/g;
    }
    printf(OUT "<span class='lin'>%04d:</span> $line<br/>\n", $c);

    $c++;
}
print OUT "</div>";
close IN;
close OUT;

Python

import os
import pprint

# ディレクトリを走査し、階層構造を持ったリストを生成
def trav(path, fn=''):
  l = []
  l.append(fn)
  d = os.path.join(path,fn)
  if os.path.isdir(d):
    for f in os.listdir(d):
      l.append(trav(d,f))
  return l

l = trav('C:\\', 'Python25')

# 階層構造を持ったリストを出力
pprint.pprint(l, indent=4, width=80)

Ruby

def greeting time
  msg = ''
  if time < 12
    msg = 'good moring.'
  else
    if time == 12 
      msg = 'good afternoon.'
    else
      msg = 'good evening.'
    end
  end
  msg #メソッドからの返り値は単純にメソッドの最後の行の値
end

puts greeting(21)

VBScript

Dim reg     As Object
Dim matches As Object
Dim match   As Object
Dim value   As String '解析する文字列

Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "^[ ]+([0-9A-Z@]+).*[ ]FOUND[ ].*"
'reg.Global = True '/g オプションを指定する
Set matches = reg.Execute(value)

If matches.Count > 0 Then
    ' 一致情報のコレクション
    For Each match In matches   
        Debug.Print match.FirstIndex
        Debug.Print match.Value
    Next
    
    Set match = matches(0)
    ' 一致グループ
    Debug.Print match.SubMatches(0)
End If

SQL

SLECT *
FROM test1 A
WHERE EXSISTS (
        SELECT name
        FROM   test3 B
        WHERE B.id = A.id
      )

COBOL

EVALUATE TOKUTEN
  WHEN 80 THROUGH 100
    MOVE "A" TO GRADE
  WHEN 60 THROUGH 79
    MOVE "B" TO GRADE
  WHEN 50 THROUGH 59
    MOVE "C" TO GRADE
  WHEN OTHER
    MOVE "D" TO GRADE
END-EVALUATE