etaf/README.zh-CN.md
Kinneyzhang 0185c4e05a feat: establish unified etaf view foundation
Implement the P0 View grammar, expr bridge, stateless view Components, and Ebox mount path in a new independent package. Include bilingual architecture and implementation documents plus contract tests.
2026-08-05 00:36:52 +08:00

2.2 KiB
Raw Blame History

ETAF

ETAF 是构建在独立 Ebox 布局与渲染引擎之上的文本应用框架。

公共模型刻意保持很小:

  • View 描述 Host 和 Component 调用。
  • Component 根据 props 产生 View。
  • Ebox 负责测量、布局、绘制和发布结果。

所有结构都使用同一种形状:

(name :property value ... child ...)

属性必须全部位于前面,子节点必须全部位于后面。属性值就是普通 Elisp 表达式;子节点中唯一的可执行桥接是 expr

(etaf-view
 (column
  (text :face 'bold "Hello")
  (text (expr :value (if ready "Ready" "Waiting")))))

使用 :view 定义无状态 Component

(etaf-define-component status-label (&key label)
  "Render a status label."
  :view
  (text :face 'bold (expr :value label)))

(etaf-mount
 "*etaf-demo*"
 (etaf-view
  (status-label :label "Connected")))

etaf-view 是唯一公共 View 构造入口。View 结构和 Component 的 :view 都不需要 quotequote 仍然是普通 Elisp 数据语法,例如用 'bold 表示 face 符号。普通 Elisp 表达式返回 Renderable 时,必须在 expr 中使用未 quote 的 (etaf-view ...) 构造它。

开发检出

开发时先把同级的 Ebox 检出目录加入 load-path

(add-to-list 'load-path "/path/to/github/emacs-box")
(add-to-list 'load-path "/path/to/github/etaf")
(require 'etaf)

包元数据声明 Ebox 1.0.1 为运行时依赖。ETAF 不调用 Ebox 私有函数。

第一阶段范围

当前仓库建立并测试 P0 语法、etaf-viewexpr、无状态 :view Component、核心 Hosttextfragmentcontainerrowcolumnstackflexspacer)以及 Ebox 挂载桥接。状态型 :setup、slot、styles、Context、Behavior、事件、Action、数据和增量 Component 协调将在后续里程碑实现;暂未实现的子句会显式报错。

运行聚焦检查:

make check EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs

目标架构和分阶段开发工作分别见 docs/architecture.zh.mddocs/implementation-plan.zh.md,英文版本与中文版本并列维护。