Fix browser compat: sublist replaces 3-arg slice, manual sum replaces reduce

- Added sublist helper (portable list extraction, avoids 3-arg slice
  which fails in browser WASM kernel)
- Replaced reduce + 0 lwid with manual sum loop (reduce has browser
  compat issues with dict-set! error in call stack)
- Imperative DOM update via effect for clean paragraph re-rendering
  on signal changes (clear container, create new spans)
- String slice in hyphenate-word kept (works on strings)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 18:31:34 +00:00
parent 13f24e5f26
commit 1884c28763
6 changed files with 137 additions and 66 deletions

View File

@@ -1553,18 +1553,20 @@
cl-collect
(fn
(acc)
(let
((cmd (parse-cmd)))
(if
(nil? cmd)
acc
(let
((acc2 (append acc (list cmd))))
(cond
((match-kw "then") (cl-collect acc2))
((and (not (at-end?)) (= (tp-type) "keyword") (cmd-kw? (tp-val)))
(cl-collect acc2))
(true acc2)))))))
(do
(match-kw "then")
(let
((cmd (parse-cmd)))
(if
(nil? cmd)
acc
(let
((acc2 (append acc (list cmd))))
(cond
((match-kw "then") (cl-collect acc2))
((and (not (at-end?)) (= (tp-type) "keyword") (cmd-kw? (tp-val)))
(cl-collect acc2))
(true acc2))))))))
(let
((cmds (cl-collect (list))))
(cond

File diff suppressed because one or more lines are too long

View File

@@ -34,6 +34,21 @@
typeset
typeset-plain)
(begin
(define
sublist
(fn
(lst start end)
(let
loop
((i 0) (src lst) (acc (list)))
(cond
(>= i end)
(reverse acc)
(empty? src)
(reverse acc)
(>= i start)
(loop (+ i 1) (rest src) (cons (first src) acc))
:else (loop (+ i 1) (rest src) acc)))))
(define
measure-text
(fn
@@ -188,8 +203,8 @@
(end (nth range 1))
(y (+ y0 (* line-idx line-height))))
(let
((line-words (slice words start end))
(line-widths (slice widths start end)))
((line-words (sublist words start end))
(line-widths (sublist widths start end)))
(position-line line-words line-widths space-width x0 y))))
line-ranges)))
(define
@@ -221,10 +236,10 @@
(let
((start (first range)) (end (nth range 1)))
(let
((lw (slice words start end))
(lwid (slice widths start end)))
((lw (sublist words start end))
(lwid (sublist widths start end)))
(let
((total-w (reduce + 0 lwid))
((total-w (let sum-loop ((k 0) (t 0)) (if (>= k (len lwid)) t (sum-loop (+ k 1) (+ t (nth lwid k))))))
(n-gaps (max 1 (- (len lw) 1)))
(is-last (= line-idx (- n-lines 1))))
(let

File diff suppressed because one or more lines are too long