0%

我的一些神奇构想但很有可能一直无法实现的之文字排版软件

需求分析

1. 核心功能需求

  • 长篇文章处理能力

  - 支持用户输入、编辑和显示大量文本内容,性能需流畅,不能因文本量大而卡顿。

  - 提供基础的文本编辑功能,如复制、粘贴、剪切、撤销、重做。

  • 基础文字渲染与排版

  - 支持常见的字体选择、字号调整、颜色设置。

  - 提供段落对齐(左对齐、右对齐、居中、两端对齐)、行距调整等基础排版功能。

  • 可定制的文字形变

  - 用户能够选择文章中的任意文字或短语,并对其进行无损的、高度自由的矢量形变

  - 形变效果包括但不限于:横向拉伸、纵向拉长、整体扭曲、自由弯曲等,实现类似手绘或漫画中为了强调而进行的夸张形变。

  - 形变操作应直观,最好能通过鼠标拖拽、控制点调整等方式进行。

  • SVG 涂鸦与形变文字的无缝集成

  - 支持用户上传和嵌入自定义的 SVG 图像(例如手绘涂鸦),这些 SVG 图像应和形变后的文字一样,支持无损放大

  - 嵌入的 SVG 和形变文字应能与普通文本在同一篇文章中和谐共存,并能进行位置调整。

  • 内容保存与加载

  - 能够保存用户创建的文章内容,包括所有普通文本、形变文字(及其形变数据)和嵌入的 SVG 图像。

  - 能够正确加载之前保存的文件,并恢复所有文字的原始排版和形变效果。

2. 非功能性需求

  • 卓越的性能

  - 处理长篇文章的基础渲染和编辑时,必须保持流畅的用户体验。

  - 文字的矢量化和形变计算需要毫秒级响应,避免卡顿。

  - 即使形变后的文字数量较多,整体性能也应保持高效。

  • 高可扩展性

  - 软件架构应模块化,便于未来引入新的形变效果、图形工具或导出格式。

  - 方便集成第三方字体库。

  • 优秀的跨平台体验

  - 软件应在 Windows、macOS 和 Linux 三个主流操作系统上提供原生级别的性能和一致的用户界面。

  - (可选,但考虑到你对 Android 开发的兴趣)未来可考虑向移动端(Android/iOS)扩展的可能性。

  • **直观的用户界面 (UI)**:

  - 界面设计应简洁、现代,以内容为中心,避免过多干扰。

  - 形变工具应易于理解和操作,降低学习成本。

  • 数据完整性与可靠性

  - 确保保存和加载文件时数据的完整性和准确性,特别是形变数据和 SVG 内容。

  • 离线可用性:作为桌面应用,应能在没有网络连接的情况下完整运行所有核心功能。

技术选型与架构设计

根据你的需求,特别是对性能、跨平台、可扩展性以及你对 Tauri 和前端技术的经验,我推荐以下技术栈和架构方案:

1. 整体框架:Tauri (前端 Vue.js + 后端 Rust)

  • 选择理由:Tauri 结合了 Web 前端的开发效率和 Rust 后端的原生性能。它能将一个 Web 应用打包成一个轻量、高性能的原生桌面应用,完美满足你对跨平台性能的需求。

  • 核心优势

  - 高性能后端:使用 Rust 编写核心逻辑,确保文字矢量化和形变计算的性能。

  - 丰富的生态:可以利用成熟的前端技术栈(Vue/React)快速构建 UI。

  - 小巧的打包体积:Tauri 的打包文件远小于 Electron,减少了软件的发布和分发成本。

2. 前端技术栈 (Vue.js)

  • 职责:负责整个应用的用户界面、用户交互、普通文本的输入和显示、形变文字的占位符渲染以及 SVG 涂鸦的嵌入和显示。

  • 核心库

  - Vue.js 3:作为 UI 框架,利用其响应式系统和组件化特性快速构建界面。

  - 富文本编辑器:选择 TipTapQuill.js

    - 它们都支持自定义扩展,可以让你在编辑器中插入非标准内容,例如我们的形变文字(以 SVG 形式)和 SVG 涂鸦。

    - 你可以创建一个自定义的 “Node” 或 “Embed” 类型,用于表示形变后的文字或 SVG 涂鸦,这样它们就能与普通文本一起在编辑器中显示和操作。

  - UI 组件库Element PlusAnt Design Vue。用于构建工具栏、设置面板、文件管理器等,确保 UI 的美观和一致性。

  - CSS 框架Tailwind CSS。简化样式编写,提供响应式设计能力。

  • 交互设计思考

  - 当用户选择一段文字进行形变时,前端将这段文字、当前使用的字体信息以及形变操作参数(例如,鼠标拖拽的起始点和结束点,或一个形变类型)作为参数,通过 Tauri 的 invoke API 发送给 Rust 后端。

  - 后端返回形变后的 SVG 字符串后,前端将其动态替换掉原有的文本,并以 <svg> 标签的形式插入到富文本编辑器中。

  - 嵌入的 SVG 涂鸦也直接作为 <svg> 标签或 <img> 标签(srcdata:image/svg+xml;base64,...)插入。

