From f2884eefc2b6ca223144acf4951dfd3b8b5b56d6 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 8 Sep 2026 11:58:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(mdwidget):=20=E5=B7=B2=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=AA=92=E4=BD=93(img/video/audio)=E8=BF=BD=E5=8A=A0=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=8C=89=E9=92=AE=E2=80=94=E2=80=94=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?agent=E7=94=9F=E6=88=90=E7=9A=84=E5=AA=92=E4=BD=93=E5=8F=AF?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD;=E5=90=8C=E6=BA=90=E8=B5=B0=3Fdownload=3D1?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E9=99=84=E4=BB=B6(Content-Disposition),?= =?UTF-8?q?=E5=86=85=E8=81=94data=E7=94=A8download=E5=B1=9E=E6=80=A7,?= =?UTF-8?q?=E5=A4=96=E9=93=BE=E6=96=B0=E7=AA=97=E5=8F=A3;=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E6=94=BE=E5=9C=A8=E9=93=BE=E6=8E=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E4=B9=8B=E5=90=8E=E9=98=B2=E8=A2=ABonclick?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E6=88=90markdown=E5=8A=A0=E8=BD=BD(2026-09-0?= =?UTF-8?q?8=E7=94=A8=E6=88=B7=E5=AE=9A=E5=A4=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bricks/markdown_viewer.js | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/bricks/markdown_viewer.js b/bricks/markdown_viewer.js index 35ccfea..23f1a48 100644 --- a/bricks/markdown_viewer.js +++ b/bricks/markdown_viewer.js @@ -65,6 +65,71 @@ bricks.MdWidget = class extends bricks.JsWidget { links[i].href = '#'; links[i].onclick=this._build.bind(this, url); } + /* 媒体下载按钮:必须在上面的链接处理循环【之后】注入——否则同源 + 会被循环改成 onclick=_build(把 mp4 当 markdown 加载,下载不了)。 + marked 原生透传渲染 img/video/audio,这里只追加下载入口,不动渲染。 */ + this._add_media_download_buttons(); + } + /* 给已渲染的 / 是新建的,不会被再处理。 + 显式置空 onclick 防冒泡到父级链接拦截。 */ + a.onclick = function(e){ e.stopPropagation(); }; + if (is_data || href.indexOf(host) === 0 || href.charAt(0) === '/'){ + /* 同源/内联:a[download] 直接触发下载,不跳转 */ + } else { + a.target = '_blank'; + a.rel = 'noopener noreferrer'; + } + /* 插在媒体元素之后(同一父容器内) */ + if (el.nextSibling){ + el.parentNode.insertBefore(a, el.nextSibling); + } else { + el.parentNode.appendChild(a); + } + } } getname(){ return this.name || 'mdtext';