求助实现多个块的快速合并及折叠

求助一个 quicker 动作、思源按钮或快捷键,手动选中思源笔记的连续多个块时,点击思源按钮或 quicker 动作,实现以下功能:

  1. 将选中的多个块转换成引述或超级块。
  2. 将这个整体的引述或超级块折叠。
  • 思源笔记

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

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

    25523 引用 • 105573 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9766 引用 • 44433 回帖 • 88 关注

相关帖子

被采纳的回答
  • HugZephyr

    选中后 ctrl+q 触发, 触发后会将选中的内容转换成引用, 过程中会有点卡顿, 因为不知道为啥, 延时低了就会报错, 所以只能先让 sleep 时间长一点

    触发前, image.png, 触发后, image.png

    (()=>{ // 延迟执行 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function press_once(keyInit, selector = null) { keyInit["bubbles"] = true; if (selector == null) { selector = document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none) .protyle-wysiwyg.protyle-wysiwyg--attr') } else if (typeof selector === 'function') { selector = selector() } else if (typeof selector === 'string') { selector = document.querySelector(selector) } if (!selector) return selector.dispatchEvent(new KeyboardEvent('keydown', keyInit)); selector.dispatchEvent(new KeyboardEvent('keyup', keyInit)); } async function add_new_line_before() { press_once({ key: 'Enter', ctrlKey: true, shiftKey: true, keyCode: 13, // 不推荐使用,但某些情况下需要 }); } function click_right(ele) { // 创建一个右键点击的 MouseEvent const rightClickEvent = new MouseEvent('contextmenu', { bubbles: true, cancelable: true, view: window, button: 2 }); ele.dispatchEvent(rightClickEvent); } // 获取光标所在的元素 function getElementAtCursor() { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); const startContainer = range.startContainer; // 如果是文本节点,获取其父元素 const element = startContainer.nodeType === 3 ? startContainer.parentNode : startContainer; return element; } return null; // 如果没有选中内容或光标位置无效 } // 获取当前选中的文本 async function get_selected_data() { // 触发 ctrl+c, 复制选中的块 document.execCommand('copy'); // 获取剪贴板文本 return await navigator.clipboard.readText(); } // 设置文本 async function paste_data(data) { // 将处理后的文本复制到剪贴板 await navigator.clipboard.writeText(data); // 触发 ctrl+v, 粘贴处理后的内容 document.execCommand('paste'); await sleep(20) } // 清空选中的内容: 先剪切, 再增加空行 async function clear_selected_data() { // 触发 ctrl+x, 剪切选中的块, 目的是删除原有内容 document.execCommand('cut'); await add_new_line_before() } // 转换引用 - 使用系统自带的转换功能 function convert_quote_from_sys(event) { click_right(event.target) // 创建 mouseover 事件 const mouseOverEvent = new MouseEvent('mouseover', { view: window, bubbles: true, cancelable: true, }); let turn_ele = document.querySelector('.b3-menu__items>[data-id="turnInto"]') turn_ele?.dispatchEvent(mouseOverEvent); turn_ele = turn_ele?.querySelector('.b3-menu__submenu>.b3-menu__items>[data-id="quote"]') if (!turn_ele) return false turn_ele.click() return true } // 转换引用 - 使用自己实现的的转换功能 async function convert_quote_from_my(clipboardText) { // 删除原有内容, 并增加空行 await clear_selected_data() let clipboardTextRet = clipboardText .split('\n') .map(line => "> " + line) .join('\n') // 粘贴处理后的文本 await paste_data(clipboardTextRet); } async function fold_block() { await sleep(300); let ele = getElementAtCursor(); if (!ele) return while (!ele.parentNode.classList.contains("protyle-wysiwyg--attr") && ele.getAttribute('data-type') != 'NodeBlockquote') { ele = ele.parentNode } click_right(ele) await sleep(300) document.querySelector('.b3-menu__items>[data-id="fold"]')?.click() } // 合并选中的块 async function handle_merge(event) { // 获取当前选中的文本 let clipboardText = await get_selected_data(); // 如果不需要处理, 则直接返回 if (clipboardText == "") { console.log("不需要处理") return; } if (convert_quote_from_sys(event)) { console.log("系统转换成功") } else { await convert_quote_from_my(clipboardText) console.log("自定义转换成功") } await fold_block(); } // 事件监听 document.addEventListener('keydown', async (event) => { // 检查是否按下了 Ctrl + q if (event.ctrlKey && event.key === 'q') { // event.preventDefault(); // 防止快捷键默认行为 await handle_merge(event); } }); })()

欢迎来到这里!

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

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

    选中后 ctrl+q 触发, 触发后会将选中的内容转换成引用, 过程中会有点卡顿, 因为不知道为啥, 延时低了就会报错, 所以只能先让 sleep 时间长一点

    触发前, image.png, 触发后, image.png

    (()=>{ // 延迟执行 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function press_once(keyInit, selector = null) { keyInit["bubbles"] = true; if (selector == null) { selector = document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none) .protyle-wysiwyg.protyle-wysiwyg--attr') } else if (typeof selector === 'function') { selector = selector() } else if (typeof selector === 'string') { selector = document.querySelector(selector) } if (!selector) return selector.dispatchEvent(new KeyboardEvent('keydown', keyInit)); selector.dispatchEvent(new KeyboardEvent('keyup', keyInit)); } async function add_new_line_before() { press_once({ key: 'Enter', ctrlKey: true, shiftKey: true, keyCode: 13, // 不推荐使用,但某些情况下需要 }); } function click_right(ele) { // 创建一个右键点击的 MouseEvent const rightClickEvent = new MouseEvent('contextmenu', { bubbles: true, cancelable: true, view: window, button: 2 }); ele.dispatchEvent(rightClickEvent); } // 获取光标所在的元素 function getElementAtCursor() { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); const startContainer = range.startContainer; // 如果是文本节点,获取其父元素 const element = startContainer.nodeType === 3 ? startContainer.parentNode : startContainer; return element; } return null; // 如果没有选中内容或光标位置无效 } // 获取当前选中的文本 async function get_selected_data() { // 触发 ctrl+c, 复制选中的块 document.execCommand('copy'); // 获取剪贴板文本 return await navigator.clipboard.readText(); } // 设置文本 async function paste_data(data) { // 将处理后的文本复制到剪贴板 await navigator.clipboard.writeText(data); // 触发 ctrl+v, 粘贴处理后的内容 document.execCommand('paste'); await sleep(20) } // 清空选中的内容: 先剪切, 再增加空行 async function clear_selected_data() { // 触发 ctrl+x, 剪切选中的块, 目的是删除原有内容 document.execCommand('cut'); await add_new_line_before() } // 转换引用 - 使用系统自带的转换功能 function convert_quote_from_sys(event) { click_right(event.target) // 创建 mouseover 事件 const mouseOverEvent = new MouseEvent('mouseover', { view: window, bubbles: true, cancelable: true, }); let turn_ele = document.querySelector('.b3-menu__items>[data-id="turnInto"]') turn_ele?.dispatchEvent(mouseOverEvent); turn_ele = turn_ele?.querySelector('.b3-menu__submenu>.b3-menu__items>[data-id="quote"]') if (!turn_ele) return false turn_ele.click() return true } // 转换引用 - 使用自己实现的的转换功能 async function convert_quote_from_my(clipboardText) { // 删除原有内容, 并增加空行 await clear_selected_data() let clipboardTextRet = clipboardText .split('\n') .map(line => "> " + line) .join('\n') // 粘贴处理后的文本 await paste_data(clipboardTextRet); } async function fold_block() { await sleep(300); let ele = getElementAtCursor(); if (!ele) return while (!ele.parentNode.classList.contains("protyle-wysiwyg--attr") && ele.getAttribute('data-type') != 'NodeBlockquote') { ele = ele.parentNode } click_right(ele) await sleep(300) document.querySelector('.b3-menu__items>[data-id="fold"]')?.click() } // 合并选中的块 async function handle_merge(event) { // 获取当前选中的文本 let clipboardText = await get_selected_data(); // 如果不需要处理, 则直接返回 if (clipboardText == "") { console.log("不需要处理") return; } if (convert_quote_from_sys(event)) { console.log("系统转换成功") } else { await convert_quote_from_my(clipboardText) console.log("自定义转换成功") } await fold_block(); } // 事件监听 document.addEventListener('keydown', async (event) => { // 检查是否按下了 Ctrl + q if (event.ctrlKey && event.key === 'q') { // event.preventDefault(); // 防止快捷键默认行为 await handle_merge(event); } }); })()
    1 回复
  • 其他回帖
  • wenbocn

    可用,非常感谢!

  • wenbocn

    或选中多个块后,中键任意一个块的块标,能够实现组合这些块并折叠,那就更好了
    [js] 鼠标中键折叠块 - 链滴

  • wenbocn

    折叠快捷键,只能折叠一个块。只能折叠引述里面光标所在的单个块

  • 查看全部回帖

推荐标签 标签

  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    125 引用 • 74 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    170 引用 • 315 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 706 关注
  • OnlyOffice
    4 引用 • 22 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 200 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • Word
    13 引用 • 41 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 277 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 500 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 178 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 631 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 529 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 57 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 1 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 6 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 167 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 29 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 3 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 162 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 451 关注