吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1620|回复: 27
收起左侧

[其他原创] 蓝笺 BlueNote:面向微信公众号技术类文章在线渲染编辑

[复制链接]
yibeijiu 发表于 2026-7-17 17:06
本帖最后由 yibeijiu 于 2026-7-17 22:05 编辑

Snipaste_2026-07-17_17-02-30.jpg


文件: bluenote-editor-v4.rar (42.42 KB, 下载次数: 75, 售价: 1 CB吾爱币)


1. 项目简介

蓝笺(BlueNote 4.0)是一款面向微信公众号技术文章、科研内容和工程笔记的在线排版编辑器。项目采用单文件 HTML 架构,将页面结构、样式系统和交互逻辑集中在一个文件中,无须安装运行环境或部署后端服务,使用浏览器打开即可运行。

编辑器支持 Markdown 写作、可视化编辑、HTML 查看、实时预览、主题切换、图片排版、本地草稿、项目备份以及微信公众号富文本复制等功能。

2. 技术架构

项目主要由三部分组成:

bluenote-editor-v4.html
├── HTML:页面结构和功能面板
├── CSS:界面布局、主题样式和响应式设计
└── JavaScript:编辑、渲染、存储和导入导出逻辑

整个应用运行在浏览器端,文章内容默认保存在 localStorage 中。若浏览器禁用本地存储,程序会自动切换到临时内存存储,但关闭页面后数据不会保留。

3. 页面组成

页面采用三栏式工作区:

  • 左侧为功能面板,包含模块、图片、排版、主题和草稿管理;
  • 中间为 Markdown、可视化和 HTML 编辑区域;
  • 右侧为微信公众号正文实时预览及兼容性检查。

左侧栏支持折叠和锁定。未锁定时,点击外部区域会自动收起;锁定后则保持展开状态。全局搜索会统一检索功能、文章模块和主题,并直接执行对应操作。

4. 核心代码流程

编辑器的主要处理流程如下:

Markdown 输入
    ↓
parseMarkdown()
    ↓
buildArticleHtml()
    ↓
applyStyles()
    ↓
实时预览
    ↓
compileWechatHtml()
    ↓
复制到微信公众号

主要函数

函数 作用
parseMarkdown() 将 Markdown 内容解析为 HTML
buildArticleHtml() 组合正文、目录、标题编号和文末推广
renderPreview() 刷新右侧预览并执行兼容性检查
compileWechatHtml() 将样式转换为适合微信公众号的内联样式
copyToWechat() 将富文本和纯文本同时写入剪贴板
saveLocal() 保存当前文章和排版配置
saveSnapshot() 创建文章历史快照
importFile() 导入 Markdown、HTML、TXT、JSON 和 DOCX
exportProject() 导出完整的蓝笺项目配置文件

项目没有使用第三方 Markdown 解析器,而是在 parseMarkdown() 中自行处理标题、段落、列表、代码块、表格、引用和自定义提示块,因此便于针对微信公众号排版规则进行扩展。

5. 微信公众号兼容处理

微信公众号后台可能会删除部分 CSS,并且对 flexgrid 等布局支持不稳定。为提高粘贴后的稳定性,程序会在复制前执行以下处理:

  1. 将文章样式转换为元素内联样式;
  2. 将多图布局和文末推广转换为表格布局;
  3. 为正文设置明确的字号、行高和字距;
  4. 将外部链接转换为脚注;
  5. 检查本地图片、宽表格、公式和外部链接。

多图布局转换为表格的处理集中在 compileWechatHtml() 中。

复制时优先使用现代浏览器的 ClipboardItem API,同时写入 HTML 和纯文本;如果浏览器不支持,则自动使用传统的 document.execCommand('copy') 作为兼容方案。

6. 主题与排版系统

主题数据统一保存在 themes 对象中。每个主题包含主色、辅助色、强调色、正文颜色、代码背景、表头颜色及标题样式预设。

const themes = {
  skyTech: {
    name: '浅蓝科技',
    primary: '#2f6d9f',
    secondary: '#5a9ed0',
    codeBg: '#172638',
    preset: {
      h2Style: 'bar',
      h3Style: 'line',
      codeStyle: 'dark'
    }
  }
};

这种数据驱动方式使新增主题较为简单,只需增加一组颜色和样式配置,无须重新编写页面结构。当前项目已内置科技蓝、学术灰、森林绿、暖色、紫色、黑白及深色代码等多种主题。

7. 本地存储与备份

