求助一个 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);
}
});
})()
人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。
Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
Postman 是一款简单好用的 HTTP API 调试工具。
Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。
GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。
Mobi.css is a lightweight, flexible CSS framework that focus on mobile.
Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。
Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。
开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。
百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。
机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。
Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。
用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖。
用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/
jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。
有空闲时间是接外包好呢还是学习好呢?
GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。
Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。
以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。
Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。
webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。
一些有用的避坑指南。
本标签主要用于分享网络空间安全专业的学习笔记
支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。
NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。