报表编辑器如果真按普通 HTML 富文本去做,第一轮保存就会把 QWeb 语义弄坏。企业版显然知道这一点。
主要参考:
enterprise/web_studio/controllers/report.py
一、Studio 面对的是“HTML 外壳 + QWeb 内核”的混合文档
html_to_xml_tree()、_cleanup_from_client()、_to_qweb()、_html_to_client_compliant() 这一组函数来回转换,说明编辑器看到的 HTML 只是可编辑外壳,真正保存时还得还原成 QWeb。
例如 q-table/q-td 这类转换,就是为了让表格里夹着 <t> 节点时,浏览器编辑体验和 QWeb 语义都不至于崩掉。
二、为什么 t-call 内容要先拆组再重组
报表编辑器会把 t-call 内联展开,用户看起来像在一张文档里直接编辑;但保存时系统必须知道哪些节点属于主模板,哪些是被调用模板注入的内容。
所以源码先 _collect_t_call_content()、再 _recompose_arch_with_t_call_parts(),把散落在编辑器里的内容重新拼回原始调用结构。否则一旦直接保存,模板边界就会丢失。
三、变量提示为什么没法只靠静态字符串匹配
_guess_qweb_variables() 会尝试在受控环境里编译/安全求值表达式,并把 dotted expression 转成较可读的字段链路提示。也就是说,Studio 并不是简单给你列出几个变量名,而是在尽量推断“这段表达式在当前 report/qcontext 下可能指向什么”。
四、结论
Studio 报表编辑器不是通用 WYSIWYG。它真正做的是:让用户在“近似 HTML”的前端体验里编辑,同时在后台保护 QWeb 结构、t-call 边界和变量语义。
DISCUSSION
评论区