;; Extension — document statistics. (st-bootstrap-classes!) (content/bootstrap!) (content-bootstrap-text!) (content-bootstrap-section!) ;; ── empty doc ── (define e (doc-empty "e")) (content-test "empty words" (content/word-count e) 0) (content-test "empty chars" (content/char-count e) 0) (content-test "empty blocks" (content/block-count e) 0) (content-test "empty reading" (content/reading-minutes e) 0) (content-test "empty stats" (content/stats e) {:blocks 0 :reading-minutes 0 :words 0 :chars 0}) ;; ── simple doc ── (define d (doc-append (doc-append (doc-empty "d") (mk-heading "h" 1 "Hello World")) (mk-text "p" "one two three"))) (content-test "word count" (content/word-count d) 5) (content-test "char count" (content/char-count d) (string-length "Hello World one two three")) (content-test "block count" (content/block-count d) 2) (content-test "reading rounds up" (content/reading-minutes d) 1) ;; ── reading time at 0 vs 1 word ── (content-test "one word one minute" (content/reading-minutes (doc-append (doc-empty "d") (mk-text "p" "hi"))) 1) ;; ── block count includes nested section children ── (define nested (doc-append (doc-empty "d") (mk-section "s" (list (mk-heading "nh" 1 "A") (mk-text "np" "b c"))))) (content-test "block count counts section + children" (content/block-count nested) 3) (content-test "word count descends into section" (content/word-count nested) 3) ;; ── deep nesting ── (define deep (doc-append (doc-empty "d") (mk-section "o" (list (mk-text "a" "x") (mk-section "i" (list (mk-text "b" "y z"))))))) (content-test "deep block count" (content/block-count deep) 4) (content-test "deep word count" (content/word-count deep) 3) ;; ── stats dict shape ── (define s (content/stats d)) (content-test "stats words" (get s :words) 5) (content-test "stats blocks" (get s :blocks) 2) (content-test "stats has reading" (get s :reading-minutes) 1)