From fd2818b8536c0da6ab9f806071e69448974ecdb9 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 6 Feb 2020 17:18:29 -0800 Subject: [PATCH] start named quads --- quad/quad/quad.rkt | 4 ++-- quad/quadwriter/layout.rkt | 1 + quad/quadwriter/param.rkt | 2 ++ quad/quadwriter/render.rkt | 11 ++++++++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/quad/quad/quad.rkt b/quad/quad/quad.rkt index 446e9e5f..870889ef 100644 --- a/quad/quad/quad.rkt +++ b/quad/quad/quad.rkt @@ -94,9 +94,9 @@ (define-syntax-rule (quad-copy QID [K V] ...) (struct-copy quad QID [K V] ...)) -(struct quad-attr (key default-val) #:transparent) +#;(struct quad-attr (key default-val) #:transparent) -(define (make-quad-attr key [default-val #f]) +#;(define (make-quad-attr key [default-val #f]) (quad-attr key default-val)) (define (quad-ref q key-arg [default-val-arg #f]) diff --git a/quad/quadwriter/layout.rkt b/quad/quadwriter/layout.rkt index 7a0520e4..d24e6c89 100644 --- a/quad/quadwriter/layout.rkt +++ b/quad/quadwriter/layout.rkt @@ -657,6 +657,7 @@ #:attrs attrs #:from-parent 'sw #:to 'nw + #:elems (or null (hash-ref (current-named-quads) "foo")) #:shift (pt 0 (* 1.5 default-line-height)) #:printable #true #:draw-start (λ (q doc) diff --git a/quad/quadwriter/param.rkt b/quad/quadwriter/param.rkt index 97dc973e..fd188bd2 100644 --- a/quad/quadwriter/param.rkt +++ b/quad/quadwriter/param.rkt @@ -11,6 +11,7 @@ (define current-pdf (make-parameter #false)) (define current-line-wrap (make-parameter #f)) ; because kp is slow and maybe we want to disable for "draft" mode (define section-pages-used (make-parameter 0)) + (define current-named-quads (make-parameter #false)) (define quadwriter-test-mode (make-parameter #f)) ; used during rackunit to suppress nondeterministic elements, like timestamp in header @@ -35,6 +36,7 @@ (define current-pdf (make-parameter #false)) (define current-line-wrap (make-parameter #f)) (define section-pages-used (make-parameter 0)) + (define current-named-quads (make-parameter #false)) (define quadwriter-test-mode (make-parameter #f)) diff --git a/quad/quadwriter/render.rkt b/quad/quadwriter/render.rkt index eb541ba1..cb5a6e73 100644 --- a/quad/quadwriter/render.rkt +++ b/quad/quadwriter/render.rkt @@ -135,6 +135,13 @@ ;; so if we invoke that style first, we will get a page break. (dropf qs break-quad?)) +(define (extract-defined-quads qs) + (define (get-define-val q) (quad-ref q 'define)) + (define-values (dqs not-dqs) (partition get-define-val qs)) + (for ([dq-group (in-list (group-by get-define-val dqs))]) + (hash-set! (current-named-quads) (get-define-val (car dq-group)) dq-group)) + not-dqs) + (define default-line-height-multiplier 1.42) (define (setup-qs qx-arg base-dir) ;; convert our input Q-expression into a useful form. @@ -164,6 +171,7 @@ [qs (time-log hyphenate (apply append (map handle-hyphenate qs)))] [qs (map generic->typed-quad qs)] [qs (drop-leading-breaks qs)] + [qs (extract-defined-quads qs)] [qs (insert-first-line-indents qs)]) qs)) @@ -388,7 +396,8 @@ ;; a lot of operations need to look at pages used so it's easier to ;; make it a parameter than endlessly pass it around as an argument. [section-pages-used 0] - [verbose-quad-printing? #false]) ; for ease of debugging; not mandatory + [verbose-quad-printing? #false] + [current-named-quads (make-hash)]) ; for ease of debugging; not mandatory (define qs (time-log setup-qs (setup-qs qx-arg base-dir))) (setup-pdf-metadata! qs (current-pdf)) ;; all the heavy lifting happens inside `make-sections`