Note
このドキュメントは2026-02-27 03:11にPLaMo Translation Modelを使用して自動翻訳されました。
FEP-c16b: MFM関数のフォーマット仕様
概要
本FEPでは、ActivityPub投稿コンテンツにおけるMFM(Misskey Markup Format)の表現方法について、カスタムクラスと[data-*属性]を用いたHTML形式による標準化を提案する。さらに、このHTML形式での表現を使用していることを示す新たな拡張用語を定義する。
要件
本文書中で使用する「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」および「OPTIONAL」という語句は、[RFC-2119]の規定に従って解釈されるものとする。また、「Fediverse実装」または「実装」とは、[ActivityPub]で定義されている通り、ActivityPub準拠クライアント、ActivityPub準拠サーバ、あるいはActivityPub準拠フェデレーテッドサーバを指すものとする。
謝辞
(本節は非規範的事項を含む)
本FEPの基本概念は、FoundkeyプロジェクトのissueトラッカーにおいてJohan150氏が提案したものである[1]。具体的には、span要素とカスタムクラス、およびdata-*属性を用いたHTML形式でのMFM関数表現に関する提案である。
履歴
(本節は非規範的事項を含む)
Fediverse実装において、テキスト入力としてマークアップ言語を許容することは一般的である。このようなコンテンツのフェデレーション処理では、通常、このテキスト入力を適切に理解可能な形式である標準的なHTMLに変換した上で行われる。このHTML表現は、[ActivityStreams]オブジェクトのcontentプロパティを用いてActivityPub経由で転送される。一方、ActivityPubが新たに追加したsourceプロパティは、元の入力データとそのフォーマットを任意で提供するために使用可能である。
Misskeyでは独自のマークアップ言語[MFM]を採用している。MFMは主にHTML、Markdown、Katex、および形式が$[name content]となるカスタムMFM関数から構成されている。これらのMFM関数が意図する内容を適切表示するためには、複雑なCSSや場合によってはJavaScriptが必要となる。そのため現状では、contentプロパティには簡略化されたHTML表現のみが提供されており、受信側実装によっては著者の本来の意図を正確に再現できない場合がある。MFMを正しく表示したい場合、受信側実装はsourceプロパティのmediaType値がtext/x.misskeymarkdownである場合に限り、その内容を再度解析する必要がある。これは不要なオーバーヘッドを生じるだけでなく、特に異なるパーサを使用する複数の実装間で互換性問題を引き起こす要因となる。
MFM関数について
(本節は非規範的事項を含む)
MFM関数は、名称、任意で値を持つ1つ以上の属性、および内容から構成される。その形式は$[name.attribute1,attribute2=value content]と定義される。
使用例
(本節は非規範的事項を含む)
$[x2 Misskey expands the world of the Fediverse]
$[jelly.speed=2s Misskey expands the world of the Fediverse]
$[spin.x,speed=0.5s Misskey expands the world of the Fediverse]
MFM関数のHTML表現方法
MFM関数をHTML形式で表現する場合、span要素を必ず使用しなければならない。このspan要素には、MFM関数名に対応するクラス属性mfm-nameを付与する必要がある。MFM関数に属性が存在する場合は、各属性に対してdata-*属性data-mfm-attributenameを追加しなければならない(ここでattributenameは対象属性の名称を示す)。さらに、MFM関数の属性値が存在する場合、対応するdata-*属性にはその値が正確に反映されなければならない。
使用例
(本節は非規範的事項を含む)
上記の使用例は以下のHTML表現に変換される:
<span class="mfm-x2">Misskey expands the world of the Fediverse</span>
<span class="mfm-jelly" data-mfm-speed="2s">Misskey expands the world of the Fediverse</span>
<span class="mfm-flip" data-mfm-x data-mfm-speed="0.5s">Misskey expands the world of the Fediverse</span>
MFMのその他の構成要素について
本FEPではMFM関数の表現方法に焦点を当てているが、MFMはこれらの関数のみで構成されるものではない。contentプロパティにおけるHTML表現は、受信側実装がMFMの内容を正確かつ完全に表示できるよう、適切で完全な形式である必要がある。
HTMLとMarkdownは通常、contentプロパティ内で正しく表現されており、Fediverse環境でも広く利用されている。このため、これらはMFM関数と同様の問題を引き起こすものではないと考えられる。
Katexについても、基本的にはcontentプロパティ内で適切に表現されないという問題を抱えている。Katex入力をHTMLとして正確に表現するためには、[FEP-dc88]の仕様に従うことが推奨される。
発見メカニズムについて
(本節は非規範的事項を含む)
MFM対応ではあるがFEP-c16bに準拠していない実装との互換性を確保する場合、sourceプロパティは引き続き"mediaType": "text/x.misskeymarkdown"としてフェデレートする必要がある。さらに、当該実装から受信したsourceコンテンツについても、再解析が必要となる可能性がある。このため、FEP-c16b準拠実装に対して、contentを直接利用可能である旨を通知するための発見メカニズムが求められる。
この目的のため、[FEP-888d]で規定されている新たな拡張用語の使用を提案する。
htmlMfm
contentがFEP-c16bに準拠していることを示すため、実装は値としてtrueを持つ拡張用語htmlMfmを任意で使用することができる。contentがFEP-c16b非準拠である場合、実装は値trueのhtmlMfm拡張用語を使用してはならないが、値falseのhtmlMfm拡張用語を使用することは許容される。
- 説明:
contentがFEP-c16bに準拠していることを示すフラグ - URI:
https://w3id.org/fep/c16b#htmlMfm - 適用範囲:
https://www.w3.org/ns/activitystreams#Object - 値の種類:ブール値
具体例
(本節は非規範的事項を含む)
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"htmlMfm": "https://w3id.org/fep/c16b#htmlMfm"
}
],
"content": "<span class=\"mfm-spin\" data-mfm-x data-mfm-speed=\"0.5s\">Misskey expands the world of the Fediverse</span>",
"source": {
"content": "$[spin.x,speed=0.5s Misskey expands the world of the Fediverse]",
"mediaType": "text/x.misskeymarkdown"
},
"htmlMfm": true
}
実装状況
参考文献
- [data-属性]:[HTML Living Standard](https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data--attributes)の一部仕様
- [RFC-2119] S. Bradner, RFCにおける要件レベルを示すためのキーワード使用規定, 1997年
- [ActivityPub] Christine Lemmer Webber、Jessica Tallon, ActivityPub, 2018年
- [1] Johan150, コンテンツフィールドにおけるMFMのHTML表現によるフェデレーション, 2023年
- [ActivityStreams] James M Snell、Evan Prodromou, ActivityStreams 2.0, 2017年
- [MFMマークアップ言語], MFM
- [FEP-dc88] Calvin Lee, FEP-dc88: 数式のフォーマット仕様, 2023年
- [FEP-888d] a, FEP-888d: FEP固有の名前空間基盤としてhttps://w3id.org/fepを使用する方法, 2023年
著作権について
CC0 1.0 Universal(CC0 1.0)パブリックドメイン献呈
本Fediverse拡張提案の著者らは、法律で許容される範囲内において、当該著作物に関するすべての著作権および関連権利を放棄している。