// ==UserScript== // @name Miniflux 文章剪藏到思源笔记 // @namespace http://tampermonkey.net/ // @version 2.1.2 // @description 在Miniflux页面上添加按钮,将文章一键剪藏到思源笔记。请在设置中配置你的Miniflux和思源信息。 // @author You // @match *://*/* // @grant GM_xmlhttpRequest // 授权:使用 Tampermonkey 的特权网络请求 API,可绕过网页的跨域限制 (CSP)。 // @grant GM_getValue // 授权:从 Tampermonkey 的本地存储中读取数据。 // @grant GM_setValue // 授权:向 Tampermonkey 的本地存储中写入数据。 // @grant GM_registerMenuCommand // 授权:在 Tampermonkey 的菜单中注册一个自定义命令。 // @grant GM_addStyle // 授权:向页面注入 CSS 样式。 // @require https://cdn.jsdelivr.net/npm/turndown@7.1.2/dist/turndown.js // 依赖:在脚本运行前,从 CDN 加载 Turndown.js 库,用于专业的 HTML 到 Markdown 转换。 // ==/UserScript== // 使用立即执行函数表达式 (IIFE) 来创建一个独立的作用域。 // 这可以避免脚本中的变量和函数与网页自身的代码发生冲突。 (function() { 'use strict'; // 启用严格模式,这能帮助捕获一些常见的编码错误,并使代码更安全。 // ===== 1. 配置管理模块 ===== // 这个模块负责所有与用户配置相关的操作,包括读取、保存和验证。 const Config = { // 将所有配置项的键名集中管理,方便日后维护和修改。 keys: { minifluxUrl: 'miniflux_url', // 存储用户 Miniflux 地址的键。 apiUrl: 'siyuan_api_url', // 存储用户思源 API 地址的键。 token: 'siyuan_token', // 存储用户思源 API Token 的键。 notebookId: 'siyuan_notebook_id' // 存储用户思源笔记本 ID 的键。 }, // 从 Tampermonkey 的本地存储中获取所有已保存的配置。 // GM_getValue 的第二个参数是默认值,如果存储中没有对应项,则返回这个空字符串。 getAll: function() { return { minifluxUrl: GM_getValue(this.keys.minifluxUrl, ''), apiUrl: GM_getValue(this.keys.apiUrl, ''), token: GM_getValue(this.keys.token, ''), notebookId: GM_getValue(this.keys.notebookId, '') }; }, // 将新的配置对象保存到 Tampermonkey 的本地存储中。 setAll: function(newConfig) { GM_setValue(this.keys.minifluxUrl, newConfig.minifluxUrl); GM_setValue(this.keys.apiUrl, newConfig.apiUrl); GM_setValue(this.keys.token, newConfig.token); GM_setValue(this.keys.notebookId, newConfig.notebookId); }, // 检查所有必要的配置项是否都已填写。 // 这是一个快速验证方法,确保脚本在信息不全时不会尝试执行核心功能。 isComplete: function() { const config = this.getAll(); // 使用逻辑与,只有当所有配置项都为真值(非空字符串)时,才返回 true。 return config.minifluxUrl && config.apiUrl && config.token && config.notebookId; }, // 显示一个图形化的设置模态窗口,让用户输入或修改配置。 showSettings: function() { const config = this.getAll(); // 防止重复创建模态窗口。 if (document.getElementById('siyuan-settings-modal')) return; // 使用 GM_addStyle 注入 CSS 样式。 // 这比直接操作 style 属性或创建