From a4bff463b4854c0c0d1e702c439875756e1e647a Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 7 Jan 2017 16:30:43 -0800 Subject: [PATCH] allow `decode-linebreaks` to delete linebreaks --- pollen/decode.rkt | 4 ++-- pollen/private/ts.rktd | 2 +- pollen/scribblings/decode.scrbl | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pollen/decode.rkt b/pollen/decode.rkt index fd25c53..88eacb4 100644 --- a/pollen/decode.rkt +++ b/pollen/decode.rkt @@ -121,10 +121,9 @@ (memq (get-tag x) (setup:block-tags)) #t)) - (define+provide/contract (decode-linebreaks elems [maybe-linebreak-proc '(br)] #:separator [newline (setup:linebreak-separator)]) - ((txexpr-elements?) ((or/c txexpr-element? (txexpr-element? txexpr-element? . -> . txexpr-element?)) #:separator string?) . ->* . txexpr-elements?) + ((txexpr-elements?) ((or/c #f txexpr-element? (txexpr-element? txexpr-element? . -> . (or/c #f txexpr-element?))) #:separator string?) . ->* . txexpr-elements?) (define linebreak-proc (if (procedure? maybe-linebreak-proc) maybe-linebreak-proc (λ (e1 e2) maybe-linebreak-proc))) @@ -145,6 +144,7 @@ (module-test-external (check-equal? (decode-linebreaks '("foo" "\n" "bar")) '("foo" (br) "bar")) + (check-equal? (decode-linebreaks '("foo" "\n" "bar") #f) '("foo" "bar")) (check-equal? (decode-linebreaks '("\n" "foo" "\n" "bar" "\n")) '("\n" "foo" (br) "bar" "\n")) (check-equal? (decode-linebreaks '((p "foo") "\n" (p "bar"))) '((p "foo") (p "bar"))) (check-equal? (decode-linebreaks '("foo" "\n" (p "bar"))) '("foo" (p "bar"))) diff --git a/pollen/private/ts.rktd b/pollen/private/ts.rktd index 2d8b16d..5c1ae51 100644 --- a/pollen/private/ts.rktd +++ b/pollen/private/ts.rktd @@ -1 +1 @@ -1482013437 +1483835443 diff --git a/pollen/scribblings/decode.scrbl b/pollen/scribblings/decode.scrbl index 2446161..b487bdd 100644 --- a/pollen/scribblings/decode.scrbl +++ b/pollen/scribblings/decode.scrbl @@ -282,16 +282,17 @@ Within @racket[_elements], merge sequential newline characters into a single ele @defproc[ (decode-linebreaks [elements (listof xexpr?)] -[linebreaker (or/c xexpr? (xexpr? xexpr? . -> . xexpr?)) '(br)]) +[linebreaker (or/c #f xexpr? (xexpr? xexpr? . -> . (or/c #f xexpr?))) '(br)]) (listof xexpr?)] Within @racket[_elements], convert occurrences of the linebreak separator to @racket[_linebreaker], but only if the separator does not occur between blocks (see @racket[block-txexpr?]). Why? Because block-level elements automatically display on a new line, so adding @racket[_linebreaker] would be superfluous. In that case, the linebreak separator just disappears. The linebreak separator is controlled by @racket[setup:linebreak-separator], and defaults to @val[default-linebreak-separator]. -The @racket[_linebreaker] argument can either be an X-expression, or a function that takes two X-expressions and returns one. This function will receive the previous and next elements, to make contextual substitution possible. +The @racket[_linebreaker] argument can either be @racket[#f] (which will delete the linebreaks), an X-expression (which will replace the linebreaks), or a function that takes two X-expressions and returns one. This function will receive the previous and next elements, to make contextual substitution possible. @examples[#:eval my-eval (decode-linebreaks '(div "Two items:" "\n" (em "Eggs") "\n" (em "Bacon"))) +(decode-linebreaks '(div "Two items:" "\n" (em "Eggs") "\n" (em "Bacon")) #f) (decode-linebreaks '(div "Two items:" "\n" (div "Eggs") "\n" (div "Bacon"))) (decode-linebreaks '(div "Two items:" "\n" (em "Eggs") "\n" (em "Bacon")) (λ(prev next) (if (and (txexpr? prev) (member "Eggs" prev)) '(egg-br) '(br))))