编辑器分别使用多个存储键管理数据:

STORAGE_KEY        // 当前文章
DRAFTS_KEY         // 草稿副本
HISTORY_KEY        // 历史快照
CUSTOM_THEMES_KEY  // 自定义主题
RECENT_BLOCKS_KEY  // 最近使用模块

编辑内容发生变化后,程序通过约 550 ms 的延迟保存机制减少频繁写入。系统最多保留 15 个历史快照,并每隔十分钟自动创建一次快照。

由于数据保存在当前浏览器中,清理浏览器缓存、更换浏览器或更改网页文件路径后,原有草稿可能无法读取,因此重要文章应定期导出 .bluenote.json 项目文件。

8. 导入、导出与外部依赖

项目支持导出以下格式:

  • 微信兼容 HTML;
  • Markdown;
  • Word 文档;
  • PDF或浏览器打印;
  • 长图 PNG;
  • 蓝笺项目 JSON。

DOCX 导入依赖 Mammoth.js,长图生成依赖 html2canvas。这两个组件通过 CDN 加载,因此离线状态下 DOCX 导入和 PNG 导出可能不可用,但 Markdown 编辑、预览、本地保存及 HTML 导出等核心功能仍可正常运行。

9. 运行方式

直接使用浏览器打开 HTML 文件即可:

双击 bluenote-editor-v4.html

推荐使用较新版本的 Chrome、Edge 或其他 Chromium 浏览器。首次使用时可先导出一个项目文件,用于验证浏览器下载和本地存储功能是否正常。

10. 后续扩展建议

后续可将 CSS、主题数据和 JavaScript 拆分为独立文件,并引入模块化构建工具,以便维护大型功能。同时可增加 IndexedDB 图片存储、插件系统、云端同步、文章模板市场以及更严格的 HTML 内容安全过滤。

免费评分

参与人数 4吾爱币 +11 热心值 +3 收起 理由
shao84315 + 2 + 1 我很赞同!
忘情的城市 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
逐雅斋 + 1 在线演示:https://ico5.net/wechat-editor.html

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

TaDxx 发表于 2026-7-23 01:00
本帖最后由 TaDxx 于 2026-7-23 01:11 编辑

借助AI编程,需要多次反问架构逻辑有无缺陷、可否更健壮优雅。我用AI对这份编辑器源码进行了深入分析。以下内容未必全对,仅供参考。

“蓝笺4.0”功能丰富、视觉设计考究,但在架构、健壮性、可维护性和性能方面存在明显缺陷。

---

## 一、核心架构缺陷

### 1. 巨函数式单体架构,缺乏清晰模块
所有业务逻辑(状态管理、Markdown解析、WeChat兼容转换、UI交互)拥挤在一个超过2600行的`<script>`中。  
- **问题**:修改任意功能都可能影响全局,代码难以测试、复用。  
- **优解**:在IIFE内按职责拆分对象,例如:
  - `core_state`:单一状态存储,提供`getState`、`dispatch`(Redux/Vuex风格或Immer不可变更新)。
  - `core_markdown-parser`:纯函数,接收Markdown,输出HTML。
  - `core_wechat-compiler`:负责公众号兼容性转换。
  - `ui_renderer`:虚拟DOM或增量更新视图。
  - `ui_toast`、`ui_modal`等UI组件。

### 2. 状态管理混乱,缺乏不可变性
全局`state`对象被随意修改,如`state.themeOverride = {...}`、直接赋值`state.fontSize = ...`,并在多处直接读写。  
- **问题**:无法追踪状态变更,撤销/重做只能针对Markdown文本,无法恢复排版参数修改;组件间通过修改同一个`state`耦合。  
- **优解**:引入不可变状态树,每次修改返回新状态对象(或使用`immer`),提供`subscribe`机制通知视图更新。

### 3. 手写Markdown解析器脆弱且不完整
`parseMarkdown`函数用逐行分析实现,对嵌套列表、表格内多行、HTML标签等边缘情况处理较差。  
- **问题**:不支持CommonMark规范,复杂公众号内容(如嵌套引用、图片链接中的特殊字符)可能解析错误。  
- **优解**:使用成熟的Markdown解析库(如`markdown-it.min`、`remark`)并自定义渲染器。这样还能得到插件生态支持(公式、自定义容器)。

