UNPKG

@atlaskit/adf-schema

Version:

Shared package that contains the ADF-schema (json) and ProseMirror node/mark specs

80 lines (77 loc) 2.94 kB
/** * This file has been duplicated in packages/linking-platform/link-picker/src/common/utils/url.ts * Any changes made here should be mirrored there. */ import LinkifyIt from 'linkify-it'; var whitelistedURLPatterns = [/^https?:\/\//im, /^ftps?:\/\//im, /^gopher:\/\//im, /^integrity:\/\//im, /^file:\/\//im, /^smb:\/\//im, /^dynamicsnav:\/\//im, /^jamfselfservice:\/\//im, /^\//im, /^mailto:/im, /^skype:/im, /^callto:/im, /^facetime:/im, /^git:/im, /^irc6?:/im, /^news:/im, /^nntp:/im, /^feed:/im, /^cvs:/im, /^svn:/im, /^mvn:/im, /^ssh:/im, /^scp:\/\//im, /^sftp:\/\//im, /^itms:/im, /^notes:/im, /^hipchat:\/\//im, /^sourcetree:/im, /^urn:/im, /^tel:/im, /^xmpp:/im, /^telnet:/im, /^vnc:/im, /^rdp:/im, /^whatsapp:/im, /^slack:/im, /^sips?:/im, /^magnet:/im, /^#/im]; /** * Please notify the Editor Mobile team (Slack: #help-mobilekit) if the logic for this changes. */ export var isSafeUrl = function isSafeUrl(url) { var urlTrimmed = url.trim(); if (urlTrimmed.length === 0) { return true; } return whitelistedURLPatterns.some(function (p) { return p.test(urlTrimmed); }); }; export var linkify = LinkifyIt(); linkify.add('sourcetree:', 'http:'); linkify.add('jamfselfservice:', 'http:'); var tlds = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|'); var tlds2Char = 'a[cdefgilmnoqrtuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrtuvwxyz]|n[acefgilopruz]|om|p[aefghkmnrtw]|qa|r[eosuw]|s[abcdegijklmnrtuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'; tlds.push(tlds2Char); linkify.tlds(tlds, false); export var LINK_REGEXP = /(https?|ftp|jamfselfservice|gopher|dynamicsnav|integrity|file|smb):\/\/[^\s]+/; export var linkifyMatch = function linkifyMatch(text) { var matches = []; if (!LINK_REGEXP.test(text)) { return matches; } var startpos = 0; var substr; while (substr = text.substr(startpos)) { var link = (substr.match(LINK_REGEXP) || [''])[0]; if (link) { var index = substr.search(LINK_REGEXP); var start = index >= 0 ? index + startpos : index; var end = start + link.length; matches.push({ index: start, lastIndex: end, raw: link, url: link, text: link, schema: '' }); startpos += end; } else { break; } } return matches; }; export function getLinkMatch(str) { if (!str) { return null; } var match = linkifyMatch(str); if (!match.length) { match = linkify.match(str); } return match && match[0]; } /** * Adds protocol to url if needed. */ export function normalizeUrl(url) { var match = getLinkMatch(url); return match && match.url || ''; } /** * checks if root relative link */ export function isRootRelative(url) { return url.startsWith('/'); }