首先还是引入依赖:
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)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于