;; Extension — block query + table of contents. (st-bootstrap-classes!) (content/bootstrap!) (content-bootstrap-section!) (define d (doc-append (doc-append (doc-append (doc-append (doc-empty "d") (mk-heading "h1" 1 "Intro")) (mk-text "p1" "para")) (mk-image "img" "/a.png" "alt")) (mk-section "s" (list (mk-heading "h2" 2 "Sub") (mk-text "p2" "more") (mk-image "img2" "/b.png" "b"))))) ;; ── select-type (tree-wide) ── (content-test "select headings ids" (map (fn (b) (blk-id b)) (content/select-type d "heading")) (list "h1" "h2")) (content-test "select images ids" (map (fn (b) (blk-id b)) (content/select-type d "image")) (list "img" "img2")) (content-test "select text ids" (map (fn (b) (blk-id b)) (content/select-type d "text")) (list "p1" "p2")) (content-test "select section ids" (map (fn (b) (blk-id b)) (content/select-type d "section")) (list "s")) ;; ── count-type ── (content-test "count headings" (content/count-type d "heading") 2) (content-test "count images" (content/count-type d "image") 2) (content-test "count dividers" (content/count-type d "divider") 0) ;; ── select with custom predicate ── (content-test "select-ids custom" (content/select-ids d (fn (b) (= (blk-type b) "image"))) (list "img" "img2")) (content-test "select custom field" (map (fn (b) (blk-id b)) (content/select d (fn (b) (if (= (blk-type b) "heading") (= (blk-get b "level") 2) false)))) (list "h2")) ;; ── headings / TOC ── (content-test "headings TOC" (content/headings d) (list {:id "h1" :text "Intro" :level 1} {:id "h2" :text "Sub" :level 2})) (content-test "empty doc no headings" (content/headings (doc-empty "e")) (list)) ;; ── deeply nested ── (define deep (doc-append (doc-empty "d") (mk-section "o" (list (mk-section "i" (list (mk-heading "deep" 3 "Deep"))))))) (content-test "deep heading found" (map (fn (b) (blk-id b)) (content/select-type deep "heading")) (list "deep")) (content-test "deep toc level" (get (first (content/headings deep)) :level) 3)