sfm-js/docs/syntax.md
marihachi 5fe291a7e7
TypeScript版パーサーのマージ (#124)
* implement parser with TypeScript (#116)

* clean parser

* parser, success, failure, str, parser.map

* seq

* atLeast, any, alt, match, notMatch

* mergeText

* improve seq

* lazy, createLanguage

* types

* regexp, refactor

* nest limit

* lint

* state

* syntaxes

* sep1, succeeded, option, fn

* simple

* strikeWave, plainTag, inlineCode, mathInline

* mention, refactor

* seqPartial

* 🚀

* parser trace

* fix mention, implement hashtag

* lineBegin, lineEnd, refactor

* imple codeBlock, fix lineEnd

* codeBlock, mathBlock

* fix codeBlock

* fix mathBlock

* fix codeBlock

* lint

* fix inlineCode

* 🚀

* centerTag

* fix nesting limit

* fix unicodeEmoji

* 🚀

* search

* refactor

* seqPartial -> seqOrText

* lint

* url, urlAlt

* 🚀

* 🚀

* text

* fix

* link

* linkLabel state

* lint

* nesting limit for link label

* fix url bracket pair

* nest

* refactor

* refactor

* remove

* add test

* wip quote

* add quote test

* quote

* refactor

* hashtag

* refactor

* type

* type

* refactor

* lint

* url

* italicAsta, italicUnder

* italicAsta, italicUnder, mention, rethink spec

* rethink spec

* test: change implementation-dependent parts

* hashtag

* add mention test

* mention

* mention

* mention

* mention

* url

* test

* hashtag

* Revert "Auxiliary commit to revert individual files from 373972beef10eb99ff3e3635a32a207854154a2a"

This reverts commit 622b66e20778ad5c283ea7629db853cbf2bb601f.

* package-lock

* Update tsconfig.json

* Update tsconfig.json

* ignore a tsd error when importing twemoji-parser regexp

* lint

* lint

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* v0.23.0-canary.1

* readme

* update chagelog

* update changelog

* update changelog

* refactor

* update core combinators

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2022-07-22 02:21:56 +09:00

9.8 KiB
Raw Blame History

目次

ブロック構文:

インライン構文:

Block: 引用ブロック

形式

> abc
>abc
>>nest

詳細

  • 引用された内容には再度FullParserを適用する。
  • >の後に続く01文字のスペースを無視する。
  • 隣接する引用の行は一つになる。
  • 複数行の引用では空行も含めることができる。
  • 引用の後ろにある空行は無視される。(#61)

ノード

{
  type: 'quote',
  children: [
    { type: 'text', props: { text: 'abc' } }
  ]
}

Block: 検索ブロック

形式

MFM 書き方 Search
MFM 書き方 検索
MFM 書き方 [Search]
MFM 書き方 [検索]

詳細

  • Searchの大文字小文字は区別されない。

ノード

{
  type: 'search',
  props: {
    query: 'MFM 書き方',
    content: 'MFM 書き方 Search'
  }
}

Block: コードブロック

形式

```
a

b```
```c
````
```
```js
abc
````

詳細

  • langは指定されない場合はnullになる。

ノード

{
  type: 'blockCode',
  props: {
    code: 'abc',
    lang: 'js'
  }
}

Block: 数式ブロック

形式

\[a = 1\]
\[
a = 2
\]

詳細

  • \[は行頭でなければならない。
  • \]は行末でなければならない。
  • 前後のスペースと改行はトリミングされる。

ノード

{
  type: 'mathBlock',
  props: {
    formula: 'a = 1'
  }
}

Block: 中央寄せブロック

形式

<center>abc</center>
<center>
abc
</center>

詳細

  • <center>は行頭でなければならない。
  • </center>は行末でなければならない。
  • 内容には再度InlineParserを適用する。

ノード

{
  type: 'center',
  children: [
    { type: 'text', props: { text: 'abc' } }
  ]
}

Inline: 揺れる字

廃止予定の構文。代替の構文が用意されています。

形式

***big!***

詳細

  • 内容には再度InlineParserを適用する。
  • 内容にはすべての文字、改行が使用できる。
  • 内容を空にすることはできない。

ノード

{
  type: 'fn',
  props: {
    name: 'tada',
    args: { }
  },
  children: [
    { type: 'text', props: { text: 'big!' } }
  ]
}

Inline: 太字

形式

構文1:

**bold**

構文2:

__bold__

構文3:

<b>bold</b>

詳細

  • 内容には再度InlineParserを適用する。
  • 内容を空にすることはできない。

構文1,3のみ:

  • 内容にはすべての文字、改行が使用できる。

構文2のみ:

  • 内容には[a-z0-9 \t]iにマッチする文字が使用できる。

ノード

{
  type: 'bold',
  children: [
    { type: 'text', props: { text: 'bold' } }
  ]
}

Inline: 目立たない字

形式

<small>small</small>

詳細

  • 内容には再度InlineParserを適用する。
  • 内容を空にすることはできない。
  • 内容にはすべての文字、改行が使用できる。

ノード

{
  type: 'small',
  children: [
    { type: 'text', props: { text: 'small' } }
  ]
}

Inline: イタリック

形式

構文1:

<i>italic</i>

構文2:

*italic*

構文3:

_italic_

詳細

  • 内容には再度InlineParserを適用する。
  • 内容を空にすることはできない。

構文1のみ:

  • 内容にはすべての文字、改行が使用できる。

構文2,3のみ:
※1つ目の*_を開始記号と呼ぶ。

  • 内容には[a-z0-9 \t]iにマッチする文字が使用できる。
  • 開始記号の前の文字が[a-z0-9]iに一致しない時にイタリック文字として判定される。

ノード

{
  type: 'italic',
  children: [
    { type: 'text', props: { text: 'italic' } }
  ]
}

Inline: 打ち消し線

形式

構文1:

~~strike~~

構文2:

<s>strike</s>

詳細

  • 内容には再度InlineParserを適用する。
  • 内容を空にすることはできない。

構文1のみ:

  • 内容には~、改行以外の文字を使用できる。

構文2のみ:

  • 内容にはすべての文字、改行が使用できる。

ノード

{
  type: 'strike',
  children: [
    { type: 'text', props: { text: 'strike' } }
  ]
}

Inline: インラインコード

形式

`$abc <- 1`

詳細

  • 内容を空にすることはできない。
  • 内容には改行を含めることができない。
  • 内容には「´」を含めることができない。

ノード

{
  type: 'inlineCode',
  props: {
    code: '$abc <- 1'
  }
}

Inline: インライン数式

形式

\(y = 2x\)

詳細

  • 内容を空にすることはできない。
  • 内容には改行を含めることができない。

ノード

{
  type: 'mathInline',
  props: {
    formula: 'y = 2x'
  }
}

Inline: メンション

形式

@user@misskey.io
@user

詳細

  • 最初の@の前の文字が[a-z0-9]iに一致しない場合にメンションとして認識する。

ユーザ名

  • 1文字以上。
  • AZ 09 _ -が含められる。
  • 1文字目と最後の文字は-にできない。

ホスト名

  • 1文字以上。
  • AZ 09 _ - .が含められる。
  • 1文字目と最後の文字は- .にできない。

ノード

{
  type: 'mention',
  props: {
    username: 'user',
    host: 'misskey.io',
    acct: '@user@misskey.io'
  }
}
{
  type: 'mention',
  props: {
    username: 'user',
    host: null,
    acct: '@user'
  }
}

Inline: ハッシュタグ

形式

#abc

詳細

  • 内容を空にすることはできない。
  • 内容には半角スペース、全角スペース、改行、タブ文字を含めることができない。
  • 内容には. , ! ? ' " # : / < > ( ) を含めることができない。
  • 括弧は対になっている時のみ内容に含めることができる。対象: () [] 「」
  • #の前の文字が[a-z0-9]iに一致しない場合にハッシュタグとして認識する。
  • 内容が数字のみの場合はハッシュタグとして認識しない。

ノード

{
  type: 'hashtag',
  props: {
    hashtag: 'abc'
  }
}

Inline: URL

形式

構文1:

https://misskey.io/@ai
http://hoge.jp/abc

構文2:

<https://misskey.io/@ai>
<http://藍.jp/abc>

詳細

構文1のみ:

  • 内容には[.,a-z0-9_/:%#@$&?!~=+-]iにマッチする文字を使用できる。
  • 内容には対になっている括弧を使用できる。対象: ( ) [ ]
  • .,は最後の文字にできない。

構文2のみ:

  • 内容には改行、スペース以外の文字を使用できる。

ノード

構文1:

{
  type: 'url',
  props: {
    url: 'https://misskey.io/@ai'
  }
}

または

{
  type: 'url',
  props: {
    url: 'https://misskey.io/@ai',
    brackets: false
  }
}

構文2:

{
  type: 'url',
  props: {
    url: 'https://misskey.io/@ai',
    brackets: true
  }
}

Inline: リンク

形式

silent=false

[Misskey.io](https://misskey.io/)

silent=true

?[Misskey.io](https://misskey.io/)

詳細

  • リンクラベルには再度InlineParserを適用する。ただし、リンクラベルではURL、リンク、メンションは使用できない。

ノード

[
  {
    type: 'link',
    props: {
      silent: false,
      url: 'https://misskey.io/'
    },
    children: [
      {
        type: 'text',
        props: {
          text: 'Misskey.io'
        }
      }
    ]
  }
]

Inline: 絵文字コード(カスタム絵文字)

形式

:thinking_ai:

詳細

  • 内容を空にすることはできない。
  • 内容には[a-z0-9_+-]iにマッチする文字を使用できる。

ノード

{
  type: 'emojiCode',
  props: {
    name: 'thinking_ai'
  }
}

Inline: 関数

形式

構文1:

$[shake 🍮]
$[spin.alternate 🍮]
$[shake.speed=1s 🍮]
$[flip.h,v MisskeyでFediverseの世界が広がります]

詳細

  • 内容には再度InlineParserを適用する。
  • 内容を空にすることはできない。
  • 内容には改行も含めることが可能です。

ノード

{
  type: 'fn',
  props: {
    name: 'shake',
    args: { }
  },
  children: [
    { type: 'unicodeEmoji', props: { emoji: '👍' } }
  ]
}

Inline: Unicode絵文字

形式

😇

ノード

{
  type: 'unicodeEmoji',
  props: {
    emoji: '😇'
  }
}

Inline: テキスト

形式

abc

ノード

{
  type: 'text',
  props: 
    text: 'abc'
  }
}