-
求助实现多个块的快速合并及折叠
2024-11-19 14:31选中后
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); } }); })()
-
求助集市分组以及隐藏引述块的角标
2024-11-14 19:12引述块, 超级块
[data-type="NodeBlockquote"], [data-type="NodeSuperBlock"]{ .protyle-attr--refcount.popover__block {display:none;} }
-
能不能通过 API 获取“当前活动文档的 ID”?
2024-11-14 10:19这个可以不?
// 打印显示内容的文档的id document.querySelectorAll('div.fn__flex-1.protyle:not(.fn__none) span.protyle-breadcrumb__item.protyle-breadcrumb__item--active').forEach( file_ele => console.log(file_ele.getAttribute("data-node-id")) ) // 打印所有页签文档的id document.querySelectorAll('div.fn__flex-1.protyle span.protyle-breadcrumb__item.protyle-breadcrumb__item--active').forEach( file_ele => console.log(file_ele.getAttribute("data-node-id")) )
-
有没有大佬帮忙做一个中键折叠的功能
2024-11-11 20:13这个, 应该能符合你的需求
备注
- 只会折叠标题, 感觉你这个需求挺有意思的, 后续可能会研究下怎么折叠其他种类的块
- 折叠之后, 马上再次点击不会生效(不会展开), 需要等待 1s(很短)后再次点击才会生效, 应该是思源本身的问题, 折叠的图标连续两次点击, 第二次也不会生效, 写味也有这个问题, 暂时先不管了
document.addEventListener('mousedown', function(event) { // 判断是否是中键点击 if (event.button === 1) { // 中键的 button 值为 1 let fold_ele = document.querySelector('.protyle-gutters:not(.fn__none)')?.querySelector('[data-type="fold"]'); if (fold_ele) { event.preventDefault(); // 阻止默认中键点击的行为 fold_ele.click() } } });
-
建议行级代码内备注不要阻断文本复制
2024-11-07 19:38最近刚做过这个, 光标在行级代码里面(不选中)的时候,
ctrl+c
复制的是这个行级代码的纯文本, 而不是整行, 可以看下备注: 里面还有替换复制图片的功能, 如果不需要, 就把这个删掉
handle_cp_img(element);
-
[js] 替换原始 跳转到开头和末尾 快捷键效果
2024-11-02 12:02有没有一种可能, 这是 ai 写的
我还是喜欢下划线, 看着直观, 但是 ai 生成的 js 代码, 都是驼峰, 我懒得改了
所以现在是两种混在一起
-
css 引述颜色修改怎么弄?
2024-10-31 21:24- 不知道你这个
.b3-typography blockquote
是干啥的, 就把他删了, 如有需要, 自行补充 - 需要几层就重复几次就行了, 颜色自己调
.protyle-wysiwyg [data-node-id].bq { border-left-color: #c7477c; } .protyle-wysiwyg [data-node-id].bq [data-node-id].bq { border-left-color: red; } .protyle-wysiwyg [data-node-id].bq [data-node-id].bq [data-node-id].bq{ border-left-color: blue; }
- 不知道你这个
-
[js] 复制行级代码或图片时, 替换原始复制
2024-10-30 12:41复制行级代码时有 bug, 前缀会多一个空白字符
需要将
handle_cp_line_code
函数修改成下面这个// 处理复制行级代码 async function handle_cp_line_code(element) { if (!element) { return; } if (element.getAttribute('data-type') === 'code' && !hasSelectedText()) { // 如果是代码块,并且没有选中内容, 则复制代码块内容 let content = element.textContent; if (content.startsWith('\u200B')) { content = content.slice(1); // 移除前面的零宽空格 } await navigator.clipboard.writeText(content); await sleep(20) } }
-
求助通过 js 模拟上键失效
2024-10-25 14:15可以发下你测试的代码不, 我现在已经升到 3.1.10 了, 用这个测试, 是不行的
(()=>{ function press_once(keyInit) { keyInit["bubbles"] = true; let keydownEvent = new KeyboardEvent('keydown', keyInit); document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none) .protyle-wysiwyg.protyle-wysiwyg--attr')?.dispatchEvent(keydownEvent); let keyUpEvent = new KeyboardEvent('keyup', keyInit); document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none) .protyle-wysiwyg.protyle-wysiwyg--attr')?.dispatchEvent(keyUpEvent); } function press_enter() { press_once({ key: 'Enter', keyCode: 13, // 不推荐使用,但某些情况下需要 }); } function press_up() { press_once({ key: 'ArrowUp', keyCode: 38, // 不推荐使用,但某些情况下需要 }); } // 事件监听 document.addEventListener('keydown', async (event) => { // 检查是否按下了 Ctrl + r if (event.ctrlKey && event.key === 'r') { // event.preventDefault(); // 防止快捷键默认行为 // await handle_merge(); console.log("123") press_up() console.log("123") } }); })()
-
大纲能设置字体大小吗,或者能自动换行吗?
2024-10-21 17:2310px 自己调一下
.layout__dockr ul>li>span.b3-list-item__text{font-size:10px;}
-
大纲和文档树的宽度能设置成一致吗?文档树和大纲都放在左上角,点击互相切换的时候,宽度会变来变去,能不能在同一个宽度内互相切换
2024-10-21 17:12我这里宽度是一样的呀
是不是主题的问题, 用默认的主题试试