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, "&", "&"); s = replace(s, "\"", """); s = replace(s, "<", "<"); s = replace(s, ">", ">"); 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分かかりました。酷い。
追記。あ、改行タグいれてない…