首先我们还是需要引入两个依赖,实际上这两个依赖很简单,之后我会说一下它们分别是怎么实现的:
import 自定义菜单 from 'siyuan-noob/customMenu/index.js'
import 核心api from "siyuan-noob/utilKernel/kernelApi.js"
其中自定义菜单,是对思源的菜单进行菜单项注入的模块;而核心 api 顾名思义, 就是所有核心 api 的函数形式,因为不停重复写路径那些实在是太太太繁琐了,所以就弄了这么一个东西.
if(window.$syncer){
let allAccounts = []
window.$syncer.getAccounts(function (resp) {
console.log('allAccounts', resp)
allAccounts = resp
注册菜单项(allAccounts)
})
}
因为 wechatSync 会向页面内注入一个名为 $syncer 的对象,它就是文章同步功能的入口。
然后就是注册菜单项目了,对于每一个目标平台账号,我们都给它创建一个菜单项目。
function 注册菜单项(账户列表){
自定义菜单.编辑器菜单.注册自定义菜单项(
{
id:'wechatSync',
文字:`使用wechatSync发布`,
图标:'#iconInbox',
}
)
账户列表.forEach(
账户=>{
自定义菜单.编辑器菜单.注册自定义子菜单项(
(菜单项) => { return 菜单项.id == "wechatSync" },
{
id:账户.uid,
文字:`${账户.title}`,
图标:'#iconInbox',
点击回调函数:()=>{发布文档到(账户)}
}
)
}
)
}
我们来创建一个发布文档的函数,文档的 id 嘛,在菜单的状态里面就能够拿到了。
async function 发布文档到(账户){
let 块id = 自定义菜单.编辑器菜单.菜单状态.当前块id
let stmt = `select * from blocks where id in (select root_id from blocks where id = "${块id}" )`
let 文档数据 = (await 核心api.sql({ stmt: stmt }))[0]
let 文档内容 = await 核心api.exportPreview(
{
"id": 文档数据.id
}
)
let 文档属性 = await 核心api.getDocInfo(
{
"id": 文档数据.id
}
)
let 发布数据 = {}
发布数据.title = 文档属性.ial.title
发布数据.markdown = 文档数据.markdown
发布数据.content = 转换图片地址(文档内容)
发布数据.desc = 文档属性.ial.memo
发布数据.thumb = 文档属性.ial['title-img']
核心api.pushMsg({
"msg": `准备同步${文档数据.hpath}到${账户.title}`,
"timeout": 1000
}
, ""
)
添加任务(发布数据,账户)
}
然后我们需要转换一下图片的地址,因为思源的本地附件地址不会被识别:
function 转换图片地址(文档内容){
let div = document.createElement('div')
div.innerHTML = 文档内容.content ? 文档内容.content : 文档内容.html
div.querySelectorAll('[src]').forEach(
el=>{
if(el.getAttribute('src').startsWith('assets'))
{
el.setAttribute('src',window.location.origin+'/'+el.getAttribute('src'))
}
}
)
//下面这两行是可以去掉的,不过建议把思源的这一行留下来
div.innerHTML+='<p>本文使用<a href="https://b3log.org/siyuan/">思源笔记</a>写作</p>'
div.innerHTML+='<p>本文使用<a href="http://publish.chuanchengsheji.com/">椽承设计</a><a href="https://github.com/leolee9086/snippets">小工具</a>配合同步</p>'
return div.innerHTML
}
任务是这样生成的,一堆 if
,其实你也可以用三目运算符号来做这个事情:
function 生成任务(发布数据,账户) {
var post = {}
post.title = 发布数据.title
if (发布数据.content) {
post.content = 发布数据.content
} else if (发布数据.markdown) {
post.markdown = 发布数据.markdown
}
if (发布数据.thumb) {
post.thumb = 发布数据.thumb
}
if (发布数据.desc) {
post.desc = 发布数据.desc
}
else {
post.desc = 发布数据.content ? 发布数据.content.substring(0, 20) : 发布数据.markdown.substring(0, 20)
}
return post
}
这些都做完了之后,我们就可以把它们添加到 wechatSync 的发布任务表里面去了
function 添加任务(发布数据,账户){
window.$syncer.addTask(
{
post: 生成任务(发布数据,账户),
accounts: [账户],
},
function (status) {
status.accounts.forEach(account => {
if (account.editResp) {
let a = document.createElement('a')
a.setAttribute('href', account.editResp.draftLink)
a.setAttribute('target', "_blank")
a.setAttribute("referrerPolicy", "no-referrer")
a.click()
a.remove()
}
});
},
function () {
核心api.pushMsg({
"msg": `同步${文档数据.hpath}到${账户.title}完成`,
"timeout": 1000
})
}
)
}
这样点击文档菜单之后,文档就会被发布到对应的平台啦~~
效果就像是这样:
使用方式:
必须安装思源笔记折腾记录 - 运行你的笔记 - 链滴 (ld246.com)中的代码片段,或者插件集市中的运行笔记插件才可以直接剪藏之后运行这些代码.
推荐同时使用思源笔记折腾记录 - 快速开关代码片段 - 链滴 (ld246.com)用来更好地管理代码片段.
已知的问题:
这是一个对接到 wechatSync 浏览器插件的功能,所以它只有在浏览器打开思源的时候才能够生效。
水完收工,如果这玩意对你有用可以去爱发电给我买杯咖啡哒
leolee9086 正在创作一些简单的技术教程和小工具,以及设计方面内容 | 爱发电 (afdian.net)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于