首先还是引入依赖:
import 自定义菜单 from 'siyuan-noob/customMenu' import 核心api from 'siyuan-noob/utilKernel/kernelApi.js'
因为我们需要搞到块的超链接锚文本,这个请求不大所以就弄成同步的算了
function syncPost(url, data) { const xhr = new XMLHttpRequest(); xhr.open('POST', url, false); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); return JSON.parse(xhr.responseText); }
因为兼容性问题,从思源的源码抄了俩函数
export const focusByRange = (range) => { if (!range) { return; } const selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); };
export const writeText = async (text) => { let range; if (getSelection().rangeCount > 0) { range = getSelection().getRangeAt(0).cloneRange(); } try { // navigator.clipboard.writeText 抛出异常不进入 catch,这里需要先处理移动端复制 if ("android" === window.siyuan.config.system.container && window.JSAndroid) { window.JSAndroid.writeClipboard(text); return; } if ("ios" === window.siyuan.config.system.container && window.webkit?.messageHandlers) { window.webkit.messageHandlers.setClipboard.postMessage(text); return; } navigator.clipboard.writeText(text); } catch (e) { if (window.siyuan.config.system.container === "ios" && window.webkit?.messageHandlers) { window.webkit.messageHandlers.setClipboard.postMessage(text); } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { window.JSAndroid.writeClipboard(text); } else { const textElement = document.createElement("textarea"); textElement.value = text; textElement.style.position = "fixed"; //avoid scrolling to bottom document.body.appendChild(textElement); textElement.focus(); textElement.select(); document.execCommand("copy"); document.body.removeChild(textElement); if (range) { focusByRange(range); } } } };
然后弄出两个菜单项
let 菜单项1 = { id:"复制带有原文的web超链接", 文字:"复制带有原文的web超链接", 点击回调函数:(e)=>{ let 块id = 自定义菜单.块标菜单.菜单状态.当前块id let 块元素 = document.querySelector(`.protyle-wysiwyg.protyle-wysiwyg--attr div[data-node-id='${块id}']`) let res= syncPost("/api/block/getRefText",{id:块id}) writeText(`[${res.data}](${window.location.href.split('?')[0].replace('/stage/build/app/','/stage/build/desktop/')}?id=${块id})`) } } let 菜单项2={ id:"复制带有原文的块超链接", 文字:"复制带有原文的块超链接", 点击回调函数:(e)=>{ let 块id = 自定义菜单.块标菜单.菜单状态.当前块id let 块元素 = document.querySelector(`.protyle-wysiwyg.protyle-wysiwyg--attr div[data-node-id='${块id}']`) let res= syncPost("/api/block/getRefText",{id:块id}) writeText(`[${res.data}](siyuan://blocks/${块id})`) } }
再把它们丢到对应的菜单项目里面去
自定义菜单.块标菜单.注册自定义菜单项(菜单项1) 自定义菜单.块标菜单.注册自定义菜单项(菜单项2)
主要存在的问题就是,emm,除了第一个空间之外,其他工作空间的链接端口是会变的,先不管了,就这样吧
使用方法还是参考:
思源笔记折腾记录 - 稍微汇总一下 - 链滴 (ld246.com)
水完收工,如果这玩意对你有用可以去爱发电给我买杯咖啡哒
leolee9086 正在创作一些简单的技术教程和小工具,以及设计方面内容 | 爱发电 (afdian.net)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于