(module text-render racket/base (require "core.ss" racket/class racket/port) (provide render-mixin) (define current-preserve-spaces (make-parameter #f)) (define current-indent (make-parameter 0)) (define (make-indent amt) (+ amt (current-indent))) (define (indent) (let ([i (current-indent)]) (unless (zero? i) (display (make-string i #\space))))) (define (indented-newline) (newline) (indent)) (define indent-pxs (make-hash)) (define (indent->paragraph-px amt) (or (hash-ref indent-pxs amt #f) (let ([px (pregexp (format "^ *(.{1,~a}(?paragraph-px (current-indent))]) (let loop ([indent? #f]) (cond [(or (regexp-try-match px i) (regexp-try-match #px"^ *(.+(? (lambda (m) (when indent? (indent)) (write-bytes (cadr m)) (newline) (loop #t))] [else (regexp-try-match "^ +" i) (let ([b (read-byte i)]) (unless (eof-object? b) (when indent? (indent)) (write-byte b) (copy-port i (current-output-port)) (newline)))]))) null)) (define/override (render-content i part ri) (if (and (element? i) (let ([s (element-style i)]) (or (eq? 'hspace s) (and (style? s) (eq? 'hspace (style-name s)))))) (parameterize ([current-preserve-spaces #t]) (super render-content i part ri)) (super render-content i part ri))) (define/override (render-other i part ht) (cond [(symbol? i) (display (case i [(mdash) "\U2014"] [(ndash) "\U2013"] [(ldquo) "\U201C"] [(rdquo) "\U201D"] [(rsquo) "\U2019"] [(lang) ">"] [(rang) "<"] [(rarr) "->"] [(nbsp) "\uA0"] [(prime) "'"] [(alpha) "\u03B1"] [(infin) "\u221E"] [else (error 'text-render "unknown element symbol: ~e" i)]))] [(string? i) (if (current-preserve-spaces) (display (regexp-replace* #rx" " i "\uA0")) (display i))] [else (write i)]) null) (super-new))))