Notist
On this page
  1. 内容函数与输出绑定
  2. HTML 绑定
  3. 组件属性
  4. 参数编码
  5. 呈现与诊断

内容函数与输出绑定

函数共用静态签名、参数绑定、实例化、调用和结果检查,实现来源只有 Code 与 Rust native。原生内容声明绑定构造 Content 的 Rust 实现,HTML 再为返回节点选择呈现方式;read_text 同样是 Rust-native 函数,但返回 String,不建立内容节点或查找组件。Code 函数体由 Evaluate 执行,其 Expanded 边界呈现返回的森林,无须对应组件。类型、实例与错误边界见 Code 类型与函数系统,导入与目录布局见 本地模块。

HTML 绑定

HtmlRegistry 以规范函数身份绑定内置 Native handler 或 Component。Renderer 根据 Item.target 选择实际实现;未映射的节点使用自身身份。绑定引用 Registry 中的 FunctionDef,不创建另一份语义定义。

宿主在求值后收集实际需要的原生目标,再查找声明文件同目录的 name.js 或 name/index.js。两种入口并存时报冲突;缺少入口由 Renderer 产生呈现诊断并保留回退 children。未使用的声明、未返回的输入与错误节点隐藏的 children 不触发入口查找。单独检查 .notc 文件只加载源码导入图,不查找 HTML 资源。

组件入口默认导出 Custom Element 类。宿主按 used_components 发布并注册实际使用的组件及其相对依赖资源,按函数身份去重。组件的 children 是 light DOM,组件可使用 slot 呈现;其浏览器生命周期不属于纯 Code 求值。

内部名称保持原样。encode_name 保留小写 ASCII、数字与短横线,其余 Unicode scalar 编码为 u + 小写十六进制码点 + x;结果首位不是小写 ASCII 时加 x。标签使用 notist-、规范模块身份的稳定哈希及编码后的函数名;发布资源位于 _notist/modules/<模块哈希>/。参数属性在编码后的参数名前加 notist-。绑定检查标签与参数属性碰撞;冲突不覆盖已有目标。

组件属性

每个组件带 notist-protocol="2"、记录规范函数身份的 notist-function,以及 notist-content="inline" 或 "block"。protocol、function、content 是保留参数名。

编译期实参通过 notist-comptime-name 传递:Type 使用规范类型名称,数据使用下述标量编码。普通参数通过 notist-name 传递,按执行目标的具体实例签名解释;编译期元数据不混入普通 fields。空字符串生成空属性,省略参数不生成属性。

参数编码

HTML 属性承载字符串,因此映射协议需要定义如何保留 Value。基本规则如下:

参数类型

属性编码

String

原始字符串,经 HTML 属性转义

Bool

true 或 false

Int

十进制字符串;解码时保留 i64 精度

Float

可往返 f64 的十进制字符串;非有限值为 NaN / Infinity / -Infinity

Unit

null

Array / Dict

保留 Value 类型的版本化 JSON

基本值由签名中的参数类型解释,例如 String 的 "null" 仍然是字符串。复杂值的 JSON 保留整数精度和 Dict 的键值顺序。组件辅助库 web/component-protocol.js 提供 readParameter(element, name, type),缺失属性返回 undefined,Int 返回 BigInt,Dict 返回保序 Map;组件也可按契约直接读取。

Path 是逻辑资源身份,不能通过组件属性导出,包括嵌套在集合中的 Path;renderer 诊断并省略它,不泄漏资源根或隐式生成 URL。ResourceTarget 输入的 String 分支按字符串协议读取,Path 分支同样禁止导出。原生 embed 的资源映射是宿主显式发布能力,不是组件参数的自动转换。

恢复树中的非法参数值不能按合法签名强制转成另一种 Value。renderer 为不匹配的参数产生诊断并省略对应属性,继续渲染 children;保留原值的完整 IR 仍可用于 debug 与分析。

Array / Dict 使用以下递归 JSON,不经普通 JSON number 传递整数或浮点:

Unit    = ["unit"]
Bool    = ["bool", boolean]
Int     = ["int", signed_decimal_string]
Float   = ["float", sixteen_hex_digits_of_f64_bits]
String  = ["string", string]
Array   = ["array", [Value, ...]]
Dict    = ["dict", [[string_key, Value], ...]]

Dict 条目按原顺序编码;Float 使用 IEEE 754 的 64 位比特(高位在前),保留负零及非有限值。HTML 属性转义在协议编码之后执行。

呈现与诊断

Renderer 返回 HTML、诊断、sourcemap 与 usedcomponents;source_map 保留来源文件及调用展开链。Expanded 边界默认透明呈现,需保留注解时使用对应类别的容器。

求值失败时,错误 Item 保留原函数身份、类别、字段、注解与来源,HTML 使用对应类别的错误元素显示诊断,隐藏其 children,其余内容继续呈现。