diff --git a/quad/quad/wrap.rkt b/quad/quad/wrap.rkt index c01a0943..70cddb81 100644 --- a/quad/quad/wrap.rkt +++ b/quad/quad/wrap.rkt @@ -21,13 +21,30 @@ (define (wrap qs [target-size-proc-arg (current-wrap-distance)] [debug #f] + ;; hard break: must wrap #:hard-break [hard-break-func (λ (x) #f)] + ;; soft break: can wrap #:soft-break [soft-break-func (λ (x) #f)] + ;; no break: must not wrap (exception to hard / soft predicates) #:no-break [no-break-func #f] + ;; size of potential wrap. + ;; simple: measure q and add it to last-dist + ;; sophisticated: process all wrap-qs and measure resulting #:distance [distance-func (λ (q last-dist wrap-qs) (+ last-dist (if (printable? q) (distance q) 0)))] + ;; called when wrap counter increments. + ;; perhaps should reset after paragraph breaks, etc. #:wrap-count [wrap-count (λ (idx q) (add1 idx))] - #:finish-wrap [finish-wrap-func (λ (xs q0 q idx) (list xs))]) + ;; starting value when wrap counter resets. + ;; could use an arbitrary data structure (then incremented with `wrap-count` + #:initial-wrap-count [initial-wrap-idx 1] + ;; called when wrap is done. + ;; takes as input list of qs in wrap, + ;; q0 that caused the previous wrap, or #f at beginning. + ;; q that caused this one, or #f at end. + ;; (q0 is not part of this wrap, but q is) + ;; idx is current wrap-count value. + #:finish-wrap [finish-wrap-func (λ (wrap-qs q0 q idx) (list wrap-qs))]) (define (hard-break? x) (and (hard-break-func x) (or (not no-break-func) (not (no-break-func x))))) (define (soft-break? x) (and (soft-break-func x) (or (not no-break-func) (not (no-break-func x))))) (define target-size-proc @@ -44,7 +61,7 @@ ;; for instance, a hyphen is `soft-break?` but shouldn't be trimmed. (finish-wrap-func (reverse (dropf qs nonprinting-at-end?)) previous-wrap-ender wrap-triggering-q wrap-idx)) (let loop ([wraps null] ; list of (list of quads) - [wrap-idx 1] ; wrap count (could be (length wraps) but we'd rather avoid `length`) + [wrap-idx initial-wrap-idx] ; wrap count (could be (length wraps) but we'd rather avoid `length`) [next-wrap-head null] ; list of quads ending in previous `soft-break?` or `hard-break?` [next-wrap-tail null] ; list of unbreakable quads [current-dist #false] ; #false (to indicate start) or integer