From d0305401fd5fdca09e608b09a6a1dee85a15a8ce Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 22 Sep 2024 02:14:59 +0800 Subject: [PATCH] ui: allow third-party richmedia provider --- .../backendlib/markdown-it-media.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/ui-default/backendlib/markdown-it-media.ts b/packages/ui-default/backendlib/markdown-it-media.ts index 1ffc746f3..eba2430f5 100644 --- a/packages/ui-default/backendlib/markdown-it-media.ts +++ b/packages/ui-default/backendlib/markdown-it-media.ts @@ -68,6 +68,7 @@ function resourceUrl(service: string, src: string, url: string) { src = src.split('?')[0]; return `//player.bilibili.com/player.html?${src.startsWith('BV') ? 'bvid' : 'aid'}=${src}&autoplay=0`; } + if (service === 'msoffice') return `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(src)}`; if (service === 'youku') return `https://player.youku.com/embed/${src}`; if (service === 'vimeo') return `https://player.vimeo.com/video/${src}`; if (service === 'vine') return `https://vine.co/v/${src}/embed/simple`; @@ -79,16 +80,22 @@ function resourceUrl(service: string, src: string, url: string) { return src; } +declare module 'hydrooj' { + interface ModuleInterfaces { + richmedia: { + get: (src: string) => string | null; + } + } +} + export function Media(md: MarkdownIt) { - const supported = ['youtube', 'vimeo', 'vine', 'prezi', 'bilibili', 'youku']; + const supported = ['youtube', 'vimeo', 'vine', 'prezi', 'bilibili', 'youku', 'msoffice']; md.renderer.rules.video = function tokenizeReturn(tokens, idx) { let src = md.utils.escapeHtml(tokens[idx].attrGet('src')); const service = md.utils.escapeHtml(tokens[idx].attrGet('service')).toLowerCase(); - if (service === 'msoffice') { - return `\ - - `; + if (Hydro.module.richmedia?.[service]) { + const result = Hydro.module.richmedia[service].get(src); + if (result) return result; } if (service === 'pdf') { if (src.startsWith('file://') || src.startsWith('./')) src += src.includes('?') ? '&noDisposition=1' : '?noDisposition=1';