Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 16s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
80 lines
2.7 KiB
Plaintext
80 lines
2.7 KiB
Plaintext
;; Extension — document metadata (title/slug/tags) + Ghost title plumbing.
|
|
|
|
(st-bootstrap-classes!)
|
|
(content/bootstrap!)
|
|
|
|
(define d (doc-empty "post"))
|
|
|
|
;; ── defaults ──
|
|
(content-test "default title nil" (doc-title d) nil)
|
|
(content-test "default slug nil" (doc-slug d) nil)
|
|
(content-test "default tags empty" (doc-tags d) (list))
|
|
|
|
;; ── copy-on-write setters ──
|
|
(define d2 (doc-with-title d "Hello World"))
|
|
(content-test "with-title" (doc-title d2) "Hello World")
|
|
(content-test "with-title immutable" (doc-title d) nil)
|
|
(content-test "with-title keeps id" (doc-id d2) "post")
|
|
|
|
(define d3 (doc-with-slug (doc-with-title d "T") "my-slug"))
|
|
(content-test "with-slug" (doc-slug d3) "my-slug")
|
|
(content-test "title preserved with slug" (doc-title d3) "T")
|
|
|
|
(define d4 (doc-with-tags d (list "a" "b")))
|
|
(content-test "with-tags" (doc-tags d4) (list "a" "b"))
|
|
(content-test "add-tag" (doc-tags (doc-add-tag d4 "c")) (list "a" "b" "c"))
|
|
(content-test
|
|
"add-tag from empty"
|
|
(doc-tags (doc-add-tag d "x"))
|
|
(list "x"))
|
|
|
|
;; ── batch + dict ──
|
|
(define d5 (doc-with-meta d {:slug "s" :title "T" :tags (list "t1")}))
|
|
(content-test "with-meta title" (doc-title d5) "T")
|
|
(content-test "with-meta slug" (doc-slug d5) "s")
|
|
(content-test "with-meta tags" (doc-tags d5) (list "t1"))
|
|
(content-test
|
|
"with-meta partial leaves title"
|
|
(doc-title (doc-with-meta d {:slug "only"}))
|
|
nil)
|
|
(content-test "doc-meta dict" (doc-meta d5) {:slug "s" :id "post" :title "T" :tags (list "t1")})
|
|
|
|
;; ── constructor with metadata ──
|
|
(define d6 (doc-new-meta "p2" (list (mk-text "x" "hi")) {:title "Post 2"}))
|
|
(content-test "new-meta title" (doc-title d6) "Post 2")
|
|
(content-test "new-meta blocks" (doc-ids d6) (list "x"))
|
|
|
|
;; ── facade aliases ──
|
|
(content-test "content/title" (content/title d5) "T")
|
|
(content-test
|
|
"content/with-title"
|
|
(content/title (content/with-title d "Z"))
|
|
"Z")
|
|
(content-test "content/meta" (content/meta d5) (doc-meta d5))
|
|
|
|
;; ── metadata coexists with block ops ──
|
|
(define
|
|
d7
|
|
(doc-append
|
|
(doc-with-title (doc-empty "x") "Titled")
|
|
(mk-text "p" "body")))
|
|
(content-test "meta + blocks coexist" (doc-ids d7) (list "p"))
|
|
(content-test "meta survives append" (doc-title d7) "Titled")
|
|
(content-test
|
|
"meta survives edit"
|
|
(doc-title (doc-update d7 "p" "text" "changed"))
|
|
"Titled")
|
|
|
|
;; ── Ghost adapter now carries title ──
|
|
(define post {:sections (list {:id "h" :text "Hi" :kind "heading" :level 1}) :title "My Post"})
|
|
(define gd (content/import ghost-adapter post "post"))
|
|
(content-test "ghost import title" (doc-title gd) "My Post")
|
|
(content-test
|
|
"ghost export title"
|
|
(get (content/export ghost-adapter gd) :title)
|
|
"My Post")
|
|
(content-test
|
|
"ghost title round-trip"
|
|
(doc-title (content/round-trip ghost-adapter gd))
|
|
"My Post")
|