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
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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
リッチエディタの 書式付き貼り付け
Search
irico
December 25, 2024
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
リッチエディタの 書式付き貼り付け
fukuoka.ts #2の資料です。
irico
December 25, 2024
Other Decks in Programming
See All in Programming
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
440
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
800
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
280
sbt 2.0: takeoff
eed3si9n
0
160
golang-bob.pdf
iwatsukayura
0
130
Domain-Driven Transformation
hschwentner
2
2.3k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
160
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
Code Review Best Practice
trishagee
74
20k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Cult of Friendly URLs
andyhume
79
7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
How GitHub (no longer) Works
holman
316
150k
Typedesign – Prime Four
hannesfritz
42
3.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Transcript
リッチエディタの 書式付き貼り付け By irico
発表者: irico のフロントエンドエンジニア 最近はリッチエディタの刷新をやっています 最近乗馬始めました
https://codepen.io/iricocco3/pen/RNbVYzx コピペ 書式付き貼り付けとは
どうやって実現しているのか?
https://zenn.dev/cybozu_frontend/articles/d2782f5ad615f0
https://evercoder.github.io/clipboard-inspector/
None
Contenteditable
<div contenteditable >... コピペ ?
【ペースト結果】 <b>太字</b> <s>取り消し</s> <span style="color: red;">赤字</span> <i>イタリック</i> →いい感じに必要なスタイルのみを抽出している
一般的なリッチエディターライブラリの 仕組み <strike /> <s/> このDOMはこのDOMに変換する、という対応付けで変換する。 <span style="font-weight: 800"/> <strong
/>
※実際のコードを説明のために簡略化しています proseMirrorの実装コード https://github.com/ProseMirror/prosemirror-model/blob/master/src/from_dom.ts#L592 一般的なリッチエディターライブラリの 仕組み
pasteのイベントを監視する必要がある
pasteのイベントを監視
Excelを貼り付けてみる
https://codepen.io/iricocco3/pen/MYgogGy?editors=1010 Excelを貼り付けてみる
リッチエディタの 書式付き貼り付け THE END
リッチエディタの 書式付き貼り付け THE END…?
ここから裏ルート編 …コワクナイヨ
Excelを貼り付けてみる
Excelを貼り付けてみる
Excelを貼り付けてみる リッチエディターの外に影響を与えてしまう!!!
https://codepen.io/iricocco3/pen/MYgogGy?editors=1010 Excelを貼り付けてみる
Contenteditableのデフォルトはいい感じにinline化される Excelを貼り付けてみる
Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる
https://developer.mozilla.org/ja/docs/Web/API/Window/getComputedStyle Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる
iframeにクリップボードのHTMLを追加 ↓ iframe.contentWindow経由でgetComputedStyleを使う ↓ 各DOMのstyleを計算し、inline化する Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる https://codepen.io/iricocco3/pen/MYgmOWo
https://codepen.io/iricocco3/pen/MYgmOWo 思ってたのと違う!! Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる
思ってたのと違う!! getComputedStyleによってBodyに -webkit-text-fill-color: rgb(0, 0, 0)がつく 事が原因 Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる https://codepen.io/iricocco3/pen/MYgmOWo
Contenteditableの挙動のように、スタイルの 計算結果をinline化してみる →子のcolor < 親の-webkit-text-fill-colorの優先度
https://codepen.io/iricocco3/pen/MYgmOWo 全てinline化するとテキスト量が増えすぎる。 RTEは何かしらで永続化するケースが多いは ず… クライアントのperfも微妙… Contenteditableの挙動のように、 スタイルの計算結果をinline化してみる
・・・
結論 ・Contenteditableの標準動作は割と高級な仕組み ・カスタマイズするとpasteイベントを使う必要があり、 高級な仕組みを利用できない。 ある程度のstyle落ちは許容する必要が出てくる ・Contenteditable相当の仕組みを再実装すれば できるかもしれないが…?
Safariさんはとっても優秀! おまけ
ご清聴ありがとうございました!