尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

closure-templates Print指令完整清单:截断、Bidi排版与输出后处理技巧一网打尽

closure-templates Print指令完整清单:截断、Bidi排版与输出后处理技巧一网打尽 closure-templates Print指令完整清单截断、Bidi排版与输出后处理技巧一网打尽【免费下载链接】closure-templatesA client- and server-side templating system that helps you dynamically build reusable HTML and UI elements项目地址: https://gitcode.com/gh_mirrors/clo/closure-templatesclosure-templates原 Soy是一个开源的客户端 服务端模板系统帮助你在 Java、JavaScript 等多端动态构建可复用的 HTML 与 UI 元素。本文聚焦它的Print 指令print directives对{print}输出结果做后处理的|directive语法一次讲清截断|truncate、Bidi 双向排版|bidiSpanWrap/|bidiUnicodeWrap、HTML 清洗|cleanHtml与 URI 过滤等全部内置指令帮你安全地渲染用户内容。Print 指令是什么print 输出的后处理钩子在 closure-templates 中print 命令 是最常用的命令语法为{表达式}或{print 表达式|指令1|指令2|...}。Print 指令就是管道|后面的后处理钩子{$userComment|cleanHtml} {$title|truncate:20}指令按顺序对输出逐一处理还能像|cleanHtml:ul,li这样传参。全部内置指令的参考文档见 print-directives.md。下图是一个真实的Bidi 双向排版演示页面同时出现 LTR 与 RTL 内容dropdown 中的 RTL 文本被正确包裹截断指令 |truncate参数写法与避坑指南|truncate把字符串截断到最大长度默认在末尾加省略号{Lorem Ipsum|truncate:8}→Lorem...{Lorem Ipsum|truncate:8,false}→Lorem Ip第二个参数false关闭省略号官方文档明确提示截断并不总是最佳选择。原因是它按字符数而非视觉宽度计算中文宽度约为拉丁字符的 2 倍且不感知 Unicode截断 emoji 等多码点字符时可能产生乱码。更稳妥的做法是用 CSS 的text-overflow: ellipsis做视觉截断。指令实现位于 TruncateDirective.java支持 1~2 个参数最大长度、是否加省略号并适配 Java 字节码、JS 与 Python 多后端输出。Bidi 排版指令让 RTL 语言正确显示面向希伯来语、阿拉伯语等 RTL从右到左内容时两条指令是关键指令作用适用场景\|bidiSpanWrap当输出方向与全局方向不一致时自动包上span dirltr/rtl常规 HTML 上下文\|bidiUnicodeWrap用 Unicode 控制字符LRE/RLE PDF包裹输出不能出现 HTML 标签处如option内两者目的相同区别在于 HTML 标签是否可用。编译器在求值|bidiSpanWrap之前先做自动转义能正确处理已转义的 HTML 文本因此是安全的。源码见 BidiDirectives.java。HTML 清洗与换行指令安全渲染用户内容|cleanHtml只保留一个小型安全标签集合默认b、br、em、i、s、strong、sub、sup、u把text类内容安全地转成html可防 XSS。参数可追加白名单标签但只允许ul、ol、li、hr、span例如|cleanHtml:ul,li。除dir外所有属性都会被移除。|changeNewlineToBr把\n、\r、\r\n统一替换为br适合渲染多行用户文本。|insertWordBreaks:NNN在超过 NNN 个字符的词中插入wbr。已弃用请改用 CSSword-wrap: break-word。URI 过滤指令filterTelUri、filterSipUri 与 filterImageDataUri这类指令是白名单守卫只放行指定协议的 URI|filterTelUri只接受tel://电话链接依据 RFC 3966|filterSipUri只接受sip:语音协议链接依据 RFC 3261|filterImageDataUri只接受包含图片的 data URI确保img不会发起任何 HTTP 请求实现分别在 FilterTelUriDirective.java、FilterSipUriDirective.java 与 FilterImageDataUriDirective.java。自动转义体系escapeUri、normalizeUri 等隐藏指令closure-templates 的自动转义器内部使用大量上下文感知指令你在正确上下文打印变量即可自动触发如hr {$attributes}。少数对用户可见的主要有|escapeUri转义为可安全嵌入href等 URI 的值|normalizeUri归一化 URI 分隔符转义 HTML/CSS/JS 边界字符注意它不做 URI 转义|filterCspNonceValue校验nonce属性值为 base64CSP3 规范配合 Content-Security-Policy 使用完整的转义类指令清单定义在 BasicDirectives.java含 CSS/JS/HTML 转义族核心指令|escapeHtml定义在 EscapeHtmlDirective.java。安全模型详见 security.md。完整速查表所有内置 Print 指令一览指令功能状态|truncate:N[,false]截断字符串可选省略号⚠️ 视觉宽度不一致慎用|cleanHtml[:ul,...]白名单式 HTML 清洗✅ 推荐|bidiSpanWrapspan 包裹 RTL/LTR 内容✅ 推荐|bidiUnicodeWrapUnicode 控制字符包裹✅ 推荐|changeNewlineToBr换行符转br✅ 推荐|filterTelUri/|filterSipUri/|filterImageDataUriURI 协议白名单✅ 推荐|escapeUri/|normalizeUriURI 转义 / 归一化多由自动转义器触发|filterCspNonceValueCSP nonce 校验编译器内部使用|insertWordBreaks:NNN长词插wbr⛔ 已弃用总结如何选择合适的 Print 指令用户文本→ 依赖自动转义 |changeNewlineToBr保留部分格式时加|cleanHtml标题摘要→ 优先 CSS 截断确需模板层截断再用|truncate多语言 UI→ RTL 内容用|bidiSpanWrapoption内用|bidiUnicodeWrap链接输出→|filterTelUri/|filterSipUri/|filterImageDataUri守住协议白名单所有指令均为纯函数式后处理可自由链式组合如需扩展自定义指令可参考 插件文档。【免费下载链接】closure-templatesA client- and server-side templating system that helps you dynamically build reusable HTML and UI elements项目地址: https://gitcode.com/gh_mirrors/clo/closure-templates创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表