feat: normalize static strings as Text views
This commit is contained in:
parent
c831ca11ca
commit
0aee417282
28
etaf-view.el
28
etaf-view.el
@ -384,7 +384,7 @@ SLOT-MODE distinguishes Component-owned projections from call-site inputs."
|
|||||||
SLOT-MODE distinguishes Component-owned projections from call-site inputs."
|
SLOT-MODE distinguishes Component-owned projections from call-site inputs."
|
||||||
(cond
|
(cond
|
||||||
((null form) nil)
|
((null form) nil)
|
||||||
((stringp form) `(quote ,form))
|
((stringp form) `(etaf--text-view-from-string ,form))
|
||||||
((not (and (consp form) (symbolp (car form))))
|
((not (and (consp form) (symbolp (car form))))
|
||||||
(etaf--syntax-error "View form must start with a symbol: %S" form))
|
(etaf--syntax-error "View form must start with a symbol: %S" form))
|
||||||
((eq (car form) 'expr)
|
((eq (car form) 'expr)
|
||||||
@ -466,19 +466,41 @@ ordinary Elisp expressions. `expr' is the only computation bridge in the
|
|||||||
key (etaf--component-spec-name spec)))))
|
key (etaf--component-spec-name spec)))))
|
||||||
props))
|
props))
|
||||||
|
|
||||||
|
(defun etaf--text-view-from-string (value)
|
||||||
|
"Return one normalized Text View containing string VALUE."
|
||||||
|
(etaf--view-node-create :name 'text :props nil :children (list value)))
|
||||||
|
|
||||||
|
(defun etaf--normalize-structural-child (child)
|
||||||
|
"Normalize static structural CHILD without evaluating expressions."
|
||||||
|
(cond
|
||||||
|
((stringp child) (etaf--text-view-from-string child))
|
||||||
|
((etaf--slot-input-p child)
|
||||||
|
(let ((copy (copy-sequence child)))
|
||||||
|
(setf (etaf--slot-input-children copy)
|
||||||
|
(mapcar #'etaf--normalize-structural-child
|
||||||
|
(etaf--slot-input-children child)))
|
||||||
|
copy))
|
||||||
|
(t child)))
|
||||||
|
|
||||||
(defun etaf--view-call (name props children &optional token)
|
(defun etaf--view-call (name props children &optional token)
|
||||||
"Construct NAME from PROPS and CHILDREN, retaining optional site TOKEN."
|
"Construct NAME from PROPS and CHILDREN, retaining optional site TOKEN."
|
||||||
(unless (symbolp name)
|
(unless (symbolp name)
|
||||||
(etaf--syntax-error "View name must be a symbol: %S" name))
|
(etaf--syntax-error "View name must be a symbol: %S" name))
|
||||||
(setq props (etaf--validate-property-plist props))
|
(setq props (etaf--validate-property-plist props))
|
||||||
(let ((entry (gethash name etaf--view-registry)))
|
(let* ((entry (gethash name etaf--view-registry))
|
||||||
|
(host-name (and (eq entry etaf--host-marker)
|
||||||
|
(etaf--canonical-host-name name)))
|
||||||
|
(children
|
||||||
|
(if (eq host-name 'text)
|
||||||
|
children
|
||||||
|
(mapcar #'etaf--normalize-structural-child children))))
|
||||||
(cond
|
(cond
|
||||||
((eq entry etaf--host-marker)
|
((eq entry etaf--host-marker)
|
||||||
(when (plist-member props :key)
|
(when (plist-member props :key)
|
||||||
(etaf--validate-key
|
(etaf--validate-key
|
||||||
(etaf--resolve-property-value (plist-get props :key))))
|
(etaf--resolve-property-value (plist-get props :key))))
|
||||||
(etaf--view-node-create
|
(etaf--view-node-create
|
||||||
:name (etaf--canonical-host-name name)
|
:name host-name
|
||||||
:token token
|
:token token
|
||||||
:props props
|
:props props
|
||||||
:children children))
|
:children children))
|
||||||
|
|||||||
@ -1271,6 +1271,30 @@
|
|||||||
(etaf-view
|
(etaf-view
|
||||||
(text (expr :value (list "A" "B"))))))))
|
(text (expr :value (list "A" "B"))))))))
|
||||||
|
|
||||||
|
(ert-deftest etaf-view-normalizes-box-string-child-to-text ()
|
||||||
|
"Normalize a static Box string child to one Text View."
|
||||||
|
(let* ((view (etaf-view (box "A")))
|
||||||
|
(child (car (etaf--view-node-children view))))
|
||||||
|
(should (etaf--view-node-p child))
|
||||||
|
(should (eq (etaf--view-node-name child) 'text))
|
||||||
|
(should (equal (etaf--view-node-children child) '("A")))))
|
||||||
|
|
||||||
|
(ert-deftest etaf-view-normalizes-root-string-to-text ()
|
||||||
|
"Normalize a static root string to one Text View."
|
||||||
|
(let ((view (etaf-view "A")))
|
||||||
|
(should (etaf--view-node-p view))
|
||||||
|
(should (eq (etaf--view-node-name view) 'text))
|
||||||
|
(should (equal (etaf--view-node-children view) '("A")))))
|
||||||
|
|
||||||
|
(ert-deftest etaf-view-normalizes-component-string-slot-to-text ()
|
||||||
|
"Normalize a static Component string child before slot ownership."
|
||||||
|
(let* ((call (etaf-view (etaf-test-slot-card :title "Card" "Body")))
|
||||||
|
(child (car (cdr (assq 'default
|
||||||
|
(etaf--component-call-slots call))))))
|
||||||
|
(should (etaf--view-node-p child))
|
||||||
|
(should (eq (etaf--view-node-name child) 'text))
|
||||||
|
(should (equal (etaf--view-node-children child) '("Body")))))
|
||||||
|
|
||||||
(ert-deftest etaf-view-expr-rejects-extra-properties ()
|
(ert-deftest etaf-view-expr-rejects-extra-properties ()
|
||||||
"Reject an expr property other than `:value'."
|
"Reject an expr property other than `:value'."
|
||||||
(should-error
|
(should-error
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user