From 5ac93d08ff6a902eebfea0cf55716bbe6da42e67 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 20 May 2014 11:17:35 -0700 Subject: [PATCH] experimental support for MathJax --- convert.rkt | 16 ++++++++++------ math.rkt | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 math.rkt diff --git a/convert.rkt b/convert.rkt index b103fe3..ba7dd8a 100644 --- a/convert.rkt +++ b/convert.rkt @@ -20,9 +20,8 @@ [else x]))) -(define/contract+provide (html->pollen html-string #:p-breaks [p-breaks #f]) - ((string?) (#:p-breaks boolean?) . ->* . string?) - +(define/contract+provide (html->xexpr html-string) + (string? . -> . xexpr?) (use-html-spec #f) (define xexpr-results (let loop ([elem (read-html-as-xml (open-input-string html-string))]) @@ -33,9 +32,14 @@ [(struct element (start stop name attributes content)) `(,name ,(map loop attributes) ,@(map loop content))] [(list elements ...) (map loop elements)] [else (format "unknown item: ~a" elem)]))) - + ; xexpr-results will be a list with whitespace elements, so strip those out - (xexpr->pollen #:p-breaks p-breaks (car (filter-not (λ(x) (and (string? x) (regexp-match #px"\\s+" x))) xexpr-results)))) + (car (filter-not (λ(x) (and (string? x) (regexp-match #px"\\s+" x))) xexpr-results))) + + +(define/contract+provide (html->pollen html-string #:p-breaks [p-breaks #f]) + ((string?) (#:p-breaks boolean?) . ->* . string?) + (xexpr->pollen #:p-breaks p-breaks (html->xexpr html-string))) (define/contract+provide (url->pollen url-or-string #:p-breaks [p-breaks #f]) @@ -50,4 +54,4 @@ ; (xexpr->pollen '(p ((class "foo")) "You are" "\n\n" "puppy")) ; (xexpr->pollen '(p ((class "foo")) "You are " (em "so") " puppy")) ; (display (html->pollen #:p-breaks #t (file->string "index.html")))) - ) \ No newline at end of file +) \ No newline at end of file diff --git a/math.rkt b/math.rkt new file mode 100644 index 0000000..3247bde --- /dev/null +++ b/math.rkt @@ -0,0 +1,34 @@ +#lang racket/base +(require pollen/convert) + +(provide $ $$) + +(define mathjax-config #< + MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); + +HTML + ) + +(define mathjax-library #< + +HTML + ) + +(define first-run #t) + +(define (mathjax-wrapper #:delimiter delimiter xs) + `(mathjax + ,@(if first-run ; only need mathjax-config & mathjax-library once on the page + (begin (set! first-run #f) (map html->xexpr (list mathjax-config mathjax-library))) + null) + ,(apply string-append `(,delimiter ,@xs ,delimiter)))) + +(define ($ . x) + (mathjax-wrapper #:delimiter "$" x)) + + +(define ($$ . x) + (mathjax-wrapper #:delimiter "$$" x))