main
Matthew Butterick 5 years ago
parent 97b48c4cc4
commit ab7a115e16

@ -92,7 +92,7 @@
(define (merge-adjacent-strings xs [isolate-white? #false])
(let loop ([xs xs][acc null])
(match xs
[(list) (reverse acc)]
[(== empty) (reverse acc)]
[(list (? string? strs) ..1 others ...)
(loop others (append (reverse ((if isolate-white?
merge-and-isolate-white
@ -107,18 +107,18 @@
(define (runify qx)
;; runify a quad by reducing it to a series of "runs",
;; which are multi-character quads with the same formatting.
(define first-key (gensym))
(define first-key (eq-hash-code (current-default-attrs)))
(define first-attrs (hash-copy (current-default-attrs)))
(hash-set! first-attrs 'idx first-key)
(dropf
(let loop ([x (if (string? qx) (q qx) qx)]
(let loop ([x (if (string? qx) (make-quad #f (list qx)) qx)]
[attrs first-attrs]
[key first-key])
(match x
[(? quad?) ;; qexprs with attributes are recursed
(define this-attrs (quad-attrs x))
(define elems (quad-elems x))
(define next-key (if (hash-empty? this-attrs) key (gensym)))
(define next-key (if (hash-empty? this-attrs) key (eq-hash-code this-attrs)))
(define next-attrs (if (hash-empty? this-attrs) attrs (attrs . update-with . this-attrs)))
(unless (hash-empty? this-attrs) (hash-set! next-attrs run-key next-key))
(append* (for/list ([elem (in-list (merge-adjacent-strings elems 'merge-white))])
@ -130,5 +130,9 @@
#;(module+ test
(check-equal?
(runify (qqa (hasheq 'foo 42) (qq "Hi" " idiot" (qqa (hasheq 'bar 84) "There") "Eve" "ry" "one")))
(list (qqa (hasheq 'foo 42) "Hi") (qqa (hasheq 'foo 42) " ") (qqa (hasheq 'foo 42) "idiot") (qqa (hasheq 'foo 42 'bar 84) "There") (qqa (hasheq 'foo 42) "Everyone"))))
(list (qqa (hasheq 'foo 42) "Hi")
(qqa (hasheq 'foo 42) " ")
(qqa (hasheq 'foo 42) "idiot")
(qqa (hasheq 'foo 42 'bar 84) "There")
(qqa (hasheq 'foo 42) "Everyone"))))

Loading…
Cancel
Save