9月14日、Ben Nadelが「Building My Own Syntax Highlighter API With Claude Code」と題した記事を公開した。この記事では、Claude Codeを活用して自ブログ用のシンタックスハイライターAPIをゼロから自作した実践プロセスについて詳しく紹介されている。以下に、その内容を紹介する。
GitHub Gist APIへの依存を断ち切る
Ben Nadelは自身のブログプラットフォームの仕組みをできる限り自前で制御してきた開発者だ。jSoup、Flexmark、AntiSamyといった外部ライブラリは使いながらも、ワークフローの制御は自分の手に置いてきた。唯一の例外が、コードブロックのシンタックスハイライトだった。長年にわたりGitHub Gist APIに頼ってきたが、今回Claude Codeを使ってついに内製化を実現した。
実装の核となるのはStarry Nightというシンタックスハイライターと、CFMLEditorのTextMateグラマー(シンタックスルール定義ファイル)だ。これをベースに、Claude Codeとともに数週間かけてグラマーに大量の独自パッチを当てていった。成果物はGitHubで公開されている。
「コードは読めるが、意味がわからない」
この記事の最も興味深い点は、実装の中身そのものより、そのプロセスを巡るNadelの正直な告白だ。
「私がプロンプトでこのプロジェクトを操舵したが、実際に何が起きているのか、まったく理解できていない」
具体例として示されるのがSQLグラマーへのパッチだ。EXPLAIN、EXPLAIN ANALYZE、WITH、WITH RECURSIVE、COLLATE、ENGINE、DEFAULT、CHARSETといったキーワードを適切にトークン化するために追加された以下のコードは、数百行に及ぶ。
var patchStatementKeywords = {
name: "statement-keywords",
branches: new Map([
["source.sql", statementKeywordsInSql]
])
};
function statementKeywordsInSql(grammar) {
var SCOPE = "keyword.other.DML.sql";
var HEAD = "(?i:\\b(select(\\s+distinct)?|";
var rules = grammar.patterns.filter((p) => p.name === SCOPE);
if (
rules.length !== 1
|| !rules[0].match.startsWith(HEAD)
|| /\b(explain|with)\b/i.test(rules[0].match)
) {
throw new Error(`${grammar.scopeName}: the ${SCOPE} rule no longer has the expected alternation; re-derive statementKeywordsInSql`);
}
rules[0].match = `${HEAD}explain(\\s+analyze)?|with(\\s+recursive)?|${rules[0].match.slice(HEAD.length)}`;
...
}
Nadelはこう述べる。「JavaScriptの記述として何をしているかは理解できる。しかし、なぜこう書かれているのかの意味はまったく掴めない。これはまだ"比較的シンプルな"パッチのひとつだ」。
グラマー同士の関係性(source.sqlとcfmleditorのMSSQLグラマーが別系統であること、cfqueryボディが異なるルートを通ること等)の詳細な解説がコメントに書かれているが、それはClaude Codeが生成したものだ。人間が書いたのではない。
AIなしでは維持できないコードベースという現実
実用的に動くものが完成した一方で、Nadelは率直にこう書いている。
「AIの助けなしには、もう自分一人でメンテナンスができない何かを作ってしまった」
ブログプラットフォームの中核機能がそういう状態にあることを「messed up(まずい状態)」と表現し、この現実に慣れるのにはしばらく時間がかかるだろうと認めている。
さらにもう一点、Nadelはオープンソースへの貢献という観点からも問題を指摘する。Claude Codeによって大量のローカルパッチを当てることは可能になったが、その変更をアップストリーム(元のリポジトリ)にフィードバックする立場にはない、と。グラマーを深く理解していない状態でプルリクエストを送ることはできない、という正直な自己評価だ。
何が参考になるか
この記事はチュートリアルではない。「Claude Codeでこう書けばうまくいく」という手順書でもない。AIを使って自分が理解できないコードを大量に生成し、それが動いてしまったとき、開発者は何を得て何を失うか——という問いへの、一人のエンジニアによる実体験の報告だ。
コードを「操舵」するのは人間で、「実行」するのはAIというワークフローが確立されつつある中で、メンテナビリティと理解可能性のトレードオフをどう考えるか。個人ブログのシンタックスハイライターというニッチなケースが、より普遍的な問いを照射している。
詳細はBuilding My Own Syntax Highlighter API With Claude Codeを参照していただきたい。