思源笔记丨动态图标使用笔记

思源笔记 v3.1.11 支持了动态图标:Add internal kernel API `/api/icon/getDynamicIcon` by Achuan-2 · Pull Request #12939 · siyuan-note/siyuan

这篇帖子分享下如何用链接传参的方式使用动态图标,选择图标样式、颜色等。v3.1.11 版本还不支持文档图标设置动态图标,可以期待下之后能支持这个功能(见文档图标支持使用动态图标 · Issue #12943 · siyuan-note/siyuan

PixPin_2024-10-28_11-59-31

参数

目前有 8 种 color 和 8 种 type

PixPin_2024-10-28_12-00-52

  • type:图标类型,默认为 1

    • type=1:显示年月日星期
    • type=2:显示年月日
    • type=3:仅显示年月
    • type=4:仅显示年
    • type=5:当前周数
    • type=6:仅返回星期
    • type=7:倒数日
    • type=8:文字图标
  • lang:默认为当前思源笔记使用的语言,仅在 type=1、2、3、5、6、7 时有效

    • lang=zh_CN:显示中文简体
    • lang=zh_CHT:显示中文繁体
    • lang=en_US/lang=en_ES:显示英文
    • 其他语言用英文显示

    PixPin_2024-10-28_12-01-31

  • color:设置配色,一共八种配色

    • color=red
    • color=blue
    • color=yellow
    • color=green
    • color=purple
    • color=pink
    • color=orange
    • color=grey

    PixPin_2024-10-28_12-01-45

    支持通过 color=FE3427color=%23FE3427 设置自定义颜色(注意:直接输出 color=#FE3427,会由于 # 是 URL 特殊符号,导致 URL 被截断,会使得参数不起作用)

    PixPin_2024-10-28_12-02-36

    ![](api/icon/getDynamicIcon?color=FE3427&type=3)
    
  • date: 设置日期,默认为当前日期,日期设置格式为 yyyy-mm-dd,仅在 type=1-7 时有效

  • weekdayType: 设置星期格式,默认为第一种类型,仅在 type=1、6 时有效

    • 中文

      • weekdayType=1"周日", "周一", "周二", "周三", "周四", "周五", "周六"
      • weekdayType=2"周天", "周一", "周二", "周三", "周四", "周五", "周六"
      • weekdayType=3"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
      • weekdayType=4"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六

      PixPin_2024-10-28_12-02-57

    • 英文

      • weekdayType=1"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
      • weekdayType=2"SUN","MON","TUE","WED","THU","FRI","SAT"
      • weekdayType=3"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
      • weekdayType=4"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"

      PixPin_2024-10-28_12-03-16

  • content:设置文字图标的内容,默认为空,仅在 type=8 时有效

    注意 content 输入下面特殊符号,需要用 URL 编码替代,否则导致解析参数失败或丢失

    • %: %25
    • +: %2B
    • #: %23

使用

如果是在思源笔记内部使用(不用外部软件打开),可以直接用 api/icon/getDynamicIcon 后添加 type、color、lang、date/content 等参数,例如 api/icon/getDynamicIcon?color=red&type=7&lang=zh_CN

外部使用需要添加 ip 地址和端口,如 http://127.0.0.1:6806/api/icon/getDynamicIcon

示例

type=1:显示年月日星期

默认显示今天的日期。

可通过 date=2024-10-27 指定显示的日期

PixPin_2024-10-28_12-03-39

![](api/icon/getDynamicIcon?color=red&lang=zh_CN&date=2024-10-27)
![](api/icon/getDynamicIcon?color=red&lang=en_US_US&date=2024-10-27)

type=2:显示年月日

PixPin_2024-10-28_12-03-50

![](api/icon/getDynamicIcon?type=2&color=red&lang=&date=2024-10-27)
![](api/icon/getDynamicIcon?type=2&color=red&lang=en_US&date=2024-10-27)

type=3:仅显示年月

PixPin_2024-10-28_12-03-59

![](api/icon/getDynamicIcon?type=3&color=red&lang=zh_CN&date=2024-10-27)
![](api/icon/getDynamicIcon?type=3&color=red&lang=en_US&date=2024-10-27)

type=4:仅显示年

PixPin_2024-10-28_12-04-10

![](api/icon/getDynamicIcon?type=4&color=red&lang=zh_CN&date=2024-10-27)

type=5:当前周数

PixPin_2024-10-28_12-04-22

![](api/icon/getDynamicIcon?type=5&color=red&lang=zh_CN&date=2024-10-27)

![](api/icon/getDynamicIcon?type=5&color=red&lang=en_US&date=2024-10-27)

type=6:仅返回星期

不输入 color 的话,默认星期一到星期五为红色,星期六和星期日为蓝色

PixPin_2024-10-28_12-04-32

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-21 "星期一")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-22 "星期二")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-23 "星期三")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-24 "星期四")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-25 "星期五")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-26 "星期六")

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-27 "星期日")

