From 79ffbf95db9d0cc019d06ab93b1bfa6ba0d4f9ae Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 21 Nov 2018 05:11:00 +0900 Subject: Improve MFM parser (#3337) * wip * wip * Refactor * Refactor * wip * wip * wip * wip * Refactor * Refactor * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Clean up * Update misskey-flavored-markdown.ts * wip * wip * wip * wip * Update parser.ts * wip * Add new test * wip * Add new test * Add new test * wip * Refactor * Update parse.ts * Refactor * Update parser.ts * wip --- src/mfm/parse/elements/big.ts | 20 -------------------- src/mfm/parse/elements/bold.ts | 20 -------------------- src/mfm/parse/elements/code.ts | 24 ------------------------ src/mfm/parse/elements/emoji.regex.ts | 2 -- src/mfm/parse/elements/emoji.ts | 33 --------------------------------- src/mfm/parse/elements/hashtag.ts | 27 --------------------------- src/mfm/parse/elements/inline-code.ts | 25 ------------------------- src/mfm/parse/elements/link.ts | 27 --------------------------- src/mfm/parse/elements/math.ts | 20 -------------------- src/mfm/parse/elements/mention.ts | 29 ----------------------------- src/mfm/parse/elements/motion.ts | 20 -------------------- src/mfm/parse/elements/quote.ts | 30 ------------------------------ src/mfm/parse/elements/search.ts | 19 ------------------- src/mfm/parse/elements/title.ts | 21 --------------------- src/mfm/parse/elements/url.ts | 23 ----------------------- 15 files changed, 340 deletions(-) delete mode 100644 src/mfm/parse/elements/big.ts delete mode 100644 src/mfm/parse/elements/bold.ts delete mode 100644 src/mfm/parse/elements/code.ts delete mode 100644 src/mfm/parse/elements/emoji.regex.ts delete mode 100644 src/mfm/parse/elements/emoji.ts delete mode 100644 src/mfm/parse/elements/hashtag.ts delete mode 100644 src/mfm/parse/elements/inline-code.ts delete mode 100644 src/mfm/parse/elements/link.ts delete mode 100644 src/mfm/parse/elements/math.ts delete mode 100644 src/mfm/parse/elements/mention.ts delete mode 100644 src/mfm/parse/elements/motion.ts delete mode 100644 src/mfm/parse/elements/quote.ts delete mode 100644 src/mfm/parse/elements/search.ts delete mode 100644 src/mfm/parse/elements/title.ts delete mode 100644 src/mfm/parse/elements/url.ts (limited to 'src/mfm/parse/elements') diff --git a/src/mfm/parse/elements/big.ts b/src/mfm/parse/elements/big.ts deleted file mode 100644 index 24e8bad50e..0000000000 --- a/src/mfm/parse/elements/big.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Big - */ - -export type TextElementBig = { - type: 'big'; - content: string; - big: string; -}; - -export default function(text: string) { - const match = text.match(/^\*\*\*(.+?)\*\*\*/); - if (!match) return null; - const big = match[0]; - return { - type: 'big', - content: big, - big: match[1] - } as TextElementBig; -} diff --git a/src/mfm/parse/elements/bold.ts b/src/mfm/parse/elements/bold.ts deleted file mode 100644 index 42c9cf0e1e..0000000000 --- a/src/mfm/parse/elements/bold.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Bold - */ - -export type TextElementBold = { - type: 'bold'; - content: string; - bold: string; -}; - -export default function(text: string) { - const match = text.match(/^\*\*(.+?)\*\*/); - if (!match) return null; - const bold = match[0]; - return { - type: 'bold', - content: bold, - bold: match[1] - } as TextElementBold; -} diff --git a/src/mfm/parse/elements/code.ts b/src/mfm/parse/elements/code.ts deleted file mode 100644 index 63a535fc55..0000000000 --- a/src/mfm/parse/elements/code.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Code (block) - */ - -import genHtml from '../core/syntax-highlighter'; - -export type TextElementCode = { - type: 'code'; - content: string; - code: string; - html: string; -}; - -export default function(text: string) { - const match = text.match(/^```([\s\S]+?)```/); - if (!match) return null; - const code = match[0]; - return { - type: 'code', - content: code, - code: match[1], - html: genHtml(match[1].trim()) - } as TextElementCode; -} diff --git a/src/mfm/parse/elements/emoji.regex.ts b/src/mfm/parse/elements/emoji.regex.ts deleted file mode 100644 index a5c6b71825..0000000000 --- a/src/mfm/parse/elements/emoji.regex.ts +++ /dev/null @@ -1,2 +0,0 @@ -// https://github.com/twitter/twemoji/blob/fc458b467c1bd706acd8653028ee8ab3e6562ce3/2/scripts/regex -export const emojiRegex = /^((?:\ud83d[\udc68\udc69])(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddb0-\uddb3])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f)|[\u0023\u002a\u0030-\u0039]\ufe0f?\u20e3|(?:[\u00a9\u00ae\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\uddb5\uddb6\uddb8\uddb9\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\udeeb\udeec\udef4-\udef9]|\ud83e[\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd40-\udd45\udd47-\udd70\udd73-\udd76\udd7a\udd7c-\udda2\uddb4\uddb7\uddc0-\uddc2\uddd0\uddde-\uddff]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f)/; diff --git a/src/mfm/parse/elements/emoji.ts b/src/mfm/parse/elements/emoji.ts deleted file mode 100644 index 6c09ddf5c0..0000000000 --- a/src/mfm/parse/elements/emoji.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Emoji - */ - -import { emojiRegex } from "./emoji.regex"; - -export type TextElementEmoji = { - type: 'emoji'; - content: string; - emoji?: string; - name?: string; -}; - -export default function(text: string) { - const name = text.match(/^:([a-zA-Z0-9+_-]+):/); - if (name) { - return { - type: 'emoji', - content: name[0], - name: name[1] - } as TextElementEmoji; - } - const unicode = text.match(emojiRegex); - if (unicode) { - const [content] = unicode; - return { - type: 'emoji', - content, - emoji: content - } as TextElementEmoji; - } - return null; -} diff --git a/src/mfm/parse/elements/hashtag.ts b/src/mfm/parse/elements/hashtag.ts deleted file mode 100644 index df07de6645..0000000000 --- a/src/mfm/parse/elements/hashtag.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Hashtag - */ - -export type TextElementHashtag = { - type: 'hashtag'; - content: string; - hashtag: string; -}; - -export default function(text: string, before: string) { - const isBegin = before == ''; - - if (!(/^\s#[^\s\.,!\?#]+/.test(text) || (isBegin && /^#[^\s\.,!\?#]+/.test(text)))) return null; - const isHead = text.startsWith('#'); - const hashtag = text.match(/^\s?#[^\s\.,!\?#]+/)[0]; - const res: any[] = !isHead ? [{ - type: 'text', - content: text[0] - }] : []; - res.push({ - type: 'hashtag', - content: isHead ? hashtag : hashtag.substr(1), - hashtag: isHead ? hashtag.substr(1) : hashtag.substr(2) - }); - return res as TextElementHashtag[]; -} diff --git a/src/mfm/parse/elements/inline-code.ts b/src/mfm/parse/elements/inline-code.ts deleted file mode 100644 index efacd734cb..0000000000 --- a/src/mfm/parse/elements/inline-code.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Code (inline) - */ - -import genHtml from '../core/syntax-highlighter'; - -export type TextElementInlineCode = { - type: 'inline-code'; - content: string; - code: string; - html: string; -}; - -export default function(text: string) { - const match = text.match(/^`(.+?)`/); - if (!match) return null; - if (match[1].includes('´')) return null; - const code = match[0]; - return { - type: 'inline-code', - content: code, - code: match[1], - html: genHtml(match[1]) - } as TextElementInlineCode; -} diff --git a/src/mfm/parse/elements/link.ts b/src/mfm/parse/elements/link.ts deleted file mode 100644 index 972fce3810..0000000000 --- a/src/mfm/parse/elements/link.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Link - */ - -export type TextElementLink = { - type: 'link'; - content: string; - title: string; - url: string; - silent: boolean; -}; - -export default function(text: string) { - const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/); - if (!match) return null; - const silent = text.startsWith('?'); - const link = match[0]; - const title = match[1]; - const url = match[2]; - return { - type: 'link', - content: link, - title: title, - url: url, - silent: silent - } as TextElementLink; -} diff --git a/src/mfm/parse/elements/math.ts b/src/mfm/parse/elements/math.ts deleted file mode 100644 index f2b6c5f479..0000000000 --- a/src/mfm/parse/elements/math.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Math - */ - -export type TextElementMath = { - type: 'math'; - content: string; - formula: string; -}; - -export default function(text: string) { - const match = text.match(/^\\\((.+?)\\\)/); - if (!match) return null; - const math = match[0]; - return { - type: 'math', - content: math, - formula: match[1] - } as TextElementMath; -} diff --git a/src/mfm/parse/elements/mention.ts b/src/mfm/parse/elements/mention.ts deleted file mode 100644 index 7a609e5d34..0000000000 --- a/src/mfm/parse/elements/mention.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Mention - */ -import parseAcct from '../../../misc/acct/parse'; -import { toUnicode } from 'punycode'; - -export type TextElementMention = { - type: 'mention'; - content: string; - canonical: string; - username: string; - host: string; -}; - -export default function(text: string, before: string) { - const match = text.match(/^@[a-z0-9_]+(?:@[a-z0-9\.\-]+[a-z0-9])?/i); - if (!match) return null; - if (/[a-zA-Z0-9]$/.test(before)) return null; - const mention = match[0]; - const { username, host } = parseAcct(mention.substr(1)); - const canonical = host != null ? `@${username}@${toUnicode(host)}` : mention; - return { - type: 'mention', - content: mention, - canonical, - username, - host - } as TextElementMention; -} diff --git a/src/mfm/parse/elements/motion.ts b/src/mfm/parse/elements/motion.ts deleted file mode 100644 index c6500e7be0..0000000000 --- a/src/mfm/parse/elements/motion.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Motion - */ - -export type TextElementMotion = { - type: 'motion'; - content: string; - motion: string; -}; - -export default function(text: string) { - const match = text.match(/^\(\(\((.+?)\)\)\)/) || text.match(/^(.+?)<\/motion>/); - if (!match) return null; - const motion = match[0]; - return { - type: 'motion', - content: motion, - motion: match[1] - } as TextElementMotion; -} diff --git a/src/mfm/parse/elements/quote.ts b/src/mfm/parse/elements/quote.ts deleted file mode 100644 index 969c1fb4a9..0000000000 --- a/src/mfm/parse/elements/quote.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Quoted text - */ - -export type TextElementQuote = { - type: 'quote'; - content: string; - quote: string; -}; - -export default function(text: string, before: string) { - const isBegin = before == ''; - - const match = text.match(/^"([\s\S]+?)\n"/) || text.match(/^\n>([\s\S]+?)(\n\n|$)/) || - (isBegin ? text.match(/^>([\s\S]+?)(\n\n|$)/) : null); - - if (!match) return null; - - const quote = match[1] - .split('\n') - .map(line => line.replace(/^>+/g, '').trim()) - .join('\n') - .trim(); - - return { - type: 'quote', - content: match[0], - quote: quote, - } as TextElementQuote; -} diff --git a/src/mfm/parse/elements/search.ts b/src/mfm/parse/elements/search.ts deleted file mode 100644 index f51844b079..0000000000 --- a/src/mfm/parse/elements/search.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Search - */ - -export type TextElementSearch = { - type: 'search'; - content: string; - query: string; -}; - -export default function(text: string) { - const match = text.match(/^(.+?)( | )(検索|\[検索\]|Search|\[Search\])(\n|$)/i); - if (!match) return null; - return { - type: 'search', - content: match[0], - query: match[1] - }; -} diff --git a/src/mfm/parse/elements/title.ts b/src/mfm/parse/elements/title.ts deleted file mode 100644 index a9922c8aca..0000000000 --- a/src/mfm/parse/elements/title.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Title - */ - -export type TextElementTitle = { - type: 'title'; - content: string; - title: string; -}; - -export default function(text: string, before: string) { - const isBegin = before == ''; - - const match = isBegin ? text.match(/^(【|\[)(.+?)(】|])\n/) : text.match(/^\n(【|\[)(.+?)(】|])\n/); - if (!match) return null; - return { - type: 'title', - content: match[0], - title: match[2] - } as TextElementTitle; -} diff --git a/src/mfm/parse/elements/url.ts b/src/mfm/parse/elements/url.ts deleted file mode 100644 index a16f67f2c2..0000000000 --- a/src/mfm/parse/elements/url.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * URL - */ - -export type TextElementUrl = { - type: 'url'; - content: string; - url: string; -}; - -export default function(text: string, before: string) { - const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.,=\+\-]+/); - if (!match) return null; - let url = match[0]; - if (url.endsWith('.')) url = url.substr(0, url.lastIndexOf('.')); - if (url.endsWith(',')) url = url.substr(0, url.lastIndexOf(',')); - if (url.endsWith(')') && before.endsWith('(')) url = url.substr(0, url.lastIndexOf(')')); - return { - type: 'url', - content: url, - url: url - } as TextElementUrl; -} -- cgit v1.2.3-freya