#lang racket/base (require racket/contract racket/list racket/match) (require (planet mb/pollen/tools) (planet mb/pollen/decode) (planet mb/pollen/library/decode-tools)) (provide (all-defined-out)) (module+ test (require rackunit)) ;; register custom block tags (register-block-tag 'bloq) (register-block-tag 'fooble) ;; detect paragraphs ;; todo: unit tests (define/contract (xexpr-elements-proc elements) (xexpr-elements? . -> . xexpr-elements?) (let ([elements (prep-paragraph-flow elements)]) (if (ormap paragraph-break? elements) ; need this condition to prevent infinite recursion (map wrap-paragraph (splitf-at* elements paragraph-break?)) ; split into ¶¶ elements))) (define/contract (block-xexpr-proc bx) (tagged-xexpr? . -> . tagged-xexpr?) (wrap-hanging-quotes (nonbreaking-last-space bx))) (define (string-proc str) (string? . -> . string?) (typogrify str)) (define/contract (root . items) (() #:rest (listof xexpr-element?) . ->* . tagged-xexpr?) (decode (cons 'root-function items) ; #:exclude-xexpr-tags 'em ; #:xexpr-tag-proc [xexpr-tag-proc (λ(x)x)] ; #:xexpr-attr-proc [xexpr-attr-proc (λ(x)x)] #:xexpr-elements-proc xexpr-elements-proc #:block-xexpr-proc block-xexpr-proc ; #:inline-xexpr-proc [inline-xexpr-proc (λ(x)x)] #:string-proc string-proc)) (define foo "bar")