|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
#lang debug racket
|
|
|
|
|
(require racket/contract racket/list racket/match txexpr sugar/debug sugar/define racket/function
|
|
|
|
|
"param.rkt" "quad.rkt" "position.rkt" "atomize.rkt")
|
|
|
|
|
(require racket/list racket/match sugar/debug
|
|
|
|
|
"param.rkt" "quad.rkt" "position.rkt")
|
|
|
|
|
|
|
|
|
|
(define-syntax (debug-report stx)
|
|
|
|
|
(syntax-case stx ()
|
|
|
|
@ -15,28 +15,16 @@
|
|
|
|
|
[(list ∆x ∆y) (sqrt (+ (* ∆x ∆x) (* ∆y ∆y)))])
|
|
|
|
|
0))
|
|
|
|
|
|
|
|
|
|
(define+provide/contract (break xs
|
|
|
|
|
[target-size (current-wrap-distance)]
|
|
|
|
|
[debug #f]
|
|
|
|
|
#:break-val [break-val 'break]
|
|
|
|
|
#:break-before? [break-before? #f]
|
|
|
|
|
#:break-after? [break-after? #f]
|
|
|
|
|
#:hard-break-proc [hard-break? (const #f)]
|
|
|
|
|
#:soft-break-proc [soft-break? (const #f)]
|
|
|
|
|
#:finish-wrap-proc [finish-wrap-proc values])
|
|
|
|
|
((any/c) (real? any/c
|
|
|
|
|
#:break-val any/c
|
|
|
|
|
#:break-before? boolean?
|
|
|
|
|
#:break-after? boolean?
|
|
|
|
|
#:hard-break-proc procedure?
|
|
|
|
|
#:soft-break-proc procedure?
|
|
|
|
|
#:finish-wrap-proc procedure?) . ->* . (listof any/c))
|
|
|
|
|
(provide break)
|
|
|
|
|
(define (break xs
|
|
|
|
|
[target-size (current-wrap-distance)]
|
|
|
|
|
[debug #f]
|
|
|
|
|
#:hard-break-proc [hard-break? (λ xs #f)]
|
|
|
|
|
#:soft-break-proc [soft-break? (λ xs #f)]
|
|
|
|
|
#:finish-wrap-proc [finish-wrap-proc list])
|
|
|
|
|
(break-hards xs
|
|
|
|
|
target-size
|
|
|
|
|
debug
|
|
|
|
|
break-val
|
|
|
|
|
break-before?
|
|
|
|
|
break-after?
|
|
|
|
|
hard-break?
|
|
|
|
|
soft-break?
|
|
|
|
|
finish-wrap-proc))
|
|
|
|
@ -46,34 +34,25 @@
|
|
|
|
|
(define (break-hards xs
|
|
|
|
|
target-size
|
|
|
|
|
debug
|
|
|
|
|
break-val
|
|
|
|
|
break-before?
|
|
|
|
|
break-after?
|
|
|
|
|
hard-break?
|
|
|
|
|
soft-break?
|
|
|
|
|
finish-wrap-proc)
|
|
|
|
|
(define break-val=? (if (symbol? break-val) eq? equal?))
|
|
|
|
|
(define (cleanup-wraplist xs)
|
|
|
|
|
;; combine the segments into a flat list, and drop any trailing breaks
|
|
|
|
|
;; (on the idea that breaks should separate things, and there's nothing left to separate)
|
|
|
|
|
(dropf-right (append* (reverse xs)) (λ (x) (break-val=? break-val x))))
|
|
|
|
|
(append* (reverse xs)))
|
|
|
|
|
(define wraps
|
|
|
|
|
(let loop ([wraps null][xs xs])
|
|
|
|
|
(match xs
|
|
|
|
|
[(? null?) wraps]
|
|
|
|
|
[(cons (? hard-break?) rest)
|
|
|
|
|
(debug-report x 'hard-break)
|
|
|
|
|
(loop (cons (list break-val) wraps) rest)]
|
|
|
|
|
(loop wraps rest)]
|
|
|
|
|
[_ (define-values (head tail) (splitf-at xs (λ (x) (not (hard-break? x)))))
|
|
|
|
|
(loop (cons (cleanup-wraplist (break-softs head
|
|
|
|
|
target-size
|
|
|
|
|
debug
|
|
|
|
|
break-val
|
|
|
|
|
soft-break?
|
|
|
|
|
finish-wrap-proc)) wraps) tail)])))
|
|
|
|
|
(append (if break-before? (list break-val) empty)
|
|
|
|
|
(cleanup-wraplist wraps)
|
|
|
|
|
(if break-after? (list break-val) empty)))
|
|
|
|
|
(cleanup-wraplist wraps))
|
|
|
|
|
|
|
|
|
|
(define (nonprinting-at-start? x) (if (quad? x) (not (printable? x 'start)) #t))
|
|
|
|
|
(define (nonprinting-at-end? x) (if (quad? x) (not (printable? x 'end)) #t))
|
|
|
|
@ -89,7 +68,6 @@
|
|
|
|
|
(define (break-softs qs
|
|
|
|
|
target-size
|
|
|
|
|
debug
|
|
|
|
|
break-val
|
|
|
|
|
soft-break?
|
|
|
|
|
finish-wrap-proc)
|
|
|
|
|
(for/fold ([wraps null] ; list of (list of quads)
|
|
|
|
@ -105,9 +83,9 @@
|
|
|
|
|
[(list (? nonprinting-at-end?)) wrap] ; matches break signals
|
|
|
|
|
;; pieces will have been accumulated in reverse order
|
|
|
|
|
;; thus beginning of list represents the end of the wrap
|
|
|
|
|
[(list (? (conjoin soft-break? nonprinting-at-end?)) ... rest ...)
|
|
|
|
|
[(list (and (? soft-break?) (? nonprinting-at-end?)) ... rest ...)
|
|
|
|
|
(finish-wrap-proc (reverse rest))])))
|
|
|
|
|
(add-between finished-wraps (list break-val))))
|
|
|
|
|
finished-wraps))
|
|
|
|
|
([i (in-naturals)]
|
|
|
|
|
#:break (empty? qs))
|
|
|
|
|
(match-define (cons q other-qs) qs)
|
|
|
|
@ -200,8 +178,8 @@
|
|
|
|
|
|
|
|
|
|
(define (linewrap xs size [debug #f])
|
|
|
|
|
(break xs size debug
|
|
|
|
|
#:break-val 'lb
|
|
|
|
|
#:hard-break-proc (λ (q) (and (quad? q) (memv (car (quad-elems q)) '(#\newline))))
|
|
|
|
|
#:finish-wrap-proc (λ (xs) (list (length xs)))
|
|
|
|
|
#:hard-break-proc (λ (q) (char=? (car (quad-elems q)) #\newline))
|
|
|
|
|
#:soft-break-proc soft-break?))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
@ -212,104 +190,107 @@
|
|
|
|
|
(test-case
|
|
|
|
|
"chars"
|
|
|
|
|
(check-equal? (linewrap (list) 1) null)
|
|
|
|
|
(check-equal? (linewrap (list a) 1) (list a))
|
|
|
|
|
(check-equal? (linewrap (list a b) 1) (list a 'lb b))
|
|
|
|
|
(check-equal? (linewrap (list a b c) 1) (list a 'lb b 'lb c))
|
|
|
|
|
(check-equal? (linewrap (list a b c) 2) (list a b 'lb c))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 2) (list x x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 3) (list x x x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 1) (list x 'lb x 'lb x 'lb x 'lb x))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 10) (list x x x x x))))
|
|
|
|
|
(check-equal? (linewrap (list a) 1) '(1))
|
|
|
|
|
(check-equal? (linewrap (list a b) 1) '(1 1))
|
|
|
|
|
(check-equal? (linewrap (list a b c) 1) '(1 1 1))
|
|
|
|
|
(check-equal? (linewrap (list a b c) 2) '(2 1))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 2) '(2 2))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 3) '(3 2))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 1) '(1 1 1 1 1))
|
|
|
|
|
(check-equal? (linewrap (list x x x x x) 10) '(5))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"chars and spaces"
|
|
|
|
|
(check-equal? (linewrap (list a sp b) 1) (list a 'lb b))
|
|
|
|
|
(check-equal? (linewrap (list a b sp c) 2) (list a b 'lb c))
|
|
|
|
|
(check-equal? (linewrap (list a sp b) 3) (list a sp b))
|
|
|
|
|
(check-equal? (linewrap (list a sp b c) 3) (list a 'lb b c))))
|
|
|
|
|
|
|
|
|
|
(check-equal? (linewrap (list a sp b) 1) '(1 1))
|
|
|
|
|
(check-equal? (linewrap (list a b sp c) 2) '(2 1))
|
|
|
|
|
(check-equal? (linewrap (list a sp b) 3) '(3))
|
|
|
|
|
(check-equal? (linewrap (list a sp b c) 3) '(1 2))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"leading & trailing spaces"
|
|
|
|
|
(check-equal? (linewrap (list sp x) 2) (list x))
|
|
|
|
|
(check-equal? (linewrap (list x sp) 2) (list x))
|
|
|
|
|
(check-equal? (linewrap (list sp x sp) 2) (list x))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x sp sp) 2) (list x))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x sp sp x sp) 1) (list x 'lb x))))
|
|
|
|
|
(check-equal? (linewrap (list sp x) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list x sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp x sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x sp sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x sp sp x sp) 1) '(1 1))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"hard hyphens"
|
|
|
|
|
(check-equal? (linewrap (list hyph) 1) (list hyph))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph) 1) (list hyph 'lb hyph))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph) 2) (list hyph hyph))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph hyph) 2) (list hyph hyph 'lb hyph))
|
|
|
|
|
(check-equal? (linewrap (list x hyph) 1) (list x 'lb hyph))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 1) (list a 'lb b 'lb hyph 'lb c 'lb d))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 2) (list a b 'lb hyph c 'lb d))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 3) (list a b hyph 'lb c d))
|
|
|
|
|
(check-equal? (linewrap (list x x hyph x x) 4) (list x x hyph 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x hyph x x) 5) (list x x hyph x x))))
|
|
|
|
|
(check-equal? (linewrap (list hyph) 1) '(1))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph) 1) '(1 1))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph) 2) '(2))
|
|
|
|
|
(check-equal? (linewrap (list hyph hyph hyph) 2) '(2 1))
|
|
|
|
|
(check-equal? (linewrap (list x hyph) 1) '(1 1))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 1) '(1 1 1 1 1))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 2) '(2 2 1))
|
|
|
|
|
(check-equal? (linewrap (list a b hyph c d) 3) '(3 2))
|
|
|
|
|
(check-equal? (linewrap (list x x hyph x x) 4) '(3 2))
|
|
|
|
|
(check-equal? (linewrap (list x x hyph x x) 5) '(5))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"soft hyphens"
|
|
|
|
|
(check-equal? (linewrap (list shy) 1) (list))
|
|
|
|
|
(check-equal? (linewrap (list shy shy) 2) (list))
|
|
|
|
|
(check-equal? (linewrap (list shy shy shy) 2) (list))
|
|
|
|
|
(check-equal? (linewrap (list x shy) 1) (list x))
|
|
|
|
|
(check-equal? (linewrap (list x shy shy shy shy) 1) (list x))
|
|
|
|
|
(check-equal? (linewrap (list shy) 1) '(0))
|
|
|
|
|
(check-equal? (linewrap (list shy shy) 2) '(0))
|
|
|
|
|
(check-equal? (linewrap (list shy shy shy) 2) '(0))
|
|
|
|
|
(check-equal? (linewrap (list x shy) 1) '(1))
|
|
|
|
|
(check-equal? (linewrap (list x shy shy shy shy) 1) '(1))
|
|
|
|
|
;; todo: degenerate cases that don't work without continuations
|
|
|
|
|
;(check-equal? (linewrap (list x x shy x x) 1) (list x 'lb x 'lb x 'lb x))
|
|
|
|
|
;(check-equal? (linewrap (list x x shy x x) 2) (list x x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 3) (list x x shy 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 4) (list x x x x))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 5) (list x x x x))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x sp x) 4) (list x x x 'lb x))))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 3) '(3 2))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 4) '(4))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x x) 5) '(4))
|
|
|
|
|
(check-equal? (linewrap (list x x shy x sp x) 4) '(3 1))))
|
|
|
|
|
|
|
|
|
|
#|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"zero width nonbreakers"
|
|
|
|
|
(check-equal? (linewrap (list sp zwx) 2) (list zwx))
|
|
|
|
|
(check-equal? (linewrap (list zwx sp) 2) (list zwx))
|
|
|
|
|
(check-equal? (linewrap (list sp zwx sp) 2) (list zwx))
|
|
|
|
|
(check-equal? (linewrap (list sp sp zwx sp sp) 2) (list zwx))
|
|
|
|
|
(check-equal? (linewrap (list sp sp zwx sp sp zwx sp) 2) (list zwx sp sp zwx))))
|
|
|
|
|
;; todo: fix
|
|
|
|
|
(check-equal? (linewrap (list sp zwx) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list zwx sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp zwx sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp sp zwx sp sp) 2) '(1))
|
|
|
|
|
(check-equal? (linewrap (list sp sp zwx sp sp zwx sp) 2) '(4))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"hard breaks"
|
|
|
|
|
(check-equal? (linewrap (list br) 2) (list)) ;; only insert a break if it's between things
|
|
|
|
|
(check-equal? (linewrap (list a br b) 2) (list a 'lb b))
|
|
|
|
|
(check-equal? (linewrap (list a b br) 2) (list a b))
|
|
|
|
|
(check-equal? (linewrap (list a b br br) 2) (list a b))
|
|
|
|
|
(check-equal? (linewrap (list x br x x) 3) (list x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x br x) 3) (list x x 'lb x))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 3) (list x x x 'lb x))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 2) (list x x 'lb x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 3) (list x x x 'lb x x))))
|
|
|
|
|
(check-equal? (linewrap (list a br b) 2) (list (list a) (list b)))
|
|
|
|
|
(check-equal? (linewrap (list a b br) 2) (list (list a b)))
|
|
|
|
|
(check-equal? (linewrap (list a b br br) 2) (list (list a b)))
|
|
|
|
|
(check-equal? (linewrap (list x br x x) 3) (list (list x) (list x x)))
|
|
|
|
|
(check-equal? (linewrap (list x x br x) 3) (list (list x x) (list x)))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 3) (list (list x x x) (list x)))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 2) (list (list x x) (list x) (list x x)))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 3) (list (list x x x) (list x x)))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"hard breaks and spurious spaces"
|
|
|
|
|
(check-equal? (linewrap (list a sp sp sp br b) 2) (list a 'lb b))
|
|
|
|
|
(check-equal? (linewrap (list x sp br sp sp x x sp) 3) (list x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x x sp sp br sp sp sp x) 3) (list x x 'lb x))
|
|
|
|
|
(check-equal? (linewrap (list a sp b sp sp br sp c) 3) (list a sp b 'lb c))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 3) (list x x x 'lb x))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 2) (list x x 'lb x 'lb x x))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 3) (list x x x 'lb x x))))
|
|
|
|
|
(check-equal? (linewrap (list a sp sp sp br b) 2) (list (list a) (list b)))
|
|
|
|
|
(check-equal? (linewrap (list x sp br sp sp x x sp) 3) (list (list x) (list x x)))
|
|
|
|
|
(check-equal? (linewrap (list sp sp x x sp sp br sp sp sp x) 3) (list (list x x) (list x)))
|
|
|
|
|
(check-equal? (linewrap (list a sp b sp sp br sp c) 3) (list (list a sp b) (list c)))
|
|
|
|
|
(check-equal? (linewrap (list x x x x) 3) (list (list x x x) (list x)))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 2) (list (list x x) (list x) (list x x)))
|
|
|
|
|
(check-equal? (linewrap (list x x x sp x x) 3) (list (list x x x) (list x x)))))
|
|
|
|
|
|
|
|
|
|
(define (visual-wrap str int [debug #f])
|
|
|
|
|
(apply string
|
|
|
|
|
(for/list ([b (in-list (linewrap (for/list ([atom (atomize str)])
|
|
|
|
|
(if (equal? (quad-elems atom) '(#\space))
|
|
|
|
|
(struct-copy quad sp)
|
|
|
|
|
(struct-copy quad q-one
|
|
|
|
|
[attrs (quad-attrs atom)]
|
|
|
|
|
[elems (quad-elems atom)]))) int debug))])
|
|
|
|
|
(if (quad? b) (car (quad-elems b)) #\|))))
|
|
|
|
|
(string-join
|
|
|
|
|
(for/list ([qs (in-list (linewrap (for/list ([atom (atomize str)])
|
|
|
|
|
(if (equal? (quad-elems atom) '(#\space))
|
|
|
|
|
(struct-copy quad sp)
|
|
|
|
|
(struct-copy quad q-one
|
|
|
|
|
[attrs (quad-attrs atom)]
|
|
|
|
|
[elems (quad-elems atom)]))) int debug))])
|
|
|
|
|
(list->string (map (λ (q) (car (quad-elems q))) qs))) "|"))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
@ -333,8 +314,6 @@
|
|
|
|
|
|
|
|
|
|
(define (pagewrap xs size [debug #f])
|
|
|
|
|
(break xs size debug
|
|
|
|
|
#:break-val 'pb
|
|
|
|
|
#:break-before? #t
|
|
|
|
|
#:hard-break-proc (λ (x) (and (quad? x) (memv (car (quad-elems x)) '(#\page))))
|
|
|
|
|
#:soft-break-proc (λ (x) (eq? x 'lb))))
|
|
|
|
|
(define pbr (q #:size #false #:elems '(#\page)))
|
|
|
|
@ -343,32 +322,36 @@
|
|
|
|
|
(require rackunit)
|
|
|
|
|
(test-case
|
|
|
|
|
"soft page breaks"
|
|
|
|
|
(check-equal? (pagewrap null 2) '(pb))
|
|
|
|
|
(check-equal? (pagewrap (list x) 2) (list 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (list x x) 2) (list 'pb x x))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 1) (list 'pb x 'pb x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 2) (list 'pb x x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 3) (list 'pb x x x))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 4) (list 'pb x x x))
|
|
|
|
|
(check-equal? (pagewrap (list x 'lb x x) 2) (list 'pb x 'pb x x))))
|
|
|
|
|
(check-equal? (pagewrap null 2) (list))
|
|
|
|
|
(check-equal? (pagewrap (list x) 2) (list (list x)))
|
|
|
|
|
(check-equal? (pagewrap (list x x) 2) (list (list x x)))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 1) (list (list x) (list x) (list x)))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 2) (list (list x x) (list x)))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 3) (list (list x x x)))
|
|
|
|
|
(check-equal? (pagewrap (list x x x) 4) (list (list x x x)))
|
|
|
|
|
(check-equal? (pagewrap (list x 'lb x x) 2) (list (list x) (list x x)))))
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"hard page breaks"
|
|
|
|
|
(check-equal? (pagewrap (list x pbr x x) 2) (list 'pb x 'pb x x))
|
|
|
|
|
(check-equal? (pagewrap (list x pbr x x) 1) (list 'pb x 'pb x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (list x pbr pbr x x) 1) (list 'pb x 'pb 'pb x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (list x pbr pbr x x) 2) (list 'pb x 'pb 'pb x x))
|
|
|
|
|
(check-equal? (pagewrap (list 'lb x 'lb 'lb pbr 'lb x x 'lb) 2) (list 'pb x 'pb x x))))
|
|
|
|
|
(check-equal? (pagewrap (list x pbr x x) 2) (list (list x) (list x x)))
|
|
|
|
|
(check-equal? (pagewrap (list x pbr x x) 1) (list (list x) (list x) (list x)))
|
|
|
|
|
; todo: fix double breaks
|
|
|
|
|
#;(check-equal? (pagewrap (list x pbr pbr x x) 1) (list (list x) (list) (list x) (list x)))
|
|
|
|
|
#;(check-equal? (pagewrap (list x pbr pbr x x) 2) (list (list x) (list) (list x x)))
|
|
|
|
|
(check-equal? (pagewrap (list 'lb x 'lb 'lb pbr 'lb x x 'lb) 2) (list (list x) (list x x)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
|
(test-case
|
|
|
|
|
"composed line breaks and page breaks"
|
|
|
|
|
(check-equal? (pagewrap (linewrap null 1) 2) '(pb) )
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x) 1) 2) (list 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 1) 2) (list 'pb x 'lb x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 2) 2) (list 'pb x x 'pb x))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 2) 1) (list 'pb x 'pb x 'pb x))))
|
|
|
|
|
; todo: fix empty test
|
|
|
|
|
#;(check-equal? (pagewrap (linewrap null 1) 2) (list (list (list))))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x) 1) 2) (list (list (list x))))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 1) 2) (list (list (list x) (list x)) (list (list x))))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 2) 2) (list (list (list x x)) (list (list x))))
|
|
|
|
|
(check-equal? (pagewrap (linewrap (list x x x) 2) 1) (list (list (list x)) (list (list x)) (list (list x))))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(define (slug . xs) (q #:attrs (hasheq) #:elems xs))
|
|
|
|
|
(define (linewrap2 xs size [debug #f])
|
|
|
|
@ -389,3 +372,4 @@
|
|
|
|
|
(check-equal? (linewrap2 (list x x x sp x x) 2) (list (slug x x) 'lb (slug x) 'lb (slug x x)))
|
|
|
|
|
(check-equal? (linewrap2 (list x x x sp x x) 3) (list (slug x x x) 'lb (slug x x)))))
|
|
|
|
|
|
|
|
|
|
|#
|