diff --git a/docs/syntax.md b/docs/syntax.md index 589ff37f5ba563f577f47c75ee5f6122ea0b4970..1d8b2ceae2eaf3be77031d25058b431f50890bef 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -349,6 +349,7 @@ _italic_ ## 詳細 - インライン構文。 - 内容ã«ã¯æ”¹è¡Œã‚’å«ã‚ã‚‹ã“ã¨ãŒã§ããªã„。 +- 内容ã«ã¯ã€ŒÂ´ã€ã‚’å«ã‚ã‚‹ã“ã¨ãŒã§ããªã„。 @@ -447,12 +448,14 @@ _italic_ - 内容ã«ã¯`.` `,` `!` `?` `'` `"` `#` `:` `/` `ã€` `】` ã‚’å«ã‚ã‚‹ã“ã¨ãŒã§ããªã„。 - 括弧ã¯å¯¾ã«ãªã£ã¦ã„る時ã®ã¿å†…容ã«å«ã‚ã‚‹ã“ã¨ãŒã§ãる。対象: `()` `[]` `「ã€` - `#`ã®å‰ã®æ–‡å—ãŒ(改行ã€ã‚¹ãƒšãƒ¼ã‚¹ã€ç„¡ã—ã€[a-zA-Z0-9]ã«ä¸€è‡´ã—ãªã„)ã®ã„ãšã‚Œã‹ã®å ´åˆã«ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¨ã—ã¦èªè˜ã™ã‚‹ã€‚ +- 内容ãŒæ•°å—ã®ã¿ã®å ´åˆã¯ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¨ã—ã¦èªè˜ã—ãªã„。 <h1 id="url">URL</h2> ## å½¢å¼ +構文1: ``` https://misskey.io/@ai ``` @@ -461,6 +464,15 @@ https://misskey.io/@ai http://hoge.jp/abc ``` +構文2: +``` +<https://misskey.io/@ai> +``` + +``` +<http://è—.jp/abc> +``` + ## ノード ```js { @@ -473,10 +485,15 @@ http://hoge.jp/abc ## 詳細 - インライン構文。 + +構文1ã®ã¿: - 内容ã«ã¯`[.,a-z0-9_/:%#@$&?!~=+-]i`ã«ãƒžãƒƒãƒã™ã‚‹æ–‡å—を使用ã§ãる。 - 内容ã«ã¯å¯¾ã«ãªã£ã¦ã„る括弧を使用ã§ãる。対象: `(` `)` `[` `]` - `.`ã‚„`,`ã¯æœ€å¾Œã®æ–‡å—ã«ã§ããªã„。 +構文2ã®ã¿: +- 内容ã«ã¯æ”¹è¡Œã€ã‚¹ãƒšãƒ¼ã‚¹ä»¥å¤–ã®æ–‡å—を使用ã§ãる。 + <h1 id="link">リンク</h2> diff --git a/package.json b/package.json index 01cad0b5c6c87325e68e15aa30b8f9d02c11b9e1..bc18a455cd642471bc1c8d5a5343670dea5a1e7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mfm-js", - "version": "0.16.5", + "version": "0.17.0", "description": "An MFM parser implementation with PEG.js", "main": "./built/index.js", "types": "./built/index.d.ts", diff --git a/src/parser.pegjs b/src/parser.pegjs index b22092bbe5138d26984ba8a1dea711974def74ad..342cfcb032af665a6e27b297df473dfe71fdf7ee 100644 --- a/src/parser.pegjs +++ b/src/parser.pegjs @@ -291,7 +291,7 @@ strike // inline: inlineCode inlineCode - = "`" content:$(!"`" c:CHAR { return c; })+ "`" + = "`" content:$(![`´] c:CHAR { return c; })+ "`" { return INLINE_CODE(content); } @@ -341,7 +341,13 @@ hashtag } hashtagContent - = (hashtagBracketPair / hashtagChar)+ { return text(); } + = !(invalidHashtagContent !hashtagContentPart) hashtagContentPart+ { return text(); } + +invalidHashtagContent + = [0-9]+ + +hashtagContentPart + = hashtagBracketPair / hashtagChar hashtagBracketPair = "(" hashtagContent* ")" @@ -354,7 +360,7 @@ hashtagChar // inline: URL url - = "<" url:urlFormat ">" + = "<" url:altUrlFormat ">" { return N_URL(url); } @@ -364,14 +370,11 @@ url } urlFormat - = "http" "s"? "://" urlContent + = "http" "s"? "://" urlContentPart+ { return text(); } -urlContent - = urlContentPart+ - urlContentPart = urlBracketPair / [.,] &urlContentPart // last char is neither "." nor ",". @@ -381,6 +384,12 @@ urlBracketPair = "(" urlContentPart* ")" / "[" urlContentPart* "]" +altUrlFormat + = "http" "s"? "://" (!(">" / _) CHAR)+ +{ + return text(); +} + // inline: link link