思源笔记折腾记录 - 快速移动 - 快速移动块到当前位置

本贴最后更新于 881 天前,其中的信息可能已经斗转星移

一、前情提要

我们之前弄了一下快速移动块,但是它并没有能力将某个块快速移动到当前文档正在编辑的位置中。

思源笔记折腾记录-快速移动文档 - 知乎 (zhihu.com)

就像这样:

image

现在来尝试一下快速移动某个之前记录的块到当前位置来。

二、 实现过程

1、实现移动块

这里还是一样的,先删除,再插入:

async function 移动块(当前待移动块id, 当前移动目标id) { let 当前移动目标属性 = await noobApi.核心api.sql({ stmt: `select * from blocks where id = '${当前移动目标id}'` }) if (当前移动目标属性[0].type !== 'd') { let 父块id = 当前移动目标属性[0].parent_id let 当前块dom = (await noobApi.核心api.获取文档({ id: 当前待移动块id, size: 102400 }, '')).content await noobApi.核心api.删除块({ id: 当前待移动块id }) await noobApi.核心api.插入块( { "dataType": "dom", "data": 当前块dom, "parentID": 父块id, "previousID": 当前移动目标id } ) } }

这样好像没有什么问题,但是需要考虑的一点是,万一移动目标在我们删除的块内部怎么办呢?

所以还是要校验一下移动目标块是不是存在:

export async function 根据id移动块到目标id后(当前待移动块id, 当前移动目标id) { if(当前待移动块id===当前移动目标id){ return } let 当前移动目标属性 = await noobApi.核心api.sql({ stmt: `select * from blocks where id = '${当前移动目标id}'` }) if (当前移动目标属性[0]&&当前移动目标属性[0].type !== 'd') { let 父块id = 当前移动目标属性[0].parent_id let 当前块dom = (await noobApi.核心api.获取文档({ id: 当前待移动块id, size: 102400 }, '')).content let 目标块存在 = (await noobApi.核心api.获取文档({ id: 当前待移动块id, size: 102400 }, '')).content if (目标块存在) { await noobApi.核心api.删除块({ id: 当前待移动块id }) await noobApi.核心api.插入块( { "dataType": "dom", "data": 当前块dom, "parentID": 父块id, "previousID": 当前移动目标id } ) } } }

这样就应该没有问题了。。。。。。。吧。

把它塞到 noobApi 里面,然后先试一下使用快捷键移动某个块:

quickMove\index.js

document.addEventListener('keydown',async (e) => { if ('KeyX' === e.code && e.ctrlKey && e.shiftKey) { if (!noobApi.内容块.当前待移动块id ) { noobApi.内容块.当前待移动块id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) } else { let 当前移动目标id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) noobApi.内容块.根据id移动块到目标id后(window.当前待移动块id, 当前移动目标id) noobApi.内容块.当前待移动块id = '' } } } ) function 获取最近上级块id(target) { console.log(target) if (target.getAttribute && target.getAttribute("data-node-id")) { return target.getAttribute("data-node-id") } else if (target.parentElement) { return 获取最近上级块id(target.parentElement) } }

效果就像这样:

移动当前块

看起来好像是可以的。

不过记录和移入都使用同一个快捷键好像有点不大好。

那就记录用 ctrl+shift+x,移入用 ctrl+shift+m 好了:

document.addEventListener('keydown', async(e) => { if ('KeyX' === e.code && e.ctrlKey && e.shiftKey) { if (!noobApi.内容块.当前待移动块id ) { noobApi.内容块.当前待移动块id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) } } if ('KeyM' === e.code && e.ctrlKey && e.shiftKey) { if (noobApi.内容块.当前待移动块id ) { let 当前移动目标id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) await noobApi.内容块.根据id移动块到目标id后(noobApi.内容块.当前待移动块id , 当前移动目标id) noobApi.内容块.当前待移动块id ='' } } } ) function 获取最近上级块id(target) { if (target.getAttribute && target.getAttribute("data-node-id")) { return target.getAttribute("data-node-id") } else if (target.parentElement) { return 获取最近上级块id(target.parentElement) } }

好像工作也正常.

2、加一个菜单

直接这样也不是不行,但是好像还是有个菜单好一点,之前实现了快速移动文档的菜单,把它移动到单独的模块里,然后另外实现弄一个移动块的:

import noobApi from "../../noobApi/index.js"; const {根据id移动块到目标id后} = noobApi.内容块 export default function 注册菜单(){ noobApi.自定义菜单.块标菜单.注册自定义菜单项( { id: '添加待移动块菜单', 文字: `添加当前块为待移动`, 图标: `#iconMove`, 点击回调函数: () => 添加当前块id() } ) noobApi.自定义菜单.块标菜单.注册自定义菜单项( { id: '移动已记录块到当前位置菜单', 文字: `移动已记录块到当前位置`, 图标: `#iconMove`, } ) } async function 添加当前块id(){ let 当前块id = noobApi.自定义菜单.块标菜单.菜单状态.当前块id noobApi.自定义菜单.块标菜单.注册自定义子菜单项((菜单项) => { return 菜单项.id == "移动已记录块到当前位置菜单" }, await 生成移动块菜单配置(当前块id)) } async function 生成移动块菜单配置(块id) { let { content, root_id } = await 获取菜单数据(块id) return { id: root_id, //加一段文字 文字: "移动当前块到:" + content, 图标: `#iconMove`, 点击回调函数: () => { let 当前块id = noobApi.自定义菜单.当前菜单.菜单状态.当前块id 根据id移动块到目标id后(块id, 当前块id) } } } async function 获取菜单数据(块id) { let stmt = `select * from blocks where id = "${块id}" ` let 块数据 = (await noobApi.核心api.sql({ stmt: stmt }))[0] return 块数据 } document.addEventListener('keydown', async(e) => { if ('KeyX' === e.code && e.ctrlKey && e.shiftKey) { if (!noobApi.内容块.当前待移动块id ) { noobApi.内容块.当前待移动块id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) //把它也加到菜单项目里面去 noobApi.自定义菜单.块标菜单.注册自定义子菜单项((菜单项) => { return 菜单项.id == "移动已记录块到当前位置菜单" }, await 生成移动块菜单配置(noobApi.内容块.当前待移动块id)) } } if ('KeyM' === e.code && e.ctrlKey && e.shiftKey) { if (noobApi.内容块.当前待移动块id ) { let 当前移动目标id = 获取最近上级块id(getSelection().getRangeAt(0).commonAncestorContainer) await noobApi.内容块.根据id移动块到目标id后(noobApi.内容块.当前待移动块id , 当前移动目标id) noobApi.内容块.当前待移动块id ='' } } } ) function 获取最近上级块id(target) { console.log(target) if (target.getAttribute && target.getAttribute("data-node-id")) { return target.getAttribute("data-node-id") } else if (target.parentElement) { return 获取最近上级块id(target.parentElement) } }

现在试一下效果大概是这样:

移动当前块

啊,现就这样吧,反正看起来好像能用


目前的代码片段的地址位于:

leolee9086/snippets (github.com)

viteWidgets 的地址位于

leolee9086/viteWidgets (github.com)

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25482 引用 • 105384 回帖
1 操作
leolee 在 2022-12-14 17:26:06 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...