指定 color

PixPin_2024-10-28_12-04-45

![](api/icon/getDynamicIcon?type=6&lang=en_US&date=2024-10-21&color=red "星期一")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-22&color=blue "星期二")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-23&color=green "星期三")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-24&color=yellow "星期四")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-25&color=purple "星期五")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-26&color=pink "星期六")

![](api/icon/getDynamicIcon?type=6&lang=zh_CN&date=2024-10-27&color=grey "星期日")

type=7:倒数日

该图标会显示当前日期与指定日期之间的天数。

支持 lang=en_US 修改为英文:

  • 已过Past 表示。
  • 还有Left 表示。

PixPin_2024-10-28_12-04-56

![](api/icon/getDynamicIcon?color=red&date=2024-10-22&type=7&lang=zh_CN)
![](api/icon/getDynamicIcon?color=red&date=2024-10-22&type=7&lang=en_US)

PixPin_2024-10-28_12-05-07

![](api/icon/getDynamicIcon?color=red&type=7&lang=zh_CN)
![](api/icon/getDynamicIcon?color=red&type=7&lang=en_US)

PixPin_2024-10-28_12-05-20

![](api/icon/getDynamicIcon?color=red&date=2025-10-26&type=7&lang=zh_CN)
![](api/icon/getDynamicIcon?color=red&date=2025-10-26&type=7&lang=en_US)

type=8:文字图标

该图标可以显示文字。

PixPin_2024-10-28_12-05-28

![](api/icon/getDynamicIcon?type=8&content=知乎&color=blue)
![](api/icon/getDynamicIcon?type=8&content=GREAT&color=red)

如何在 dailynote 模板中设置动态图标,创建 dailynote 自动添加图标?

v3.1.11 还不支持文档图标支持使用动态图标

之后等这个功能实现了,就可以在 dailynote 模板后面添加下面这段代码,应该就能让 dailynote 自动添加上指定的动态文档图标了。

.action{/* 获取今天日期和星期 */}
.action{$today := now | date "2006-01-02" }
.action{$weekday := now | date "Mon" }
.action{/* 工作日用红色图标,周末用蓝色图标 */}
.action{$color := "red"}
.action{if or (eq $weekday "Sat")  (eq $weekday "Sun") }
.action{$color = "blue"}
.action{else} 
.action{$color = "red"}
.action{end} 
.action{/* 设置文档图标:选择type6,仅返回星期样式 */}
{: icon="api/icon/getDynamicIcon?type=6&date=.action{$today}&color=.action{$color}"   type="doc"}

  • 思源笔记

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

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

    22373 引用 • 89539 回帖
