更新说明
Important
v1.5.0 小红书功能完善 ✨
Note2Any v1.5.0 专注于小红书平台功能的完善和用户体验优化:
📱 小红书平台增强
- 可编辑页码输入框,支持快速跳转到指定页面
- 切图功能完整实现,支持保存到自定义路径
- 修复切图布局和定位问题,确保内容完整显示
- 支持绝对路径和vault相对路径两种保存方式
🎨 主题系统优化
- 统一主题宽度限制(max-width: 750px)
- 优化内边距设置,提升阅读体验
- wx-mp-pro 和 xhs-philosophy 主题样式对齐
🔧 默认设置改进
- 默认平台改为"公众号",更符合主流使用场景
- 切图默认保存路径改为 vault 相对路径(xhs-images)
- 优化设置界面提示文字,更加清晰明确
升级建议: 现有用户可直接升级。如使用小红书切图功能,建议检查保存路径设置。
Note
v1.4.0 重大架构升级 🚀
Note2Any v1.4.0 进行了全面的架构重构,包含9个专业模块,提供更稳定、更高效的发布体验。详见 完整更新日志。
Note
v1.3.x 主题优化提醒
Note2Any 1.3.0版本对主题进行了优化,升级后请先清理旧版本主题文件,再重新下载新版主题。
操作步骤:在Note2Any插件设置中,先点击『清空主题-清空』,然后点击『获取更多主题-下载』
注意:如果修改过主题文件请做备份后再操作。
完整历史变更请查看: CHANGELOG
1、简介
Note2Any 是一个专为 Obsidian 打造的现代化发布插件,支持将笔记一键发布到微信公众号、小红书等多个平台。插件采用全新的模块化架构设计,提供稳定可靠的发布体验。
🌟 核心特性
- 📱 多平台发布: 支持微信公众号、小红书等平台,统一的发布体验
- 🎨 丰富主题: 30+ 精美主题样式,支持代码高亮和自定义CSS
- 🖼️ 智能图片处理: 自动图片上传、格式转换、EXIF方向处理
- 📊 数学公式支持: LaTeX 和 AsciiMath 双重语法支持
- 🚀 批量发布: 高效的批量文章发布功能
- ⚡ 现代架构: v1.4.0 全新模块化设计,更稳定、更高效
🏗️ 技术亮点
- 模块化核心系统: 9个专业模块提供统一的错误处理、进度反馈、配置管理
- 类型安全: 全面TypeScript覆盖,零编译错误
- 性能优化: 异步处理、智能缓存、模块化加载
- 扩展友好: 标准化的平台接口,便于新平台接入
插件专注于保证文章格式的完美同步,而不是成为一个平台编辑器。通过现代化的架构设计,为用户提供流畅、稳定的发布体验。
图片方向自动处理
为了优化微信公众号图片上传体验,插件新增了 EXIF 方向自动处理功能:
功能说明:
- 自动检测 JPEG 图片的 EXIF Orientation 信息
- 对存在方向问题的图片自动旋转并转换为 PNG 格式
- 确保上传到微信公众号的图片显示方向正确
支持的方向类型:
Orientation=1:正常方向(无需处理)Orientation=3:需旋转 180°Orientation=6:需顺时针旋转 90°(右旋 90°)Orientation=8:需逆时针旋转 90°(左旋 90°)
处理流程:
- 检测图片文件类型(仅处理 JPEG/JPG 格式)
- 读取 EXIF 方向信息
- 如有方向问题,使用 Canvas 进行旋转处理
- 将处理后的图片转换为 PNG 格式上传
用户体验:
- 本地 Obsidian 中显示正常的图片,上传到公众号后也会保持正确方向
- 自动处理,无需用户手动调整
- 转换为 PNG 格式可避免 EXIF 信息导致的显示问题
调试日志
在控制台(开发者工具)可看到:
[note2mp] active file path: your/file/path.md
[note2mp] use default cover: cover.png -> ![[cover.png]]
[note2mp] EXIF orientation detected: 6
[note2mp] Image converted to PNG with rotation
路径日志做了节流:同一文件 3 秒内不重复打印。后续可加"调试开关"以完全关闭。
摘要、封面裁剪、原文链接等
2、安装
Tip
v1.4.0 提升: 新版本采用模块化架构,安装更稳定,启动更快速!
首先,请确认已关闭了Obsidian的安全模式。如未关闭,请通过设置——第三方插件——关闭安全模式关闭。
2.1 插件安装
通过Obsidian设置——第三方插件——社区插件市场,输入Note2Any搜索安装。 🚩 TODO
2.2 主题资源安装
🚩 TODO
2.3 常见安装问题
只有默认主题 确认根据2.2 主题资源安装里的步骤操作了,然后检查一下插件目录内容,应如下所示:
.obsidian/plugins/note2any/
├── assets
│ ├── themes.json
│ ├── highlights.json
│ ├── themes
│ │ ├── maple.css
│ │ ├── mweb-ayu.css
│ │ └── ...
│ └── highlights
│ ├── a11y-dark.css
│ ├── a11y-light.css
│ └── ...
├── main.js
├── manifest.json
└── styles.css
3、使用
点击Obsidian左侧工具栏中的图标
或者按Ctrl+P打开命令,搜索复制到公众号。
检查样式无误后,点击复制按钮,然后到公众号粘贴即可。
🚀 主要功能
★ 智能平台切换 插件支持多平台发布,在下拉菜单中进行不同平台的切换。新架构提供更稳定的平台管理。
★ 一键复制 检查样式无误后,点击复制按钮,然后到平台编辑器粘贴即可。现在具有实时状态反馈。
★ 智能图片处理
- 自动上传本地图片到目标平台
- 支持WebP转JPG、EXIF方向自动处理
- 批量图片处理,进度可视化
- 点击上传图片会将文章中的本地图片上传到平台,同时替换预览中的图片地址
★ 草稿发布 点击发草稿会上传文章中的本地图片,并且将文章发送到平台的草稿箱,省去粘贴步骤。新版本提供更可靠的上传机制。
★ 实时刷新 如果笔记内容更新了,但是预览没有更新,可以点击刷新按钮。现在响应更加迅速。
★ 智能封面
- 发草稿必须设置文章封面
- 支持默认封面、本地上传、自动提取首图
- 新增封面处理优化,确保显示效果
★ 丰富样式 可以选取笔记的样式,目前有30多款,还在持续增加中。如果有钟意的样式,可以在插件设置中,设置为默认样式。
★ 代码高亮 设置代码高亮的样式,支持多种主题。
数学公式使用指南
- LaTeX使用指南:从入门到精通 - 少数派
- 通用 LaTeX 数学公式语法手册 - UinIO.com 电子技术实验室
- AsciiMath Parser 🚀 Asciimath Parser
- AsciiMath
目前插件支持LaTeX和AsciiMath两种数学公式语法,对于公式输入不是特别频繁,而且不怎么熟悉LaTeX的用户来说可以尝试使用AsciiMath,AsciiMath相对简单一些,可以现学现用,直接在官网查找手册编写就可以了。因为在正常的Markdown语法中无法区分采用的是哪种数学公式语法,所以需要在插件中设置默认的数学公式语法,默认是LaTeX语法。对于有混写需求的朋友来说,可以采用代码块的语法来写数学公式,然后指定latex或者asciimath来明确当前语法。但使用代码块语法的时候在Obsidian中并不能实时预览公式。
如果需要使用AsciiMath,还需要安装asciimath插件才能在Obsidian中实时预览,不过asciimath插件的解析器和官方的语法有一些差异,主要体现在矩阵写法上,所以使用时也需注意。另外需要特别提醒的是AsciiMath不支持在一个语法块中写多行公式,所以如果要写多行公式,只能每行公式单独写一个语法块。LaTeX是支持多行公式的。
数学公式的专业性很强,我也无法全面测试,如果遇到无法正常渲染的情况,欢迎反馈。
行内公式:$c=\pm\sqrt{a^2+b^2}$
行间公式:
$$
c=\pm\sqrt{a^2+b^2}
$$
使用代码块方式可以指定公式语法,该方法仅适用行间公式。
采用latex语法的数学公式:
``` latex
c=\pm\sqrt{a^2+b^2}
```
采用asciimath的数学公式:
``` am
c=+-sqrt(a^2+b^2)
```
数学公式的渲染效果可以看这篇文章:公众号文章里的数学公式排版秘籍👈️
自定义CSS使用指南
开发与构建
[!INFO] v1.4.0 架构升级: 新版本采用模块化架构,包含9个核心模块,1400+行新代码,提供更好的开发体验!
🛠️ 构建系统
本仓库提供多种构建选项:
npm run build:生成未混淆的main.js,便于调试和开发npm run build:obf:生产模式启用javascript-obfuscator,生成混淆后的main.js./build.sh:执行默认构建并同步到本地 Obsidian 插件目录./build.sh obf:执行混淆构建后再进行同步
🏗️ 架构特性
模块化设计: 新版本将原有单体架构拆分为9个专业模块:
ErrorHandler: 统一错误处理ProgressIndicator: 进度反馈系统ConfigManager: 配置管理PublisherInterface & PublisherManager: 发布平台抽象ContentProcessor: 内容处理流水线GalleryProcessor: 图库处理ImageProcessor: 图像处理HtmlProcessor: HTML生成
类型安全: 全面TypeScript覆盖,零编译错误,提供完整的类型推导。
性能优化: 异步处理、智能缓存、模块化加载,提升用户体验。
如需自定义混淆行为,可在执行命令时设置环境变量(例如 OBFUSCATE=1 npm run build:bundle),详细参数见 esbuild.config.mjs。
新建一篇笔记,例如自定义样式,直接将如下内容粘贴进笔记:
```CSS
.note-to-mp {
font-family: Optima, Optima-regular, "Microsoft YaHei", PingFangSC-regular, serif;
padding: 0;
background-color: #FFFFFF;
}
```
然后打开Note2Any插件设置,将自定义样式(即包含自定义CSS内容的笔记名称),粘贴到自定义CSS笔记中即可。如果不使用自定义CSS,留空即可。
关于自定义CSS的写法可以参考下面的代码
/* 全局属性
* 这里可以设置字体,字体大小,边距,背景颜色等
*/
.note2any {
/* 注:请在大括号内改写!!! */
}
/* 段落 */
.note2any p {
/* 注:请在大括号内改写!!! */
}
/* 一级标题 */
.note2any h1 {
/* 注:请在大括号内改写!!! */
}
/* 二级标题 */
.note2any h2 {
/* 注:请在大括号内改写!!! */
}
/* 三级标题 */
.note2any h3 {
/* 注:请在大括号内改写!!! */
}
/* 无序列表整体样式
* list-style-type: square|circle|disc;
*/
.note2any ul {
/* 注:请在大括号内改写!!! */
}
/* 加粗 */
.note2any strong {
/* 注:请在大括号内改写!!! */
}
/* 斜体 */
.note2any em {
/* 注:请在大括号内改写!!! */
}
/* 加粗斜体 */
.note2any em strong {
/* 注:请在大括号内改写!!! */
}
/* 删除线 */
.note2any del {
/* 注:请在大括号内改写!!! */
}
/* 分隔线
*/
.note2any hr {
/* 注:请在大括号内改写!!! */
}
/* 图片
*/
.note2any img {
/* 注:请在大括号内改写!!! */
}
/*
* 文件嵌入引用
*/
.note-embed-file {
/* 注:请在大括号内改写!!! */
}
/*
* 高亮颜色
*/
.note-highlight {
/* background-color: rgba(255,208,0, 0.4); */
}
/*
* Callout
* 可以调整各种类型Callout的文字颜色和背景颜色
* color: rgb(158, 158, 158);
* background-color: rgba(158, 158, 158, 0.1);
*/
.note-callout-note {
}
/* abstract tip hint */
.note-callout-abstract {
}
.note-callout-success {
}
/* question help, faq, warning, caution, attention */
.note-callout-question {
}
/* failure, fail, missing, danger, error, bug */
.note-callout-failure {
}
.note-callout-example {
}
.note-callout-quote {
}
例如这篇文章几个让公众号排版更精致的小技巧,手机上也可以!👈️使用的自定义样式如下:
.note2any {
font-family: Optima-regular, Optima, "Microsoft YaHei", PingFangSC-regular, serif;
}
h2 strong {
display: inline-block;
background: rgb(90, 185, 131);
color: rgb(255, 255, 255);
padding: 2px 16px;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
margin-right: 10px;
visibility: visible;
}
h2 {
border-bottom: rgb(90, 185, 131) 2px solid;
color: rgb(90, 185, 131);
}
section .note-callout-example {
color: rgb(90, 185, 131);
background-color: rgba(90, 185, 131, 0.1);
}
上面的例子,通过.note2any指定了文章的字体,通过h2 strong单独定义了h2标题下strong的样式,这样可以在标题中通过使用粗体增加了一个边框样式。通过h2定义了h2标题的底部线条的宽度和文本颜色。这样配合Olive Dunk主题就形成了自己的风格。
公众号名片
请参考 https://mp.weixin.qq.com/s/1wYd15Irmv9BPabgp5XMCA
设置图片大小
在Obsidian中可以设置图片的大小,语法如下:
![[1.jpg|120x80]] 设置图片的宽度和高度
![[1.jpg|120]] 设置图片的宽度,高度按比例缩放
NoteToMP插件支持该语法。
文件嵌入
文件嵌入是Obsidian一个很有用的功能,可以直接展示其它文件中的段落、章节。在写公众号的时候可以将以前文章的内容引用展示,也可以将该功能当作模板使用。
文件嵌入的语法如下:
![[文件名称#章节标题]]
![[文件名称#^段落标记]]
在Note2Any插件中有两种展示文件嵌入内容的样式,一种是引用,也就是Obsidian默认的方式,一种是正文,相当于模板的方式。与模板不同的是,采用嵌入方式内容会跟随被嵌入文件的内容更改。
批量发布(Batch Publish)
从 v1.3 起,插件新增“批量发布文章”功能,方便把满足条件的一批文章批量发送到公众号草稿箱以便后续编辑与发布。
如何打开:在命令面板(Ctrl/Cmd+P)中搜索“批量发布文章”,或在插件命令中找到“批量发布文章”。
主要功能:
- 条件筛选:按标签(tag)、文件名关键字、文件夹路径、及 frontmatter 字段进行筛选,支持 AND/OR 逻辑组合(当前为 AND 默认行为)。
- 预览与选择:筛选结果以列表展示,支持单个复选、全选、取消全选,以及鼠标拖拽框选(常规拖拽为添加选择,按 Ctrl/Cmd 拖拽为取消选择)。
- 批量发布:点击“发布选中文章”后会依次调用渲染与上传流程(与单篇发布同一实现),每篇之间有 2s 延迟以降低并发请求风险。发布过程中会显示进度通知并在结束汇总成功/失败数量。
注意事项:
- 批量发布会激活 NotePreview 视图并复用其渲染/上传逻辑,若无法取得 NotePreview,将无法完成发布。
- 单篇发布失败不会中断整体流程,失败项会在结束时统计并提示。
- 为避免误操作,建议先在小范围内测试筛选条件与发布流程再对大量文件执行批量发布。
示例使用场景:
- 你想要把所有标记为
篆刻的文章筛选出来,批量上传到公众号草稿箱并逐条完善后发布。 - 按文件夹
content/post筛选并批量发布该文件夹下的近期文章。
使用指南
- 打开模态
- 命令面板(Ctrl/Cmd+P)→ 输入“批量发布文章”,回车打开模态窗口。
- 设置筛选条件
- 按标签:在“按标签筛选”中输入标签名(例如
篆刻)。 - 按文件名:输入关键词(例如
教程)。 - 按文件夹:输入路径(例如
content/post)。默认值已预填为content/post。 - 按 frontmatter:目前可通过自定义筛选扩展(未来计划支持更复杂的 frontmatter 表达式)。
- 按标签:在“按标签筛选”中输入标签名(例如
- 回车快速应用
- 在任一输入框中按回车将立即执行“应用筛选”。
- 选择文章
- 使用复选框逐条选择;点击行的任意位置也会切换对应复选框。
- 使用鼠标拖拽进行框选:不按修饰键时为“添加选择”,按住 Ctrl/Cmd 时为“取消选择”。
- 支持“全选/取消全选”复选框。
- 批量发布
- 点击“发布选中文章”开始发布。发布会按顺序执行并在每篇之间等待 2 秒。
- 发布过程中会显示进度提示(Notice),发布结束会弹出成功/失败汇总。
筛选示例(可参考)
- 筛选有
篆刻标签的文章:在标签输入框输入篆刻,按回车。 - 筛选文件名包含
教程的文章:在文件名输入框输入教程。 - 同时按标签和目录筛选:标签输入
篆刻,文件夹输入content/post,按回车。
常见问题与故障排查
- 无法发布或没有响应:检查是否已激活
NotePreview视图(插件会在发布前尝试激活);如果视图打开失败,尝试手动打开插件右侧的预览窗格再重试。 - 部分文章发布失败:失败不会中断整体流程,发布结束时会通知失败数量。点击失败项单独重试发布。
- 图片上传失败或方向错误:插件会自动处理 JPEG 的 EXIF 方向并转换为 PNG,若仍有问题请检查图片是否受损,或在
开发者工具查看日志(节流为 3 秒同一路径)。 - 筛选结果为空:确认筛选条件是否正确(区分目录路径、标签是否存在、关键词是否拼写正确)。可以先留空所有条件查看全部可用文章,然后逐项缩小范围。
配置说明(相关设置)
defaultCoverPic:默认封面文件名(默认cover.png),当文章没有 frontmatter 封面与正文首图时使用。galleryNumPic:Gallery 展开时默认选取的图片数量(可在设置中调整)。batchPublishPresets:预设筛选模板(可在插件设置中新增常用筛选项)。
使用建议与最佳实践
- 先在少量文章上试运行一次批量发布,确认模板、封面与图片上传逻辑满足需求,再对大量文件执行批量发布。
- 如果担心频率限制或网络不稳定,可在代码中调整发布间隔(当前为 2s)或分批次发布以降低失败率。
- 建议为常用筛选条件创建 Preset(设置中),节省重复输入时间。
示例:把 database 视图筛选规则映射到模态
如果你使用 Obsidian Dataview 或内置视图创建了如下视图:
views:
- type: table
name: 表格
filters:
and:
- file.tags.contains("篆刻")
order:
- file.name
在模态中相当于:标签输入 篆刻,排序选择按 文件名(name)。
如果你还需要我把一张示例截图(标注关键按钮)加入 README,我可以把占位图片生成并放到 images/ 目录(需要你允许我在本地生成渲染的图片),或者我可以为你准备好截图模板与标注位置说明,方便你手动截屏粘贴。
插入SVG图标
https://www.bilibili.com/video/BV15XWVeEEJa/
Gallery 短代码支持
自 1.x 版本起,插件支持将形如 Hugo/Hexo 风格的短代码:
{{<gallery dir="/img/guanzhan/1" figcaption="毕业展"/>}}{{<load-photoswipe>}}
在渲染阶段自动展开为若干行图片 WikiLink:
![[001.jpg]]
![[002.jpg]]
可选参数新增:
mppickall=1 选取目录中所有图片(忽略“Gallery 选取图片数”限制);mppickall=0 或缺省时按配置的数量限制。支持写法:mppickall=1、mppickall='1'、mppickall="1"(0 同理)。
示例:
{{<gallery dir="/img/guanzhan/1" mppickall=1/>}}{{<load-photoswipe>}}
或属性顺序不同、带 figcaption:
{{<gallery dir="/img/guanzhan/1" figcaption="毕业展" mppickall=1/>}}{{<load-photoswipe>}}
在 mppickall=1 情况下,仍保持文件名排序(同原逻辑)。
配置项:
- Gallery 根路径(galleryPrePath):指向本地实际图片根目录,用于拼接短代码中的 dir 得到真实磁盘路径。
- Gallery 选取图片数(galleryNumPic):每个 gallery 最多展开前 N 张图片(按文件名排序)。
可在插件设置界面直接修改,无需重启。若希望随机选取或按时间排序,可后续在 issue 中反馈需求。若需要永久“全部图片”效果,可同时将“选取图片数”设为一个足够大的值,或在需要的单个 gallery 上使用 mppickall=1 精确控制。
Gallery 块与 figure 支持
除了带 dir 的短代码,还支持块级:
{{<gallery>}}
{{<figure src="/img/a.jpg" caption="说明" >}}
{{<figure link="/img/b.png" caption="说明" >}}
{{</gallery>}}
渲染为:
![[a.jpg]]
![[b.png]]
说明:
- 支持
src或link属性任选其一。 caption当前忽略(可后续增强:写入![[file|caption]]或紧随段落)。- 去重/排序策略:按出现顺序,文件名原样。
自定义行级语法扩展
为提升公众号排版效率,插件内置以下“轻语法”转换(发生在 Markdown 解析前):
- 斜体标注:
[fig 一段说明 /]→<span style="font-style:italic;...">一段说明</span> - 彩色提示块(只作用当前这一行,不跨行):
|| 内容默认灰底||r 内容棕底白字||g 内容黄绿色背景||b 内容浅灰背景||y 内容浅黄背景
这些语法不会写回原笔记,只影响发布预览。后续可加入:类名替换 + 主题化配置 + caption 支持,欢迎反馈需求。
无图片时的默认封面
自动封面选择优先级:
- frontmatter: cover / image(非空)
- 正文首图(Markdown 或 WikiLink)
- Gallery 短代码 / 块展开得到的首图
- 默认封面
defaultCoverPic(设置面板可配置,默认cover.png)
配置说明:
- 若填写文件名(如
cover.png),会按当前笔记目录解析并包装为![[cover.png]]。 - 若填写完整
![[xxx]]语法或http(s)://URL,将原样使用。 - 若文件不存在,不会报错(可后续增加存在性提示)。
Frontmatter 解析回退
如果 Obsidian metadataCache 暂未命中(例如首次载入或缓存延迟),插件会手动对首段 --- YAML 进行轻量行级解析,提取:
- title / author / cover(image)
避免因为缓存未就绪导致标题/作者缺失。若需复杂 YAML(数组、多行字符串)建议等待官方缓存,或后续考虑引入完整 YAML 解析库。
摘要、封面裁剪、原文链接等
---
标题:
作者: douboer
封面: "![[封面模板.jpeg]]"
摘要:
封面裁剪:
原文地址:
打开评论: true
仅粉丝可评论: true
公众号: douboer
样式: MWeb Panic
代码高亮: docco
---
附:批量发布 - 快速交互速览与截图占位
如果你想把功能教学放到 README 中,这里是推荐的简短速览(已在模态中实现):
- 回车快速应用:在任一筛选输入框中按回车即可触发“应用筛选”,无需额外点击按钮。
- 鼠标框选:在结果列表中按住鼠标左键并拖拽可以创建选择框,松开后会添加范围内的文章为选中状态。
- Ctrl/Cmd + 拖拽:按住 Ctrl(或 macOS 上的 Cmd/Meta)再拖拽会把框内的文章从当前选择中取消(方便进行批量取消选中)。
- 全选/取消全选:列表顶部提供全选复选框,一键切换所有结果的选择状态。
截图占位:如果你希望我把一张带标注的示例截图放到 images/,请回复“可以生成截图”,我会:
- 在
images/中放置占位文件batch-publish-example.png(示例标注), - 在 README 中替换占位为图片预览并附带关键交互标注说明。
如果你更愿意手动截屏,我也可以把一个标注模板(SVG 或说明)发给你,方便手动粘贴到 images/ 目录。
📚 相关文档
🤝 贡献
欢迎提交Issue和Pull Request来帮助改进Note2Any!
📜 许可证
本项目基于相应许可证开源,详见项目仓库。