diff --git a/src/internal/parser.pegjs b/src/internal/parser.pegjs index fda5a19..acf1b8a 100644 --- a/src/internal/parser.pegjs +++ b/src/internal/parser.pegjs @@ -389,6 +389,11 @@ altUrlFormat { return text(); } +// URL scheme as defined in https://url.spec.whatwg.org/#url-scheme-string + / [a-zA-Z] [-a-zA-Z0-9+.]* ":" (!(">" / _) CHAR)+ +{ + return text(); +} // inline: link @@ -412,6 +417,11 @@ linkLabelPart linkUrl = url { return text(); } +// URL scheme as defined in https://url.spec.whatwg.org/#url-scheme-string + / [a-zA-Z] [-a-zA-Z0-9+.]* ":" (!(")" / _) CHAR)+ +{ + return text(); +} // inline: fn diff --git a/test/parser.ts b/test/parser.ts index 88d62cd..ea61969 100644 --- a/test/parser.ts +++ b/test/parser.ts @@ -882,6 +882,22 @@ hoge`; ]; assert.deepStrictEqual(mfm.parse(input), output); }); + + it('do not match other schemes in url withouth angle brackets', () => { + const input = 'oops:url'; + const output = [ + TEXT('oops:url'), + ]; + assert.deepStrictEqual(mfm.parse(input), output); + }); + + it('match other schemes in url with angle brackets', () => { + const input = ''; + const output = [ + N_URL('gemini://example.com', true), + ]; + assert.deepStrictEqual(mfm.parse(input), output); + }); }); describe('link', () => { @@ -962,6 +978,16 @@ hoge`; ]; assert.deepStrictEqual(mfm.parse(input), output); }); + + it('match other schemes without angle brackets', () => { + const input = '[send email](mailto:nobody@example.com?subject=test)'; + const output = [ + LINK(false, 'mailto:nobody@example.com?subject=test', [ + TEXT('send email') + ]), + ]; + assert.deepStrictEqual(mfm.parse(input), output); + }); }); describe('fn v1', () => {