2 操作
Achuan-2 在 2024-11-17 21:34:37 更新了该帖
Achuan-2 在 2024-11-09 19:04:51 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • iqeq

    通过 svg 参数动态修改图标,非常好的思路,感谢分享,期待新版可以直接把 API 输入方式添加一个按钮,方便普通用户使用。

    1 回复
    1 操作
    iqeq 在 2024-11-10 10:44:08 更新了该回帖
  • 其他回帖
  • 我用模板无法设置图标

    .action{/* 获取今天日期和星期 */}
    .action{ $today := now | date "2006-01-02" }
    .action{ $weekday := now | date "Mon" }
    
    .action{/* 定义每个星期几对应的颜色 */}
    .action{ $weekdayColors := dict "Mon" "E55D3B" "Tue" "FFA95C" "Wed" "FAD155" "Thu" "8BC34A" "Fri" "5BC0DE" "Sat" "5FADE2" "Sun" "C481BD" }
    
    .action{/* 获取当前星期的颜色 */}
    .action{ $color := index $weekdayColors $weekday }
    
    .action{/* 设置文档图标:选择type6,仅返回星期样式 */}
    {: icon="api/icon/getDynamicIcon?type=6&date=.action{ $today }&color=.action{ $color }" type="doc"}
    
  • White-Night-Dream 1 赞同

    补一个默认设置的脚本

    • 日记:格式“2024-11-10”
      import json
      import re
      import os
      
      
      def update_sy_file(file_path):
          # 读取 .sy 文件内容
          with open(file_path, "r", encoding="utf-8") as file:
              content = file.read()
      
          # 解析 JSON 数据
          data = json.loads(content)
      
          # 使用正则表达式提取 title 中的日期
          title = data.get("Properties", {}).get("title", "")
          match = re.match(r"^(\d{4})-(\d{2})-(\d{2})$", title)
          if match:
              year, month, day = match.groups()
              formatted_date = f"{year}-{month}-{day}"
              # 更新 icon 属性
              new_icon = f"api/icon/getDynamicIcon?type=6&color=red&date={formatted_date}"
              data["Properties"]["icon"] = new_icon
      
              # 将更新后的数据写回文件
              with open(file_path, "w", encoding="utf-8") as file:
                  json.dump(data, file, ensure_ascii=False)
              print(f"Updated icon for file: {file_path}")
      
      
      def process_directory(directory_path):
          # 遍历目录及其子目录中的所有文件
          for root, _, files in os.walk(directory_path):
              for file in files:
                  if file.endswith(".sy"):
                      file_path = os.path.join(root, file)
                      update_sy_file(file_path)
      
      
      # 使用示例
      process_directory(r"D:\1STUDY\SIYUAN\data\20231007210051-jpydsvc")
      
    • 月:格式“11”
      import json
      import re
      import os
      
      
      def update_sy_file(file_path):
          # 读取 .sy 文件内容
          with open(file_path, "r", encoding="utf-8") as file:
              content = file.read()
      
          # 解析 JSON 数据
          data = json.loads(content)
      
          # 使用正则表达式提取 title 中的日期
          title = data.get("Properties", {}).get("title", "")
          # path = data.get("Path", "")
      
      
          match = re.match(r"^(\d{2})$", title)  # 匹配2位数字的月份
          if match:
              month = match.group(1)  # 使用group(1)而不是groups(1)
              formatted_date = f"{whatyear}-{month}-01"
              # 更新 icon 属性
              new_icon = f"api/icon/getDynamicIcon?type=3&date={formatted_date}"
              data["Properties"]["icon"] = new_icon
      
              # 将更新后的数据写回文件
              with open(file_path, "w", encoding="utf-8") as file:
                  json.dump(data, file, ensure_ascii=False)
              print(f"Updated icon for file: {file_path}")
      
      def process_directory(directory_path):
          # 只遍历当前目录下的文件,不递归进入子目录
          for item in os.listdir(directory_path):
              full_path = os.path.join(directory_path, item)
              if os.path.isfile(full_path) and item.endswith('.sy'):
                  update_sy_file(full_path)
      
      whatyear = "2023"
      # 使用示例
      process_directory(r"D:\1STUDY\SIYUAN\data\20231007210051-jpydsvc\20231212180155-4yzi6wx\20231212180155-jzvvkz7")# 2024
      
  • Achuan-2

    写了一个脚本,可以用 python 脚本批量更改 dailynote、月份、年、周复盘的图标为动态图标

    PixPin20241109190655.png

    • 日记:格式“20241109 Sat”
      import json
      import re
      import os
      
      
      def update_sy_file(file_path):
          # 读取 .sy 文件内容
          with open(file_path, "r", encoding="utf-8") as file:
              content = file.read()
      
          # 解析 JSON 数据
          data = json.loads(content)
      
          # 使用正则表达式提取 title 中的日期
          title = data.get("Properties", {}).get("title", "")
          match = re.match(r"^(\d{4})(\d{2})(\d{2})\s\w{3}$", title)
          if match:
              year, month, day = match.groups()
              formatted_date = f"{year}-{month}-{day}"
              # 更新 icon 属性
              new_icon = f"api/icon/getDynamicIcon?type=6&color=red&date={formatted_date}"
              data["Properties"]["icon"] = new_icon
      
              # 将更新后的数据写回文件
              with open(file_path, "w", encoding="utf-8") as file:
                  json.dump(data, file, ensure_ascii=False)
              print(f"Updated icon for file: {file_path}")
      
      
      def process_directory(directory_path):
          # 遍历目录及其子目录中的所有文件
          for root, _, files in os.walk(directory_path):
              for file in files:
                  if file.endswith(".sy"):
                      file_path = os.path.join(root, file)
                      update_sy_file(file_path)
      
      
      # 使用示例
      process_directory(r"D:\Notes\Siyuan\Achuan-2\data\20241028223345-d9ifjv0")
      
    • 月:格式“202411”
      import json
      import re
      import os
      
      
      def update_sy_file(file_path):
          # 读取 .sy 文件内容
          with open(file_path, "r", encoding="utf-8") as file:
              content = file.read()
      
          # 解析 JSON 数据
          data = json.loads(content)
      
          # 使用正则表达式提取 title 中的日期
          title = data.get("Properties", {}).get("title", "")
          match = re.match(r"^(\d{4})(\d{2})$", title)
          if match:
              year, month = match.groups()
              formatted_date = f"{year}-{month}-01"
              # 更新 icon 属性
              new_icon = f"api/icon/getDynamicIcon?type=3&date={formatted_date}"
              data["Properties"]["icon"] = new_icon
      
              # 将更新后的数据写回文件
              with open(file_path, "w", encoding="utf-8") as file:
                  json.dump(data, file, ensure_ascii=False)
              print(f"Updated icon for file: {file_path}")
      
      def process_directory(directory_path):
          # 遍历目录及其子目录中的所有文件
          for root, _, files in os.walk(directory_path):
              for file in files:
                  if file.endswith(".sy"):
                      file_path = os.path.join(root, file)
                      update_sy_file(file_path)
      
      
      # 使用示例
      process_directory(r"D:\Notes\Siyuan\Achuan-2\data\20241028223345-d9ifjv0")
      
    • 年:格式“2024”
      import json
      import re
      import os
      
      
      def update_sy_file(file_path):
          # 读取 .sy 文件内容
          with open(file_path, "r", encoding="utf-8") as file:
              content = file.read()
      
          # 解析 JSON 数据
          data = json.loads(content)
      
          # 使用正则表达式提取 title 中的日期
          title = data.get("Properties", {}).get("title", "")
          match = re.match(r"^(\d{4})$", title)
          if match:
              year,= match.groups()
              formatted_date = f"{year}-01-01"
              # 更新 icon 属性
              new_icon = f"api/icon/getDynamicIcon?type=4&date={formatted_date}"
              data["Properties"]["icon"] = new_icon
      
              # 将更新后的数据写回文件
              with open(file_path, "w", encoding="utf-8") as file:
                  json.dump(data, file, ensure_ascii=False)
              print(f"Updated icon for file: {file_path}")
      
      
      
      def process_directory(directory_path):
          # 遍历目录及其子目录中的所有文件
          for root, _, files in os.walk(directory_path):
              for file in files:
                  if file.endswith(".sy"):
                      file_path = os.path.join(root, file)
                      update_sy_file(file_path)
      
      
      # 使用示例
      process_directory(r"D:\Notes\Siyuan\Achuan-2\data\20241028223345-d9ifjv0")
      
    1 回复
  • 查看全部回帖