std.string

若干まともな物を書きました。std.stringの練習を兼ねて。嘘。
使い物に一応なると思います。

import std.file;
import std.string;

static char[][] keywords = [
    "abstract",
    /* 予約語 省略 */
    "with"
];

bool[char[]] table;

static char[] start = "<span class=\"d_keyword\">";
static char[] end = "</span>";
const int tabsize = 4;

void main(char[][] args){
    if (args.length == 1){
        printf("file name is not appointed.");
        return 0;
    } else if (args.length == 2){
        args.length = 3;
        args[2] = args[1];
    }

    foreach (char[] c; keywords){
        table[c] = true;
    }

    char[] s = cast(char[])read(args[1]);

    s = replace(s, "&", "&#38;");
    s = replace(s, "\"", "&#34;");
    s = replace(s, "<", "&#60;");
    s = replace(s, ">", "&#62;");

    int l = s.length;
    char[] word;

    for (int i = 0; i < l; i++){
        if (isLetter(s[i])){
            word ~= s[i];
        } else {
            if (word.isKeyword()){
                s = insert(s, i - word.length, start);
                l += start.length;
                i += start.length;
                s = insert(s, i, end);
                l += end.length;
                i += end.length;
            }
            word.length = 0;
        }
    }

    s = expandtabs(s, tabsize);

    write(args[2], s);
}

bool isLetter(char c){
    return ((c > 47) && (c < 58)) || ((c > 64) && (c < 91)) || ((c > 96) && (c < 123));
}

bool isKeyword(char[] c){
    return ((c in table) != null);
}

ひどいコードです。多分ちゃんと動きます。
やっていることは、記号の置き換え、予約語前後にタグ挿入、タブを半角スペースに変換、です。見ればわかるか。
はじめinsertの返値をsに代入してなくて気づくのに10分かかりました。酷い。
追記。あ、改行タグいれてない…