|
|
|
@ -6,6 +6,7 @@
|
|
|
|
|
sugar/define
|
|
|
|
|
sugar/file
|
|
|
|
|
sugar/coerce
|
|
|
|
|
version/utils
|
|
|
|
|
"private/file-utils.rkt"
|
|
|
|
|
"cache.rkt"
|
|
|
|
|
"private/log.rkt"
|
|
|
|
@ -150,9 +151,11 @@
|
|
|
|
|
(message (format "rendering /~a"
|
|
|
|
|
(find-relative-path (current-project-root) source-path)))
|
|
|
|
|
(match-define-values ((cons render-result _) _ real _)
|
|
|
|
|
(parameterize ([current-poly-target (->symbol (or (get-ext output-path)
|
|
|
|
|
(parameterize ([current-directory (->complete-path (dirname source-path))]
|
|
|
|
|
[current-poly-target (->symbol (or (get-ext output-path)
|
|
|
|
|
(and template-path (get-ext template-path))
|
|
|
|
|
(current-poly-target)))])
|
|
|
|
|
(current-poly-target)))]
|
|
|
|
|
[current-render-source source-path])
|
|
|
|
|
(time-apply render-proc (list source-path template-path output-path))))
|
|
|
|
|
;; wait till last possible moment to store mod dates, because render-proc may also trigger its own subrenders
|
|
|
|
|
;; e.g., of a template.
|
|
|
|
@ -170,13 +173,14 @@
|
|
|
|
|
;; todo: add test to avoid copying if unnecessary (good idea in case the file is large)
|
|
|
|
|
(file->bytes source-path))
|
|
|
|
|
|
|
|
|
|
(define-namespace-anchor render-module-ns)
|
|
|
|
|
|
|
|
|
|
(define (render-scribble-source source-path . _)
|
|
|
|
|
;((complete-path?) #:rest any/c . ->* . string?)
|
|
|
|
|
(local-require scribble/core scribble/manual (prefix-in scribble- scribble/render))
|
|
|
|
|
(define source-dir (dirname source-path))
|
|
|
|
|
;; make fresh namespace for scribble rendering (avoids dep/zo caching)
|
|
|
|
|
(parameterize ([current-namespace (make-base-namespace)]
|
|
|
|
|
[current-directory (->complete-path source-dir)])
|
|
|
|
|
(parameterize ([current-namespace (make-base-namespace)])
|
|
|
|
|
(define outer-ns (namespace-anchor->namespace render-module-ns))
|
|
|
|
|
(namespace-attach-module outer-ns 'scribble/core)
|
|
|
|
|
(namespace-attach-module outer-ns 'scribble/manual)
|
|
|
|
@ -193,11 +197,7 @@
|
|
|
|
|
(delete-file (->output-path source-path))))
|
|
|
|
|
|
|
|
|
|
(define (render-preproc-source source-path . _)
|
|
|
|
|
(parameterize ([current-directory (->complete-path (dirname source-path))])
|
|
|
|
|
(render-datum-through-eval (syntax->datum
|
|
|
|
|
(with-syntax ([SOURCE-PATH source-path])
|
|
|
|
|
#'(begin (require pollen/cache)
|
|
|
|
|
(cached-doc SOURCE-PATH)))))))
|
|
|
|
|
(cached-doc (->string source-path)))
|
|
|
|
|
|
|
|
|
|
(define (render-markup-or-markdown-source source-path [maybe-template-path #f] [maybe-output-path #f])
|
|
|
|
|
(define output-path (or maybe-output-path (->output-path source-path)))
|
|
|
|
@ -207,36 +207,18 @@
|
|
|
|
|
(unless template-path
|
|
|
|
|
(raise-argument-error 'render-markup-or-markdown-source "valid template path" template-path))
|
|
|
|
|
(render-from-source-or-output-path template-path) ; because template might have its own preprocessor source
|
|
|
|
|
(define datum-to-eval
|
|
|
|
|
(syntax->datum
|
|
|
|
|
(with-syntax ([DIRECTORY-REQUIRE-FILES (require-directory-require-files source-path)]
|
|
|
|
|
[DOC-ID (setup:main-export source-path)]
|
|
|
|
|
[META-ID (setup:meta-export source-path)]
|
|
|
|
|
[SOURCE-PATH-STRING (path->string source-path)]
|
|
|
|
|
[CPR (current-project-root)]
|
|
|
|
|
[HERE-PATH-KEY (setup:here-path-key source-path)]
|
|
|
|
|
[COMMAND-CHAR (setup:command-char source-path)]
|
|
|
|
|
[TEMPLATE-PATH (->string template-path)])
|
|
|
|
|
(parameterize ([current-output-port (current-error-port)])
|
|
|
|
|
(eval (with-syntax ([MODNAME (gensym)]
|
|
|
|
|
[SOURCE-PATH-STRING (->string source-path)]
|
|
|
|
|
[TEMPLATE-PATH-STRING (->string template-path)]
|
|
|
|
|
[REQUIRE (if (version<? (version) "6.3") 'local-require 'require)])
|
|
|
|
|
#'(begin
|
|
|
|
|
(require (for-syntax racket/base)
|
|
|
|
|
pollen/private/external/include-template
|
|
|
|
|
pollen/cache
|
|
|
|
|
pollen/private/log
|
|
|
|
|
pollen/pagetree
|
|
|
|
|
pollen/core)
|
|
|
|
|
DIRECTORY-REQUIRE-FILES
|
|
|
|
|
(parameterize ([current-pagetree (make-project-pagetree CPR)]
|
|
|
|
|
[current-metas (cached-metas SOURCE-PATH-STRING)])
|
|
|
|
|
(local-require pollen/template pollen/top)
|
|
|
|
|
(define DOC-ID (cached-doc SOURCE-PATH-STRING))
|
|
|
|
|
(define META-ID (current-metas))
|
|
|
|
|
(define here (path->pagenode (or (select-from-metas 'HERE-PATH-KEY META-ID) 'unknown)))
|
|
|
|
|
(if (bytes? DOC-ID) ; if main export is binary, just pass it through
|
|
|
|
|
DOC-ID
|
|
|
|
|
(include-template #:command-char COMMAND-CHAR (file TEMPLATE-PATH))))))))
|
|
|
|
|
;; set current-directory because include-template wants to work relative to source location
|
|
|
|
|
(parameterize ([current-directory (->complete-path (dirname source-path))])
|
|
|
|
|
(render-datum-through-eval datum-to-eval)))
|
|
|
|
|
(module MODNAME pollen/private/render-helper
|
|
|
|
|
#:source SOURCE-PATH-STRING
|
|
|
|
|
#:template TEMPLATE-PATH-STRING
|
|
|
|
|
#:result-id result)
|
|
|
|
|
(REQUIRE 'MODNAME)
|
|
|
|
|
result)))))
|
|
|
|
|
|
|
|
|
|
(define (templated-source? path)
|
|
|
|
|
(or (markup-source? path) (markdown-source? path)))
|
|
|
|
@ -296,10 +278,3 @@
|
|
|
|
|
(check-false (get-template-for (->complete-path "foo.poly.pm")))
|
|
|
|
|
(check-equal? (get-template-for (->complete-path "foo.html.pm")) fallback.html)))
|
|
|
|
|
|
|
|
|
|
(define-namespace-anchor render-module-ns)
|
|
|
|
|
(define (render-datum-through-eval datum-to-eval)
|
|
|
|
|
;; render a datum, not a syntax object, so that it can have fresh bindings.
|
|
|
|
|
(parameterize ([current-namespace (make-base-namespace)]
|
|
|
|
|
[current-output-port (current-error-port)])
|
|
|
|
|
(namespace-attach-module (namespace-anchor->namespace render-module-ns) 'pollen/setup) ; brings in params
|
|
|
|
|
(eval datum-to-eval)))
|
|
|
|
|