-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ActivityPub: _misskey_contentがない投稿にはHTMLとしての処理だけを行うべき #15217
Comments
misskey 2024.11.0でも同様 |
こちらでは |
MFMは |
misskey/packages/backend/src/core/activitypub/models/ApNoteService.ts Lines 188 to 196 in 5f67520
上記の実装を見る限り、HTMLとして解釈されたものがMFMの構文に偶然当てはまり、文字列の装飾もそれに従った形になったと推測できます。 |
|
あるテキストをどのような見た目で表示するかというのは表示者に委ねられているはず(HTMLを表示する際は絶対にこのフォントでなければならない、などと決まっていないのと同様)で、仕様に反しているわけではありません。MFMは表示者による表示方法の一種です。 |
(あ、空白なくても引用になるんだ) |
|
まぁどちらでもこのバグは発生します |
仕様では, MarkdownとしてではなくHTMLとして解釈することと決められています. |
「HTMLとして解釈」はしています。ただ、それをどのような見た目でディスプレイにレンダリングするかは表示者の自由なはずです。 例えば、コードの 他にも、プレーンテキストのURLをハイパーリンクとして扱う、という表示もいろいろなところで見られますが、これも何かに反しているわけではないと思います。 |
(仕様を見る限り「デフォルトではHTML」とはあるけどそれをHTMLとして受けなければいけないとは書いていない気がする) (そもそも一度HTMLとして処理しているのでその後は別に何してもいい気がする) |
仕様に反しているかどうかや、MFMとして表示するべき/しないべきというのは置いておいて、具体的にどのように困っているか(先ほどの |
なお、 |
MastodonのようにMFMを意図していないリモートサーバからの投稿をMisskey側がMFMとして解釈するのは『便利』ではないし過剰で困るので、困る例としてはMFM全部かな。 |
(自分が知る限りですが) |
仕様という言葉が幾度となく出ていますが、Misskey(frontend)はMFMで表示する仕様です。 |
Misskeyはノートを連合する際に、HTMLでレンダリングした |
「仕様」というのはActivityPubの仕様のことです |
現状、MisskeyはActivityPubで受け取った投稿をそのように処理する仕様だ、ということです。 |
ActivityPubの仕様ではJSON内のcontentフィールドの値がHTMLであるというだけで、その表示についてはフロントエンドの実装に依ると考えます。 「〜を〜のように表示してほしい」のようなMFMに対するIssueであれば理解ができますが、これ以上ActivityPubの仕様を持ち出されても議論として成立しないと考えます。 |
「MFMすべて」となるとメンションやハッシュタグ、リンクも無効になってしまいますね 無論、送られてきたHTMLをそのままレンダリングするようなことは当然セキュリティ上不可能なので、必ず何かしらのMFM的解釈はせざるを得ないと思われます。 |
まぁ, かなり天邪鬼な解釈をすればActivityPubの仕様には従ってるとは言えそうですが, 事実これが誤爆を起こしてるので... |
下記内容のMastodonの投稿を、SNSの投稿の解釈として適切な範囲でMFM適用し、予想外の装飾的な解釈を行わないよう対応した実装を実装してみました。 > abc >abc >>nest MFM 書き方 検索 ```js abc ``` \[a = 1\] ***big!*** bold **bold** __bold__ italic *italic* _italic_ misskey.cloudでの表示(MFM非対応実装で期待される範囲のMFM適用 / 目標状態) nightly.fedibird.comでの表示(オリジナル投稿) この実装の為に必要なmfm.jsの変更については、mfm.jsの方にissueとpull requestをあげてあります。 Misskey側の修正については、mfm.jsの更新が適用されないとテストできませんが、現状のものをpull requestしておきますのでご確認ください。 |
現状、本文中にプレーンテキストで書いたつもりのHTMLタグについてHTMLとして解釈されていますが、これはmfm.jsに渡す前に、Misskey側の前処理でエスケープしておく必要がありそうです。 |
それを行うのだったらそもそも Misskey 側で全部エスケープする……というか MFM の AST を Misskey 側で組んで、ASTからテキスト表現にmfm.jsで変換する際にエスケープを考慮してもらうほうが筋が良いと思います (というのが #15217 (comment) と misskey-dev/mfm.js#154 です) |
そもそもの問題は(実装当時はどうだったかわかりませんが現在は) AST が存在する複雑なプレーンテキスト文法において、AST を使わずに文字列処理だけで複雑なものを生成している部分にあり、私の案なら雑多な案を解決できると考えています。 mfm.js に新しくパースモードを追加するのは、(本当に来るのかはともかく) https://github.com/misskey-dev/mfm.rs や https://github.com/shiosyakeyakini-info/dart_mfm_parser などのサードパーティにも同様の実装が必要になるため、好ましい選択ではないと思います。 |
@noellabo 確認ですが、あなたの主張は「Misskey外はすべてプレーンテキストにすべき」ですか? |
MFMには 追記: もちろん |
URLをリンク化するなども出来なくなるので(試した)、デメリットが大きそうです。 |
Pの中の URL のリンク化も HTML として素直に解釈した結果としては行われないのが正しそう。ちゃんとリンクを想定してるなら |
そもそもpreタグを付ければプレーンテキスト(codeblockで表示)として扱われます。 |
何も装飾してほしくないのか、適切に処理してほしいのかでアプローチが真逆になります。 |
私の場合は、タイトルが
であるので、HTMLとして装飾したものはMFMで(できる範囲で)再現、HTML上のテキストノードは(MFMとしてパースしうる文字列が含まれていても)そのまま表示してほしい、と解釈しました。 例を出すと、次のようなHTMLがActivityPubで来た場合: <strong>HTML上の太字です</strong> ~~なんか取り消し線っぽいけど別に取り消し線を引いてほしいわけではない文章~~ 現状のMisskeyだと: HTML上の太字です のような表示になると思いますが、これを HTML上の太字です ~~なんか取り消し線っぽいけど別に取り消し線を引いてほしいわけではない文章~~ のように表示してほしいという解釈ですが、いかがでしょうか。 @WinLinux1028 |
その解釈で大丈夫です👍 |
contentはHTMLで装飾されていますので、HTMLタグはもちろん(安全面やデザイン面から許せる範囲で)生かします。 MFM未対応環境の実装を利用している投稿者が本文中に書いたHTMLタグは、HTMLタグとしての解釈を意図したものではなく、単にHTMLタグの説明などを行うために記載したものです。ついては、これをHTMLタグとして解釈する これ、これからみてみるけど、mfm.jsに食わせる前の前処理で<とか元に戻しちゃってるんじゃないかな? |
これは私の勘違いで、正しくはpre codeの場合でした。 |
@sakuhanight あなたがなぜ |
はい、APで受け取ったものをHTML→MFMにする処理があります。 |
別に執着していません。例示がpであるため、それについて言及しているだけです。 |
ちょっと話がそれるけど、issueタイトルにも関わるので。 現行のMisskey、導入経緯とかあると思うんだけど、 逆に、他実装からMFMを意図してActivityPubでMisskeyに伝えたい場合、最大限HTMLで再現した互換用のcontentと共に、 |
Misskeyの現行の基本方針が
であるということでしたので、あらためて仕様を再検討できるよう、材料をまとめてみました。ベースにして議論していただければ幸いです。 引用ブロック電子メールなどで多用される行頭からの > 記号を、慣例に従い引用構文として解釈することは、投稿者の環境において解釈されていない場合においても意図に沿っており、利用者の閲覧性を高めると考えられる。 他方、引用を意図していない記号表現(下記の例など)を引用構文として解釈することで、投稿者の意図に反し、コミュニケーションを阻害することがある。
提案引用ブロックと解釈する利便性が高い一方で、問題になるケースは少ないように思われる。
HTMLタグHTMLタグを説明するために書かれたプレーンテキストの文章をHTMLとして解釈することで、投稿者の意図が失われ、コミュニケーションを阻害することがある。
提案
アンカーになっていないリンク可能な要素(メンション、ハッシュタグ、URL)メンション、ハッシュタグ、URLなど、リンクできる要素として解釈可能な要素のうち、アンカーになっていないもの。利便性を高めることもあるが、そもそも理由があってアンカーを外されている可能性があり、有効にすることで問題が生じる可能性がある。 アンカーをわざと外す例:
また、表現力の高いネイティブ表記の互換表現としてHTML化されたcontentの場合、投稿者が意図的にアンカーにならない記法を用いている結果である。 有効であるべきメンション、ハッシュタグ、URLは既にアンカーになっていることが期待できる。
提案
数式(ブロック・インライン)説明目的で記載されることもあるが、無意識に用いられることが想定されない表記法で、解釈しても実害はなさそう(要検証)
Markdown記法(太字、斜体、打ち消し、リンク記法、インラインコード、コードブロック)Markdown記法を説明するために書かれたプレーンテキストの文章をMarkdownとして解釈することで、投稿者の意図が失われ、コミュニケーションを阻害することがある。 また、Markdown表記などネイティブなリッチ表現が可能な実装では、ActivityPubのcontentのHTMLは変換済みの互換表現であるため、HTML化されてない表現に変換すると意図に反した表現になる。 他方、リッチ表現ができない実装において、投稿者がMarkdown解釈可能な実装で解釈・表示されることを期待し、あえてプレーンテキスト環境でMarkdown記法を用いて表現することがある。この場合、解釈されれば有益で便利である。 ***big!*** **bold** __bold__ *italic* _italic_ ~~strike~~ [Misskey.io](https://misskey.io/) ?[Misskey.io](https://misskey.io/) `$abc <- 1` ```js abc ``` 提案
|
現行Misskeyのフロントエンドでは、これらを用いた場合はbold/italic/strikeが適用されるようになっています。(掛けないようにするにはplainが必要) なお、bはともかく、iについては日本語等がある場合に利用され得ると考えます。_では日本語を含む場合にitalic化されません(もしかしてバグだったのでしょうか?) |
このまとめは全て、_misskey_contentがない投稿のcontentを対象とした記述ですので、Misskeyフロントエンドからの利用方法は除外してあります。 MFMがネイティブの環境では、利用ケースがあるのは当然のことと思います。 イタリックが日本語に適用されないことがあるのは、ブラウザ実装の問題だったと思います。 |
なるほど |
ところで、私の方でひとつプルリクエストしましたが、HTMLタグをエスケープする実装をつめていたら、結局はmfm.jsは変更せずすべてエスケープするだけのシンプルな実装になりました。ついては、 @anatawa12 さんの実装をベースに進めれば良さそうですので、私の方は閉じておきます。 |
noellabo さんのメッセージは"提案"とありますが一つを提案するというよりは選択肢を示しているという認識で間違いないですかね。 引用ブロックの除外されるべき |
Misskey同士ならただユーザーがエスケープすればいいのではないでしょうか? このIssueは, MFMに対応していないサーバーから送信された投稿がMFMとして処理されるということを投稿者は想定していないため, 投稿者の想定通りに表示されてほしいという意図で書きました. |
そこまで想定していないと思います。 |
どの項目も考え方次第なので、皆さんに決めて頂けるよう、選択肢を示しました。 私個人としては、
あたりのバランスがいいかなと思っています。 |
💡 Summary
content
はmediaType
に従って処理され,mediaType
は存在しない場合はHTMLとして処理されなければなりません.https://www.w3.org/TR/activitystreams-vocabulary/#dfn-content
しかし, MisskeyはHTMLとして処理した後, さらにMarkdownとして処理されているように思います.
🥰 Expected Behavior
HTMLとして処理される
この投稿のActivityPub上での表現は
content: "<p>> これは引用として解釈されてはいけない</p>"
となっており,mediaType
は存在しないことからHTMLとして処理されなければなりません.🤬 Actual Behavior
Markdownとして処理されてしまう
📝 Steps to Reproduce
上記の投稿を作成した方法を記述します.
この実装は投稿時に以下のように入力形式を選択できます.
選択した形式に応じてそれをHTMLに変換する処理が行われるため, どれを選択してもActivityPub上ではHTMLとして見えます.
💻 Frontend Environment
🛰 Backend Environment (for server admin)
Do you want to address this bug yourself?
The text was updated successfully, but these errors were encountered: