main
Matthew Butterick 2 years ago
parent ab900dc3b7
commit 4aac042157

@ -33,10 +33,10 @@
;; fill in a character grid ;; fill in a character grid
(define str (string-join (define str (string-join
(for/list ([y (in-range ymax)]) (for/list ([y (in-range ymax)])
(list->string (list->string
(map integer->char (map integer->char
(for/list ([x (in-range xmax)]) (for/list ([x (in-range xmax)])
(hash-ref char-pos-table (make-rectangular x y) (char->integer #\space)))))) "\n")) (hash-ref char-pos-table (make-rectangular x y) (char->integer #\space)))))) "\n"))
(set! results (cons str results))) (set! results (cons str results)))
(λ (str) (hash-set! char-pos-table current-loc str)) (λ (str) (hash-set! char-pos-table current-loc str))
void void
@ -117,27 +117,53 @@
(head (style ((type "text/css")) (head (style ((type "text/css"))
,(string-join ,(string-join
(for/list ([(ps fontsym) (in-hash fonts)]) (for/list ([(ps fontsym) (in-hash fonts)])
(format "@font-face { font-family: \"~a\";\nsrc: url(\"~a\");}" fontsym ps))))) (format "@font-face { font-family: \"~a\";\nsrc: url(\"~a\");}" fontsym ps)))))
(body ((style "background: #ddd")) (body ((style "background: #ddd"))
,@pages)))))))))) ,@pages))))))))))
(define-syntax (cond-eq stx)
(syntax-case stx (else)
[(MAC ARG [SYM . BODY] ... [else ELSEBODY])
#'(cond
[(eq? ARG SYM) . BODY] ...
[else ELSEBODY])]
[(MAC ARG CLAUSE ...)
#'(MAC ARG CLAUSE ... [else (void)])]))
(define (render inst-str #:using [renderer (current-renderer)]) (define (render inst-str #:using [renderer (current-renderer)])
(match-define ($renderer
doc-start-func
doc-end-func
page-start-func
page-end-func
text-func
set-font-func
move-func
return-func) renderer)
(let/ec exit (let/ec exit
(for/fold ([stack null] (for/fold ([stack null]
#:result (void)) #:result (void))
([tok (in-port read (open-input-string inst-str))]) ([tok (in-port read (open-input-string inst-str))])
(define next-stack (cons tok stack)) (cond-eq tok
(cond ['doc-start (doc-start-func) stack]
[(memq tok valid-tokens) ['doc-end (exit (doc-end-func)) (error 'should-never-reach)]
(match next-stack ['page-start
[(list* 'doc-start rest) (($renderer-doc-start-func renderer)) rest] (match-define (list* x y tail) stack)
[(list* 'doc-end _) (exit (($renderer-doc-end-func renderer)))] (page-start-func x y)
[(list* 'page-start x y rest) (($renderer-page-start-func renderer) x y) rest] tail]
[(list* 'page-end rest) (($renderer-page-end-func renderer)) rest] ['page-end (page-end-func) stack]
[(list* 'text charint rest) (($renderer-text-func renderer) charint) rest] ['text
[(list* 'set-font path-string rest) (($renderer-set-font-func renderer) (symbol->string path-string)) rest] (match-define (cons charint tail) stack)
[(list* 'move x y rest) (($renderer-move-func renderer) x y) rest] (text-func charint)
[_ next-stack])] tail]
[else next-stack]))) ['set-font
(($renderer-return-func renderer))) (match-define (cons path-string tail) stack)
(set-font-func (symbol->string path-string))
tail]
['move
(match-define (list* x y tail) stack)
(move-func x y)
tail]
[else (cons tok stack)])))
(return-func))

Loading…
Cancel
Save