[js] 给导入的日记补上属性

/** * @description 使用 fetch 直接请求 API,查找内容为 YYYY-MM-DD 格式且类型为 'd' 的块,并为其添加 custom-YYYYMMDD 属性。消息显示块内容。 */ async function addDateAttributesToDailyNoteBlocksDirect() { // --- 配置 --- const SIYUAN_API_URL = `${window.location.protocol}//${window.location.hostname}:${window.location.port}`; const API_TOKEN = typeof window.siyuan?.config?.apiToken !== 'undefined' ? window.siyuan.config.apiToken : "YOUR_API_TOKEN"; const headers = { 'Authorization': `Token ${API_TOKEN}`, 'Content-Type': 'application/json', }; // --- 封装的 API 请求函数 --- async function fetchAPI(endpoint, data) { try { const response = await fetch(`${SIYUAN_API_URL}${endpoint}`, { method: 'POST', headers: headers, body: JSON.stringify(data), }); const result = await response.json(); if (!response.ok) { throw new Error(result.msg || `HTTP 错误! 状态码: ${response.status}`); } if (result.code !== 0) { throw new Error(result.msg || `API 错误码: ${result.code}`); } return result.data; } catch (error) { console.error(`调用 API ${endpoint} 失败:`, error); throw error; } } // --- 封装的通知函数 --- async function pushNotification(message, isError = false, timeout = 5000) { const endpoint = isError ? '/api/notification/pushErrMsg' : '/api/notification/pushMsg'; try { await fetchAPI(endpoint, { msg: message, timeout: timeout }); } catch (notificationError) { console.warn(`发送通知失败: ${notificationError.message}`); if (isError) { alert(`错误: ${message}`); } else { alert(message); } } } // --- 主要逻辑开始 --- console.log("开始查找并处理日记块属性..."); await pushNotification("开始查找并处理日记块属性...", false, 3000); // 1. 查找块 const query = "SELECT id, content FROM blocks WHERE type = 'd' AND content LIKE '____-__-__'"; let blocks = []; try { blocks = await fetchAPI('/api/query/sql', { stmt: query }); } catch (error) { pushNotification(`查找日期块时出错: ${error.message}`, true); return; } if (!blocks || blocks.length === 0) { console.log("未找到符合条件的日期块。"); pushNotification("未找到符合条件的日期块。", false); return; } console.log(`找到 ${blocks.length} 个候选块,开始精确匹配和处理...`); // 2. 准备统计和正则 let updatedCount = 0; const errors = []; const dateRegex = /^\d{4}-\d{2}-\d{2}$/; // 3. 遍历处理 for (const block of blocks) { const { id, content } = block; // 同时获取 id 和 content // 精确匹配格式 if (!dateRegex.test(content)) { console.log(`块内容 "${content}" (ID: ${id}) 非标准 YYYY-MM-DD,跳过。`); // 保留ID供调试 continue; } try { const dateValue = content.replace(/-/g, ''); const attrName = `custom-dailynote-${dateValue}`; const attrs = { [attrName]: dateValue }; await fetchAPI('/api/attr/setBlockAttrs', { id: id, attrs: attrs }); // 设置属性仍需 ID updatedCount++; // 修改日志:显示 content console.log(`成功为块 "${content}" 添加属性 ${attrName}=${dateValue}`); // 可选延时 // await new Promise(resolve => setTimeout(resolve, 30)); } catch (error) { // 修改日志和错误记录:显示 content console.error(`为块 "${content}" 添加属性时出错:`, error); errors.push({ id: id, content: content, error: error.message || error }); // 错误记录中保留 id 和 content // 暂时不在这里为每个错误发送通知,汇总后发送 } } // 4. 最终报告 const successMessage = `处理完成。共检查 ${blocks.length} 个候选块,成功更新 ${updatedCount} 个块。`; console.log(successMessage); pushNotification(successMessage, false); if (errors.length > 0) { // 修改错误报告:指出是哪些日期的块出错了 const errorContents = errors.map(e => e.content).join(', '); const errorMessage = `有 ${errors.length} 个块在更新属性时出错 (例如: ${errorContents.substring(0, 50)}${errorContents.length > 50 ? '...' : ''})。详情请见控制台。`; console.error("出错的块详情:", errors); pushNotification(errorMessage, true, 8000); } } // --- 创建界面按钮 --- (这部分代码不变) function createProcessButton() { const buttonId = 'add-daily-note-date-attrs-button'; if (document.getElementById(buttonId)) { console.log("处理按钮已存在。"); return; } const button = document.createElement('button'); button.id = buttonId; button.textContent = '为日记块加日期属性'; button.style.position = 'fixed'; button.style.top = '70px'; button.style.right = '20px'; button.style.zIndex = '1001'; button.style.padding = '8px 12px'; button.style.border = 'none'; button.style.backgroundColor = '#2d7ff9'; button.style.color = 'white'; button.style.borderRadius = '5px'; button.style.cursor = 'pointer'; button.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)'; button.title = '点击处理所有内容为 YYYY-MM-DD 的文档块'; button.onclick = async () => { if (!confirm("确定要为所有符合条件的日记块添加日期属性吗?这个操作会修改块数据。")) { return; } button.disabled = true; button.textContent = '处理中...'; button.style.backgroundColor = '#aaa'; try { await addDateAttributesToDailyNoteBlocksDirect(); } catch (e) { console.error("执行过程中发生意外错误:", e); alert(`发生意外错误: ${e.message}`); try { await fetch(`${window.location.protocol}//${window.location.hostname}:${window.location.port}/api/notification/pushErrMsg`, { method: 'POST', headers: {'Content-Type': 'application/json', 'Authorization': `Token ${window.siyuan?.config?.apiToken || 'YOUR_API_TOKEN'}`}, body: JSON.stringify({ msg: `执行意外出错: ${e.message}`, timeout: 7000 }), }); } catch(notifyErr) {} } finally { button.disabled = false; button.textContent = '为日记块加日期属性'; button.style.backgroundColor = '#2d7ff9'; } }; document.body.appendChild(button); console.log("添加日期属性按钮已创建并添加到页面右上角。"); } // --- 初始化 --- (这部分代码不变) setTimeout(() => { if (typeof window.siyuan?.config !== 'undefined') { createProcessButton(); } else { console.warn("似乎不在思源环境中,按钮未创建。"); } }, 1500);

QQ1745208628069.png

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25740 引用 • 106529 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    173 引用 • 1207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 赞一个,顺便一提 F 佬的今日笔记插件也有此功能,可以酌情选择使用

推荐标签 标签

  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1432 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 107 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 635 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 5 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 245 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 515 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 85 关注
  • OneDrive
    2 引用 • 2 关注
  • AWS
    11 引用 • 28 回帖 • 2 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 764 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 121 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 57 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 739 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 83 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 8 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 708 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