### 4. 视图更新采用全量重绘
`renderPreview`每次都`els.preview.innerHTML = buildArticleHtml()`,并重新`applyStyles`遍历所有元素。  
- **问题**:大文档时性能低下,且丢失用户滚动位置、焦点状态。  
- **优解**:实现增量渲染,或至少使用`requestAnimationFrame` + 虚拟滚动;或者将预览放在`iframe`中隔离样式重绘。

---

## 二、健壮性与安全性缺陷

### 1. XSS风险仍然存在
虽然使用了`escapeHtml`,但在多处使用`innerHTML`插入动态内容:  
- `$('quickBlockList').innerHTML = ...`,按钮属性中包含`item.title`等,虽经过`escapeHtml`,但属性值使用模板字符串拼接可能遗漏引号转义。  
- `els.visual.innerHTML = ...`直接取预览内容DOM的`innerHTML`赋值,若文章包含恶意脚本可能执行。  
- **优解**:全部采用`DOMPurify`消毒HTML;对于纯文本使用`textContent`;动态构建DOM使用`createElement`。

### 2. localStorage异常处理不彻底
`storage`对象尝试使用`localStorage`,失败时回退到内存对象`memoryStorageData`,但:
- 保存大文件(含Base64图片)可能超出5MB限制,`setItem`静默失败,代码仅捕获了权限异常,未处理`QuotaExceededError`。  
- 内存回退时,页面刷新数据丢失,应有明确提示。  
- **优解**:保存前检查大小,分块存储或用IndexedDB;在回退模式下禁止提示“已保存”,而是显示“临时模式”。

### 3. 网络组件依赖外部CDN,无离线回退
`html2canvas`和`mammoth`通过`defer`加载,若CDN不可用,导出长图、导入DOCX功能静默失败。  
- **优解**:将核心功能所用库打包入代码(使用动态`import()` + 缓存),或提供降级方案(如图片导出改用`Canvas`手动绘制)。

### 4. 缺乏并发标签页冲突处理
多个标签页同时打开同一域名下的编辑器,通过`localStorage`读写会互相覆盖,且无通知机制。  
- **优解**:使用`BroadcastChannel`或`localStorage`事件同步状态,或提示用户“已在另一标签页中编辑”。

---

## 三、性能瓶颈

### 1. 主线程阻塞式图片压缩
`fileToCompressedDataUrl`在渲染进程用`canvas`同步压缩图片,大文件(如12MB)会卡死UI数秒。  
- **优解**:使用`OffscreenCanvas`或Web Worker进行压缩;或者使用`createImageBitmap`+`Canvas`分块处理。

### 2. 无节制的DOM操作
- `compileWechatHtml`中频繁使用`$$('*', container)`遍历所有元素,并逐个修改`style`属性,极其消耗资源。  
- **优解**:仅对需要转换的元素操作;微信兼容性转换可考虑在编译时生成纯内联样式的HTML字符串,而非先构建DOM再遍历修改。

### 3. 文字输入时频繁触发重渲染
`onMarkdownChange`中`scheduleRender`有120ms防抖,但连续输入时仍可能触发多次解析+全量渲染。  
- **优解**:利用`requestIdleCallback`或Web Worker解析Markdown,预览使用`iframe`隔离,只在停止输入300ms后更新。

---
逐雅斋 发表于 2026-7-17 23:14
yibeijiu 发表于 2026-7-17 23:01
需备注出自52论坛,否则请删除

https://ico5.net/wechat-editor.html 已加备注 <div class="brand-subtitle">技术文章写作与公众号排版 备注:本页源码由52pj论坛yibeijiu提供</div>
geesehoward 发表于 2026-7-17 17:18
3650798 发表于 2026-7-17 17:25
怎么能让之前发布的公众号文章下面展示最新文章?
 楼主| yibeijiu 发表于 2026-7-17 17:30
geesehoward 发表于 2026-7-17 17:18
这个和墨滴是一样的功能吧

更全点..........
zr2019 发表于 2026-7-17 18:34
下载应用,谢谢分享
饮食协会 发表于 2026-7-17 19:03
标题让人看得一愣一愣的
zjhzxx666 发表于 2026-7-17 19:44
真的是好东西
hsx778899 发表于 2026-7-17 19:51
"面向微信公众号技术文章"是功能偏向技术类文章吗?还是啥意思,请指点
yycvip 发表于 2026-7-17 20:08
很好的编辑器,带劲儿
逐雅斋 发表于 2026-7-17 22:32
不错,感谢分享!已发布在线版:https://ico5.net/wechat-editor.html
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-9-1 04:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表