8 ポイント 投稿者 GN⁺ 2024-08-15 | 1件のコメント | WhatsAppで共有

問題点

  • HTMLとCSSで手書きコーディングしたWebサイトを作るとき、構文ハイライトが難しい
  • コードスニペットを読みやすく理解しやすくするために、色で強調したい
  • 一般的にはPrismやhighlight.jsのような複雑な構文ハイライトライブラリを使う必要がある
  • 外部スクリプトを使わずに手書きでコーディングしたい

OpenType機能を使ってフォント自体に構文ハイライト機能を組み込む

  • Monaspace Krypton というオープンソースフォントを改変し、各文字の色付きバージョンを含めた
  • OpenTypeのCOLRテーブルとコンテキスト置換機能を使って、特定の文字列を見つけて置き換える
  • その結果、フォント自体に内蔵されたシンプルな構文ハイライターが完成

長所と短所

長所

  • 導入が簡単: フォントを読み込み、OpenTypeのCOLR(色)およびCALT(コンテキスト置換)機能を有効にすればよい
  • JavaScriptが不要
  • CSSテーマが不要
  • プレーンテキストと同じくらい高速
  • <pre><code> タグにコードスニペットを追加できる
  • HTMLソースコードがクリーン
  • InDesignのようにOpenType機能をサポートするあらゆる場所で動作
  • 保守やアップデートが不要
  • <textarea><input> でも動作

短所

  • カラーパレットを変更したり言語サポートを追加したりするなどの修正が必要な場合、フォントファイル自体を修正しなければならない
  • OpenTypeをサポートする環境でしか動作しない
  • OpenTypeのコンテキスト置換を使ったパターン検出は基本的なもので、正規表現を使うスクリプトとは比較にならない

実際の仕組み

  • OpenTypeのCOLRテーブルとコンテキスト置換機能を使用
  • COLRテーブルはカラーフォントを可能にする
  • コンテキスト置換は隣接する文字を認識して置き換える
  • 例: JavaScriptのキーワード if を見つけて、色付きの派生字形に置き換える

GN⁺のまとめ

  • この記事は、手書きでWebサイトをコーディングするときに構文ハイライトを実装する新しい方法を示している
  • OpenType機能を活用してフォント自体に構文ハイライトを内蔵することで、JavaScriptやCSSテーマなしでも構文ハイライトを可能にしている
  • この方法はシンプルな構文ハイライトには適しているが、複雑な構文ハイライトライブラリと比べると限界がある
  • 類似の機能を提供するプロジェクトとしては、Prism、highlight.js などがある

1件のコメント

 
GN⁺ 2024-08-15
Hacker Newsのコメント
  • 面白いハックだ

    • OpenType機能の使い方に少し混乱がある
    • font-feature-settings: "colr", "calt"; という設定には意味がない
    • colr 機能タグは OpenType レイアウトテーブルに存在しない
    • COLR テーブルを有効化しようとした可能性がある
    • calt 機能はデフォルトで有効になっている
    • Firefox と Chrome ではうまく動くが、Safari では動かない
  • 元のテキストがそのまま保持される

    • タグのラップや JS なしで userContent.css で動作する
    • 別次元のアプローチだ
  • OpenType の専門家ではないので、代替ロジックは改善できるかもしれない

    • 修正したソースファイルを共有する意思がある
    • アイデアやフィードバックがあれば連絡してほしい
  • このハックはひどいが驚かされる

    • OpenType の文脈依存置換機能を見事に悪用している
    • 共有してくれてありがとう
  • 素晴らしいハックだ

    • 約 45kB で、baseline の highlight.js とほぼ同じサイズだ
    • JavaScript が無効化された環境でも動作する
    • 実行時の設定可能性と言語サポートは狭くなる
  • ページ下部に良いメッセージがある

    • "このサイトは Cookie を使用せず、サードパーティーのサイトにリンクしない"
    • この点が気に入った
  • コードで自動化できそうだ

    • 一般的なユースケースに役立つ方法だ
  • Chromium ベースのブラウザではバグがある

    • color: blue と入力すると r だけが強調表示される
    • コピーして貼り付けると正しく動作する
    • それでも素晴らしい機能だ
  • 本当にすごい機能だ

    • textarea や入力フィールドだけでなく、大きな HTML ドキュメントでも使える
    • 大量の span や HTML タグを使う必要がない
    • ハードウェアアクセラレーションされたフォントレンダリングソフトウェアがすべてを処理する
    • メモリと CPU を大幅に節約できるはずだ
  • パーサージェネレーターのように動くものが必要そうだ

    • ルールにどれほどの表現力があるのかは明確でない
  • 本当に驚くべき機能だ

    • もっと良い書体で見るのが楽しみだ(例: Inconsolata や JetBrains Mono)
    • JSON を簡単に表示するのに役立ちそうだ