import moment, { Moment, MomentInput } from 'moment'; import emojiJson from 'markdown-it-emoji/lib/data/full.json'; import sanitizeHtml from 'sanitize-html'; import { marked } from 'marked'; import _ from 'lodash'; import { ModuleDefinition, ResourceClass } from '../types'; function parseVideos(text: string): string { const config = { youtube: { find: /^\s*https?:\/\/www\.youtube\.com\/watch\?v=(\w+)&?.*?$/gm, replace: 'https://www.youtube.com/embed/$1', }, qq: { // https://v.qq.com/x/cover/mzc00200016zk9d/k0044xauzt4.html find: /^\s*https?:\/\/v\.qq\.com\/x\/cover\/\w+\/(\w+)\.html.*?$/gm, replace: 'https://v.qq.com/txp/iframe/player.html?vid=$1', }, huya: { // https://www.huya.com/688 find: /^\s*https?:\/\/www\.huya\.com\/(\w+)/gm, replace: 'https://liveshare.huya.com/iframe/$1', }, youku: { // https://v.youku.com/v_show/id_XNTkwNDUxNTQ4MA==.html?spm=a2ha1.14919748_WEBHOME_GRAY.drawer5.d_zj1_3&scm=20140719.rcmd.7182.video_XNTkwNDUxNTQ4MA%3D%3D // find: /^\s*https?:\/\/v\.youku\.com\/v_show\/id_([\w=]+)\.html.*?$/gm, replace: 'https://player.youku.com/embed/$1', }, sohu: { // https://tv.sohu.com/v/cGwvOTc3MDY0Mi8zODc1ODA0MjMuc2h0bWw=.html find: /^\s*https?:\/\/tv\.sohu\.com\/v\/([\w=]+)\.html.*?$/gm, // replace: (match: string, p1: string) => { const url = atob(p1); const m = url.match(/(\d+)\.shtml/); let id = ''; if (m) { // eslint-disable-next-line prefer-destructuring id = m[1]; } return `https://tv.sohu.com/s/sohuplayer/iplay.html?bid=${id}&autoplay=false&disablePlaylist=true`; }, }, }; _.each(config, (item, id) => { text = text.replace(item.find, (match: string, p1: string) => { let { replace } = item; if (_.isFunction(replace)) { replace = replace(match, p1); } else { replace = replace.replace('$1', p1); } return ``; }); }); return text; } const useModule = function useModule(): ModuleDefinition { const mod: ModuleDefinition = { classAttributes: { marked, }, classMethods: { sanitizeHtml(html: string): string { return sanitizeHtml(html, { allowedTags: sanitizeHtml.defaults.allowedTags.concat([ 'img', 'iframe', ]), allowedIframeHostnames: [ 'www.youtube.com', 'v.qq.com', 'liveshare.huya.com', 'player.youku.com', 'tv.sohu.com', ], allowedAttributes: { iframe: [ 'src', 'width', 'height', 'frameborder', 'allowfullscreen', ], img: [ 'src', 'alt', 'height', 'width', ], }, }); }, parseEmoji(text: string): string { if (!text) { return ''; } _.each(emojiJson, (emoji, symbol) => { text = text.replace(`:${symbol}:`, emoji); }); return text; }, parseMarkdown(text: string): string { return this.sanitizeHtml( marked.parse(this.parseEmoji(parseVideos(text))) ); // http://ckang1229.gitee.io/vue-markdown-editor/zh/ // return this.sanitizeHtml(VueMarkdownEditor.themeConfig.markdownParser.render(this.parseEmoji(text))) }, parseVideos, moment(arg: MomentInput): Moment { return moment(arg); }, }, }; return mod; }; export default useModule;