From 35cee26d69e18f319586d59d744a9147de9d38a2 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 20 Aug 2013 17:40:31 -0700 Subject: [PATCH] working on regenerate --- command.rkt | 6 ++--- pmap.rkt | 11 ++++----- pollen-file-tools.rkt | 15 ++++++++++-- regenerate.rkt | 55 +++++++++++++------------------------------ world.rkt | 5 ++-- 5 files changed, 40 insertions(+), 52 deletions(-) diff --git a/command.rkt b/command.rkt index ebd7d37..196ba3f 100644 --- a/command.rkt +++ b/command.rkt @@ -9,9 +9,9 @@ (case arg [("serve") `(require "server.rkt")] [("regenerate") `(begin - (displayln "Regenerate all...") - (require "regenerate.rkt") - (regenerate-all-files))] + (displayln "Regenerate preproc & pmap files ...") + (require "regenerate.rkt" "pollen-file-tools.rkt") + (map regenerate (append-map project-files-with-ext (list POLLEN_PREPROC_EXT POLLEN_MAP_EXT))))] [("clone") (let ([target-path (if (> (len args) 1) (->path (get args 1)) diff --git a/pmap.rkt b/pmap.rkt index e868315..3cff8fe 100644 --- a/pmap.rkt +++ b/pmap.rkt @@ -7,7 +7,7 @@ (provide (all-defined-out)) ; get the values out of the file, or make them up -(define pmap-file (build-path START_DIR DEFAULT_MAP)) +(define pmap-file (build-path START_DIR DEFAULT_POLLEN_MAP)) (define pmap-main empty) @@ -35,12 +35,12 @@ ;; xexpr with tag as name, parent as attr, children as elements with tag as next parent (make-tagged-xexpr tag attr (map (λ(c) (add-parents c tag)) children)))] ;; single map entry: convert to xexpr with parent - [else (make-tagged-xexpr (->symbol x) (make-xexpr-attr 'parent (->string parent)))])) + [else (make-tagged-xexpr (->symbol x) (make-xexpr-attr POLLEN_MAP_PARENT_KEY (->string parent)))])) (module+ test (define test-pmap-main `(pmap-main "foo" "bar" (one (two "three")))) (check-equal? (main->pmap test-pmap-main) - '(pmap-main ((parent "")) (foo ((parent "pmap-main"))) (bar ((parent "pmap-main"))) (one ((parent "pmap-main")) (two ((parent "one")) (three ((parent "two")))))))) + `(pmap-main ((,POLLEN_MAP_PARENT_KEY "")) (foo ((,POLLEN_MAP_PARENT_KEY "pmap-main"))) (bar ((,POLLEN_MAP_PARENT_KEY "pmap-main"))) (one ((,POLLEN_MAP_PARENT_KEY "pmap-main")) (two ((,POLLEN_MAP_PARENT_KEY "one")) (three ((,POLLEN_MAP_PARENT_KEY "two")))))))) @@ -62,15 +62,14 @@ (module+ test (check-equal? (remove-parents - '(pmap-main ((parent "")) (foo ((parent ""))) (bar ((parent ""))) - (one ((parent "")) (two ((parent "one")) (three ((parent "two"))))))) + `(pmap-main ((,POLLEN_MAP_PARENT_KEY "")) (foo ((,POLLEN_MAP_PARENT_KEY ""))) (bar ((,POLLEN_MAP_PARENT_KEY ""))) (one ((,POLLEN_MAP_PARENT_KEY "")) (two ((,POLLEN_MAP_PARENT_KEY "one")) (three ((,POLLEN_MAP_PARENT_KEY "two"))))))) '(pmap-main (foo) (bar) (one (two (three)))))) (module+ test (let ([sample-main `(pmap-root "foo" "bar" (one (two "three")))]) (check-equal? (main->pmap sample-main) - '(pmap-root ((parent "")) (foo ((parent "pmap-root"))) (bar ((parent "pmap-root"))) (one ((parent "pmap-root")) (two ((parent "one")) (three ((parent "two"))))))))) + `(pmap-root ((,POLLEN_MAP_PARENT_KEY "")) (foo ((,POLLEN_MAP_PARENT_KEY "pmap-root"))) (bar ((,POLLEN_MAP_PARENT_KEY "pmap-root"))) (one ((,POLLEN_MAP_PARENT_KEY "pmap-root")) (two ((,POLLEN_MAP_PARENT_KEY "one")) (three ((,POLLEN_MAP_PARENT_KEY "two"))))))))) diff --git a/pollen-file-tools.rkt b/pollen-file-tools.rkt index a55792b..5218a41 100644 --- a/pollen-file-tools.rkt +++ b/pollen-file-tools.rkt @@ -7,6 +7,10 @@ (module+ test (require rackunit)) + +; helper functions for regenerate functions +(define pollen-file-root (current-directory)) + ;; does path have a certain extension (define/contract (has-ext? path ext) (path? symbol? . -> . boolean?) @@ -75,14 +79,15 @@ (check-not-equal? (remove-all-ext foo.bar.txt-path) foo.bar-path) ; removes more than one ext (check-equal? (remove-all-ext foo.bar.txt-path) foo-path)) +;; superfluous: use file-name-from-path in racket/path -(define/contract (filename-of path) +#|(define/contract (filename-of path) (complete-path? . -> . path?) (define-values (dir filename ignored) (split-path path)) filename) (module+ test - (check-equal? (filename-of (build-path (current-directory) "pollen-file-tools.rkt")) (->path "pollen-file-tools.rkt"))) + (check-equal? (filename-of (build-path (current-directory) "pollen-file-tools.rkt")) (->path "pollen-file-tools.rkt")))|# (define/contract (preproc-source? x) @@ -129,3 +134,9 @@ (define/contract (make-pollen-source-path thing) (path? . -> . path?) (add-ext (remove-ext (->path thing)) POLLEN_SOURCE_EXT)) + +(define/contract (project-files-with-ext ext) + (symbol? . -> . (listof complete-path?)) + (filter (λ(i) (has-ext? i ext)) (directory-list pollen-file-root))) + +;; todo: write tests for project-files-with-ext diff --git a/regenerate.rkt b/regenerate.rkt index 8c40f71..287b0fb 100644 --- a/regenerate.rkt +++ b/regenerate.rkt @@ -69,60 +69,37 @@ ; helper functions for regenerate functions -(define pollen-file-root (current-directory)) +;(define pollen-file-root (current-directory)) ; complete pollen path = ;(build-path pollen-file-root f) -;; regenerate with message -(define/contract (regenerate-path/message path) - (complete-path? . -> . void?) - (message "Regenerating: " path) - (regenerate path)) +;; regenerate files listed in a pmap file +(define/contract (regenerate-with-pmap pmap) + (pmap? . -> . void?) + (for-each regenerate (all-pages pmap))) ;; todo: write test -;;;;;;;;;;;;; -;; todo next -(define/contract (regenerate-with-pmap/message pmap) - (pmap-source? . -> . void?) - (message "Regenerating pages from pollen map: " (filename-of pmap)) - (for-each regenerate-path/message - (all-pages (dynamic-require pmap 'main)))) - -(define (get-pollen-files-with-ext ext) - (filter (λ(f) (has-ext? f ext)) (directory-list pollen-file-root))) - -; burn all files -(define (regenerate-all-files) - (reset-mod-dates) - - (define all-preproc-files (get-pollen-files-with-ext POLLEN_PREPROC_EXT)) - (for-each regenerate-path/message all-preproc-files) - - (define all-pollen-maps (get-pollen-files-with-ext POLLEN_MAP_EXT)) - (for-each regenerate-with-pmap/message all-pollen-maps) - - (displayln "Completed")) - - - -(define (regenerate path #:force [force #f]) - ; dispatches path-in to the right place - - +;; dispatches path to the right place +(define/contract (regenerate path #:force [force #f]) + (path? . -> . void?) + (regenerating-message path) (let ([path (->complete-path path)]) (cond + [(pmap-source? path) (let ([pmap (dynamic-require path 'main)]) + (regenerate-with-pmap pmap))] [(needs-preproc? path) (do-preproc path #:force force)] - [(needs-template? path) (do-template path #:force force)] - [(pmap-source? path) (regenerate-with-pmap/message path)]))) + [(needs-template? path) (do-template path #:force force)]))) + +;; todo: write test -(define (regenerate-message path) - (message "Regenerated:" (->string (file-name-from-path path)))) +(define (regenerating-message path) + (message "Regenerating:" (->string (file-name-from-path path)))) (define (do-preproc path #:force [force #f]) ; set up preproc-in-path & preproc-out-path values diff --git a/world.rkt b/world.rkt index cf8bc36..92ca9ed 100644 --- a/world.rkt +++ b/world.rkt @@ -2,7 +2,6 @@ (define POLLEN_PREPROC_EXT 'pp) (define POLLEN_SOURCE_EXT 'p) -(define POLLEN_MAP_EXT 'pmap) (define TEMPLATE_FILE_PREFIX #\-) (define POLLEN_EXPRESSION_DELIMITER #\◊) (define TEMPLATE_FIELD_DELIMITER POLLEN_EXPRESSION_DELIMITER) @@ -10,7 +9,9 @@ (define DEFAULT_TEMPLATE "-main.html") (define TEMPLATE_META_KEY 'template) -(define DEFAULT_MAP "main.pmap") +(define POLLEN_MAP_EXT 'pmap) +(define DEFAULT_POLLEN_MAP "main.pmap") +(define POLLEN_MAP_PARENT_KEY 'parent) (define MAIN_POLLEN_EXPORT 'body) ;(define META_POLLEN_TAG 'metas)