diff --git a/lang/reader.rkt b/lang/reader.rkt index 752866e..cc850e8 100644 --- a/lang/reader.rkt +++ b/lang/reader.rkt @@ -1,18 +1,9 @@ #lang racket/base -(require (only-in scribble/reader make-at-reader)) -(provide (rename-out [pollen-read read] [pollen-read-syntax read-syntax]) read-inner) - -(define read-inner - (make-at-reader #:command-char #\◊ #:syntax? #t #:inside? #t)) +(require pollen/reader-base) -(define (pollen-read p) - (syntax->datum - (pollen-read-syntax (object-name p) p))) - -(define (make-output-datum i) - `(module pollen-lang-module pollen ,@i)) +(provide (rename-out [pollen-read read] [pollen-read-syntax read-syntax]) read-inner) -(define (pollen-read-syntax path-string p) - (define file-contents (read-inner path-string p)) - (datum->syntax file-contents `(module pollen-lang-module pollen ,@file-contents) file-contents)) +(define reader-mode 'auto) +(define pollen-read-syntax (make-pollen-read-syntax reader-mode)) +(define pollen-read (make-pollen-read pollen-read-syntax)) \ No newline at end of file diff --git a/main.rkt b/main.rkt index 00266b8..5600a25 100644 --- a/main.rkt +++ b/main.rkt @@ -6,8 +6,8 @@ (define-syntax-rule (new-module-begin body-exprs ...) (#%module-begin (module inner pollen/lang/doclang-raw - ;; first three lines are positional arguments for doclang-raw ;; doclang_raw is a version of scribble/doclang with the decoder disabled + ;; first three lines are positional arguments for doclang-raw main-raw ; id of export (λ(x) x) ; post-process function () ; prepended exprs @@ -51,19 +51,31 @@ (cons (meta 'here-path: inner-here-path) ;; cdr strips initial linebreak, but make sure main-raw isn't blank (if (and (list? main-raw) (> 0 (length main-raw))) (cdr main-raw) main-raw))))) + (define-values (main-without-metas metas) (split-metas-to-hash main-txexpr)) ;; set up the 'main export (require pollen/decode) - (define here-ext (car (regexp-match #px"\\w+$" inner-here-path))) - (define wants-decoder? (member here-ext (map to-string DECODABLE_EXTENSIONS))) + + ;; set the parser mode based on reader mode + (define parser-mode + (if (reader-mode . equal? . 'auto) + (let* ([file-ext-pattern (pregexp "\\w+$")] + [here-ext (car (regexp-match file-ext-pattern inner-here-path))]) + (cond + [(equal? here-ext (symbol->string PTREE_SOURCE_EXT)) 'ptree] + [(equal? here-ext (symbol->string DECODER_SOURCE_EXT)) 'markup] + [else 'pre])) + reader-mode)) + (define main (apply (cond - [(equal? here-ext "ptree") (λ xs (decode (cons PTREE_ROOT_NODE xs) - #:xexpr-elements-proc (λ(xs) (filter (compose1 not (def/c whitespace?)) xs))))] + [(equal? parser-mode 'ptree) + (λ xs (decode (cons PTREE_ROOT_NODE xs) + #:xexpr-elements-proc (λ(xs) (filter (compose1 not (def/c whitespace?)) xs))))] ;; 'root is the hook for the decoder function. ;; If it's not a defined identifier, it just hits #%top and becomes `(root ,@body ...) - [wants-decoder? root] + [(equal? parser-mode 'markup) root] ;; for preprocessor output, just make a string. [else (λ xs (apply string-append (map to-string xs)))]) (cdr main-without-metas))) ;; cdr strips placeholder-root tag @@ -75,6 +87,6 @@ ;; for output in DrRacket (module+ main - (if wants-decoder? - (print main) - (display main))))) + (if (equal? parser-mode 'pre) + (display main) + (print main))))) diff --git a/markup/lang/reader.rkt b/markup/lang/reader.rkt new file mode 100644 index 0000000..6cb5a72 --- /dev/null +++ b/markup/lang/reader.rkt @@ -0,0 +1,9 @@ +#lang racket/base + +(require pollen/reader-base) + +(provide (rename-out [pollen-read read] [pollen-read-syntax read-syntax]) read-inner) + +(define reader-mode 'markup) +(define pollen-read-syntax (make-pollen-read-syntax reader-mode)) +(define pollen-read (make-pollen-read pollen-read-syntax)) \ No newline at end of file diff --git a/pre/lang/reader.rkt b/pre/lang/reader.rkt new file mode 100644 index 0000000..297a869 --- /dev/null +++ b/pre/lang/reader.rkt @@ -0,0 +1,9 @@ +#lang racket/base + +(require pollen/reader-base) + +(provide (rename-out [pollen-read read] [pollen-read-syntax read-syntax]) read-inner) + +(define reader-mode 'pre) +(define pollen-read-syntax (make-pollen-read-syntax reader-mode)) +(define pollen-read (make-pollen-read pollen-read-syntax)) \ No newline at end of file diff --git a/ptree/lang/reader.rkt b/ptree/lang/reader.rkt new file mode 100644 index 0000000..cae1e5e --- /dev/null +++ b/ptree/lang/reader.rkt @@ -0,0 +1,9 @@ +#lang racket/base + +(require pollen/reader-base) + +(provide (rename-out [pollen-read read] [pollen-read-syntax read-syntax]) read-inner) + +(define reader-mode 'ptree) +(define pollen-read-syntax (make-pollen-read-syntax reader-mode)) +(define pollen-read (make-pollen-read pollen-read-syntax)) \ No newline at end of file diff --git a/reader-base.rkt b/reader-base.rkt new file mode 100644 index 0000000..382eee5 --- /dev/null +++ b/reader-base.rkt @@ -0,0 +1,22 @@ +#lang racket/base +(require (only-in scribble/reader make-at-reader) + pollen/world) + +(provide (all-defined-out)) + +(define read-inner + (make-at-reader #:command-char EXPRESSION_DELIMITER #:syntax? #t #:inside? #t)) + +(define (make-pollen-read pollen-read-syntax-proc) + (λ(p) + (syntax->datum + (pollen-read-syntax-proc (object-name p) p)))) + +(define (make-pollen-read-syntax reader-mode) + (λ (path-string p) + (define file-contents (read-inner path-string p)) + (datum->syntax file-contents + `(module pollen-lang-module pollen + (define reader-mode ',reader-mode) + ,@file-contents) + file-contents)))