-
代码片段实现代码块最近使用的语言置顶
2024-08-09 21:22原来这样呀。
ps:如果出现的是 hljs,querySelector 选择代码语言要更改下,因为代码语言是兄弟节点不是子节点,会查找不到 -
代码片段实现代码块最近使用的语言置顶
2024-08-09 20:55所以我改成了这样就没问题了
// 监听新增代码 if(mutation.target.classList.contains("hljs")) { if(codeTimer) clearTimeout(codeTimer); codeTimer = setTimeout(() => { const langText = mutation.previousSibling.textContent; // 添加语言 addLanguage(langText); // 设置默认语言 setDefaultLang(); // console.log(mutation.target.querySelector(".protyle-action__language")?.textContent, 'selected'); }, 40); }
-
代码片段实现代码块最近使用的语言置顶
2024-08-09 20:51就是
mutation
监控的问题,因为我确实测试了,新增代码块没有检测到 code-block 变化,,所以 if 判断里面的代码没有执行code-block 新增,不覆盖思源的上一个选择代码语言,所以下一次新增代码,就变为了上一次选择的代码语言,而不是代码片段设置的代码语言了
我新建空白工作空间测试了,依然检测不到 code-block 变化
-
代码片段实现代码块最近使用的语言置顶
2024-08-09 19:55我用你的方式(即斜杆命令创建不指定语言的代码块),也是一样的结果,监听 mutation,也是只有 hljs 变化,没有 code-block 变化
思源是最新版
系统是 windows11
代码
// 功能:代码块最近使用的语言置顶 (async ()=>{ // 配置默认的代码语言,注意如果设置了这个参数,则会覆盖上一次使用的语言。始终默认用这个语言,为空不设置 const defaultCodeLang = "python"; // 配置最近代码语言最大显示个数 const recentlyCodeLangLength = 10; // 配置置顶的代码语言,这个配置里的语言始终置顶,比如 ["js", "java", "php"] let topCodeLang = []; // 配置持久化文件的存储路径 const storagePath = "/data/storage/recently_code_lang.json";
录屏
-
为了让文档层级导航插件能用于 MOC 笔记法,我写了一个对反链进行过滤的代码片段
2024-08-09 16:36学习这篇帖子代码片段实现代码块最近使用的语言置顶 - 链滴 (ld246.com)
放弃 setInterval 定时执行,用了 MutationObserver 来监控 DOM 变化
(async ()=>{function filterAndReorderLinks() { const filterPatterns = [ /^\d{8} \w{3}$/, // Example: 20240728 Sun /^\d{6}$/, /^\d{8} ~ \d{8}$/, /^\d{8} \- \d{8}$/ // Add more patterns here if needed ]; const containers = document.querySelectorAll("div.og-hierachy-navigate-backlink-doc-container"); if (containers.length === 0) { return; } containers.forEach(container => { const refLinks = container.querySelectorAll("span.refLinks.docLinksWrapper"); if (refLinks.length === 0) { return; } // Hide elements that match any pattern in filterPatterns refLinks.forEach(link => { const docName = link.getAttribute("title"); if (filterPatterns.some(pattern => pattern.test(docName))) { link.style.display = "none"; } else { link.style.display = ""; // Reset display property if it doesn't match } }); // Separate elements into two arrays: one for @-prefixed and one for otherItems const mocItems = []; const otherItems = []; refLinks.forEach(link => { const docName = link.getAttribute("title"); if (docName.startsWith("@")) { mocItems.push(link); } else { otherItems.push(link); } }); // Sort the 'otherItems' array based on the 'title' attribute in ascending order otherItems.sort((a, b) => { const titleA = a.getAttribute("title").toUpperCase(); // Ignore upper and lowercase const titleB = b.getAttribute("title").toUpperCase(); // Ignore upper and lowercase return titleA.localeCompare(titleB); }); // Clear only the refLinks elements and append them in the desired order refLinks.forEach(link => link.remove()); mocItems.concat(otherItems).forEach(link => { container.appendChild(link); }); }); } // 监控dom变化 function observeDomChange(targetNode, callback) { const config = { childList: true, subtree: true }; const observer = new MutationObserver((mutationsList) => { for (const mutation of mutationsList) { if (mutation.type === 'childList') { callback(mutation); } } }); observer.observe(targetNode, config); // 返回observer,用于停止观察 // observer.disconnect(); return observer; } // 等待元素渲染完成后执行的函数 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 { // 如果元素不存在,等浏览器再次重绘,递归调用checkForElement,直到元素出现 requestAnimationFrame(checkForElement); } }; checkForElement(); }); } // 等待笔记区出现 whenElementExist(".layout__center").then((element)=>{ const observer = observeDomChange(element, (mutation) => { // 监听弹窗代码列表 if(mutation.target.classList.contains("protyle-top") || mutation.target.classList.contains("og-hn-heading-docs-container")) { setTimeout(filterAndReorderLinks, 100); } }); }); })();
-
代码片段实现代码块最近使用的语言置顶
2024-08-09 15:42if(mutation.target.classList.contains("code-block")) {
这个好像有点问题,貌似是不执行的,新增代码块的
mutation.target.classList
只有 hljs我设置默认语言为 python,新增代码块确实是 python 语法高亮,再新增一个 matlab 代码块,之后再新增不指定语言的代码块,默认就是 matlab 代码块了
-
代码片段实现代码块最近使用的语言置顶
2024-08-09 11:16谢谢大佬,这个很好用!👍
代码写的真好
js 小白,学习了observeDomChange
和whenElementExist
的使用 -
为了让文档层级导航插件能用于 MOC 笔记法,我写了一个对反链进行过滤的代码片段
2024-08-08 10:49因为我还是喜欢文档来管理内容,也能更沉浸去创作。
目前块引用也基本是文档引用,块粒度的引用对我而言,不如文档引用安全,容易失效
-
集市什么时候新增评论和评分功能
2024-08-07 18:25支持,现在插件使用,没有评分和评论,用户只能自己看 readme 和亲自尝试,有了评分和评论就简单做下筛选,
可以知道哪些插件评分很高,自己可以试试(下载量其实只能当做受欢迎程度程度参考之一,因为和插件的受众多少以及插件更新频率有很大关系)
哪些插件其实并不好用,做的并不完善,需要警惕使用
而评论功能除了避坑、简单了解插件有哪些不足,还可以分享用户使用插件的场景,对于用户而言,绝对是利好的。至于对于开发者而言,我是觉得要接受评论的好坏的,把插件分享到集市是好心,但是其实也是对集市资源的一种占用,别人因为看到集市有这个插件而去尝试,然后发表意见,就是很正常的事情。把东西放到互联网上,其实就应该要做好被评论的准备。
我喜欢把自己写的文章放到互联网上,因为我知道自己的文章有局限性,我其实非常期待别人能找出问题,告诉我,也想要和同道之人讨论进步。如果评论区只是夸赞,我反而有点失望,没有我想要的建设性意见。其实自己有时候也在想,互联网上信息良莠不齐,人人都可以发言,劣币常常驱逐良币,自己是不是同时也给别人找资料时造成了误导呢?
现在评分和评论暂时可以缓缓,因为集市插件不并多,等插件非常多了,个人觉得还是有必要出的。
论坛虽然可以讨论插件,但是非常信息过于零散,是不如评论功能便携好用的
-
在思源笔记里如何管理主题笔记
2024-08-04 14:06举个用数据库管理的例子
我计划每周要学习统计分析,并且发小红书和微信公众号
今天学完了 z 检验,加入《统计分析》和《博客》数据库
那么我可以在 z 检验这篇笔记直接看到我的整个统计分析学习进度
也可以看到博客发布到平台的情况
-
从 2024 年的视角来看,以 Roam Research 为首的双向链接似乎已经降温
2024-07-31 22:43加一,所以我之前就提过 issue,建议添加相关笔记功能了,建议的是能手动添加相关笔记,就是在属性里加一个相关笔记,可以添加多个笔记链接进去,有一个面板能显示本笔记所有相关的笔记,但是被否了
如果用 dailynote 笔记法的话,反链面板更适合积累想法,当笔记的历史记录,用反链面板找相关的笔记,很容易有太多噪声
除非完全弃用 dailynote,双链真的就是用来建立关联,而不是传递零碎信息的,这样反链面板才干净些
说到底,反链面板本身的设计就是去找这个块在哪里被引用了,并不是为找相关块而设计的,被引用不代表是我想要的相关和归属关系
-
免费的笔记 AI 总结方案
2024-07-31 22:27- 这个第三方 api 的美元:人民币汇率比,不到 1:3
- 一般不会每天都发很多信息,我算很频繁用了,写代码、写知识笔记都用 ai,半年也就用了 30 刀。通过邀请别人,奖励了我快 50 刀,这半年就没自己充过钱。
- 要省钱,需要避免 context 过长,尽量一次就描述清楚自己的需求,让 ai 一次回答完成。一次会话完成就新建会话,不要在之前会话里再问
-
双链工作流个人使用经验
2024-07-25 10:24笔记是为了减压,说的真好呀。笔记是为了在获取信息时减压、提炼整理时减压、组织表达输出时减压、记忆时减压,笔记就是为了让自己更好地工作,更好地生活,做笔记不是仅仅为了一个搭建精致的知识管理体系,自娱自乐。
我以前 dailynote,记了很多东西,等到后面要着急输出的时候,就意识到太散乱了。
现在的 dailynote 更多的职能是日记和当成快速记录的 Inbox。只有自己不重要的兴趣爱好笔记、不了解还没成形的领域笔记,才用 dailynote 记录。
现在我喜欢面向主题、面向项目记笔记,重要的笔记只把 dailynote 用于快速记录当日学习的内容、思考的想法,当成日记,方便日后的回顾,回顾主题进展的时间线。把主要精力整理用于传递的主题笔记上。把记笔记当成完成一个个项目的记录,开始践行以行动为导向、以实践为导向、以项目为导向做笔记,自认为,自己的生活变得更加有序、更有掌控感了。以前的我很热衷于记百科知识笔记,会狂看一个科普 up 主的视频,记录涉及到的所有知识点,但是那些笔记,我很快就遗忘了。现在回过头来看,当时的我可能只是把记笔记当成了一个消遣时间的兴趣爱好,而现在的我是想要用记笔记来帮助自己更好的学习、工作和生活,更多将它当成一个工具,帮我完成一个个项目。
以学习一个课程为例,如我想要学习 Matlab 深度学习,我就列好我要学习的知识点,然后每周末按顺序去学习,记好笔记。本周学习完了,把上周记的笔记发小红书。之所以选择发上周的笔记,我是觉得这样可以帮助自己复习,而且本周记的笔记不一定完善,经过一周再看可能能发现一些改进的地方。
此外,学习课程、阅读书籍,我都还会建立一个一个概念笔记,用于把自己学习的知识点提取出来,为了复用,也为了知识笔记能得到持续积累
比如我在学习深度学习过程中,积累了卷积神经网络的知识点,就会单独建立概念笔记,记录卷积神经网络是什么,有哪些经典的卷积神经网络结构。
还会整理汇总 Matlab 用于深度学习的相关函数:怎么读取数据、怎么搭建网络、怎么训练,怎么可视化预测结果
现在这样的笔记方式是比较适合我的
-
免费的笔记 AI 总结方案
2024-07-23 17:34通义确实不错,还能播客转文字。通义最大的问题是上传 pdf,解读非常差劲,相比 kimi 差很远
GPT4o 除了写代码,还有一个用途,可以超低价生成图片:一张估计就消耗 $0.008,生成的图片没有水印,质量很高,绘制的图片可以显示英文文字不乱码
-
得了反向链接太多焦虑症
2024-07-19 20:57双链传递这个我之前也很沉迷
但是后来确实发现记得太散乱了,
现在的策略是,如果记得东西只是新闻、你的兴趣爱好、生活碎碎念,不重要,你可以这样记,想引用就引用,就慢慢积累就可以,重要的是快速记录,而不是花太多时间去整理笔记。所以 dailynote 现在我的用法就是当做快速记录零碎信息的 inbox
但是如果是对自己比较重要的事情,比如一个短期甚至长期的项目,我现在倾向于直接建立一个文档来记录跨越多天的笔记,这会帮助我更好推进项目进展,思考的更充分,更好地去及时整理和汇总信息。在 dailynote 我就容易写的比较随意,只考虑当天,缺乏全局观。
此外,最近也觉得过于强调我要进行知识链接、过去的笔记要复用,其实也是一种负担,有的时候记下当下学到的,想到的,能完成当下的项目就可以了。笔记只是辅助思考,重要的是让笔记得以转化输出,去实际改善自己的生活,所以笔记的形式真的不重要。我至今没在身边,碰到一个和我一样热衷于每天记笔记的,但是他们貌似比我更擅长任务管理,更专注去行动,每天来工位就是干活,而我总想回顾下昨日,整理下昨日笔记。我很佩服和羡慕他们,我也一直在反思自己,是不是在笔记上花太多时间了,有些东西我是不是可以不记,而是花更多时间记在脑子里,并能用言语表达出我掌握的知识
-
免费的笔记 AI 总结方案
2024-07-19 00:27豆包确实是我目前用的最好的国产 ai 之一
生成的文本比较对我口味
浏览器插件功能很多,可惜全文翻译功能做的很差劲,不会提前翻译,只翻译可视区域,还是推荐用沉浸式翻译插件
-
Tsundoku 主题 link icon 根据锚文本来选择是否显示
2024-07-18 08:34可以的. css 也要添加自定义代码片段.我漏了.功能是把有 custom-link-icon 属性的 a 标签的 before 元素去除