96SEO 2026-08-09 10:45 16
这个项目里有一个看似矛盾的地方:编辑器给使用者展示的是可视化的富文本,但最终要交给后端的却是 FreeMarker 模板。
说白了使用者在页面上看到的是“投保人姓名”这样的蓝色标签。保存下来的是带 data-variable 属性的 HTML,最终生成的却是 ${info.insuredName!} 这样的 FTL 表达式。

中间这个转换过程,一开始是打算让后端来做的。但后来发现几个问题:
使用者痛点:样式丢失导致文档排版错乱、生成延迟影响业务审批效率、缺乏即时校验导致反复修改。
最终决定在前端做一个完整的模板编译层,把 HTML 转换成 FTL。
整个转换过程不是一步到位的,而是分成了两个阶段:
阶段一:原始文档 → 带 {{变量方法}} 标记的 HTML
再看阶段二。带标记的 HTML → 完整 FTL 模板
阶段一是在编辑器内部完成的。当使用者点击“生成”按钮时getGenerateContent 会调用 convertVariablesForGenerate把编辑器里的变量节点转换成 {{prop}} 或 {{prop||styleStr}} 这样的占位符。话说回来,这一步主要是把可视化的节点变成字符串标记,方便后续处理。
阶段二就是 ftlGenerator.ts 做的事情。它拿到带标记的 HTML,经过词法分析、语法分组、代码生成、结构适配等步骤。最终输出完整的 FTL 模板。
这个两阶段的好处是职责清晰:阶段一只负责“把编辑器内容转成标记”,阶段二负责“把标记编译成模板”。它们之间逻辑,
编译的第一步先是词法分析,也就是从 HTML 中找出所有变量标记,并给它们分类。
代码里用了一个正则表达式来提取所有 {{prop}} 和 {{prop||styleStr}} 格式的标记:
const regex = /\{\{)?其实,\}\}/g
这个正则匹配以 {{ 开头、}} 的字符串。第一组捕获变量方法,第二组捕获可选的样式字符串。
User Pain Point: 没有映射表时数组字段难以定位,会导致循环代码生成错误。
`buildArrayMap`
export const buildArrayMap = : Map => {
const map = new Map
const traverse = => {
for {
if {
for {
const fieldName = child.value.split.pop || child.value
map.set(child.value,{
arrayPath: opt.value。fieldName
})
}
}
if {
traverse
}
}
}
traverse
return map
}
`buildDynamicMap`
export const buildDynamicMap = : Map => {
const map = new Map
const traverse = => {
for {
if ) {
map.set
}
if {
traverse
}
}
}
traverse
return map
}
有了映射表之后每个变量标记就可以被分类了。
代码里定义了三种 MatchType{'array'|'dynamic'|'normal'}:
type MatchType = 'array' | 'dynamic' | 'normal'
<#list> 循环;${prop!}.词法分析得到的是一个线性的变量列表,但模板里的数组变量必须被归为同一个循环块,这就需要语法分组。
The compiler includes a validation step that checks wher dynamic list markers are correctly paired before publishing.
ts
export
User Pain: Unmatched ListS/ListE markers cause runtime errors and hard‑to‑debug PDF generation failures.
typescript
...
This architecture bridges gap 娱乐ween visual editing experience and robust FreeMarker template output。delivering a fast‑feedback loop while preserving layout fidelity and reducing maintenance overhead.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback