求助一个 quicker 动作、思源按钮或快捷键,手动选中思源笔记的连续多个块时,点击思源按钮或 quicker 动作,实现以下功能:
- 将选中的多个块转换成引述或超级块。
- 将这个整体的引述或超级块折叠。
求助一个 quicker 动作、思源按钮或快捷键,手动选中思源笔记的连续多个块时,点击思源按钮或 quicker 动作,实现以下功能:
选中后 ctrl+q
触发, 触发后会将选中的内容转换成引用, 过程中会有点卡顿, 因为不知道为啥, 延时低了就会报错, 所以只能先让 sleep 时间长一点
触发前, , 触发后,
(()=>{
// 延迟执行
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);
}
});
})()
选中后 ctrl+q
触发, 触发后会将选中的内容转换成引用, 过程中会有点卡顿, 因为不知道为啥, 延时低了就会报错, 所以只能先让 sleep 时间长一点
触发前, , 触发后,
(()=>{
// 延迟执行
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);
}
});
})()
Postman 是一款简单好用的 HTTP API 调试工具。
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
“梦想从学习开始,事业从实践起步” —— 习近平
C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。
Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。
宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。
机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。
房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。
App(应用程序,Application 的缩写)一般指手机软件。
iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。
Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。
TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。
NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。
Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。
SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。
Latke 是一款以 JSON 为主的 Java Web 框架。
WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。
CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。
Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
有什么新发现就分享给大家吧!
百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。
笔记整理交给我,一心只读圣贤书。