Skip to content

Conversation

@cm-igarashi-ryosuke
Copy link
Member

@cm-igarashi-ryosuke cm-igarashi-ryosuke commented Dec 18, 2025

📑 Summary

Prism.js を Shiki に移行しました。

主な変更点

アーキテクチャ

  • 非同期処理: markdown-it の同期的なレンダラーと Shiki の非同期 API を統合するため、3フェーズ方式を採用
    1. Phase 1 (収集): コードブロックを検出し、プレースホルダーを挿入
    2. Phase 2 (ハイライト): Promise.all で全コードブロックを並列ハイライト
    3. Phase 3 (置換): プレースホルダーをハイライト済み HTML に置換
  • 遅延ロード: 言語定義を必要に応じてロード(メモリ効率)
  • transformers API: Shiki の transformers を使用して AST レベルで変換

機能

  • シンタックスハイライト: Shiki の github-dark テーマを使用
  • diff モード: 行頭の +/- を検出して背景色を適用
  • ファイル名表示: コードブロックのファイル名表示を継続サポート

変更ファイル

  • packages/zenn-markdown-html/src/utils/highlight.ts: Shiki によるハイライト処理
  • packages/zenn-markdown-html/src/utils/md-renderer-fence.ts: 3フェーズ処理の実装
  • packages/zenn-content-css/src/_shiki.scss: Shiki 用 CSS
  • packages/zenn-markdown-html/src/sanitizer.ts: prespanstyle 属性を許可

移行断念

移行計画

既存記事の後方互換性を保つため、以下の手順で移行を進めます:

  1. このPRをリリースする

    • 新規記事・更新記事は Shiki でハイライトされる
    • _prism.scss は残すため、既存記事も引き続きハイライトされる
  2. 既存記事を Shiki で一括変換する

    • サーバー側で既存の HTML を Shiki 形式に再生成
  3. _prism.scss を削除する

    • 全記事が Shiki 形式になった後、Prism.js 用 CSS を削除

📋 Tasks

プルリクエストを作成いただく際、お手数ですが以下の内容についてご確認をお願いします。

  • 📖 Contribution Guide を読んだ
  • 👩‍💻 canary ブランチに対するプルリクエストである
  • zenn-cli で実行して正しく動作しているか確認する
  • 不要なコードが含まれていないか( コメントやログの消し忘れに注意 )
  • XSS になるようなコードが含まれていないか
  • モバイル端末での表示が考慮されているか
  • Pull Request の内容は妥当か( 膨らみすぎてないか )

より詳しい内容は Pull Request Policy を参照してください。

@cm-igarashi-ryosuke cm-igarashi-ryosuke added the feature 機能追加・改善 label Dec 18, 2025
@cm-igarashi-ryosuke cm-igarashi-ryosuke force-pushed the fix-migrate-shiki branch 3 times, most recently from 7778245 to b64153d Compare December 19, 2025 07:02
@cm-igarashi-ryosuke cm-igarashi-ryosuke marked this pull request as ready for review December 19, 2025 07:05
@use './content' as content;
@use './embed' as embed;
@use './prism' as prism;
@use './shiki' as shiki;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[q] ここを書き換えると prism で変換したコードブロックのCSSが効かなくなりませんか?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

そのとおりです!修正します!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 機能追加・改善

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants