diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 1850ccfa16..6fd45aa957 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -135,8 +135,8 @@ Inline / Image / References / AutolinkedPhone - / AutolinkedURL / AutolinkedEmail + / AutolinkedURL / Emphasis / color / emoticon @@ -151,7 +151,7 @@ Whitespace = w:$" "+ { return plain(w); } Escaped = "\\" t:$. { return plain(t); } -Any = !EndOfLine t:$. { return plain(t); } +Any = !EndOfLine t:$. u:$URL? { return plain(t + u); } // = Line @@ -414,10 +414,18 @@ URL g:urlPath? h:urlQuery? ) + / $( + urlAuthorityHost + p:urlPath? + q:urlQuery? + f:urlFragment? + g:urlPath? + h:urlQuery? + ) urlScheme = $( - [A-Za-z] + [[A-Za-z] [A-Za-z0-9+.-] [A-Za-z0-9+.-]? [A-Za-z0-9+.-]? diff --git a/packages/message-parser/src/utils.ts b/packages/message-parser/src/utils.ts index 66fd757ab7..5ad904eaa1 100644 --- a/packages/message-parser/src/utils.ts +++ b/packages/message-parser/src/utils.ts @@ -69,8 +69,15 @@ export const strike = generate('STRIKE'); export const codeLine = generate('CODE_LINE'); export const link = (() => { const fn = generate('LINK'); - return (src: string, label?: Markup) => - fn({ src: plain(src), label: label || plain(src) }); + + return (src: string, label?: Markup) => { + const href = + src !== '' && !src.startsWith('http') && !src.startsWith('//') + ? `//${src}` + : src; + + return fn({ src: plain(href), label: label || plain(src) }); + }; })(); export const image = (() => { diff --git a/packages/message-parser/tests/link.test.ts b/packages/message-parser/tests/link.test.ts index 17806016eb..2e02a5f857 100644 --- a/packages/message-parser/tests/link.test.ts +++ b/packages/message-parser/tests/link.test.ts @@ -1,5 +1,13 @@ import { parser } from '../src'; -import { link, paragraph, plain, bold, strike, italic } from '../src/utils'; +import { + link, + paragraph, + plain, + bold, + strike, + italic, + quote, +} from '../src/utils'; test.each([ [ @@ -10,9 +18,14 @@ test.each([ [ ``, + [paragraph([plain('')])], + ], + [ + ` quote here`, [ - paragraph([plain('<'), link('https://domain.com'), plain('|Test')]), - paragraph([plain('>')]), + paragraph([plain(' { expect(parser(input)).toMatchObject(output); }); diff --git a/packages/message-parser/tests/url.test.ts b/packages/message-parser/tests/url.test.ts index 5f47db9e55..7b49b4929c 100644 --- a/packages/message-parser/tests/url.test.ts +++ b/packages/message-parser/tests/url.test.ts @@ -25,7 +25,7 @@ test.each([ ], ], ['http:/rocket.chat/teste', [paragraph([plain('http:/rocket.chat/teste')])]], - ['http:/rocket.chat/', [paragraph([plain('http:/rocket.chat/')])]], + ['https:/rocket.chat/', [paragraph([plain('https:/rocket.chat/')])]], ['https://test', [paragraph([plain('https://test')])]], [ 'httpsss://rocket.chat/test',