Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WYSIWYG ルビ入力の概要と Chromium のバグを修正した話
Search
kosakin
June 22, 2026
Technology
320
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WYSIWYG ルビ入力の概要と Chromium のバグを修正した話
#rich_text_editor_study
https://web-study.connpass.com/event/391357/
kosakin
June 22, 2026
More Decks by kosakin
See All by kosakin
Web で実用的な縦書きエディタは可能か?──現在地と普及に向けて
karintou8710
0
130
pタグを跨いだテキストコピーは 改行が2つになる!?
karintou8710
0
47
RTE ライブラリの仕組みとそれを支えるブラウザ機能
karintou8710
0
790
Sample
karintou8710
0
320
Other Decks in Technology
See All in Technology
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
2
1.7k
GoにおけるFFIのこれまでとこれから
goccy
4
1.4k
「図書館」という名前のままでいいのか -Code4Lib JAPANカンファレンス2026 アンカンファレンス報告- / Code4Lib JAPAN Conference 2026: Unconference Report
ykiyota
0
120
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
140
Webとヘルスデータ
yukukotani
1
200
少人数データチームのDevin活用実践事例
runandy16
3
460
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
300
When Does a Local Qwen Start to Break
morshoto
0
190
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
120
AIオーケストレーションを活用した 開発ワークフローの設計と実践
bqnq
0
110
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
320
module Synths; end
asonas
1
130
Featured
See All Featured
The Spectacular Lies of Maps
axbom
PRO
1
980
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Crafting Experiences
bethany
1
310
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
Code Review Best Practice
trishagee
74
20k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
What's in a price? How to price your products and services
michaelherold
247
13k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
190
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Balancing Empowerment & Direction
lara
6
1.3k
Transcript
WYSIWYG ルビ入力の概要と Chromium のバグを修正した話 2026.05.26 (火) #rich_text_editor_study 1
所属:サイボウズ株式会社 (26卒) 出身:札幌 最近の興味:家系・ポーカー 悩み:健康診断の結果が悪かったので、娯楽の 食事が奪われた 2 自己紹介 コサキン @karintou74073
• 文字にふりがなや補足情報を付ける仕組み • 日本では漫画・小説・教科書・新聞などで広く使用 • 難読漢字や固有名詞の読みを示し、読者の理解を助ける • 縦書きと併用されることが多い ルビとは何か 3
• 中国: 拼音(ピンイン)で発音を示す例あり • ただし漢字と発音がほぼ 1:1 対応のため、主に教育用途 専門家が少なく、開発者コミュニティでも優先度が低い • WYSIWYG
ライブラリでも「知識がないので利用者側で対応してほしい」という反応 • 例: Lexical / Tiptap の issue でも実装は後回し 他の国でのルビ 4 Web やライブラリでの実装は後回しにされがち
ルビの HTML 表現 5 • ruby タグの中にテキスト + rt タグを順に並べる
• rp タグはルビ非対応環境向けのフォールバック • 「明日(Ashita)」のようにカッコ付きで表示
静的ページは HTML を直接書けばよいが、CMS などでユーザー入力を受ける場合は入力方法が必要 Web でのルビ入力 3 パターン 6
• マークダウンで専用記法を用意 • note の例: |note太郎《ノートたろう》→ プレビュー時に変換 パターン 1: マークダウン記法
7 • note は本来 WYSIWYG ベースのエディタ • それでも記法を採用 = WYSIWYG の難しさ / Web の技術的制約がある?と推測 • 記法はサービスごとに様々なバリエーションが存在
• ルビを独立した要素 (アトム) として扱う / 入力はモーダルなどの専用画面から行う パターン 2: アトム +
専用入力画面 8 • 「単語 + ルビ」は 1 つの埋め込み要素として扱われる • キャレットで直接文字を編集することはできない • ネイティブアプリの Word がこの方式
• contenteditable を使った、純粋な WYSIWYG(一番直感的に思いつく形) 編集イメージ • 単語にもルビにもキャレットを合わせて編集できる • 矢印キーで単語とルビの間を移動できる •
「やさしい日本語エディタ WordPress プラグイン」など パターン 3: 単語とルビを直接編集 9
• ルビが増えてくると、純粋に読みづらい • WYSIWYG なのに、最終成果物と異なる表示で編集することになる 「パターン 1: マークダウン記法」の問題点 10
現状では実用的ではない • キャレット操作が十分に実装されていない • 致命的な変な挙動も大量にある(ここら辺誰も触ってなさそう) • ブラウザ依存の実装になっている • editing の内部動作は
W3C の仕様が存在しない • ルビ + contenteditable 周りは WPT (共通テスト) にもない 「パターン3:単語とルビを直接編集」の問題点 11 https://codesandbox.io/p/sandbox/zxrrw8 Chrome で起きる変な動作 (contenteditable=true) - ルビの右にキャレット → 左矢印で行頭に移動 - そのまま Backspace すると行頭までごっそり削除 - ルビの先頭で入力 → 単語の末尾に追加される - 通常テキストで縦移動 → ルビに吸い込まれて抜け出せない - `rt` タグが空だと、ルビを入力できない
• Chrome で縦方向に移動すると、なぜか文頭や文末に飛ぶ • ProseMirror は移動処理を基本ブラウザに委ねているため、ライブラリでも問題が起きる WYSIWYG だと、アトムルビで十分では? 12 「アトム
+ 専用入力画面」で十分だと考える理由 • ルビは表示領域が小さく、直接入力しづらい • 多くの変な動作を乗り越えてまで直接編集する価値はそこまで高くない アトムルビの問題点
©️ Cybozu, Inc. 13 ここまでは記事の内容
©️ Cybozu, Inc. 14 社内の方がリツイートしてくれたおかげで、Chromium 開発者の方に届いた
とりあえず ISSUE 立てるか 15
• IssueTracker というサービスに報告する • 再現方法や詳細、バージョンなどを入力する。他の OSS とあまり変わらない Chromium に ISSUE
報告をする 16
数日経っても誰も取り組んでなさそう。。 17
ブラウザへのコントリビュート 興味あるし、やるか! 18
©️ Cybozu, Inc. 1. まずは手元に Clone して、ビルドする(僕の環境だと7時間ぐらいかかった気がする) 2. 原因の調査 3.
main からブランチを切って、コード修正とテストコードを追加する 4. Gerrit というサービスに PR を送る(若干特殊) 5. レビューでやり取り後、権限を持つ2人に Approve をもらってマージしてもらう コントリビュートの流れ 19 • Jxck さんの「Chromium にコントリビュートするための周辺知識」を目がとれるほど読みました • 日本語でコントリビュートガイドがあることに感謝です • https://blog.jxck.io/entries/2024-03-26/chromium-contribution.html
©️ Cybozu, Inc. 20 PRのイメージ
©️ Cybozu, Inc. • Blink は Chromium のレンダリングエンジン • HTML
/ CSS の解析、レイアウト構築、描画や Web API の実装を担っている • Firefox は Gecko, Safari は WebKit • 今回関わるのは layout と editing の2つ • third_party/blink/renderer/core/editing/ • third_party/blink/renderer/core/layout/ 変更するコンポーネント:Blink 21
©️ Cybozu, Inc. • Claude Code にディレクトリ構造・ファイル内容を聞きながら、理解を深めていく • ある程度バグありそうな場所を見つけたら、伝家の宝刀 print
デバッグ • LOG(ERROR) << "Foo"; 簡単な原因説明 • ArrowDown を押すと、レイアウト層で「次行 and 横方向ピクセルが一番近い位置」に移動したい • レイアウトは DOM を描画するための構造に変換されたもの • <rt /> は内部的に行と同じタイプで管理されており、これを次行と誤認 • contenteditable=false の中に移動しようとして、フォールバックが起動して末尾に移動 原因の調査方法 22
©️ Cybozu, Inc. • PR をレビューしていただいた田村さんにおんぶに抱っこだった • 最初に提案した contenteditable=false に移動する場合にスキップする方法は、contenteditable=true
でも同 じ問題が起きているため却下 • 別案で、レイアウトの層で <rt /> ならスキップする処理にしたい • IsRubyAnnotationLine の判定用メソッドを別PRで追加していただき、私がそれを使うという流れを提案して いただいた。(神??) レビューでの会話 23
©️ Cybozu, Inc. 24 マージされて AUTHORS にのった!嬉しい!
• アトムルビの WYSIWYG 編集が主要ブラウザである程度まともに動くようになる! • 別のバグっぽいものを見つけているので、その修正も必要になるかも。。。 • 主要ブラウザで詳しくバグ調査をせねば。。。 • 今主流のマークダウン形式が、WYSIWYG
の選択肢が生まれる! • Web で実用的な縦書きエディタを実装する上の、第一歩でもある • Web で縦書きエディターを各々のサービス導入できる世界線、いいね この修正で何が嬉しい? 25
©️ Cybozu, Inc. • 今はマークダウン記法でルビを入力していることが多いが見づらく、WYSIWYG の選択肢が欲しい • contenteditable=false のルビバグを修正したので、PC の主要ブラウザは動きそう
• 他にもバグあるのかも(あった記憶がある) • editing はブラウザへのコントリビュートしたい方の一つの選択肢になる! • 縦書き周りでレイアウト・editing 周りのバグっぽいものはいくつか見つけた • Web でルビが普及していけばいいね! まとめ 26
©️ Cybozu, Inc. 27