wilsons
关注
142093 号成员,2024-05-12 13:24:23 加入
1.9k
个人主页 浏览
1.4k
帖子 + 回帖 + 评论
人生最大的敌人是自己,战胜自己,才能超越一切。
  • 如何快速将列表块下的列表项块转换为列表块?

    2024-10-12 17:40

    其实没那么麻烦,不需要上下各按两次回车

    只需要,选中需要转换的列表项,然后剪切,按两次回车,粘贴即可。

    r73.gif

    当然,如果想自动化,也可以把这个操作,根据 EmberSky 大佬的方法设置成快捷键,实现一键转换。

  • 请教有没有转换块类型的公开 API?

    2024-10-12 17:23

    没有一个 api 可以实现简单的参数传递就能实现一个块转换为另一个块的,因为每种块的格式不同。

    需要多个 api 去配合实现,可以通过开发者工具里的网络进行抓包,然后进行想要的操作,看看思源是通过哪些 api 去实现的,然后模仿即可。

    1. 通过 api 对特定块 id 执行合并、取消超级块的操作

    根据网络抓包可知,合并为超级块,则是插入一个超级块,然后删除原来的块来实现的,实际上是一个插入块 api,多个删除块 api;取消超级块则是移动超级块子块,然后删除超级块实现的,实际上是移动多个块 api 和删除一个块 api 来实现的。

    1. 转换某个块类型为其他块

    如楼上所说是通过 updateBlock 来实现的,但要自己组装不同类型的块 dom 数据或者用 Markdown 调用 lute 转换为块 dom。建议先手动输入一个目标块,然后复制目标块 dom,然后填入相应的数据后调用更新块 api 更新即可。

    总之,没有简单的实现方式,需要多个 api 组合实现。

  • [js] 双击钉住页签

    2024-10-12 00:39

    仅供参考

    r72.gif

    (()=>{ whenElementExist(".layout__center").then((el)=>{ el.addEventListener('dblclick', (event) => { const tab = event.target?.closest('li[data-type="tab-header"]'); if(!tab) return; const protyle = siyuan.layout.centerLayout.children.map(item=>item.children.find(item=>item.headElement === tab)).find(item=>item); if(tab.classList.contains('item--pin')){ protyle.unpin(); } else { protyle.pin(); } }); }); // 等待元素渲染完成后执行 function whenElementExist(selector) { return new Promise(resolve => { const checkForElement = () => { let element = null; if (typeof selector === 'function') { element = selector(); } else { element = document.querySelector(selector); } if (element) { resolve(element); } else { requestAnimationFrame(checkForElement); } }; checkForElement(); }); } })();
  • [css] 更改有序、无列表的颜色、加粗 -- 来源 Savor 主题

    2024-10-11 19:47

    加上这个试试

    .protyle-wysiwyg [data-node-id].li[data-subtype="o"]>.protyle-action, .protyle-wysiwyg [data-node-id].li[data-subtype="o"]>.protyle-action:hover{ color: #007BFF; /* 修改为好看的蓝色 */ font-weight: bold; /* 加粗 */ }
  • 不使用超级块怎么合并列表?

    2024-10-11 18:25

    方法 1,拖动下面那个列表最外层块作为上面那个列表的子项,然后 shit+tab 向左缩进即可

    r70.gif

    方法 2,剪切下面那个列表作为上面那个列表的子项,然后 shit+tab 向左缩进即可

    r71.gif

    注意:选中子项向左缩进时,光标要停留在子项的第一个项的前面,这样才能全部缩进。

  • 关于内容块 <div> 标签拆分及合并问题?

    2024-10-11 14:16

    上面是软回车(shift+enter 实现),不会把文本分割成两个独立的块,即软换行的两个文本在同一个块中。

    下面是硬回车(enter 实现),会把文本分割成两个独立的块,即硬换行的两个文本被分割在两个独立的块中。

    合并自然是向上删除回车键了,拆分自然是 enter 或 shift+enter 了。

  • 是否有必要通过分开“阅读”与“考试”两个刷卡频率不同的工作空间,以避免由于共用复习数据文件导致的闪卡推送频率不当的情况?

    2024-10-11 12:13

    是的,不过目前来看暂时并未移除打算,其实也可以利用文件夹代替卡包功能,筛选里也可以选择文件夹,但文件夹不能把同一个数据添加到多个文件夹里,这点不如卡包方便。

    不过,如果楼主想自定义推送频率的话,还是分开两个工作空间更灵活方便,如果仅仅是为了区分不同的复习内容,不需要自定义推送频率,卡包很方便,相当于卡片的分类功能。

    如果短期或临时复习内容可以使用卡包,如果长期记忆的话,还是不建议用卡包,正如楼上所说,有可能被移除风险,虽然短期内还没有移除计划。

  • 是否有必要通过分开“阅读”与“考试”两个刷卡频率不同的工作空间,以避免由于共用复习数据文件导致的闪卡推送频率不当的情况?

    2024-10-11 09:07

    除了分开不同的工作空间,也可以试试卡包是否满足你的需求。

    卡包使用方法

    1. 先开启卡包

      image.png

    2. 右键添加到卡包,然后新建或添加到已存在的卡包

      image.png

      image.png

    3. 在间隔重复界面选择对应的卡包进行复习即可

      image.png

  • 批量导入文档到数据库 0.0.6 版全新发布

    2024-10-11 08:41

    无论插件或者代码片段都可以实现相同效果。至于如何自动化这要看你具体需求了。

  • 嵌入块如何限制高度,实现类似于代码块限高效果

    2024-10-10 23:31
    [data-type="NodeBlockQueryEmbed"] { max-height:300px; overflow:auto; }

    另外,链滴搜索确实有问题,经常搜不到,可以尝试用搜索引擎搜索,比如,搜索关键词 site:ld246.com

  • 有没有办法在文档中快速插入当天的日期和指定标题级别?

    2024-10-10 23:20

    一般输入法都支持输入日期,比如

    image.png

    所以输入 # + 空格 + rq 选择第 2 个就可以

    r69.gif

  • 分享链滴自动签到 puppeteer 脚本

    2024-10-10 12:56

    @EmptyLight

    代码放不出来什么意思?

    嗯,你自己实现吧,暂时不支持二次验证。

  • 分享链滴自动签到 puppeteer 脚本

    2024-10-10 12:50

    是的,你可以改进下。

    二次验证,需要自己实现一个动态秘钥生成客户端。

  • js 代码如何实现根据输入的内容自动给其块加上属性或自定义属性

    2024-10-10 12:35

    监听编辑器输入事件,仅供参考

    (()=>{ // 编辑器输入事件 onEditorInput((editor) => { // 获取光标所在元素 const currEl = getCursorElement(); console.log('当前元素', currEl); // 获取当前块 const currBlock = currEl.closest('[data-type]'); console.log('当前块', currBlock); }); // 编辑器输入事件 function onEditorInput(callback) { whenElementExist(isMobile()?'body':'.layout__center').then(async element => { // 等待笔记列表加载完毕 await sleep(40); // 监听编辑器加载事件 observeDomChange(element, async (mutation) => { if (mutation.target.classList?.contains("protyle-wysiwyg")) { console.log(mutation.target); const editor = mutation.target; if(editor && editor.closest){ // 等待编辑器加载完毕 const protyle = editor.closest(".protyle"); if(protyle.dataset.loading !== 'finished'){ await whenElementExist(()=>editor?.closest(".protyle") === 'finished'); } if(!editor.getAttribute('custom-listened')){ editor.setAttribute('custom-listened', true); //console.log('listen editor'); editor.addEventListener('input', ()=>{ //console.log('editor inputed'); callback(editor); }) } } } }); }); } // 获取光标所在元素 function getCursorElement() { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); // 获取选择范围的起始位置所在的节点 const startContainer = range.startContainer; // 如果起始位置是文本节点,返回其父元素节点 const cursorElement = startContainer.nodeType === Node.TEXT_NODE ? startContainer.parentElement : startContainer; return cursorElement; } return null; } // 观察元素被添加 function observeDomChange(selector, callback) { // 定义一个回调函数,当DOM发生变化时调用 const onChange = function(mutationsList, observer) { for (const mutation of mutationsList) { if (mutation.type === 'childList') { callback(mutation); } } }; // 创建一个观察器实例,并传入回调函数 const observer = new MutationObserver(onChange); // 配置观察选项:指定需要观察哪些变动 const config = { attributes: false, childList: true, subtree: true }; // 获取目标节点 const targetNode = typeof selector === 'string' ? document.querySelector(selector) : selector; // 如果目标节点存在,则开始观察 if (targetNode) { observer.observe(targetNode, config); } // 返回一个函数,用于停止观察 return () => { observer.disconnect(); }; } // 是否手机端 function isMobile() { return !!document.getElementById("sidebar"); } // 延迟执行 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // 等待元素渲染完成后执行 function whenElementExist(selector) { return new Promise(resolve => { const checkForElement = () => { let element = null; if (typeof selector === 'function') { element = selector(); } else { element = document.querySelector(selector); } if (element) { resolve(element); } else { requestAnimationFrame(checkForElement); } }; checkForElement(); }); } })();
  • 批量导入文档到数据库 0.0.6 版全新发布

    2024-10-10 11:32

    你怎么确定复制的 id 没错?你说下你的 id 是哪个文档的 id? 要想高效解决问题,请详细说明你操作步骤,比如,复制的哪个文档或块 id, 期望获取哪些数据?脚本配置是否改过?改了什么?如果改过,最好附上修改后的脚本。也最好导出出问题的文档上传。这样解决问题才最高效。

  • [js] 打开思源后默认折叠文档树

    2024-10-09 23:03

    我的意思是改右键菜单等文字颜色。当然弹窗即使有背景色,如果想醒目也可以改文字颜色嘛。

  • [js] 打开思源后默认折叠文档树

    2024-10-09 22:12

    删除,退出等危险按钮一律红色显示,以防看错。

  • 批量导入文档到数据库 0.0.6 版全新发布

    2024-10-09 22:06

    抱歉,还是不太清楚你的具体需求,根据你的描述,把面包屑写到块属性中,然后在数据库模板列中读取块属性的值?

    假设有 A,B,C 三个段落块,导入到数据库 D 中,然后把 A,B,C 的面包屑分别写入到 A,B,C 三个块属性中,然后在数据库 D 中新建模板列 T,然后在 T 中读取 A,B,C 三个块属性中的面包屑的值(怎么读取?)?然后在通过模板列 T 对已导入数据库的块进行排序?

  • [js] 打开思源后默认折叠文档树

    2024-10-09 20:36

    可以,可以参考 EmberSky 大佬的回复 求代码片段 | 默认全屏编辑 - EmberSky 的回帖

  • 批量导入文档到数据库 0.0.6 版全新发布

    2024-10-09 20:29

    不支持导入数据库时自定义标题内容,思源也没提供相关 api。

  • [css] 显示钉住文档名并在页签右下角添加一个钉子图标

    2024-10-08 21:19

    我改到了左侧

    .layout-tab-bar .item.item--pin .item__text { padding-left: 15px; } /* 添加一个钉子图标 */ #layouts .layout__center div:not(.fn__none) > .layout-tab-bar:not(.layout-tab-bar--readonly) .item--pin::before { content: "📌"; font-size: 0.8em; position: absolute; left: 0; transform: rotate(-45deg); }

    image.png

  • 日记的配置在哪里?

    2024-10-08 19:47

    但目前软件顶部没有形似日历的按钮,“笔记本右键下拉菜单”不知道是指什么

    用户指南文档较老了,以实际软件显示效果为准,鼠标可以移动到目录树上看看,这个文档最后更新于 2021 年

    image.png

    但设置里没有“新建日记设置”,以及任何有关日记的设置

    日记设置在笔记本上右键,然后选择设置

    image.png

    然后,最下面就是

    image.png

  • 求助思源笔记如何汇总不同文章的类似内容

    2024-10-07 12:35

    SQL 方式实现

    select * from blocks where type='d' and id in( select root_id from blocks where markdown like '%失眠原因%' );
  • 日程管理插件用不了?

    2024-10-07 08:26

    确实,日程管理由于有些异常作者未做判断,导致操作无效果。

    但,如果按照我这个帖子中回复的 注意事项 去操作,一般没什么问题。

    思源怎么实现习惯追踪呀?总不会每天都要手动生成一次吧 - wilsons 的回帖

  • [js] 折叠代码块

    2024-10-04 14:13

    已兼容,请用新代码测试。

  • 文档树标题显示不全

    2024-10-03 18:59

    可以是可以,是这种效果吗

    image.png

    .b3-list-item__text 里新增 border-bottom: 1px solid var(--b3-theme-background-light); 即可。