{{ title() }}
创建时间: {{ datetime() }} 文档ID: {{ uuid() }} 所属分类: 技术文档
概述
{{ randomStr(50) }}
详细内容
功能特点
- 特性一
- 特性二
- 特性三
使用说明
- 第一步
- 第二步
- 第三步
附录
- 相关链接
- 参考资料
### 高级自定义变量
除了内置变量,你还可以创建自定义变量:
```javascript
// 自定义模板变量配置
template_variables: [
{
enable: true,
name: "projectName",
callback: "() => '智能文档管理系统'"
},
{
enable: true,
name: "author",
callback: "() => process.env.USER || '未知作者'"
},
{
enable: true,
name: "version",
callback: "() => `v${Math.random().toString().slice(2, 5)}`"
}
]
在模板中使用自定义变量:
# {{ title() }}
**项目**: {{ projectName() }}
**版本**: {{ version() }}
**作者**: {{ author() }}
**创建时间**: {{ datetime('zh-CN') }}
条件逻辑与参数传递
templater支持带参数的函数调用:
# 项目计划书
**计划周期**: {{ dateOffset(0, 'yyyy年MM月dd日') }} 至 {{ dateOffset(30, 'yyyy年MM月dd日') }}
**本周重点**:
- {{ weekday() }}: 需求分析
- {{ dateOffset(1, 'ddd') }}: 技术设计
- {{ dateOffset(2, 'ddd') }}: 开发实现
**随机任务ID**: TASK-{{ randomInt(1000, 9999) }}
技术实现深度解析
模板解析引擎
templater采用基于正则表达式的模板解析引擎:
class templateHelper {
_convert(text) {
const context = this._getTemplateVars();
const pattern = `\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)(\\(.*?\\))?\\s*\\}\\}`;
return text.replace(new RegExp(pattern, "g"), (match, funcName, argsStr) => {
const func = context[funcName];
if (func && typeof func === 'function') {
const args = argsStr ? eval(`[${argsStr.slice(1, -1)}]`) : [];
return func.apply(this, args);
}
return match;
});
}
}
文件系统集成
插件深度集成文件系统操作:
性能优化与最佳实践
模板组织策略
建议按以下结构组织模板:
templates/
├── technical/ # 技术文档
│ ├── api.md
│ ├── spec.md
│ └── readme.md
├── business/ # 业务文档
│ ├── proposal.md
│ ├── report.md
│ └── plan.md
├── personal/ # 个人文档
│ ├── diary.md
│ ├── note.md
│ └── blog.md
└── shared/ # 共享模板
├── base.md
└── standard.md
性能考虑
- 目录深度限制: 默认只递归搜索3层子目录,避免性能问题
- 超时机制: 30秒超时保护,防止长时间阻塞
- 文件过滤: 只处理
.md文件,忽略其他格式
安全注意事项
由于支持eval执行自定义函数,建议:
- 仅启用信任的自定义变量
- 避免使用来自不可信源的模板
- 定期审查自定义回调函数
扩展与自定义开发
插件开发接口
templater作为Typora插件的一部分,提供了完整的开发接口:
// 自定义插件示例
class CustomTemplatePlugin {
constructor() {
this.utils = window.templaterUtils;
}
// 添加自定义变量
addCustomVariable(name, callback) {
this.utils.registerTemplateVariable(name, callback);
}
// 批量导入模板
importTemplatesFromFolder(path) {
return this.utils.scanTemplates(path);
}
}
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



