A MFM (Markup language For Misskey) parser implementation for Dart and Flutter, built with PetitParser.
- MFM syntax support
- Inline: bold, italic, strike, small, inline code, link, URL, mention, hashtag, emoji, MFM functions
- Block: quote, center, code block, math block, search
- Compatible with mfm.js parsing behavior
- Simple parser for lightweight use cases (user names, basic content)
- Full parser for complete MFM documents
- Configurable nest depth limit (same feature as mfm.js)
- Immutable AST nodes with value equality,
copyWith(), and pattern matching support
dart:
dart pub add misskey_mfm_parserflutter:
flutter pub add misskey_mfm_parserimport 'package:misskey_mfm_parser/misskey_mfm_parser.dart';
void main() {
// Full parsing
final parser = MfmParser().build();
final result = parser.parse('Hello **world** @user :emoji:');
if (result.isSuccess) {
final nodes = result.value; // List<MfmNode>
for (final node in nodes) {
print(node);
}
}
// Simple parsing (text, unicode emoji, and custom emoji only)
final simpleParser = MfmParser().buildSimple();
final simpleResult = simpleParser.parse('Hello 😇 :wave:');
if (simpleResult.isSuccess) {
final nodes = simpleResult.value;
// [TextNode('Hello '), UnicodeEmojiNode('😇'), TextNode(' '), EmojiCodeNode('wave')]
}
}For more examples, see example.
| Syntax | Node Type | Example |
|---|---|---|
| Bold | BoldNode |
**text**, <b>text</b> |
| Italic | ItalicNode |
*text*, <i>text</i> |
| Strike | StrikeNode |
~~text~~, <s>text</s> |
| Small | SmallNode |
<small>text</small> |
| Inline Code | InlineCodeNode |
`code` |
| Code Block | CodeBlockNode |
```lang\ncode\n``` |
| Quote | QuoteNode |
> text |
| Center | CenterNode |
<center>text</center> |
| Link | LinkNode |
[label](url) |
| URL | UrlNode |
https://example.com |
| Mention | MentionNode |
@user, @user@host |
| Hashtag | HashtagNode |
#tag |
| Custom Emoji | EmojiCodeNode |
:emoji: |
| Unicode Emoji | UnicodeEmojiNode |
😇 |
| MFM Function | FnNode |
$[shake text] |
| Math (inline) | MathInlineNode |
\(formula\) |
| Math (block) | MathBlockNode |
\[formula\] |
| Search | SearchNode |
query Search |
| Plain | PlainNode |
<plain>text</plain> |
3-Clause BSD License - see LICENSE
dart,flutter用のMFM(Markup language For Misskey)パーサー実装。 PetitParserを使用して構築しています。
- MFM構文のサポート
- インライン: 太字、斜体、取り消し線、小文字、インラインコード、リンク、URL、メンション、ハッシュタグ、絵文字、MFM関数
- ブロック: 引用、中央寄せ、コードブロック、数式ブロック、検索
- mfm.jsのパース動作と互換性あり
- 軽量なユースケース向けのシンプルパーサー(ユーザー名表示など)
- 完全なMFMドキュメント用のフルパーサー
- ネスト深度制限の設定が可能(mfm.jsと同じ機能)
- 値の等価性、
copyWith()、パターンマッチングをサポートするイミュータブルなASTノード
dart:
dart pub add misskey_mfm_parserflutter:
flutter pub add misskey_mfm_parserimport 'package:misskey_mfm_parser/misskey_mfm_parser.dart';
void main() {
// フルパース
final parser = MfmParser().build();
final result = parser.parse('こんにちは **世界** @user :emoji:');
if (result.isSuccess) {
final nodes = result.value; // List<MfmNode>
for (final node in nodes) {
print(node);
}
}
// シンプルパース(テキスト、Unicode絵文字、カスタム絵文字のみ)
final simpleParser = MfmParser().buildSimple();
final simpleResult = simpleParser.parse('こんにちは 😇 :wave:');
if (simpleResult.isSuccess) {
final nodes = simpleResult.value;
// [TextNode('こんにちは '), UnicodeEmojiNode('😇'), TextNode(' '), EmojiCodeNode('wave')]
}
}詳細な例は example に記載しています。
| 構文 | ノードタイプ | 例 |
|---|---|---|
| 太字 | BoldNode |
**text**, <b>text</b> |
| 斜体 | ItalicNode |
*text*, <i>text</i> |
| 取り消し線 | StrikeNode |
~~text~~, <s>text</s> |
| 小文字 | SmallNode |
<small>text</small> |
| インラインコード | InlineCodeNode |
`code` |
| コードブロック | CodeBlockNode |
```lang\ncode\n``` |
| 引用 | QuoteNode |
> text |
| 中央寄せ | CenterNode |
<center>text</center> |
| リンク | LinkNode |
[label](url) |
| URL | UrlNode |
https://example.com |
| メンション | MentionNode |
@user, @user@host |
| ハッシュタグ | HashtagNode |
#tag |
| カスタム絵文字 | EmojiCodeNode |
:emoji: |
| Unicode絵文字 | UnicodeEmojiNode |
😇 |
| MFM関数 | FnNode |
$[shake text] |
| 数式(インライン) | MathInlineNode |
\(formula\) |
| 数式(ブロック) | MathBlockNode |
\[formula\] |
| 検索 | SearchNode |
query Search |
| プレーン | PlainNode |
<plain>text</plain> |
3-Clause BSD License - LICENSE を参照