3. 后端技术栈 (Rust)

  • 职责:处理所有计算密集型任务,包括文字的矢量化、形变计算、SVG 生成以及文件内容的读写(复杂格式)。

  • 核心库

  - 字体解析与矢量化

    - rusttype:一个纯 Rust 的 TrueType 字体解析和光栅化库。它能读取字体文件,并提供每个字符的矢量轮廓数据(路径、锚点、控制点)。这是实现文字形变的基础。

    - (可选)**fontdue**:另一个高性能字体渲染引擎,提供更多字体处理功能,可以作为 rusttype 的替代或补充。

  - 几何变换与矢量图形操作

    - lyon:一个强大的 2D 几何处理和路径构建库。它能让你轻松地对矢量路径进行各种数学变换(平移、缩放、旋转、扭曲),并进行路径操作(如合并、裁剪)。

    - 自定义形变算法:你需要自己编写 Rust 代码来实现具体的形变逻辑。例如,基于贝塞尔曲线的扭曲算法、网格变形算法等。

  - SVG 生成

    - std::fmt::Write 和字符串拼接:Rust 原生字符串处理能力可以高效地构建 SVG 字符串。

    - (可选)**resvg** 或其他 SVG 库:如果需要更复杂的 SVG 输出控制,可以考虑。但对于形变文字,直接拼接 SVG <path> 数据通常更高效。

  - 文件系统操作:Rust 标准库提供了强大的文件 I/O 能力,用于保存和加载文章数据。


4. 数据存储与性能优化方案

针对长篇文章可能带来的大文件和性能问题,采用以下优化策略:

4.1 本地数据存储:SQLite 数据库

  • 理由:对于包含大量内容块(普通文本、形变文本、嵌入 SVG)的长篇文章,将所有数据存储在一个巨大的 JSON 文件中会显著影响读写性能和内存占用。使用嵌入式本地数据库 SQLite 是更专业、高效且可扩展的方案。

  • 实现方式

  - 数据模型

    - 创建一个主表 (articles) 存储文章的元数据(如 ID, 标题, 创建日期, 最后修改日期)。

    - 创建一个 blocks 表存储文章的内容块。每行代表一个内容块,包含字段如:block_id (唯一标识), article_id (关联到哪篇文章), type (块类型:paragraph, transformed_text, svg_embed), order (在文章中的顺序), content (存储具体数据)。

  - 内容存储

    - 对于普通文本 (paragraph),content 字段直接存储文本字符串。

    - 对于形变文字 (transformed_text) 和嵌入 SVG (svg_embed),content 字段可以存储其原始文本、形变参数和最终的 SVG 字符串。这些数据可以序列化为二进制数据(BLOB)存储,以提高效率。

  • 优点

  - 按需加载:后端可以只查询和加载当前视图所需的内容块,显著降低内存占用和渲染延迟。

  - 高效的数据管理:支持快速地对特定内容块进行增、删、改、查操作。

  - 数据可靠性:SQLite 提供事务支持和数据完整性保障。

  • Rust 库:使用 rusqlite 等 Rust 库来与 SQLite 数据库交互。

4.2 数据序列化:二进制格式

  • 理由:虽然 SQLite 解决了大文件的管理问题,但在数据库内部,对于形变数据 (transformData) 和完整的 SVG 字符串 (svgContent),如果直接存储为文本,仍会占用较大空间并影响读写效率。

  • 实现方式

  - 在将形变文字的形变数据和 SVG 字符串存储到 SQLite 的 BLOB 字段之前,使用高效的二进制序列化库将其转换为紧凑的字节数组。

  - 推荐库:**bincode** 或 **prost (用于 Protobuf)**。它们能将复杂的 Rust 结构体序列化为非常紧凑的二进制格式。

  • 优点

  - 进一步减小存储体积,特别是对于重复或结构复杂的 SVG 数据。

  - 加快数据的序列化和反序列化速度,提升数据库读写效率。

4.3 文件压缩

  • 理由:无论最终选择何种存储方式(JSON 或是 SQLite),对最终保存的文件进行压缩,可以在磁盘存储和网络传输(如果未来考虑同步)方面带来额外收益。

  • 实现方式

  - 在 Rust 后端,保存 SQLite 数据库文件到磁盘时,可以考虑对其进行整体压缩(例如,使用 zstdflate2 库进行 Gzip 压缩)。

  - 读取文件时,先解压缩,再进行数据库操作。

  • 优点:显著减少磁盘占用,降低文件传输时间。

4.4 前端渲染优化:内容虚拟化/懒加载

  • 理由:即使后端能高效加载数据,前端也不能一次性渲染整篇文章的所有 DOM 元素,这会导致性能下降。

  • 实现方式

  - 在前端富文本编辑器中集成虚拟滚动(Virtual Scrolling)或内容虚拟化技术。

  - 这意味着编辑器只渲染当前用户可见区域(或稍微超出部分)的内容块。当用户滚动时,动态地加载新内容块并卸载屏幕外的旧内容块。

  • 优点

  - 大幅减少前端 DOM 节点的数量,提高渲染性能和交互流畅性。

  - 降低前端内存占用。

  • TipTap/Quill 集成:这两个编辑器都支持插件化和自定义渲染,可以让你实现自己的虚拟化渲染逻辑。

5. 架构示意图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

+---------------------+           Tauri Bridge            +----------------------+

|       前端 (Vue.js)     |------------------------------->|        后端 (Rust)       |

|  - 用户交互 / UI 界面  |                               |  - 文字矢量化        |

|  - 富文本编辑器 (TipTap/Quill)  |                       |  - 几何形变计算      |

|  - 普通文本渲染     |                               |  - SVG 字符串生成    |

|  - 形变文字占位符渲染 |                               |  - 数据序列化/反序列化 |

|  - SVG 涂鸦嵌入     |                               |  - SQLite 数据库操作 |

|  - 内容虚拟化渲染   |<------------------------------------|  - 文件压缩/解压缩   |

+---------------------+    (invoke 命令 / emit 事件)    +----------------------+

                                      |

                                      |

                            +-------------------+

                            |  文件系统 (加密 SQLite DB / 压缩文件)  |

                            +-------------------+


对话来源:gemeni


预期的实现效果

image