aboutsummaryrefslogtreecommitdiff
path: root/lib/cmark/wrappers/wrapper.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cmark/wrappers/wrapper.rkt')
-rw-r--r--lib/cmark/wrappers/wrapper.rkt208
1 files changed, 0 insertions, 208 deletions
diff --git a/lib/cmark/wrappers/wrapper.rkt b/lib/cmark/wrappers/wrapper.rkt
deleted file mode 100644
index 1ecce17..0000000
--- a/lib/cmark/wrappers/wrapper.rkt
+++ /dev/null
@@ -1,208 +0,0 @@
-#lang racket/base
-
-;; requires racket >= 5.3 because of submodules
-
-;; Lowlevel interface
-
-(module low-level racket/base
-
- (require ffi/unsafe ffi/unsafe/define)
-
- (provide (all-defined-out))
-
- (define-ffi-definer defcmark (ffi-lib "libcmark"))
-
- (define _cmark_node_type
- (_enum '(;; Error status
- none
- ;; Block
- document block-quote list item code-block
- html-block custom-block
- paragraph heading thematic-break
- ;; ?? first-block = document
- ;; ?? last-block = thematic-break
- ;; Inline
- text softbreak linebreak code html-inline custom-inline
- emph strong link image
- ;; ?? first-inline = text
- ;; ?? last-inline = image
- )))
- (define _cmark_list_type
- (_enum '(no_list bullet_list ordered_list)))
- (define _cmark_delim_type
- (_enum '(no_delim period_delim paren_delim)))
- (define _cmark_opts
- (_bitmask
- '(sourcepos = 2 ; include sourcepos attribute on block elements
- hardbreaks = 4 ; render `softbreak` elements as hard line breaks
- safe = 8 ; suppress raw HTML and unsafe links
- nobreaks = 16 ; render `softbreak` elements as spaces
- normalize = 256 ; legacy (no effect)
- validate-utf8 = 512 ; validate UTF-8 in the input
- smart = 1024 ; straight quotes to curly, ---/-- to em/en dashes
- )))
-
- (define-cpointer-type _node)
-
- (defcmark cmark_markdown_to_html
- (_fun [bs : _bytes] [_int = (bytes-length bs)] _cmark_opts
- -> [r : _bytes] -> (begin0 (bytes->string/utf-8 r) (free r))))
-
- (defcmark cmark_parse_document
- (_fun [bs : _bytes] [_int = (bytes-length bs)] _cmark_opts
- -> _node))
-
- (defcmark cmark_render_html
- (_fun _node _cmark_opts
- -> [r : _bytes] -> (begin0 (bytes->string/utf-8 r) (free r))))
-
- (defcmark cmark_node_new (_fun _cmark_node_type -> _node))
- (defcmark cmark_node_free (_fun _node -> _void))
-
- (defcmark cmark_node_next (_fun _node -> _node/null))
- (defcmark cmark_node_previous (_fun _node -> _node/null))
- (defcmark cmark_node_parent (_fun _node -> _node/null))
- (defcmark cmark_node_first_child (_fun _node -> _node/null))
- (defcmark cmark_node_last_child (_fun _node -> _node/null))
-
- (defcmark cmark_node_get_user_data (_fun _node -> _racket))
- (defcmark cmark_node_set_user_data (_fun _node _racket -> _bool))
- (defcmark cmark_node_get_type (_fun _node -> _cmark_node_type))
- (defcmark cmark_node_get_type_string (_fun _node -> _bytes))
- (defcmark cmark_node_get_literal (_fun _node -> _string))
- (defcmark cmark_node_set_literal (_fun _node _string -> _bool))
- (defcmark cmark_node_get_heading_level (_fun _node -> _int))
- (defcmark cmark_node_set_heading_level (_fun _node _int -> _bool))
- (defcmark cmark_node_get_list_type (_fun _node -> _cmark_list_type))
- (defcmark cmark_node_set_list_type (_fun _node _cmark_list_type -> _bool))
- (defcmark cmark_node_get_list_delim (_fun _node -> _cmark_delim_type))
- (defcmark cmark_node_set_list_delim (_fun _node _cmark_delim_type -> _bool))
- (defcmark cmark_node_get_list_start (_fun _node -> _int))
- (defcmark cmark_node_set_list_start (_fun _node _int -> _bool))
- (defcmark cmark_node_get_list_tight (_fun _node -> _bool))
- (defcmark cmark_node_set_list_tight (_fun _node _bool -> _bool))
- (defcmark cmark_node_get_fence_info (_fun _node -> _string))
- (defcmark cmark_node_set_fence_info (_fun _node _string -> _bool))
- (defcmark cmark_node_get_url (_fun _node -> _string))
- (defcmark cmark_node_set_url (_fun _node _string -> _bool))
- (defcmark cmark_node_get_title (_fun _node -> _string))
- (defcmark cmark_node_set_title (_fun _node _string -> _bool))
- (defcmark cmark_node_get_start_line (_fun _node -> _int))
- (defcmark cmark_node_get_start_column (_fun _node -> _int))
- (defcmark cmark_node_get_end_line (_fun _node -> _int))
- (defcmark cmark_node_get_end_column (_fun _node -> _int))
-
- (defcmark cmark_node_unlink (_fun _node -> _void))
- (defcmark cmark_node_insert_before (_fun _node _node -> _bool))
- (defcmark cmark_node_insert_after (_fun _node _node -> _bool))
- (defcmark cmark_node_prepend_child (_fun _node _node -> _bool))
- (defcmark cmark_node_append_child (_fun _node _node -> _bool))
- (defcmark cmark_consolidate_text_nodes (_fun _node -> _void))
-
- (defcmark cmark_version (_fun -> _int))
- (defcmark cmark_version_string (_fun -> _string))
-
- )
-
-;; Rackety interface
-
-(module high-level racket/base
-
- (require (submod ".." low-level) ffi/unsafe)
-
- (provide cmark-markdown-to-html)
- (define (cmark-markdown-to-html str [options '(normalize smart)])
- (cmark_markdown_to_html (if (bytes? str) str (string->bytes/utf-8 str))
- options))
-
- (require (for-syntax racket/base racket/syntax))
- (define-syntax (make-getter+setter stx)
- (syntax-case stx ()
- [(_ name) (with-syntax ([(getter setter)
- (map (λ(op) (format-id #'name "cmark_node_~a_~a"
- op #'name))
- '(get set))])
- #'(cons getter setter))]))
- (define-syntax-rule (define-getters+setters name [type field ...] ...)
- (define name (list (list 'type (make-getter+setter field) ...) ...)))
- (define-getters+setters getters+setters
- [heading heading_level] [code-block fence_info]
- [link url title] [image url title]
- [list list_type list_delim list_start list_tight])
-
- (provide cmark->sexpr)
- (define (cmark->sexpr node)
- (define text (cmark_node_get_literal node))
- (define type (cmark_node_get_type node))
- (define children
- (let loop ([node (cmark_node_first_child node)])
- (if (not node) '()
- (cons (cmark->sexpr node) (loop (cmark_node_next node))))))
- (define info
- (cond [(assq type getters+setters)
- => (λ(gss) (map (λ(gs) ((car gs) node)) (cdr gss)))]
- [else '()]))
- (define (assert-no what-not b)
- (when b (error 'cmark->sexpr "unexpected ~a in ~s" what-not type)))
- (cond [(memq type '(document paragraph heading block-quote list item
- emph strong link image))
- (assert-no 'text text)
- (list type info children)]
- [(memq type '(text code code-block html-block html-inline
- softbreak linebreak thematic-break))
- (assert-no 'children (pair? children))
- (list type info text)]
- [else (error 'cmark->sexpr "unknown type: ~s" type)]))
-
- (provide sexpr->cmark)
- (define (sexpr->cmark sexpr) ; assumes valid input, as generated by the above
- (define (loop sexpr)
- (define type (car sexpr))
- (define info (cadr sexpr))
- (define data (caddr sexpr))
- (define node (cmark_node_new type))
- (let ([gss (assq type getters+setters)])
- (when gss
- (unless (= (length (cdr gss)) (length info))
- (error 'sexpr->cmark "bad number of info values in ~s" sexpr))
- (for-each (λ(gs x) ((cdr gs) node x)) (cdr gss) info)))
- (cond [(string? data) (cmark_node_set_literal node data)]
- [(not data) (void)]
- [(list? data)
- (for ([child (in-list data)])
- (cmark_node_append_child node (sexpr->cmark child)))]
- [else (error 'sexpr->cmark "bad data in ~s" sexpr)])
- node)
- (define root (loop sexpr))
- (register-finalizer root cmark_node_free)
- root)
-
- ;; Registers a `cmark_node_free` finalizer
- (provide cmark-parse-document)
- (define (cmark-parse-document str [options '(normalize smart)])
- (define root (cmark_parse_document
- (if (bytes? str) str (string->bytes/utf-8 str))
- options))
- (register-finalizer root cmark_node_free)
- root)
-
- (provide cmark-render-html)
- (define (cmark-render-html root [options '(normalize smart)])
- (cmark_render_html root options)))
-
-#; ;; sample use
-(begin
- (require 'high-level racket/string)
- (cmark-render-html
- (cmark-parse-document
- (string-join '("foo"
- "==="
- ""
- "> blah"
- ">"
- "> blah *blah* `bar()` blah:"
- ">"
- "> function foo() {"
- "> bar();"
- "> }")
- "\n"))))