UNPKG

@diplodoc/transform

Version:

A simple transformer of text in YFM (Yandex Flavored Markdown) to HTML

113 lines (96 loc) 3.16 kB
import {VideoService} from './const'; import {Services} from './types'; const ytRegex = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/; export function youtubeParser(url: string) { const match = url.match(ytRegex); return match && match[7].length === 11 ? match[7] : url; } const vimeoRegex = /https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|album\/(\d+)\/video\/|)(\d+)(?:$|\/|\?)/; export function vimeoParser(url: string) { const match = url.match(vimeoRegex); return match && typeof match[3] === 'string' ? match[3] : url; } const vineRegex = /^http(?:s?):\/\/(?:www\.)?vine\.co\/v\/([a-zA-Z0-9]{1,13}).*/; export function vineParser(url: string) { const match = url.match(vineRegex); return match && match[1].length === 11 ? match[1] : url; } const preziRegex = /^https:\/\/prezi.com\/(.[^/]+)/; export function preziParser(url: string) { const match = url.match(preziRegex); return match ? match[1] : url; } // TODO: Write regex for staging and local servers. const mfrRegex = /^http(?:s?):\/\/(?:www\.)?mfr\.osf\.io\/render\?url=http(?:s?):\/\/osf\.io\/([a-zA-Z0-9]{1,5})\/\?action=download/; export function mfrParser(url: string) { const match = url.match(mfrRegex); return match ? match[1] : url; } const yandexRegex = /^https:\/\/runtime.video.cloud.yandex.net\/player\/video\/([a-zA-Z0-9]+)/; export function yandexParser(url: string) { const match = url.match(yandexRegex); return match ? match[1] : url; } const vkRegex = /^https:\/\/vk\.com\/video_ext\.php\?(oid=[-\d]+&id=[-\d]+)/; export function vkParser(url: string) { const match = url.match(vkRegex); return match ? match[1] : url; } const rutubeRegex = /^https:\/\/rutube\.ru\/video\/([a-zA-Z0-9]+)\/?/; export function rutubeParser(url: string) { const match = url.match(rutubeRegex); return match ? match[1] : url; } const urlParser = (url: string) => url; const supportedServices = { osf: { extract: mfrParser, }, prezi: { extract: preziParser, }, vimeo: { extract: vimeoParser, }, vine: { extract: vineParser, }, yandex: { extract: yandexParser, }, youtube: { extract: youtubeParser, }, vk: { extract: vkParser, csp: { 'frame-src': ['https://vk.com/', 'https://login.vk.com/'], }, }, rutube: { extract: rutubeParser, csp: { 'frame-src': ['https://rutube.ru/play/embed/'], }, }, url: { extract: urlParser, }, } as Services; export function parseVideoUrl(service: string, url: string) { let videoID = ''; const normalizedService = service.toLowerCase(); const parsed = supportedServices[normalizedService as VideoService]; if (!parsed) { return false; } const {extract, csp} = parsed; videoID = extract(url); // If the videoID field is empty, regex currently make it the close parenthesis. if (videoID === ')') { videoID = ''; } return [videoID, csp] as const; }