From 10e3918fba4aa9d01b98dde13ccaa357b7b4913b Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 26 Jan 2016 14:43:00 -0800 Subject: [PATCH] refactoring for first stable release --- LICENSE | 2 +- cache.rkt | 167 ---- decode.rkt | 453 ----------- info.rkt | 9 +- main.rkt | 8 - markdown.rkt | 8 - markup.rkt | 8 - pollen/cache.rkt | 51 ++ pollen/decode.rkt | 248 ++++++ pollen/file.rkt | 52 ++ pollen/info.rkt | 7 + pollen/main.rkt | 8 + pollen/markdown.rkt | 8 + pollen/markup.rkt | 8 + pollen/misc/tutorial.rkt | 3 + mode.rkt => pollen/mode.rkt | 5 + pagetree.rkt => pollen/pagetree.rkt | 69 +- pollen/pre.rkt | 8 + pollen/private/cache-utils.rkt | 79 ++ command.rkt => pollen/private/command.rkt | 12 +- debug.rkt => pollen/private/debug.rkt | 0 .../private/doclang-raw.rkt | 0 .../private/drracket-buttons.rkt | 0 pollen/private/escape-ext.rkt | 4 + file.rkt => pollen/private/file-utils.rkt | 217 ++--- .../private/include-template.rkt | 0 .../private/language-info.rkt | 2 +- main-base.rkt => pollen/private/main-base.rkt | 54 +- pipe.py => pollen/private/pipe.py | 0 pollen/private/preheat-cache.rkt | 53 ++ .../private/project-server-routes.rkt | 4 +- .../private/project-server.rkt | 10 +- pollen/private/project.rkt | 32 + .../private/reader-base.rkt | 8 +- rerequire.rkt => pollen/private/rerequire.rkt | 0 .../private/runtime-config.rkt | 1 + .../private/server-extras}/404.html | 0 .../private/server-extras}/cmd-char.png | Bin .../private/server-extras}/error.css | 0 .../private/server-extras}/fallback.html | 0 .../private/server-extras}/fallback.svg | 0 .../private/server-extras}/fallback.txt | 0 .../private/server-extras}/favicon.ico | 0 .../private/server-extras}/poldash.css | 0 .../private/server-extras}/pollen.svg | 0 pollen/private/split-metas.rkt | 21 + pollen/private/to-string.rkt | 9 + pollen/private/version.rkt | 3 + pollen/private/whitespace.rkt | 34 + pollen/ptree.rkt | 8 + render.rkt => pollen/render.rkt | 131 ++- .../scribblings}/acknowledgments.scrbl | 2 + .../scribblings}/big-picture.scrbl | 0 .../scribblings}/burial.png | Bin .../scribblings}/cache.scrbl | 39 +- pollen/scribblings/command.html | 3 + .../scribblings}/command.scrbl | 16 +- .../scribblings}/dashboard.png | Bin pollen/scribblings/decode.html | 2 + .../scribblings}/decode.scrbl | 240 ++---- pollen/scribblings/file.scrbl | 182 +++++ .../scribblings}/format-test.scrbl | 0 pollen/scribblings/formats.html | 2 + .../scribblings}/formats.scrbl | 0 .../scribblings}/installation.scrbl | 0 .../scribblings}/license.scrbl | 0 pollen/scribblings/manual-fonts.css | 343 ++++++++ pollen/scribblings/manual-racket.css | 319 ++++++++ pollen/scribblings/manual-racket.js | 98 +++ pollen/scribblings/manual-style.css | 743 ++++++++++++++++++ .../scribblings}/mb-tools.rkt | 45 +- {scribblings => pollen/scribblings}/mb.css | 0 .../scribblings}/module-reference.scrbl | 3 +- .../scribblings}/more-help.scrbl | 0 .../scribblings}/pagetree.scrbl | 25 +- .../scribblings}/pollen.scrbl | 17 +- .../scribblings}/poly-ps-html-txt.png | Bin .../scribblings}/poly-ps-html.png | Bin .../scribblings}/poly-ps-pdf.png | Bin .../scribblings}/programming-pollen.scrbl | 5 +- .../scribblings}/project-server.png | Bin .../scribblings}/pygments.scrbl | 8 +- .../scribblings}/quick.scrbl | 6 +- pollen/scribblings/racket.css | 249 ++++++ .../scribblings}/raco.scrbl | 0 .../scribblings}/render.scrbl | 26 +- .../scribblings}/result.png | Bin pollen/scribblings/scribble-common.js | 170 ++++ pollen/scribblings/scribble.css | 484 ++++++++++++ .../scribblings}/story.scrbl | 0 pollen/scribblings/tag.html | 2 + {scribblings => pollen/scribblings}/tag.scrbl | 14 +- .../scribblings}/template.scrbl | 189 +++-- .../third-tutorial-files/burial.html.pm | 0 .../third-tutorial-files/chess.html.pm | 0 .../third-tutorial-files/index.ptree | 0 .../third-tutorial-files/pollen.rkt | 7 + .../third-tutorial-files/sermon.html.pm | 0 .../third-tutorial-files/styles.css.pp | 0 .../third-tutorial-files/template.html | 0 {scribblings => pollen/scribblings}/top.scrbl | 2 +- .../scribblings}/tutorial-first.scrbl | 0 .../scribblings}/tutorial-fourth.scrbl | 8 +- .../scribblings}/tutorial-mini.scrbl | 8 +- .../scribblings}/tutorial-second.scrbl | 2 +- .../scribblings}/tutorial-third.scrbl | 22 +- .../unstable-module-reference.scrbl | 9 + {scribblings => pollen/scribblings}/utils.rkt | 0 .../scribblings}/world.scrbl | 35 +- tag.rkt => pollen/tag.rkt | 26 +- pollen/template.rkt | 13 + pollen/template/base.rkt | 95 +++ pollen/template/html.rkt | 51 ++ .../test}/data/escape-ext/pollen.rkt | 2 +- .../test}/data/escape-ext/test$html.pp | 0 .../test}/data/override/pollen.rkt | 3 +- .../test}/data/override/test-cmd.html.ppover | 0 .../data/override/test-exports.html.ppover | 0 .../data/override/test-require.html.pmover | 0 .../test}/data/override/test.html.pm | 0 .../test}/data/override/test.html.pmd | 0 .../test}/data/override/test.html.pmdover | 0 .../test}/data/override/test.html.pmover | 0 .../test}/data/override/test.html.pp | 0 .../test}/data/override/test.html.ppover | 0 .../test}/data/override/test.no-ext | 0 .../test}/data/override/test.ptree | 0 .../test}/data/override/test.ptreeover | 0 {test => pollen/test}/data/pathup/pollen.rkt | 0 .../data/pathup/subdir/subdir/pollen.rkt | 0 .../subdir/subdir/test-pathup-two.html.pm | 0 .../test}/data/pathup/subdir/template.html.p | 0 .../pathup/subdir/test-pathup-one.html.pm | 0 pollen/test/data/pollen-mode/pollen.rkt | 5 + .../data/pollen-mode/test-pollen-mode.foo | 0 {test => pollen/test}/data/poly/pollen.rkt | 2 +- {test => pollen/test}/data/poly/template.html | 0 {test => pollen/test}/data/poly/template.txt | 0 {test => pollen/test}/data/poly/test.poly.pm | 0 .../quick-tour/downtown/downtown.html.pmd | 0 .../data/quick-tour/downtown/template.html | 0 .../test}/data/quick-tour/hello.txt.pp | 0 .../test}/data/quick-tour/margin.html.pp | 0 .../test}/data/quick-tour/uptown/pollen.rkt | 0 .../data/quick-tour/uptown/template.html | 0 .../data/quick-tour/uptown/uptown.html.pm | 0 .../test}/data/rerequire/markup.txt.pm | 0 .../test}/data/rerequire/pollen.rkt | 0 .../test}/data/rerequire/template.txt | 0 .../test}/data/samples/sample-01.html.pm | 0 .../test}/data/samples/sample-02.txt.pp | 0 .../test}/data/samples/sample-03.txt.p | 0 .../test}/data/subtemplate/one.txt | 0 .../test}/data/subtemplate/one.txt.pm | 0 .../test}/data/subtemplate/pollen.rkt | 2 +- .../subtemplate/subdir/subsubdir/template.txt | 0 .../subtemplate/subdir/subsubdir/three.txt | 0 .../subtemplate/subdir/subsubdir/three.txt.pm | 0 .../test}/data/subtemplate/subdir/two.txt | 0 .../test}/data/subtemplate/subdir/two.txt.pm | 0 .../test}/data/subtemplate/template.txt | 0 .../test}/data/test-import.html.pm | 0 {test => pollen/test}/data/test.html.pm | 0 {test => pollen/test}/data/test.html.pmd | 0 {test => pollen/test}/data/test.html.pp | 0 {test => pollen/test}/data/test.no-ext | 0 {test => pollen/test}/data/test.ptree | 0 {test => pollen/test}/test-escape-ext.rkt | 0 .../test}/test-inline-submodule.rkt | 4 +- {test => pollen/test}/test-langs.rkt | 0 {test => pollen/test}/test-meta.rkt | 0 {test => pollen/test}/test-override.rkt | 3 +- {test => pollen/test}/test-pathup.rkt | 2 +- {test => pollen/test}/test-pollen-mode.rkt | 0 {test => pollen/test}/test-poly.rkt | 0 {test => pollen/test}/test-quick-tour.rkt | 0 {test => pollen/test}/test-rerequire.rkt | 0 {test => pollen/test}/test-subtemplate.rkt | 0 .../test}/test-third-tutorial-files.rkt | 0 top.rkt => pollen/top.rkt | 12 +- convert.rkt => pollen/unstable/convert.rkt | 2 +- html.rkt => pollen/unstable/html.rkt | 0 math.rkt => pollen/unstable/math.rkt | 2 +- pollen/unstable/mb.rkt | 136 ++++ pygments.rkt => pollen/unstable/pygments.rkt | 4 +- pollen/unstable/tmpl.rkt | 8 + world.rkt => pollen/world.rkt | 19 +- pre.rkt | 8 - project.rkt | 47 -- ptree.rkt | 8 - scribblings/file.scrbl | 248 ------ scribblings/third-tutorial-files/pollen.rkt | 7 - template.rkt | 162 ---- test/data/pollen-mode/pollen.rkt | 5 - tmpl.rkt | 8 - 195 files changed, 4138 insertions(+), 1875 deletions(-) delete mode 100644 cache.rkt delete mode 100644 decode.rkt delete mode 100644 main.rkt delete mode 100644 markdown.rkt delete mode 100644 markup.rkt create mode 100644 pollen/cache.rkt create mode 100644 pollen/decode.rkt create mode 100644 pollen/file.rkt create mode 100644 pollen/info.rkt create mode 100644 pollen/main.rkt create mode 100644 pollen/markdown.rkt create mode 100644 pollen/markup.rkt create mode 100644 pollen/misc/tutorial.rkt rename mode.rkt => pollen/mode.rkt (99%) rename pagetree.rkt => pollen/pagetree.rkt (82%) create mode 100644 pollen/pre.rkt create mode 100644 pollen/private/cache-utils.rkt rename command.rkt => pollen/private/command.rkt (96%) rename debug.rkt => pollen/private/debug.rkt (100%) rename doclang-raw.rkt => pollen/private/doclang-raw.rkt (100%) rename drracket-buttons.rkt => pollen/private/drracket-buttons.rkt (100%) create mode 100644 pollen/private/escape-ext.rkt rename file.rkt => pollen/private/file-utils.rkt (62%) rename include-template.rkt => pollen/private/include-template.rkt (100%) rename language-info.rkt => pollen/private/language-info.rkt (51%) rename main-base.rkt => pollen/private/main-base.rkt (59%) rename pipe.py => pollen/private/pipe.py (100%) create mode 100644 pollen/private/preheat-cache.rkt rename server-routes.rkt => pollen/private/project-server-routes.rkt (98%) rename server.rkt => pollen/private/project-server.rkt (82%) create mode 100644 pollen/private/project.rkt rename reader-base.rkt => pollen/private/reader-base.rkt (93%) rename rerequire.rkt => pollen/private/rerequire.rkt (100%) rename runtime-config.rkt => pollen/private/runtime-config.rkt (92%) rename {server-extras => pollen/private/server-extras}/404.html (100%) rename {server-extras => pollen/private/server-extras}/cmd-char.png (100%) rename {server-extras => pollen/private/server-extras}/error.css (100%) rename {server-extras => pollen/private/server-extras}/fallback.html (100%) rename {server-extras => pollen/private/server-extras}/fallback.svg (100%) rename {server-extras => pollen/private/server-extras}/fallback.txt (100%) rename {server-extras => pollen/private/server-extras}/favicon.ico (100%) rename {server-extras => pollen/private/server-extras}/poldash.css (100%) rename {server-extras => pollen/private/server-extras}/pollen.svg (100%) create mode 100644 pollen/private/split-metas.rkt create mode 100644 pollen/private/to-string.rkt create mode 100644 pollen/private/version.rkt create mode 100644 pollen/private/whitespace.rkt create mode 100644 pollen/ptree.rkt rename render.rkt => pollen/render.rkt (73%) rename {scribblings => pollen/scribblings}/acknowledgments.scrbl (89%) rename {scribblings => pollen/scribblings}/big-picture.scrbl (100%) rename {scribblings => pollen/scribblings}/burial.png (100%) rename {scribblings => pollen/scribblings}/cache.scrbl (60%) create mode 100644 pollen/scribblings/command.html rename {scribblings => pollen/scribblings}/command.scrbl (98%) rename {scribblings => pollen/scribblings}/dashboard.png (100%) create mode 100644 pollen/scribblings/decode.html rename {scribblings => pollen/scribblings}/decode.scrbl (60%) create mode 100644 pollen/scribblings/file.scrbl rename {scribblings => pollen/scribblings}/format-test.scrbl (100%) create mode 100644 pollen/scribblings/formats.html rename {scribblings => pollen/scribblings}/formats.scrbl (100%) rename {scribblings => pollen/scribblings}/installation.scrbl (100%) rename {scribblings => pollen/scribblings}/license.scrbl (100%) create mode 100644 pollen/scribblings/manual-fonts.css create mode 100644 pollen/scribblings/manual-racket.css create mode 100644 pollen/scribblings/manual-racket.js create mode 100644 pollen/scribblings/manual-style.css rename {scribblings => pollen/scribblings}/mb-tools.rkt (69%) rename {scribblings => pollen/scribblings}/mb.css (100%) rename {scribblings => pollen/scribblings}/module-reference.scrbl (91%) rename {scribblings => pollen/scribblings}/more-help.scrbl (100%) rename {scribblings => pollen/scribblings}/pagetree.scrbl (93%) rename {scribblings => pollen/scribblings}/pollen.scrbl (98%) rename {scribblings => pollen/scribblings}/poly-ps-html-txt.png (100%) rename {scribblings => pollen/scribblings}/poly-ps-html.png (100%) rename {scribblings => pollen/scribblings}/poly-ps-pdf.png (100%) rename {scribblings => pollen/scribblings}/programming-pollen.scrbl (97%) rename {scribblings => pollen/scribblings}/project-server.png (100%) rename {scribblings => pollen/scribblings}/pygments.scrbl (82%) rename {scribblings => pollen/scribblings}/quick.scrbl (99%) create mode 100644 pollen/scribblings/racket.css rename {scribblings => pollen/scribblings}/raco.scrbl (100%) rename {scribblings => pollen/scribblings}/render.scrbl (81%) rename {scribblings => pollen/scribblings}/result.png (100%) create mode 100644 pollen/scribblings/scribble-common.js create mode 100644 pollen/scribblings/scribble.css rename {scribblings => pollen/scribblings}/story.scrbl (100%) create mode 100644 pollen/scribblings/tag.html rename {scribblings => pollen/scribblings}/tag.scrbl (81%) rename {scribblings => pollen/scribblings}/template.scrbl (88%) rename {scribblings => pollen/scribblings}/third-tutorial-files/burial.html.pm (100%) rename {scribblings => pollen/scribblings}/third-tutorial-files/chess.html.pm (100%) rename {scribblings => pollen/scribblings}/third-tutorial-files/index.ptree (100%) create mode 100644 pollen/scribblings/third-tutorial-files/pollen.rkt rename {scribblings => pollen/scribblings}/third-tutorial-files/sermon.html.pm (100%) rename {scribblings => pollen/scribblings}/third-tutorial-files/styles.css.pp (100%) rename {scribblings => pollen/scribblings}/third-tutorial-files/template.html (100%) rename {scribblings => pollen/scribblings}/top.scrbl (98%) rename {scribblings => pollen/scribblings}/tutorial-first.scrbl (100%) rename {scribblings => pollen/scribblings}/tutorial-fourth.scrbl (97%) rename {scribblings => pollen/scribblings}/tutorial-mini.scrbl (91%) rename {scribblings => pollen/scribblings}/tutorial-second.scrbl (99%) rename {scribblings => pollen/scribblings}/tutorial-third.scrbl (98%) create mode 100644 pollen/scribblings/unstable-module-reference.scrbl rename {scribblings => pollen/scribblings}/utils.rkt (100%) rename {scribblings => pollen/scribblings}/world.scrbl (80%) rename tag.rkt => pollen/tag.rkt (86%) create mode 100644 pollen/template.rkt create mode 100644 pollen/template/base.rkt create mode 100644 pollen/template/html.rkt rename {test => pollen/test}/data/escape-ext/pollen.rkt (63%) rename {test => pollen/test}/data/escape-ext/test$html.pp (100%) rename {test => pollen/test}/data/override/pollen.rkt (81%) rename {test => pollen/test}/data/override/test-cmd.html.ppover (100%) rename {test => pollen/test}/data/override/test-exports.html.ppover (100%) rename {test => pollen/test}/data/override/test-require.html.pmover (100%) rename {test => pollen/test}/data/override/test.html.pm (100%) rename {test => pollen/test}/data/override/test.html.pmd (100%) rename {test => pollen/test}/data/override/test.html.pmdover (100%) rename {test => pollen/test}/data/override/test.html.pmover (100%) rename {test => pollen/test}/data/override/test.html.pp (100%) rename {test => pollen/test}/data/override/test.html.ppover (100%) rename {test => pollen/test}/data/override/test.no-ext (100%) rename {test => pollen/test}/data/override/test.ptree (100%) rename {test => pollen/test}/data/override/test.ptreeover (100%) rename {test => pollen/test}/data/pathup/pollen.rkt (100%) rename {test => pollen/test}/data/pathup/subdir/subdir/pollen.rkt (100%) rename {test => pollen/test}/data/pathup/subdir/subdir/test-pathup-two.html.pm (100%) rename {test => pollen/test}/data/pathup/subdir/template.html.p (100%) rename {test => pollen/test}/data/pathup/subdir/test-pathup-one.html.pm (100%) create mode 100644 pollen/test/data/pollen-mode/pollen.rkt rename {test => pollen/test}/data/pollen-mode/test-pollen-mode.foo (100%) rename {test => pollen/test}/data/poly/pollen.rkt (87%) rename {test => pollen/test}/data/poly/template.html (100%) rename {test => pollen/test}/data/poly/template.txt (100%) rename {test => pollen/test}/data/poly/test.poly.pm (100%) rename {test => pollen/test}/data/quick-tour/downtown/downtown.html.pmd (100%) rename {test => pollen/test}/data/quick-tour/downtown/template.html (100%) rename {test => pollen/test}/data/quick-tour/hello.txt.pp (100%) rename {test => pollen/test}/data/quick-tour/margin.html.pp (100%) rename {test => pollen/test}/data/quick-tour/uptown/pollen.rkt (100%) rename {test => pollen/test}/data/quick-tour/uptown/template.html (100%) rename {test => pollen/test}/data/quick-tour/uptown/uptown.html.pm (100%) rename {test => pollen/test}/data/rerequire/markup.txt.pm (100%) rename {test => pollen/test}/data/rerequire/pollen.rkt (100%) rename {test => pollen/test}/data/rerequire/template.txt (100%) rename {test => pollen/test}/data/samples/sample-01.html.pm (100%) rename {test => pollen/test}/data/samples/sample-02.txt.pp (100%) rename {test => pollen/test}/data/samples/sample-03.txt.p (100%) rename {test => pollen/test}/data/subtemplate/one.txt (100%) rename {test => pollen/test}/data/subtemplate/one.txt.pm (100%) rename {test => pollen/test}/data/subtemplate/pollen.rkt (68%) rename {test => pollen/test}/data/subtemplate/subdir/subsubdir/template.txt (100%) rename {test => pollen/test}/data/subtemplate/subdir/subsubdir/three.txt (100%) rename {test => pollen/test}/data/subtemplate/subdir/subsubdir/three.txt.pm (100%) rename {test => pollen/test}/data/subtemplate/subdir/two.txt (100%) rename {test => pollen/test}/data/subtemplate/subdir/two.txt.pm (100%) rename {test => pollen/test}/data/subtemplate/template.txt (100%) rename {test => pollen/test}/data/test-import.html.pm (100%) rename {test => pollen/test}/data/test.html.pm (100%) rename {test => pollen/test}/data/test.html.pmd (100%) rename {test => pollen/test}/data/test.html.pp (100%) rename {test => pollen/test}/data/test.no-ext (100%) rename {test => pollen/test}/data/test.ptree (100%) rename {test => pollen/test}/test-escape-ext.rkt (100%) rename {test => pollen/test}/test-inline-submodule.rkt (79%) rename {test => pollen/test}/test-langs.rkt (100%) rename {test => pollen/test}/test-meta.rkt (100%) rename {test => pollen/test}/test-override.rkt (94%) rename {test => pollen/test}/test-pathup.rkt (87%) rename {test => pollen/test}/test-pollen-mode.rkt (100%) rename {test => pollen/test}/test-poly.rkt (100%) rename {test => pollen/test}/test-quick-tour.rkt (100%) rename {test => pollen/test}/test-rerequire.rkt (100%) rename {test => pollen/test}/test-subtemplate.rkt (100%) rename {test => pollen/test}/test-third-tutorial-files.rkt (100%) rename top.rkt => pollen/top.rkt (69%) rename convert.rkt => pollen/unstable/convert.rkt (97%) rename html.rkt => pollen/unstable/html.rkt (100%) rename math.rkt => pollen/unstable/math.rkt (96%) create mode 100644 pollen/unstable/mb.rkt rename pygments.rkt => pollen/unstable/pygments.rkt (98%) create mode 100644 pollen/unstable/tmpl.rkt rename world.rkt => pollen/world.rkt (82%) delete mode 100644 pre.rkt delete mode 100644 project.rkt delete mode 100644 ptree.rkt delete mode 100644 scribblings/file.scrbl delete mode 100644 scribblings/third-tutorial-files/pollen.rkt delete mode 100644 template.rkt delete mode 100644 test/data/pollen-mode/pollen.rkt delete mode 100644 tmpl.rkt diff --git a/LICENSE b/LICENSE index 5e98bc5..91fc56a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,3 @@ Pollen -© 2013–2015 Matthew Butterick +© 2013–2016 Matthew Butterick Licensed under the LGPL (see "LGPL.txt") \ No newline at end of file diff --git a/cache.rkt b/cache.rkt deleted file mode 100644 index 5e295bf..0000000 --- a/cache.rkt +++ /dev/null @@ -1,167 +0,0 @@ -#lang racket/base -(require racket/path racket/file compiler/cm file/cache sugar/coerce sugar/list "project.rkt" "rerequire.rkt" "debug.rkt" "file.rkt" racket/place "world.rkt") - -;; The cache is a hash with paths as keys. -;; The cache values are also hashes, with key/value pairs for that path. - -(provide reset-cache preheat-cache cached-require paths->key key->source-path) - - -(define (reset-cache [starting-dir (world:current-project-root)]) - (when (or (not (path-string? starting-dir)) (not (directory-exists? starting-dir))) - (error 'reset-cache (format "~a is not a directory" starting-dir))) - (for ([path (in-directory starting-dir)] - #:when (and (directory-exists? path) - (equal? (path->string (car (reverse (explode-path path)))) (world:current-cache-dir-name)))) - (message (format "removing cache directory: ~a" path)) - (delete-directory/files path))) - - -(define (preheat-cache [starting-dir (world:current-project-root)]) - (when (or (not (path-string? starting-dir)) (not (directory-exists? starting-dir))) - (error 'preheat-cache (format "~a is not a directory" starting-dir))) - - (define max-places 8) ; number of parallel processes to spawn at a time - - (define paths-that-should-be-cached (for/list ([path (in-directory starting-dir)] - #:when (or (preproc-source? path) - (markup-source? path) - (markdown-source? path) - (pagetree-source? path))) - path)) - - ;; if a file is already in the cache, no need to hit it again. - ;; this allows partially completed preheat jobs to resume. - (define uncached-paths (filter - (λ(path) - ;; #t = not cached; #f = already cached - ;; seems like it would be slow to load cache.rktd but it's not. - (define-values (_ private-cache-dir) (make-cache-dirs path)) - (define cache-db-file (build-path private-cache-dir "cache.rktd")) - (cond - [(not (file-exists? cache-db-file)) #t] - [else (define cache-db (file->value cache-db-file)) - (not (hash-has-key? cache-db (paths->key path)))])) paths-that-should-be-cached)) - - ;; compile a path inside a place (= parallel processing) - (define (path-into-place path) - (message (format "caching: ~a" (find-relative-path starting-dir path))) - (define p (place ch - (define path (place-channel-get ch)) - (define-values (path-dir path-name _) (split-path path)) - (message (format "compiling: ~a" path-name)) - ;; use #f to signal compile error. Otherwise allow errors to pass. - (define result (with-handlers ([exn:fail? (λ _ (message (format "compile failed: ~a" path-name)) #f)]) - (path->hash path))) - (place-channel-put ch result))) - (place-channel-put p path) - p) - - ;; compile the paths in groups, so they can be incrementally saved. - ;; that way, if there's a failure, the progress is preserved. - ;; but the slowest file in a group will prevent further progress. - (for ([path-group (in-list (slice-at uncached-paths max-places))]) - (define path-places (map path-into-place path-group)) - (for ([path (in-list path-group)] - [ppl (in-list path-places)]) - (define result (place-channel-get ppl)) - (when result ; #f is used to signal compile error - (cache-ref! (paths->key path) (λ _ result)))))) - - -(define (paths->key source-path [template-path #f]) - ;; key is list of file + mod-time pairs, use #f for missing - (define path-strings (append (list source-path) - (append (list (and template-path (or (get-source template-path) template-path))) ; if template has a source file, track that instead - - (->list (get-directory-require-files source-path))))) ; is either list of files or (list #f) - ;; can't use relative paths for cache keys because source files include `here-path` which is absolute. - ;; problem is that cache could appear valid on another filesystem (based on relative pathnames & mod dates) - ;; but would actually be invalid (because the `here-path` names are wrong). - (define poly-flag (and (has-inner-poly-ext? source-path) (world:current-poly-target))) - (define pollen-env (getenv "POLLEN")) - (define path+mod-time-pairs - (map (λ(ps) (and ps (let ([cp (->complete-path ps)]) - (cons (path->string cp) (with-handlers ([exn:fail? (λ _ 0)]) - (file-or-directory-modify-seconds cp)))))) path-strings)) - (list* pollen-env poly-flag path+mod-time-pairs)) - - -(define (key->source-path key) - (car (caddr key))) - -(require sugar/test) -(module-test-external - (define ps "/users/nobody/project/source.html.pm") - (check-equal? (key->source-path (paths->key ps)) ps)) - -(define-namespace-anchor anchor-to-this-namespace) - -(define (path->hash path) - ;; new namespace forces dynamic-require to re-instantiate 'path' - ;; otherwise it gets cached in current namespace. - (define drfs (get-directory-require-files path)) - (for-each managed-compile-zo (or drfs null)) - (define path-dir (dirname path)) - (apply hash - (let ([doc-key (world:current-main-export)] - [meta-key (world:current-meta-export)]) - (parameterize ([current-namespace (make-base-namespace)] - [current-directory path-dir]) - ;; I monkeyed around with using the metas submodule to pull out the metas (for speed) - ;; but in practice most files get their doc requested too. - ;; so it's just simpler to get both at once and be done with it. - ;; the savings of avoiding two cache fetches at the outset outweighs - ;; the benefit of not reloading doc when you just need metas. - (namespace-attach-module (namespace-anchor->namespace anchor-to-this-namespace) 'pollen/world) ; brings in params - (list doc-key (dynamic-require path doc-key) meta-key (dynamic-require path meta-key)))))) - - -(define (my-make-directory* dir) - (let-values ([(base name dir?) (split-path dir)]) - (when (and (path? base) (not (directory-exists? base))) - (my-make-directory* base)) - (unless (directory-exists? dir) - (with-handlers ([exn:fail:filesystem:exists? void]) - (make-directory dir))))) - -(define (make-cache-dirs path) - (define path-dir (dirname path)) - (define cache-dir (build-path path-dir (world:current-cache-dir-name))) - (define private-cache-dir (build-path cache-dir "private")) - (my-make-directory* private-cache-dir) ; will also make cache-dir, if needed - (values cache-dir private-cache-dir)) - -(define ram-cache (make-hash)) - - -(define (cache-ref! key path-hash-thunk) - (define path (key->source-path key)) - (define-values (cache-dir private-cache-dir) (make-cache-dirs path)) - (define-values (path-dir path-filename _) (split-path path)) - (define dest-file (build-path cache-dir (format "~a.rktd" path-filename))) - (cache-file dest-file - #:exists-ok? #t - key - private-cache-dir - (λ _ - (write-to-file (path-hash-thunk) dest-file #:exists 'replace)) - #:max-cache-size (world:current-compile-cache-max-size)) - (file->value dest-file)) - - -(define (cached-require path-string subkey) - (define path (with-handlers ([exn:fail? (λ _ (raise-argument-error 'cached-require "valid path-string" path-string))]) - (->complete-path path-string))) - - (when (not (file-exists? path)) - (raise-argument-error 'cached-require "path to existing file" path)) - - (cond - [(world:current-compile-cache-active path) - (define key (paths->key path)) - (hash-ref (hash-ref! ram-cache key (λ _ - (cache-ref! key (λ _ (path->hash path))))) subkey)] - [else (parameterize ([current-namespace (make-base-namespace)]) - (namespace-attach-module (namespace-anchor->namespace anchor-to-this-namespace) 'pollen/world) ; brings in params - (dynamic-require path subkey))])) \ No newline at end of file diff --git a/decode.rkt b/decode.rkt deleted file mode 100644 index 501507c..0000000 --- a/decode.rkt +++ /dev/null @@ -1,453 +0,0 @@ -#lang racket/base -(require xml txexpr racket/string racket/match racket/list (prefix-in html: pollen/html) sugar/list sugar/container sugar/len sugar/define sugar/coerce sugar/test) -(require "debug.rkt" "world.rkt") - - -(define (symbols? x) (and (list? x) (andmap symbol? x))) - -(define+provide (to-string x) - (if (string? x) - x ; fast exit for strings - (with-handlers ([exn:fail? (λ(exn) (error (format "Pollen decoder: can't convert ~v to ~a" x 'string)))]) - (cond - [(equal? '() x) ""] - [(symbol? x) (symbol->string x)] - [(number? x) (number->string x)] - [(path? x) (path->string x)] - [(char? x) (format "~a" x)] - [(void? x) ""] - ;; todo: guard against weird shit like lists of procedures - [(or (list? x) (hash? x) (vector? x)) (format "~v" x)] ; ok to convert datatypes - [else (error)])))) ; but things like procedures should throw an error - -(define decode-proc-output-contract (or/c xexpr/c (listof xexpr/c))) - - -(define (->list/tx x) - ;; same as ->list but catches special case of single txexpr, - ;; which is itself a list, but in this case should be wrapped into a list, - ;; for use with append-map. - (if (txexpr? x) - (list x) - (->list x))) - - -;; decoder wireframe -(define+provide/contract (decode tx-in - #:txexpr-tag-proc [txexpr-tag-proc (λ(x)x)] - #:txexpr-attrs-proc [txexpr-attrs-proc (λ(x)x)] - #:txexpr-elements-proc [txexpr-elements-proc (λ(x)x)] - #:block-txexpr-proc [block-txexpr-proc (λ(x)x)] - #:inline-txexpr-proc [inline-txexpr-proc (λ(x)x)] - #:string-proc [string-proc (λ(x)x)] - #:entity-proc [entity-proc (λ(x)x)] - #:cdata-proc [cdata-proc (λ(x)x)] - #:exclude-tags [excluded-tags '()] - #:exclude-attrs [excluded-attrs '()]) - ((xexpr/c) - (#:txexpr-tag-proc (txexpr-tag? . -> . txexpr-tag?) - #:txexpr-attrs-proc (txexpr-attrs? . -> . txexpr-attrs?) - #:txexpr-elements-proc (txexpr-elements? . -> . txexpr-elements?) - #:block-txexpr-proc (block-txexpr? . -> . decode-proc-output-contract) - #:inline-txexpr-proc (txexpr? . -> . decode-proc-output-contract) - #:string-proc (string? . -> . decode-proc-output-contract) - #:entity-proc ((or/c symbol? valid-char?) . -> . decode-proc-output-contract) - #:cdata-proc (cdata? . -> . decode-proc-output-contract) - #:exclude-tags (listof txexpr-tag?) - #:exclude-attrs txexpr-attrs?) . ->* . (or/c xexpr/c (listof xexpr/c))) - (let loop ([x tx-in]) - (cond - [(txexpr? x) (let-values([(tag attrs elements) (txexpr->values x)]) - (if (or (member tag excluded-tags) (ormap (λ(attr) (member attr excluded-attrs)) attrs)) - x ; because it's excluded - ;; we apply processing here rather than do recursive descent on the pieces - ;; because if we send them back through loop, certain element types are ambiguous - ;; e.g., ((p "foo")) tests out as both txexpr-attrs and txexpr-elements - (let ([decoded-txexpr - (apply make-txexpr (list (txexpr-tag-proc tag) - (txexpr-attrs-proc attrs) - (txexpr-elements-proc (append-map (compose1 ->list/tx loop) elements))))]) - ((if (block-txexpr? decoded-txexpr) - block-txexpr-proc - inline-txexpr-proc) decoded-txexpr))))] - [(string? x) (string-proc x)] - [(or (symbol? x) (valid-char? x)) (entity-proc x)] - [(cdata? x) (cdata-proc x)] - [else (error "decode: can't decode" x)]))) - -(module-test-external - (require racket/list txexpr racket/function) - (define (doubler x) (list x x)) - (check-equal? (decode #:txexpr-elements-proc identity '(p "foo")) '(p "foo")) - ;; can't use doubler on txexpr-elements because it needs a list, not list of lists - (check-equal? (decode #:txexpr-elements-proc (λ(elems) (append elems elems)) '(p "foo")) '(p "foo" "foo")) - (check-equal? (decode #:block-txexpr-proc identity '(p "foo")) '(p "foo")) - (check-equal? (decode #:block-txexpr-proc doubler '(p "foo")) (list '(p "foo") '(p "foo"))) - (check-equal? (decode #:inline-txexpr-proc identity '(p (span "foo"))) '(p (span "foo"))) - (check-equal? (decode #:inline-txexpr-proc doubler '(p (span "foo"))) '(p (span "foo") (span "foo"))) - (check-equal? (decode #:string-proc identity '(p (span "foo"))) '(p (span "foo"))) - (check-equal? (decode #:string-proc doubler '(p (span "foo"))) '(p (span "foo" "foo"))) - (check-equal? (decode #:entity-proc identity '(p (span "foo" 'amp))) '(p (span "foo" 'amp))) - (check-equal? (decode #:entity-proc identity '(p 42)) '(p 42)) - (check-equal? (decode #:entity-proc doubler '(p 42)) '(p 42 42)) - (check-equal? (decode #:entity-proc identity '(p amp)) '(p amp)) - ;; next text doesn't work because list of symbol elements is ambiguous with tagged X-expression - ;; is there a general patch for this? maybe, but for now it's better to not patch selectively - ;; otherwise ambiguous expressions will have erratic misbehavior (instead of merely consistent misbehavior) - ;;(check-equal? (decode #:entity-proc doubler '(p amp)) '(p amp amp)) - (check-equal? (decode-elements #:string-proc identity '("foo")) '("foo")) - (check-equal? (decode-elements #:string-proc doubler '("foo")) '("foo" "foo"))) - -;; it would be nice to not repeat this, but with all the keywords, it's simpler to repeat than do a macro -(define+provide/contract (decode-elements elements - #:txexpr-tag-proc [txexpr-tag-proc (λ(x)x)] - #:txexpr-attrs-proc [txexpr-attrs-proc (λ(x)x)] - #:txexpr-elements-proc [txexpr-elements-proc (λ(x)x)] - #:block-txexpr-proc [block-txexpr-proc (λ(x)x)] - #:inline-txexpr-proc [inline-txexpr-proc (λ(x)x)] - #:string-proc [string-proc (λ(x)x)] - #:entity-proc [entity-proc (λ(x)x)] - #:cdata-proc [cdata-proc (λ(x)x)] - #:exclude-tags [excluded-tags '()] - #:exclude-attrs [excluded-attrs '()]) - ((txexpr-elements?) - (#:txexpr-tag-proc (txexpr-tag? . -> . txexpr-tag?) - #:txexpr-attrs-proc (txexpr-attrs? . -> . txexpr-attrs?) - #:txexpr-elements-proc (txexpr-elements? . -> . txexpr-elements?) - #:block-txexpr-proc (block-txexpr? . -> . decode-proc-output-contract) - #:inline-txexpr-proc (txexpr? . -> . decode-proc-output-contract) - #:string-proc (string? . -> . decode-proc-output-contract) - #:entity-proc ((or/c symbol? valid-char?) . -> . decode-proc-output-contract) - #:cdata-proc (cdata? . -> . decode-proc-output-contract) - #:exclude-tags (listof txexpr-tag?) - #:exclude-attrs txexpr-attrs?) . ->* . (or/c xexpr/c (listof xexpr/c))) - - (define temp-tag (gensym "temp-tag")) - (define decode-result (decode `(temp-tag ,@elements) - #:txexpr-tag-proc txexpr-tag-proc - #:txexpr-attrs-proc txexpr-attrs-proc - #:txexpr-elements-proc txexpr-elements-proc - #:block-txexpr-proc block-txexpr-proc - #:inline-txexpr-proc inline-txexpr-proc - #:string-proc string-proc - #:entity-proc entity-proc - #:cdata-proc cdata-proc - #:exclude-tags excluded-tags - #:exclude-attrs excluded-attrs)) - (get-elements decode-result)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Blocks - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; initial set of block tags: from html -(define+provide project-block-tags - (make-parameter html:block-tags)) - - -;; tags are inline unless they're registered as block tags. -(define+provide/contract (block-txexpr? x) - (any/c . -> . boolean?) - (and (txexpr? x) (member (get-tag x) (project-block-tags)) #t)) - - -(define+provide/contract (register-block-tag tag) - (txexpr-tag? . -> . void?) - (project-block-tags (cons tag (project-block-tags)))) - -(module-test-external - (check-true (begin (register-block-tag 'barfoo) (block-txexpr? '(barfoo "foo"))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Typography - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - - -(define (make-replacer query+replacement) - (let ([queries (map car query+replacement)] - [replacements (map second query+replacement)]) - ;; reverse because first in list should be first applied to str (and compose1 works right-to-left) - (apply compose1 (reverse (map (λ(query replacement) (λ(str) (regexp-replace* query str replacement))) queries replacements))))) - -(define+provide/contract (smart-dashes str) - (string? . -> . string?) - (define dashes - ;; fix em dashes first, else they'll be mistaken for en dashes - ;; \\s is whitespace + #\u00A0 is nonbreaking space - '((#px"[\\s#\u00A0]*(---|—)[\\s#\u00A0]*" "—") ; em dash - (#px"[\\s#\u00A0]*(--|–)[\\s#\u00A0]*" "–"))) ; en dash - ((make-replacer dashes) str)) - -(module-test-external - (check-equal? (smart-dashes "I had --- maybe 13 -- 20 --- hob-nobs.") "I had—maybe 13–20—hob-nobs.") - (check-equal? (smart-quotes "\"Why,\" she could've asked, \"are we in O‘ahu watching 'Mame'?\"") - "“Why,” she could’ve asked, “are we in O‘ahu watching ‘Mame’?”") - (check-equal? (smart-quotes "\"\'Impossible.\' Yes.\"") "“‘Impossible.’ Yes.”")) - - -(define+provide/contract (smart-quotes str) - (string? . -> . string?) - - (define quotes - '((#px"(?<=\\w)'(?=\\w)" "’") ; apostrophe - (#px"(?string #\u00A0)] - #:minimum-word-length [minimum-word-length 6] - #:last-word-proc [last-word-proc (λ(x) x)]) - ((txexpr?) (#:nbsp string? #:minimum-word-length integer? #:last-word-proc procedure?) . ->* . txexpr?) - - ;; todo: parameterize this, as it will be different for each project - (define tags-to-pay-attention-to '(p aside)) ; only apply to paragraphs - - (define (replace-last-space str) - (if (#\space . in? . str) - (let ([reversed-str-list (reverse (string->list str))] - [reversed-nbsp (reverse (string->list (->string nbsp)))]) - (define-values (last-word-chars other-chars) - (splitf-at reversed-str-list (λ(i) (not (eq? i #\space))))) - - (define front-chars (if (< (len last-word-chars) minimum-word-length) ; OK for long words to be on their own line - ; first char of other-chars will be the space, so use cdr - (string-append (list->string (reverse (cdr other-chars))) (->string nbsp)) - (list->string (reverse other-chars)))) - (define last-word (list->string (reverse last-word-chars))) - `(,front-chars ,(last-word-proc last-word))) ; don't concatenate last word bc last-word-proc might be a txexpr wrapper - (list str))) - - (define (find-last-word-space x) ; recursively traverse xexpr - (cond - [(string? x) (replace-last-space x)] ; todo: this assumes a paragraph only has one string in it. - [(txexpr? x) - (let-values([(tag attr elements) (txexpr->values x)]) - (if (> (length elements) 0) ; elements is list of xexprs - (let-values ([(all-but-last last) (split-at elements (sub1 (length elements)))]) - (define result (find-last-word-space (car last))) - (define result-items (if (txexpr? result) (list result) result)) ; might be txexpr, or list of new elements - (make-txexpr tag attr `(,@all-but-last ,@result-items))) - x))] - [else x])) - - (if ((car x) . in? . tags-to-pay-attention-to) - (find-last-word-space x) - x)) - -(module-test-external - ;; todo: make some tougher tests, it gets flaky with edge cases - (check-equal? (nonbreaking-last-space '(p "Hi there")) '(p "Hi " "there")) ; nbsp in between last two words - (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "Ø") '(p "HiØ" "there")) ; but let's make it visible - (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "_up_") '(p "Hi_up_" "there")) - (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "_up_" #:minimum-word-length 3) - '(p "Hi " "there")) - (check-equal? (nonbreaking-last-space '(p "Hi here" (em "ho there")) #:nbsp "Ø") '(p "Hi here" (em "hoØ" "there")))) - -; wrap initial quotes for hanging punctuation -; todo: improve this -; does not handle

thing properly -(define+provide/contract (wrap-hanging-quotes nx - #:single-prepend [single-pp '(squo)] - #:double-prepend [double-pp '(dquo)]) - ((txexpr?) (#:single-prepend list? #:double-prepend list?) . ->* . txexpr?) - - (define two-or-more-char-string? (λ(i) (and (string? i) (>= (len i) 2)))) - (define-values (tag attr elements) (txexpr->values nx)) - (make-txexpr tag attr - (if (and (list? elements) (not (empty? elements))) - (let ([new-car-elements (match (car elements) - [(? two-or-more-char-string? tcs) - (define str-first (get tcs 0)) - (define str-rest (get tcs 1 (len tcs))) - (cond - [(str-first . in? . '("\"" "“")) - ;; can wrap with any inline tag - ;; so that linebreak detection etc still works - `(,@double-pp ,(->string #\“) ,str-rest)] - [(str-first . in? . '("\'" "‘")) - `(,@single-pp ,(->string #\‘) ,str-rest)] - [else tcs])] - [(? txexpr? nx) (wrap-hanging-quotes nx)] - [else (car elements)])]) - (cons new-car-elements (cdr elements))) - elements))) - -(module-test-external - (check-equal? (wrap-hanging-quotes '(p "\"Hi\" there")) '(p (dquo "“" "Hi\" there"))) - (check-equal? (wrap-hanging-quotes '(p "'Hi' there")) '(p (squo "‘" "Hi' there"))) - (check-equal? (wrap-hanging-quotes '(p "'Hi' there") #:single-prepend '(foo ((bar "ino")))) - '(p (foo ((bar "ino")) "‘" "Hi' there"))) - - ;; make sure txexpr without elements passes through unscathed - (check-equal? (wrap-hanging-quotes '(div ((style "height:2em")))) '(div ((style "height:2em"))))) - - - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Lines, blocks, paragraphs - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -;; turn the right items into
tags -(define+provide/contract (detect-linebreaks xc - #:separator [newline (world:current-linebreak-separator)] - #:insert [linebreak '(br)]) - ((txexpr-elements?) (#:separator string? #:insert xexpr?) . ->* . txexpr-elements?) - ;; todo: should this test be not block + not whitespace? - (define not-block? (λ(i) (not (block-txexpr? i)))) - (filter-not empty? - (for/list ([i (in-range (len xc))]) - (let ([item (get xc i)]) - (cond - ;; skip first and last - [(or (= i 0) (= i (sub1 (len xc)))) item] - [(equal? item newline) - (match (get xc (- i 1) (+ i 2)) ; a three-element slice with x[i] in the middle - ;; only convert if neither adjacent tag is a block - ;; (because blocks automatically force a newline before & after) - [(list (? not-block?) newline (? not-block?)) linebreak] - [else empty])] ; otherwise delete - [else item]))))) - -(module-test-external - (check-equal? (detect-linebreaks '("foo" "\n" "bar")) '("foo" (br) "bar")) - (check-equal? (detect-linebreaks '("\n" "foo" "\n" "bar" "\n")) '("\n" "foo" (br) "bar" "\n")) - (check-equal? (detect-linebreaks '((p "foo") "\n" (p "bar"))) '((p "foo") (p "bar"))) - (check-equal? (detect-linebreaks '("foo" "\n" (p "bar"))) '("foo" (p "bar"))) - (check-equal? (detect-linebreaks '("foo" "moo" "bar")) '("foo" "moo" "bar")) - (check-equal? (detect-linebreaks '("foo" "moo" "bar") #:insert "moo") '("foo" "moo" "bar")) - (check-equal? (detect-linebreaks '("foo" "\n\n" "bar")) '("foo" "\n\n" "bar"))) - - -(define+provide/contract (whitespace? x [nbsp? #f]) - ((any/c)(boolean?) . ->* . coerce/boolean?) - (define pat (pregexp (format "^[\\s~a]+$" (if nbsp? #\u00A0 "")))) - (cond - [(equal? "" x) #t] ; empty string is deemed whitespace - [(or (string? x) (symbol? x)) (regexp-match pat (->string x))] - [(or (list? x) (vector? x)) (and (not (empty? x)) (andmap (λ(i) (whitespace? i nbsp?)) (->list x)))] ; andmap returns #t for empty lists - [else #f])) - -(module-test-external - (require racket/format) - (check-true (whitespace? " ")) - (check-false (whitespace? (~a #\u00A0))) - (check-true (whitespace/nbsp? (~a #\u00A0))) - (check-true (whitespace/nbsp? (vector (~a #\u00A0)))) - (check-false (whitespace? (format " ~a " #\u00A0))) - (check-true (whitespace/nbsp? (format " ~a " #\u00A0)))) - - -(define+provide/contract (whitespace/nbsp? x) - (any/c . -> . coerce/boolean?) - (whitespace? x #t)) - - -;; is x a paragraph break? -(define+provide/contract (paragraph-break? x #:separator [sep (world:current-paragraph-separator)]) - ((any/c) (#:separator pregexp?) . ->* . coerce/boolean?) - (define paragraph-pattern (pregexp (format "^~a+$" sep))) - (and (string? x) (regexp-match paragraph-pattern x))) - -;; Find adjacent newline characters in a list and merge them into one item -;; Scribble, by default, makes each newline a separate list item. -(define+provide/contract (merge-newlines x) - (txexpr-elements? . -> . txexpr-elements?) - (define (newlines? x) - (and (string? x) - (let ([newline-pat (regexp (format "^~a+$" (world:current-newline)))]) - (regexp-match newline-pat x)))) - - (define (merge-if-newlines xs) - (if (newlines? (car xs)) - (list (string-append* xs)) - xs)) - - (let loop ([x x]) - (if (pair? x) - (let ([xs (map loop x)]) - (append-map merge-if-newlines (slicef xs newlines?))) - x))) - -(module-test-external - (require racket/list) - (check-equal? (merge-newlines empty) empty) - (check-equal? (merge-newlines '(p "\n" "\n" "foo" "\n" "\n\n" "bar" (em "\n" "\n" "\n"))) - '(p "\n\n" "foo" "\n\n\n" "bar" (em "\n\n\n")))) - - - -;; detect paragraphs -;; todo: unit tests -(define+provide/contract (detect-paragraphs elements #:tag [tag 'p] - #:separator [sep (world:current-paragraph-separator)] - #:linebreak-proc [linebreak-proc detect-linebreaks] - #:force? [force-paragraph #f]) - ((txexpr-elements?) (#:tag symbol? #:separator string? #:linebreak-proc (txexpr-elements? . -> . txexpr-elements?) #:force? boolean?) - . ->* . txexpr-elements?) - - ;; prepare elements for paragraph testing - (define (prep-paragraph-flow elems) - (linebreak-proc (merge-newlines (trimf elems whitespace?)))) - - (define my-paragraph-break? (λ(x) (and (paragraph-break? x #:separator sep) #t))) - - (define (wrap-paragraph elems) - (match elems - [(list (? block-txexpr? bxs) ...) bxs] ; leave a series of block xexprs alone - [else (list (make-txexpr tag empty elems))])) ; otherwise wrap in p tag - - (let ([elements (prep-paragraph-flow elements)]) - (define explicit-or-implicit-paragraph-break? (λ(x) (or (my-paragraph-break? x) (block-txexpr? x)))) - (if (ormap explicit-or-implicit-paragraph-break? elements) ; need this condition to prevent infinite recursion - ;; use append-map on wrap-paragraph rather than map to permit return of multiple elements - (append-map wrap-paragraph (append-map (λ(es) (filter-split es my-paragraph-break?)) (slicef elements block-txexpr?))) ; split into ¶¶, using both implied and explicit paragraph breaks - (if force-paragraph - (append-map wrap-paragraph (slicef elements block-txexpr?)) ; upconverts non-block elements to paragraphs - elements)))) - -(module-test-external - (check-equal? (detect-paragraphs '("First para" "\n\n" "Second para")) - '((p "First para") (p "Second para"))) - (check-equal? (detect-paragraphs '("First para" "\n\n" "Second para" "\n" "Second line")) - '((p "First para") (p "Second para" (br) "Second line"))) - (check-equal? (detect-paragraphs '("First para" "\n\n" (div "Second block"))) - '((p "First para") (div "Second block"))) - (check-equal? (detect-paragraphs '((div "First block") "\n\n" (div "Second block"))) - '((div "First block") (div "Second block"))) - (check-equal? (detect-paragraphs '("First para" "\n\n" "Second para") #:tag 'ns:p) - '((ns:p "First para") (ns:p "Second para"))) - (check-equal? (detect-paragraphs '("First para" "\n\n" "Second para" "\n" "Second line") - #:linebreak-proc (λ(x) (detect-linebreaks x #:insert '(newline)))) - '((p "First para") (p "Second para" (newline) "Second line"))) - (check-equal? (detect-paragraphs '("foo" "\n\n" (div "bar") (div "zam"))) - '((p "foo") (div "bar") (div "zam"))) - (check-equal? (detect-paragraphs '("foo" "\n\n" (div "bar") "\n\n" (div "zam"))) - '((p "foo") (div "bar") (div "zam"))) - - (check-equal? (detect-paragraphs '("foo")) '("foo")) - (check-equal? (detect-paragraphs '("foo") #:force? #t) '((p "foo"))) - (check-equal? (detect-paragraphs '((div "foo"))) '((div "foo"))) - (check-equal? (detect-paragraphs '((div "foo")) #:force? #t) '((div "foo"))) - (check-equal? (detect-paragraphs '("foo" "\n\n" (div "bar"))) '((p "foo") (div "bar"))) - (check-equal? (detect-paragraphs '("foo" (div "bar"))) '((p "foo") (div "bar"))) - (check-equal? (detect-paragraphs '("foo" (div "bar")) #:force? #t) '((p "foo") (div "bar"))) - (check-equal? (detect-paragraphs '("foo" (div "bar") "zam")) '((p "foo") (div "bar") (p "zam"))) - (check-equal? (detect-paragraphs '("foo" (span "zing") (div "bar") "zam")) '((p "foo" (span "zing")) (div "bar") (p "zam"))) - (check-equal? (detect-paragraphs '("foo" (span "zing") (div "bar") "zam") #:force? #t) '((p "foo" (span "zing")) (div "bar") (p "zam")))) \ No newline at end of file diff --git a/info.rkt b/info.rkt index 13e852c..8219649 100644 --- a/info.rkt +++ b/info.rkt @@ -1,13 +1,8 @@ #lang info -(define collection "pollen") +(define version "1.0") +(define collection 'multi) (define deps '("base" "txexpr" "sugar" ("markdown" #:version "0.18") "htdp" "at-exp-lib" "html-lib" "rackjure" "web-server-lib" "scribble-text-lib" "rackunit-lib" "gui-lib")) (define build-deps '("plot-gui-lib" "scribble-lib" "racket-doc" "rackunit-doc" "plot-doc" "scribble-doc" "slideshow-doc" "web-server-doc")) (define update-implies '("txexpr" "sugar")) -(define scribblings '(("scribblings/pollen.scrbl" (multi-page)))) -(define raco-commands '(("pollen" (submod pollen/command raco) "issue Pollen command" #f))) -(define compile-omit-paths '("test" "tools" "server-extras" "scribblings/third-tutorial-files")) -;; it's redundant to test "pollen.scrbl" because it incorporates the other scribble sources by reference -(define test-omit-paths '("test/data" "tools" "server-extras" "scribblings/third-tutorial-files" "scribblings/pollen.scrbl")) -(define module-suffixes '(#"pp" #"pm" #"pmd" #"ptree")) diff --git a/main.rkt b/main.rkt deleted file mode 100644 index 08169e4..0000000 --- a/main.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) -(define+provide-module-begin-in-mode world:mode-preproc) ; because default mode in submodule is preproc - -(module reader racket/base - (require pollen/reader-base) - ;; because default mode in file is auto - (define+provide-reader-in-mode world:mode-auto)) \ No newline at end of file diff --git a/markdown.rkt b/markdown.rkt deleted file mode 100644 index ed2cb59..0000000 --- a/markdown.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) - -(define+provide-module-begin-in-mode world:mode-markdown) - -(module reader racket/base - (require pollen/reader-base) - (define+provide-reader-in-mode world:mode-markdown)) \ No newline at end of file diff --git a/markup.rkt b/markup.rkt deleted file mode 100644 index 4250d0b..0000000 --- a/markup.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) - -(define+provide-module-begin-in-mode world:mode-markup) - -(module reader racket/base - (require pollen/reader-base) - (define+provide-reader-in-mode world:mode-markup)) \ No newline at end of file diff --git a/pollen/cache.rkt b/pollen/cache.rkt new file mode 100644 index 0000000..7ff2b05 --- /dev/null +++ b/pollen/cache.rkt @@ -0,0 +1,51 @@ +#lang racket/base +(require racket/file + sugar/define + "private/cache-utils.rkt" + "private/debug.rkt" + "world.rkt") + +;; The cache is a hash with paths as keys. +;; The cache values are also hashes, with key/value pairs for that path. + +(define+provide (reset-cache [starting-dir (world:current-project-root)]) + (unless (and (path-string? starting-dir) (directory-exists? starting-dir)) + (raise-argument-error 'reset-cache "path-string to existing directory" starting-dir)) + + (for ([path (in-directory starting-dir)] + #:when (and (directory-exists? path) + (equal? (path->string (car (reverse (explode-path path)))) (world:current-cache-dir-name)))) + (message (format "removing cache directory: ~a" path)) + (delete-directory/files path))) + +(define-namespace-anchor cache-module-ns) +(define cached-require-base + (let ([ram-cache (make-hash)]) + (λ(path-or-path-string subkey caller-name) + (define path (with-handlers ([exn:fail? (λ(e) (raise-argument-error caller-name "valid path or path-string" path-or-path-string))]) + (path->complete-path (if (path? path-or-path-string) + path-or-path-string + (string->path path-or-path-string))))) + + (unless (file-exists? path) + (raise-argument-error caller-name "path to existing file" path-or-path-string)) + + (cond + [(world:current-compile-cache-active path) + (define key (paths->key path)) + (hash-ref (hash-ref! ram-cache key (λ _ (cache-ref! key (λ _ (path->hash path))))) subkey)] + [else (parameterize ([current-namespace (make-base-namespace)]) + (namespace-attach-module (namespace-anchor->namespace cache-module-ns) 'pollen/world) ; brings in params + (dynamic-require path subkey))])))) + + +(define+provide (cached-require path-string subkey) + (cached-require-base path-string subkey 'cached-require)) + + +(define+provide (cached-doc path-string) + (cached-require-base path-string (world:current-main-export) 'cached-doc)) + + +(define+provide (cached-metas path-string) + (cached-require-base path-string (world:current-meta-export) 'cached-metas)) \ No newline at end of file diff --git a/pollen/decode.rkt b/pollen/decode.rkt new file mode 100644 index 0000000..59fc413 --- /dev/null +++ b/pollen/decode.rkt @@ -0,0 +1,248 @@ +#lang racket/base +(require xml txexpr racket/list sugar/list sugar/define sugar/test) +(require "world.rkt" + "private/whitespace.rkt") + + +(define (->list/tx x) + ;; same as ->list but catches special case of single txexpr, + ;; which is itself a list, but in this case should be wrapped into a list, + ;; for use with append-map. + (cond + [(txexpr? x) (list x)] + [(list? x) x] + [else (list x)])) + +(define decode-proc-output-contract (or/c txexpr-element? txexpr-elements?)) +(define identity (λ(x) x)) + +;; decoder wireframe +(define+provide/contract (decode tx-in + #:txexpr-tag-proc [txexpr-tag-proc identity] + #:txexpr-attrs-proc [txexpr-attrs-proc identity] + #:txexpr-elements-proc [txexpr-elements-proc identity] + #:txexpr-proc [txexpr-proc identity] + #:block-txexpr-proc [block-txexpr-proc identity] + #:inline-txexpr-proc [inline-txexpr-proc identity] + #:string-proc [string-proc identity] + #:entity-proc [entity-proc identity] + #:cdata-proc [cdata-proc identity] + #:exclude-tags [excluded-tags empty] + #:exclude-attrs [excluded-attrs empty]) + ((xexpr/c) + (#:txexpr-tag-proc (txexpr-tag? . -> . txexpr-tag?) + #:txexpr-attrs-proc (txexpr-attrs? . -> . txexpr-attrs?) + #:txexpr-elements-proc (txexpr-elements? . -> . txexpr-elements?) + #:txexpr-proc (txexpr? . -> . decode-proc-output-contract) + #:block-txexpr-proc (block-txexpr? . -> . decode-proc-output-contract) + #:inline-txexpr-proc (txexpr? . -> . decode-proc-output-contract) + #:string-proc (string? . -> . decode-proc-output-contract) + #:entity-proc ((or/c symbol? valid-char?) . -> . decode-proc-output-contract) + #:cdata-proc (cdata? . -> . decode-proc-output-contract) + #:exclude-tags txexpr-tags? + #:exclude-attrs txexpr-attrs?) . ->* . decode-proc-output-contract) + (let loop ([x tx-in]) + (cond + [(txexpr? x) (let-values([(tag attrs elements) (txexpr->values x)]) + (if (or (member tag excluded-tags) (ormap (λ(attr) (member attr excluded-attrs)) attrs)) + x ; because it's excluded + ;; we apply processing here rather than do recursive descent on the pieces + ;; because if we send them back through loop, certain element types are ambiguous + ;; e.g., ((p "foo")) tests out as both txexpr-attrs and txexpr-elements + (let ([decoded-txexpr + (apply make-txexpr (list (txexpr-tag-proc tag) + (txexpr-attrs-proc attrs) + (txexpr-elements-proc (append-map (compose1 ->list/tx loop) elements))))]) + ((compose1 txexpr-proc (if (block-txexpr? decoded-txexpr) + block-txexpr-proc + inline-txexpr-proc)) decoded-txexpr))))] + [(string? x) (string-proc x)] + [(or (symbol? x) (valid-char? x)) (entity-proc x)] + [(cdata? x) (cdata-proc x)] + [else (error "decode: can't decode" x)]))) + +(module-test-external + (require racket/list txexpr racket/function) + (define (doubler x) (list x x)) + (define (doubletag x) (txexpr (string->symbol (format "~a~a" (get-tag x) (get-tag x))) (get-attrs x) (get-elements x))) + (check-equal? (decode #:txexpr-elements-proc identity '(p "foo")) '(p "foo")) + ;; can't use doubler on txexpr-elements because it needs a list, not list of lists + (check-equal? (decode #:txexpr-elements-proc (λ(elems) (append elems elems)) '(p "foo")) '(p "foo" "foo")) + (check-equal? (decode #:block-txexpr-proc identity '(p "foo")) '(p "foo")) + (check-equal? (decode #:block-txexpr-proc doubler '(p "foo")) (list '(p "foo") '(p "foo"))) + (check-equal? (decode #:block-txexpr-proc doubler '(p "foo")) (list '(p "foo") '(p "foo"))) + (check-equal? (decode #:txexpr-proc doubletag '(root (p "foo") (b "bar"))) '(rootroot (pp "foo") (bb "bar"))) + (check-equal? (decode #:block-txexpr-proc doubletag '(root (p "foo") (b "bar"))) '(rootroot (pp "foo") (b "bar"))) + (check-equal? (decode #:inline-txexpr-proc doubletag '(root (p "foo") (b "bar"))) '(root (p "foo") (bb "bar"))) + (check-equal? (decode #:inline-txexpr-proc identity '(p (span "foo"))) '(p (span "foo"))) + (check-equal? (decode #:inline-txexpr-proc doubler '(p (span "foo"))) '(p (span "foo") (span "foo"))) + (check-equal? (decode #:string-proc identity '(p (span "foo"))) '(p (span "foo"))) + (check-equal? (decode #:string-proc doubler '(p (span "foo"))) '(p (span "foo" "foo"))) + (check-equal? (decode #:entity-proc identity '(p (span "foo" 'amp))) '(p (span "foo" 'amp))) + (check-equal? (decode #:entity-proc identity '(p 42)) '(p 42)) + (check-equal? (decode #:entity-proc doubler '(p 42)) '(p 42 42)) + (check-equal? (decode #:entity-proc identity '(p amp)) '(p amp)) + ;; next text doesn't work because list of symbol elements is ambiguous with tagged X-expression + ;; is there a general patch for this? maybe, but for now it's better to not patch selectively + ;; otherwise ambiguous expressions will have erratic misbehavior (instead of merely consistent misbehavior) + ;;(check-equal? (decode #:entity-proc doubler '(p amp)) '(p amp amp)) + (check-equal? (decode-elements #:string-proc identity '("foo")) '("foo")) + (check-equal? (decode-elements #:string-proc doubler '("foo")) '("foo" "foo"))) + +;; it would be nice to not repeat this, but with all the keywords, it's simpler to repeat than do a macro +(define+provide/contract decode-elements + ((txexpr-elements?) + (#:txexpr-tag-proc (txexpr-tag? . -> . txexpr-tag?) + #:txexpr-attrs-proc (txexpr-attrs? . -> . txexpr-attrs?) + #:txexpr-elements-proc (txexpr-elements? . -> . txexpr-elements?) + #:txexpr-proc (txexpr? . -> . decode-proc-output-contract) + #:block-txexpr-proc (block-txexpr? . -> . decode-proc-output-contract) + #:inline-txexpr-proc (txexpr? . -> . decode-proc-output-contract) + #:string-proc (string? . -> . decode-proc-output-contract) + #:entity-proc ((or/c symbol? valid-char?) . -> . decode-proc-output-contract) + #:cdata-proc (cdata? . -> . decode-proc-output-contract) + #:exclude-tags txexpr-tags? + #:exclude-attrs txexpr-attrs?) . ->* . decode-proc-output-contract) + (make-keyword-procedure + (λ (kws kwargs . args) + (define temp-tag (gensym "temp-tag")) + (define elements (car args)) + (define decode-result (keyword-apply decode kws kwargs (list (cons temp-tag elements)))) + (get-elements decode-result)))) + + +(define+provide/contract (block-txexpr? x) + (any/c . -> . boolean?) + ;; Mostly this is used inside `decode`, + ;; so rather than test for `txexpr?` at the beginning (which is potentially slow) + ;; just look at the tag. + (and (pair? x) + (memq (get-tag x) (world:current-block-tags)) + #t)) + + +(define+provide/contract (decode-linebreaks elems [maybe-linebreak-proc '(br)] + #:separator [newline (world:current-linebreak-separator)]) + ((txexpr-elements?) ((or/c txexpr-element? (txexpr-element? txexpr-element? . -> . txexpr-element?)) #:separator string?) . ->* . txexpr-elements?) + (define linebreak-proc (if (procedure? maybe-linebreak-proc) + maybe-linebreak-proc + (λ (e1 e2) maybe-linebreak-proc))) + (define elems-vec (list->vector elems)) + (filter identity + (for/list ([(item i) (in-indexed elems-vec)]) + (cond + [(or (= i 0) (= i (sub1 (vector-length elems-vec)))) item] ; pass through first & last items + [(equal? item newline) + (let ([prev (vector-ref elems-vec (sub1 i))] + [next (vector-ref elems-vec (add1 i))]) + ;; only convert if neither adjacent tag is a block + ;; (because blocks automatically force a newline before & after) + (if (or (block-txexpr? prev) (block-txexpr? next)) + #f ; flag for filtering + (linebreak-proc prev next)))] + [else item])))) + +(module-test-external + (check-equal? (decode-linebreaks '("foo" "\n" "bar")) '("foo" (br) "bar")) + (check-equal? (decode-linebreaks '("\n" "foo" "\n" "bar" "\n")) '("\n" "foo" (br) "bar" "\n")) + (check-equal? (decode-linebreaks '((p "foo") "\n" (p "bar"))) '((p "foo") (p "bar"))) + (check-equal? (decode-linebreaks '("foo" "\n" (p "bar"))) '("foo" (p "bar"))) + (check-equal? (decode-linebreaks '("foo" "moo" "bar")) '("foo" "moo" "bar")) + (check-equal? (decode-linebreaks '("foo" "moo" "bar") "moo") '("foo" "moo" "bar")) + (check-equal? (decode-linebreaks '("foo" "\n\n" "bar")) '("foo" "\n\n" "bar"))) + + +;; Find adjacent newline characters in a list and merge them into one item +;; Scribble, by default, makes each newline a separate list item. +(define+provide/contract (merge-newlines x) + (txexpr-elements? . -> . txexpr-elements?) + (define newline-pat (regexp (format "^~a+$" (world:current-newline)))) + (define (newlines? x) (and (string? x) (regexp-match newline-pat x))) + (define (merge-if-newlines xs) + (if (newlines? (car xs)) + (list (apply string-append xs)) + xs)) + (let loop ([x x]) + (if (pair? x) + (let ([xs (map loop x)]) + (append-map merge-if-newlines (slicef xs newlines?))) + x))) + +(module-test-external + (require racket/list) + (check-equal? (merge-newlines empty) empty) + (check-equal? (merge-newlines '(p "\n" "\n" "foo" "\n" "\n\n" "bar" (em "\n" "\n" "\n"))) + '(p "\n\n" "foo" "\n\n\n" "bar" (em "\n\n\n")))) + + + +;; detect paragraphs +;; todo: unit tests +(define+provide/contract (decode-paragraphs elements [maybe-wrap-proc 'p] + #:linebreak-proc [linebreak-proc decode-linebreaks] + #:force? [force-paragraph #f]) + ((txexpr-elements?) ((or/c txexpr-tag? ((listof xexpr?) . -> . txexpr?)) + #:linebreak-proc (txexpr-elements? . -> . txexpr-elements?) + #:force? boolean?) + . ->* . txexpr-elements?) + + (define (prep-paragraph-flow elems) + (linebreak-proc (merge-newlines (trimf elems whitespace?)))) + + (define (paragraph-break? x) + (define paragraph-separator (world:current-paragraph-separator)) + (define paragraph-pattern (pregexp (format "^~a+$" paragraph-separator))) + (and (string? x) (regexp-match paragraph-pattern x))) + + (define (explicit-or-implicit-paragraph-break? x) + (or (paragraph-break? x) (block-txexpr? x))) + + (define wrap-proc (if (procedure? maybe-wrap-proc) + maybe-wrap-proc + (λ(elems) (list* maybe-wrap-proc elems)))) + + (define (wrap-paragraph elems) + (if (andmap block-txexpr? elems) + elems ; leave a series of block xexprs alone + (list (wrap-proc elems)))) ; otherwise wrap in p tag + + (let ([elements (prep-paragraph-flow elements)]) + (if (ormap explicit-or-implicit-paragraph-break? elements) ; need this condition to prevent infinite recursion + ;; use append-map on wrap-paragraph rather than map to permit return of multiple elements + (append-map wrap-paragraph (append-map (λ(es) (filter-split es paragraph-break?)) (slicef elements block-txexpr?))) ; split into ¶¶, using both implied and explicit paragraph breaks + (if force-paragraph + (append-map wrap-paragraph (slicef elements block-txexpr?)) ; upconverts non-block elements to paragraphs + elements)))) + +(module-test-external + (check-equal? (decode-paragraphs '("First para" "\n\n" "Second para")) + '((p "First para") (p "Second para"))) + (check-equal? (decode-paragraphs '("First para" "\n\n" "Second para" "\n" "Second line")) + '((p "First para") (p "Second para" (br) "Second line"))) + (check-equal? (decode-paragraphs '("First para" "\n\n" (div "Second block"))) + '((p "First para") (div "Second block"))) + (check-equal? (decode-paragraphs '((div "First block") "\n\n" (div "Second block"))) + '((div "First block") (div "Second block"))) + (check-equal? (decode-paragraphs '("First para" "\n\n" "Second para") 'ns:p) + '((ns:p "First para") (ns:p "Second para"))) + (check-equal? (decode-paragraphs '("First para" "\n\n" "Second para" "\n" "Second line") + #:linebreak-proc (λ(x) (decode-linebreaks x '(newline)))) + '((p "First para") (p "Second para" (newline) "Second line"))) + (check-equal? (decode-paragraphs '("foo" "\n\n" (div "bar") (div "zam"))) + '((p "foo") (div "bar") (div "zam"))) + (check-equal? (decode-paragraphs '("foo" "\n\n" (div "bar") "\n\n" (div "zam"))) + '((p "foo") (div "bar") (div "zam"))) + + (check-equal? (decode-paragraphs '("foo")) '("foo")) + (check-equal? (decode-paragraphs '("foo") #:force? #t) '((p "foo"))) + (check-equal? (decode-paragraphs '((div "foo"))) '((div "foo"))) + (check-equal? (decode-paragraphs '((div "foo")) #:force? #t) '((div "foo"))) + (check-equal? (decode-paragraphs '("foo" "\n\n" (div "bar"))) '((p "foo") (div "bar"))) + (check-equal? (decode-paragraphs '("foo" (div "bar"))) '((p "foo") (div "bar"))) + (check-equal? (decode-paragraphs '("foo" (div "bar")) #:force? #t) '((p "foo") (div "bar"))) + (check-equal? (decode-paragraphs '("foo" (div "bar") "zam")) '((p "foo") (div "bar") (p "zam"))) + (check-equal? (decode-paragraphs '("foo" (span "zing") (div "bar") "zam")) '((p "foo" (span "zing")) (div "bar") (p "zam"))) + (check-equal? (decode-paragraphs '("foo" (span "zing") (div "bar") "zam") #:force? #t) '((p "foo" (span "zing")) (div "bar") (p "zam")))) + +(define+provide detect-paragraphs decode-paragraphs) ; bw compat +(define+provide detect-linebreaks decode-linebreaks) ; bw compat \ No newline at end of file diff --git a/pollen/file.rkt b/pollen/file.rkt new file mode 100644 index 0000000..ddd33a1 --- /dev/null +++ b/pollen/file.rkt @@ -0,0 +1,52 @@ +#lang racket/base +(require sugar/test racket/require (matching-identifiers-in #rx"-source\\?$" "private/file-utils.rkt") + (matching-identifiers-in #rx"-source-path$" "private/file-utils.rkt") + (matching-identifiers-in #rx"^get.*-source$" "private/file-utils.rkt") + (only-in "private/file-utils.rkt" ->output-path)) +(provide (all-from-out "private/file-utils.rkt")) + +;; do the tests here to verify that the right functions are available through file.rkt +(module-test-external + (require sugar/coerce pollen/world) + (check-true (preproc-source? "foo.pp")) + (check-false (preproc-source? "foo.bar")) + (check-false (preproc-source? #f)) + (check-equal? (->preproc-source-path (->path "foo.pp")) (->path "foo.pp")) + (check-equal? (->preproc-source-path (->path "foo.html")) (->path "foo.html.pp")) + (check-equal? (->preproc-source-path "foo") (->path "foo.pp")) + (check-equal? (->preproc-source-path 'foo) (->path "foo.pp")) + + (check-true (pagetree-source? (format "foo.~a" (world:current-pagetree-source-ext)))) + (check-false (pagetree-source? (format "~a.foo" (world:current-pagetree-source-ext)))) + (check-false (pagetree-source? #f)) + + (check-true (markup-source? "foo.pm")) + (check-false (markup-source? "foo.p")) + (check-false (markup-source? #f)) + (check-equal? (->markup-source-path (->path "foo.pm")) (->path "foo.pm")) + (check-equal? (->markup-source-path (->path "foo.html")) (->path "foo.html.pm")) + (check-equal? (->markup-source-path "foo") (->path "foo.pm")) + (check-equal? (->markup-source-path 'foo) (->path "foo.pm")) + + (check-true (markdown-source? "foo.html.pmd")) + (check-false (markdown-source? "foo.html")) + (check-false (markdown-source? #f)) + (check-equal? (->markdown-source-path (->path "foo.pmd")) (->path "foo.pmd")) + (check-equal? (->markdown-source-path (->path "foo.html")) (->path "foo.html.pmd")) + (check-equal? (->markdown-source-path "foo") (->path "foo.pmd")) + (check-equal? (->markdown-source-path 'foo) (->path "foo.pmd")) + + (check-false (get-source 42)) + (check-equal? (->output-path (->path "foo.pmap")) (->path "foo.pmap")) + (check-equal? (->output-path "foo.html") (->path "foo.html")) + (check-equal? (->output-path 'foo.html.p) (->path "foo.html")) + (check-equal? (->output-path (->path "/Users/mb/git/foo.html.p")) (->path "/Users/mb/git/foo.html")) + (check-equal? (->output-path "foo.xml.p") (->path "foo.xml")) + (check-equal? (->output-path 'foo.barml.p) (->path "foo.barml")) + + (check-equal? (->output-path 'foo_html.p) (->path "foo.html")) + (check-equal? (->output-path (->path "/Users/mb/git/foo_html.p")) (->path "/Users/mb/git/foo.html")) + (check-equal? (->output-path "foo_xml.p") (->path "foo.xml")) + (check-equal? (->output-path 'foo_barml.p) (->path "foo.barml")) + (check-equal? (->output-path "foo.poly.pm") (->path "foo.html")) + (check-equal? (->output-path "foo_poly.pp") (->path "foo.html"))) \ No newline at end of file diff --git a/pollen/info.rkt b/pollen/info.rkt new file mode 100644 index 0000000..5975c91 --- /dev/null +++ b/pollen/info.rkt @@ -0,0 +1,7 @@ +#lang info +(define scribblings '(("scribblings/pollen.scrbl" (multi-page)))) +(define raco-commands '(("pollen" (submod pollen/private/command raco) "issue Pollen command" #f))) +(define compile-omit-paths '("test" "tools" "server-extras" "scribblings/third-tutorial-files")) +;; it's redundant to test "pollen.scrbl" because it incorporates the other scribble sources by reference +(define test-omit-paths '("test/data" "tools" "server-extras" "scribblings/third-tutorial-files" "scribblings/pollen.scrbl")) +(define module-suffixes '(#"pp" #"pm" #"pmd" #"ptree")) diff --git a/pollen/main.rkt b/pollen/main.rkt new file mode 100644 index 0000000..962feff --- /dev/null +++ b/pollen/main.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require "private/main-base.rkt") + +(define+provide-module-begin-in-mode world:mode-preproc) ; because default mode in submodule is preproc + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-auto)) ; because default mode in file is auto diff --git a/pollen/markdown.rkt b/pollen/markdown.rkt new file mode 100644 index 0000000..3b56cac --- /dev/null +++ b/pollen/markdown.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require "private/main-base.rkt") + +(define+provide-module-begin-in-mode world:mode-markdown) + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-markdown)) diff --git a/pollen/markup.rkt b/pollen/markup.rkt new file mode 100644 index 0000000..e67952f --- /dev/null +++ b/pollen/markup.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require "private/main-base.rkt") + +(define+provide-module-begin-in-mode world:mode-markup) + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-markup)) diff --git a/pollen/misc/tutorial.rkt b/pollen/misc/tutorial.rkt new file mode 100644 index 0000000..396abc2 --- /dev/null +++ b/pollen/misc/tutorial.rkt @@ -0,0 +1,3 @@ +#lang racket/base +(require pollen/unstable/mb) +(provide smart-quotes smart-dashes) \ No newline at end of file diff --git a/mode.rkt b/pollen/mode.rkt similarity index 99% rename from mode.rkt rename to pollen/mode.rkt index 4ba0d61..a53fa17 100644 --- a/mode.rkt +++ b/pollen/mode.rkt @@ -7,6 +7,11 @@ So this file a) adapts the at-exp metalang from 6.2 b) incorporates the scribble/reader from 6.2 so that everything will work correctly in 6.0. + +Note that pollen/mode uses world:command-char, NOT (world:current-command-char), +because doing so would create a loading loop if pollen/mode were used in "pollen.rkt" +(which is a likely place to use it) +Intractable problem, unavoiable limitation. |# diff --git a/pagetree.rkt b/pollen/pagetree.rkt similarity index 82% rename from pagetree.rkt rename to pollen/pagetree.rkt index 1ebde73..5ca377d 100644 --- a/pagetree.rkt +++ b/pollen/pagetree.rkt @@ -1,14 +1,15 @@ #lang racket/base -(require racket/path racket/list) -(require "file.rkt" "world.rkt" "decode.rkt" sugar txexpr "cache.rkt") - +(require racket/path racket/list sugar txexpr) +(require "world.rkt" + "private/whitespace.rkt" + "private/file-utils.rkt" + "decode.rkt" + "cache.rkt") (define+provide current-pagetree (make-parameter #f)) - (define+provide (pagenode? x) - (->boolean (and (symbol? x) (with-handlers ([exn:fail? (λ(e) #f)]) - (not (whitespace/nbsp? (->string x))))))) + (and (symbol? x) (not (whitespace/nbsp? (symbol->string x))) #t)) (module-test-external (check-false (pagenode? "foo-bar")) @@ -21,18 +22,19 @@ (check-false (pagenode? " "))) -(define+provide (pagenodes? x) +;; for contracts: faster than (listof pagenode?) +(define (pagenodes? x) (and (list? x) (andmap pagenode? x))) (define+provide (pagenodeish? x) (with-handlers ([exn:fail? (λ(e) #f)]) - (pagenode? (->symbol x)))) + (and (->pagenode x) #t))) -(define/contract+provide (->pagenode x) - (pagenodeish? . -> . pagenode?) - (->symbol x)) +(define+provide (->pagenode x) + (with-handlers ([exn:fail? (λ(e) (raise-argument-error '->pagenode "can't convert input to pagenode" x))]) + (->symbol x))) (define+provide/contract (decode-pagetree xs) @@ -52,17 +54,17 @@ (define+provide (validate-pagetree x) (and (txexpr? x) (let ([pagenodes (pagetree->list x)]) - (and - (andmap (λ(p) (or (pagenode? p) (error (format "validate-pagetree: \"~a\" is not a valid pagenode" p)))) pagenodes) - (with-handlers ([exn:fail? (λ(e) (error (format "validate-pagetree: ~a" (exn-message e))))]) - (members-unique?/error pagenodes)) - x)))) - + (for ([p (in-list pagenodes)] + #:when (not (pagenode? p))) + (error 'validate-pagetree (format "\"~a\" is not a valid pagenode" p))) + (with-handlers ([exn:fail? (λ(e) (error 'validate-pagetree (format "~a" (exn-message e))))]) + (members-unique?/error pagenodes)) + x))) (define+provide (pagetree? x) (with-handlers ([exn:fail? (λ(e) #f)]) - (->boolean (validate-pagetree x)))) + (and (validate-pagetree x) #t))) (module-test-external (check-true (pagetree? '(foo))) @@ -78,7 +80,7 @@ (define (unique-sorted-output-paths xs) (define output-paths (map ->output-path xs)) - (define all-paths (filter visible? (remove-duplicates output-paths))) + (define all-paths (filter path-visible? (remove-duplicates output-paths))) (define path-is-directory? (λ(f) (directory-exists? (build-path dir f)))) (define-values (subdirectories files) (partition path-is-directory? all-paths)) (define-values (pagetree-sources other-files) (partition pagetree-source? files)) @@ -93,14 +95,17 @@ (define (not-pollen-cache? path) (not (member (->string path) world:cache-names))) - (if (directory-exists? dir ) - (decode-pagetree (map ->symbol (unique-sorted-output-paths (filter not-pollen-cache? (directory-list dir))))) - (error (format "directory->pagetree: directory ~a doesn't exist" dir)))) + (unless (directory-exists? dir) + (error 'directory->pagetree (format "directory ~v doesn't exist" dir))) + + (decode-pagetree (map ->pagenode (unique-sorted-output-paths (filter not-pollen-cache? (directory-list dir)))))) -(define+provide/contract (load-pagetree source-path) +(define+provide/contract (get-pagetree source-path) (pathish? . -> . pagetree?) - (cached-require source-path (world:current-main-export))) + (cached-doc source-path)) + +(define+provide load-pagetree get-pagetree) ; bw compat ;; Try loading from pagetree file, or failing that, synthesize pagetree. @@ -120,14 +125,13 @@ (let loop ([pagenode (->pagenode pnish)][subtree pt]) (define current-parent (car subtree)) (define current-children (cdr subtree)) - (if (member pagenode (map topmost-node current-children)) + (if (memq pagenode (map topmost-node current-children)) current-parent (ormap (λ(st) (loop pagenode st)) (filter subtree? current-children)))))) (if (eq? result (car pt)) (and allow-root? result) result)) - (module-test-external (define test-pagetree `(pagetree-main foo bar (one (two three)))) (check-equal? (parent 'three test-pagetree) 'two) @@ -141,7 +145,7 @@ (((or/c #f pagenodeish?)) (pagetree?) . ->* . (or/c #f pagenodes?)) (and pt p (let ([pagenode (->pagenode p)]) - (if (equal? pagenode (car pt)) + (if (eq? pagenode (car pt)) (map (λ(x) (if (list? x) (car x) x)) (cdr pt)) (ormap (λ(x) (children pagenode x)) (filter list? pt)))))) @@ -171,7 +175,7 @@ (define+provide/contract (pagetree->list pt) (pagetree? . -> . pagenodes?) ; use cdr to get rid of root tag at front - (cdr (flatten pt))) + (flatten (cdr pt))) (module-test-external (define test-pagetree `(pagetree-main foo bar (one (two three)))) @@ -182,10 +186,11 @@ #;(symbol? pagenodeish? pagetree? . -> . pagenodes?) (and pt pnish (let* ([pagenode (->pagenode pnish)] - [proc (if (equal? side 'left) takef takef-right)] + [proc (if (eq? side 'left) takef takef-right)] [pagetree-nodes (pagetree->list pt)] - [in-tree? (member pagenode pagetree-nodes)] - [result (and in-tree? (proc pagetree-nodes (λ(x) (not (equal? pagenode x)))))]) + ;; using `in-pagetree?` would require another flattening + [in-tree? (memq pagenode pagetree-nodes)] + [result (and in-tree? (proc pagetree-nodes (λ(x) (not (eq? pagenode x)))))]) (and (not (empty? result)) result)))) (module-test-internal @@ -247,4 +252,4 @@ (define+provide/contract (in-pagetree? pnish [pt (current-pagetree)]) (((or/c #f pagenodeish?)) (pagetree?) . ->* . boolean?) - (->boolean (and pnish (member pnish (pagetree->list pt))))) \ No newline at end of file + (and pnish (memq pnish (pagetree->list pt)) #t)) \ No newline at end of file diff --git a/pollen/pre.rkt b/pollen/pre.rkt new file mode 100644 index 0000000..451a31b --- /dev/null +++ b/pollen/pre.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require "private/main-base.rkt") + +(define+provide-module-begin-in-mode world:mode-preproc) + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-preproc)) diff --git a/pollen/private/cache-utils.rkt b/pollen/private/cache-utils.rkt new file mode 100644 index 0000000..a6acce8 --- /dev/null +++ b/pollen/private/cache-utils.rkt @@ -0,0 +1,79 @@ +#lang racket/base +(require "file-utils.rkt" "../world.rkt" "project.rkt" file/cache racket/file sugar/coerce compiler/cm) +(provide (all-defined-out)) + +(define (paths->key source-path [template-path #f]) + ;; key is list of file + mod-time pairs, use #f for missing + (define path-strings (append (list source-path) + ;; if template has a source file, track that instead + (append (list (and template-path (or (get-source template-path) template-path))) + ;; is either list of files or (list #f) + (->list (get-directory-require-files source-path))))) + ;; can't use relative paths for cache keys because source files include `here-path` which is absolute. + ;; problem is that cache could appear valid on another filesystem (based on relative pathnames & mod dates) + ;; but would actually be invalid (because the `here-path` names are wrong). + (define poly-flag (and (has-inner-poly-ext? source-path) (world:current-poly-target))) + (define pollen-env (getenv world:env-name)) + (define path+mod-time-pairs + (map (λ(ps) (and ps (let ([cp (->complete-path ps)]) + (cons (path->string cp) (with-handlers ([exn:fail? (λ _ 0)]) + (file-or-directory-modify-seconds cp)))))) path-strings)) + (list* pollen-env poly-flag path+mod-time-pairs)) + + +(define (key->source-path key) + (car (caddr key))) + +(require sugar/test) +(module-test-internal + (define ps "/users/nobody/project/source.html.pm") + (check-equal? (key->source-path (paths->key ps)) ps)) + +(define-namespace-anchor cache-utils-module-ns) +(define (path->hash path) + ;; new namespace forces dynamic-require to re-instantiate 'path' + ;; otherwise it gets cached in current namespace. + (define drfs (get-directory-require-files path)) + (for-each managed-compile-zo (or drfs null)) + (define path-dir (dirname path)) + (apply hash + (let ([doc-key (world:current-main-export)] + [meta-key (world:current-meta-export)]) + (parameterize ([current-namespace (make-base-namespace)] + [current-directory path-dir]) + ;; I monkeyed around with using the metas submodule to pull out the metas (for speed) + ;; but in practice most files get their doc requested too. + ;; so it's just simpler to get both at once and be done with it. + ;; the savings of avoiding two cache fetches at the outset outweighs + ;; the benefit of not reloading doc when you just need metas. + (namespace-attach-module (namespace-anchor->namespace cache-utils-module-ns) 'pollen/world) ; brings in params + (list doc-key (dynamic-require path doc-key) meta-key (dynamic-require path meta-key)))))) + +(define (my-make-directory* dir) + (let-values ([(base name dir?) (split-path dir)]) + (when (and (path? base) (not (directory-exists? base))) + (my-make-directory* base)) + (unless (directory-exists? dir) + (with-handlers ([exn:fail:filesystem:exists? void]) + (make-directory dir))))) + +(define (make-cache-dirs path) + (define path-dir (dirname path)) + (define cache-dir (build-path path-dir (world:current-cache-dir-name))) + (define private-cache-dir (build-path cache-dir "private")) + (my-make-directory* private-cache-dir) ; will also make cache-dir, if needed + (values cache-dir private-cache-dir)) + +(define (cache-ref! key path-hash-thunk) + (define path (key->source-path key)) + (define-values (cache-dir private-cache-dir) (make-cache-dirs path)) + (define-values (path-dir path-filename _) (split-path path)) + (define dest-file (build-path cache-dir (format "~a.rktd" path-filename))) + (cache-file dest-file + #:exists-ok? #t + key + private-cache-dir + (λ _ + (write-to-file (path-hash-thunk) dest-file #:exists 'replace)) + #:max-cache-size (world:current-compile-cache-max-size)) + (file->value dest-file)) \ No newline at end of file diff --git a/command.rkt b/pollen/private/command.rkt similarity index 96% rename from command.rkt rename to pollen/private/command.rkt index 84ca595..0c2cd6e 100644 --- a/command.rkt +++ b/pollen/private/command.rkt @@ -1,5 +1,5 @@ #lang racket/base -(require pollen/world pollen/render racket/file racket/path sugar/coerce pollen/file pollen/pagetree racket/string racket/list racket/vector racket/cmdline) +(require pollen/world pollen/render racket/file racket/path sugar/coerce "file-utils.rkt" pollen/pagetree racket/string racket/list racket/vector racket/cmdline) ;; The use of dynamic-require throughout this file is intentional: ;; this way, low-dependency raco commands (like "version") are faster. @@ -61,11 +61,11 @@ publish [dir] [dest] copy project in dir to dest without source files (warning: overwrites existing dest dir) setup preload cache reset reset cache -version print the version (~a)" (world:current-server-port) (world:current-pollen-version)))) +version print the version (~a)" (world:current-server-port) world:version))) (define (handle-version) - (displayln (world:current-pollen-version))) + (displayln world:version)) (define (handle-reset directory-maybe) @@ -111,10 +111,10 @@ version print the version (~a)" (world:current-server-port) (worl [else (displayln (format "rendering preproc & pagetree files in directory ~a" dir)) preprocs-and-static-pagetrees]))) - (apply render-batch batch-to-render))) + (apply render* batch-to-render))) (begin ; first arg is a file (displayln (format "rendering ~a" (string-join (map ->string path-args) " "))) - (apply render-batch path-args))))) + (apply render* path-args))))) (define (handle-start directory-maybe [port #f]) (when (not (directory-exists? directory-maybe)) @@ -122,7 +122,7 @@ version print the version (~a)" (world:current-server-port) (worl (parameterize ([world:current-project-root directory-maybe] [world:current-server-port (or port world:default-port)]) (displayln "Starting project server ...") - ((dynamic-require 'pollen/server 'start-server)))) + ((dynamic-require 'pollen/private/project-server 'start-server)))) (define (handle-publish directory-maybe rest-args arg-command-name) diff --git a/debug.rkt b/pollen/private/debug.rkt similarity index 100% rename from debug.rkt rename to pollen/private/debug.rkt diff --git a/doclang-raw.rkt b/pollen/private/doclang-raw.rkt similarity index 100% rename from doclang-raw.rkt rename to pollen/private/doclang-raw.rkt diff --git a/drracket-buttons.rkt b/pollen/private/drracket-buttons.rkt similarity index 100% rename from drracket-buttons.rkt rename to pollen/private/drracket-buttons.rkt diff --git a/pollen/private/escape-ext.rkt b/pollen/private/escape-ext.rkt new file mode 100644 index 0000000..243c4f7 --- /dev/null +++ b/pollen/private/escape-ext.rkt @@ -0,0 +1,4 @@ +#lang racket/base +(require "../world.rkt" sugar/file sugar/coerce sugar/test) +(provide (all-defined-out)) + diff --git a/file.rkt b/pollen/private/file-utils.rkt similarity index 62% rename from file.rkt rename to pollen/private/file-utils.rkt index d6af56e..4f2686b 100644 --- a/file.rkt +++ b/pollen/private/file-utils.rkt @@ -1,21 +1,21 @@ #lang racket/base (require (for-syntax racket/base racket/syntax)) -(require racket/contract racket/path) -(require (only-in racket/path filename-extension)) -(require "world.rkt" sugar/define sugar/file sugar/string sugar/coerce sugar/test) +(require racket/path) +(require "../world.rkt" sugar/define sugar/file sugar/string sugar/coerce sugar/test) + ;; because it comes up all the time -(define+provide/contract (dirname path) - (coerce/path? . -> . path?) +(define+provide (dirname path) + ;(coerce/path? . -> . path?) (define-values (dir name dir?) (split-path path)) dir) -(define+provide/contract (find-upward-from starting-path filename-to-find - [exists-proc file-exists?]) +(define+provide (find-upward-from starting-path filename-to-find + [exists-proc file-exists?]) ;; use exists-proc to permit less strict matching. ;; for instance, maybe it's ok to find the source for the path. - ((coerce/path? coerce/path?)((path? . -> . any/c)) . ->* . (or/c #f path?)) + ;((coerce/path? coerce/path?)((path? . -> . any/c)) . ->* . (or/c #f path?)) (parameterize ([current-directory (dirname (->complete-path starting-path))]) (let loop ([dir (current-directory)][path filename-to-find]) (and dir ; dir is #f when it hits the top of the filesystem @@ -27,11 +27,11 @@ ;; for files like svg that are not source in pollen terms, ;; but have a textual representation separate from their display. -(define+provide/contract (sourceish? x) - (any/c . -> . coerce/boolean?) +(define+provide (sourceish? x) + ;(any/c . -> . coerce/boolean?) (define sourceish-extensions (list "svg")) (with-handlers ([exn:fail? (λ(e) #f)]) - (member (get-ext x) sourceish-extensions))) + (and (member (get-ext x) sourceish-extensions) #t))) (module-test-external (check-true (sourceish? "foo.svg")) @@ -40,8 +40,8 @@ ;; compare directories by their exploded path elements, ;; not by equal?, which will give wrong result if no slash on the end -(define+provide/contract (directories-equal? dirx diry) - (coerce/path? coerce/path? . -> . coerce/boolean?) +(define+provide (directories-equal? dirx diry) + ;(coerce/path? coerce/path? . -> . coerce/boolean?) (equal? (explode-path dirx) (explode-path diry))) (module-test-external @@ -49,31 +49,30 @@ (check-false (directories-equal? "/Users/MB/foo" "Users/MB/foo"))) -;; helper function for pagetree -;; make paths absolute to test whether files exist, -;; then convert back to relative -(define+provide/contract (visible? path) - (coerce/path? . -> . coerce/boolean?) - (not ((->string path) . starts-with? . "."))) - (define (paths? x) (and (list? x) (andmap path? x))) (define (complete-paths? x) (and (list? x) (andmap complete-path? x))) -(define+provide/contract (visible-files dir) - (pathish? . -> . paths?) - (filter visible? - (map (λ(p) (find-relative-path dir p)) - (filter file-exists? - (directory-list dir #:build? #t))))) +(define+provide (path-visible? path) + ;; make paths absolute to test whether files exist, + ;; then convert back to relative + (not (regexp-match #rx"^\\." (path->string path)))) + +(define+provide (visible-files dir) + (let ([dir (->path dir)]) + (filter path-visible? + (map (λ(p) (find-relative-path dir p)) + (filter file-exists? + (directory-list dir #:build? #t)))))) -(define+provide/contract (escape-last-ext x [escape-char (world:current-extension-escape-char)]) - ((pathish?) (char?) . ->* . coerce/path?) +(define+provide (escape-last-ext x [escape-char (world:current-extension-escape-char)]) + ;((pathish?) (char?) . ->* . coerce/path?) ;; if x has a file extension, reattach it with the escape char (define current-ext (get-ext x)) - (if current-ext - (format "~a~a~a" (->string (remove-ext x)) escape-char current-ext) - x)) + (->path + (if current-ext + (format "~a~a~a" (->string (remove-ext x)) escape-char current-ext) + x))) (module-test-external (require sugar/coerce) @@ -84,25 +83,26 @@ (define second cadr) (define third caddr) (define (last x) (car (reverse x))) -(define+provide/contract (unescape-ext x [escape-char (world:current-extension-escape-char)]) - ((coerce/string?) (char?) . ->* . coerce/path?) +(define+provide (unescape-ext x [escape-char (world:current-extension-escape-char)]) + ;((coerce/string?) (char?) . ->* . coerce/path?) ;; if x has an escaped extension, unescape it. (define-values (base name dir?) (split-path x)) - (cond - [dir? x] - [else - (define x-parts (explode-path x)) - (define filename (last x-parts)) - (define escaped-extension-pat (pregexp (format "(.*)[~a](\\S+)$" escape-char))) - (define results (regexp-match escaped-extension-pat (->string filename))) - (if results - (let* ([filename-without-ext (second results)] - [ext (third results)] - [new-filename (add-ext filename-without-ext ext)]) - (if (eq? base 'relative) - new-filename - (build-path base new-filename))) - x)])) + (->path + (cond + [dir? x] + [else + (define x-parts (explode-path x)) + (define filename (last x-parts)) + (define escaped-extension-pat (pregexp (format "(.*)[~a](\\S+)$" escape-char))) + (define results (regexp-match escaped-extension-pat (->string filename))) + (if results + (let* ([filename-without-ext (second results)] + [ext (third results)] + [new-filename (add-ext filename-without-ext ext)]) + (if (eq? base 'relative) + new-filename + (build-path base new-filename))) + x)]))) (module-test-external @@ -152,29 +152,27 @@ (with-syntax ([world:current-stem-source-ext (format-id stx "world:current-~a-source-ext" #'stem)] [stem-source? (format-id stx "~a-source?" #'stem)] [get-stem-source (format-id stx "get-~a-source" #'stem)] - [has-stem-source? (format-id stx "has-~a-source?" #'stem)] [has/is-stem-source? (format-id stx "has/is-~a-source?" #'stem)] [->stem-source-path (format-id stx "->~a-source-path" #'stem)] [->stem-source-paths (format-id stx "->~a-source-paths" #'stem)] [->stem-source+output-paths (format-id stx "->~a-source+output-paths" #'stem)]) #`(begin ;; does file have particular extension - (define+provide (stem-source? x) - (->boolean (and (pathish? x) (has-ext? (->path x) (world:current-stem-source-ext))))) + (define+provide/contract (stem-source? x) + (any/c . -> . boolean?) + (and (pathish? x) (has-ext? (->path x) (world:current-stem-source-ext)) #t)) ;; non-theoretical: want the first possible source that exists in the filesystem - (define+provide (get-stem-source x) - (and (pathish? x) - (let ([source-paths (->stem-source-paths (->path x))]) - (and source-paths (ormap (λ(sp) (and (file-exists? sp) sp)) source-paths))))) - - ;; does the source-ified version of the file exist - (define+provide (has-stem-source? x) - (->boolean (get-stem-source x))) + (define+provide/contract (get-stem-source x) + (coerce/path? . -> . (or/c #f path?)) + (let ([source-paths (->stem-source-paths x)]) + (and source-paths (for/first ([sp (in-list source-paths)] + #:when (file-exists? sp)) + sp)))) ;; it's a file-ext source file, or a file that's the result of a file-ext source (define+provide (has/is-stem-source? x) - (->boolean (and (pathish? x) (ormap (λ(proc) (proc (->path x))) (list stem-source? has-stem-source?))))) + (->boolean (and (pathish? x) (ormap (λ(proc) (proc (->path x))) (list stem-source? get-stem-source))))) ;; get first possible source path (does not check filesystem) (define+provide/contract (->stem-source-path x) @@ -183,8 +181,7 @@ (and paths (car paths))) ;; get all possible source paths (does not check filesystem) - (define+provide/contract (->stem-source-paths x) - (pathish? . -> . (or/c #f (non-empty-listof path?))) + (define (->stem-source-paths x) (define results (if (stem-source? x) (list x) ; already has the source extension #,(if (eq? (syntax->datum #'stem) 'scribble) @@ -208,91 +205,61 @@ (and results (map ->path results))) ;; coerce either a source or output file to both - (define+provide/contract (->stem-source+output-paths path) - (pathish? . -> . (values path? path?)) + (define+provide (->stem-source+output-paths path) + ;(pathish? . -> . (values path? path?)) ;; get the real source path if available, otherwise a theoretical path (values (->complete-path (or (get-stem-source path) (->stem-source-path path))) (->complete-path (->output-path path))))))])) (make-source-utility-functions preproc) -(define+provide/contract (->source+output-paths source-or-output-path) - (complete-path? . -> . (values complete-path? complete-path?)) +(define+provide (->source+output-paths source-or-output-path) + ;(complete-path? . -> . (values complete-path? complete-path?)) ;; file-proc returns two values, but ormap only wants one (define file-proc (ormap (λ(test file-proc) (and (test source-or-output-path) file-proc)) - (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source? has/is-template-source?) - (list ->null-source+output-paths ->preproc-source+output-paths ->markup-source+output-paths ->scribble-source+output-paths ->markdown-source+output-paths ->template-source+output-paths))) + (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source? ) + (list ->null-source+output-paths ->preproc-source+output-paths ->markup-source+output-paths ->scribble-source+output-paths ->markdown-source+output-paths ))) (file-proc source-or-output-path)) -(module-test-external - (require sugar/coerce) - (check-true (preproc-source? "foo.pp")) - (check-false (preproc-source? "foo.bar")) - (check-false (preproc-source? #f)) +(module-test-internal + (require sugar/coerce) (check-equal? (->preproc-source-paths (->path "foo.pp")) (list (->path "foo.pp"))) (check-equal? (->preproc-source-paths (->path "foo.html")) (list (->path "foo.html.pp") (->path "foo_html.pp") (->path "foo.poly.pp") (->path "foo_poly.pp"))) (check-equal? (->preproc-source-paths "foo") (list (->path "foo.pp"))) - (check-equal? (->preproc-source-paths 'foo) (list (->path "foo.pp"))) - (check-equal? (->preproc-source-path (->path "foo.pp")) (->path "foo.pp")) - (check-equal? (->preproc-source-path (->path "foo.html")) (->path "foo.html.pp")) - (check-equal? (->preproc-source-path "foo") (->path "foo.pp")) - (check-equal? (->preproc-source-path 'foo) (->path "foo.pp"))) + (check-equal? (->preproc-source-paths 'foo) (list (->path "foo.pp")))) (make-source-utility-functions null) (make-source-utility-functions pagetree) -(module-test-external - (require pollen/world) - (check-true (pagetree-source? (format "foo.~a" (world:current-pagetree-source-ext)))) - (check-false (pagetree-source? (format "~a.foo" (world:current-pagetree-source-ext)))) - (check-false (pagetree-source? #f))) (make-source-utility-functions markup) -(module-test-external + +(module-test-internal (require sugar/coerce) - (check-true (markup-source? "foo.pm")) - (check-false (markup-source? "foo.p")) - (check-false (markup-source? #f)) (check-equal? (->markup-source-paths (->path "foo.pm")) (list (->path "foo.pm"))) (check-equal? (->markup-source-paths (->path "foo.html")) (list (->path "foo.html.pm") (->path "foo_html.pm") (->path "foo.poly.pm") (->path "foo_poly.pm"))) (check-equal? (->markup-source-paths "foo") (list (->path "foo.pm"))) - (check-equal? (->markup-source-paths 'foo) (list (->path "foo.pm"))) - (check-equal? (->markup-source-path (->path "foo.pm")) (->path "foo.pm")) - (check-equal? (->markup-source-path (->path "foo.html")) (->path "foo.html.pm")) - (check-equal? (->markup-source-path "foo") (->path "foo.pm")) - (check-equal? (->markup-source-path 'foo) (->path "foo.pm"))) + (check-equal? (->markup-source-paths 'foo) (list (->path "foo.pm")))) (make-source-utility-functions markdown) -(module-test-external + +(module-test-internal (require sugar/coerce) - (check-true (markdown-source? "foo.html.pmd")) - (check-false (markdown-source? "foo.html")) - (check-false (markdown-source? #f)) (check-equal? (->markdown-source-paths (->path "foo.pmd")) (list (->path "foo.pmd"))) (check-equal? (->markdown-source-paths (->path "foo.html")) (list (->path "foo.html.pmd") (->path "foo_html.pmd") - (->path "foo.poly.pmd") (->path "foo_poly.pmd"))) + (->path "foo.poly.pmd") (->path "foo_poly.pmd"))) (check-equal? (->markdown-source-paths "foo") (list (->path "foo.pmd"))) - (check-equal? (->markdown-source-paths 'foo) (list (->path "foo.pmd"))) - (check-equal? (->markdown-source-path (->path "foo.pmd")) (->path "foo.pmd")) - (check-equal? (->markdown-source-path (->path "foo.html")) (->path "foo.html.pmd")) - (check-equal? (->markdown-source-path "foo") (->path "foo.pmd")) - (check-equal? (->markdown-source-path 'foo) (->path "foo.pmd"))) + (check-equal? (->markdown-source-paths 'foo) (list (->path "foo.pmd")))) -(make-source-utility-functions template) -(module-test-external - (check-true (template-source? "foo.html.pt")) - (check-false (template-source? "foo.html")) - (check-false (template-source? #f))) - (make-source-utility-functions scribble) -(define/contract+provide (get-source path) +(define+provide/contract (get-source path) (coerce/path? . -> . (or/c #f path?)) (ormap (λ(proc) (proc path)) (list get-markup-source get-markdown-source get-preproc-source get-null-source get-scribble-source))) @@ -302,7 +269,7 @@ (define+provide/contract (->output-path x) (coerce/path? . -> . coerce/path?) (cond - [(or (markup-source? x) (preproc-source? x) (null-source? x) (markdown-source? x) (template-source? x)) + [(or (markup-source? x) (preproc-source? x) (null-source? x) (markdown-source? x)) (define output-path (unescape-ext (remove-ext x))) (if (has-poly-ext? output-path) (add-ext (remove-ext output-path) (or (world:current-poly-target) (car (world:current-poly-targets)))) @@ -310,28 +277,13 @@ [(scribble-source? x) (add-ext (remove-ext x) 'html)] [else x])) -(module-test-external - (require sugar/coerce) - (check-equal? (->output-path (->path "foo.pmap")) (->path "foo.pmap")) - (check-equal? (->output-path "foo.html") (->path "foo.html")) - (check-equal? (->output-path 'foo.html.p) (->path "foo.html")) - (check-equal? (->output-path (->path "/Users/mb/git/foo.html.p")) (->path "/Users/mb/git/foo.html")) - (check-equal? (->output-path "foo.xml.p") (->path "foo.xml")) - (check-equal? (->output-path 'foo.barml.p) (->path "foo.barml")) - - (check-equal? (->output-path 'foo_html.p) (->path "foo.html")) - (check-equal? (->output-path (->path "/Users/mb/git/foo_html.p")) (->path "/Users/mb/git/foo.html")) - (check-equal? (->output-path "foo_xml.p") (->path "foo.xml")) - (check-equal? (->output-path 'foo_barml.p) (->path "foo.barml")) - (check-equal? (->output-path "foo.poly.pm") (->path "foo.html")) - (check-equal? (->output-path "foo_poly.pp") (->path "foo.html"))) - -(define+provide/contract (project-files-with-ext ext) - (coerce/symbol? . -> . complete-paths?) - (map ->complete-path (filter (λ(i) (has-ext? i ext)) (directory-list (world:current-project-root))))) - - -(define+provide (racket-source? x) + +(define+provide (project-files-with-ext ext) + ;(coerce/symbol? . -> . complete-paths?) + (map ->complete-path (filter (λ(i) (has-ext? i (->symbol ext))) (directory-list (world:current-project-root))))) + + +(define (racket-source? x) (->boolean (and (pathish? x) (has-ext? (->path x) 'rkt)))) @@ -354,7 +306,6 @@ preproc-source? markup-source? markdown-source? - template-source? pagetree-source? scribble-source? null-source? diff --git a/include-template.rkt b/pollen/private/include-template.rkt similarity index 100% rename from include-template.rkt rename to pollen/private/include-template.rkt diff --git a/language-info.rkt b/pollen/private/language-info.rkt similarity index 51% rename from language-info.rkt rename to pollen/private/language-info.rkt index b02483a..7894ba1 100644 --- a/language-info.rkt +++ b/pollen/private/language-info.rkt @@ -3,5 +3,5 @@ (define (get-language-info top-here-path) (λ(key default) (case key - [(configure-runtime) `(#(pollen/runtime-config configure ,top-here-path))] + [(configure-runtime) `(#(pollen/private/runtime-config configure ,top-here-path))] [else default]))) \ No newline at end of file diff --git a/main-base.rkt b/pollen/private/main-base.rkt similarity index 59% rename from main-base.rkt rename to pollen/private/main-base.rkt index 50188ba..51fa099 100644 --- a/main-base.rkt +++ b/pollen/private/main-base.rkt @@ -1,25 +1,7 @@ #lang racket/base -(require (for-syntax racket/base syntax/strip-context racket/syntax pollen/world racket/list) pollen/decode pollen/pagetree racket/list pollen/world markdown) - -(provide (all-defined-out) (all-from-out pollen/world)) - -(define-for-syntax (split-metas tree) - (define (meta-matcher x) ; meta has form (define-meta key value) - (and (list? x) (>= (length x) 3) (eq? (first x) (world:current-define-meta-name)))) - (define matches empty) - (define rest - (let loop ([x tree]) - (cond - [(meta-matcher x) - (set! matches (cons x matches)) - (loop empty)] - [(list? x) - (define-values (new-matches rest) (partition meta-matcher x)) - (set! matches (append new-matches matches)) - (map loop rest)] - [else x]))) - (let ([meta-key second][meta-value third]) - (values (map meta-key matches) (map meta-value matches) rest))) +(require (for-syntax racket/base syntax/strip-context racket/syntax "../world.rkt" "split-metas.rkt") + "to-string.rkt" "../pagetree.rkt" "../world.rkt") ; need world here to resolve PARSER-MODE-ARG later +(provide (all-defined-out)) (define-syntax-rule (define+provide-module-begin-in-mode PARSER-MODE-ARG) (begin @@ -28,39 +10,45 @@ (define-syntax (pollen-module-begin stx) (syntax-case stx () [(_ EXPR (... ...)) - (let-values ([(meta-keys meta-values expr-without-metas) (split-metas (syntax->datum #'(EXPR (... ...))))]) + (let-values ([(meta-keys meta-values expr-without-metas) (split-metas (syntax->datum #'(EXPR (... ...))) (world:current-define-meta-name))]) (with-syntax ([(EXPR-WITHOUT-METAS (... ...)) (datum->syntax #'(EXPR (... ...)) expr-without-metas)] [(KEY (... ...)) (datum->syntax #'(EXPR (... ...)) meta-keys)] [(VALUE (... ...)) (datum->syntax #'(EXPR (... ...)) meta-values)] [METAS (format-id #'(EXPR (... ...)) "~a" (world:current-meta-export))] [META-MOD (format-symbol "~a" (world:current-meta-export))] + [ROOT (format-id #'(EXPR (... ...)) "~a" (world:current-main-root-node))] + [NEWLINE (datum->syntax #'(EXPR (... ...)) (world:current-newline))] + [MODE-PAGETREE (datum->syntax #'(EXPR (... ...)) world:mode-pagetree)] + [MODE-MARKUP (datum->syntax #'(EXPR (... ...)) world:mode-markup)] + [MODE-MARKDOWN (datum->syntax #'(EXPR (... ...)) world:mode-markdown)] [DOC (format-id #'(EXPR (... ...)) "~a" (world:current-main-export))] [DOC-RAW (generate-temporary)]); prevents conflicts with other imported Pollen sources (replace-context #'(EXPR (... ...)) #'(#%module-begin (module META-MOD racket/base (provide (all-defined-out)) - (define METAS (apply hash (append (list 'KEY VALUE) (... ...))))) + (define METAS (apply hasheq (append (list 'KEY VALUE) (... ...))))) - (module inner pollen/doclang-raw + (module inner pollen/private/doclang-raw DOC-RAW ; positional arg for doclang-raw that sets name of export. (require pollen/top pollen/world) (require (submod ".." META-MOD)) - (provide (all-defined-out) #%top (all-from-out pollen/world (submod ".." META-MOD))) + (provide (all-defined-out) #%top (all-from-out (submod ".." META-MOD))) EXPR-WITHOUT-METAS (... ...)) (require 'inner) + (define DOC (let* ([parser-mode-undefined? (procedure? inner:parser-mode)] ; if undefined, #%top makes it a procedure [parser-mode (if parser-mode-undefined? PARSER-MODE-ARG inner:parser-mode)] [proc (cond - [(eq? parser-mode world:mode-pagetree) (λ xs (decode-pagetree xs))] - [(eq? parser-mode world:mode-markup) root] ; if `root` undefined, it becomes a default tag function - [(eq? parser-mode world:mode-markdown) - (λ xs (apply root (apply (compose1 parse-markdown string-append) (map to-string xs))))] - [else ; for preprocessor output, just make a string - (λ xs (apply string-append (map to-string xs)))])] + [(eq? parser-mode 'MODE-PAGETREE) decode-pagetree] + [(eq? parser-mode 'MODE-MARKUP) (λ(xs) (apply ROOT xs))] ; if `root` undefined, it becomes a default tag function + [(eq? parser-mode 'MODE-MARKDOWN) + (λ(xs) (apply ROOT ((dynamic-require 'markdown 'parse-markdown) (apply string-append (map to-string xs)))))] + [else (λ(xs) (apply string-append (map to-string xs)))])] ; string output for preprocessor ;; drop leading newlines, as they're often the result of `defines` and `requires` - [doc-elements (dropf DOC-RAW (λ(ln) (equal? ln "\n")))]) - (apply proc doc-elements))) + [doc-elements (or (memf (λ(ln) (not (equal? ln NEWLINE))) DOC-RAW) null)]) + (proc doc-elements))) + (provide DOC METAS (except-out (all-from-out 'inner) DOC-RAW #%top))))))])))) ; hide internal exports \ No newline at end of file diff --git a/pipe.py b/pollen/private/pipe.py similarity index 100% rename from pipe.py rename to pollen/private/pipe.py diff --git a/pollen/private/preheat-cache.rkt b/pollen/private/preheat-cache.rkt new file mode 100644 index 0000000..26d4712 --- /dev/null +++ b/pollen/private/preheat-cache.rkt @@ -0,0 +1,53 @@ +#lang racket/base +(require "../world.rkt" "../file.rkt" racket/file "cache-utils.rkt" "debug.rkt" racket/path racket/place sugar/list) + +(define (preheat-cache [starting-dir (world:current-project-root)]) + (when (or (not (path-string? starting-dir)) (not (directory-exists? starting-dir))) + (error 'preheat-cache (format "~a is not a directory" starting-dir))) + + (define max-places 8) ; number of parallel processes to spawn at a time + + (define paths-that-should-be-cached (for/list ([path (in-directory starting-dir)] + #:when (or (preproc-source? path) + (markup-source? path) + (markdown-source? path) + (pagetree-source? path))) + path)) + + ;; if a file is already in the cache, no need to hit it again. + ;; this allows partially completed preheat jobs to resume. + (define uncached-paths (filter + (λ(path) + ;; #t = not cached; #f = already cached + ;; seems like it would be slow to load cache.rktd but it's not. + (define-values (_ private-cache-dir) (make-cache-dirs path)) + (define cache-db-file (build-path private-cache-dir "cache.rktd")) + (cond + [(not (file-exists? cache-db-file)) #t] + [else (define cache-db (file->value cache-db-file)) + (not (hash-has-key? cache-db (paths->key path)))])) paths-that-should-be-cached)) + + ;; compile a path inside a place (= parallel processing) + (define (path-into-place path) + (message (format "caching: ~a" (find-relative-path starting-dir path))) + (define p (place ch + (define path (place-channel-get ch)) + (define-values (path-dir path-name _) (split-path path)) + (message (format "compiling: ~a" path-name)) + ;; use #f to signal compile error. Otherwise allow errors to pass. + (define result (with-handlers ([exn:fail? (λ _ (message (format "compile failed: ~a" path-name)) #f)]) + (path->hash path))) + (place-channel-put ch result))) + (place-channel-put p path) + p) + + ;; compile the paths in groups, so they can be incrementally saved. + ;; that way, if there's a failure, the progress is preserved. + ;; but the slowest file in a group will prevent further progress. + (for ([path-group (in-list (slice-at uncached-paths max-places))]) + (define path-places (map path-into-place path-group)) + (for ([path (in-list path-group)] + [ppl (in-list path-places)]) + (define result (place-channel-get ppl)) + (when result ; #f is used to signal compile error + (cache-ref! (paths->key path) (λ _ result)))))) \ No newline at end of file diff --git a/server-routes.rkt b/pollen/private/project-server-routes.rkt similarity index 98% rename from server-routes.rkt rename to pollen/private/project-server-routes.rkt index a774d79..64dfe3a 100644 --- a/server-routes.rkt +++ b/pollen/private/project-server-routes.rkt @@ -5,7 +5,7 @@ (require web-server/http/request-structs) (require web-server/http/response-structs) (require 2htdp/image) -(require "world.rkt" "render.rkt" sugar txexpr "file.rkt" "debug.rkt" "pagetree.rkt" "cache.rkt") +(require "../world.rkt" "../render.rkt" sugar txexpr "file-utils.rkt" "debug.rkt" "../pagetree.rkt" "../cache.rkt") (module+ test (require rackunit)) @@ -203,7 +203,7 @@ (define (ineligible-path? x) (member x (world:current-paths-excluded-from-dashboard))) (define directory-pagetree (with-handlers ([exn:fail:contract? (λ _ (directory->pagetree dashboard-dir))]) - (cached-require (->path dashboard-ptree) (world:current-main-export)))) + (cached-doc (->path dashboard-ptree)))) (define project-paths (filter-not ineligible-path? (map ->path (pagetree->list directory-pagetree)))) diff --git a/server.rkt b/pollen/private/project-server.rkt similarity index 82% rename from server.rkt rename to pollen/private/project-server.rkt index 6be4c68..2251009 100755 --- a/server.rkt +++ b/pollen/private/project-server.rkt @@ -3,11 +3,11 @@ (require racket/list web-server/servlet-env web-server/dispatch) -(require "server-routes.rkt" +(require "project-server-routes.rkt" "debug.rkt" - "world.rkt" - "file.rkt" - "cache.rkt") + "../world.rkt" + "../file.rkt" + "../cache.rkt") (provide start-server) @@ -19,7 +19,7 @@ [((string-arg) ... "out" (string-arg)) route-out] [else route-default])) - (message (format "Welcome to Pollen ~a" (world:current-pollen-version)) (format "(Racket ~a)" (version))) + (message (format "Welcome to Pollen ~a" world:version) (format "(Racket ~a)" (version))) (message (format "Project root is ~a" (world:current-project-root))) (define server-name (format "http://localhost:~a" (world:current-server-port))) diff --git a/pollen/private/project.rkt b/pollen/private/project.rkt new file mode 100644 index 0000000..8c08c94 --- /dev/null +++ b/pollen/private/project.rkt @@ -0,0 +1,32 @@ +#lang racket/base +(require sugar/define + sugar/coerce + "../world.rkt" + "file-utils.rkt") + +(define+provide/contract (get-directory-require-files source-arg) + (pathish? . -> . (or/c #f (λ(xs) (and (list? xs) (andmap complete-path? xs))))) + (define source-path (->path source-arg)) + (define require-filenames (list world:directory-require)) + (define identity (λ(x) x)) + (define possible-requires (filter identity (map (λ(f) (find-upward-from source-path f)) require-filenames))) + (and (pair? possible-requires) possible-requires)) + + +(define+provide/contract (require+provide-directory-require-files here-arg #:provide [provide #t]) + (pathish? . -> . list?) + (define here-path (->path here-arg)) + (define (put-file-in-require-form file) `(file ,(path->string file))) + (define directory-require-files (get-directory-require-files here-path)) + (if directory-require-files + (let ([files-in-require-form (map put-file-in-require-form directory-require-files)]) + `(begin + (require ,@files-in-require-form) + ,@(if provide + (list `(provide (all-from-out ,@files-in-require-form))) + null))) + '(begin))) + + +(define+provide (require-directory-require-files here-path) + (require+provide-directory-require-files here-path #:provide #f)) \ No newline at end of file diff --git a/reader-base.rkt b/pollen/private/reader-base.rkt similarity index 93% rename from reader-base.rkt rename to pollen/private/reader-base.rkt index 8f2d575..48af025 100644 --- a/reader-base.rkt +++ b/pollen/private/reader-base.rkt @@ -1,6 +1,6 @@ #lang racket/base (require racket/syntax syntax/strip-context racket/class) -(require (only-in scribble/reader make-at-reader) pollen/world pollen/project racket/list) +(require (only-in scribble/reader make-at-reader) pollen/world "project.rkt" racket/list) (provide define+provide-reader-in-mode (all-from-out pollen/world)) @@ -51,12 +51,12 @@ (prefix-out inner: parser-mode)) ; avoids conflicts with importing modules DIRECTORY-REQUIRES SOURCE-LINE ...) - (require (submod pollen/runtime-config show) 'POLLEN-MOD) + (require (submod pollen/private/runtime-config show) 'POLLEN-MOD) (provide (all-from-out 'POLLEN-MOD)) (show DOC inner:parser-mode HERE-PATH))))) ; HERE-PATH acts as "local" runtime config (syntax-property post-parser-syntax 'module-language - `#(pollen/language-info get-language-info ,reader-here-path)))) ; reader-here-path acts as "top" runtime config + `#(pollen/private/language-info get-language-info ,reader-here-path)))) ; reader-here-path acts as "top" runtime config (define-syntax-rule (define+provide-reader-in-mode mode) (begin @@ -85,7 +85,7 @@ (my-make-scribble-inside-lexer #:command-char my-command-char)] [else default])] [(drracket:toolbar-buttons) - (define my-make-drracket-buttons (dynamic-require 'pollen/drracket-buttons 'make-drracket-buttons)) + (define my-make-drracket-buttons (dynamic-require 'pollen/private/drracket-buttons 'make-drracket-buttons)) (my-make-drracket-buttons my-command-char)])] [else default])))) (provide (rename-out [custom-read read] [custom-read-syntax read-syntax]) get-info))) \ No newline at end of file diff --git a/rerequire.rkt b/pollen/private/rerequire.rkt similarity index 100% rename from rerequire.rkt rename to pollen/private/rerequire.rkt diff --git a/runtime-config.rkt b/pollen/private/runtime-config.rkt similarity index 92% rename from runtime-config.rkt rename to pollen/private/runtime-config.rkt index e225c97..2ea36ed 100644 --- a/runtime-config.rkt +++ b/pollen/private/runtime-config.rkt @@ -15,6 +15,7 @@ (if (or (eq? parser-mode world:mode-preproc) (eq? parser-mode world:mode-template)) (display doc) + ;; OK to use dynamic-require because runtime-config itself is dynamic-required (print (with-handlers ([exn:fail? (λ(exn) ((error '|pollen markup error| ((dynamic-require 'racket/string 'string-join) (cdr ((dynamic-require 'racket/string 'string-split) (exn-message exn) ": ")) ": "))))]) ((dynamic-require 'txexpr 'validate-txexpr) doc))))))) diff --git a/server-extras/404.html b/pollen/private/server-extras/404.html similarity index 100% rename from server-extras/404.html rename to pollen/private/server-extras/404.html diff --git a/server-extras/cmd-char.png b/pollen/private/server-extras/cmd-char.png similarity index 100% rename from server-extras/cmd-char.png rename to pollen/private/server-extras/cmd-char.png diff --git a/server-extras/error.css b/pollen/private/server-extras/error.css similarity index 100% rename from server-extras/error.css rename to pollen/private/server-extras/error.css diff --git a/server-extras/fallback.html b/pollen/private/server-extras/fallback.html similarity index 100% rename from server-extras/fallback.html rename to pollen/private/server-extras/fallback.html diff --git a/server-extras/fallback.svg b/pollen/private/server-extras/fallback.svg similarity index 100% rename from server-extras/fallback.svg rename to pollen/private/server-extras/fallback.svg diff --git a/server-extras/fallback.txt b/pollen/private/server-extras/fallback.txt similarity index 100% rename from server-extras/fallback.txt rename to pollen/private/server-extras/fallback.txt diff --git a/server-extras/favicon.ico b/pollen/private/server-extras/favicon.ico similarity index 100% rename from server-extras/favicon.ico rename to pollen/private/server-extras/favicon.ico diff --git a/server-extras/poldash.css b/pollen/private/server-extras/poldash.css similarity index 100% rename from server-extras/poldash.css rename to pollen/private/server-extras/poldash.css diff --git a/server-extras/pollen.svg b/pollen/private/server-extras/pollen.svg similarity index 100% rename from server-extras/pollen.svg rename to pollen/private/server-extras/pollen.svg diff --git a/pollen/private/split-metas.rkt b/pollen/private/split-metas.rkt new file mode 100644 index 0000000..533f6a2 --- /dev/null +++ b/pollen/private/split-metas.rkt @@ -0,0 +1,21 @@ +#lang racket/base +(provide (all-defined-out)) + +(define (split-metas tree meta-key) + (define matches null) + + (define (meta? x) ; meta has form (define-meta key value) + (and (list? x) (>= (length x) 3) (eq? (car x) meta-key))) + + (define (non-meta?/gather x) + (or (not (meta? x)) + (and (set! matches (cons x matches)) #f))) + + (define rest + (let loop ([x (if (list? tree) tree (list tree))]) + (if (list? x) + (map loop (filter non-meta?/gather x)) + x))) + + (let ([meta-key cadr][meta-value caddr]) + (values (map meta-key matches) (map meta-value matches) rest))) diff --git a/pollen/private/to-string.rkt b/pollen/private/to-string.rkt new file mode 100644 index 0000000..16cacdb --- /dev/null +++ b/pollen/private/to-string.rkt @@ -0,0 +1,9 @@ +#lang racket/base +(provide (all-defined-out)) + +(define (to-string x) + (cond + [(string? x) x] + [(or (null? x) (void? x)) ""] + [(or (symbol? x) (number? x) (path? x) (char? x)) (format "~a" x)] + [else (format "~v" x)])) \ No newline at end of file diff --git a/pollen/private/version.rkt b/pollen/private/version.rkt new file mode 100644 index 0000000..60b0823 --- /dev/null +++ b/pollen/private/version.rkt @@ -0,0 +1,3 @@ +#lang racket/base +(provide version) +(define version "1.0") \ No newline at end of file diff --git a/pollen/private/whitespace.rkt b/pollen/private/whitespace.rkt new file mode 100644 index 0000000..d823903 --- /dev/null +++ b/pollen/private/whitespace.rkt @@ -0,0 +1,34 @@ +#lang racket/base +(provide (all-defined-out)) + +(define (whitespace-base x #:nbsp-is-white? nbsp-white?) + (define pat (pregexp (format "^[\\s~a]+$" (if nbsp-white? #\u00A0 "")))) + (and (let loop ([x x]) + (cond + [(string? x) (or (zero? (string-length x)) (regexp-match pat x))] ; empty string is deemed whitespace + [(symbol? x) (loop (symbol->string x))] + [(pair? x) (andmap loop x)] + [(vector? x) (loop (vector->list x))] + [else #f])) + #t)) + + +(define (whitespace? x) + (whitespace-base x #:nbsp-is-white? #f)) + + +(define not-whitespace? (λ(x) (not (whitespace? x)))) + + +(define (whitespace/nbsp? x) + (whitespace-base x #:nbsp-is-white? #t)) + + +(module+ test + (require rackunit racket/format) + (check-true (whitespace? " ")) + (check-false (whitespace? (~a #\u00A0))) + (check-true (whitespace/nbsp? (~a #\u00A0))) + (check-true (whitespace/nbsp? (vector (~a #\u00A0)))) + (check-false (whitespace? (format " ~a " #\u00A0))) + (check-true (whitespace/nbsp? (format " ~a " #\u00A0)))) \ No newline at end of file diff --git a/pollen/ptree.rkt b/pollen/ptree.rkt new file mode 100644 index 0000000..7859d47 --- /dev/null +++ b/pollen/ptree.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require "private/main-base.rkt") + +(define+provide-module-begin-in-mode world:mode-pagetree) + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-pagetree)) diff --git a/render.rkt b/pollen/render.rkt similarity index 73% rename from render.rkt rename to pollen/render.rkt index 681d7c3..cdd6148 100644 --- a/render.rkt +++ b/pollen/render.rkt @@ -1,7 +1,15 @@ #lang racket/base (require racket/file racket/path compiler/cm) -(require sugar/test sugar/define sugar/file) -(require "file.rkt" "cache.rkt" "debug.rkt" "pagetree.rkt" "project.rkt" "template.rkt" "rerequire.rkt" "world.rkt") +(require sugar/test sugar/define sugar/file sugar/coerce) +(require "private/file-utils.rkt" + "cache.rkt" + "private/debug.rkt" + "private/project.rkt" + "private/cache-utils.rkt" + "pagetree.rkt" + "template.rkt" + "private/rerequire.rkt" + "world.rkt") ;; used to track renders according to modification dates of component files (define mod-date-hash (make-hash)) @@ -11,20 +19,6 @@ (define (reset-mod-date-hash) (set! mod-date-hash (make-hash))) -(module-test-internal - (check-pred hash? mod-date-hash)) - -;; using internal contracts to provide some extra safety (negligible performance hit) - -(define/contract (valid-path-arg? x) - (any/c . -> . boolean?) - (or (equal? #f x) (complete-path? x))) - -(define/contract (valid-path-args? x) - (any/c . -> . boolean?) - (and (list? x) (andmap valid-path-arg? x))) - - (module-test-internal (require racket/runtime-path) @@ -34,14 +28,6 @@ (define-values (sample-01 sample-02 sample-03) (apply values samples))) -(define/contract (path->mod-date-value path) - ((or/c #f complete-path?) . -> . (or/c #f integer?)) - (and path (file-exists? path) (file-or-directory-modify-seconds path))) - -(module-test-internal - (check-false (path->mod-date-value (path->complete-path "garbage-path.zzz"))) - (check-equal? (path->mod-date-value sample-01) (file-or-directory-modify-seconds sample-01))) - ;; each key for mod-date-hash is a list of file / mod-date pairs (using pollen/cache keymaking function) ;; when a file is rendered, a new key is stored in the hash (with trivial value #t) @@ -58,7 +44,7 @@ (define (list-of-pathish? x) (and (list? x) (andmap pathish? x))) -(define/contract+provide (render-batch . xs) +(define+provide/contract (render* . xs) (() #:rest list-of-pathish? . ->* . void?) ;; Why not just (map render ...)? ;; Because certain files will pass through multiple times (e.g., templates) @@ -66,64 +52,66 @@ ;; Using reset-modification-dates is sort of like session control. (reset-mod-date-hash) (for-each (λ(x) ((if (pagetree-source? x) - render-pagetree + render-pagenodes render-from-source-or-output-path) x)) xs)) -(define/contract+provide (render-pagetree pagetree-or-path) +(define+provide/contract (render-pagenodes pagetree-or-path) ((or/c pagetree? pathish?) . -> . void?) (define pagetree (if (pagetree? pagetree-or-path) pagetree-or-path - (cached-require pagetree-or-path (world:current-main-export)))) + (cached-doc pagetree-or-path))) (parameterize ([current-directory (world:current-project-root)]) (for-each render-from-source-or-output-path (map ->complete-path (pagetree->list pagetree))))) -(define/contract+provide (render-from-source-or-output-path so-pathish) +(define+provide/contract (render-from-source-or-output-path so-pathish) (pathish? . -> . void?) (let ([so-path (->complete-path so-pathish)]) ; so-path = source or output path (could be either) (cond - [(ormap (λ(test) (test so-path)) (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source? has/is-template-source?)) + [(ormap (λ(test) (test so-path)) (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source?)) (let-values ([(source-path output-path) (->source+output-paths so-path)]) (render-to-file-if-needed source-path #f output-path))] - [(pagetree-source? so-path) (render-pagetree so-path)])) + [(pagetree-source? so-path) (render-pagenodes so-path)])) (void)) +(define (validate-output-path op caller) + (unless op + (raise-argument-error caller "valid output path" op))) -(define/contract (render-needed? source-path template-path output-path) - (complete-path? (or/c #f complete-path?) complete-path? . -> . (or/c #f symbol?)) - ;; return symbol rather than boolean for extra debugging information - (cond - [(not (file-exists? output-path)) 'file-missing] - [(mod-date-missing-or-changed? source-path template-path) 'mod-key-missing-or-changed] - [(not (world:current-render-cache-active source-path)) 'render-cache-deactivated] - [else #f])) - -(define/contract+provide (render-to-file-if-needed source-path [maybe-template-path #f] [maybe-output-path #f]) - ((complete-path?) ((or/c #f complete-path?) (or/c #f complete-path?)) . ->* . void?) +(define+provide/contract (render-to-file-if-needed source-path [maybe-template-path #f] [maybe-output-path #f]) + ((complete-path?) ((or/c #f complete-path?) (or/c #f complete-path?)) . ->* . void?) (define output-path (or maybe-output-path (->output-path source-path))) + (validate-output-path output-path 'render-to-file-if-needed) (define template-path (or maybe-template-path (get-template-for source-path output-path))) - (when (render-needed? source-path template-path output-path) + (define render-needed? + (cond + [(not (file-exists? output-path)) 'file-missing] + [(mod-date-missing-or-changed? source-path template-path) 'mod-key-missing-or-changed] + [(not (world:current-render-cache-active source-path)) 'render-cache-deactivated] + [else #f])) + (when render-needed? (render-to-file source-path template-path output-path))) -(define/contract+provide (render-to-file source-path [maybe-template-path #f] [maybe-output-path #f]) +(define+provide/contract (render-to-file source-path [maybe-template-path #f] [maybe-output-path #f]) ((complete-path?) ((or/c #f complete-path?) (or/c #f complete-path?)) . ->* . void?) (define output-path (or maybe-output-path (->output-path source-path))) + (validate-output-path output-path 'render-to-file) (define template-path (or maybe-template-path (get-template-for source-path output-path))) (define render-result (render source-path template-path output-path)) ; will either be string or bytes (display-to-file render-result output-path #:exists 'replace #:mode (if (string? render-result) 'text 'binary))) -(define/contract+provide (render source-path [maybe-template-path #f] [maybe-output-path #f]) +(define+provide/contract (render source-path [maybe-template-path #f] [maybe-output-path #f]) ((complete-path?) ((or/c #f complete-path?) (or/c #f complete-path?)) . ->* . (or/c string? bytes?)) (define render-proc (cond [(ormap (λ(test render-proc) (and (test source-path) render-proc)) - (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source? has/is-template-source?) - (list render-null-source render-preproc-source render-markup-or-markdown-source render-scribble-source render-markup-or-markdown-source render-preproc-source))] + (list has/is-null-source? has/is-preproc-source? has/is-markup-source? has/is-scribble-source? has/is-markdown-source?) + (list render-null-source render-preproc-source render-markup-or-markdown-source render-scribble-source render-markup-or-markdown-source))] [else (error (format "render: no rendering function found for ~a" source-path))])) (define output-path (or maybe-output-path (->output-path source-path))) @@ -138,15 +126,15 @@ render-result) -(define/contract (render-null-source source-path . ignored-paths) - ((complete-path?) #:rest any/c . ->* . bytes?) +(define (render-null-source source-path . ignored-paths) + ;((complete-path?) #:rest any/c . ->* . bytes?) ;; All this does is copy the source. Hence, "null". ;; todo: add test to avoid copying if unnecessary (good idea in case the file is large) (file->bytes source-path)) -(define/contract (render-scribble-source source-path . ignored-paths) - ((complete-path?) #:rest any/c . ->* . string?) +(define (render-scribble-source source-path . ignored-paths) + ;((complete-path?) #:rest any/c . ->* . string?) (define source-dir (dirname source-path)) (dynamic-rerequire source-path) ; to suppress namespace caching by dynamic-require below (define scribble-render (dynamic-require 'scribble/render 'render)) @@ -168,32 +156,33 @@ result) -(define/contract (render-preproc-source source-path . ignored-paths) - ((complete-path?) #:rest any/c . ->* . (or/c string? bytes?)) +(define (render-preproc-source source-path . ignored-paths) + ;((complete-path?) #:rest any/c . ->* . (or/c string? bytes?)) (define source-dir (dirname source-path)) (time (parameterize ([current-directory (->complete-path source-dir)]) (render-through-eval `(begin (require pollen/cache) - (cached-require ,source-path ',(world:current-main-export))))))) + (cached-doc ,source-path)))))) -(define/contract (render-markup-or-markdown-source source-path [maybe-template-path #f] [maybe-output-path #f]) - ((complete-path?) ((or/c #f complete-path?)(or/c #f complete-path?)) . ->* . (or/c string? bytes?)) +(define (render-markup-or-markdown-source source-path [maybe-template-path #f] [maybe-output-path #f]) + ;((complete-path?) ((or/c #f complete-path?)(or/c #f complete-path?)) . ->* . (or/c string? bytes?)) (define source-dir (dirname source-path)) (define output-path (or maybe-output-path (->output-path source-path))) (define template-path (or maybe-template-path (get-template-for source-path output-path))) - (when (not template-path) + (unless template-path (raise-result-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 expr-to-eval `(begin (require (for-syntax racket/base)) - (require pollen/include-template pollen/cache pollen/debug pollen/pagetree) + (require pollen/private/include-template pollen/cache pollen/private/debug pollen/pagetree) ,(require-directory-require-files source-path) (parameterize ([current-pagetree (make-project-pagetree ,(world:current-project-root))]) - (let ([,(world:current-main-export) (cached-require ,(path->string source-path) ',(world:current-main-export))] - [,(world:current-meta-export) (cached-require ,(path->string source-path) ',(world:current-meta-export))]) + (let ([,(world:current-main-export) (cached-doc ,(path->string source-path))] + [,(world:current-meta-export) (cached-metas ,(path->string source-path))]) (local-require pollen/template pollen/top) - (define here (metas->here ,(world:current-meta-export))) + (define here (path->pagenode + (or (select-from-metas ',(world:current-here-path-key) ,(world:current-meta-export)) 'unknown))) (cond [(bytes? ,(world:current-main-export)) ,(world:current-main-export)] ; if main export is binary, just pass it through [else @@ -203,17 +192,17 @@ (render-through-eval expr-to-eval)))) -(define/contract (templated-source? path) - (complete-path? . -> . boolean?) +(define (templated-source? path) + ;(complete-path? . -> . boolean?) (or (markup-source? path) (markdown-source? path))) (define identity (λ(x) x)) -(define/contract+provide (get-template-for source-path [maybe-output-path #f]) +(define+provide/contract (get-template-for source-path [maybe-output-path #f]) ((complete-path?)((or/c #f complete-path?)) . ->* . (or/c #f complete-path?)) (define (file-exists-or-has-source? p) ; p could be #f - (and p (ormap (λ(proc) (file-exists? (proc p))) (list identity ->template-source-path ->preproc-source-path ->null-source-path)) p)) + (and p (ormap (λ(proc) (file-exists? (proc p))) (list identity ->preproc-source-path ->null-source-path)) p)) (define (get-template) (define source-dir (dirname source-path)) @@ -222,12 +211,12 @@ (define (get-template-from-metas) (with-handlers ([exn:fail:contract? (λ _ #f)]) ; in case source-path doesn't work with cached-require (parameterize ([current-directory (world:current-project-root)]) - (let* ([source-metas (cached-require source-path (world:current-meta-export))] + (let* ([source-metas (cached-metas source-path)] [template-name-or-names (select-from-metas (world:current-template-meta-key) source-metas)] ; #f or atom or list [template-name (cond [(list? template-name-or-names) (define result - (memf (λ(tn) (equal? (get-ext tn) output-path-ext)) template-name-or-names)) ; #f or list + (memf (λ(tn) (eq? (get-ext tn) output-path-ext)) template-name-or-names)) ; #f or list (and result (car result))] [else template-name-or-names])]) (and template-name (build-path source-dir template-name)))))) @@ -268,10 +257,10 @@ (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 anchor-to-this-namespace) -(define/contract (render-through-eval expr-to-eval) - (list? . -> . (or/c string? bytes?)) +(define-namespace-anchor render-module-ns) +(define (render-through-eval expr-to-eval) + ;(list? . -> . (or/c string? bytes?)) (parameterize ([current-namespace (make-base-namespace)] [current-output-port (current-error-port)]) - (namespace-attach-module (namespace-anchor->namespace anchor-to-this-namespace) 'pollen/world) ; brings in params + (namespace-attach-module (namespace-anchor->namespace render-module-ns) 'pollen/world) ; brings in params (eval expr-to-eval))) \ No newline at end of file diff --git a/scribblings/acknowledgments.scrbl b/pollen/scribblings/acknowledgments.scrbl similarity index 89% rename from scribblings/acknowledgments.scrbl rename to pollen/scribblings/acknowledgments.scrbl index bddd5a2..09616bf 100644 --- a/scribblings/acknowledgments.scrbl +++ b/pollen/scribblings/acknowledgments.scrbl @@ -6,6 +6,8 @@ One curious aspect of free software is that you can appropriate the benefits of Thank you to Greg Hendershott for his Markdown parser. +Thank you to Ahmed Fasih, Malcolm Still, Joel Dueck, and other early-stage Pollen users for their patience & suggestions. + The best software tools do more than get the job done. They create an incentive to undertake jobs you wouldn't have attempted before. Racket encouraged me to become a better programmer so I could create Pollen. Likewise, I hope that Pollen encourages you to make things you couldn't before. MB \ No newline at end of file diff --git a/scribblings/big-picture.scrbl b/pollen/scribblings/big-picture.scrbl similarity index 100% rename from scribblings/big-picture.scrbl rename to pollen/scribblings/big-picture.scrbl diff --git a/scribblings/burial.png b/pollen/scribblings/burial.png similarity index 100% rename from scribblings/burial.png rename to pollen/scribblings/burial.png diff --git a/scribblings/cache.scrbl b/pollen/scribblings/cache.scrbl similarity index 60% rename from scribblings/cache.scrbl rename to pollen/scribblings/cache.scrbl index 5c31f6f..ffe6bfb 100644 --- a/scribblings/cache.scrbl +++ b/pollen/scribblings/cache.scrbl @@ -1,6 +1,6 @@ #lang scribble/manual -@(require scribble/eval pollen/cache pollen/world (for-label racket pollen/world pollen/render pollen/file sugar txexpr)) +@(require "mb-tools.rkt" scribble/eval pollen/cache pollen/world (for-label racket pollen/world pollen/render pollen/file sugar txexpr)) @(define my-eval (make-base-eval)) @(my-eval `(require pollen)) @@ -21,18 +21,18 @@ If you want to reset all the compile caches, use @exec{@seclink["raco_pollen_res @section{Disabling the cache} -The compile cache is controlled by the @seclink["settable-values"]{settable value} @racket[world:current-compile-cache-active]. Thus, to disable the compile cache, add a @racket[config] submodule to your @filepath{pollen.rkt} like so: +The compile cache is controlled by the @seclink["world-overrides"]{overridable value} @racket[world:current-compile-cache-active]. Thus, to disable the compile cache, add a @racket[world] submodule to your @filepath{pollen.rkt} like so: @codeblock|{ -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define compile-cache-active #f)) }| -Pollen also caches rendered output files, so if you want to disable all caching — thus forcing everything to recompile, every time — you should also disable the render cache by setting @racket[world:current-render-cache-active]: +Pollen also caches rendered output files, so if you want to disable all caching — thus forcing everything to recompile, every time — you should also disable the render cache by overriding @racket[world:current-render-cache-active]: @codeblock|{ -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define compile-cache-active #f) (define render-cache-active #f)) @@ -45,30 +45,35 @@ Be warned that this will make your rendering much slower. But you will be guaran The compile cache tracks the modification date of the source file, the current setting of @secref["The_POLLEN_environment_variable"], and the modification dates of the template and @filepath{pollen.rkt} (if they exist). -It does not, however, track every possible dependency. So in a complex project, it's possible to create ``deep'' dependencies that aren't noticed by the cache. +It does not, however, track every possible dependency. So in a complex project, it's possible to create deep dependencies that aren't noticed by the cache. -Unfortunately, there's no way around this problem. For the cache to be useful, there has to be a limit on the horizon of dependency checking. For the cache to be totally certain that something hadn’t changed, it would have to compile afresh every time (which would be equivalent to not caching at all). +Unfortunately, there's no way around this problem. For the cache to be useful, there has to be a limit on the horizon of dependency checking. To capture every possible dependency, the cache would have to recompile every file, every time — which would be equivalent to not caching at all. -But those who need that kind of deep dynamism can disable the cache. +Those who need that kind of deep dynamism can disable the cache. @section[#:tag-prefix "cache"]{Functions} + +@deftogether[( +@defproc[ +(cached-doc +[source-path pathish?]) +txexpr?] + @defproc[ -(cached-require -[source-path pathish?] -[key (or/c 'doc 'metas)]) -(or/c txexpr? hash? integer?)] -Similar to @racket[(dynamic-require _source-path _key)], except that it first tries to retrieve the requested value out of the cache. If it's not there, or out of date, @racket[dynamic-require] is used to update the value. +(cached-metas +[source-path pathish?]) +hash-eq?] +)] +Try to retrieve the requested value out of the cache. If it's not there, or out of date, @racket[dynamic-require] is used to update it from the source. -The only keys supported are @racket[doc] and @racket[metas] (or more precisely, the values of @racket[world:current-main-export] and @racket[world:current-meta-export], which default to @racket[doc] and @racket[metas]). +Despite their names, these functions actually rely on @racket[world:current-main-export] and @racket[world:current-meta-export] (which default to @id[world:main-export] and @id[world:meta-export]). Thus, if you override those names, everything will still work as expected. -If you want the speed benefit of the cache, you should @bold{always} use @racket[cached-require] to get data from Pollen source files. That doesn't mean you can't still use functions like @racket[require], @racket[local-require], and @racket[dynamic-require]. They'll just be slower. +If you want the speed benefit of the cache, you should @bold{always} use @racket[cached-doc] and @racket[cached-metas] to get data from Pollen source files. That doesn't mean you can't also use functions like @racket[require], @racket[local-require], and @racket[dynamic-require]. They'll just be slower. @defproc[ (reset-cache) void?] Clears the cache. When only the nuclear option will do. - - diff --git a/pollen/scribblings/command.html b/pollen/scribblings/command.html new file mode 100644 index 0000000..5ecf240 --- /dev/null +++ b/pollen/scribblings/command.html @@ -0,0 +1,3 @@ + +Pollen command syntax

6.2.900.15

Pollen command syntax

1 The golden rule

Pollen uses a special character — the lozenge, which looks like this: ◊ — to mark commands within a Pollen source file. So when you put a ◊ in your source, whatever comes next will be treated as a command. If you don’t, it will just be interpreted as plain text.

2 The lozenge glyph (◊)

I chose the lozenge as the command character because a) it appears in almost every font, b) it’s barely used in ordinary typesetting, c) it’s not used in any programming language that I know of, and d) its shape and color allow it to stand out easily in code without being distracting.

Here’s how you type it:

Mac: option + shift + V

Windows: holding down alt, type 9674 on the num pad

Ubuntu: ctrl + shift + U, then 25CA

Still, if you don’t want to use the lozenge as your command character, you can set Pollen’s world:command-char value to whatever character you want (see also (part "settable-values")).

Scribble uses the @ sign as a delimiter. It’s not a bad choice if you only work with Racket files. But as you use Pollen to work on other kinds of text-based files that commonly contain @ signs — HTML pages especially — it gets cumbersome. So I changed it.

But don’t knock the lozenge till you try it.

2.1 Lozenge helpers

2.1.1 AHK script

Courtesy of Matt Wilkie: “Here’s a working AHK script to have double-tap backtick send the lozenge character. It took way more time than I want to think about, once started I couldn’t let go.”

"tick-tick-lozenge.ahk"

;

; Double-tap backtick sends Pollen command character (◊)

; For some reason I needed to use Unicode 'U+25CA'

; instead of the standard alt-code '9674'

;

; Adapted from http://ahkscript.org/docs/commands/SetTimer.htm

; and http://www.autohotkey.com/board/topic/145507-how-to-use-double-tap-backtick-with-pass-through/

;

#EscapeChar \

$`::

if winc_presses > 0

    {winc_presses += 1

    return

    }

 

winc_presses = 1

SetTimer, TheKey, 250 ; Wait for more presses, in milliseconds

return

 

TheKey:

    SetTimer, TheKey, off

    if winc_presses = 1 ; The key was pressed once.

        {Send `

        }

    else if winc_presses = 2 ; The key was pressed twice.

        {Send {U+25CA}

        }

 

; Regardless of which action above was triggered, reset the count to

; prepare for the next series of presses:

winc_presses = 0

return

2.1.2 Emacs script

Courtesy of Richard Le: “If you’re using Emacs, I tried to write a tiny function that inserts the lozenge character. I chose M-\ because that’s the key for the lambda character in DrRacket.”

;; Put this in your Emacs .init file:

;; enable lozenge for Pollen

;; ◊◊◊◊◊◊◊◊◊◊◊◊◊

;; 'mule-unicode part from

;; https://lists.gnu.org/archive/html//emacs-devel/2005-03/msg01187.html

(defun insert-lozenge ()

  "inserts the lozenge character for use with Pollen"

  ;; enables function through M-x

  (interactive)

  ;; insert the proper character

  (insert (make-char

           'mule-unicode-2500-33ff 34 42)))

 

;; Bind key to M-\ a la DrRacket for lambda

(global-set-key "\M-\\" 'insert-lozenge)

3 The two command modes: Pollen mode & Racket mode

Pollen commands can be entered in one of two modes: Pollen mode or Racket mode. Both modes start with a lozenge ():

 command name [ Racket arguments ... ] { text argument }
 ( Racket expression )

Pollen-mode commands

A Pollen-mode command has the three possible parts after the :

  • The command name appears immediately after the . Typically it’s a short word.

  • The Racket arguments appear between square brackets. Pollen is partly an interface to the Racket programming language. These arguments are entered using Racket conventions — e.g., a string of text needs to be put in quotes as a "string of text". If you like programming, you’ll end up using these frequently. If you don’t, you won’t.

  • The text argument appears between braces (aka curly brackets). You can put any ordinary text here. Unlike with the Racket arguments, you don’t put quotes around the text.

Each of the three parts is optional. You can also nest commands within each other. However:

  • You can never have spaces between the three parts.

  • Whatever parts you use must always appear in the order above.

Here are a few examples of correct Pollen-mode commands:

#lang pollen
variable-name
tag{Text inside the tag.}
tag['attr: "value"]{Text inside the tag}
get-customer-id["Brennan Huff"]
tag{His ID is get-customer-id["Brennan Huff"].}

And some incorrect examples:

#lang pollen
tag {Text inside the tag.} ; space between first and second parts
tag[Text inside the tag] ; text argument needs to be within braces
tag{Text inside the tag}['attr: "value"] ; wrong order

The next section describes each of these parts in detail.

Racket-mode commands

If you’re familiar with Racket expressions, you can use the Racket-mode commands to embed them within Pollen source files. It’s simple: any Racket expression can become a Pollen command by adding to the front. So in Racket, this code:

#lang racket
(define song "Revolution")
(format "~a #~a" song (* 3 3))

Can be converted to Pollen like so:

#lang pollen
(define song "Revolution")
(format "~a #~a" song (* 3 3))

And in DrRacket, they produce the same output:

Revolution #9

Beyond that, there’s not much to say about Racket mode — any valid expression you can write in Racket will also be a valid Racket-mode Pollen command.

The relationship of Pollen mode and Racket mode

Even if you don’t plan to write a lot of Racket-mode commands, you should be aware that under the hood, Pollen is converting all commands in Pollen mode to Racket mode. So a Pollen-mode command that looks like this:

headline[#:size 'enormous]{Man Bites Dog!}

Is actually being turned into a Racket-mode command like this:

(headline #:size 'enormous "Man Bites Dog!")

Thus a Pollen-mode command is just an alternate way of writing a Racket-mode command. (More broadly, all of Pollen is just an alternate way of using Racket.)

The corollary is that you can always write Pollen commands using whichever mode is more convenient or readable. For instance, the earlier example, written in the Racket mode:

#lang pollen
(define song "Revolution")
(format "~a #~a" song (* 3 3))

Can be rewritten using Pollen mode:

#lang pollen
define[song]{Revolution}
format["~a #~a" song (* 3 3)]

And it will work the same way.

3.1 The command name

In Pollen, you’ll typically use the command name for one of four purposes:

  • To invoke a tag function.

  • To invoke another function.

  • To insert the value of a variable.

  • To insert a meta value.

  • To insert a comment.

3.1.1 Invoking tag functions

By default, Pollen treats every command name as a tag function. The default tag function creates a tagged X-expression with the command name as the tag, and the text argument as the content.

#lang pollen
strong{Fancy Sauce, $1}

'(strong "Fancy Sauce, $1")

To streamline markup, Pollen doesn’t restrict you to a certain set of tags, nor does it make you define your tags ahead of time. Just type a tag, and you can start using it.

#lang pollen
utterlyridiculoustagname{Oh really?}

'(utterlyridiculoustagname "Oh really?")

The one restriction is that you can’t invent names for tags that are already being used for other commands. For instance, map is a name permanently reserved by the Racket function map. It’s also a rarely-used HTML tag. But gosh, you really want to use it. Problem is, if you invoke it directly, Pollen will think you mean the other map:

#lang pollen
map{Fancy Sauce, $1}

map: arity mismatch;
the expected number of arguments does not match the given number
  given: 1
  arguments...:
    "Fancy Sauce, $1"

What to do? Read on.

3.1.2 Invoking other functions

Though every command name starts out as a default tag function, it doesn’t necessarily end there. You have two options for invoking other functions: defining your own, or invoking others from Racket.

Defining your own functions

Use the define command to create your own function for a command name. After that, when you use the command name, you’ll get the new behavior. For instance, recall this example showing the default tag-function behavior:

#lang pollen
strong{Fancy Sauce, $1}

'(strong "Fancy Sauce, $1")

We can define strong to do something else, like add to the text:

#lang pollen
(define (strong text) `(strong ,(format "Hey! Listen up! ~a" text)))
strong{Fancy Sauce, $1}

'(strong "Hey! Listen up! Fancy Sauce, $1")

The replacement function has to accept any arguments that might get passed along, but it doesn’t have to do anything with them. For instance, this function definition won’t work because strong is going to get a text argument that it’s not defined to handle:

#lang pollen
(define (strong) '(fib "1 1 2 3 5 8 13 ..."))
strong{Fancy Sauce, $1}

strong: arity mismatch;
the expected number of arguments does not match the given number
  expected: 0
  given: 1
  arguments...:
    "Fancy Sauce, $1"

Whereas in this version, strong accepts an argument called text, but then ignores it:

#lang pollen
(define (strong text) '(fib "1 1 2 3 5 8 13 ..."))
strong{Fancy Sauce, $1}

'(fib "1 1 2 3 5 8 13 ...")

You can attach any behavior to a command name. As your project evolves, you can also update the behavior of a command name. In that way, Pollen commands become a set of hooks to which you can attach more elaborate processing.

Using Racket functions

You aren’t limited to functions you define. Any function from Racket, or any Racket library, can be invoked directly by using it as a command name. Here’s the function range, which creates a list of numbers:

#lang pollen
range[1 20]

'(range 1 20)

Hold on — that’s not what we want. Where’s the list of numbers? The problem here is that we didn’t explicitly import the racket/list library, which contains the definition for range. (If you need to find out what library contains a certain function, the Racket documentation will tell you.) Without racket/list, Pollen just thinks we’re trying to use range as a tag function (and if we had been, then

'(range 1 20)

would’ve been the right result).

We fix this by using the require command to bring in the racket/list library, which contains the range we want:

#lang pollen
(require racket/list)
range[1 20]

'(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)

Of course, you can also invoke Racket functions indirectly, by attaching them to functions you define for command names:

#lang pollen
(require racket/list)
(define (rick start finish) (range start finish))
rick[1 20]

'(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)

Let’s return to the problem that surfaced in the last section — the fact that some command names can’t be used as tag functions because they’re already being used for other things. You can work around this by defining your own tag function with a non-conflicting name.

For instance, suppose we want to use map as a tag even though Racket is using it for its own function called map. First, we invent a command name that doesn’t conflict. Let’s call it my-map. As you learned above, Pollen will treat a new command name as a tag function by default:

#lang pollen
my-map{How I would love this to be a map.}

'(my-map "How I would love this to be a map.")

But my-map is not the tag we want. We need to define my-map to be a tag function for map. We can do this with the Pollen helper make-default-tag-function. That function lives in pollen/tag, so we require that too:

#lang pollen
(require pollen/tag)
(define my-map (make-default-tag-function 'map))
my-map{How I would love this to be a map.}

'(map "How I would love this to be a map.")

Problem solved.

3.1.3 Inserting the value of a variable

A Pollen command name usually refers to a function, but it can also refer to a variable, which is a data value. Once you define the variable, you can insert it into your source by using the ◊ notation without any other arguments:

#lang pollen
(define foo "bar")
The value of foo is foo

The value of foo is bar

Be careful — if you include arguments, even blank ones, Pollen will treat the command name as a function. This won’t work, because a variable is not a function:

To understand what happens here, recall the relationship between Pollen’s command modes. The Pollen-mode command ◊foo[] becomes the Racket-mode command (foo), which after variable substitution becomes ("bar"). If you try to evaluate ("bar") — e.g., in DrRacket — you’ll get the same error.

#lang pollen
(define foo "bar")
The value of foo is foo[]

application: not a procedure;
expected a procedure that can be applied to arguments
  given: "bar"
  arguments...: [none]

The reason we can simply drop ◊foo into the text argument of another Pollen command is that the variable foo holds a string (i.e., a text value).

In preprocessor source files, Pollen will convert a variable to a string in a sensible way. For instance, numbers are easily converted:

#lang pollen
(define zam 42)
The value of zam is zam

The value of zam is 42

In an unsaved DrRacket file, or a file without a special Pollen source extension, the #lang pollen designation invokes the Pollen preprocessor by default. You can explicitly invoke preprocessor mode by starting a file with #lang pollen/pre. See also (part "Preprocessor___pp_extension_").

If the variable holds a container datatype (like a list, hash, or vector), Pollen will produce the Racket text representation of the item. Here, zam is a list of integers:

#lang pollen
(define zam (list 1 2 3))
The value of zam is zam

The value of zam is '(1 2 3)

This feature is included for your convenience. But in general, your readers won’t want to see the Racket representation of a container. So in these cases, you should convert to a string manually in some sensible way. Here, the integers in the list are converted to strings, which are then combined using string-join from the racket/string library:

#lang pollen
(require racket/string)
(define zam (list 1 2 3))
The value of zam is string-join[(map number->string zam)]{ and }

The value of zam is 1 and 2 and 3

Pollen will still produce an error if you try to convert an esoteric value to a string. Here, zam is the addition function (+):

#lang pollen
(define zam +)
The value of zam is zam

Pollen decoder: can't convert #<procedure:+> to string

Moreover, Pollen will not perform any automatic text conversion in Pollen markup source files. Suppose we take the example above — which worked as a preprocessor source file — and change the language to pollen/markup:

#lang pollen/markup
(define zam (list 1 2 3))
The value of zam is zam

This time, the file will produce an error:

pollen markup error: in '(root "The value of zam is " (1 2 3)), '(1 2 3) is not a valid element (must be txexpr, string, symbol, XML char, or cdata)

One special case to know about. In the examples above, there’s a word space between the variable and the other text. But suppose you need to insert a variable into text so that there’s no space in between. The simple ◊ notation won’t work, because it won’t be clear where the variable name ends and the text begins.

For instance, suppose we want to use a variable edge next to the string px:

#lang pollen
(define edge 100)
p { margin-left: edgepx; }

Pollen decoder: can't convert #<procedure:...t/pollen/tag.rkt:6:2> to string

The example fails because Pollen reads the whole string after the as the single variable name edgepx. Since edgepx isn’t defined, it’s treated as a tag function, and since Pollen can’t convert a function to a string, we get an error.

In these situations, surround the variable name with vertical bars ◊|like so| to explicitly indicate where the variable name ends. The bars are not treated as part of the name, nor are they included in the result. Once we do that, we get what we intended:

#lang pollen
(define edge 100)
p { margin-left: ◊|edge|px; }

p { margin-left: 100px; }

If you use this notation when you don’t need to, nothing bad will happen. The vertical bars are always ignored.

#lang pollen
(define edge 100)
The value of edge is ◊|edge| pixels}

The value of edge is 100 pixels

3.1.4 Inserting metas

Metas are key–value pairs embedded in a source file that are not included in the main output when the source is compiled. Rather, they’re gathered and exported as a separate hash table called, unsurprisingly, metas. This hashtable is a good place to store information about the document that you might want to use later (for instance, a list of topic categories that the document belongs to).

Pollen occasionally uses metas internally. For instance, the get-template-for function will look in the metas of a source file to see if a template is explicitly specified. The pollen/template module also contains functions for working with metas, such as select-from-metas.

To make a meta, you create a tag with the special define-meta name. Then you have two choices: you can either embed the key-value pair as an attribute, or as a tagged X-expression within the meta (using the key as the tag, and the value as the body):

#lang pollen
 
define-meta[dog]{Roxy} ; Pollen-mode syntax
some-tag['key: "value"]{Normal tag}
(define-meta cat "Chopper") ; equivalent Racket-mode syntax
some-tag['key: "value"]{Another normal tag}

When you run a source file with metas in it, two things happen. First, the metas are removed from the output:

'(some-tag ((key "value")) "Normal tag")

'(some-tag ((key "value")) "Another normal tag")

Second, the metas are collected into a hash table that is exported with the name metas. To see this hash table, run the file above in DrRacket, then switch to the interactions window and type metas at the prompt:

> metas

'#hash((dog . "Roxy") (cat . "Chopper") (here-path . "unsaved-editor"))

The only key that’s automatically defined in every meta table is here-path, which is the absolute path to the source file. (In this case, because the file hasn’t been saved, you’ll see the unsaved-editor name instead.)

Still, you can override this too:

#lang pollen
 
define-meta[dog]{Roxy}
some-tag['key: "value"]{Normal tag}
(define-meta cat "Chopper")
some-tag['key: "value"]{Another normal tag}
(define-meta here-path "tesseract")

When you run this code, the result will be the same as before, but this time the metas will be different:

> metas

'#hash((dog . "Roxy") (cat . "Chopper") (here-path . "tesseract"))

It doesn’t matter how many metas you put in a source file, nor where you put them. They’ll all be extracted into the metas hash table. The order of the metas is not preserved (because order is not preserved in a hash table). But if you have two metas with the same key, the later one will supersede the earlier one:

#lang pollen
define-meta[dog]{Roxy}
(define-meta dog "Lex")

In this case, though there are two metas named dog (and they use different forms) only the second one persists:

> metas

'#hash((dog . "Lex") (here-path . "unsaved-editor"))

Pro tip: the metas hashtable is available when you import a Pollen source file in the usual way, but it’s also made available through a submodule called, unsurprisingly, metas.

#lang racket/base
(require "pollen-source.rkt") ; doc and metas and everything else
(require (submod "pollen-source.rkt" metas)) ; just metas

The metas submodule is useful because it gives you access to the metas hashtable without compiling the rest of the file. So if you need to collect metas from a set of source files — for instance, page titles (for a table of contents) or categories — getting the metas through the submodule is likely to be faster.

3.1.5 Retrieving metas

The metas hashtable is available immediately within the body of your source file. You can use hash-ref to get values out of metas.

#lang pollen
(define-meta dog "Roxy")
(hash-ref metas 'dog)

Roxy

Because the metas are collected first, you can actually invoke a meta before you define it:

#lang pollen
(hash-ref metas 'dog)
(define-meta dog "Roxy")
(define-meta dog "Spooky")

Spooky

This can be useful for setting up fields that you want to include in metas but also have visible in the body of a document, like a title.

#lang pollen/markup
(define-meta title "The Amazing Truth")
h1{(hash-ref metas 'title)}

The result of this file will be:

'(root (h1 "The Amazing Truth"))

And the metas: +

> metas

'#hash((title . "The Amazing Truth") (here-path . "unsaved-editor"))

You cannot, however, use hash-set! or other similar functions, because metas is an immutable hash.

3.1.6 Inserting a comment

Two options.

To comment out the rest of a single line, use a lozenge followed by a semicolon ◊;.

#lang pollen
span{This is not a comment}
span{Nor is this} ◊;span{But this is}

'(span "This is not a comment")
'(span "Nor is this")

To comment out a multiline block, use the lozenge–semicolon signal ◊; with curly braces, ◊;{like so}.

#lang pollen
◊;{
span{This is not a comment}
span{Nor is this} ◊;span{But this is}
}
Actually, it's all a comment now

Actually, it's all a comment now

3.2 The Racket arguments

The middle part of a Pollen-mode command contains the Racket arguments [between square brackets.] Most often, you’ll see these used to pass extra information to commands that operate on text.

For instance, tag functions. Recall from before that any not-yet-defined command name in Pollen is treated as a tag function:

#lang pollen
title{The Beginning of the End}

'(title "The Beginning of the End")

But what if you wanted to add attributes to this tag, so that it comes out like this?

'(title ((class "red")(id "first")) "The Beginning of the End")

You can do it with Racket arguments.

Here’s the hard way. You can type out your list of attributes in Racket format and drop them into the brackets as a single argument:

#lang pollen
title['((class "red")(id "first"))]{The Beginning of the End}

'(title ((class "red") (id "first")) "The Beginning of the End")

But that’s a lot of parentheses to think about. So here’s the easy way. Anytime you use a tag function, there’s a shortcut for inserting attributes. You can enter them as a series of keyword arguments between the Racket-argument brackets. The only caveat is that the values for these keyword arguments have to be strings. So taken together, they look like this:

#lang pollen
title[#:class "red" #:id "first"]{The Beginning of the End}

'(title ((class "red") (id "first")) "The Beginning of the End")

The string arguments can be any valid Racket expressions that produce strings. For instance, this will also work:

#lang pollen
title[#:class (format "~a" (* 6 7)) #:id "first"]{The Beginning of the End}

'(title ((class "42") (id "first")) "The Beginning of the End")

Since Pollen commands are really just Racket arguments underneath, you can use those too. Here, we’ll define a variable called name and use it in the Racket arguments of title:

#lang pollen
(define name "Brennan")
title[#:class "red" #:id name]{The Beginning of the End}

'(title ((class "read") (id "Brennan")) "The Beginning of the End")

When used in custom tag functions, keyword arguments don’t have to represent attributes. Instead, they can be used to provide options for a particular Pollen command, to avoid redundancy. Suppose that instead of using the h1 ... h6 tags, you want to consolidate them into one command called heading and select the level separately. You can do this with a keyword, in this case #:level, which is passed as a Racket argument:

#lang pollen
(define (heading #:level which text)
   `(,(string->symbol (format "h~a" which)) ,text))
 
heading[#:level 1]{Major league}
heading[#:level 2]{Minor league}
heading[#:level 6]{Trivial league}

'(h1 "Major league")
'(h2 "Minor league")
'(h6 "Trivial league")

3.3 The text argument

The third part of a Pollen-mode command is the text argument. The text argument {appears between curly braces}. It can contain any text you want. The text argument can also contain other Pollen commands with their own text arguments. And they can contain other Pollen commands ... and so on, all the way down.

#lang pollen
div{Do it again. div{And again. div{And yet again.}}}

'(div "Do it again. " (div "And again. " (div "And yet again.")))

Three small details to know about the text argument.

First, the only character that needs special handling in a text argument is the lozenge . A lozenge ordinarily marks a new command. So if you want an actual lozenge to appear in the text, you have to escape it by typing ◊"◊".

#lang pollen
definition{This is the lozenge: "◊"}

'(definition "This is the lozenge: ◊")

Second, the whitespace-trimming policy. Here’s the short version: if there’s a carriage return at either end of the text argument, it is trimmed, and whitespace at the end of each line is selectively trimmed in an intelligent way. So this text argument, with carriage returns on the ends:

#lang pollen
div{
Roomy!
 
I agree.
}

'(div "Roomy!" "\n" "\n" "I agree.")

Yields the same result as this one:

#lang pollen
div{Roomy!
 
I agree.}

'(div "Roomy!" "\n" "\n" "I agree.")

For the long version, please see [future link: Spaces, Newlines, and Indentation].

Third, within a multiline text argument, newline characters become individual strings that are not merged with adjacent text. So what you end up with is a list of strings, not a single string. That’s why in the last example, we got this:

'(div "Roomy!" "\n" "\n" "I agree.")

Instead of this:

'(div "Roomy!\n\nI agree.")

Under most circumstances, these two tagged X-expressions will behave the same way. The biggest exception is with functions. A function that operates on multiline text arguments needs to be able to handle an indefinite number of strings. For instance, this jejune function only accepts a single argument. It will work with a single-line text argument, because that produces a single string:

#lang pollen
(define (jejune text)
   `(jejune ,text))
jejune{Irrational confidence}

'(jejune "Irrational confidence")

But watch what happens with a multiline text argument:

#lang pollen
(define (jejune text)
   `(jejune ,text))
jejune{Deeply
        chastened}

jejune: arity mismatch;
the expected number of arguments does not match the given number
  expected: 1
  given: 3
  arguments...:
   "Deeply"
   "\n"
   "chastened"

The answer is to use a rest argument in the function, which takes the “rest” of the arguments — however many there may be — and combines them into a single list. If we rewrite jejune with a rest argument, we can fix the problem:

#lang pollen
(define (jejune . texts)
   `(jejune ,@texts))
jejune{Deeply
        chastened}

'(jejune "Deeply" "\n" "chastened")

4 Embedding character entities

XML and HTML support character entities, a way of encoding Unicode characters with a name or number. For instance, in HTML, the copyright symbol © can be encoded by name as &copy; or by number as &#169;.

Entities originated as a way of embedding Unicode characters in an ASCII data stream. Pollen and Racket, however, support Unicode directly. So does every major web browser (though your document may need a Unicode character-set declaration to trigger it). So usually, your best bet is insert Unicode characters directly into your source rather than use entities.

But if you really need entities, here’s what to do. Pollen treats everything as text by default, so you can’t insert entities merely by typing them, because they’ll just be converted to text:

#lang pollen
div{copy
     169}

'(div "copy" "\n" "169")

Instead, named entities are handled as (part ("(lib scribblings/guide/guide.scrbl)" "symbols")) and numeric entities are, unsurprisingly, (part ("(lib scribblings/guide/guide.scrbl)" "numbers")). So you can use the string->symbol and string->number functions to convert your entity input:

#lang pollen
div{string->symbol{copy}
     string->number{169}}

'(div copy "\n" 169)

Notice that in the output, there are no more quote marks around copy and 169, indicating that they’re not strings. When you pass this result to a converter like ->html, the entities will be escaped correctly:

#lang pollen
(require pollen/template)
 
->html{div{copy 169}}
 
->html{div{string->symbol{copy} string->number{169}}}

<div>copy 169</div>

<div>&copy; &#169;</div>

For numeric entities, you can also use a four-digit Unicode hex number by prefacing it with #x, which is the standard Racket prefix for a hex number:

#lang pollen
div{string->number{169}
     string->number{#x00a9}}

'(div 169 "\n" 169)

Of course, you don’t need to use string->symbol and string->number directly in your source. You can also define tag functions that generate entities. The key point is that to be treated as an entity, the return value must be a symbol or number, rather than a string.

5 Adding Pollen-mode commands to a Racket file

 #lang pollen/exp package: pollen

Just as you can embed any Racket-mode command in a Pollen source file, you can go the other way and embed Pollen-mode commands in a Racket file. For instance, in your (part "The__pollen_rkt__file"), you may find it convenient to use Pollen mode for certain values.

You enable Pollen mode within your source file by adding pollen/exp to your #lang line at the top of your source:

"pollen.rkt"
#lang pollen/exp racket/base
(require pollen/tag)
 
(define link (make-default-tag-function 'a))
 
(define (home-link)
  (link #:href "index.html" "Click to go home"))
 
(define (home-link-pollen-mode)
  link[#:href "index.html"]{Click to go home})
 

Here, both (home-link) and (home-link-pollen-mode) will produce the same X-expression as a result:

'(a ((href "index.html")) "Click to go home")

Of course, you can use pollen/exp in any Racket source file, not just "pollen.rkt".

Keep in mind that pollen/exp is just a syntactic convenience. It doesn’t change any of the underlying semantics of your Racket source file. Your Pollen-mode commands are being translated into Racket commands and compiled along with everything else.

Another good way to use Pollen-mode commands in Racket is for unit tests with rackunit. With pollen/exp, you can write your unit tests in Pollen mode or Racket mode (or mix them).

Unit tests are little one-line tests you put into your code to verify it does what you expect. You do this with the rackunit library, which is beloved by all Racket programmers. For more, see (part ("(lib rackunit/scribblings/rackunit.scrbl)" "quick-start")).

"pollen.rkt"
#lang pollen/exp racket/base
(require rackunit)
 
(define (tag-fn arg . text-args)
  `(div ((class ,arg)) ,@text-args))
 
(check-equal? tag-fn["42"]{hello world}
              '(div ((class "42")) "hello world"))
 
(check-equal? (tag-fn "42" "hello world")
              '(div ((class "42")) "hello world"))
 
(check-equal? tag-fn["42"]{hello world}
              'div[((class "42"))]{hello world})
 

6 Further reading

The Pollen language is a variant of Racket’s own text-processing language, called Scribble. Thus, most things that can be done with Scribble syntax can also be done with Pollen syntax. For the sake of clarity & brevity, I’ve only shown you the highlights here. But if you want the full story, see (part ("(lib scribblings/scribble/scribble.scrbl)" "reader")) in the Scribble documentation.

 
\ No newline at end of file diff --git a/scribblings/command.scrbl b/pollen/scribblings/command.scrbl similarity index 98% rename from scribblings/command.scrbl rename to pollen/scribblings/command.scrbl index 1da56f2..d1d389c 100644 --- a/scribblings/command.scrbl +++ b/pollen/scribblings/command.scrbl @@ -29,7 +29,7 @@ Here's how you type it: @bold{Ubuntu}: ctrl + shift + U, then 25CA -Still, if you don't want to use the lozenge as your command character, you can set Pollen's @racket[world:command-char] value to whatever character you want (see also @seclink["settable-values"]). +Still, if you don't want to use the lozenge as your command character, you can set Pollen's @racket[world:command-char] value to whatever character you want (see also @seclink["world-overrides"]). @margin-note{Scribble uses the @"@" sign as a delimiter. It's not a bad choice if you only work with Racket files. But as you use Pollen to work on other kinds of text-based files that commonly contain @"@" signs — HTML pages especially — it gets cumbersome. So I changed it.} @@ -371,13 +371,13 @@ For instance, suppose we want to use @code{map} as a tag even though Racket is u @repl-output{'(my-map "How I would love this to be a map.")} -But @code{my-map} is not the tag we want. We need to define @code{my-map} to be a tag function for @code{map}. We can do this with the Pollen helper @racket[make-default-tag-function]. That function lives in @racket[pollen/tag], so we @racket[require] that too: +But @code{my-map} is not the tag we want. We need to define @code{my-map} to be a tag function for @code{map}. We can do this with the Pollen helper @racket[default-tag-function]. That function lives in @racket[pollen/tag], so we @racket[require] that too: @codeblock|{ #lang pollen ◊(require pollen/tag) -◊(define my-map (make-default-tag-function 'map)) +◊(define my-map (default-tag-function 'map)) ◊my-map{How I would love this to be a map.} }| @@ -546,7 +546,7 @@ Second, the metas are collected into a hash table that is exported with the name @terminal{ > metas -'#hash((dog . "Roxy") (cat . "Chopper") (here-path . "unsaved-editor")) +'#hasheq((dog . "Roxy") (cat . "Chopper") (here-path . "unsaved-editor")) } The only key that's automatically defined in every meta table is @code{here-path}, which is the absolute path to the source file. (In this case, because the file hasn't been saved, you'll see the @code{unsaved-editor} name instead.) @@ -567,7 +567,7 @@ When you run this code, the result will be the same as before, but this time the @terminal{ > metas -'#hash((dog . "Roxy") (cat . "Chopper") (here-path . "tesseract")) +'#hasheq((dog . "Roxy") (cat . "Chopper") (here-path . "tesseract")) } @@ -583,7 +583,7 @@ In this case, though there are two metas named @racket[dog] (and they use differ @terminal{ > metas -'#hash((dog . "Lex") (here-path . "unsaved-editor")) +'#hasheq((dog . "Lex") (here-path . "unsaved-editor")) } @bold{Pro tip}: the @racket[metas] hashtable is available when you import a Pollen source file in the usual way, but it's also made available through a submodule called, unsurprisingly, @racket[metas]. @@ -643,7 +643,7 @@ The result of this file will be: And the metas: @terminal{ > metas -'#hash((title . "The Amazing Truth") (here-path . "unsaved-editor")) +'#hasheq((title . "The Amazing Truth") (here-path . "unsaved-editor")) } You cannot, however, use @racket[hash-set!] or other similar functions, because @racket[metas] is an immutable hash. @@ -921,7 +921,7 @@ You enable Pollen mode within your source file by adding @racketmodname[pollen/m #lang pollen/mode racket/base (require pollen/tag) -(define link (make-default-tag-function 'a)) +(define link (default-tag-function 'a)) (define (home-link) (link #:href "index.html" "Click to go home")) diff --git a/scribblings/dashboard.png b/pollen/scribblings/dashboard.png similarity index 100% rename from scribblings/dashboard.png rename to pollen/scribblings/dashboard.png diff --git a/pollen/scribblings/decode.html b/pollen/scribblings/decode.html new file mode 100644 index 0000000..afb3617 --- /dev/null +++ b/pollen/scribblings/decode.html @@ -0,0 +1,2 @@ + +Decode
6.3.0.14

Decode

 (require pollen/decode) package: pollen

The doc export of a Pollen markup file is a simple X-expression. Decoding refers to any post-processing of this X-expression. The pollen/decode module provides tools for creating decoders.

The decode step can happen separately from the compilation of the file. But you can also attach a decoder to the markup file’s root node, so the decoding happens automatically when the markup is compiled, and thus automatically incorporated into doc. (Following this approach, you could also attach multiple decoders to different tags within doc.)

You can, of course, embed function calls within Pollen markup. But since markup is optimized for authors, decoding is useful for operations that can or should be moved out of the authoring layer.

One example is presentation and layout. For instance, detect-paragraphs is a decoder function that lets authors mark paragraphs in their source simply by using two carriage returns.

Another example is conversion of output into a particular data format. Most Pollen functions are optimized for HTML output, but one could write a decoder that targets another format.

procedure

(decode tagged-xexpr 
  [#:txexpr-tag-proc txexpr-tag-proc 
  #:txexpr-attrs-proc txexpr-attrs-proc 
  #:txexpr-elements-proc txexpr-elements-proc 
  #:txexpr-proc txexpr-proc 
  #:block-txexpr-proc block-txexpr-proc 
  #:inline-txexpr-proc inline-txexpr-proc 
  #:string-proc string-proc 
  #:entity-proc entity-proc 
  #:cdata-proc cdata-proc 
  #:exclude-tags tags-to-exclude 
  #:exclude-attrs attrs-to-exclude]) 
  (or/c xexpr/c (listof xexpr/c))
  tagged-xexpr : txexpr?
  txexpr-tag-proc : (txexpr-tag? . -> . txexpr-tag?)
   = (λ(tag) tag)
  txexpr-attrs-proc : (txexpr-attrs? . -> . txexpr-attrs?)
   = (λ(attrs) attrs)
  txexpr-elements-proc : (txexpr-elements? . -> . txexpr-elements?)
   = (λ(elements) elements)
  txexpr-proc : (txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  block-txexpr-proc : (block-txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  inline-txexpr-proc : (txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  string-proc : (string? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(str) str)
  entity-proc : ((or/c symbol? valid-char?) . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(ent) ent)
  cdata-proc : (cdata? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(cdata) cdata)
  tags-to-exclude : (listof txexpr-tag?) = null
  attrs-to-exclude : txexpr-attrs? = null
Recursively process a tagged-xexpr, usually the one exported from a Pollen source file as doc.

This function doesn’t do much on its own. Rather, it provides the hooks upon which harder-working functions can be hung.

Recall that in Pollen, all (part "tags-are-functions"). By default, the tagged-xexpr from a source file is tagged with root. So the typical way to use decode is to attach your decoding functions to it, and then define root to invoke your decode function. Then it will be automatically applied to every doc during compile.

For instance, here’s how decode is attached to root in Butterick’s Practical Typography. There’s not much to it —

(define (root . items)
  (decode (txexpr 'root '() items)
          #:txexpr-elements-proc detect-paragraphs
          #:block-txexpr-proc (compose1 hyphenate wrap-hanging-quotes)
          #:string-proc (compose1 smart-quotes smart-dashes)
          #:exclude-tags '(style script)))

The hyphenate function is not part of Pollen, but rather the hyphenate package, which you can install separately.

This illustrates another important point: even though decode presents an imposing list of arguments, you’re unlikely to use all of them at once. These represent possibilities, not requirements. For instance, let’s see what happens when decode is invoked without any of its optional arguments.

Examples:
> (define tx '(root "I wonder" (em "why") "this works."))
> (decode tx)

'(root "I wonder" (em "why") "this works.")

Right — nothing. That’s because the default value for the decoding arguments is the identity function, (λ (x) x). So all the input gets passed through intact unless another action is specified.

The *-proc arguments of decode take procedures that are applied to specific categories of elements within txexpr.

The txexpr-tag-proc argument is a procedure that handles X-expression tags.

Examples:
> (define tx '(p "I'm from a strange" (strong "namespace")))
; Tags are symbols, so a tag-proc should return a symbol
> (decode tx #:txexpr-tag-proc (λ(t) (string->symbol (format "ns:~a" t))))

'(ns:p "I'm from a strange" (ns:strong "namespace"))

The txexpr-attrs-proc argument is a procedure that handles lists of X-expression attributes. (The txexpr module, included at no extra charge with Pollen, includes useful helper functions for dealing with these attribute lists.)

Examples:
> (define tx '(p ((id "first")) "If I only had a brain."))
; Attrs is a list, so cons is OK for simple cases
> (decode tx #:txexpr-attrs-proc (λ(attrs) (cons '[class "PhD"] attrs)))

'(p ((class "PhD") (id "first")) "If I only had a brain.")

Note that txexpr-attrs-proc will change the attributes of every tagged X-expression, even those that don’t have attributes. This is useful, because sometimes you want to add attributes where none existed before. But be careful, because the behavior may make your processing function overinclusive.

Examples:
> (define tx '(div (p ((id "first")) "If I only had a brain.")
  (p "Me too.")))
; This will insert the new attribute everywhere
> (decode tx #:txexpr-attrs-proc (λ(attrs) (cons '[class "PhD"] attrs)))

'(div

  ((class "PhD"))

  (p ((class "PhD") (id "first")) "If I only had a brain.")

  (p ((class "PhD")) "Me too."))

; This will add the new attribute only to non-null attribute lists
> (decode tx #:txexpr-attrs-proc
  (λ(attrs) (if (null? attrs) attrs (cons '[class "PhD"] attrs))))

'(div (p ((class "PhD") (id "first")) "If I only had a brain.") (p "Me too."))

The txexpr-elements-proc argument is a procedure that operates on the list of elements that represents the content of each tagged X-expression. Note that each element of an X-expression is subject to two passes through the decoder: once now, as a member of the list of elements, and also later, through its type-specific decoder (i.e., string-proc, entity-proc, and so on).

Examples:
> (define tx '(div "Double" "\n" "toil" amp "trouble"))
; Every element gets doubled ...
> (decode tx #:txexpr-elements-proc (λ(es) (append-map (λ(e) (list e e)) es)))

'(div "Double" "Double" "\n" "\n" "toil" "toil" amp amp "trouble" "trouble")

; ... but only strings get capitalized
> (decode tx #:txexpr-elements-proc (λ(es) (append-map (λ(e) (list e e)) es))
  #:string-proc (λ(s) (string-upcase s)))

'(div "DOUBLE" "DOUBLE" "\n" "\n" "TOIL" "TOIL" amp amp "TROUBLE" "TROUBLE")

So why do you need txexpr-elements-proc? Because some types of element decoding depend on context, thus it’s necessary to handle the elements as a group. For instance, paragraph detection. The behavior is not merely a map across each element, because elements are being removed and altered contextually:

Examples:
> (define (paras tx) (decode tx #:txexpr-elements-proc detect-paragraphs))
; Context matters. Trailing whitespace is ignored ...
> (paras '(body "The first paragraph." "\n\n"))

'(body "The first paragraph.")

; ... but whitespace between strings is converted to a break.
> (paras '(body "The first paragraph." "\n\n" "And another."))

'(body (p "The first paragraph.") (p "And another."))

; A combination of both types
> (paras '(body "The first paragraph." "\n\n" "And another." "\n\n"))

'(body (p "The first paragraph.") (p "And another."))

The txexpr-proc, block-txexpr-proc, and inline-txexpr-proc arguments are procedures that operate on tagged X-expressions. If the X-expression meets the block-txexpr? test, it’s processed by block-txexpr-proc. Otherwise, it’s inline, so it’s processed by inline-txexpr-proc. (Careful, however — these aren’t mutually exclusive, because block-txexpr-proc operates on all the elements of a block, including other tagged X-expressions within.) Then both categories are processed by txexpr-proc.

Examples:
> (define tx '(div "Please" (em "mind the gap") (h1 "Tuesdays only")))
> (define add-ns (λ(tx) (make-txexpr
      (string->symbol (format "ns:~a" (get-tag tx)))
      (get-attrs tx)
      (get-elements tx))))
; div and h1 are block elements, so this will only affect them
> (decode tx #:block-txexpr-proc add-ns)

'(ns:div "Please" (em "mind the gap") (ns:h1 "Tuesdays only"))

; em is an inline element, so this will only affect it
> (decode tx #:inline-txexpr-proc add-ns)

'(div "Please" (ns:em "mind the gap") (h1 "Tuesdays only"))

; this will affect all elements
> (decode tx #:block-txexpr-proc add-ns #:inline-txexpr-proc add-ns)

'(ns:div "Please" (ns:em "mind the gap") (ns:h1 "Tuesdays only"))

; as will this
> (decode tx #:txexpr-proc add-ns)

'(ns:div "Please" (ns:em "mind the gap") (ns:h1 "Tuesdays only"))

The string-proc, entity-proc, and cdata-proc arguments are procedures that operate on X-expressions that are strings, entities, and CDATA, respectively. Deliberately, the output contracts for these procedures accept any kind of X-expression (meaning, the procedure can change the X-expression type).

Examples:
; A div with string, entity, and cdata elements
> (define tx `(div "Moe" amp 62 ,(cdata #f #f "3 > 2;")))
> (define rulify (λ(x) '(hr)))
; The rulify function is selectively applied to each
> (print (decode tx #:string-proc rulify))

(list 'div '(hr) 'amp 62 (cdata #f #f "3 > 2;"))

> (print (decode tx #:entity-proc rulify))

(list 'div "Moe" #0='(hr) #0# (cdata #f #f "3 > 2;"))

> (print (decode tx #:cdata-proc rulify))

'(div "Moe" amp 62 (hr))

Note that entities come in two flavors — symbolic and numeric — and entity-proc affects both. If you only want to affect one or the other, you can add a test within entity-proc. Symbolic entities can be detected with symbol?, and numeric entities with valid-char?:

Examples:
> (define tx `(div amp 62))
> (define symbolic-detonate (λ(x) (if (symbol? x) 'BOOM x)))
> (print (decode tx #:entity-proc symbolic-detonate))

'(div BOOM 62)

> (define numeric-detonate (λ(x) (if (valid-char? x) 'BOOM x)))
> (print (decode tx #:entity-proc numeric-detonate))

'(div amp BOOM)

The five previous procedures — block-txexpr-proc, inline-txexpr-proc, string-proc, entity-proc, and cdata-proc — can return either a single X-expression, or a list of X-expressions, which will be spliced into the parent at the same point.

For instance, earlier we saw how to double elements by using txexpr-elements-proc. But you can accomplish the same thing on a case-by-case basis by returning a list of values:

Examples:
; A div with string, entity, and inline-txexpr elements
> (define tx `(div "Axl" amp (span "Slash")))
> (define doubler (λ(x) (list x x)))
; The doubler function is selectively applied to each type of element
> (print (decode tx #:string-proc doubler))

'(div "Axl" "Axl" amp (span "Slash" "Slash"))

> (print (decode tx #:entity-proc doubler))

'(div "Axl" (amp amp) (span "Slash"))

> (print (decode tx #:inline-txexpr-proc doubler))

'(div "Axl" amp (span "Slash") (span "Slash"))

Caution: when returning list values, it’s possible to trip over the unavoidable ambiguity between a txexpr? and a list of xexpr?s that happens to begin with a symbolic entity:

Examples:
; An ambiguous expression
> (define amb '(guitar "player-name"))
> (and (txexpr-elements? amb) (txexpr? amb))

#t

; Ambiguity in context
> (define x '(gnr "Izzy" "Slash"))
> (define rockit (λ(str) (list 'guitar str)))
; Expecting '(gnr guitar "Izzy" guitar "Slash") from next line,
but return value will be treated as tagged X-expression
> (decode x #:string-proc rockit)

'(gnr (guitar "Izzy") (guitar "Slash"))

; Changing the order makes it unambiguous
> (define rockit2 (λ(str) (list str 'guitar)))
> (decode x #:string-proc rockit2)

'(gnr "Izzy" guitar "Slash" guitar)

The tags-to-exclude argument is a list of tags that will be exempted from decoding. Though you could get the same result by testing the input within the individual decoding functions, that’s tedious and potentially slower.

Examples:
> (define tx '(p "I really think" (em "italics") "should be lowercase."))
> (decode tx #:string-proc string-upcase)

'(p "I REALLY THINK" (em "ITALICS") "SHOULD BE LOWERCASE.")

> (decode tx #:string-proc string-upcase #:exclude-tags '(em))

'(p "I REALLY THINK" (em "italics") "SHOULD BE LOWERCASE.")

The tags-to-exclude argument is useful if you’re decoding source that’s destined to become HTML. According to the HTML spec, material within a <style> or <script> block needs to be preserved literally. In this example, if the CSS and JavaScript blocks are capitalized, they won’t work. So exclude '(style script), and problem solved.

Examples:
> (define tx '(body (h1 ((class "Red")) "Let's visit Planet Telex.")
  (style ((type "text/css")) ".Red {color: green;}")
  (script ((type "text/javascript")) "var area = h * w;")))
> (decode tx #:string-proc string-upcase)

'(body

  (h1 ((class "Red")) "LET'S VISIT PLANET TELEX.")

  (style ((type "text/css")) ".RED {COLOR: GREEN;}")

  (script ((type "text/javascript")) "VAR AREA = H * W;"))

> (decode tx #:string-proc string-upcase #:exclude-tags '(style script))

'(body

  (h1 ((class "Red")) "LET'S VISIT PLANET TELEX.")

  (style ((type "text/css")) ".Red {color: green;}")

  (script ((type "text/javascript")) "var area = h * w;"))

Finally, the attrs-to-exclude argument works the same way as tags-to-exclude, but instead of excluding an element based on its tag, it excludes based on whether the element has a matching attribute/value pair.

Examples:
> (define tx '(p (span "No attrs") (span ((id "foo")) "One attr")))
> (decode tx #:string-proc string-upcase)

'(p (span "NO ATTRS") (span ((id "foo")) "ONE ATTR"))

> (decode tx #:string-proc string-upcase #:exclude-attrs '((id "foo")))

'(p (span "NO ATTRS") (span ((id "foo")) "One attr"))

procedure

(decode-elements elements 
  [#:txexpr-tag-proc txexpr-tag-proc 
  #:txexpr-attrs-proc txexpr-attrs-proc 
  #:txexpr-elements-proc txexpr-elements-proc 
  #:txexpr-proc txexpr-proc 
  #:block-txexpr-proc block-txexpr-proc 
  #:inline-txexpr-proc inline-txexpr-proc 
  #:string-proc string-proc 
  #:entity-proc entity-proc 
  #:cdata-proc cdata-proc 
  #:exclude-tags tags-to-exclude 
  #:exclude-attrs attrs-to-exclude]) 
  (or/c xexpr/c (listof xexpr/c))
  elements : txexpr-elements?
  txexpr-tag-proc : (txexpr-tag? . -> . txexpr-tag?)
   = (λ(tag) tag)
  txexpr-attrs-proc : (txexpr-attrs? . -> . txexpr-attrs?)
   = (λ(attrs) attrs)
  txexpr-elements-proc : (txexpr-elements? . -> . txexpr-elements?)
   = (λ(elements) elements)
  txexpr-proc : (txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  block-txexpr-proc : (block-txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  inline-txexpr-proc : (txexpr? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(tx) tx)
  string-proc : (string? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(str) str)
  entity-proc : ((or/c symbol? valid-char?) . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(ent) ent)
  cdata-proc : (cdata? . -> . (or/c xexpr? (listof xexpr?)))
   = (λ(cdata) cdata)
  tags-to-exclude : (listof txexpr-tag?) = null
  attrs-to-exclude : txexpr-attrs? = null
Identical to decode, but takes txexpr-elements? as input rather than a whole tagged X-expression, and likewise returns txexpr-elements? rather than a tagged X-expression. A convenience variant for use inside tag functions.

procedure

(block-txexpr? v)  boolean?

  v : any/c
Predicate that tests whether v has a tag that is among the world:current-block-tags. If not, it is treated as inline.

This predicate affects the behavior of other functions. For instance, detect-paragraphs knows that block elements in the markup shouldn’t be wrapped in a p tag. So if you introduce a new block element called bloq without configuring it as a block, misbehavior will follow:

Examples:
> (define (paras tx) (decode tx #:txexpr-elements-proc detect-paragraphs))
> (paras '(body "I want to be a paragraph." "\n\n" (bloq "But not me.")))

'(body (p "I want to be a paragraph.") (p (bloq "But not me.")))

; Wrong: bloq should not be wrapped

To change how this test works, use a config submodule as described in (part "settable-values"):

(module config racket/base
  (provide (all-defined-out))
  (require pollen/world)
  (define block-tags (cons 'bloq world:block-tags)))

After that change, the result will be:

’(body (p "I want to be a paragraph.") (bloq "But not me."))

The default block tags are:

root address article aside blockquote body canvas dd div dl fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr li main nav noscript ol output p pre section table tfoot ul video

1 Typography

An assortment of typography & layout functions, designed to be used with decode. These aren’t hard to write. So if you like these, use them. If not, make your own.

procedure

(whitespace? v)  boolean?

  v : any/c
A predicate that returns #t for any stringlike v that’s entirely whitespace, but also the empty string, as well as lists and vectors that are made only of whitespace? members. Following the regexp-match convention, whitespace? does not return #t for a nonbreaking space. If you prefer that behavior, use whitespace/nbsp?.

Examples:
> (whitespace? "\n\n   ")

#t

> (whitespace? (string->symbol "\n\n   "))

#t

> (whitespace? "")

#t

> (whitespace? '("" "  " "\n\n\n" " \n"))

#t

> (define nonbreaking-space (format "~a" #\u00A0))
> (whitespace? nonbreaking-space)

#f

procedure

(whitespace/nbsp? v)  boolean?

  v : any/c
Like whitespace?, but also returns #t for nonbreaking spaces.

Examples:
> (whitespace/nbsp? "\n\n   ")

#t

> (whitespace/nbsp? (string->symbol "\n\n   "))

#t

> (whitespace/nbsp? "")

#t

> (whitespace/nbsp? '("" "  " "\n\n\n" " \n"))

#t

> (define nonbreaking-space (format "~a" #\u00A0))
> (whitespace/nbsp? nonbreaking-space)

#t

procedure

(smart-quotes str)  string?

  str : string?
Convert straight quotes in str to curly according to American English conventions.

Examples:
> (define tricky-string
  "\"Why,\" she could've asked, \"are we in O‘ahu watching 'Mame'?\"")
> (display tricky-string)

"Why," she could've asked, "are we in O‘ahu watching 'Mame'?"

> (display (smart-quotes tricky-string))

“Why,” she could’ve asked, “are we in O‘ahu watching ‘Mame’?”

procedure

(smart-dashes str)  string?

  str : string?
In str, convert three hyphens to an em dash, and two hyphens to an en dash, and remove surrounding spaces.

Examples:
> (define tricky-string "I had a few --- OK, like 6--8 --- thin mints.")
> (display tricky-string)

I had a few --- OK, like 6--8 --- thin mints.

> (display (smart-dashes tricky-string))

I had a few—OK, like 6–8—thin mints.

; Monospaced font not great for showing dashes, but you get the idea

procedure

(merge-newlines elements)  (listof xexpr?)

  elements : (listof xexpr?)
Within elements, merge sequential newline characters ("\n") into a single whitespace element. Helper function used by detect-paragraphs.

Example:
> (merge-newlines '(p "\n" "\n" "foo" "\n" "\n\n" "bar"
    (em "\n" "\n" "\n")))

'(p "\n\n" "foo" "\n\n\n" "bar" (em "\n\n\n"))

procedure

(detect-linebreaks tagged-xexpr-elements    
  [#:separator linebreak-sep    
  #:insert linebreak])  (listof xexpr?)
  tagged-xexpr-elements : (listof xexpr?)
  linebreak-sep : string? = (world:current-linebreak-separator)
  linebreak : xexpr? = '(br)
Within tagged-xexpr-elements, convert occurrences of linebreak-sep ("\n" by default) to linebreak, but only if linebreak-sep does not occur between blocks (see block-txexpr?). Why? Because block-level elements automatically display on a new line, so adding linebreak would be superfluous. In that case, linebreak-sep just disappears.

Examples:
> (detect-linebreaks '(div "Two items:" "\n" (em "Eggs") "\n" (em "Bacon")))

'(div "Two items:" (br) (em "Eggs") (br) (em "Bacon"))

> (detect-linebreaks '(div "Two items:" "\n" (div "Eggs") "\n" (div "Bacon")))

'(div "Two items:" (div "Eggs") (div "Bacon"))

procedure

(detect-paragraphs elements 
  [#:separator paragraph-sep 
  #:tag paragraph-tag 
  #:linebreak-proc linebreak-proc 
  #:force? force-paragraph?]) 
  (listof xexpr?)
  elements : (listof xexpr?)
  paragraph-sep : string? = (world:current-paragraph-separator)
  paragraph-tag : symbol? = 'p
  linebreak-proc : ((listof xexpr?) . -> . (listof xexpr?))
   = detect-linebreaks
  force-paragraph? : boolean? = #f
Find paragraphs within elements and wrap them with paragraph-tag. Also handle linebreaks using detect-linebreaks.

What counts as a paragraph? Any elements that are either a) explicitly set apart with paragraph-sep, or b) adjacent to a block-txexpr? (in which case the paragraph-ness is implied).

Examples:
> (detect-paragraphs '("Explicit para" "\n\n" "Explicit para"))

'((p "Explicit para") (p "Explicit para"))

> (detect-paragraphs '("Explicit para" "\n\n" "Explicit para" "\n" "Explicit line"))

'((p "Explicit para") (p "Explicit para" (br) "Explicit line"))

> (detect-paragraphs '("Implied para" (div "Block") "Implied para"))

'((p "Implied para") (div "Block") (p "Implied para"))

If element is already a block, it will not be wrapped as a paragraph (because in that case, the wrapping would be superfluous). Thus, as a consequence, if paragraph-sep occurs between two blocks, it will be ignored (as in the example below using two sequential div blocks.) Likewise, paragraph-sep will also be ignored if it occurs between a block and a non-block (because a paragraph break is already implied).

Examples:
; The explicit "\n\n" makes no difference in these cases
> (detect-paragraphs '((div "First block") "\n\n" (div "Second block")))

'((div "First block") (div "Second block"))

> (detect-paragraphs '((div "First block") (div "Second block")))

'((div "First block") (div "Second block"))

> (detect-paragraphs '("Para" "\n\n" (div "Block")))

'((p "Para") (div "Block"))

> (detect-paragraphs '("Para" (div "Block")))

'((p "Para") (div "Block"))

The paragraph-tag argument sets the tag used to wrap paragraphs.

Example:
> (detect-paragraphs '("First para" "\n\n" "Second para") #:tag 'ns:p)

'((ns:p "First para") (ns:p "Second para"))

The linebreak-proc argument allows you to use a different linebreaking procedure other than the usual detect-linebreaks.

Example:
> (detect-paragraphs '("First para" "\n\n" "Second para" "\n" "Second line")
  #:linebreak-proc (λ(x) (detect-linebreaks x #:insert '(newline))))

'((p "First para") (p "Second para" (newline) "Second line"))

The #:force? option will wrap a paragraph tag around elements, even if no explicit or implicit paragraph breaks are found. The #:force? option is useful for when you want to guarantee that you always get a list of blocks.

Examples:
> (detect-paragraphs '("This" (span "will not be") "a paragraph"))

'("This" (span "will not be") "a paragraph")

> (detect-paragraphs '("But this" (span "will be") "a paragraph") #:force? #t)

'((p "But this" (span "will be") "a paragraph"))

procedure

(wrap-hanging-quotes tx 
  [#:single-preprend single-preprender 
  #:double-preprend double-preprender]) 
  txexpr?
  tx : txexpr?
  single-preprender : txexpr-tag? = 'squo
  double-preprender : txexpr-tag? = 'dquo
Find single or double quote marks at the beginning of tx and wrap them in an X-expression with the tag single-preprender or double-preprender, respectively. The default values are 'squo and 'dquo.

Examples:
> (wrap-hanging-quotes '(p "No quote to hang."))

'(p "No quote to hang.")

> (wrap-hanging-quotes '(p "“What? We need to hang quotes?”"))

'(p (dquo "“" "What? We need to hang quotes?”"))

In pro typography, quotation marks at the beginning of a line or paragraph are often shifted into the margin slightly to make them appear more optically aligned with the left edge of the text. With a reflowable layout model like HTML, you don’t know where your line breaks will be.

This function will simply insert the 'squo and 'dquo tags, which provide hooks that let you do the actual hanging via CSS, like so (actual measurement can be refined to taste):

squo {margin-left: -0.25em;}

dquo {margin-left: -0.50em;}

Be warned: there are many edge cases this function does not handle well.

Examples:
; Argh: this edge case is not handled properly
> (wrap-hanging-quotes '(p "“" (em "What?") "We need to hang quotes?”"))

'(p "“" (em "What?") "We need to hang quotes?”")

 
\ No newline at end of file diff --git a/scribblings/decode.scrbl b/pollen/scribblings/decode.scrbl similarity index 60% rename from scribblings/decode.scrbl rename to pollen/scribblings/decode.scrbl index 66061aa..e00413c 100644 --- a/scribblings/decode.scrbl +++ b/pollen/scribblings/decode.scrbl @@ -1,6 +1,6 @@ #lang scribble/manual -@(require scribble/eval pollen/decode pollen/world (prefix-in html: pollen/html) txexpr (for-label racket (except-in pollen #%module-begin) pollen/world pollen/cache pollen/decode txexpr xml pollen/html)) +@(require "mb-tools.rkt" scribble/eval pollen/decode pollen/world txexpr racket/string (for-label racket(except-in pollen #%module-begin) pollen/world pollen/cache pollen/decode txexpr xml)) @(define my-eval (make-base-eval)) @(my-eval `(require pollen pollen/decode xml racket/list txexpr)) @@ -16,7 +16,7 @@ The decode step can happen separately from the compilation of the file. But you You can, of course, embed function calls within Pollen markup. But since markup is optimized for authors, decoding is useful for operations that can or should be moved out of the authoring layer. -One example is presentation and layout. For instance, @racket[detect-paragraphs] is a decoder function that lets authors mark paragraphs in their source simply by using two carriage returns. +One example is presentation and layout. For instance, @racket[decode-paragraphs] is a decoder function that lets authors mark paragraphs in their source simply by using two carriage returns. Another example is conversion of output into a particular data format. Most Pollen functions are optimized for HTML output, but one could write a decoder that targets another format. @@ -28,6 +28,7 @@ Another example is conversion of output into a particular data format. Most Poll [#:txexpr-tag-proc txexpr-tag-proc (txexpr-tag? . -> . txexpr-tag?) (λ(tag) tag)] [#:txexpr-attrs-proc txexpr-attrs-proc (txexpr-attrs? . -> . txexpr-attrs?) (λ(attrs) attrs)] [#:txexpr-elements-proc txexpr-elements-proc (txexpr-elements? . -> . txexpr-elements?) (λ(elements) elements)] +[#:txexpr-proc txexpr-proc (txexpr? . -> . (or/c xexpr? (listof xexpr?))) (λ(tx) tx)] [#:block-txexpr-proc block-txexpr-proc (block-txexpr? . -> . (or/c xexpr? (listof xexpr?))) (λ(tx) tx)] [#:inline-txexpr-proc inline-txexpr-proc (txexpr? . -> . (or/c xexpr? (listof xexpr?))) (λ(tx) tx)] [#:string-proc string-proc (string? . -> . (or/c xexpr? (listof xexpr?))) (λ(str) str)] @@ -47,8 +48,8 @@ For instance, here's how @racket[decode] is attached to @racket[root] in @link[" @racketblock[ (define (root . items) - (decode (make-txexpr 'root '() items) - #:txexpr-elements-proc detect-paragraphs + (decode (txexpr 'root '() items) + #:txexpr-elements-proc decode-paragraphs #:block-txexpr-proc (compose1 hyphenate wrap-hanging-quotes) #:string-proc (compose1 smart-quotes smart-dashes) #:exclude-tags '(style script))) @@ -78,7 +79,7 @@ The @racket[_txexpr-tag-proc] argument is a procedure that handles X-expression The @racket[_txexpr-attrs-proc] argument is a procedure that handles lists of X-expression attributes. (The @racketmodname[txexpr] module, included at no extra charge with Pollen, includes useful helper functions for dealing with these attribute lists.) @examples[#:eval my-eval -(define tx '(p [[id "first"]] "If I only had a brain.")) +(define tx '(p ((id "first")) "If I only had a brain.")) (code:comment @#,t{Attrs is a list, so cons is OK for simple cases}) (decode tx #:txexpr-attrs-proc (λ(attrs) (cons '[class "PhD"] attrs ))) ] @@ -86,7 +87,7 @@ The @racket[_txexpr-attrs-proc] argument is a procedure that handles lists of X- Note that @racket[_txexpr-attrs-proc] will change the attributes of every tagged X-expression, even those that don't have attributes. This is useful, because sometimes you want to add attributes where none existed before. But be careful, because the behavior may make your processing function overinclusive. @examples[#:eval my-eval -(define tx '(div (p [[id "first"]] "If I only had a brain.") +(define tx '(div (p ((id "first")) "If I only had a brain.") (p "Me too."))) (code:comment @#,t{This will insert the new attribute everywhere}) (decode tx #:txexpr-attrs-proc (λ(attrs) (cons '[class "PhD"] attrs ))) @@ -107,10 +108,10 @@ The @racket[_txexpr-elements-proc] argument is a procedure that operates on the #:string-proc (λ(s) (string-upcase s))) ] -So why do you need @racket[_txexpr-elements-proc]? Because some types of element decoding depend on context, thus it's necessary to handle the elements as a group. For instance, paragraph detection. The behavior is not merely a @racket[map] across each element, because elements are being removed and altered contextually: +So why do you need @racket[_txexpr-elements-proc]? Because some types of element decoding depend on context, thus it's necessary to handle the elements as a group. For instance, paragraph decodeion. The behavior is not merely a @racket[map] across each element, because elements are being removed and altered contextually: @examples[#:eval my-eval -(define (paras tx) (decode tx #:txexpr-elements-proc detect-paragraphs)) +(define (paras tx) (decode tx #:txexpr-elements-proc decode-paragraphs)) (code:comment @#,t{Context matters. Trailing whitespace is ignored ...}) (paras '(body "The first paragraph." "\n\n")) (code:comment @#,t{... but whitespace between strings is converted to a break.}) @@ -120,9 +121,7 @@ So why do you need @racket[_txexpr-elements-proc]? Because some types of element ] -The @racket[_block-txexpr-proc] argument and the @racket[_inline-txexpr-proc] arguments are procedures that operate on tagged X-expressions. If the X-expression meets the @racket[block-txexpr?] test, it's processed by @racket[_block-txexpr-proc]. Otherwise, it's inline, so it's processed by @racket[_inline-txexpr-proc]. (Careful, however — these aren't mutually exclusive, because @racket[_block-txexpr-proc] operates on all the elements of a block, including other tagged X-expressions within.) - -Of course, if you want block and inline elements to be handled the same way, you can set @racket[_block-txexpr-proc] and @racket[_inline-txexpr-proc] to be the same procedure. +The @racket[_txexpr-proc], @racket[_block-txexpr-proc], and @racket[_inline-txexpr-proc] arguments are procedures that operate on tagged X-expressions. If the X-expression meets the @racket[block-txexpr?] test, it's processed by @racket[_block-txexpr-proc]. Otherwise, it's inline, so it's processed by @racket[_inline-txexpr-proc]. (Careful, however — these aren't mutually exclusive, because @racket[_block-txexpr-proc] operates on all the elements of a block, including other tagged X-expressions within.) Then both categories are processed by @racket[_txexpr-proc]. @examples[#:eval my-eval (define tx '(div "Please" (em "mind the gap") (h1 "Tuesdays only"))) @@ -136,6 +135,8 @@ Of course, if you want block and inline elements to be handled the same way, you (decode tx #:inline-txexpr-proc add-ns) (code:comment @#,t{this will affect all elements}) (decode tx #:block-txexpr-proc add-ns #:inline-txexpr-proc add-ns) +(code:comment @#,t{as will this}) +(decode tx #:txexpr-proc add-ns) ] The @racket[_string-proc], @racket[_entity-proc], and @racket[_cdata-proc] arguments are procedures that operate on X-expressions that are strings, entities, and CDATA, respectively. Deliberately, the output contracts for these procedures accept any kind of X-expression (meaning, the procedure can change the X-expression type). @@ -150,7 +151,7 @@ The @racket[_string-proc], @racket[_entity-proc], and @racket[_cdata-proc] argum (print (decode tx #:cdata-proc rulify)) ] -Note that entities come in two flavors — symbolic and numeric — and @racket[_entity-proc] affects both. If you only want to affect one or the other, you can add a test within @racket[_entity-proc]. Symbolic entities can be detected with @racket[symbol?], and numeric entities with @racket[valid-char?]: +Note that entities come in two flavors — symbolic and numeric — and @racket[_entity-proc] affects both. If you only want to affect one or the other, you can add a test within @racket[_entity-proc]. Symbolic entities can be decodeed with @racket[symbol?], and numeric entities with @racket[valid-char?]: @examples[#:eval my-eval (define tx `(div amp 62)) @@ -202,9 +203,9 @@ The @racket[_tags-to-exclude] argument is a list of tags that will be exempted f The @racket[_tags-to-exclude] argument is useful if you're decoding source that's destined to become HTML. According to the HTML spec, material within a @racket[
6.2.900.15

File formats

1 Source formats

 #lang pollen/pre package: pollen
 #lang pollen/markdown
 #lang pollen/markup
 #lang pollen/ptree

The Pollen language is divided into variants, or dialects, that are tailored to suit each of the core source formats.

These dialects can be invoked one of two ways: either by invoking a specific dialect in the first line of the file (also known as the #lang line), or by using the generic #lang pollen as the first line, and then the correct dialect will be automatically selected based on the source file extension.

If the #lang line specifies a dialect different from the one specified by the file extension, the #lang line will take precedence.

For ease of use, the behavior of the Pollen language departs from the standard Racket language in several ways. The differences are noted below.

1.1 Command syntax using ◊

Commands must start with the special lozenge character . Other material is interpreted as plain text. See (part "pollen-command-syntax") for more.

How is this different from Racket? In Racket, everything is a command, and plain text must be quoted.

1.2 Any command is valid

There are no undefined commands in Pollen. If a command has not already been defined, it’s treated as a tag function. See (part "pollen-command-syntax") for more.

How is this different from Racket? In Racket, if you try to treat an identifier as a function before defining it with define, you’ll get an error.

1.3 Standard exports

By default, every Pollen source file exports two identifiers, which you can access by using the source file with require:

The main export, doc, contains the output of the file. The type of output depends on the source format (documented below).

The second export, metas, is a hashtable of key–value pairs with extra information that is extracted from the source. These metas will always contain the key 'here-path, which returns a string representation of the full path to the source file. Beyond that, the only metas are the ones that are specified within the source file (see the source formats below for more detail on how to specify metas).

Pollen source files also make the metas hashtable available through a submodule, also called metas. So rather than importing a source file with (require "source.html.pm"), you would (require (submod "source.html.pm" metas)). Accessing the metas this way avoids fully compiling the source file, and thus will usually be faster.

The names doc and metas can be changed for a project by overriding world:main-export and world:meta-export.

The Pollen rendering system relies on these two identifiers, but otherwise doesn’t care how they’re generated. Meaning, the code inside your Pollen source file could be #lang racket or #lang whatever. As long as you manually provide those two identifiers and follow the usual file-naming convention, your source file will be usable.

How is this different from Racket? In Racket, you must explicitly define and then provide any values you want to export.

1.4 Custom exports

Any value or function that is defined within the source file using define is automatically exported.

How is this different from Racket? In Racket, you must explicitly provide any values you want to export. Unlike Racket, every Pollen source file impliedly uses (provide (all-defined-out)).

1.5 The "pollen.rkt" file

If a file called "pollen.rkt" exists in the same directory with a source file, or in a parent directory of that source file, it’s automatically imported when the source file is compiled.

How is this different from Racket? In Racket, you must explicitly import files using require.

1.6 Preprocessor (.pp extension)

Invoke the preprocessor dialect by using #lang pollen/pre as the first line of your source file, or by using #lang pollen with a file extension of .pp. These forms are equivalent:

"sample.css.pp"

#lang pollen
...source...

"sample.css"

#lang pollen/pre
...source...

When no dialect is explicitly specified by either the #lang line or the file extension, Pollen will default to using the preprocessor dialect. For instance, this file will be treated as preprocessor source:

"test.yyz"

#lang pollen
...source...

Of course, you’re better off specifying the preprocessor dialect explicitly rather than relying on this default behavior.

The output of the preprocessor dialect, provided by 'doc, is plain text.

1.7 Markdown (.pmd extension)

Invoke the Markdown dialect by using #lang pollen/markdown as the first line of your source file, or by using #lang pollen with a file extension of .pmd. These forms are equivalent:

"sample.txt.pmd"

#lang pollen
...source...

"sample.txt"

#lang pollen/markdown
...source...

The output of the Markdown dialect, provided by doc, is a tagged X-expression.

1.8 Markup (.pm extension)

Invoke the Pollen markup dialect by using #lang pollen/markup as the first line of your source file, or by using #lang pollen with a file extension of .pm. These forms are equivalent:

"about.html.pm"

#lang pollen
...source...

"about.html"

#lang pollen/markup
...source...

The output of the Pollen markup dialect, provided by doc, is a tagged X-expression.

1.9 Pagetree (.ptree extension)

Invoke the pagetree dialect by using #lang pollen/ptree as the first line of your source file, or by using #lang pollen with a file extension of .ptree. These forms are equivalent:

"main.ptree"

#lang pollen
...source...

"main.rkt"

#lang pollen/ptree
...source...

The output of the pagetree dialect, provided by doc, is a pagetree? that is checked for correctness using validate-pagetree.

2 Utility formats

These aren’t source formats because they don’t contain a #lang pollen line. But for convenience, they get special handling by the Pollen project server.

2.1 Scribble (.scrbl extension)

Scribble files are recognized by the project server and can be compiled and previewed in single-page mode.

2.2 Null (.p extension)

Files with the null extension are simply rendered as a copy of the file without the extension, so "index.html.p" becomes "index.html".

This can be useful you’re managing your project with git. Most likely you’ll want to ignore "*.html" and other file types that are frequently regenerated by the project server. But if you have isolated static files — for instance, a "index.html" that doesn’t have source associated with it — they’ll be ignored too. You can cure this problem by appending the null extension to these static files, so they’ll be tracked in your source system without actually being source files.

3 Escaping output-file extensions within source-file names

Pollen relies extensively on the convention of naming source files by adding a source extension to an output-file name. So the Pollen markup source for "index.html" would be "index.html.pm".

This convention occasionally flummoxes other programs that assume a file can only have one extension. If you run into such a situation, you can escape the output-file extension using the world:extension-escape-char, which defaults to the underscore _.

So instead of "index.html.pm", your source-file name would be "index_html.pm". When this source file is rendered, it will automatically be converted into "index.html" (meaning, the escaped extension will be converted into a normal file extension).

This alternative-naming scheme is automatically enabled in every project. You can also set the escape character on a per-project basis (see world:current-extension-escape-char). Pollen will let you choose any character, but of course it would be unwise to pick one with special meaning in your filesystem (for instance, /).

 
\ No newline at end of file diff --git a/scribblings/formats.scrbl b/pollen/scribblings/formats.scrbl similarity index 100% rename from scribblings/formats.scrbl rename to pollen/scribblings/formats.scrbl diff --git a/scribblings/installation.scrbl b/pollen/scribblings/installation.scrbl similarity index 100% rename from scribblings/installation.scrbl rename to pollen/scribblings/installation.scrbl diff --git a/scribblings/license.scrbl b/pollen/scribblings/license.scrbl similarity index 100% rename from scribblings/license.scrbl rename to pollen/scribblings/license.scrbl diff --git a/pollen/scribblings/manual-fonts.css b/pollen/scribblings/manual-fonts.css new file mode 100644 index 0000000..39656bb --- /dev/null +++ b/pollen/scribblings/manual-fonts.css @@ -0,0 +1,343 @@ +@font-face { +font-family: Miso; +font-style: normal; +font-weight: bold; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +} + +/* Miso license */ +/* + M M I SSS OOO + MM MM I S S O O + M M M M I S O O + M M M I S O O + M M I S O O + M M I S S O O + M M I SSS OOO + +--------------------------------------- +MISO is an architectural lettering font +completed in 2006 by Mårten Nettelbladt. +--------------------------------------- +MISO is available in three weights +(Light, Regular, Bold) +in TrueType and OpenType format. +--------------------------------------- + + L I C E N S E I N F O R M A T I O N +--------------------------------------- +MISO is a free typeface. However, +there is one important limitation: + +MISO MUST ALWAYS REMAIN COMPLETELY FREE + +You can use MISO for personal and commercial work. +You can share MISO with your friends +as long as you include this text file. + +You must not sell MISO. +You must not charge someone else for using MISO. +You must not bundle MISO with a sold product. + +Use it, share it, but keep it free. +--------------------------------------- + +Mårten Nettelbladt +Omkrets arkitektur +www.omkrets.se + +Stockholm, Sweden +July 9th 2009 + +--------------------------------------- +If you have any comments about MISO +please let me know: +miso (a) omkrets.se +--------------------------------------- + +November 27th 2008 +Converted to OpenType by Torin Hill. + +June 24th 2007 +Some small adjustments + +October 23rd 2006 +Released +*/ + +@font-face { +font-family: Charter; +font-style: normal; +font-weight: normal; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +} +@font-face { +font-family: Charter; +font-style: italic; +font-weight: normal; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +} +@font-face { +font-family: Charter; +font-style: normal; +font-weight: bold; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +} + +/* Charter license */ +/* (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream's trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc. */ + + + +@font-face { +font-family: Fira; +font-style: normal; +font-weight: 300; /* "Light" */ +font-stretch: normal; + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} + +@font-face { +font-family: Fira; +font-style: italic; +font-weight: 300; /* "Light" */ +font-stretch: normal; + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} + +@font-face { +font-family: Fira; +font-style: normal; +font-weight: 400; /* "Regular" */ +font-stretch: normal; + src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAGWIABMAAAAA6JwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcafiXYEdERUYAAAHEAAAAHgAAACABGAAER1BPUwAAAeQAAA2GAABEdIU+i5xHU1VCAAAPbAAAAh8AAAb2Y6MJv09TLzIAABGMAAAAWAAAAGC80vl9Y21hcAAAEeQAAAGTAAAB8kpEps1jdnQgAAATeAAAADQAAAA0Bf8IO2ZwZ20AABOsAAABsQAAAmVTtC+nZ2FzcAAAFWAAAAAIAAAACP//AANnbHlmAAAVaAAARzQAAIgA1kIwZmhlYWQAAFycAAAANAAAADYCJ087aGhlYQAAXNAAAAAgAAAAJAe4AqRobXR4AABc8AAAAiAAAAOs2PUwRGxvY2EAAF8QAAABygAAAdh3HZbWbWF4cAAAYNwAAAAgAAAAIAIIAZBuYW1lAABg/AAAAeUAAATAe2aa+3Bvc3QAAGLkAAAB9QAAAu6b+3zWcHJlcAAAZNwAAAChAAABBky+tBJ3ZWJmAABlgAAAAAYAAAAGVSxThgAAAAEAAAAAzD2izwAAAADODu7mAAAAAM+sBap42mNgZGBg4ANiCQYQYGJgBMJXQMwC5jEAAA5YAR0AAHja1ZxbcFXVGce/E3JCCJBoeiD3kIRrTdUKomipCglIRKtC8ILTanHUzsgwDHWYsfXBFwQvD53OdIIQq7YWL1TMTBuBAEXtEclLHhofDjUx5rSdM2X2TOe87M6wp939f2uvc9lnry855+REp3vNb1/WfX3rW7fvEChERFX0PB2h8u7Nd/dS4+PP7ttNq57a98TTdNPuHz+zh7qpHHHIdakMj9CUX6uoYsPOTW20qmtDL9+38f2ee+/Gfdu99+Deu20r7lkpyh7f+9O9VP30E/v2UET5kLojhCqoWn2HEMKx59C68H/brsN3FYXhquAbpuV0G8IO0FFqpNfot3QDfQq3jj6Du4VC4R+pOq6mPaF3QidCF0OXQxfLyss6yn5SdqJsbE7jnDvKT5R/Hq4OVyMULhxBvIv4XsF+4RvDt+L7Mocq7lC+1V58db/MOXKK0EX6AVW6FjW6CWoGS91BWo7vlXjvBGvAWnAz/Na5b9IteN7qRul77jitx/v33X7ahOediLMF9IC73DhtxXM72AEecpO0E36PIN4P8XwKfgfw/gI4CA6BF8FL4GXwCsL7wGHwKjgCjoLXwK8R/jp4A7wJfoPyf4fnMfA2eAe8C94Dx8HvkeZ9cAJ8AAbAIDgJToHTYAicAefAJ6hfFHyK9wvgM+T/VzdGX4Bx8CX4J8IvgxBtRS9X0CLEW4zvOrSzwbWpCXFaXIcqKQKfRe5xhDpUj5BGfDchZjOeLagdp7UQmkBaC2kdhI6otHPpKsSpVfEt6sJzDEyASXA11SCXq/FWr9KlcraQs63StyG8HXSAXQjbj2c/OAti+L6kc7FRjo1ybNTERk1s3YIkcrCRg40cbJRvIwcbOdjIwUZdbNTFRl1smp+uaR3a7dWH68L1SARqXqPL9FIsUnKwc8pK5pSVST0vK6VXyxb3SqCMR1DGKGL2Q0JxxO7X/fBvtO8KankFtYxpqbHELOSSpFbUdgloQ9p20AGW43slpNkJ1oC1oCut8RY03oLGW9B2i+5HHtvAdrz34rkDzwfwfBB5PIznLqX5Fu3D937k/TP4PadGQgIjIYGRkMBISGAkJDASEhgJCYwEByPBwUhwMBIcjAQHI8GBbEYxGpxpNN+C5lvQfAuab0HzLWi+RR+i3JN4ngKnwRA4A84iz3N4/gnh58FH4GPwKcq5AP8Y6n8JjKH9E+Ar1G8ST3+f1Ol+ye2TasSKIlZU61lSxaxXIyaJfkj1Jvd/FCmjSBlFyihGGYeUow1RtCGKNoyivlHMrNW0nproZkrQfSqWpe7e2HFQlqNr4iA/B/k5yM9BnNWYhRdAE6/CCKjFCF5MdVRPDZiLm6iZWqiVllAbtVMHZuTbqYs20120nXrpQXqYHqVdtI/203PUT2/RSTpFp2mIztBZOkd/phhdojGaoK9okkKNjWoWX0Adc5+pbK1cN+8v83cv2L/wq+qhuu761oa9oc/VzGuCZ2MTzQI8a5vgmdzESqXXQToF1gisFeDVwgSvICZ4VTHBK40JXn1M8IpkglcpEzyOTfBqZmKLQI8Ar4QmeHU0sV1ghwCvrCZ4tTXBK7AJXpVN8EptgldvEy8IHBQ4JPCiwEsCLwu8oubQIH0ChwVeFTgicFTgNQHe1Zh4XeANgTcFeJdkgtcPE8cE3hZ4R+BdgfcEjgvwLs7E+wInBD4QGBAYFDgpcErgtMCQwBmBcwK8azURFeDdrYkLArwLNsE7YxNfCIwLfCnAO20TlwWuUXsRE7UCvGsw0aX3MLmMCUwITApUpPfdXTn76SfV3t4E7/dN8J7bRIPezefSqHZcQSRZ8JnCBJ8zTPDZw0S7QIfALrVrDsJnGRP9AmcF+Bxk4pLAk+rsYuIqgVqBRQKLBaSebFK9FqRNn6lyaRfoEOgS2C/QL3BWYExgQmBSYGPB457PqibksZQ00qR6IQiffU3M9ryycwodLUxCiwRaVOuClE7nzBIqnc6VRtI3FSFR86iXRjHbNkzMsg6VdSj7iQm2qZi4Wq1OQdj2YoLtMSbYRmOC7TYm6gTq1UgOIq+IlpFmgRbVO0HYhmRiiQDbmky0C3QIsJ3KBNuuTHQKrBFYK8C2MBPyudrMFoEega0CbIMzsU2AbXUm2H5ngm16JtjOZ4JtfybYHmhil9r1BGG7oQm2JZpg+6IJtjmaYDukiQMCLwgcFDgk8KLASwIvC7Cd1ESfwGGBVwWOCBwVYPusCbbZmvj/OYebeV/ghMAHAgMCgwJsyzbB9m0TpwROCwwJnBFgG7oJtqubYFu7ifMCHwl8LMC2exNszzcRU6eiIJcE+LcAExMC/JuBCf4dwUTp9lh1AtLea7b36b3q9xATtQLymTFpRGpxvbIYBJFOOI1qfxRE3rWazwf8u46JMYEJgUmBa9SvPiZqBeS+d4yMCUwITAqU0RyqgiOKUAuF6C24+VTW8Tn/XrRkS3uE7oLmkzvqjru2O+Im4WxgseRpGd4TroMvHgkJ7JuHKYy4cYaKvDh/3BN+P3V3VKij4bokvTB8c71sL15BpTnqPu7GXLa3+HzTZTeoZ9wdxr69RNfUNfVa46tlzUzLQvtYZp4M+c3zTWTH8iSKc8K4ewjtTQALdz61J6aWIWbsErZ/2tTcF+PKJWghzyVaL22qStUUYSPuiK9HW/V7Il16ldIdx1jGoCpjEHIb4hK190LEHwVxbjHyD7vH8YzCbyBTWnZPBiSVLIH2ODNIm1CjJhaspRpXqTGWyO4j+MTTIzMJqSRNfSmNP7+vOx6QSNzvw1qqx2XcfUaVGM9NHSzJK91fb57XCtO0/OYQXTvbN14dCutR5M1Ptg6xdCvVvJUl66RfQ6YrF9o8BBIgBs3kJ8+82qkYw3CjrNXeiEScGC2FZh6DHAego8NIY0Ei5zmuznOklLpYzKhW84yWBupqez3IGqDmKSc1M6XnKK+9EUjhOMJ53vb6vEbNcIngqPPplpWqr0qVDPZl2sdJ91INUg17Es3MG9ONRcQe0TMo592g1isn0yIt/1HVY5mcIlpr8pqjsnQjypJQ7+dRBsvRUlJMejM9wnk+TKTmIMSIYZ4fcftQwyFOrSQScQdSM7l/nPrWphGkycgrnD0DiBpSpdPmNfupGlnuYJaOpNox7s3f8IkpeaZqG/Pe9T2Z3Q96vFlTaWdOWCutz4nQ4Ov19Xo9rlIhreotko5RRau8flQhDfheL6/z06zauetqVREjzJrB6LZnZ32aSZ2ytSKviJuz3tdrHZIl7/XVDirZlVvLmazevmvpjGtmqRWhmKumNH04nazSZTlfn/YWW/Npx3IykMLxhdtTSsHrr/HipK7Wr5y9jaG+DYWNUV7P8pO6Yb92xb8rLVLsDYXrRmbvVWC6qH8FM8onEiirOM0dzaOeNTnaNDp9u4wxqgofKerM/7VeU4yupN5VxWdztSlsBlC7kLxkmnuaKuwsV7LKhwX/VhVW44sXTodE0usleWcP7D6T/pmQ5yzVSludlzP+sZLL/z+ZswLvoM26U6wuoB2x7LRfl/6j1Cv5j073l+6/SlKqd/qx6Ju6GkqwOxzOnhEy56yp9KfoPhryff/DHYQGDivNH/SvIN/8fJlXexK5EvNOzulT83hw/OoTWmLqWS0v+0o8e3dg3lmpslT/so1optLJsjHEZ7VXnMx+ZTp7WeH7FOzmz6XmWO+knHfKY1K/5DOfZHaysyS1eMYeoiwVyXz7l21EBeyEcm1EBc1/nk2tkPOwZyPKbmceO26nuPXHsxGl3vNZf9O2lT6pXlPbiIqbi2ayrupfhIZUa9lCdN7UByU6FUZodQGxW6cMiZR0tDxWgE6wDW1WZ7ysGeY4VsS+9K53ZLoV2aSh02mH+5jaeUcxX1iZ1VaYZ3N+Y8z6tSiZOaOmaqntiF8Efq+IZ1ai/FeB4mxCysLtZORinnf9s5b3W45hH5zMlWuprSXuwAwzWD2D0OC1Na3zcchkJKhValaMq/l/RD7v+mzLySl1M0SV9DdaoL+2qHsPdVE3IJqn4/C1RH3Po41wPcrdqUPL4DuHyvWZq5oqaC5y5dhVYD5yXwjf1F+QfkuXQqqExci3Dk/vL0q9i/+qlNTflXKZ3t+WsiVxGS3HfYVO342cpGsT2Kjfe7L8U36bjanmqH9r4LnUNU+32nM9oFq7WrwvQf0zrl79Zazn+GqCS7XDcz2qRd61FO9LVctrp9WLbrgNcF36vlHJbpOvHS2qL8epM+1zgzoHd6A/OnLyq9RcDxdWjmXfrn0p/WxKa3EqRSdKuVbJqRk9fl26HC5hOVimHCmI1qj7Crhlmu/QWtxZM1bi/l2dvkLnlEqXfc1V9fRbAFZk+WUszO0+V2mUZGXahcG12qn/4wL1z3bL0o6UFrbpNqRcWH17ztOSSviUT9uXFXA3wnXo+/VKdnPRjjJVa673ArgQRkwt/CLqf02og5uLXmpEeDPizkMNOzGeroP06iHn2+HbBfdtaMWddA00bSvadS/dBxlvo1704QP0EGS/kx6ldbSLHqfbaC/cHbQPbgPth9tIz8F10fNw3XSAfoG8fgV3P/XRAHL5A/2RdtOHdI720CcURYoL9Bk9SzGapJ9jFvk70lyGO/g/Q5IxBAAAeNqtlEtrU1EUhb+TVzVtbawxlqASpUqRUrQUqSLBalqkpg9iKFJKaUjVgaGRNKKCKIjOOnDgzAeCDsUf4Fz0Bzjyd3Qo1HXuPem1RUrShM3di3vPXmvvfe45GwPEec1vIrmpfJF0+UmtwvC92p37ZCul+hrzRBTD1paHhhDhpr4MEZtYnMwwdH2iaH3B+pm5vHxhbka+WLgpv1unXKrUSd+tlcpkqrXVNbLrDx+sk/Mi+uR7tzNGidHFAQ6qg256tGJjDnkeDjPIMFfEzFNkiVUq1HnKSzZ4wzs+88WLM+o+JozygU0zbV6Yb967MX98DJ11uOBww+FPH8NxhwWHHx1u+hiZdfjV4S8fozGHI34d0WX11aPOnvGIx/oW5igpjgltlf3CAcb0P+yb4YiiI67rPlmIJCcUc0rWu+eazw5v61ltOqZqdRJaSzHalGaD5zMsl5Z4hrSepJ6L3j4m2uyjsduGEae3dxU4RlIr57WfzXECXko4qtovt8AM2AOKHmNc5/xqi/xAI62zb/NnucbUPlQCpeM60X4tOW7o3u1PK9A7qfvdqGuaWQptKAaqGc2MoMZ5TYfbbeoG2qc1jf6td4FFljugHmQY1LTbWfsSK5puncnh5zGcc5OUJk7//29gpGlmv8ub8Cb7JLe8+W6joSqL81zW7cWndsXb+qKc0Z7DK95K7z2fuMB32Tg/ZJcUEddTlYbT/wutbmRzAHjaY2BhYmOcwMDKwMLUxRTBwMDgDaEZ4xiMGG24OJi42ZhZGRiYGFgaGJjeOzAs+A1Uo8AABYwHGHh/MzEL/tdkYGCRYuIASkwGiTPxM20Eq+MGADw5C/x42mNgYGBmgGAZBkYGEHgD5DGC+SwMF4C0AYMCkCUAZPEy1DH0Mcxj+M8YzFjBdIzpjgKXgoiClIKcgpKCmoK+gpVCvMIaRSXVP7+Z/v8Hm8UL1AvSsYAxCKqDQUFAQUJBBqrDEq6DEaiD8f+3/0/+X/1/7P/R/8X//f8x/X374NSDow8OPTj4YN+D3Q82P1j1oO2B1f2jt96wvoC6liTAyMYA18bIBPU3igIGBhZWNnYOTi5uHl4+fgFBIWERUTFxCUkpaRlZOXkFRSVlFVU1dQ1NLW0dXT19A0MjYxNTM3MLSytrG1s7ewdHJ2cXVzd3D08vbx9fP/+AwKDgkNCw8IjIqOiY2Lj4hMQkhs6unr5psxcuW7p85YpVa9atXb9h08bNW7bt2L5z9679+w4cZChNz8h5UL2kOO95ZS5D91yGMgaGrCqw6/LrGVbvbUkrBLELGh6mtnbMOnrsxs27927d3sNw5DjDs8dPXr5iqLlzn6G9v21C76TJUybOmMkwff6CeQwnTpYANdUCMQBT6pGUAAAAAg8CsQBOAD0ARABJAFMAWgB9AFwAgQBTAFUAWABcAGAAZQBPAEwARgA4AFEANgAhAnl42l1Ru05bQRDdDQ8DgcTYIDnaFLOZkMZ7oQUJxNWNYmQ7heUIaTdykYtxAR9AgUQN2q8ZoKGkSJsGIRdIfEI+IRIza4iiNDs7s3POmTNLypGqd+lrz1PnJJDC3QbNNv1OSLWzAPek6+uNjLSDB1psZvTKdfv+Cwab0ZQ7agDlPW8pDxlNO4FatKf+0fwKhvv8H/M7GLQ00/TUOgnpIQTmm3FLg+8ZzbrLD/qC1eFiMDCkmKbiLj+mUv63NOdqy7C1kdG8gzMR+ck0QFNrbQSa/tQh1fNxFEuQy6axNpiYsv4kE8GFyXRVU7XM+NrBXbKz6GCDKs2BB9jDVnkMHg4PJhTStyTKLA0R9mKrxAgRkxwKOeXcyf6kQPlIEsa8SUo744a1BsaR18CgNk+z/zybTW1vHcL4WRzBd78ZSzr4yIbaGBFiO2IpgAlEQkZV+YYaz70sBuRS+89AlIDl8Y9/nQi07thEPJe1dQ4xVgh6ftvc8suKu1a5zotCd2+qaqjSKc37Xs6+xwOeHgvDQWPBm8/7/kqB+jwsrjRoDgRDejd6/6K16oirvBc+sifTv7FaAAAAAAAAAf//AAJ42t19CXhbZ5Xo/9+rfb/aLUuyZFmWbdmWLdmW5cSxkzhOYsfZ9zj70mZruqZpkzRtaaGUtpDS0mU6wGNYBlqm98ruQmkh7LTwppSBDB/wmLI8Hh4oDFCmFGrlnfP/90qy44TO8r5577WxdH0l33vO+c9/9nMuEUicENoiPEpEYiTtCiWZ+UWjLvhaVjHofzi/KApwSBQRT+vxdNFoqHlrfpHi+ZwUl1I5KRGn5l987WvCo9MH4sJmQgQycOF18pKgEDOxkw2kaCIkPSmaiVOXLloEkqayIyPT84rBOoU/ExYDNaUVqzQ1YbNa4Mhum5LtGcVmm1KcNK3Y7JJbMYmFAlEsouSWbYWOzp6unlzW7zUk6sWcmBhoikSbmqKRwAHLmkhfU1Nfs/BCqZsQhGUzfZweA1gQvxFShDNpWZdDcEy6tGzIUtmUkcXzk4KbLIcTgksh0pRMMnhkpOlJAz9vcCk6OK/LKGaaJh2dHsAbfzbvHXpw75CglP5EDaU/wdXr4KYS3K+W1NE1pBgC3Is+f00ulysa4d5Fk9UGx5OEhoz29IQghSMNgZxC9FMT3kCwtiGQndTr2EeiK1qHH+nhI4PZYoePqBzLyKHzSo17Sq5h4Ckm91TRaLKkJwaNOnNaNrkUP5z1wVmfH8/6PHDW51KsSEj3lBKnabkn9NzAlW+sJr605bmBY2/cggdyyDUhhIweuC97NeAr3GTCXGOCA79rwuK3evBSE3afDb7gYq8Se/XiK34nwL4DfxVkfwXXrNWuE9auE8HvTES1b9bheXHQJYiIpEtCKoQj0br2Wf/JgyEge747l0/AT87IfnwJ9pPIw88AhY/qNkZXbfavDNwLPys3RVZt8a303+Nf6d90T/TeTyz5wfBH4b/hHyz5BPy35AfAH5SkLxwQRHENSZGPkmIjrJacyCmiYarYKCL9GpPmdNGJTOPOKQH9VNEZwNNOlzk94Uu6TMDMTRnZdl4JuaYAX2RYOZlV3LBCiazsdikGIHzMNaU0w3vIBuxLC7JTki0F2e2eEM0BWP6CbJDkaEGOuRWvD9lcbITvpQqyTwI+sYVi+JWAW/YC4w9Qfy7b093VmGqn3V09QA+fP2BsTNQbfF5/IEp9XoPRl+huTHcvu3Jg3cDa/fu3j606MNKzcEvP4v7N2w8d2L765hXzhgfn5RbW1O1cOjRuffgh8+Le/mxHurs2snfT2oOWB95vJnqy8cLPxHbhy8RC3MRPoqSBnCXFKNBHieumQC7AgaSbmmwIRUV7WmmAQ7uJHdp1U1ROZmRyXrHCRrYymigGOIQ9FITDOjiscyn1cBiGLd4I706r5J4wiR4/YKrU10nup7w1oUjUB78SpSEOHwJTBPBDCYRBUW8ghQIQw1OWAo15by7b3ZWo99AABeGAZ+tTXjhVv3HbsqXbti1dtm3N2tWr1zroywtLHa9ve9/Wre8zf+Qjgmds+/ij4+MrDh0+NH2v8JnU9NIj8Ouj4588fPgQ8IdIxi+8LkwJL5AwSZJOcjspBnBH47ZWYsAlZiRERg8oZxnKEcuUHHHJjbHzkmKAY0NGaWSnlFbcgXBocyluOPTYp5QcvLfCWj9lFkOxhBOX2SbJ9cgaRZcvWEBeyMQk99PEYPMFE83wBdgCsOps7QF1XO1ATz4Ar4kUJwOwRz7loB7ghgXwLeSM8cFF+eyuzeuuHFmktNRsbOj90E1bt508cmLH8OC2xS9mm33NbbnuXGt755MDO1qyy9qXbt6waN6G1BPDV9YcX3/fqm37tvcOLvlSbBHti+VTdfMbWjqzhO0dkK3ks0y29nDJqopVCnISiUFBYlLXpMhFqAhCX5Ouir4sRTdz8YnXa7pwLa0TR4iTeAiVXUxJmGHvSOzL7q4FQj7goC5g+HahqXYg29m3atmyVX2d2QFq/tR7bhld3HTsXOn8F65qWjx6C16vEa4Xqb6eCDxZvh7Qx9WYykdFr0MwNmpXqsXrHrjqC7Tl3DG8znvYhTm+QXqIflj4CXEQ4skHUjljPmAMGFPGVD5Y+x7nVtc9te8/uHz16Oh+oWPD/Ecemb8hdjR/+x256/Bvx8kp+g/098RK1hJUL8acQsUpWZ8tEooShVhA0FCCh1Q0AwltGdlyXhayihn2iy5bNFvwM7MRvmYx46GFmGG3cTp2wwL6QBTC1h8/u/7++9dTacUHPrDiwQcZ3LkLW8lL5AyxgZSDe08azMSIq2RnFDGDGnYAJ5pBuSrUBkwHtMk3ahzmpLmmMCpY9+KPf9yXjDQ1ReqaHmHX7aduupnugvWvx+siQviDy68Q0J2iFblBW+vuuK+f1lL3ypX4t8xGAJjMJDPTQqg6prKl2lBAJUaqdb+m97nO52t08MLD9ENiC8C0mDCWy6jcOClYEWuEBjSg3BiiYNa0v0iAfdtfpAoV8Fig7S/CpwIFdUORDp6AePAXK//XBvGM+61b0Z7ouvA6nQZ5AACSpRxyxWZQJaLTMMX4DHjfAvrA4sL1UfSc5RS7BQSZaDQJTKw5QRkoeqLKMbaXYf+6YpIr1nX9qzfc8Or1O6ml9K90yxPPPvvEp5999tOln9EwrUUch+ClBPvOQhaRogEhMBqmZDELZhlaV9aMbDqviBYAilkGoh54xsTUmckAPGMDWEQTU0W4LvmclPPFu3OSceiHa+4tXfXJjwlN755+ZGREEPZxmubh5WeAs4+sIEUr3s8kThUFxNgtTk34rALqQX9Gdp5HZItOPdORVrhXAJZMMVmZ2Qb6TNE7CyjeZIJoayIsbox3a8LKmN9w8/Zr3/MROt9aOvD0bYNd6YV1wrpDh9Zv/OKjY8ufUsZ6FtQ3sb39Ov0NwNRAtpFiAmFCpe1neskwNWkxJ/ygjCyGqQlPwo/ggUoynEdVLDtQONdYmOohjO1hD8ZA2iqeBKyJowZAlKQZ6jZN81ztJuqNKQ1sH1O3IHXn9+0YXnVPt7WhZ2RZfuXi7Ibrdh0HOLe96/Dda7JDywduXTq/0D1/IL9m3/L+zRadbsvI1hNI1054+TPg4CBXkKId9QrSdJLo7IIdbDkwC2FZLdmijokFnQHFgjMj28+D2FBsjinZmC3abfiZHWQBahaDG1VO0WbAkzYQKYoLcdQRttpoPwFDg+mkyorOl8ae/ox59aZNWz62kP5jrLRmcnL5xz7G1rwA9P098FgNuYUUgxp9bSqXT7pNQRvQ1w3nTG7GWVaELpSRrecVl2Oq6LLiWZcd4HJxK8gH26AW3l1WlDOWApo9E6LJHUS953PLDtgUJr4YYAUBl0iyq2oJgPIJCTjFp5I/UV9YkN+4aOyWjo5l9LC19MeOeZuO3HnwtrGuRRuXvS9Aty3/RvD43n13wJ7tAVz+zPg3Ro6SogexqdH2rAmwsUc9zHTB7Rtn29cPmtqaBXtVCSPIwCzMXvHjDjbZPQiyCzS8HlV0tAaBdlmRg0xgn8iGgixKsl6zULh9ZizD3ZiPUhUlQ8+9p9bMa2rPj+zQLT6w9qrT4zfesF1YtmT+wLXp1bS7eL55QfS+27dfc/TIOyavuuLaTSse7oK1Gbnwr/QXsDYGkLvAHMA3uPGRW6hszCgmXHKKSy4WuNylKTpCP1j69UZqFQ6MLpm+OyRsBAmZBttGD3TxAF1ayBFSdCNlArimeL1mNGvSjBxe2DZel1yPO0dnYX5QvQVPKTVovsGnzOKxAp3Qzmmsl9zPmATJ7Q/U2Zm0aw6AmUN0Vmddg2rFoIZZQBlNjKrw8/qRKu1iyuAG84Vvt/R7jg1ty244deKB279/y66ld416gr2p5iv8S0fHB3oLzxyf13t139r4pvW7Fgye3Hjsqo19C5f0hFpqw05HJ63fN6+me3WmD+V27sI/07cAVzeJkE2EL30tbC9zRrHop0BoK34kX5Sh6wHcPMxale3gCQPj1qHJBiRVzMi4QUkRXbj0tcgQBjtxMKQ8ZaMstYDmqwyydgpLnXvnzsM3PfVl3zsfMwtdBzdes31Jz3g3HVwyf4R+/8DpB0588eWeJYkPXEHXndy1bGTH4f2rSdmXpq+DvvGQ3AxNKbszk3ZVT3pRT4KoQDUpO9mb4pulLYWL9GbTDP1JP8jVqMDtBbinDSz/NiL7MpMu9T4BtBiQJmA0yO4ss+cvaTdUbli2IHrUO1ZZEkKvqr0pWUeuoz8UUsDXxNOdDNipcR3d31A6RwcbaHTH48vP3reC0WScyPQ79HPMpw9plgfypB6ND5Pmo+eB85PwM05PlO6iJ+SVK89x26PqPvk2mtf79OvoYOlcA91f+qsX3nffisd3PM7u0wJy4zngmRqSwN1Rj7SPcCuFKb8AKL+aeqb8GlAso30/4bLXOsA3sDJL36uq/6Qax5gQApF69GO8MeQlN/JQTQRdGq8NZV5AqtaMDjFCE7BLRK543GV6tmw4tXV/srsnua2hq6sh3zk2L60SVtiyb3ywdbAp2ZeKN7YtaUl2RJvblk2/rtJYIMMX0uLTgFM7aPWH1H0QB+q1ZpQUvElgdeaUTtgR4azck0GXl8q9bFM0wKZo4Chl4DDjYv5LyMb83igcGmH3F+A9l4G9LgbiqVYJ5WRIUhx2wC3qLlqaW5hTI6VAODUXlJ5OcG6MxOGNNtiZkyvJNUw4uHNZTbmmEg7YPZytAhJz81R3FzZWAL+RhJP5bjg5/Ofv3nFufN/u3gGTzjWcX7vtxJ61o0OHPvWI8sVzj+/cXXP1oW+8RZftGI3XJ9/xLy9S3TH58O1/259q7rlh3y3vair9bPOP3//p7z7xqZfrl6be+MoHNv5OAnoBjwj9IGuNYLmD90eYJjTmckzkThpMhILiMCDf2RiVjCALjS5FhzaWNIX2H8Zb+jtfW8jCLMQl03MO+IZsPaefMBgxFmLCV5HI1nY6QQ0mqxruUHRG4BHBjASjaK5ZgDQ5T86TSMWN+ZyYMLx64p/2dZfe6F7xg8M6QZle9elP/4nuhl1xEGDuBZg9sDviaFswqL2azRYHjVcbImBjoASkcn1ZxNdmUaSDzaY4wE2LokgHfJQEnIh6ARirBYEJwSFoa7lWUiyg9OS4WzYiaBIsmlA2jBxCIoWLlabd/O3gZzvXLW9e2jmwqXVsc9fhEw+879QNp+44KihS43Bn/6hVZ1s51rM67V1x423Lrz6I+3QB6Kcm4FU/WUKKXsTBKapa2wxbz+gVTVwmAfg2IHYQFZ8ToXMXZKNUJDYJdbJoZjpZk8/lcInGPws+evPA5nRX/+iGQ1duXLe4c83Nt36IbvnEC/FEf+7Os/e9a96Csc8yeYB0XQt0dZAw6SVFB+HGEKdqGHkgwmBBfeh0oQBWTABWFMEKOwEIk0YmETc30meBgAoPiPNoz9Zt/ammBZs3dA6vaVkymKxtmtcTXy0ozraRU+vW3rIiI40GC1evXrwvH7egnwME+jnAYmVRTcJJwu0AnTg1qeeMqa8wJjjSzI1ktqQZrDV4FcyqS6n6kTlmYKFtGPcdpDdYS3/4xS9oVFBW/HjFr1ao/hW8/COL7Q7y+1buadKze5qQpyxz3LNyN+vMu0kH6VXW0ls//jHc6ZejpVe0tR9ksvdmHnNRHFVrP+kGO9bO3Q9jgLFBSGMDlLsutDfBAXL5mBXqgXsy0xN8rqJZDKCoBWfEaEB2djuYd6IYwUQBel6KYVzIL92wZhLjGeXk0I7W3v7NG67buX2s53brL6+89R0P0S1/+3yyqa9wZ+lH74x9c6z0dP/TKs2EAbZWA5xm4P0zssn63KRoYVQTKytlBaoJWYycgSUH9GN7UFsgDLrnJLCEpYM7aXDnzhIYgqVXaWx6FV1ceqG8RuRFFpeJV62RFpUR4Wr4oy9f8eAulB78b/UXbiDfYusbBNuS/ZmFhQnQCrJqgZNu+CvY6PqF6Z1bti4MDS0Vxqaf3HcwSmbsExGuklAxNpUx1phDLF8QYfDQnJkmDu7UU8OR0p9p8AYEiV5NF5a+Urpb5bufwjX1Gk4ghadUvAzl6xkrVDICfWqtcJWPrGP8BDD9iMnEZ9W/N5pUKV4U9IZcLsesqIrxZ1I1mo9L8C9OvvYIk+BCu0MWzylOz5uy49xz/Tf+uhlP62U9nNedU2zeN2X7uefO9f7pM3jeIZtcsvmcHiW+4ZxInhZ1Zpvd4VSj2nTQIog6vaH6nCr9PdxnUy15qyr7mfwXG7sTIvzvNYoLCrc+pLv/tsJ41Kp7dNuHdeZaYAczfQNot/vOXSWRTl93belDKg8uA/ydZK26ImZ1RYw5LWbhdDC5hc6aycFjFk60ea025qwpAtq+Jrci6goqXIpoLXCZRnONyBQJmvD7pIO3UEln33Jb6XfgyirTT195P109vUpYeuV7SzLwB+7tm2FvW4iLDBMQD7Aadm13u3AjSHwjSCx+jMEpA8hRDJs6wHksmswiMyNcmBkihkK16R1TYygL/vq22x97rPTWY/vptaX76KZPvvDc45/87LOPl35J/TRQ4dMWFkdxYySFaB44urWTZivTkGaUZp5ySAd8QguPaOsBIi9KdjdGN/SqZEcQ0tQnqVGDg5O33vveU5t2rlj7wZ2CcvjQdUem6bLBdffw+y+48IggAx0kEsA8mVPT0qJqXFI5yG7sBjq4uT5BOtSwDA96omanSU0f2IAcXicmyszMjJxFFmMAvFD0Qqqpcy89uGVB380776ym0U9GdQtWdzU/XSEUp9NyoJONeDHaou1nRiovkMpqZ6SyIql8XAwDqexZTRLrAGi/Kn4VixEA1EmyGSC2I+mMBdkryTpOwBjaD8DhiRrKLD0g4VPUsG3kpWue3bzroZGVQMUvjez2lL5FG0o/pEdvGywAb9eq/n0CbZ16JhuAik6Bk3PCXe9UTXTbeSUAkAU4j9dJ3DAPqGkZg/SUaHF6a9FAl+vcisTMcze4N5iGCdThaYBUujgNo/n4LAcjMru1Nj96xeD6gY2H9pzYfWZjz9CmnuH52zoGFtS945qzY/3LBuZ3FmpjW8dW71s9f0G2oy0XdoY7hju2XYOyygUv08zm7OPxPdW/N2KQjyUsDTzQpmdxHj0o1qKBxdwMFDSdWYu3GhOgKFz0Ncvndgq71qyZ/rCwi8n4nbD/FjJZkOdxJ7QTuDAwlYUBiFNZ5ElGixrANGL61Y5+Xh7lPywQUwPAVTt3nr1/163XXnf6VfpKKffhD9P/Xsocvu1WuBcwtdDHcOknRSPioqZgGR7lJAEzmNFTMiO/UOATgxGpT8AGlgXkZCb7xITzgKxTdv3kAIiV54Uh1FoUbAQiJhk+z/JdVLRYHZhxxVtN6PQmc0OgjBe1sPuheDdzIYfifcGJ3/mYeNdx8W73vqlH+f6Fv/7tM+y8Fc7bzoGlD+f1555b8E+vW8ry3Qjy3eySLSDfJ0WD0WbXZDuKdqPFCsJ9pmw3AYKyE9FzzkCPo4j/12w/qrtz/126azbdc+oW3ZkbAd3HhQ3TfyesBTnaPv1trquBto2At500VmQ67krZkMMkO8opoggop3VcTntEfg/cYaL+O188cp/ugQNf+eGRT+g+So/RRRfgoqUvle6h7aVvq9ePM1sgyyMPlbWzsBizkatwUKWoCgS2YKaZCwYcqD/4cd3H9/4IjIzSk3RNaXPpDWpi8NfBy4/Y9ds1nQw6HY0Obg5ZMsxAUIxcFYKRqdpluW4ax7BW3FhHN5e+Sf+q9DjdYF0h+FaPTb+2hl178YV7qFvsAL7rZhECPY8QUB4hwHyA0UosmPHPKnrHFOYqLKwgQN0+AQkN05xv8csnTlwvfnTsrT+s+DfnFyjPL1DML4g8vyDOzC948h7jwZW/WCUG3W/d5uG5mnuowOBeQDCYRwBuMYP2NYPbeB5EwKRBBdalUFDZFOSBS0NA1KIfAVDG3fCTO3Hi5ZebROvYW+N4/ajgpP8sLgO/Fi0zCssp5iapmhCaETxElVZL0d00Rl9Y+8KeO++APy2UvjY1hdeRLlxL37jwBaBDAOmAcOIPy/1wyzIQ98Ul+vNSaGAVu+8t1CrG4Psx/D7e0l7OFCLtzJVMUT5gjGY+Fxa+vfKaTtQ/bSDffyXUgjdbj94ARqNlb06J6MFQyxbtVI3iivGgHS1pTEAn2F6vBdlS68LgHZrRGMVtAG6txQ3BPNc6qWiyY55VdrllP3BvHGMxLuJnoVyMa1kwX2GXmP2V7+qZRys5gAj1omuQ0tLP4BzUt916Yig/r38sOL7+nNvnH/XnD6wa379zWcfAww+t3dycz9QO1T/xx2jENGgZHNmycs/y2xG/PSCPA8KvYR/7ybhqh1hwO7jAudRTrmU1R9dhQe+AFck4eCrZyF1fxWHnaRa3pOiZo+4i/IQXXB2R22l5CSBnMjtlzPt5zty4Z3z+li8f3bstZ7Cml73jxmV54afW0o9WlV479fCinjOLvvHSWlLOCXwZ1sGLstxdttooTwhput/KtT1od7BRZBdYjOCJG5xIZdE9Oyru82peeOHkNduG2vLzFi57d6GvdemW605Q/alHC/Ob9+//Unqg736gE97/d0AnB/gme7jdWLQRnvHhYLAYbg03ZiVmzIKJhtkSsOQxLIO5VHNGCQG1mLUkomVrxnIMovgltCbRxJ0RvJcCUqKyxhICXbh61+bu8TWm3p17D+w9OdLdunxwCTXe/Gg/dVmnI0Or33/rS2uouPAAUWF+DWjmhn1yiABvEWYolcGd9Jhd6Ml69GVzD71mTxY0Cou1GSzc4vOCU1oUra4Cs8WBbx3MBra6eDAGkLAXZA/oTTLD8IuXwxz5HMBeOHHFgWNCSbbdvmx+y6rd153c84Z443UI/N03B4Kf7OwfePBvPo5r7YOXe4DWPrSMvcwGQWHh5EkpCdzTjGJAavszspflqdFvcmR5xs+KCs7MLFNTgeenK2seoTlmmfjWb1o5MBBpy7Q03Go5Pk6/vnTZ0Lraxd5kavnSUi/9OrM96y6kBYcwwuKVzwMkSLYe/VTRj9C0gmAEWupaWX4Mc2CgMpIgMesySlbHI5fSeaUDIGvHYBaF5e9wyQk8tttZlVnCjqeULszuYL0GftSsBjI7JKamla6E5B40my26Om9ja2cP2oFhjFQSxaLjgcy6JPCOPQFLk5UUZxzee9xKWCqwvRcI4YoEcl6/atJiNFMNlOPS+HhaKAWbYR5Vc0Tdbp4MSdTXrVs+/FDH4PDgiq51V++482Btds/6w+OJhL+wfNeVdx35yfF5hwpXdXd3ptYkU72ZXGPn7tUHM+tcutS2lfvM3nB6xbJVqx6j3zq0cDB/HNZ1D6zrb4RfgY25qGLJMxnDsl/c8XIxGYOJOzTHTBbue5ldTCvAxtZyS6o88cFiMrEo7RlftOu948m25X3CTyylV1c9VrqN3tTRsqHE5Nwo3O+boo6YwJMYUPevBdfRlFFE8xQrSKBg2Vqn8GfCrMe6QJuFlyfYzFXZc6wGUXPmItigow29yWSve1x4vCfREKptmL5JcE7/FvnnwhsXWtk9rSC1CoRhiglyLxhHZi6ydOdROky4dHYHSBIrd1WMsLATDqfHy+9mXCAwW9dBjeUbm1Op4HhqoC/Lbn7WHVuUp38oSSM7siHxDIcDZTsAIcI+wlhIbCbFy4EQSyUQkpc8+Rw4QHvGDV+54ivfuwok8bSbxn4zVfq+WnMD8sQJ17ORBsKVBIvx2ctXcuD+01vUaGMerlgWsZvH4x5nsDGZ7btWuMY6farFMOju5zwhCiCjouSwaofZfBgbARg5wcw5JcR2PYWdhTeKwo0E95QcVesNgV98vNgBlyuG8WKB8YjiI9zFs3OPL8SCBkY1aBBAmVDFQAZj5WDPKuPCbVeGlmy7ZzzelFgcGK9PwavgXLZ+/Xpkq+u6WjsbSrfTmzMt+E7KvF0LvL2yKuqkYTGLwRn8szjcxYFGYTqLz3OBmXy+yrh4v8roAFE1m3OZLzgBDgt49sNqjYhdk/kuhMI9O76B0QSPFt8QBVMlvjGzRITpoRjKhcLpH508fdWxU3up613vpsbTDz1w5tTDD5x58aUXCbcp0mBT1DKbYj+pmBMVcoBNAYaxZlbYufRGothnmhV2lShls8JCmBsouyRmXLhV4yLAicSNC59UNi5WGft3funI3s3ZlpHbwbb4rvCzZevRtJj/J7p88EVuWyDN0qDba5luP0oqat2A8GrKEgTFLPUOqwe6EhcQa195+QNT7+ayejfwxbSZmEqqUvOGajWfz0kpaZaav2bXeI9x1Xjv+IG9e0+uyKVHuJof6p0OW6llxdnbv76Kq3mV904y+Pu0mGuZ0hbTFCvc4NYb0piFRRycsCpBq/hMLRiQ9qy2to+Hg1LQ377QKTj3X2PYalg9v/QNvF8I5IAC94ujVRHT6jOcZWOxfna0IyLxRE6ABWFogcc7zE4vry+NuIuSu5axnRiTsEAHVNcEtblZgarT/RfDHjxdF8oNrs3251auWH31hl0jzf3L0vmu4bUbbtp0otDXnU6mmjyepf2L1nYvaGmsi9d7AkuGV61l9PMBPkeFs2BvgGaQmAwSObfKelYfLRuzVcaGGYsQVGPDxtW0TCQwhLixkfehiVFJ8XSDsTF+p/XmSH08megYXrqUvjh8o/X24dJXmpOBgYa1S+l8gGE7wPAzwQnyYz3nQB6SM6jbBsSgJj9A0GJwBIMIVgvbxDZgPVuGbRx0HBAeG5pk4EwZ2HZRgyYIEsZJ0aTcPp5Ij3WNrzIO7D77PnqmdE+udQ29ffq3w6q9bWUxb2d17ITOjJ24/k2xE+ueu3Xv3vnMYcFZGqbPoYJkdp7wZbjHxbET+rZjJ6O/XTtn7OT+307NiJ0Y1NjJJ3/3x/+TsRPf+Hbd4SsO6HZsPnF6l273zYBuH/1qaT798vRvabG0ktFWgJf/AXjPjJ3Qy8VOUrlAjinnVMIoPPORI0d0R6/8b08fO6O7jfrffOGFP5R+/gNeU24FWfYqXNuBFYLqkrFCE0NZDsxaORQHtFxeogPr1MFW0DJzBcH8wMoSWMi7dHftlOuO7bOPDXvrAMF59CvTvx4/YllmHxxkMITg5WGAoSq2AvtJR99ObCXBYysh6v4z3Vd6jfqtS+iplcOlO8Y4X4YunKC14hCpIzsIiGMlyDQJMDpzrlj+L5aRw+dxh/ocsC+yRV+YdSPUYI9CFrsQFF+YeYeAZBDw9oYBbyopLrSZzaD17EzrdWd7+ikIGh96DTyzjG43/N4I5xtDLeHxnT3tjclkY1t+53iYFkbizT9Zt2hpXfI32YxZZ85kf9MYXbpo3Y+b6wHuD194lPxeTLGYRTkbZptiP3ot6iN9eN0B8d63roPvtwCeaQ1PcCnQ8wlmsEAKVpEr8hgriLFmlbCDBSNEhqdYB3g6OZ5hkRlARAkyXgrz8LwJo+BOt2L1MNXJ0cx3t1NEK9Gd9atoMrQTLfk2xLG9B3BsQZwXRhvLCCbrAMGfNMdH6pt/vG4Rrs9S8ic6RU+C9dFJVD9twmmwgjEtcOMDTQ3Cqu4VAgSH02rmgJeeYHkak5uYMTAuzWyqn9/uaoz0awe0bjwczsa2hSM57qNhHE+8D3jNdYlInsQk42UjeTQfyAeMieqAXunBpjO3pN7VrwX2xN1ta9e2HWP3ZPwtBmfecwaHX+6eiRn3rGL00uMtp083vatfY3jhV63btrXeRNRarD5WF4W1IIswOleuU7bN4bhY3FMTjWaTg7U2MdvYwlwYg7HahUEPBvb2QFNfc3NfwL7SQc/iUdP0K/TrpV6+39ZdOACy6gnA+Xo1+uXLMWMu6EJuCwbM3EQC0aVYwTcWWe2lqMOKzFpudkgsWiSCwA5kmZnky7LKRgMGuaysls0F+1D2FGSrVCRYmcTCNSZuIM3oM2HMgV0m7XTdvh0rh3owarP0rr5Ca27pqh17qf7Y+x0PfcDUykI3rYNpy/sfsN/D4kfMF3qBRNDCYytWC746zfKyUkmcmjQaiM2elv05cMCmZG92wklsmLuJopuGkiNoYdssqGOI+wFxXVBz/lmRXhAcNyVUy6qMnCw0ggu+APZVojoIEaFY5eA1+uLGQk94zZortx4f7M8MH/rmN3vpqHW5NK9wc//ptQc3t/cdP95/456obgzW30GWC/XCHlJLkuQkYa6r0qDZqA5cAJAOdbjFGlnKHGVC2MWkgAR2X0qVBhNUb6xFqyouTZhs/hAewlm708MbXupgISaIl3/QAEaY3skKTi2wR20FZoZhACGVZ7YiMDBL8BlTLKjn4XGDxnqDY3OiflPv5u7hpdnNvRsbkpt6t2SHl3Zt3jh488DAzYO3be5ZOty9pXdLPL65d1PP8JLCxt5Nsdhmal+8fPniRSMjnPdcsGYxQQGJeVy1D7QWOskN2jON5WKSDmX8pM/PTgAT+uCEKcviWc7zaJ87QN2Zs0WHE9fKYQPpaMwWnQ5WJi5hh1qWxbgczkoewT9T9eFy8aJlXEf4cV3xEd1Hdp+74d577931nve851pBKX2NFkqf7F/ff8898AJgVuS9EXhONZpQKYnYjcTeKtF+SWSyf926AyAKHhOa8RWuse7CZ+gPgWdbSI68V80uRrQKWeZRdrGr1mWVVlhuPcaPMHzS6lI6ACM/nPO75BCeTsLpJHgnwArd6Gzq0dWLNeNOS0rPmOyeSH1Te46VzLmLXivv/6mPAB3q0H9+Sm8NxfjnJl4MhhuzcQ473KgGlPIVa71HLahNrUvHuw6v3rkyPW9ZuqtjZN3y0e4jm/Yvb+kfSRcyoxuWbem/PrXgero4NeRr7h9a3dPXnIw3tNSEh+YNZ5sGhtbm56eTsWSqJrzw2o2NTcnmlqYWJhujwn10r0hYnWo3QVK7cxjUwWJRFtthJaqYuRjimQuwPiZd7De1UrVS3lipWY3Ga4LxeLBGgZ84HAtPdsTj2j/Wn7WJ3CS8KPwK7usjafI+UvSwPiQdGdGli1HcoTW6qepQRmbSzj6UmzPYtiaHwaVsZbBZ3MQF5y08phEHIRln+WvsAYUPlDY86+eBTRcumOipqU018ya1ZtSlqQJGBp+yuPyGeCMrCXa7tLoE0evXWggMgRlrpjkpm555x+1PP1166+TZI4fPnj185OyWHUsWdiUbmpqznS2ZZH330MhW2kF1z8L3nqGFow89dPSqhx8+umV/U2dkcNHAYH02s4/R5ArYuK8JvyY1wPVJrFoMqbKWO9LYrBcLhETYq56cEtNhJS+G4Ox6Lrl4fAdjO/Vq4sTGhVcUNOmExRpiwqseY9ABNXfiAxLEAhIegMRSXKQ6f8IYdVbmREucsOp0NXlyxVUHutsyHUPB1cs+Gvcu9OVWDq3S09tK3x0rNGVP0WcXLw03J4ILovd+MWXtM+XmLS/dsWoVfX4kvwP4L09y9F+EADGARe8l3JI3Vyx5tCVZt1ZefXsyf+ed+YSMr1S38NuJl19OvMLfuNwbJ++g36E7iZ50aBXGWqcW06sGFjgECVLUiWUFZCx3OiW6x+mJddQ99sP3kv9gr5SOLCa/EhYBj5vAoouQBvISKbpULvcCw4IdYuNH4cxklB0Vw1EEKuwG2VqTlRsyk152Xu3MrGJ1MJEmI/y3aBb7FEFbTfr5CT+LTU3qOftjo6bbgiWpaLtGMCcmx91FVy1LoPmlCYNoYyrL4Wax8TAW21nQkC/IUQnMX3hvcBcdZsyuaSUfHtUGauxBvYUcAmI4i/oMvCyfWjm6+APfefCB8w/mr3vi2us2bHRsOLVow9BIuG7+ggj95eEPfOD8Aw9+4e9uvPHvbip9goY2zPccP3LkkdYmlnP8FM0Iv6nQXD+FP5emeZRKwqeWLEF51kuL9FbYQxaWAcHt4YCN4snw9KKfx+/czPXH0ggwqVjdrGQtN6t7HJdqVUVBwORA755Fi3fvXrxoz1iuIZnNJhtywpplGza+b+PG5e3ZzvHOTqLWuxPgxdcBDyfZrVpOvOJdtuZYZht0q44VgOgcYBLpmXWkNyKfguPuOI/KDvMdpmzRzpSuXcRcCShkO1PImDmBfc77InO4JasbCrF8/uzGs2c3rlhB3dhWeOoU5+ksXUA3CVOw3waYn2FCUZJRBB0PrGM3mG1GN5i/uhvMLU0QvdPLOye0xolcpRXMmO1fO7hi/Y7nzaV/vm5NIpxJCX8zPNTddWz1QP7ggZZwLIMwJGkv3QwwNICPxi0yM8j7MG7/BFss9AP8ak8yNoC5tQYwN+89NsAyKeEIrlh1K5iEnO6pYZzNWsE8+bfRCpbsbOxNta1KmmrqmhqjuXTz4MiiseaGZM/WZVvojenWxtii+ZFIbaSpPb8gE+00i/q+xsIoKefH6952fvxzmVeEJ68eW89ijxfSgg58/TA5QIp+9A+kHC8HRjLYcizMG2EuCgauarMYu8K6DYxGYuW+iEGjICJrlWQ/7mBF8iBF/Og7hTEgzj+m6CFwc8kbFXkoi8lyrNFPGcFr3TMumKRoYLR7PLRRMvhHkguiOut3hZ+VvpdszgRcY/RM6a9WbbNFexrbW2iu/n6EfyvAv5vVsQyRclMWJkd4KEa2nOeJW9ckYTUW2D9r5lFNPR8SAVxlqY6V5+ISphKMUjvdeudN1Lzu6LobztCfb7n2rTut4vy3XrbS39OrGQ8PUBv4dA+B/dCEu1z16C7bgOq+qJGGdpd7WKIXnFQPVrObrCLIesiB2JFi5mWE5mrZq8clcLMyQuYbKqLE4q8Sj7+aJIU6WDiEzbwI8Hx9YyKf09gtGo4m56Vbzf2ZzLLuge/lXE010nXLdB3xTDfCsgj2p0v4KejEWoLFHUxjwf0wfifqqhtAgVSLzvaP7hDeu760ja5Gtx44cS9c5HWQgVaQOwGyRY3K20UW5nHrwbIF/Cp5azR7XTOT1liBoNjsPA+KVZuywQ1WPmMttzQ7WV1tEGDuYO+R7TsOHd6+47AZrIBvHbvqqmOCtPfmE/v33XxTaf2qVYL06KOPkIt1P3OFLdW6f4CCs+Qzqm+o85988q/gVZY3gsL/9sJXEvwNcF50QRH3g84wgOSvAVnL/G3e7GF1Bim3maw6dKCLTqvmwEwYguDys/RESCMzbjLsIHNllYAbbaxigLmqAR+I6CAbIxEEoSgHXOBKkY3AEsAuterSKNTI+swmTWaLHScDKAFJ4j2STlV+GiQwPZh2pZiWBXYBw7S8nDgIIdntCRgr3Z5shU/RB/tLR6jznQuv2W5c0tOzQriCL/n0Y2Is+tarT2ZpJPTHgwf7d+1iPID02KfSo46c4fJF8eh4veCkPeKnfOjDhMGvkSBWTYIQK/ycKoZYrCIELjtziCtIhqSnAEkra6okSsQjuZ/SWV1iCOstefB8LuTMdC6VUY1i9CL1MRNTOjlbmyC+SXX9G0Ae5Mk/kmKPlqVmiiUEB5PNbT0WYITOnNIMjJDLFtuaEbe2jBkERwI/q1I8YFGzOoRZukeOuZQe4I72rNINv3Vki909eJHuHHBHTzce9jQDd3S7JjOcOzIZVpTQA/rqqXBjqindhgTqzgCBWoFwbeCByC0FpsQmQYmlW1nMQGK6Tf73KLM5WOhy+u2dszmLrrqUwit9fg5eE8jCC2n6Ctg5NSRODhI5kMH+DjmeUZvutE4ltb0GxT+mgcyuCZe5zgEOjhV0W0aps/JEVy0GE3SwQRQzMNFT7kA4EoszHotj8TQxen3M9gh0LRD7aQ47cqqcMS04t7DSZtexct7gxpNb9z/KYnWFi7rsOveOCxYWvAM+Yn1j4r0sVugkd13cOWbTOsfActLyK7Oax6RLNo85WfOY05OesOGrSGQnax6zOaubxyYEk4W331KbFgpT+8fQhhCre8gWdTxf+7VyH5k4OHZVZ8lGd7M9wXG5T8Xlzsvg8n8BIsMvZL7lryASPzq2pmRBRKrxcIB+ngMPZwUPz1x4eC+Jh5vh4QY8nPgKeLgZHk73LDysLo4HxialGXjkcJSIpxoV313970qducVZwabu2LG2NWtKpmp8jgM+6Ol/+GJ8QmUe87M25wm7xW9Sa82icyFYd0kEIwzBCCAYwldAMMIQDEVmISjVcgRDzHJU7B50iGoK1aiioAGxwzcaZrpnLKC/cbR+0Oby2wupkdgiPBArBIhs6fAGajZ3eIPT/wpE0Kk0OAo08ICNUk8mLqaCt0wFKSPHQHub0QbWakRVCoBNNOngwSkH09uTUf5btEKdhktSJ8CoE8BZWPgK1Akw6ngDGnWC2GXmR0+4KOh9LLRHvexUFWGq7SAgSb7iNJapU6NGwuI5IEoWDurr4YRKne5gLBasicWmf0R3fx+OO+IxUqYR1uBL4M3Wkb+/mEbuMo1cmckaHk2IZiatatQgNptUAW7EBth8hEk7/81eIVX8kqTyMVL5gFRufAVS+Rip3D6NVOEAaDCr02VB31C2S4rgwaQorz2jWFTqLbChC4rdVJhJPnWMChJPqLjZGu2WD+4bhH/ITrlITTASCdaohFvW2t/f2tbfP/1PdDc1dtXVdUWJcOF1oNufWF+Bh3yIW78yyWFLkNr0aJiadLhsaBSCw+UQMdg5qTfZWOelgcU8tfaxL/yPf3mCEcLWLuvasTHGbHzTIetcitv4ph7eJ/Q6M/YC46vsdk3Y3Wy+Gr5yYfIM5uKxh7x6Ipqi00vcJUvQuDEeiPsSgZwvrjYI26ibfsNa+kYvufDLvp+WvtVc+sPC7T9aqxeU0Z+OvjaK7cJ7ea+lk/XZNpFr1Blo3hxrbNXaLVGtxnTljtvm6lZLnIsRBKeiBd7rbaxQUnR6fbWRZCMTBI3Y6R6Mgho21qJ7/TZ6cssWSKrs8rTT2V26K29gTk86HG2Yn241HrplZsvuiNjK/KAa5hSNe57hfUz056CTUYttuHzXrOwsK+XLN85i8MfM66xnNdBS0EyVJtrS10DBqp20TLuW4bnnvwaeb4Oe1OCpAyVZhuc+gMeNFTCX7yr2vA1gvCowis1duBgcpvCqIHqAq7syUEzXEd7PDnAdBbhQwt/yFyjlY0LeOUPIXxZMFE42MMsn3Vzim6vlP+sYMGPNlNN3MQ5VArtKWFfh9LAmrl+piGqOniarazQ5LZAE4OkE/sR8VUyd7KLHbJuYYckrHe+4MZejQJiySgBfvWcXY6lpt9bHq13rnrd/LQ9eC3iiZRdjh6prXfg9XGsA+AJ9wGa1EsmkjZoyssZINlTKAhZAUaD6AiOUqFo0cF07X9mVu9RFnXaoFxcvvAHXns/W1klCZLNad2UXWKpGDvIckifLEtk2ZvtPGJw2UxpDQUMsFKTmlCZc7LSfrxrmtv3oAHiCHJhq1YrJvspqmbUlunYX1RapvDpv/QwhZb/iIgnAgby32Q0e4hVqPb/HoNY6xIATKahCO5siSfXgvGRZ4FHiFfLAhbFs0SMhF3oS4OhJHjyUMP7q4bN0LJI6l4qVA1lqeBlMZWhAmkqBytgA5MPA2qrZAR/bWTU84Ikn6IJh2laZIEAX/L48Q+DHw+XezmVgQzrB57r1os5gsAEw0DPhc0fBbqzVl6dFzGoVTqitwkWrTW1QeEqwuIO1cZ6tLIq6msKMnmElCspAccXhyO1Tg48X9xGLF1mK1Z3F7osMxdm9xlXmIsoR1ncM+wv7jr1kdI7OY9DYVW0s1c3HfrU4d9IEDjYPVVyu/XiABowzW5AHYZ/ObkN+BfWABtc9/zVwLYE9PxsuGfWBBtd9DK4AWTZnp3ZwLqBqqoHyvg2gmKSYCZeHy4yLQFO1QmU9jzP46sneuehWl0FvZ8LvqQP+DevLnWGzAG6oBjg0E2DFH4YjqX5O0PMXcehMLLwX8ehshP6uikXBVuc4HWU4hUmK3DgXVqGMnMwpXjOKEzaAtoKRhMY5F41gnEfgtwT/LVHBFmfRsnCimeXxxIKcwEqfyy9Sfm5dNxPdwEXqbja6X52t9sD+PERO0q/S72G9KwvRqmM1Dx0/3qv9mzh+vHDjjQV2rK79aaBTDvyZMEmAtOLTWOqASiiS1fle8BvTeeD3GTKsAxxHu0lYksFL3CkPRlp5J7jWtwk29otEcUvYt2kw4rHRwPo2n+s/+es8L10NuuSac0pE96acOKdHg13vNnjSz/WveO0h+IJVllwTJsnoSesnXPhW+QC+6sGvFuE1dnfs7gQmoApF+DK8kadMnmBNJKFOh3hGb3JV/c5sfspqEBSRFYjW1qkzS8pl7AGjZjsbU2A1570BD7ClB3hU6krBYoUTyVXNwysfuz0RZgf71zxU6/3M3VL0M2twqYynfXekPnb8k5813gIHf3Pj8/MEi376e3rq/1wf0xesdxxkKPpECy7uHgezUJujMauB3Kc2kBftLjc3EGY3kaMVUm4kvxrE5cxmcuGbKC0rMNzzfxyGO0A0zoLhcZSMFRjuAxj8ZPlcXfSBuQDAfgqR8LZIozQJ283r56Vd4MTNCQ6TjGWIRrlQnA1UlUzkcB0FuGpJI/YGXESdmozckFM8IDzqQHikNDAnXCIp209VME/UW4xwPszPhzOT9dzCalLnISp2/dyUnFtelFFZeZGomIXVF2ZJCoH3o8O641z57pkd6bI9w1KFalO68y82pYuw0Fpj+nzmClWa04VA2R8SOtW5F8urJunwMhp18oV40eQLRbBn2ewLSe2iYWlvr10qz8nylQeFdGuDQnbuuO3u+07uOji65q+vFJTrj1x1/dVnXhpadz/P774u9Ai/Jh1azLLow0XFlizeAUnlTnZzbHTscDFrDMeD2pgCUNwW8NzdEVCAzXCyOaMYwWLLwgeJDgCJDZ2e1AXjKZYwaHYrvlABuZPV7vCOLfxSq1Q0uoMFbqapa+sQfF513oVWbNYulgfWGXzSnsO7V+1JNCea+/qaj6we7WlItXX2NPUWmgLxeCCd6c0LvoNXrxmMd0ebvIHmRHp5Zv3O+gEwcBPdyWRvQygdqU14Y52Llk//T+Bt1gcuBlkfeCPmot5OJ3jqEp3gTbM6wZ8y2YOJhkY22dOt+JOF/4R2cJQml2kJp5nnI5doC6dfGzuRJWWcA///4Px85r9fCufHbhwbJzPWOQ7+5h0VnBtm49xUwbmF4VwPONe70IPScE5jXIoXrnF3pJGhHY7EONpFf7SO+SZNDf8+xLXI/eVGAHSD3G46fdpwqUkAwtqbbmrdtq3UxCYCVGhAgAYtJEv+W4UGbZwGTWjgAA9MxCJNsLOT+qkqsnRWyJJjZEkDWdIuJVMhCzY8p9FjA7Kgx5aRngaqRGLJFo0s9QlGls62S5JFiWHbc21L4S8QiNvImolsFC9HqXxyBRjMoZpC4yjYy6Ea6yVJtm1zR2vNlo7Wkp0TTafOifgj0KyRtJM+8ukK1Zpnc06bRiK0CntzShT0YRb04TxGr5Q0NVGbQn0Y53ov5UJGUoknu1xyNwaMMvzDTGaymyvF+WhQomdrCTKaFk12Vt/bzcdLYI7238Vi1dELbZ9VnZuTkv1q7Wy8iZHwU5q+nYuW16p6dvp13IefVX8r01Scz+RPK+khz70dCSSnM5MdPInQnZlsVJMI+WqpBDpqsp2nDdqrZdREkwtctckc/yiXmWzi1Ye9OFi0HccKByPJxpY0mxfaJP2lqR1KN+g4pSlReJvCq5xC6CmnDy4jzPQ8odAfCdaEwzXBS8m1v2/r729r7e8f7opGu6Ll/S16hFrSQNpgfz/FK8vlaE5JAVVrOFUxq4CVUJ3ZyfZAPdK2HT5sd8kiFhG0VrZ3EmiaZMkXOZ1V2kHLB7JI1gzOjVA3e7Is93XShMlen0ICtruLTl6BDrwq1URZZSbs/dow2/uBFNYS1MaSzezLWDtQXdY7i6CB2SMnKqRtBNomc5yYS3o5MU8mevZXz6I40b/wpvXb9+1a1+UYfIR24FwKJGhPBxB040ZtPMXWrZtX793etrDp49pMEiebSdJIbuAzSdC4rR5Lgg1q0YpSVN1kbFH3u7lGjFkxa2ES7W5PTW2igXn/mF6Sa7FIsegPoyCU7W93lsmc2YuZ000G1mq5CyzfMo7vrB510qVvq8pcbHPey/iFzREBnYhzRGpxGvHlJ4mELzFJJKJOEpkUra5giA+P+/fOEgFP3Tj3PBEBDJtZM0XeVO0Zjkfg/xE8wFiZhcffqzZKZT1qSBR7Y2biEQE8QhyPEOJRV8YjxPCoVfGIaekaD87TfRqw8fqCNQwf9yTg4w8wdpyJUegyGKnWiDjnsJc+boYIF818Efzc/vjMx1Hm85k1fwTcoiRBMuT+2djVA3Z1HLs6HBWdkdtyih80aAo0aEcZ1brshMeMSrSmnFiJcbwnWgwxON/AzzdkJlu4/uyEjxtg601YXSIbw9fCe6jNVj5yoE66DOYzsueAfnXE6iJSlLVjEonxN5pynEmVHlURlu78+GtlnSgQD+zIEqw97ytScytsoIdJGycyK0njgQ1xx7jwDdgE0/drs0kwl0AF2Atv7zqYtggAQzaNCx8GJqxc58L/hOt0Ajwz8jO0Kj9j+Qv5mVrOFyvHhQ8xPpi+V722eAGHfbUDL1hZRGFYy8/wVhq5ppKfYTu1qr/HZk0rTgvLEris5bxMhKEzOxtTvXQBbWGuHxe0VRE+r9knWxCw8q/qfKW3RBPA1oSx0hoWBTRg1R0OREAY7RnFgVuQZ61xyE+YZ639Fp61DjMzmMkOuV56RjQbXKAJrDx7jQE2P7azmLHgQG9ghoViwooEh1vBMBLTgxh6a8SQWyNI/aoonFrt392VYhMljq/bmhNrtqwYXNm60LslP9zTv3HlmSt2nd4x1DcwKua2dC355ZG7++mNS1bG1vocw97wSGZg/pfPnn74jhs3jh/aWx8b28hnytDfgG/gIjHEWZt0EkWXgEe71WzN7OEn8UsNP0FyYK+7LLGxHjgCxT2p9/hrmZNk4tXfRPGjaSvFCnONRBFnWflVI1J6Ztn0M0emCH+rGvKanhOcwMsWVquybM7pKf65pqcEtBC+KJjcVTmHS81PwUzIjBkqLqa0quao/ImprDJMgf8CmLxMAVXB9DJTP7PoFCQbVZi8GkyByiC0qumxCBPW47r5SGHZBxpHsNmdEhsjq+f1xQHvXBBqemXm8JkhLjisM2bQCAGuTB7gs2g0WAnAih79dSqs2EUZZF2UenxqQhBY1qdXwY9V5tKr/kJUBT+hhjAQ/CiCb3f7Qhr4HmxDi6jgKy5MLFpDsxG5yBudgdHwLF4Nz0QtpjmdNzHkdOqsnz8Cbn6Q4c3kNhW7Gm0lwgbM3smpnOIw83wwj1QEwMW0BlA7SuV0TYgjOdGgD5kqBWgZVU+yUAY2GMkC66gyhVlHFRshE66Zc9Fm+I0MzxlKUcV5uSZyQ4jssxVdqGGd1/TgLsD612VNyJ6PR9rod4QhOLLyJ5SwETQYXbZmJo38QSVEnbsJZNCfl2386SGurNr3iRX/OrXaVlDfseeo1Iy1tPwfdY+NPc+fUvIUvjWpfHUaaP9eNQdk5jkg2ZVjCiCS5Y0A+hx7zktNtioL5D4/4XITRxpzQRjnnnAZrfBbXMJq439DNijyqwt8+HdNu0MOnlMSvjf1cuRcJR00/5e/2jNnOqj8weXTQRMmTzDxb0gFWcnbSgWBOiqcPuavaRxtzs8/fVXYAwe98/d2X++1vfug03VXFy69/ib/6diZDace1p/y3xI7s+n2VnqDULpGfOnWVtBBbFYOyB/MWO+65LQc3+Wn5fi1dIjEPCun24s62OZW7Kz76NKTc9Aeqp6esxRk98wJOsI/ovTW4AwwOHf+R+BEv3fCKTExzkf7yFYucd4+mLtAnM8C8wkm0KvpGSAHLwln8PJw1qj0VKQATmqXJpxu9kxNICmDV1IfMHo5iJmYrwY6ymX8LLgfZzKeywA+N+mPLGPdRN55Cegxa91YyVo3l1GRMJQWKOedKmixQY2TEf5JJKNlsiv4tmiJbCdLZBsuj9pFCSl+XI1rvSYJv60JwVlof0MVfsGKEBT4vB/gMawqH7l44o9nrok/3lkTfybsDqfELIRLDf3BjNWswT8p4KdZw3+Yb1Ce/8Znyu4lF4+TZY84rp7+pgiObHb27Dc3s1YuPfVNEfTqk+UC1aNlq6a/8dGym7Ity3Gw7HfFZ7XJsuXxb6I6L+mPQL8Qz3HMpCByfUNOcQPjRHnG0nl+0seLvqjPCXYDcfEBRC42hlAl8URcrwMtWsuZpjajhnJZyMfn1B5hUxRYD9VlyH4Jtpm1FPsu4pzZC/P5i1kH1mnowuviXvaMm3rs1Hdrz5Rhj7sJqQUMGAXkJQ1YYWaxe0X+bEOtmgVsCbXag83xs2SL9ghr87VhjaPdZeZljJEAiDC92yuqddUmluCz4CN1SSBS6VMOxMGtDuR8CYMx7otXezHoxAx96GRbin7SWnplwPSVr+iH6FBpRbL11Af37127de2mDev20E2f+LxtdPTh0Q+uGrV95lPvfedtD77/He/idqC4QZ3jnCKPVUWScaKSqq+NOXxAkdyYnUzYg4hnAp23plkZLcXuYE9YBn5FzNDDxaqWOnRQgiJ30vR+3nFudDK1YpGKNoml/ZVIkD8jCL4k4ZcS7gkLqa3jM1mqwnqXDGgib+tZiOXU0TP53A3VsYV3dBdOXXVy7zvvuuud9AoeaTn18NGjWlTh8OEHznz9xa9/9ONcdvKc9lE2vyKG8zdnZLVBdERzit2M9gtz33h+G+wVE7C2hbO2JaMO0pjws9M8Vc98OqNLzYHLYUnB8O7cufC5U/VaevzaOWpYq5LlbbPy9NjLfDs9JMaIgaQJG5SQK7czG1mUQOSj0vmscYM6a1xVPahuUrecEZ685pq29esJ742+n14JPr6LzCPozgvgMOgFO85Y0msjPSdN/Jps5BM+aRWEgiqfFKNJm2xVZfgbjNHkivigPVTTm1wRW8jKB2Ww7kNqKdaMmQ1kxkSG/8hnMfjsF+yzwEVzICqDCGL06+xP2PeFf/3L3xfOq9/P09fJl4Q/gzWeIsgZ2hOZ1aeTWfkkKiOrw+SFG56uAZrTHsHoWlyoDzT2JIVcsP6+R1x1oWRSjbPDdb8K1616hrDp8s8Q9lQ/CxCumgrVNkqL6ev8qiFf8j4ev99Hvgp8//avG5jzuo9VXxZ7gunr9CZGhyAZRkrI/pxKDBA1mm8M9MCOFgyOeazcNy6TBo08HQsfO6WLCVU+TlRR7Wl2AABV0y9URUkB6UhPMTrWIFyghe05FWkWRgtpeGO0FMcC+q38sallEqAGBj3s50+qnU3o3JzUOT0X+asohnG0ffRmtg7/aXAF/jJcpzi1XNXLpx7VxBl/rCDfp0P0FWIk7drENTPvzzfreKCUnp/Us/EI6psaMtUaOFcsPbR06SEaPzS89NAwl7kD4LP/gD17WiK1WG/LPHZXKJdT+/4Vmy+bnfkk6rA2CECdXaQ4rSy2iUN7g9YpNbDZUz3DiN3+4qdVv9qMHuyrM5692Vz1qj1zOUcjrKe9kU+z0WQnR1IWs8xQ1qNVpitUzbd5snqkzRzXEivXkoWsRrPytdhIgBmN8mqLPJ85KwTBVqnHORN1moFiFvjD2SYJrTPbmT4nuinZD9fWsRPunKLXocPPzBXhvFyfZU8bDGT5uHWXixXggmpSewYdeomPPIA91p3I5/AxsSzFZswZEzjZlQ0o9LGnQ4acyzc7V/vv2jW+pLWr/67Qb51T551fso0tXTN/YO3BW92/XbC1//ht7QvrP9W/dcH4+uy2httPsv4I2iJ2sOfS1JHPE95IYrbnOOxi+ans+LxskxMLA2L8qTvuSzx1R9Zzz6UOPJM6lxxGz8XsJlEdGzkV5kd1fOs44Tse/ILDTfbq0uVmua7XRlmPmJ3PS/UH3pQD58Cb8mMXIZ2w2f2BsufvCavtAVWP+sGndfBmOJwPx2ahsu2WoGtsN439ynVwi27NEeeomQq6jYt36gRQ3tcMDpY+Q5fCz7tAmZtLN/2D1OCJlX5N3TFPg/QPnH9QoNoFO+ycbh5tVh8YUn2sTSrhql3T8FxDdUpxCS8w/Xt+PXy2wC/BNwngHEB1XsmMxwt4Ko8XANvfz5onfGxAddHPnujnx44JH/dVJHXWBOsjMFjZw7sVs4klAi//GIK4lJD4gwi2jo8tiXX19TTRxm3fwCcRLBle3zBY09g0PP1bnMOIDyNgM4qFJQB3nBzjM5dnDSqu5dBHsti6bsDsQ5ZFMWMMgToLS/7V8SQmWqwYy/Ri2MYQZvYpq8GmfM4DPgvVh1nAmZBXTXPvlmY+TGHb9p55m+udnkBDKjO/o6+n5SbrVSoqHmn6lhbjQndfn9AiAVLa4xX+NzbEmTR42mNgZGBgYGJw0l/V9T6e3+YrgzzzC6AIw/k1rKtg9P+n//mZtzFvBHI5gGqBAACG9w3+eNpjYGRgYJH6+4OBgfnP/6f/jzBvYwCKoIDXALfICGB42m2TwUuUQRjGn5nBaJHMkGVrW9Z1F7dSBNPFbZGUXDM1Dcmlltgw7BAbQdChYxSERKeFCOoQeOwqEXjp3L9QEXXqEEUEBXso2H4zfismfvDjme+deed7v/eZMbfUJx6zCLFtJs1bVe2wemHQPdQlF1PN9Khqzuo45M2mDjNXY+2oearTPsfuV51YAaahCHk4CSUYg3m/H4yGb5DLeNnv49X80YD7qxlb1j57h73GNWEbaEp18xO9x/tLxiNQUIe9iDZVdyniG8xvovORrqB9Omo71G3XtWLndNBN6IgdJC8PMfXyH2VfMzqKpuGQOYFmNWSXtGo+UncFsiqZJcVtF/1YJJ7QeZNoNa1jnFXVXdOqj9tZ1pLnc8x95j4oaW6TN6Or5oc67XvFzWdZ802d9C/Jd5PmidbRAf7/XKjJxyMPot743nVBt18b+vRAaZfRZVvVDXss9LnmPbBrKuNjmvdTIdbQCPSHf1qgrk+6EvqeU5r4FPnXfb57pqmIfjw4E/q/By7Z+h08SW150gY/clu0fkETzxLbfuxmWDeDek924j25QM4ydfr+74Gb1VDwJPs/+NEDCTz5Al/tGPG2H7vxZ80rnuzEexI8R91zTbvHrKEm84hercE7yW3gS1vHuTTf4UXEXXgDBeb8fYjgTGVcQhm1VISSx7xWEUrmFTS04JKa9LmmQrzKOvalziT3LmcPMJ7jDFUU/wcEupKyeNpjYGDQgsMChhWMDUw8TBOY5ZjdmPOYpzFvYf7EIsdiw5LBMoPlFqsQawzrPjYetiK2W2z/2EvYL3BwcbhxRHFUcfRx/OCcwPmKy49rGtcdbgluH+5N3K94OHi0eEJ4Sni+8Frx1vHu4xPiS+I7xfeL34A/if+eAJ+AnUCOwAyBEwI/BGUETQSDBA8JiQmFCW0Q5hEOEP4hYiZSILJB5IYok2ia6CrRN2IuYkvE7oi7iLeJn5NgkKiRWCXxRlJKskyyT/KVlJJUjNQ0ILwkbSY9TUZAJk9mgqyKbILsK7kUuR65LXKX5PPke+QvKcgpJCgcUXik6KTYoLhC8Z0Sn1KSUoeygHKHipvKGlUh1TLVe2oJap/U+zSYNMo09mmyaQZpHtN8oyWk5aA1Q5tBu0z7kA6fTpzOCV0n3Rg9Cb0ovTl6L/TD9Pv0LxmEGVww9DI8Y5RmLGC8xyTB5IqphekcMy6zWWb7zB6ZC5gnmN+y8LCYZHHH0shygZWCVZy1jHWB9REbJZtFNm9snWwP2JnZHbDXsg+y78MB59ivst9hf8H+hYOIg4NDjsMORxbHAMcqxzNA+MlJDAhrnIWcrZynuTAAAMXvjoMAAAABAAAA6wA7AAUAAAAAAAIAAQACABYAAAEAAVEAAAAAeNqVU00vA1EUPTNTX/ERCxGxmpWQMNoiaEQilEh8JDRsLAwd1dBWphVh5UdYWvsF1paC+AF+jvPu3DbadIJM7pvz7rvn3Pfuuw/AIF7hwEr0AHiiRdjCCGcRtjGAF8UOQnwqTmDcWlbcgVHrTHEnhqx7xV0oWw+Ku5GzbcU9WLcPFPdiyX5U3IdJ+0txP46chOIB5JxjxW8Ydp4VvyPpfGANRRRoNdodAuTh0nzOfaJTVHCFW+7cRJ3T62Kc3gn+00gixXFK0Qwm6c0xKuB/m8w7si75GaVVzkNqmdGXbBWU6fc55oUXMDLAmfiLzGFY+/CwQlunJ1SPYVSJdsnZI6OAa8kRMocZQyoUGdGaMcAGTsgYQ5YZA1G5YmSAC1qIkiiXmW8DGerH5cw0zj4TG+O27OxAMlQbp07zTEnRqCvU+YYdr1oUbFZqEmHOUZIMF/RVWL3/3oDXUjW3Td1crZzL2rm/VM+V+v1F83ct0281rmQwze9GPk96NJ7jSc+WYrinTfuqx25Jv0Wa0Qu4lq40uqbSUT1XqOYzLpo1c0znt7/j9vvwf2h5UpUCVy+bNKv0bGGTtctih52QlZdmNA+5eqIvxbzIVMObl3v3+WJN/gVZm2fuNBY5pjDX6N3Zb0bzvroAAAB42m3QR2xTQRDG8f8kjp04vfdC7+D3HCc23U5seu+dQBLbEJLgYCC0gOhVICRuINoFEJ0AAgEHQPQmioADZ7o4AFdw8pYbc/lpd1bfjJYo2utPKzr/qy8gURItJqIxEYMZC7HEYSWeBBJJIpkUUkkjnQwyySKbHHLJI58CCimimBI60JFOdKYLXelGd3rQk170pg996YcNLTLdTikOyijHiYv+DGAggxjMEIbixkMFlXjxMYzhjGAkoxjNGMYyjvFMYCKTmMwUpjKN6cxgJrOYzRzmMo/5VEmMmMXCMTaxmRsc4CNb2MNODnKC4xLLDt6zkf0SJ1Z2SzzbuM0HSeAQJ/nFT35zlNM84B5nWMBC9lLNI2q4z0Oe8ZgnPOUTtbzkOS84i58f7OMNr3hNIPKL39jOIoIsZgl11HOYBpbSSIgmwixjOSv4zEpW0cxq1rKGqxyhhXWsZwNf+c41znGe67zlnSRKkiRLiqRKmqRLhmRKlmRLjuRKHhe4yGWucIdLtHKXrZySfG5ySwqkkF1SJMVSYvbXNTcGNAPdEq4P2my2SkOn19CldNuUqu9R7z12pUPpalOPBCk1pa60K0uVDmWZslzpVP7LcxtqKlfTrLVBfzhUU13VFDCudJ+hw2fyhkMN7QeHr6JNn8fYI6L+F1L8oV8AAAB42j3MrQ7CMBwE8JWybuyzIwsO0hlMXwDQbGZmQa0Jr4AlwWGQ4HmL/1C8HRxQ6u53udyTvS7Erl5LYdcPjN3M0AjdVyRNS+UO4WzmJPS+94irmrjeklD1gx9G+gsfEBuLMeAri+AzO1mEQLCymACh/IFRZG9jtBHagTdHMAHjmWMKJnfHDEzXjjmYVY4SzJVjAcqF4xQsln8aKvUb+YhJnAAAAAABU4ZVKwAA) format('woff'); +} + +@font-face { +font-family: Fira; +font-style: normal; +font-weight: 600; /* "Medium" */ +font-stretch: normal; + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} + + +/* Fira license */ +/* This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. */ + + + +@font-face { +font-family: Source Code Pro; +font-style: normal; +font-weight: 300; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +}@font-face { +font-family: Source Code Pro; +font-style: normal; +font-weight: 400; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +}@font-face { +font-family: Source Code Pro; +font-style: normal; +font-weight: 500; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +}@font-face { +font-family: Source Code Pro; +font-style: normal; +font-weight: 600; +font-stretch: normal; +src: url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); +} + +/* Source Code Pro license */ +/* Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. */ \ No newline at end of file diff --git a/pollen/scribblings/manual-racket.css b/pollen/scribblings/manual-racket.css new file mode 100644 index 0000000..18c9360 --- /dev/null +++ b/pollen/scribblings/manual-racket.css @@ -0,0 +1,319 @@ +/* See the beginning of "manual.css". */ + +/* Monospace: */ + +.RktIn, .RktRdr, .RktPn, .RktMeta, +.RktMod, .RktKw, .RktVar, .RktSym, +.RktRes, .RktOut, .RktCmt, .RktVal, +.RktBlk, .RktErr { + font-family: 'Source Code Pro', monospace; + white-space: inherit; + font-size: 1rem; +} + +/* this selctor grabs the first linked Racket symbol +in a definition box (i.e., the symbol being defined) */ +a.RktValDef, a.RktStxDef, a.RktSymDef, +span.RktValDef, span.RktStxDef, span.RktSymDef +{ + font-size: 1.15rem; + color: black; + font-weight: 600; +} + + +.inheritedlbl { + font-family: 'Fira', sans; +} + +.RBackgroundLabelInner { + font-family: inherit; +} + +/* ---------------------------------------- */ +/* Inherited methods, left margin */ + +.inherited { + width: 95%; + margin-top: 0.5em; + text-align: left; + background-color: inherit; +} + +.inherited td { + font-size: 82%; + padding-left: 0.5rem; + line-height: 1.3; + text-indent: 0; + padding-right: 0; +} + +.inheritedlbl { + font-style: normal; +} + +/* ---------------------------------------- */ +/* Racket text styles */ + +.RktIn { + color: #cc6633; + background-color: #eee; +} + +.RktInBG { + background-color: #eee; +} + + +.refcolumn .RktInBG { + background-color: white; +} + +.RktRdr { +} + +.RktPn { + color: #843c24; +} + +.RktMeta { + color: black; +} + +.RktMod { + color: inherit; +} + +.RktOpt { + color: black; +} + +.RktKw { + color: black; +} + +.RktErr { + color: red; + font-style: italic; + font-weight: 400; +} + +.RktVar { + position: relative; + left: -1px; font-style: italic; + color: #444; +} + +.SVInsetFlow .RktVar { + font-weight: 400; + color: #444; +} + + +.RktSym { + color: inherit; +} + + + +.RktValLink, .RktStxLink, .RktModLink { + text-decoration: none; + color: #07A; + font-weight: 500; + font-size: 1rem; +} + +/* for syntax links within headings */ +h2 a.RktStxLink, h3 a.RktStxLink, h4 a.RktStxLink, h5 a.RktStxLink, +h2 a.RktValLink, h3 a.RktValLink, h4 a.RktValLink, h5 a.RktValLink, +h2 .RktSym, h3 .RktSym, h4 .RktSym, h5 .RktSym, +h2 .RktMod, h3 .RktMod, h4 .RktMod, h5 .RktMod, +h2 .RktVal, h3 .RktVal, h4 .RktVal, h5 .RktVal, +h2 .RktPn, h3 .RktPn, h4 .RktPn, h5 .RktPn { + color: #333; + font-size: 1.65rem; + font-weight: 400; +} + +.toptoclink .RktStxLink, .toclink .RktStxLink, +.toptoclink .RktValLink, .toclink .RktValLink, +.toptoclink .RktModLink, .toclink .RktModLink { + color: inherit; +} + +.tocset .RktValLink, .tocset .RktStxLink, .tocset .RktModLink { + color: black; + font-weight: 400; + font-size: 0.9rem; +} + +.tocset td a.tocviewselflink .RktValLink, +.tocset td a.tocviewselflink .RktStxLink, +.tocset td a.tocviewselflink .RktMod, +.tocset td a.tocviewselflink .RktSym { + font-weight: lighter; + color: white; +} + + +.RktRes { + color: #0000af; +} + +.RktOut { + color: #960096; +} + +.RktCmt { + color: #c2741f; +} + +.RktVal { + color: #228b22; +} + +/* ---------------------------------------- */ +/* Some inline styles */ + +.together { /* for definitions grouped together in one box */ + width: 100%; + border-top: 2px solid white; +} + +tbody > tr:first-child > td > .together { + border-top: 0px; /* erase border on first instance of together */ +} + +.RktBlk { + white-space: pre; + text-align: left; +} + +.highlighted { + font-size: 1rem; + background-color: #fee; +} + +.defmodule { + font-family: 'Source Code Pro'; + padding: 0.25rem 0.75rem 0.25rem 0.5rem; + margin-bottom: 1rem; + width: 100%; + background-color: hsl(60, 29%, 94%); +} + +.defmodule a { + color: #444; +} + + +.defmodule td span.hspace:first-child { + position: absolute; + width: 0; + display: inline-block; +} + +.defmodule .RpackageSpec .Smaller, +.defmodule .RpackageSpec .stt { + font-size: 1rem; +} + + +.specgrammar { + float: none; + padding-left: 1em; +} + + +.RBibliography td { + vertical-align: text-top; + padding-top: 1em; +} + +.leftindent { + margin-left: 2rem; + margin-right: 0em; +} + +.insetpara { + margin-left: 1em; + margin-right: 1em; +} + +.SCodeFlow .Rfilebox { + margin-left: -1em; /* see 17.2 of guide, module languages */ +} + +.Rfiletitle { + text-align: right; + background-color: #eee; +} + +.SCodeFlow .Rfiletitle { + border-top: 1px dotted gray; + border-right: 1px dotted gray; +} + + +.Rfilename { + border-top: 0; + border-right: 0; + padding-left: 0.5em; + padding-right: 0.5em; + background-color: inherit; +} + +.Rfilecontent { + margin: 0.5em; +} + +.RpackageSpec { + padding-right: 0; +} + +/* ---------------------------------------- */ +/* For background labels */ + +.RBackgroundLabel { + float: right; + width: 0px; + height: 0px; +} + +.RBackgroundLabelInner { + position: relative; + width: 25em; + left: -25.5em; + top: 0.20rem; /* sensitive to monospaced font choice */ + text-align: right; + z-index: 0; + font-weight: 300; + font-family: 'Source Code Pro'; + font-size: 0.9rem; + color: gray; +} + + +.RpackageSpec .Smaller { + font-weight: 300; + font-family: 'Source Code Pro'; + font-size: 0.9rem; +} + +.RForeground { + position: relative; + left: 0px; + top: 0px; + z-index: 1; +} + +/* ---------------------------------------- */ +/* For section source modules & tags */ + +.RPartExplain { + background: #eee; + font-size: 0.9rem; + margin-top: 0.2rem; + padding: 0.2rem; + text-align: left; +} diff --git a/pollen/scribblings/manual-racket.js b/pollen/scribblings/manual-racket.js new file mode 100644 index 0000000..203d6d3 --- /dev/null +++ b/pollen/scribblings/manual-racket.js @@ -0,0 +1,98 @@ +/* For the Racket manual style */ + +AddOnLoad(function() { + /* Look for header elements that have x-source-module and x-part tag. + For those elements, add a hidden element that explains how to + link to the section, and set the element's onclick() to display + the explanation. */ + var tag_names = ["h1", "h2", "h3", "h4", "h5"]; + for (var j = 0; j < tag_names.length; j++) { + elems = document.getElementsByTagName(tag_names[j]); + for (var i = 0; i < elems.length; i++) { + var elem = elems.item(i); + AddPartTitleOnClick(elem); + } + } +}) + +function AddPartTitleOnClick(elem) { + var mod_path = elem.getAttribute("x-source-module"); + var tag = elem.getAttribute("x-part-tag"); + if (mod_path && tag) { + // Might not be present: + var prefixes = elem.getAttribute("x-part-prefixes"); + + var info = document.createElement("div"); + info.className = "RPartExplain"; + + /* The "top" tag refers to a whole document: */ + var is_top = (tag == "\"top\""); + info.appendChild(document.createTextNode("Link to this " + + (is_top ? "document" : "section") + + " with ")); + + /* Break `secref` into two lines if the module path and tag + are long enough: */ + var is_long = (is_top ? false : ((mod_path.length + + tag.length + + (prefixes ? (16 + prefixes.length) : 0)) + > 60)); + + var line1 = document.createElement("div"); + var line1x = ((is_long && prefixes) ? document.createElement("div") : line1); + var line2 = (is_long ? document.createElement("div") : line1); + + function add(dest, str, cn) { + var s = document.createElement("span"); + s.className = cn; + s.style.whiteSpace = "nowrap"; + s.appendChild(document.createTextNode(str)); + dest.appendChild(s); + } + /* Construct a `secref` call with suitable syntax coloring: */ + add(line1, "\xA0@", "RktRdr"); + add(line1, (is_top ? "other-doc" : "secref"), "RktSym"); + add(line1, "[", "RktPn"); + if (!is_top) + add(line1, tag, "RktVal"); + if (is_long) { + /* indent additional lines: */ + if (prefixes) + add(line1x, "\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0", "RktPn"); + add(line2, "\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0", "RktPn"); + } + if (prefixes) { + add(line1x, " #:tag-prefixes ", "RktPn"); + add(line1x, "'", "RktVal"); + add(line1x, prefixes, "RktVal"); + } + if (!is_top) + add(line2, " #:doc ", "RktPn"); + add(line2, "'", "RktVal"); + add(line2, mod_path, "RktVal"); + add(line2, "]", "RktPn"); + + info.appendChild(line1); + if (is_long) + info.appendChild(line1x); + if (is_long) + info.appendChild(line2); + + info.style.display = "none"; + + /* Add the new element afterthe header: */ + var n = elem.nextSibling; + if (n) + elem.parentNode.insertBefore(info, n); + else + elem.parentNode.appendChild(info); + + /* Clicking the header shows the explanation element: */ + elem.onclick = function () { + if (info.style.display == "none") + info.style.display = "block"; + else + info.style.display = "none"; + } + } +} diff --git a/pollen/scribblings/manual-style.css b/pollen/scribblings/manual-style.css new file mode 100644 index 0000000..fa7e8cc --- /dev/null +++ b/pollen/scribblings/manual-style.css @@ -0,0 +1,743 @@ + +/* See the beginning of "scribble.css". + This file is used by the `scribble/manual` language, along with + "manual-racket.css". */ + +@import url("manual-fonts.css"); + +* { + margin: 0; + padding: 0; +} + +@media all {html {font-size: 15px;}} +@media all and (max-width:940px){html {font-size: 14px;}} +@media all and (max-width:850px){html {font-size: 13px;}} +@media all and (max-width:830px){html {font-size: 12px;}} +@media all and (max-width:740px){html {font-size: 11px;}} + +/* CSS seems backward: List all the classes for which we want a + particular font, so that the font can be changed in one place. (It + would be nicer to reference a font definition from all the places + that we want it.) + + As you read the rest of the file, remember to double-check here to + see if any font is set. */ + +/* Monospace: */ +.maincolumn, .refpara, .refelem, .tocset, .stt, .hspace, .refparaleft, .refelemleft { + font-family: 'Source Code Pro', monospace; + white-space: inherit; + font-size: 1rem; +} + +.stt { + font-weight: 500; +} + +h2 .stt { + font-size: 2.7rem; +} + +.toptoclink .stt { + font-size: inherit; +} +.toclink .stt { + font-size: 90%; +} + +.RpackageSpec .stt { + font-weight: 300; + font-family: 'Source Code Pro'; + font-size: 0.9rem; +} + +h3 .stt, h4 .stt, h5 .stt { + color: #333; + font-size: 1.65rem; + font-weight: 400; +} + + +/* Serif: */ +.main, .refcontent, .tocview, .tocsub, .sroman, i { + font-family: 'Charter', serif; + font-size: 1.18rem; +} + + +/* Sans-serif: */ +.version, .versionNoNav, .ssansserif { + font-family: 'Fira', sans-serif; +} +.ssansserif { + font-family: 'Fira'; + font-weight: 500; + font-size: 0.9em; +} + +.tocset .ssansserif { + font-size: 100%; +} + +/* ---------------------------------------- */ + +p, .SIntrapara { + display: block; + margin: 0 0 1em 0; + line-height: 1.4; +} + +.compact { + padding: 0 0 1em 0; +} + +li { + list-style-position: outside; + margin-left: 1.2em; +} + +h1, h2, h3, h4, h5, h6, h7, h8 { + font-family: 'Fira'; + font-weight: 300; + font-size: 1.6rem; + color: #333; + margin-top: inherit; + margin-bottom: 1rem; + line-height: 1.25; + -moz-font-feature-settings: 'tnum=1'; + -moz-font-feature-settings: 'tnum' 1; + -webkit-font-feature-settings: 'tnum' 1; + -o-font-feature-settings: 'tnum' 1; + -ms-font-feature-settings: 'tnum' 1; + font-feature-settings: 'tnum' 1; + +} + +h3, h4, h5, h6, h7, h8 { + border-top: 1px solid black; +} + + + +h2 { /* per-page main title */ + font-family: 'Miso'; + font-weight: bold; + margin-top: 4rem; + font-size: 3rem; + line-height: 1.1; + width: 90%; +} + +h3, h4, h5, h6, h7, h8 { + margin-top: 2em; + padding-top: 0.1em; + margin-bottom: 0.75em; +} + +/* ---------------------------------------- */ +/* Main */ + +body { + color: black; + background-color: white; +} + +.maincolumn { + width: auto; + margin-top: 4rem; + margin-left: 17rem; + margin-right: 2rem; + margin-bottom: 10rem; /* to avoid fixed bottom nav bar */ + max-width: 700px; + min-width: 370px; /* below this size, code samples don't fit */ +} + +a { + text-decoration: inherit; +} + +a, .toclink, .toptoclink, .tocviewlink, .tocviewselflink, .tocviewtoggle, .plainlink, +.techinside, .techoutside:hover, .techinside:hover { + color: #07A; +} + +a:hover { + text-decoration: underline; +} + + +/* ---------------------------------------- */ +/* Navigation */ + +.navsettop, .navsetbottom { + left: 0; + width: 15rem; + height: 6rem; + font-family: 'Fira'; + font-size: 0.9rem; + border-bottom: 0px solid hsl(216, 15%, 70%); + background-color: inherit; + padding: 0; +} + +.navsettop { + position: absolute; + top: 0; + left: 0; + margin-bottom: 0; + border-bottom: 0; +} + +.navsettop a, .navsetbottom a { + color: black; +} + +.navsettop a:hover, .navsetbottom a:hover { + background: hsl(216, 78%, 95%); + text-decoration: none; +} + +.navleft, .navright { + position: static; + float: none; + margin: 0; + white-space: normal; +} + + +.navleft a { + display: inline-block; +} + +.navright a { + display: inline-block; + text-align: center; +} + +.navleft a, .navright a, .navright span { + display: inline-block; + padding: 0.5rem; + min-width: 1rem; +} + + +.navright { + height: 2rem; + white-space: nowrap; +} + + +.navsetbottom { + display: none; +} + +.nonavigation { + color: #889; +} + +.searchform { + display: block; + margin: 0; + padding: 0; + border-bottom: 1px solid #eee; + height: 4rem; +} + +.nosearchform { + margin: 0; + padding: 0; + height: 4rem; +} + +.searchbox { + font-size: 1rem; + width: 12rem; + margin: 1rem; + padding: 0.25rem; + vertical-align: middle; + background-color: white; +} + +#search_box { + font-size: 0.8rem; +} + +/* ---------------------------------------- */ +/* Version */ + +.versionbox { + position: absolute; + float: none; + top: 0.25rem; + left: 17rem; + z-index: 11000; + height: 2em; + font-size: 70%; + font-weight: lighter; + width: inherit; + margin: 0; +} +.version, .versionNoNav { + font-size: inherit; +} +.version:before, .versionNoNav:before { + content: "v."; +} + + +/* ---------------------------------------- */ +/* Margin notes */ + +/* cancel scribble.css styles: */ +.refpara, .refelem { + position: static; + float: none; + height: auto; + width: auto; + margin: 0; +} + +.refcolumn { + position: static; + display: block; + width: auto; + font-size: inherit; + margin: 2rem; + margin-left: 2rem; + padding: 0.5em; + padding-left: 0.75em; + padding-right: 1em; + background: hsl(60, 29%, 94%); + border: 1px solid #ccb; + border-left: 0.4rem solid #ccb; +} + + +/* slightly different handling for margin-note* on narrow screens */ +@media all and (max-width:1260px) { + span.refcolumn { + float: right; + width: 50%; + margin-left: 1rem; + margin-bottom: 0.8rem; + margin-top: 1.2rem; + } + +} + +.refcontent, .refcontent p { + line-height: 1.5; + margin: 0; +} + +.refcontent p + p { + margin-top: 1em; +} + +.refcontent a { + font-weight: 400; +} + +.refpara, .refparaleft { + top: -1em; +} + + +@media all and (max-width:600px) { + .refcolumn { + margin-left: 0; + margin-right: 0; + } +} + + +@media all and (min-width:1260px) { + .refcolumn { + position: absolute; + left: 66rem; right: 3em; + margin: 0; + float: right; + max-width: 18rem; + } +} + +.refcontent { + font-family: 'Fira'; + font-size: 1rem; + line-height: 1.6; + margin: 0 0 0 0; +} + + +.refparaleft, .refelemleft { + position: relative; + float: left; + right: 2em; + height: 0em; + width: 13em; + margin: 0em 0em 0em -13em; +} + +.refcolumnleft { + background-color: hsl(60, 29%, 94%); + display: block; + position: relative; + width: 13em; + font-size: 85%; + border: 0.5em solid hsl(60, 29%, 94%); + margin: 0 0 0 0; +} + + +/* ---------------------------------------- */ +/* Table of contents, left margin */ + +.tocset { + position: absolute; + float: none; + left: 0; + top: 0rem; + width: 14rem; + padding: 7rem 0.5rem 0.5rem 0.5rem; + background-color: hsl(216, 15%, 70%); + margin: 0; + +} + +.tocset td { + vertical-align: text-top; + padding-bottom: 0.4rem; + padding-left: 0.2rem; + line-height: 1.1; + font-family: 'Fira'; + -moz-font-feature-settings: 'tnum=1'; + -moz-font-feature-settings: 'tnum' 1; + -webkit-font-feature-settings: 'tnum' 1; + -o-font-feature-settings: 'tnum' 1; + -ms-font-feature-settings: 'tnum' 1; + font-feature-settings: 'tnum' 1; + +} + +.tocset td a { + color: black; + font-weight: 400; +} + + +.tocview { + text-align: left; + background-color: inherit; +} + + +.tocview td, .tocsub td { + line-height: 1.3; +} + + +.tocview table, .tocsub table { + width: 90%; +} + +.tocset td a.tocviewselflink { + font-weight: lighter; + font-size: 110%; /* monospaced styles below don't need to enlarge */ + color: white; +} + +.tocviewselflink { + text-decoration: none; +} + +.tocsub { + text-align: left; + margin-top: 0.5em; + background-color: inherit; +} + +.tocviewlist, .tocsublist { + margin-left: 0.2em; + margin-right: 0.2em; + padding-top: 0.2em; + padding-bottom: 0.2em; +} +.tocviewlist table { + font-size: 82%; +} + +.tocviewlisttopspace { + margin-bottom: 1em; +} + +.tocviewsublist, .tocviewsublistonly, .tocviewsublisttop, .tocviewsublistbottom { + margin-left: 0.4em; + border-left: 1px solid #99a; + padding-left: 0.8em; +} +.tocviewsublist { + margin-bottom: 1em; +} +.tocviewsublist table, +.tocviewsublistonly table, +.tocviewsublisttop table, +.tocviewsublistbottom table, +table.tocsublist { + font-size: 1rem; +} + +.tocviewsublist td, .tocviewsublistbottom td, .tocviewsublisttop td, .tocsub td, +.tocviewsublistonly td { + font-size: 90%; +} + + +.tocviewtoggle { + font-size: 75%; /* looks better, and avoids bounce when toggling sub-sections due to font alignments */ +} + +.tocsublist td { + padding-left: 0.5rem; + padding-top: 0.25rem; + text-indent: 0; +} + +.tocsublinknumber { + font-size: 100%; +} + +.tocsublink { + font-size: 82%; + text-decoration: none; +} + +.tocsubseclink { + font-size: 100%; + text-decoration: none; +} + +.tocsubnonseclink { + font-size: 82%; + text-decoration: none; + margin-left: 1rem; + padding-left: 0; + display: inline-block; +} + +/* the label "on this page" */ +.tocsubtitle { + display: block; + font-size: 62%; + font-family: 'Fira'; + font-weight: bolder; + font-style: normal; + letter-spacing: 2px; + text-transform: uppercase; + margin: 0.5em; +} + +.toptoclink { + font-weight: bold; + font-size: 110%; + margin-bottom: 0.5rem; + margin-top: 1.5rem; + display: inline-block; +} + +.toclink { + font-size: inherit; +} + +/* ---------------------------------------- */ +/* Some inline styles */ + +.indexlink { + text-decoration: none; +} + +pre { + margin-left: 2em; +} + +blockquote { + margin-left: 2em; + margin-right: 2em; + margin-bottom: 1em; +} + +.SCodeFlow { + border-left: 1px dotted black; + padding-left: 1em; + padding-right: 1em; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 0em; + margin-right: 2em; + white-space: nowrap; + line-height: 1.5; +} + +.SCodeFlow img { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.boxed { + margin: 0; + margin-top: 2em; + padding: 0.25em; + padding-bottom: 0.5em; + background: #f3f3f3; + box-sizing:border-box; + border-top: 1px solid #99b; + background: hsl(216, 78%, 95%); + background: -moz-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); + background: -webkit-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); + background: -o-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); + background: -ms-linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); + background: linear-gradient(to bottom left, hsl(0, 0%, 99%) 0%, hsl(216, 78%, 95%) 100%); +} + +blockquote > blockquote.SVInsetFlow { +/* resolves issue in e.g. /reference/notation.html */ + margin-top: 0em; +} + +.leftindent .SVInsetFlow { /* see e.g. section 4.5 of Racket Guide */ + margin-top: 1em; + margin-bottom: 1em; +} + +.SVInsetFlow a, .SCodeFlow a { + color: #07A; + font-weight: 500; +} + +.SubFlow { + display: block; + margin: 0em; +} + +.boxed { + width: 100%; + background-color: inherit; +} + +.techoutside { text-decoration: none; } + +.SAuthorListBox { + position: static; + float: none; + font-family: 'Fira'; + font-weight: 300; + font-size: 110%; + margin-top: 1rem; + margin-bottom: 3rem; + width: 30rem; + height: auto; +} + +.author > a { /* email links within author block */ + font-weight: inherit; + color: inherit; +} + +.SAuthorList { + font-size: 82%; +} +.SAuthorList:before { + content: "by "; +} +.author { + display: inline; + white-space: nowrap; +} + +/* phone + tablet styles */ + +@media all and (max-width:720px){ + + + @media all and (max-width:720px){ + + @media all {html {font-size: 15px;}} + @media all and (max-width:700px){html {font-size: 14px;}} + @media all and (max-width:630px){html {font-size: 13px;}} + @media all and (max-width:610px){html {font-size: 12px;}} + @media all and (max-width:550px){html {font-size: 11px;}} + @media all and (max-width:520px){html {font-size: 10px;}} + + .navsettop, .navsetbottom { + display: block; + position: absolute; + width: 100%; + height: 4rem; + border: 0; + background-color: hsl(216, 15%, 70%); + } + + .searchform { + display: inline; + border: 0; + } + + .navright { + position: absolute; + right: 1.5rem; + margin-top: 1rem; + border: 0px solid red; + } + + .navsetbottom { + display: block; + margin-top: 8rem; + } + + .tocset { + display: none; + } + + .tocset table, .tocset tbody, .tocset tr, .tocset td { + display: inline; + } + + .tocview { + display: none; + } + + .tocsub .tocsubtitle { + display: none; + } + + .versionbox { + top: 4.5rem; + left: 1rem; /* same distance as main-column */ + z-index: 11000; + height: 2em; + font-size: 70%; + font-weight: lighter; + } + + + .maincolumn { + margin-left: 1em; + margin-top: 7rem; + margin-bottom: 0rem; + } + + } + +} + +/* print styles : hide the navigation elements */ +@media print { + .tocset, + .navsettop, + .navsetbottom { display: none; } + .maincolumn { + width: auto; + margin-right: 13em; + margin-left: 0; + } +} \ No newline at end of file diff --git a/scribblings/mb-tools.rkt b/pollen/scribblings/mb-tools.rkt similarity index 69% rename from scribblings/mb-tools.rkt rename to pollen/scribblings/mb-tools.rkt index a27bced..44a7b4f 100644 --- a/scribblings/mb-tools.rkt +++ b/pollen/scribblings/mb-tools.rkt @@ -1,5 +1,5 @@ -#lang racket/base -(require (for-syntax racket/base racket/syntax) scribble/core scribble/base scribble/manual racket/list scribble/private/manual-sprop scribble/decode scribble/html-properties racket/runtime-path racket/string) +#lang at-exp racket/base +(require (for-syntax racket/base racket/syntax) scribble/core scribble/base scribble/manual racket/list scribble/private/manual-sprop scribble/decode scribble/html-properties racket/runtime-path racket/string racket/format) (provide (all-defined-out) (all-from-out racket/runtime-path)) @@ -13,15 +13,15 @@ (define (fileblock filename . inside) (compound-paragraph (style "fileblock" (list* (alt-tag "div") 'multicommand - (box-mode "RfileboxBoxT" "RfileboxBoxC" "RfileboxBoxB") - scheme-properties)) + (box-mode "RfileboxBoxT" "RfileboxBoxC" "RfileboxBoxB") + scheme-properties)) (list (paragraph (style "fileblock_filetitle" (list* (alt-tag "div") (box-mode* "RfiletitleBox") scheme-properties)) - (list (make-element - (style "fileblock_filename" (list (css-style-addition mb-css))) - (if (string? filename) - (filepath filename) - filename)))) + (list (make-element + (style "fileblock_filename" (list (css-style-addition mb-css))) + (if (string? filename) + (filepath filename) + filename)))) (compound-paragraph (style "fileblock_filecontent" (list* (alt-tag "div") (box-mode* "RfilecontentBox") scheme-properties)) (decode-flow inside))))) @@ -47,16 +47,16 @@ (define (noskip-note) (nested #:style (style "noskip" (list (css-style-addition mb-css) (alt-tag "div"))) - (margin-note "Don’t skip this section! It explains a concept that's essential to understanding how Pollen works."))) - + (margin-note "Don’t skip this section! It explains a concept that's essential to understanding how Pollen works."))) + (define-syntax (image/rp stx) - (syntax-case stx () - [(_ name xs ...) - (with-syntax ([id (generate-temporary)]) - #'(begin - (define-runtime-path id name) - (image id xs ...)))])) + (syntax-case stx () + [(_ name xs ...) + (with-syntax ([id (generate-temporary)]) + #'(begin + (define-runtime-path id name) + (image id xs ...)))])) (require (for-syntax racket/syntax)) @@ -68,4 +68,13 @@ [local:name (format-id stx "local:~a" #'name)]) #'(deftogether ((defthing world:name predicate?) (defproc (world:current-name) predicate?)) - desc ...))])) \ No newline at end of file + desc ...))])) + +(define (val . args) + (racketvalfont (element 'tt (map ~v args)))) + +(define (id . args) + (element 'tt (map ~a args))) + +(define (ext expr) + @code[(format ".~a" expr)]) diff --git a/scribblings/mb.css b/pollen/scribblings/mb.css similarity index 100% rename from scribblings/mb.css rename to pollen/scribblings/mb.css diff --git a/scribblings/module-reference.scrbl b/pollen/scribblings/module-reference.scrbl similarity index 91% rename from scribblings/module-reference.scrbl rename to pollen/scribblings/module-reference.scrbl index 34623a6..fe15374 100644 --- a/scribblings/module-reference.scrbl +++ b/pollen/scribblings/module-reference.scrbl @@ -8,9 +8,8 @@ @include-section["decode.scrbl"] @include-section["file.scrbl"] @include-section["pagetree.scrbl"] -@include-section["pygments.scrbl"] @include-section["render.scrbl"] -@include-section["template.scrbl"] @include-section["tag.scrbl"] +@include-section["template.scrbl"] @include-section["top.scrbl"] @include-section["world.scrbl"] diff --git a/scribblings/more-help.scrbl b/pollen/scribblings/more-help.scrbl similarity index 100% rename from scribblings/more-help.scrbl rename to pollen/scribblings/more-help.scrbl diff --git a/scribblings/pagetree.scrbl b/pollen/scribblings/pagetree.scrbl similarity index 93% rename from scribblings/pagetree.scrbl rename to pollen/scribblings/pagetree.scrbl index 7c61328..838c4f2 100644 --- a/scribblings/pagetree.scrbl +++ b/pollen/scribblings/pagetree.scrbl @@ -103,7 +103,7 @@ conclusion.html @section{Making pagetrees by hand} -Experienced programmers may want to know that because a pagetree is just an X-expression, you can synthesize a pagetree using any Pollen or Racket tools for making X-expressions. For example, here's some Racket code that generates the same pagetree as the @filepath{flat.ptree} source file above: +Because a pagetree is just an X-expression, you can synthesize a pagetree using any Pollen or Racket tools for making X-expressions. For example, here's some Racket code that generates the same pagetree as the @filepath{flat.ptree} source file above: @fileblock["make-flat-ptree.rkt" @codeblock{ #lang racket @@ -273,7 +273,7 @@ Like @racket[pagetree?], but raises a descriptive error if @racket[_possible-pag (pagenode? [possible-pagenode any/c]) boolean?] -Test whether @racket[_possible-pagenode] is a valid pagenode. A pagenode can be any @racket[symbol?] that is not @racket[whitespace/nbsp?] Every leaf of a pagetree is a pagenode. In practice, your pagenodes will likely be names of output files. +Test whether @racket[_possible-pagenode] is a valid pagenode. A pagenode can be any @racket[symbol?] that is not whitespace. Every leaf of a pagetree is a pagenode. In practice, your pagenodes will likely be names of output files. @margin-note{Pagenodes are symbols (rather than strings) so that pagetrees will be valid tagged X-expressions, which is a more convenient format for validation & processing.} @@ -313,7 +313,7 @@ Convert @racket[_v] to a pagenode. @defparam[current-pagetree pagetree pagetree?]{ -A parameter that defines the default pagetree used by pagetree navigation functions (e.g., @racket[parent-pagenode], @racket[chidren], et al.) if another is not explicitly specified. Initialized to @racket[#f].} +A parameter that defines the default pagetree used by pagetree navigation functions (e.g., @racket[parent], @racket[children], et al.) if another is not explicitly specified. Initialized to @racket[#f].} @defproc[ @@ -418,11 +418,11 @@ Return the pagenode immediately after @racket[_p]. For @racket[next*], return al @defproc[ -(load-pagetree +(get-pagetree [pagetree-source pathish?]) pagetree? ] -Load a pagetree from a @filepath{ptree} source file, namely @racket[_pagetree-source]. +Get a pagetree from a @ext[world:pagetree-source-ext] source file, namely @racket[_pagetree-source]. @defproc[ @@ -432,6 +432,12 @@ list? ] Convert @racket[_pagetree] to a simple list. Uses @racket[flatten], and is thus equivalent to a pre-order depth-first traversal of @racket[_pagetree]. +@examples[#:eval my-eval +(current-pagetree '(root (mama.html son.html daughter.html) uncle.html)) +(pagetree->list (current-pagetree)) +] + + @defproc[ (in-pagetree? [pagenode pagenode?] @@ -440,10 +446,17 @@ boolean? ] Report whether @racket[_pagenode] is in @racket[_pagetree]. +@examples[#:eval my-eval +(current-pagetree '(root (mama.html son.html daughter.html) uncle.html)) +(in-pagetree? 'son.html) +(in-pagetree? 'alcoholic-grandma.html) +] + + @defproc[ (path->pagenode [p pathish?] [starting-path pathish? (world:current-project-root)]) pagenode? ] -Convert path @racket[_p] to a pagenode — meaning, make it relative to @racket[_starting-path], run it through @racket[->output-path], and convert it to a symbol. Does not tell you whether the resultant pagenode actually exists in the current pagetree (for that, use @racket[in-pagetree?]). \ No newline at end of file +Convert path @racket[_p] to a pagenode — meaning, make it relative to @racket[_starting-path], run it through @racket[->output-path], and convert it to a symbol. Does not tell you whether the resulting pagenode actually exists in the current pagetree (for that, use @racket[in-pagetree?]). diff --git a/scribblings/pollen.scrbl b/pollen/scribblings/pollen.scrbl similarity index 98% rename from scribblings/pollen.scrbl rename to pollen/scribblings/pollen.scrbl index 375c036..5afc1b5 100644 --- a/scribblings/pollen.scrbl +++ b/pollen/scribblings/pollen.scrbl @@ -40,37 +40,22 @@ Or, if you can find a better digital-publishing tool, use that. But I'm never go @include-section["installation.scrbl"] - @include-section["quick.scrbl"] - @include-section["story.scrbl"] - @include-section["big-picture.scrbl"] - @include-section["tutorial-first.scrbl"] - @include-section["tutorial-second.scrbl"] - @include-section["tutorial-third.scrbl"] - @include-section["tutorial-fourth.scrbl"] - @include-section["tutorial-mini.scrbl"] - @include-section["raco.scrbl"] - @include-section["formats.scrbl"] - @include-section["command.scrbl"] - @include-section["programming-pollen.scrbl"] - @include-section["module-reference.scrbl"] - +@include-section["unstable-module-reference.scrbl"] @include-section["more-help.scrbl"] - @include-section["acknowledgments.scrbl"] - @include-section["license.scrbl"] @index-section[] diff --git a/scribblings/poly-ps-html-txt.png b/pollen/scribblings/poly-ps-html-txt.png similarity index 100% rename from scribblings/poly-ps-html-txt.png rename to pollen/scribblings/poly-ps-html-txt.png diff --git a/scribblings/poly-ps-html.png b/pollen/scribblings/poly-ps-html.png similarity index 100% rename from scribblings/poly-ps-html.png rename to pollen/scribblings/poly-ps-html.png diff --git a/scribblings/poly-ps-pdf.png b/pollen/scribblings/poly-ps-pdf.png similarity index 100% rename from scribblings/poly-ps-pdf.png rename to pollen/scribblings/poly-ps-pdf.png diff --git a/scribblings/programming-pollen.scrbl b/pollen/scribblings/programming-pollen.scrbl similarity index 97% rename from scribblings/programming-pollen.scrbl rename to pollen/scribblings/programming-pollen.scrbl index 2de1f11..d8e0f9a 100644 --- a/scribblings/programming-pollen.scrbl +++ b/pollen/scribblings/programming-pollen.scrbl @@ -1,6 +1,5 @@ - #lang scribble/manual - -@(require scribble/eval (for-label pollen/pygments pollen/decode plot pollen/world pollen/tag racket/base pollen/template txexpr racket/list racket/string)) +#lang scribble/manual +@(require scribble/eval (for-label pollen/unstable/pygments pollen/decode plot pollen/world pollen/tag racket/base pollen/template txexpr racket/list racket/string)) @(require "mb-tools.rkt") @(define my-eval (make-base-eval)) diff --git a/scribblings/project-server.png b/pollen/scribblings/project-server.png similarity index 100% rename from scribblings/project-server.png rename to pollen/scribblings/project-server.png diff --git a/scribblings/pygments.scrbl b/pollen/scribblings/pygments.scrbl similarity index 82% rename from scribblings/pygments.scrbl rename to pollen/scribblings/pygments.scrbl index 1560154..c11a7c0 100644 --- a/scribblings/pygments.scrbl +++ b/pollen/scribblings/pygments.scrbl @@ -1,15 +1,15 @@ #lang scribble/manual -@(require scribble/eval pollen/decode pollen/world (prefix-in html: pollen/html) txexpr (for-label txexpr racket (except-in pollen #%module-begin))) +@(require scribble/eval pollen/decode pollen/world txexpr (for-label txexpr racket (except-in pollen #%module-begin))) @(define my-eval (make-base-eval)) -@(my-eval `(require pollen pollen/pygments)) +@(my-eval `(require pollen pollen/unstable/pygments)) @(require "mb-tools.rkt") @title{Pygments} -@defmodule[pollen/pygments] +@defmodule[pollen/unstable/pygments] A simple interface to syntax highlighting using Pygments. @bold{You must already have Pygments installed to use this module.} See the mini-tutorial @seclink["pygments-with-pollen"]. @@ -25,7 +25,7 @@ Sample input: @codeblock{ #lang pollen -◊(require pollen/pygments) +◊(require pollen/unstable/pygments) ◊highlight['python]{ for x in range(3): print x diff --git a/scribblings/quick.scrbl b/pollen/scribblings/quick.scrbl similarity index 99% rename from scribblings/quick.scrbl rename to pollen/scribblings/quick.scrbl index 971f941..451ce28 100644 --- a/scribblings/quick.scrbl +++ b/pollen/scribblings/quick.scrbl @@ -317,9 +317,9 @@ For that, we'll make a special file called @filepath{pollen.rkt}. This is a file (require pollen/tag) (provide (all-defined-out)) -(define headline (make-default-tag-function 'h2)) -(define items (make-default-tag-function 'ul)) -(define item (make-default-tag-function 'li 'p)) +(define headline (default-tag-function 'h2)) +(define items (default-tag-function 'ul)) +(define item (default-tag-function 'li 'p)) (define (link url text) `(a [[href ,url]] ,text)) }] diff --git a/pollen/scribblings/racket.css b/pollen/scribblings/racket.css new file mode 100644 index 0000000..b44fef5 --- /dev/null +++ b/pollen/scribblings/racket.css @@ -0,0 +1,249 @@ + +/* See the beginning of "scribble.css". */ + +/* Monospace: */ +.RktIn, .RktRdr, .RktPn, .RktMeta, +.RktMod, .RktKw, .RktVar, .RktSym, +.RktRes, .RktOut, .RktCmt, .RktVal, +.RktBlk { + font-family: monospace; + white-space: inherit; +} + +/* Serif: */ +.inheritedlbl { + font-family: serif; +} + +/* Sans-serif: */ +.RBackgroundLabelInner { + font-family: sans-serif; +} + +/* ---------------------------------------- */ +/* Inherited methods, left margin */ + +.inherited { + width: 100%; + margin-top: 0.5em; + text-align: left; + background-color: #ECF5F5; +} + +.inherited td { + font-size: 82%; + padding-left: 1em; + text-indent: -0.8em; + padding-right: 0.2em; +} + +.inheritedlbl { + font-style: italic; +} + +/* ---------------------------------------- */ +/* Racket text styles */ + +.RktIn { + color: #cc6633; + background-color: #eeeeee; +} + +.RktInBG { + background-color: #eeeeee; +} + +.RktRdr { +} + +.RktPn { + color: #843c24; +} + +.RktMeta { + color: black; +} + +.RktMod { + color: black; +} + +.RktOpt { + color: black; +} + +.RktKw { + color: black; +} + +.RktErr { + color: red; + font-style: italic; +} + +.RktVar { + color: #262680; + font-style: italic; +} + +.RktSym { + color: #262680; +} + +.RktSymDef { /* used with RktSym at def site */ +} + +.RktValLink { + text-decoration: none; + color: blue; +} + +.RktValDef { /* used with RktValLink at def site */ +} + +.RktModLink { + text-decoration: none; + color: blue; +} + +.RktStxLink { + text-decoration: none; + color: black; +} + +.RktStxDef { /* used with RktStxLink at def site */ +} + +.RktRes { + color: #0000af; +} + +.RktOut { + color: #960096; +} + +.RktCmt { + color: #c2741f; +} + +.RktVal { + color: #228b22; +} + +/* ---------------------------------------- */ +/* Some inline styles */ + +.together { + width: 100%; +} + +.prototype, .argcontract, .RBoxed { + white-space: nowrap; +} + +.prototype td { + vertical-align: text-top; +} + +.RktBlk { + white-space: inherit; + text-align: left; +} + +.RktBlk tr { + white-space: inherit; +} + +.RktBlk td { + vertical-align: baseline; + white-space: inherit; +} + +.argcontract td { + vertical-align: text-top; +} + +.highlighted { + background-color: #ddddff; +} + +.defmodule { + width: 100%; + background-color: #F5F5DC; +} + +.specgrammar { + float: right; +} + +.RBibliography td { + vertical-align: text-top; +} + +.leftindent { + margin-left: 1em; + margin-right: 0em; +} + +.insetpara { + margin-left: 1em; + margin-right: 1em; +} + +.Rfilebox { +} + +.Rfiletitle { + text-align: right; + margin: 0em 0em 0em 0em; +} + +.Rfilename { + border-top: 1px solid #6C8585; + border-right: 1px solid #6C8585; + padding-left: 0.5em; + padding-right: 0.5em; + background-color: #ECF5F5; +} + +.Rfilecontent { + margin: 0em 0em 0em 0em; +} + +.RpackageSpec { + padding-right: 0.5em; +} + +/* ---------------------------------------- */ +/* For background labels */ + +.RBackgroundLabel { + float: right; + width: 0px; + height: 0px; +} + +.RBackgroundLabelInner { + position: relative; + width: 25em; + left: -25.5em; + top: 0px; + text-align: right; + color: white; + z-index: 0; + font-weight: bold; +} + +.RForeground { + position: relative; + left: 0px; + top: 0px; + z-index: 1; +} + +/* ---------------------------------------- */ +/* History */ + +.SHistory { + font-size: 82%; +} diff --git a/scribblings/raco.scrbl b/pollen/scribblings/raco.scrbl similarity index 100% rename from scribblings/raco.scrbl rename to pollen/scribblings/raco.scrbl diff --git a/scribblings/render.scrbl b/pollen/scribblings/render.scrbl similarity index 81% rename from scribblings/render.scrbl rename to pollen/scribblings/render.scrbl index 2901532..9551014 100644 --- a/scribblings/render.scrbl +++ b/pollen/scribblings/render.scrbl @@ -38,18 +38,16 @@ Like @racket[render], but saves the file to @racket[_output-path], overwriting w (render-to-file-if-needed [source-path complete-path?] [template-path (or/c #f complete-path?) #f] -[output-path (or/c #f complete-path?) #f] -[#:force force-render? boolean? #f]) +[output-path (or/c #f complete-path?) #f]) void?] Like @racket[render-to-file], but the render only happens if one of these conditions exist: @itemlist[#:style 'ordered -@item{The @racket[_force-render?] flag — set with the @racket[#:force] keyword — is @racket[#t].} @item{No file exists at @racket[_output-path]. (Thus, an easy way to force a render of a particular @racket[_output-path] is to delete it.)} -@item{Either @racket[_source-path] or @racket[_template-path] have changed since the last trip through @racket[render].} +@item{Either @racket[_source-path], @racket[_template-path], or the associated @filepath["pollen.rkt"] has changed since the last trip through @racket[render].} -@item{One or more of the project requires have changed.}] +@item{The render cache is deactivated.}] If none of these conditions exist, @racket[_output-path] is deemed to be up to date, and the render is skipped. @@ -57,18 +55,18 @@ If none of these conditions exist, @racket[_output-path] is deemed to be up to d @defproc[ -(render-batch -[source-paths (listof pathish?)] ...) +(render* +[source-path pathish?] ...) void?] -Render multiple @racket[_source-paths] in one go. This can be faster than @racket[(for-each render _source-paths)] if your @racket[_source-paths] rely on a common set of templates. Templates may have their own source files that need to be compiled. If you use @racket[render], the templates will be repeatedly (and needlessly) re-compiled. Whereas if you use @racket[render-batch], each template will only be compiled once. +Render multiple @racket[_source-paths] in one go. This can be faster than @racket[(for-each render _source-paths)] if your @racket[_source-paths] rely on a common set of templates. Templates may have their own source files that need to be compiled. If you use @racket[render], the templates will be repeatedly (and needlessly) re-compiled. Whereas if you use @racket[render*], each template will only be compiled once. -@defproc*[ -( -[(render-pagetree [pagetree pagetree?]) void?] -[(render-pagetree [pagetree-source pathish?]) void?])] -Using @racket[_pagetree], or a pagetree loaded from @racket[_pagetree-source], render the pages in that pagetree using @racket[render-batch]. +@defproc[ +(render-pagenodes +[pt-or-pt-source (or/c pathish? pagetree?)]) +void?] +Using @racket[_pt-or-pt-source], render the pagenodes in that pagetree using @racket[render*]. -Note that @racket[_pagetree] or @racket[_pagetree_source] is used strictly as a list of files to render. It is not used, for instance, as the navigational pagetree for the rendered files. +Note that @racket[_pt-or-pt-source] is used strictly as a list of files to render, like a batch file. It is not used as the navigational pagetree for the rendered files. @defproc[ (get-template-for diff --git a/scribblings/result.png b/pollen/scribblings/result.png similarity index 100% rename from scribblings/result.png rename to pollen/scribblings/result.png diff --git a/pollen/scribblings/scribble-common.js b/pollen/scribblings/scribble-common.js new file mode 100644 index 0000000..1ec7da5 --- /dev/null +++ b/pollen/scribblings/scribble-common.js @@ -0,0 +1,170 @@ +// Common functionality for PLT documentation pages + +// Page Parameters ------------------------------------------------------------ + +var page_query_string = location.search.substring(1); + +var page_args = + ((function(){ + if (!page_query_string) return []; + var args = page_query_string.split(/[&;]/); + for (var i=0; i= 0) args[i] = [a.substring(0,p), a.substring(p+1)]; + else args[i] = [a, false]; + } + return args; + })()); + +function GetPageArg(key, def) { + for (var i=0; i= 0 && cur.substring(0,eql) == key) + return unescape(cur.substring(eql+1)); + } + return def; + } +} + +function SetCookie(key, val) { + try { + localStorage[key] = val; + } catch(e) { + var d = new Date(); + d.setTime(d.getTime()+(365*24*60*60*1000)); + try { + document.cookie = + key + "=" + escape(val) + "; expires="+ d.toGMTString() + "; path=/"; + } catch (e) {} + } +} + +// note that this always stores a directory name, ending with a "/" +function SetPLTRoot(ver, relative) { + var root = location.protocol + "//" + location.host + + NormalizePath(location.pathname.replace(/[^\/]*$/, relative)); + SetCookie("PLT_Root."+ver, root); +} + +// adding index.html works because of the above +function GotoPLTRoot(ver, relative) { + var u = GetCookie("PLT_Root."+ver, null); + if (u == null) return true; // no cookie: use plain up link + // the relative path is optional, default goes to the toplevel start page + if (!relative) relative = "index.html"; + location = u + relative; + return false; +} + +// Utilities ------------------------------------------------------------------ + +var normalize_rxs = [/\/\/+/g, /\/\.(\/|$)/, /\/[^\/]*\/\.\.(\/|$)/]; +function NormalizePath(path) { + var tmp, i; + for (i = 0; i < normalize_rxs.length; i++) + while ((tmp = path.replace(normalize_rxs[i], "/")) != path) path = tmp; + return path; +} + +// `noscript' is problematic in some browsers (always renders as a +// block), use this hack instead (does not always work!) +// document.write(""); + +// Interactions --------------------------------------------------------------- + +function DoSearchKey(event, field, ver, top_path) { + var val = field.value; + if (event && event.keyCode == 13) { + var u = GetCookie("PLT_Root."+ver, null); + if (u == null) u = top_path; // default: go to the top path + u += "search/index.html?q=" + encodeURIComponent(val); + u = MergePageArgsIntoUrl(u); + location = u; + return false; + } + return true; +} + +function TocviewToggle(glyph, id) { + var s = document.getElementById(id).style; + var expand = s.display == "none"; + s.display = expand ? "block" : "none"; + glyph.innerHTML = expand ? "▼" : "►"; +} + +// Page Init ------------------------------------------------------------------ + +// Note: could make a function that inspects and uses window.onload to chain to +// a previous one, but this file needs to be required first anyway, since it +// contains utilities for all other files. +var on_load_funcs = []; +function AddOnLoad(fun) { on_load_funcs.push(fun); } +window.onload = function() { + for (var i=0; i + .techinside doesn't work with IE, so use both (and IE doesn't + work with inherit in the second one, so use blue directly) */ +.techinside { color: black; } +.techinside:hover { color: blue; } +.techoutside:hover>.techinside { color: inherit; } + +.SCentered { + text-align: center; +} + +.imageleft { + float: left; + margin-right: 0.3em; +} + +.Smaller { + font-size: 82%; +} + +.Larger { + font-size: 122%; +} + +/* A hack, inserted to break some Scheme ids: */ +.mywbr { + display: inline-block; + height: 0; + width: 0; + font-size: 1px; +} + +.compact li p { + margin: 0em; + padding: 0em; +} + +.noborder img { + border: 0; +} + +.SAuthorListBox { + position: relative; + float: right; + left: 2em; + top: -2.5em; + height: 0em; + width: 13em; + margin: 0em -13em 0em 0em; +} +.SAuthorList { + font-size: 82%; +} +.SAuthorList:before { + content: "by "; +} +.author { + display: inline; + white-space: nowrap; +} + +/* print styles : hide the navigation elements */ +@media print { + .tocset, + .navsettop, + .navsetbottom { display: none; } + .maincolumn { + width: auto; + margin-right: 13em; + margin-left: 0; + } +} diff --git a/scribblings/story.scrbl b/pollen/scribblings/story.scrbl similarity index 100% rename from scribblings/story.scrbl rename to pollen/scribblings/story.scrbl diff --git a/pollen/scribblings/tag.html b/pollen/scribblings/tag.html new file mode 100644 index 0000000..1ffef46 --- /dev/null +++ b/pollen/scribblings/tag.html @@ -0,0 +1,2 @@ + +Tag
6.3.0.14

Tag

 (require pollen/tag) package: pollen

Convenience functions for working with tags.

procedure

(make-default-tag-function id    
  kw-attr-name    
  kw-attr-value ...    
  ...)  (-> txexpr?)
  id : txexpr-tag?
  kw-attr-name : keyword?
  kw-attr-value : string?
Make a default tag function for id. The new tag function takes an optional set of X-expression attributes (txexpr-attrs?) followed by X-expression elements (txexpr-elements?). From these, the tag function creates a tagged X-expression using id as the tag.

Examples:
> (require pollen/tag)
> (define beaucoup (make-default-tag-function 'em))
> (beaucoup "Bonjour")

'(em "Bonjour")

> (beaucoup '((id "greeting")) "Bonjour")

'(em ((id "greeting")) "Bonjour")

Entering attributes this way can be cumbersome. So for convenience, the new tag function provides an alternative: any keyword arguments and their values will be interpreted as attributes.

Examples:
> (require pollen/tag)
> (define beaucoup (make-default-tag-function 'em))
> (beaucoup #:id "greeting" #:class "large" "Bonjour")

'(em ((class "large") (id "greeting")) "Bonjour")

You can also provide keyword arguments to make-default-tag-function itself, and they will become default attributes for every use of the tag function.

Examples:
> (require pollen/tag)
> (define beaucoup-small (make-default-tag-function 'em #:class "small"))
> (beaucoup-small #:id "greeting" "Bonjour")

'(em ((class "small") (id "greeting")) "Bonjour")

Pollen also uses this function to provide the default behavior for undefined tags. See #%top.

Note that while default tag functions are typically used to generate tagged X-expressions, they don’t enforce any restrictions on input, so they also do not guarantee that you will in fact get a valid tagged X-expression as output. This is intentional — default tag functions are a coding convenience, and their output is likely to be processed by other tag functions, so raising the error here would be premature.

Examples:
> (require pollen/tag)
> (define strange (make-default-tag-function 'div #:class "bizarre"))
; Invalid data types for elements
> (strange + *)

'(div ((class "bizarre")) #<procedure:+> #<procedure:*>)

; Double "class" attribute
> (strange #:class "spooky")

'(div ((class "bizarre") (class "spooky")))

syntax

(define-tag-function
(tag-id attr-id elem-id) body ...)
Helper function for making custom tag functions. Handles parsing chores, including conversion of keyword arguments into attributes (described in make-default-tag-function), and parses other attributes and elements normally.

Examples:
> (require pollen/tag)
> (define-tag-function (tag-name attrs elems)
    `(new-name ,(cons '(zim "zam") attrs) ,@elems))
> (tag-name "Hello world")

'(new-name ((zim "zam")) "Hello world")

> (tag-name '((key "value")) "Hello world")

'(new-name ((zim "zam") (key "value")) "Hello world")

> (tag-name #:key "value" "Hello world")

'(new-name ((zim "zam") (key "value")) "Hello world")

 
\ No newline at end of file diff --git a/scribblings/tag.scrbl b/pollen/scribblings/tag.scrbl similarity index 81% rename from scribblings/tag.scrbl rename to pollen/scribblings/tag.scrbl index afe7e75..c4c3f13 100644 --- a/scribblings/tag.scrbl +++ b/pollen/scribblings/tag.scrbl @@ -13,7 +13,7 @@ Convenience functions for working with tags. @defproc[ -(make-default-tag-function +(default-tag-function [id txexpr-tag?] [kw-attr-name keyword?] [kw-attr-value string?] ... ...) @@ -22,7 +22,7 @@ Make a default tag function for @racket[_id]. The new tag function takes an opti @examples[ (require pollen/tag) -(define beaucoup (make-default-tag-function 'em)) +(define beaucoup (default-tag-function 'em)) (beaucoup "Bonjour") (beaucoup '((id "greeting")) "Bonjour") ] @@ -31,15 +31,15 @@ Entering attributes this way can be cumbersome. So for convenience, the new tag @examples[ (require pollen/tag) -(define beaucoup (make-default-tag-function 'em)) +(define beaucoup (default-tag-function 'em)) (beaucoup #:id "greeting" #:class "large" "Bonjour") ] -You can also provide keyword arguments to @racket[make-default-tag-function] itself, and they will become default attributes for every use of the tag function. +You can also provide keyword arguments to @racket[default-tag-function] itself, and they will become default attributes for every use of the tag function. @examples[ (require pollen/tag) -(define beaucoup-small (make-default-tag-function 'em #:class "small")) +(define beaucoup-small (default-tag-function 'em #:class "small")) (beaucoup-small #:id "greeting" "Bonjour") ] @@ -49,7 +49,7 @@ Note that while default tag functions are typically used to generate tagged X-ex @examples[ (require pollen/tag) -(define strange (make-default-tag-function 'div #:class "bizarre")) +(define strange (default-tag-function 'div #:class "bizarre")) (code:comment @#,t{Invalid data types for elements}) (strange + *) (code:comment @#,t{Double "class" attribute}) @@ -61,7 +61,7 @@ Note that while default tag functions are typically used to generate tagged X-ex @defform[ (define-tag-function (tag-id attr-id elem-id) body ...)] -Helper function for making custom tag functions. Handles parsing chores, including conversion of keyword arguments into attributes (described in @racket[make-default-tag-function]), and parses other attributes and elements normally. +Helper function for making custom tag functions. Handles parsing chores, including conversion of keyword arguments into attributes (described in @racket[default-tag-function]), and parses other attributes and elements normally. @examples[ (require pollen/tag) diff --git a/scribblings/template.scrbl b/pollen/scribblings/template.scrbl similarity index 88% rename from scribblings/template.scrbl rename to pollen/scribblings/template.scrbl index 2c59ee5..131de5a 100644 --- a/scribblings/template.scrbl +++ b/pollen/scribblings/template.scrbl @@ -1,9 +1,9 @@ #lang scribble/manual -@(require scribble/eval pollen/cache pollen/world (for-label racket (except-in pollen #%module-begin) pollen/render txexpr xml pollen/pagetree sugar/coerce pollen/template pollen/world)) +@(require scribble/eval pollen/cache pollen/world (for-label racket (except-in pollen #%module-begin) pollen/render txexpr xml pollen/pagetree sugar/coerce pollen/template pollen/template/html pollen/world)) @(define my-eval (make-base-eval)) -@(my-eval `(require pollen pollen/template xml)) +@(my-eval `(require pollen pollen/template pollen/template/html xml)) @title{Template} @@ -11,78 +11,7 @@ Convenience functions for templates. These are automatically imported into the @racket[eval] environment when rendering with a template (see @racket[render]). -This module also provides everything from @racketmodname[sugar/coerce]. - -@defproc[ -(->html -[xexpr-or-xexprs (or/c xexpr? (listof xexpr?))] -[#:tag html-tag (or/c #f txexpr-tag?) #f] -[#:attrs html-attrs (or/c #f txexpr-attrs?) #f] -[#:splice splice-html? boolean? #f]) -string?] -Convert @racket[_xexpr-or-xexprs] to an HTML string. Similar to @racket[xexpr->string], but consistent with the HTML spec, text that appears within @code{script} or @code{style} blocks will not be escaped. - -@examples[#:eval my-eval -(define tx '(root (script "3 > 2") "Why is 3 > 2?")) -(xexpr->string tx) -(->html tx) -] - -The optional keyword arguments @racket[_html-tag] and @racket[_html-attrs] let you set the outer tag and attributes for the generated HTML. If @racket[_xexpr-or-xexprs] already has an outer tag or attributes, they will be replaced. - -@examples[#:eval my-eval -(define tx '(root ((id "huff")) "Bunk beds")) -(->html tx) -(->html tx #:tag 'div) -(->html tx #:attrs '((id "doback"))) -(->html tx #:tag 'div #:attrs '((id "doback"))) -] - -Whereas if @racket[_xexpr-or-xexprs] has no tag or attributes, they will be added. If you supply attributes without a tag, you'll get an error. - -@examples[#:eval my-eval -(define x "Drum kit") -(->html x) -(->html x #:tag 'div) -(->html x #:tag 'div #:attrs '((id "doback"))) -(->html x #:attrs '((id "doback"))) -] - - -If the generated HTML has an outer tag, the @racket[_splice-html?] option will strip it off. Otherwise this option has no effect. - -@examples[#:eval my-eval -(define tx '(root (p "Chicken nuggets"))) -(->html tx) -(->html tx #:splice #t) -(define x "Fancy sauce") -(->html x) -(code:comment @#,t{This next one won't do anything}) -(->html x #:splice #t) -(code:comment @#,t{Adds the outer tag, but then #:splice removes it}) -(->html x #:tag 'div #:attrs '((id "doback")) #:splice #t) -] - - - -Be careful not to pass existing HTML strings into this function, because the angle brackets will be escaped. Fine if that's what you want, but you probably don't. - -@examples[#:eval my-eval -(define tx '(p "You did " (em "what?"))) -(->html tx) -(->html (->html tx)) -] - -As the input contract suggests, this function can take either a single @racket[xexpr?] or a list of @racket[xexpr?], with the expected results. - -@examples[#:eval my-eval -(define tx '(p "You did " (em "what?"))) -(->html tx) -(define txs '("You " "did " (em "what?"))) -(->html txs) -(->html #:tag 'p txs) -] - +This module also re-exports everything from @racketmodname[pollen/template/html]. @defproc[ @@ -93,7 +22,7 @@ Retrieve the @racket[doc] export from @racket[_doc-source], which can be either If @racket[_doc-source] is a relative path or pagenode, it is treated as being relative to @racket[world:current-project-root]. If that's not what you want, you'll need to convert it explicitly to a complete-path (e.g., with @racket[path->complete-path] or @racket[->complete-path]). -If @racket[world:current-main-export] is set to an identifier name other than @racket[doc], then that identifier is retrieved instead. +If @racket[world:current-main-export] has been overridden with a project-specific value, then that is retrieved instead. @defproc[ @@ -104,7 +33,7 @@ Retrieve the @racket[metas] export from @racket[_meta-source], which can be eith If @racket[_meta-source] is a relative path or pagenode, it is treated as being relative to @racket[world:current-project-root]. If that's not what you want, you'll need to convert it explicitly to a complete-path (e.g., with @racket[path->complete-path] or @racket[->complete-path]). -If @racket[world:current-meta-export] is set to an identifier name other than @racket[metas], then that identifier is retrieved instead. +If @racket[world:current-meta-export] has been overridden with a project-specific value, then that is retrieved instead. @deftogether[( @@ -144,6 +73,27 @@ Note that if @racket[_value-source] is a relative path or pagenode, it is treate ] +@defproc[ +(select-from-doc +[key symbolish?] +[doc-source (or/c txexpr? pagenodeish? pathish?)]) +(or/c #f (listof xexpr?))] +Look up the value of @racket[_key] in @racket[_doc-source]. The @racket[_doc-source] argument can be either 1) a tagged X-expression representing a @racket[doc] or 2) a pagenode or source path that identifies a source file that provides @racket[doc]. If no value exists for @racket[_key], you get @racket[#f]. + +Note that if @racket[_doc-source] is a relative path or pagenode, it is treated as being relative to @racket[world:current-project-root]. If that's not what you want, you'll need to convert it explicitly to a complete-path (e.g., with @racket[path->complete-path] or @racket[->complete-path]). + +@examples[#:eval my-eval +(module gelato pollen/markup +'(div (question "Flavor?") + (answer "Nocciola") (answer "Pistachio"))) +(code:comment @#,t{Import doc from 'gelato submodule}) +(require 'gelato) +(select-from-doc 'question doc) +('answer . select-from-doc . doc) +(select-from-doc 'nonexistent-key doc) +] + + @defproc[ (select-from-metas @@ -162,37 +112,80 @@ Note that if @racket[_meta-source] is a relative path or pagenode, it is treated ] + + +@section{HTML templates} + +@defmodule[pollen/template/html] + +Functions specific to HTML templates. + @defproc[ -(select-from-doc -[key symbolish?] -[doc-source (or/c txexpr? pagenodeish? pathish?)]) -(or/c #f (listof xexpr?))] -Look up the value of @racket[_key] in @racket[_doc-source]. The @racket[_doc-source] argument can be either 1) a tagged X-expression representing a @racket[doc] or 2) a pagenode or source path that identifies a source file that provides @racket[doc]. If no value exists for @racket[_key], you get @racket[#f]. +(->html +[xexpr-or-xexprs (or/c xexpr? (listof xexpr?))] +[#:tag html-tag (or/c #f txexpr-tag?) #f] +[#:attrs html-attrs (or/c #f txexpr-attrs?) #f] +[#:splice splice-html? boolean? #f]) +string?] +Convert @racket[_xexpr-or-xexprs] to an HTML string. Similar to @racket[xexpr->string], but consistent with the HTML spec, text that appears within @code{script} or @code{style} blocks will not be escaped. -Note that if @racket[_doc-source] is a relative path or pagenode, it is treated as being relative to @racket[world:current-project-root]. If that's not what you want, you'll need to convert it explicitly to a complete-path (e.g., with @racket[path->complete-path] or @racket[->complete-path]). +@examples[#:eval my-eval +(define tx '(root (script "3 > 2") "Why is 3 > 2?")) +(xexpr->string tx) +(->html tx) +] + +The optional keyword arguments @racket[_html-tag] and @racket[_html-attrs] let you set the outer tag and attributes for the generated HTML. If @racket[_xexpr-or-xexprs] already has an outer tag or attributes, they will be replaced. @examples[#:eval my-eval -(module gelato pollen/markup -'(div (question "Flavor?") - (answer "Nocciola") (answer "Pistachio"))) -(code:comment @#,t{Import doc from 'gelato submodule}) -(require 'gelato) -(select-from-doc 'question doc) -('answer . select-from-doc . doc) -(select-from-doc 'nonexistent-key doc) +(define tx '(root ((id "huff")) "Bunk beds")) +(->html tx) +(->html tx #:tag 'div) +(->html tx #:attrs '((id "doback"))) +(->html tx #:tag 'div #:attrs '((id "doback"))) ] +Whereas if @racket[_xexpr-or-xexprs] has no tag or attributes, they will be added. If you supply attributes without a tag, you'll get an error. +@examples[#:eval my-eval +(define x "Drum kit") +(->html x) +(->html x #:tag 'div) +(->html x #:tag 'div #:attrs '((id "doback"))) +(->html x #:attrs '((id "doback"))) +] -@defproc[ -(when/block -[condition any/c] -[text-to-insert any/c]) -string?] -Convenience function for templates that's simpler to use than plain @racket[when]. If @racket[_condition] is true, then put the @racket[_text-to-insert] into the template at the current location. Within a template file, usually invoked like so: +If the generated HTML has an outer tag, the @racket[_splice-html?] option will strip it off. Otherwise this option has no effect. + +@examples[#:eval my-eval +(define tx '(root (p "Chicken nuggets"))) +(->html tx) +(->html tx #:splice #t) +(define x "Fancy sauce") +(->html x) +(code:comment @#,t{This next one won't do anything}) +(->html x #:splice #t) +(code:comment @#,t{Adds the outer tag, but then #:splice removes it}) +(->html x #:tag 'div #:attrs '((id "doback")) #:splice #t) +] + -@verbatim{◊when/block[@racketvarfont{condition}]{The text to insert.}} -The inserted text can contain its own nested Pollen commands. +Be careful not to pass existing HTML strings into this function, because the angle brackets will be escaped. Fine if that's what you want, but you probably don't. +@examples[#:eval my-eval +(define tx '(p "You did " (em "what?"))) +(->html tx) +(->html (->html tx)) +] + +As the input contract suggests, this function can take either a single @racket[xexpr?] or a list of @racket[xexpr?], with the expected results. + +@examples[#:eval my-eval +(define tx '(p "You did " (em "what?"))) +(->html tx) +(define txs '("You " "did " (em "what?"))) +(->html txs) +(->html #:tag 'p txs) +] diff --git a/scribblings/third-tutorial-files/burial.html.pm b/pollen/scribblings/third-tutorial-files/burial.html.pm similarity index 100% rename from scribblings/third-tutorial-files/burial.html.pm rename to pollen/scribblings/third-tutorial-files/burial.html.pm diff --git a/scribblings/third-tutorial-files/chess.html.pm b/pollen/scribblings/third-tutorial-files/chess.html.pm similarity index 100% rename from scribblings/third-tutorial-files/chess.html.pm rename to pollen/scribblings/third-tutorial-files/chess.html.pm diff --git a/scribblings/third-tutorial-files/index.ptree b/pollen/scribblings/third-tutorial-files/index.ptree similarity index 100% rename from scribblings/third-tutorial-files/index.ptree rename to pollen/scribblings/third-tutorial-files/index.ptree diff --git a/pollen/scribblings/third-tutorial-files/pollen.rkt b/pollen/scribblings/third-tutorial-files/pollen.rkt new file mode 100644 index 0000000..f6aac95 --- /dev/null +++ b/pollen/scribblings/third-tutorial-files/pollen.rkt @@ -0,0 +1,7 @@ +#lang racket/base +(require pollen/decode pollen/misc/tutorial txexpr) +(define (root . elements) + (txexpr 'root null (decode-elements elements + #:txexpr-elements-proc decode-paragraphs + #:string-proc (compose smart-quotes smart-dashes)))) +(provide root) \ No newline at end of file diff --git a/scribblings/third-tutorial-files/sermon.html.pm b/pollen/scribblings/third-tutorial-files/sermon.html.pm similarity index 100% rename from scribblings/third-tutorial-files/sermon.html.pm rename to pollen/scribblings/third-tutorial-files/sermon.html.pm diff --git a/scribblings/third-tutorial-files/styles.css.pp b/pollen/scribblings/third-tutorial-files/styles.css.pp similarity index 100% rename from scribblings/third-tutorial-files/styles.css.pp rename to pollen/scribblings/third-tutorial-files/styles.css.pp diff --git a/scribblings/third-tutorial-files/template.html b/pollen/scribblings/third-tutorial-files/template.html similarity index 100% rename from scribblings/third-tutorial-files/template.html rename to pollen/scribblings/third-tutorial-files/template.html diff --git a/scribblings/top.scrbl b/pollen/scribblings/top.scrbl similarity index 98% rename from scribblings/top.scrbl rename to pollen/scribblings/top.scrbl index 882d385..f3e3675 100644 --- a/scribblings/top.scrbl +++ b/pollen/scribblings/top.scrbl @@ -25,7 +25,7 @@ In standard Racket, @racket[#%top] is the function of last resort, called when @ In the Pollen markup environment, however, this behavior is annoying. Because when you're writing X-expressions, you don't necessarily want to define all your tags ahead of time. -So Pollen redefines @racket[#%top]. For convenience, Pollen's version of @racket[#%top] assumes that an undefined tag should just refer to an X-expression beginning with that tag (and uses @racket[make-default-tag-function] to provide this behavior): +So Pollen redefines @racket[#%top]. For convenience, Pollen's version of @racket[#%top] assumes that an undefined tag should just refer to an X-expression beginning with that tag (and uses @racket[default-tag-function] to provide this behavior): @examples[ (code:comment @#,t{Again, let's call em without defining it, but using pollen/top}) diff --git a/scribblings/tutorial-first.scrbl b/pollen/scribblings/tutorial-first.scrbl similarity index 100% rename from scribblings/tutorial-first.scrbl rename to pollen/scribblings/tutorial-first.scrbl diff --git a/scribblings/tutorial-fourth.scrbl b/pollen/scribblings/tutorial-fourth.scrbl similarity index 97% rename from scribblings/tutorial-fourth.scrbl rename to pollen/scribblings/tutorial-fourth.scrbl index bca05be..a47bdc7 100644 --- a/scribblings/tutorial-fourth.scrbl +++ b/pollen/scribblings/tutorial-fourth.scrbl @@ -16,7 +16,7 @@ In previous tutorial projects, we've maintained a one-to-one relationship betwee @item{Setting up & using @tt{poly} source files} -@item{The @tt{config} submodule} +@item{The @tt{world} submodule} @item{Branching tag functions} @@ -142,11 +142,11 @@ Today is @(date->string (current-date)). I @bold{really} want this job. Though Pollen imputes HTML as a target for poly sources by default, if you only wanted HTML, you wouldn't be using a poly source. So our next step will be to explicitly define the output targets that we want to associate with poly sources. -@subsubsection{Using the @tt{config} submodule} +@subsubsection{Using the @tt{world} submodule} -We'll do this by setting the @racket[world:current-poly-targets] value in our @filepath{pollen.rkt}. If you haven't investigated it yet, the @racket[pollen/world] module offers @seclink["settable-values"] that allow you to configure certain Pollen characteristics from within a @filepath{pollen.rkt} file. The example on that page, for instance, shows how to change the markup source extension and the Pollen command character. +We'll do this by setting the @racket[world:current-poly-targets] value in our @filepath{pollen.rkt}. If you haven't investigated it yet, the @racket[pollen/world] module offers @seclink["world-overrides"] that allow you to configure certain Pollen characteristics from within a @filepath{pollen.rkt} file. The example on that page, for instance, shows how to change the markup source extension and the Pollen command character. -The idea is that you add a @racket[config] submodule to your @filepath{pollen.rkt} file with a @racket[define] statement for the value. Because we're defining the local value, we drop the @racket[world:current-] prefix and just call it @racket[poly-targets]. Our value will be a list of file extensions denoting the targets. To start, let's set our output formats to HTML and plain text, which we'll denote with the list of extensions @racket['(html txt)]. +The idea is that you add a @racket[world] submodule to your @filepath{pollen.rkt} file with a @racket[define] statement for the value. Because we're defining the local value, we drop the @racket[world:current-] prefix and just call it @racket[poly-targets]. Our value will be a list of file extensions denoting the targets. To start, let's set our output formats to HTML and plain text, which we'll denote with the list of extensions @racket['(html txt)]. @margin-note{I'm glossing over the details of @seclink["submodules" #:doc '(lib "scribblings/guide/guide.scrbl")], but they're one of the best-considered features of the Racket language. What makes submodules so handy is that they are truly independent: you can load a submodule from a source file without running the main body of the file. Thus, tasks like this — setting configuration values — that might require separate files in other languages can be handled as submodules in Racket.} diff --git a/scribblings/tutorial-mini.scrbl b/pollen/scribblings/tutorial-mini.scrbl similarity index 91% rename from scribblings/tutorial-mini.scrbl rename to pollen/scribblings/tutorial-mini.scrbl index 21f3cfa..7a09296 100644 --- a/scribblings/tutorial-mini.scrbl +++ b/pollen/scribblings/tutorial-mini.scrbl @@ -1,6 +1,6 @@ #lang scribble/manual -@(require scribble/eval (for-label pollen/pygments pollen/decode plot pollen/world pollen/tag racket/base pollen/template txexpr racket/list racket/string)) +@(require scribble/eval (for-label pollen/unstable/pygments pollen/decode plot pollen/world pollen/tag racket/base pollen/template txexpr racket/list racket/string)) @(require "mb-tools.rkt") @(define my-eval (make-base-eval)) @@ -27,13 +27,13 @@ I used @link["http://pygments.org/"]{Pygments} for syntax highlighting in @link[ @item{Make sure you have @code{pygments} already installed. @link["http://pygments.org/download/"]{Instructions here.} Pretty easy — for instance, on my OS X machine, I was able to get it done by doing @code{easy_install pygments} at the command line.} -@item{The @racketmodname[pollen/pygments] helper module provides a function called @racket[highlight]. To make @racket[highlight] available in your source file, you can either add the line @code{◊(require pollen/pygments)} to the source file itself, or put it in @racket["pollen.rkt"] and @racket[provide] it from there.} +@item{The @racketmodname[pollen/unstable/pygments] helper module provides a function called @racket[highlight]. To make @racket[highlight] available in your source file, you can either add the line @code{◊(require pollen/unstable/pygments)} to the source file itself, or put it in @racket["pollen.rkt"] and @racket[provide] it from there.} @item{To invoke Pygments, use @racket[highlight] by providing a language name like @racket['python] in the brackets (note quote mark at front of name) and then the code you want highlighted between curly braces. @codeblock{ #lang pollen -◊(require pollen/pygments) +◊(require pollen/unstable/pygments) ◊highlight['python]{ for x in range(3): print x @@ -81,7 +81,7 @@ for x in range(3): print x }}}} -@item{Or if you wanted to match the notation for @racketmodname[pollen/pygments], you could write a @tt{highlight} function that expands to markup that works for Highlight.js: +@item{Or if you wanted to match the notation for @racketmodname[pollen/unstable/pygments], you could write a @tt{highlight} function that expands to markup that works for Highlight.js: @codeblock{ #lang pollen/markup diff --git a/scribblings/tutorial-second.scrbl b/pollen/scribblings/tutorial-second.scrbl similarity index 99% rename from scribblings/tutorial-second.scrbl rename to pollen/scribblings/tutorial-second.scrbl index 99ee07f..fc8d30e 100644 --- a/scribblings/tutorial-second.scrbl +++ b/pollen/scribblings/tutorial-second.scrbl @@ -165,7 +165,7 @@ Skipping past a few boring details, that's basically all there is to it. So why is it called an X-expression? Lisp languages are built out of units called S-expressions, which look like this: -@terminal{(and (txexpr? x) (member (get-tag x) (project-block-tags)) #t))} +@terminal{(and (txexpr? x) (memq (get-tag x) (world:current-block-tags)) #t))} S-expressions use prefix notation, where each pair of parentheses contains a list. The first element in the list names a function, and the other elements are the arguments to that function. (This is a review of @secref["Racket_basics__if_you_re_not_familiar_"].) X-expressions are just a minor adaptation of S-expression notation to represent markup, hence the name (the @defterm{X} is short for @defterm{XML-like}). diff --git a/scribblings/tutorial-third.scrbl b/pollen/scribblings/tutorial-third.scrbl similarity index 98% rename from scribblings/tutorial-third.scrbl rename to pollen/scribblings/tutorial-third.scrbl index a9995de..d6f85d2 100644 --- a/scribblings/tutorial-third.scrbl +++ b/pollen/scribblings/tutorial-third.scrbl @@ -645,7 +645,7 @@ Add a basic @racket[decode-elements] to the source file like so: @fileblock["article.html.pm" @codeblock|{ #lang pollen -◊(require pollen/decode txexpr) +◊(require pollen/decode pollen/tutorial txexpr) ◊(define (root . elements) (make-txexpr 'root null (decode-elements elements))) @@ -661,15 +661,15 @@ The @racket[make-txexpr] function is a utility from the @racket[txexpr] package, If you run this file, what changes? Right — nothing. That's because by default, both @racket[decode-elements] (and @racket[decode]) will let the content pass through unaltered. -We change this by giving @racket[decode-elements] the name of a processing function and attaching it to the type of content we want to process. In this case, we're in luck — the @racket[decode] module already contains a @racket[detect-paragraphs] function (that also detects linebreaks). We add this function using the keyword argument @racket[#:txexpr-elements-proc], which is short for ``the function used to process the elements of a tagged X-expression'': +We change this by giving @racket[decode-elements] the name of a processing function and attaching it to the type of content we want to process. In this case, we're in luck — the @racket[decode] module already contains a @racket[decode-paragraphs] function (that also detects linebreaks). We add this function using the keyword argument @racket[#:txexpr-elements-proc], which is short for ``the function used to process the elements of a tagged X-expression'': @fileblock["article.html.pm" @codeblock|{ #lang pollen -◊(require pollen/decode txexpr) +◊(require pollen/decode pollen/tutorial txexpr) ◊(define (root . elements) (make-txexpr 'root null (decode-elements elements - #:txexpr-elements-proc detect-paragraphs))) + #:txexpr-elements-proc decode-paragraphs))) The first line of the 'first' paragraph. And a new line. @@ -699,10 +699,10 @@ Of course, in practice you wouldn't put your decoding function in a single sourc @fileblock["pollen.rkt" @codeblock{ #lang racket -(require pollen/decode txexpr) +(require pollen/decode pollen/tutorial txexpr) (define (root . elements) (make-txexpr 'root null (decode-elements elements - #:txexpr-elements-proc detect-paragraphs))) + #:txexpr-elements-proc decode-paragraphs))) (provide root) }] @@ -728,16 +728,16 @@ The second paragraph --- isn't it great. But wait, those straight quotes look terrible. Also, three hyphens for an em dash? Barbaric. -Let's upgrade our decoder to take of those. Once again, we'll get lucky, because the @racket[decode] module provides two functions for the job: @racket[smart-quotes] and @racket[smart-dashes]. +Let's upgrade our decoder to take of those. In the @racket[pollen/tutorial] module I've stashed the two functions we'll need for the job: @racket[smart-quotes] and @racket[smart-dashes]. This time, however, we're going to attach them to another part of @racket[decode-elements]. Smart-quote and smart-dash conversion only needs to look at the strings within the X-expression. So instead of attaching these functions to the @racket[#:txexpr-elements-proc] argument of @racket[decode-elements], we'll attach them to @racket[#:string-proc], which lets us specify a function to apply to strings: @fileblock["pollen.rkt" @codeblock{ #lang racket/base -(require pollen/decode txexpr) +(require pollen/decode pollen/tutorial txexpr) (define (root . elements) (make-txexpr 'root null (decode-elements elements - #:txexpr-elements-proc detect-paragraphs + #:txexpr-elements-proc decode-paragraphs #:string-proc (compose smart-quotes smart-dashes)))) (provide root) }] @@ -776,10 +776,10 @@ Here, we'll use the @filepath{pollen.rkt} we devised in the previous section to @fileblock["pollen.rkt" @codeblock{ #lang racket/base -(require pollen/decode txexpr) +(require pollen/decode pollen/tutorial txexpr) (define (root . elements) (make-txexpr 'root null (decode-elements elements - #:txexpr-elements-proc detect-paragraphs + #:txexpr-elements-proc decode-paragraphs #:string-proc (compose smart-quotes smart-dashes)))) (provide root) }] diff --git a/pollen/scribblings/unstable-module-reference.scrbl b/pollen/scribblings/unstable-module-reference.scrbl new file mode 100644 index 0000000..63b48b5 --- /dev/null +++ b/pollen/scribblings/unstable-module-reference.scrbl @@ -0,0 +1,9 @@ +#lang scribble/manual + +@title[#:style 'toc]{Unstable module reference} + +An ``unstable'' module is safe to use. But it's not part of the settled public interface for Pollen. Unstable modules may eventually be upgraded to the public interface, or may remain here. + +@local-table-of-contents[] + +@include-section["pygments.scrbl"] diff --git a/scribblings/utils.rkt b/pollen/scribblings/utils.rkt similarity index 100% rename from scribblings/utils.rkt rename to pollen/scribblings/utils.rkt diff --git a/scribblings/world.scrbl b/pollen/scribblings/world.scrbl similarity index 80% rename from scribblings/world.scrbl rename to pollen/scribblings/world.scrbl index 9492b5b..471cd8e 100644 --- a/scribblings/world.scrbl +++ b/pollen/scribblings/world.scrbl @@ -1,6 +1,6 @@ #lang scribble/manual @(require "mb-tools.rkt") -@(require scribble/eval pollen/cache pollen/world (for-label racket (except-in pollen #%module-begin) pollen/world pollen/render)) +@(require scribble/eval pollen/world racket/string (for-label racket (except-in pollen #%module-begin) pollen/world)) @(define my-eval (make-base-eval)) @(my-eval `(require pollen pollen/world)) @@ -29,9 +29,22 @@ A parameter that reports the path to the directory of support files for the proj A parameter that reports the current rendering target for @racket[poly] source files. Initialized to @racket['html].} -@section[#:tag "settable-values"]{Settable values} +@section[#:tag "world-overrides"]{World overrides} -These values can be changed by overriding them in your @racket["pollen.rkt"] source file. Within this file, @seclink["submodules" #:doc '(lib "scribblings/guide/guide.scrbl")]{create a submodule} called @racket[config]. Then within this submodule, use @racket[define] to make a variable with the same name as the one in @racket[pollen/world], but without the @racket[world:] prefix. Assign it whatever value you like. Repeat as needed. When Pollen runs, these definitions will supersede those in @racket[pollen/world]. +These values can be changed by overriding them in your @racket["pollen.rkt"] source file: + +@itemlist[#:style 'ordered + +@item{Within this file, @seclink["submodules" #:doc '(lib "scribblings/guide/guide.scrbl")]{create a submodule} called @racket[world].} + +@item{Within this submodule, use @racket[define] to make a variable with the same name as the one in @racket[pollen/world], but without the @racket[world:] prefix.} + +@item{Assign it whatever value you like.} + +@item{Repeat as needed.} + ] + + When Pollen runs, these definitions will supersede those in @racket[pollen/world]. For instance, suppose you wanted the main export of every Pollen source file to be called @racket[van-halen] rather than @racket[doc], the extension of Pollen markup files to be @racket[.rock] rather than @racket[.pm], and the command character to be @litchar{🎸} instead of @litchar{◊}. Your @racket["pollen.rkt"] would look like this: @@ -41,7 +54,7 @@ For instance, suppose you wanted the main export of every Pollen source file to ;; ... the usual definitions and tag functions ... -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define main-export 'van-halen) (define markup-source-ext 'rock) @@ -50,9 +63,9 @@ For instance, suppose you wanted the main export of every Pollen source file to Though any of the values below can be overridden, it may not always be wise to do so. For instance, if you redefined @racket[world:fallback-template-prefix], you would simply break the fallback-template mechanism, because it would look for files that don't exist. But we don't live in a nanny state, so you are entrusted to say what you mean and accept the consequences. -Of course, you can restore the defaults simply by deleting these defined values from @racket["pollen.rkt"]. +Of course, you can restore the defaults simply by removing these defined values from @racket["pollen.rkt"]. -These settable values are each equipped with a corresponding @racket[world:current-]@racket[_settable-value] function that will return the value loaded from the @racket[config] submodule (if @racket[_settable-value] was defined there), otherwise the default given by @racket[world:]@racket[_settable-value]. For instance, @racket[world:command-char] will always be @litchar{◊}, but in the example above, @racket[world:current-command-char] would return @litchar{🎸}. +These values are each equipped with a corresponding @racket[world:current-]@racket[_name] function that will return the value loaded from the @racket[world] submodule (if @racket[_name] was defined there), otherwise it returns the original value for @racket[world:]@racket[_name]. For instance, @racket[world:command-char] will always be @litchar{◊}, but in the example above, @racket[world:current-command-char] would return @litchar{🎸}. @defoverridable[default-port integer?]{ @@ -101,6 +114,16 @@ File extensions for Pollen source files, initialized to the following values: @defoverridable[pagetree-root-node symbol?]{Name of the root node in a decoded pagetree. It's ignored by the code, so its only role is to clue you in that you're looking at something that came out of the pagetree decoder. Initialized to @code{'pagetree-root}.} +@defoverridable[main-root-node symbol?]{Name of the root node in a decoded @racket[doc]. Initialized to @code{'root}.} + +@defoverridable[block-tags (listof symbol?)]{Tags that are treated as blocks by @racket[block-txexpr?]. Initialized to the @link["https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements"]{block-level elements in HTML5}, namely: + +@racketidfont{@(string-join (map symbol->string (cdr world:block-tags)) " ")} + +... plus @racket[world:current-main-root-node].} + + + @defoverridable[command-char char?]{The magic character that indicates a Pollen command, function, or variable. Initialized to @racket[#\◊].} @defoverridable[default-template-prefix string?]{Prefix of the default template. Initialized to @code{"template"}.} diff --git a/tag.rkt b/pollen/tag.rkt similarity index 86% rename from tag.rkt rename to pollen/tag.rkt index 5588d38..16bb46e 100644 --- a/tag.rkt +++ b/pollen/tag.rkt @@ -1,11 +1,11 @@ #lang pollen/mode racket/base (require (for-syntax racket/base)) -(require txexpr sugar/define racket/string racket/match) - +(require txexpr racket/string racket/match) +(provide default-tag-function make-default-tag-function define-tag-function) (define first car) (define second cadr) -(define+provide make-default-tag-function +(define default-tag-function (make-keyword-procedure (λ (outer-kws outer-kw-args . ids) (define (make-one-tag id) @@ -48,22 +48,11 @@ [tag-proc-name (string->symbol (format "pollen-tag:~a" (string-join (map symbol->string ids) "+")))]) (procedure-rename tag-proc tag-proc-name))))) - -;; deprecated since `define-tag-function`. -;; Does not and cannot handle keywords correctly (for attributes) -;; because it wants a function arity like (proc . parts), -;; which converts keywords into positional arguments. -(define/contract+provide (split-attributes parts) - (list? . -> . (values txexpr-attrs? txexpr-elements?)) - (define dummy-tag (gensym)) - (define dummy-txexpr (apply (make-default-tag-function dummy-tag) parts)) - (define-values (tag attrs elements) (txexpr->values dummy-txexpr)) - (values attrs elements)) - +(define make-default-tag-function default-tag-function) ; bw compat (module+ test (require rackunit) - (define outerdiv (make-default-tag-function 'div #:class "outer" #:style "outer")) + (define outerdiv (default-tag-function 'div #:class "outer" #:style "outer")) (check-txexprs-equal? (outerdiv "foo") '(div ((class "outer") (style "outer")) "foo")) (check-txexprs-equal? (outerdiv) '(div ((class "outer") (style "outer")))) (check-txexprs-equal? (outerdiv #:class "inner") '(div ((class "outer") (style "outer") (class "inner")))) @@ -76,7 +65,6 @@ (check-txexprs-equal? (outerdiv 'id: "shazbot" #:class "inner" "foo") '(div ((class "outer") (style "outer") (class "inner") (id "shazbot")) "foo"))) -(provide define-tag-function) (define-syntax (define-tag-function stx) (syntax-case stx (λ) [(_ (ID ARG ...) EXPR ...) @@ -85,7 +73,7 @@ #'(define ID (make-keyword-procedure (λ (kws kwargs . args) - (define tx-proc (keyword-apply make-default-tag-function kws kwargs (list 'ID))) + (define tx-proc (keyword-apply default-tag-function kws kwargs (list 'ID))) (define tx (apply tx-proc args)) (define-values (_ ATTRS ELEMS) (txexpr->values tx)) EXPR0 EXPR ...)))] @@ -96,7 +84,7 @@ (module+ test (require rackunit) - (define foo2 (make-default-tag-function 'foo)) + (define foo2 (default-tag-function 'foo)) (define-tag-function (foo attrs elems) `(foo ,(reverse attrs) ,@elems)) diff --git a/pollen/template.rkt b/pollen/template.rkt new file mode 100644 index 0000000..6c1a469 --- /dev/null +++ b/pollen/template.rkt @@ -0,0 +1,13 @@ +#lang racket/base +(require sugar/test + "template/base.rkt" + "template/html.rkt") +(provide (all-from-out "template/base.rkt" + "template/html.rkt")) + +(module-test-external + (check-equal? (select* 'key '#hash((key . "value"))) '("value")) + (check-equal? (select 'key '#hash((key . "value"))) "value") + + (define tx '(root (p "hello"))) + (check-equal? (->html tx) "

hello

")) \ No newline at end of file diff --git a/pollen/template/base.rkt b/pollen/template/base.rkt new file mode 100644 index 0000000..076cce7 --- /dev/null +++ b/pollen/template/base.rkt @@ -0,0 +1,95 @@ +#lang racket/base +(require racket/string xml xml/path sugar/define sugar/container sugar/coerce sugar/test racket/list) +(require "../file.rkt" txexpr "../world.rkt" "../cache.rkt" "../pagetree.rkt" "../private/debug.rkt") + +(define is-meta-value? hash?) +(define is-doc-value? txexpr?) +(define not-false? (λ(x) x)) + + +(define+provide/contract (select* key value-source) + (coerce/symbol? (or/c is-meta-value? is-doc-value? pagenode? pathish?) . -> . (or/c #f txexpr-elements?)) + (define metas-result (and (not (is-doc-value? value-source)) (select-from-metas key value-source))) + (define doc-result (and (not (is-meta-value? value-source)) (select-from-doc key value-source))) + (define result (filter not-false? (apply append (map ->list (list metas-result doc-result))))) + (and (pair? result) result)) + + +(define+provide/contract (select key value-source) + (coerce/symbol? (or/c is-meta-value? is-doc-value? pagenode? pathish?) . -> . (or/c #f txexpr-element?)) + (define result (select* key value-source)) + (and (pair? result) (car result))) + + +(module-test-external + (check-equal? (select* 'key '#hash((key . "value"))) '("value")) + (check-equal? (select 'key '#hash((key . "value"))) "value") + (check-false (select* 'absent-key '#hash((key . "value")))) + (check-false (select 'absent-key '#hash((key . "value")))) + (check-equal? (select* 'key '(root (key "value"))) '("value")) + (check-equal? (select 'key '(root (key "value"))) "value") + (check-false (select* 'absent-key '(root (key "value")))) + (check-false (select 'absent-key '(root (key "value")))) + (let ([metas '#hash((key . "value"))]) + (check-equal? (select* 'key metas) '("value")) + (check-equal? (select 'key metas) "value") + (check-false (select* 'absent-key metas)) + (check-false (select 'absent-key metas))) + (let ([doc '(root (key "value"))]) + (check-equal? (select* 'key doc) '("value")) + (check-equal? (select 'key doc) "value") + (check-false (select* 'absent-key doc)) + (check-false (select 'absent-key doc)))) + + +(define+provide/contract (select-from-metas key metas-source) + ;; output contract is a single txexpr-element + ;; because metas is a hash, and a hash has only one value for a key. + (coerce/symbol? (or/c is-meta-value? pagenode? pathish?) . -> . (or/c #f txexpr-element?)) + (define metas (if (is-meta-value? metas-source) + metas-source + (get-metas metas-source))) + (and (hash-has-key? metas key) (hash-ref metas key))) + +(module-test-external + (let ([metas '#hash((key . "value"))]) + (check-equal? (select-from-metas 'key metas) "value") + (check-false (select-from-metas 'absent-key metas)))) + + +(define+provide/contract (select-from-doc key doc-source) + ;; output contract is a list of elements + ;; because doc is a txexpr, and a txexpr can have multiple values for a key + (coerce/symbol? (or/c is-doc-value? pagenode? pathish?) . -> . (or/c #f txexpr-elements?)) + (define doc (if (is-doc-value? doc-source) + doc-source + (get-doc doc-source))) + (define result (se-path*/list (list key) doc)) + (and (pair? result) result)) + +(module-test-external + (check-equal? (select-from-doc 'key '(root (key "value"))) '("value")) + (check-false (select-from-doc 'absent-key '(root (key "value")))) + (let ([doc '(root (key "value"))]) + (check-equal? (select-from-doc 'key doc) '("value")) + (check-false (select-from-doc 'absent-key doc)))) + + +(define (convert+validate-path pagenode-or-path caller) + (let ([path (get-source (if (pagenode? pagenode-or-path) + (build-path (world:current-project-root) (symbol->string pagenode-or-path)) + pagenode-or-path))]) + (unless path + (error (format "~a no source found for '~a' in directory ~a" caller path (current-directory)))) + path)) + + +(define+provide/contract (get-metas pagenode-or-path) + ((or/c pagenode? pathish?) . -> . is-meta-value?) + (cached-metas (convert+validate-path pagenode-or-path 'get-metas))) + + +(define+provide/contract (get-doc pagenode-or-path) + ((or/c pagenode? pathish?) . -> . (or/c is-doc-value? string?)) + (cached-doc (convert+validate-path pagenode-or-path 'get-doc))) + diff --git a/pollen/template/html.rkt b/pollen/template/html.rkt new file mode 100644 index 0000000..fe41bbc --- /dev/null +++ b/pollen/template/html.rkt @@ -0,0 +1,51 @@ +#lang racket/base +(require sugar/define sugar/test txexpr) + +(define (trim-outer-tag html) + (define matches (regexp-match #px"^<.*?>(.*)$" html)) + (define paren-match (cadr matches)) + paren-match) + + +(define+provide/contract (->html x-arg #:tag [tag #f] #:attrs [attrs #f] #:splice [splice? #f]) + (((or/c txexpr-element? txexpr-elements?)) (#:tag (or/c #f txexpr-tag?) #:attrs (or/c #f txexpr-attrs?) #:splice boolean?) . ->* . string?) + + (define x (cond + [(txexpr? x-arg) x-arg] + [(list? x-arg) (cons 'html x-arg)] + [else x-arg])) + + (when (and (not (txexpr? x)) attrs (not tag)) + (raise-argument-error '->html "can't use attribute list without a #:tag argument" tag)) + + (cond + [(or tag (txexpr? x)) + (define html-tag (or tag (get-tag x))) + (define html-attrs (or attrs (and (txexpr? x) (get-attrs x)) null)) + (define html-elements (or (and (txexpr? x) (get-elements x)) (list x))) + (define html (xexpr->html (txexpr html-tag html-attrs html-elements))) + (if (or splice? (and (list? x-arg) (not (txexpr? x-arg)) (not tag))) + (trim-outer-tag html) + html)] + [else (xexpr->html x)])) + +(module-test-external + (define tx '(root (p "hello"))) + (check-equal? (->html tx) "

hello

") + (check-equal? (->html #:tag 'brennan tx) "

hello

") + (check-equal? (->html #:attrs '((id "dale")) tx) "

hello

") + (check-equal? (->html #:splice #t tx) "

hello

") + (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) tx) "

hello

") + (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) #:splice #t tx) "

hello

") + (define x "hello") + (check-equal? (->html x) "hello") + (check-equal? (->html #:tag 'brennan x) "hello") + (check-exn exn:fail? (λ() (->html #:attrs '((id "dale")) x) "hello")) ;; won't work without tag + (check-equal? (->html #:splice #t x) "hello") + (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) x) "hello") + (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) #:splice #t x) "hello") + + (define xs '("hello " (em "you") " " 42)) + (check-equal? (->html xs) "hello you *") + (check-equal? (->html #:splice #t xs) "hello you *") + (check-equal? (->html #:tag 'div xs) "
hello you *
")) diff --git a/test/data/escape-ext/pollen.rkt b/pollen/test/data/escape-ext/pollen.rkt similarity index 63% rename from test/data/escape-ext/pollen.rkt rename to pollen/test/data/escape-ext/pollen.rkt index 9459bdf..25649c9 100644 --- a/test/data/escape-ext/pollen.rkt +++ b/pollen/test/data/escape-ext/pollen.rkt @@ -1,7 +1,7 @@ #lang racket/base (provide (all-defined-out)) -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define compile-cache-active #f) (define extension-escape-char #\$)) \ No newline at end of file diff --git a/test/data/escape-ext/test$html.pp b/pollen/test/data/escape-ext/test$html.pp similarity index 100% rename from test/data/escape-ext/test$html.pp rename to pollen/test/data/escape-ext/test$html.pp diff --git a/test/data/override/pollen.rkt b/pollen/test/data/override/pollen.rkt similarity index 81% rename from test/data/override/pollen.rkt rename to pollen/test/data/override/pollen.rkt index 924b917..a0b0fcb 100644 --- a/test/data/override/pollen.rkt +++ b/pollen/test/data/override/pollen.rkt @@ -4,9 +4,8 @@ (define (root . xs) `(rootover ,@xs)) -(module config racket/base +(module world racket/base (provide (all-defined-out)) - (define pollen-version "42") (define preproc-source-ext 'ppover) (define markup-source-ext 'pmover) diff --git a/test/data/override/test-cmd.html.ppover b/pollen/test/data/override/test-cmd.html.ppover similarity index 100% rename from test/data/override/test-cmd.html.ppover rename to pollen/test/data/override/test-cmd.html.ppover diff --git a/test/data/override/test-exports.html.ppover b/pollen/test/data/override/test-exports.html.ppover similarity index 100% rename from test/data/override/test-exports.html.ppover rename to pollen/test/data/override/test-exports.html.ppover diff --git a/test/data/override/test-require.html.pmover b/pollen/test/data/override/test-require.html.pmover similarity index 100% rename from test/data/override/test-require.html.pmover rename to pollen/test/data/override/test-require.html.pmover diff --git a/test/data/override/test.html.pm b/pollen/test/data/override/test.html.pm similarity index 100% rename from test/data/override/test.html.pm rename to pollen/test/data/override/test.html.pm diff --git a/test/data/override/test.html.pmd b/pollen/test/data/override/test.html.pmd similarity index 100% rename from test/data/override/test.html.pmd rename to pollen/test/data/override/test.html.pmd diff --git a/test/data/override/test.html.pmdover b/pollen/test/data/override/test.html.pmdover similarity index 100% rename from test/data/override/test.html.pmdover rename to pollen/test/data/override/test.html.pmdover diff --git a/test/data/override/test.html.pmover b/pollen/test/data/override/test.html.pmover similarity index 100% rename from test/data/override/test.html.pmover rename to pollen/test/data/override/test.html.pmover diff --git a/test/data/override/test.html.pp b/pollen/test/data/override/test.html.pp similarity index 100% rename from test/data/override/test.html.pp rename to pollen/test/data/override/test.html.pp diff --git a/test/data/override/test.html.ppover b/pollen/test/data/override/test.html.ppover similarity index 100% rename from test/data/override/test.html.ppover rename to pollen/test/data/override/test.html.ppover diff --git a/test/data/override/test.no-ext b/pollen/test/data/override/test.no-ext similarity index 100% rename from test/data/override/test.no-ext rename to pollen/test/data/override/test.no-ext diff --git a/test/data/override/test.ptree b/pollen/test/data/override/test.ptree similarity index 100% rename from test/data/override/test.ptree rename to pollen/test/data/override/test.ptree diff --git a/test/data/override/test.ptreeover b/pollen/test/data/override/test.ptreeover similarity index 100% rename from test/data/override/test.ptreeover rename to pollen/test/data/override/test.ptreeover diff --git a/test/data/pathup/pollen.rkt b/pollen/test/data/pathup/pollen.rkt similarity index 100% rename from test/data/pathup/pollen.rkt rename to pollen/test/data/pathup/pollen.rkt diff --git a/test/data/pathup/subdir/subdir/pollen.rkt b/pollen/test/data/pathup/subdir/subdir/pollen.rkt similarity index 100% rename from test/data/pathup/subdir/subdir/pollen.rkt rename to pollen/test/data/pathup/subdir/subdir/pollen.rkt diff --git a/test/data/pathup/subdir/subdir/test-pathup-two.html.pm b/pollen/test/data/pathup/subdir/subdir/test-pathup-two.html.pm similarity index 100% rename from test/data/pathup/subdir/subdir/test-pathup-two.html.pm rename to pollen/test/data/pathup/subdir/subdir/test-pathup-two.html.pm diff --git a/test/data/pathup/subdir/template.html.p b/pollen/test/data/pathup/subdir/template.html.p similarity index 100% rename from test/data/pathup/subdir/template.html.p rename to pollen/test/data/pathup/subdir/template.html.p diff --git a/test/data/pathup/subdir/test-pathup-one.html.pm b/pollen/test/data/pathup/subdir/test-pathup-one.html.pm similarity index 100% rename from test/data/pathup/subdir/test-pathup-one.html.pm rename to pollen/test/data/pathup/subdir/test-pathup-one.html.pm diff --git a/pollen/test/data/pollen-mode/pollen.rkt b/pollen/test/data/pollen-mode/pollen.rkt new file mode 100644 index 0000000..df06aef --- /dev/null +++ b/pollen/test/data/pollen-mode/pollen.rkt @@ -0,0 +1,5 @@ +#lang racket/base + +(module world racket/base + (provide (all-defined-out)) + (define command-char #\∆)) \ No newline at end of file diff --git a/test/data/pollen-mode/test-pollen-mode.foo b/pollen/test/data/pollen-mode/test-pollen-mode.foo similarity index 100% rename from test/data/pollen-mode/test-pollen-mode.foo rename to pollen/test/data/pollen-mode/test-pollen-mode.foo diff --git a/test/data/poly/pollen.rkt b/pollen/test/data/poly/pollen.rkt similarity index 87% rename from test/data/poly/pollen.rkt rename to pollen/test/data/poly/pollen.rkt index 0a84a42..f49a6c7 100644 --- a/test/data/poly/pollen.rkt +++ b/pollen/test/data/poly/pollen.rkt @@ -2,7 +2,7 @@ (require pollen/world) (provide (all-defined-out)) -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define poly-targets '(html txt)) (define compile-cache-active #f)) diff --git a/test/data/poly/template.html b/pollen/test/data/poly/template.html similarity index 100% rename from test/data/poly/template.html rename to pollen/test/data/poly/template.html diff --git a/test/data/poly/template.txt b/pollen/test/data/poly/template.txt similarity index 100% rename from test/data/poly/template.txt rename to pollen/test/data/poly/template.txt diff --git a/test/data/poly/test.poly.pm b/pollen/test/data/poly/test.poly.pm similarity index 100% rename from test/data/poly/test.poly.pm rename to pollen/test/data/poly/test.poly.pm diff --git a/test/data/quick-tour/downtown/downtown.html.pmd b/pollen/test/data/quick-tour/downtown/downtown.html.pmd similarity index 100% rename from test/data/quick-tour/downtown/downtown.html.pmd rename to pollen/test/data/quick-tour/downtown/downtown.html.pmd diff --git a/test/data/quick-tour/downtown/template.html b/pollen/test/data/quick-tour/downtown/template.html similarity index 100% rename from test/data/quick-tour/downtown/template.html rename to pollen/test/data/quick-tour/downtown/template.html diff --git a/test/data/quick-tour/hello.txt.pp b/pollen/test/data/quick-tour/hello.txt.pp similarity index 100% rename from test/data/quick-tour/hello.txt.pp rename to pollen/test/data/quick-tour/hello.txt.pp diff --git a/test/data/quick-tour/margin.html.pp b/pollen/test/data/quick-tour/margin.html.pp similarity index 100% rename from test/data/quick-tour/margin.html.pp rename to pollen/test/data/quick-tour/margin.html.pp diff --git a/test/data/quick-tour/uptown/pollen.rkt b/pollen/test/data/quick-tour/uptown/pollen.rkt similarity index 100% rename from test/data/quick-tour/uptown/pollen.rkt rename to pollen/test/data/quick-tour/uptown/pollen.rkt diff --git a/test/data/quick-tour/uptown/template.html b/pollen/test/data/quick-tour/uptown/template.html similarity index 100% rename from test/data/quick-tour/uptown/template.html rename to pollen/test/data/quick-tour/uptown/template.html diff --git a/test/data/quick-tour/uptown/uptown.html.pm b/pollen/test/data/quick-tour/uptown/uptown.html.pm similarity index 100% rename from test/data/quick-tour/uptown/uptown.html.pm rename to pollen/test/data/quick-tour/uptown/uptown.html.pm diff --git a/test/data/rerequire/markup.txt.pm b/pollen/test/data/rerequire/markup.txt.pm similarity index 100% rename from test/data/rerequire/markup.txt.pm rename to pollen/test/data/rerequire/markup.txt.pm diff --git a/test/data/rerequire/pollen.rkt b/pollen/test/data/rerequire/pollen.rkt similarity index 100% rename from test/data/rerequire/pollen.rkt rename to pollen/test/data/rerequire/pollen.rkt diff --git a/test/data/rerequire/template.txt b/pollen/test/data/rerequire/template.txt similarity index 100% rename from test/data/rerequire/template.txt rename to pollen/test/data/rerequire/template.txt diff --git a/test/data/samples/sample-01.html.pm b/pollen/test/data/samples/sample-01.html.pm similarity index 100% rename from test/data/samples/sample-01.html.pm rename to pollen/test/data/samples/sample-01.html.pm diff --git a/test/data/samples/sample-02.txt.pp b/pollen/test/data/samples/sample-02.txt.pp similarity index 100% rename from test/data/samples/sample-02.txt.pp rename to pollen/test/data/samples/sample-02.txt.pp diff --git a/test/data/samples/sample-03.txt.p b/pollen/test/data/samples/sample-03.txt.p similarity index 100% rename from test/data/samples/sample-03.txt.p rename to pollen/test/data/samples/sample-03.txt.p diff --git a/test/data/subtemplate/one.txt b/pollen/test/data/subtemplate/one.txt similarity index 100% rename from test/data/subtemplate/one.txt rename to pollen/test/data/subtemplate/one.txt diff --git a/test/data/subtemplate/one.txt.pm b/pollen/test/data/subtemplate/one.txt.pm similarity index 100% rename from test/data/subtemplate/one.txt.pm rename to pollen/test/data/subtemplate/one.txt.pm diff --git a/test/data/subtemplate/pollen.rkt b/pollen/test/data/subtemplate/pollen.rkt similarity index 68% rename from test/data/subtemplate/pollen.rkt rename to pollen/test/data/subtemplate/pollen.rkt index bc939b1..54d81e1 100644 --- a/test/data/subtemplate/pollen.rkt +++ b/pollen/test/data/subtemplate/pollen.rkt @@ -2,7 +2,7 @@ (require pollen/world) (provide (all-defined-out)) -(module config racket/base +(module world racket/base (provide (all-defined-out)) (define poly-targets '(html txt)) (define compile-cache-active #f)) \ No newline at end of file diff --git a/test/data/subtemplate/subdir/subsubdir/template.txt b/pollen/test/data/subtemplate/subdir/subsubdir/template.txt similarity index 100% rename from test/data/subtemplate/subdir/subsubdir/template.txt rename to pollen/test/data/subtemplate/subdir/subsubdir/template.txt diff --git a/test/data/subtemplate/subdir/subsubdir/three.txt b/pollen/test/data/subtemplate/subdir/subsubdir/three.txt similarity index 100% rename from test/data/subtemplate/subdir/subsubdir/three.txt rename to pollen/test/data/subtemplate/subdir/subsubdir/three.txt diff --git a/test/data/subtemplate/subdir/subsubdir/three.txt.pm b/pollen/test/data/subtemplate/subdir/subsubdir/three.txt.pm similarity index 100% rename from test/data/subtemplate/subdir/subsubdir/three.txt.pm rename to pollen/test/data/subtemplate/subdir/subsubdir/three.txt.pm diff --git a/test/data/subtemplate/subdir/two.txt b/pollen/test/data/subtemplate/subdir/two.txt similarity index 100% rename from test/data/subtemplate/subdir/two.txt rename to pollen/test/data/subtemplate/subdir/two.txt diff --git a/test/data/subtemplate/subdir/two.txt.pm b/pollen/test/data/subtemplate/subdir/two.txt.pm similarity index 100% rename from test/data/subtemplate/subdir/two.txt.pm rename to pollen/test/data/subtemplate/subdir/two.txt.pm diff --git a/test/data/subtemplate/template.txt b/pollen/test/data/subtemplate/template.txt similarity index 100% rename from test/data/subtemplate/template.txt rename to pollen/test/data/subtemplate/template.txt diff --git a/test/data/test-import.html.pm b/pollen/test/data/test-import.html.pm similarity index 100% rename from test/data/test-import.html.pm rename to pollen/test/data/test-import.html.pm diff --git a/test/data/test.html.pm b/pollen/test/data/test.html.pm similarity index 100% rename from test/data/test.html.pm rename to pollen/test/data/test.html.pm diff --git a/test/data/test.html.pmd b/pollen/test/data/test.html.pmd similarity index 100% rename from test/data/test.html.pmd rename to pollen/test/data/test.html.pmd diff --git a/test/data/test.html.pp b/pollen/test/data/test.html.pp similarity index 100% rename from test/data/test.html.pp rename to pollen/test/data/test.html.pp diff --git a/test/data/test.no-ext b/pollen/test/data/test.no-ext similarity index 100% rename from test/data/test.no-ext rename to pollen/test/data/test.no-ext diff --git a/test/data/test.ptree b/pollen/test/data/test.ptree similarity index 100% rename from test/data/test.ptree rename to pollen/test/data/test.ptree diff --git a/test/test-escape-ext.rkt b/pollen/test/test-escape-ext.rkt similarity index 100% rename from test/test-escape-ext.rkt rename to pollen/test/test-escape-ext.rkt diff --git a/test/test-inline-submodule.rkt b/pollen/test/test-inline-submodule.rkt similarity index 79% rename from test/test-inline-submodule.rkt rename to pollen/test/test-inline-submodule.rkt index f8a7914..d0f4b57 100644 --- a/test/test-inline-submodule.rkt +++ b/pollen/test/test-inline-submodule.rkt @@ -8,7 +8,7 @@ (require rackunit) (require (submod ".." inline)) (check-equal? doc "Zut Alors") - (check-equal? metas (hash 'foo 42))) + (check-equal? metas (hasheq 'foo 42))) (module test-metas-submod racket/base (require rackunit) @@ -17,7 +17,7 @@ (define-syntax-rule (#%top . xs) 'unbound-identifier) (check-equal? doc 'unbound-identifier)) - (check-equal? metas (hash 'foo 42))) + (check-equal? metas (hasheq 'foo 42))) (require 'test-main) (require 'test-metas-submod) \ No newline at end of file diff --git a/test/test-langs.rkt b/pollen/test/test-langs.rkt similarity index 100% rename from test/test-langs.rkt rename to pollen/test/test-langs.rkt diff --git a/test/test-meta.rkt b/pollen/test/test-meta.rkt similarity index 100% rename from test/test-meta.rkt rename to pollen/test/test-meta.rkt diff --git a/test/test-override.rkt b/pollen/test/test-override.rkt similarity index 94% rename from test/test-override.rkt rename to pollen/test/test-override.rkt index f667b5c..1ed5dc9 100644 --- a/test/test-override.rkt +++ b/pollen/test/test-override.rkt @@ -41,5 +41,4 @@ (check-equal? (run test-cmd.html.ppover) "2") (check-equal? (dynamic-require test-exports.html.ppover 'docover) "2") (check-equal? (hash-ref (dynamic-require test-exports.html.ppover 'metasover) 'dog) "Roxy") - (check-equal? (dynamic-require test-require.html.pmover 'docover) '(rootover "foobar")) - (check-equal? (with-output-to-string (λ _ (system (format "'~a' pollen version" path-to-raco)))) "42\n"))) + (check-equal? (dynamic-require test-require.html.pmover 'docover) '(rootover "foobar")))) diff --git a/test/test-pathup.rkt b/pollen/test/test-pathup.rkt similarity index 87% rename from test/test-pathup.rkt rename to pollen/test/test-pathup.rkt index 80201d5..4f6fa19 100644 --- a/test/test-pathup.rkt +++ b/pollen/test/test-pathup.rkt @@ -1,5 +1,5 @@ #lang at-exp racket/base -(require rackunit racket/runtime-path pollen/project pollen/render racket/file) +(require rackunit racket/runtime-path pollen/private/project pollen/render racket/file) (define-runtime-path pathup-one "data/pathup/subdir/test-pathup-one.html.pm") (define-runtime-path dr-top "data/pathup/pollen.rkt") diff --git a/test/test-pollen-mode.rkt b/pollen/test/test-pollen-mode.rkt similarity index 100% rename from test/test-pollen-mode.rkt rename to pollen/test/test-pollen-mode.rkt diff --git a/test/test-poly.rkt b/pollen/test/test-poly.rkt similarity index 100% rename from test/test-poly.rkt rename to pollen/test/test-poly.rkt diff --git a/test/test-quick-tour.rkt b/pollen/test/test-quick-tour.rkt similarity index 100% rename from test/test-quick-tour.rkt rename to pollen/test/test-quick-tour.rkt diff --git a/test/test-rerequire.rkt b/pollen/test/test-rerequire.rkt similarity index 100% rename from test/test-rerequire.rkt rename to pollen/test/test-rerequire.rkt diff --git a/test/test-subtemplate.rkt b/pollen/test/test-subtemplate.rkt similarity index 100% rename from test/test-subtemplate.rkt rename to pollen/test/test-subtemplate.rkt diff --git a/test/test-third-tutorial-files.rkt b/pollen/test/test-third-tutorial-files.rkt similarity index 100% rename from test/test-third-tutorial-files.rkt rename to pollen/test/test-third-tutorial-files.rkt diff --git a/top.rkt b/pollen/top.rkt similarity index 69% rename from top.rkt rename to pollen/top.rkt index 800c628..1501288 100644 --- a/top.rkt +++ b/pollen/top.rkt @@ -1,4 +1,6 @@ #lang racket/base +(require (for-syntax racket/base) pollen/tag) +(provide def/c (rename-out (top~ #%top))) ;; Changes the default behavior of #%top. ;; Unbound identifiers are allowed, and treated as the @@ -6,14 +8,8 @@ ;; To suppress this behavior, use def/c to wrap any name. ;; If that name isn't already defined, you'll get the usual syntax error. -(require (for-syntax racket/base) pollen/tag) - -(provide (except-out (all-defined-out) top~) - (rename-out (top~ #%top))) - -(define-syntax (top~ stx) - (syntax-case stx () - [(_ . id) #'(make-default-tag-function 'id)])) +(define-syntax-rule (top~ . id) + (make-default-tag-function 'id)) (define-syntax (def/c stx) (syntax-case stx () diff --git a/convert.rkt b/pollen/unstable/convert.rkt similarity index 97% rename from convert.rkt rename to pollen/unstable/convert.rkt index ba1a945..b59377a 100644 --- a/convert.rkt +++ b/pollen/unstable/convert.rkt @@ -1,5 +1,5 @@ #lang racket/base -(require sugar txexpr racket/list racket/string pollen/world xml html racket/file racket/match pollen/html net/url racket/port) +(require sugar txexpr racket/list racket/string pollen/world xml html racket/file racket/match "html.rkt" net/url racket/port) (define (attrs->pollen attrs) (string-join (flatten (map (λ(pair) (list (format "'~a:" (car pair)) (format "\"~a\"" (cadr pair)))) attrs)) " ")) diff --git a/html.rkt b/pollen/unstable/html.rkt similarity index 100% rename from html.rkt rename to pollen/unstable/html.rkt diff --git a/math.rkt b/pollen/unstable/math.rkt similarity index 96% rename from math.rkt rename to pollen/unstable/math.rkt index 2092404..b9e653c 100644 --- a/math.rkt +++ b/pollen/unstable/math.rkt @@ -1,5 +1,5 @@ #lang racket/base -(require pollen/convert) +(require "convert.rkt") (provide $ $$ mathjax-config mathjax-library) diff --git a/pollen/unstable/mb.rkt b/pollen/unstable/mb.rkt new file mode 100644 index 0000000..4dede9a --- /dev/null +++ b/pollen/unstable/mb.rkt @@ -0,0 +1,136 @@ +#lang racket/base +(require (for-syntax racket/base)) +(require racket/list sugar/define sugar/test txexpr racket/match sugar/container sugar/coerce sugar/len) + +(define (make-replacer query+replacement) + (let ([queries (map car query+replacement)] + [replacements (map second query+replacement)]) + ;; reverse because first in list should be first applied to str (and compose1 works right-to-left) + (apply compose1 (reverse (map (λ(query replacement) (λ(str) (regexp-replace* query str replacement))) queries replacements))))) + +(define+provide/contract (smart-dashes str) + (string? . -> . string?) + (define dashes + ;; fix em dashes first, else they'll be mistaken for en dashes + ;; \\s is whitespace + #\u00A0 is nonbreaking space + '((#px"[\\s#\u00A0]*(---|—)[\\s#\u00A0]*" "—") ; em dash + (#px"[\\s#\u00A0]*(--|–)[\\s#\u00A0]*" "–"))) ; en dash + ((make-replacer dashes) str)) + +(module-test-external + (check-equal? (smart-dashes "I had --- maybe 13 -- 20 --- hob-nobs.") "I had—maybe 13–20—hob-nobs.") + (check-equal? (smart-quotes "\"Why,\" she could've asked, \"are we in O‘ahu watching 'Mame'?\"") + "“Why,” she could’ve asked, “are we in O‘ahu watching ‘Mame’?”") + (check-equal? (smart-quotes "\"\'Impossible.\' Yes.\"") "“‘Impossible.’ Yes.”")) + + +(define+provide/contract (smart-quotes str) + (string? . -> . string?) + + (define quotes + '((#px"(?<=\\w)'(?=\\w)" "’") ; apostrophe + (#px"(?thing properly +(define+provide/contract (wrap-hanging-quotes nx + #:single-prepend [single-pp '(squo)] + #:double-prepend [double-pp '(dquo)]) + ((txexpr?) (#:single-prepend list? #:double-prepend list?) . ->* . txexpr?) + + (define two-or-more-char-string? (λ(i) (and (string? i) (>= (string-length i) 2)))) + (define-values (tag attr elements) (txexpr->values nx)) + (make-txexpr tag attr + (if (and (list? elements) (not (empty? elements))) + (let ([new-car-elements (match (car elements) + [(? two-or-more-char-string? tcs) + (define str-first (get tcs 0)) + (define str-rest (get tcs 1 (string-length tcs))) + (cond + [(str-first . in? . '("\"" "“")) + ;; can wrap with any inline tag + ;; so that linebreak detection etc still works + `(,@double-pp ,(->string #\“) ,str-rest)] + [(str-first . in? . '("\'" "‘")) + `(,@single-pp ,(->string #\‘) ,str-rest)] + [else tcs])] + [(? txexpr? nx) (wrap-hanging-quotes nx)] + [else (car elements)])]) + (cons new-car-elements (cdr elements))) + elements))) + +(module-test-external + (check-equal? (wrap-hanging-quotes '(p "\"Hi\" there")) '(p (dquo "“" "Hi\" there"))) + (check-equal? (wrap-hanging-quotes '(p "'Hi' there")) '(p (squo "‘" "Hi' there"))) + (check-equal? (wrap-hanging-quotes '(p "'Hi' there") #:single-prepend '(foo ((bar "ino")))) + '(p (foo ((bar "ino")) "‘" "Hi' there"))) + + ;; make sure txexpr without elements passes through unscathed + (check-equal? (wrap-hanging-quotes '(div ((style "height:2em")))) '(div ((style "height:2em"))))) + +;; insert nbsp between last two words +(define+provide/contract (nonbreaking-last-space x #:nbsp [nbsp (->string #\u00A0)] + #:minimum-word-length [minimum-word-length 6] + #:last-word-proc [last-word-proc (λ(x) x)]) + ((txexpr?) (#:nbsp string? #:minimum-word-length integer? #:last-word-proc procedure?) . ->* . txexpr?) + + ;; todo: parameterize this, as it will be different for each project + (define tags-to-pay-attention-to '(p aside)) ; only apply to paragraphs + + (define (replace-last-space str) + (if (#\space . in? . str) + (let ([reversed-str-list (reverse (string->list str))] + [reversed-nbsp (reverse (string->list (->string nbsp)))]) + (define-values (last-word-chars other-chars) + (splitf-at reversed-str-list (λ(i) (not (eq? i #\space))))) + + (define front-chars (if (< (len last-word-chars) minimum-word-length) ; OK for long words to be on their own line + ; first char of other-chars will be the space, so use cdr + (string-append (list->string (reverse (cdr other-chars))) (->string nbsp)) + (list->string (reverse other-chars)))) + (define last-word (list->string (reverse last-word-chars))) + `(,front-chars ,(last-word-proc last-word))) ; don't concatenate last word bc last-word-proc might be a txexpr wrapper + (list str))) + + (define (find-last-word-space x) ; recursively traverse xexpr + (cond + [(string? x) (replace-last-space x)] ; todo: this assumes a paragraph only has one string in it. + [(txexpr? x) + (let-values([(tag attr elements) (txexpr->values x)]) + (if (> (length elements) 0) ; elements is list of xexprs + (let-values ([(all-but-last last) (split-at elements (sub1 (length elements)))]) + (define result (find-last-word-space (car last))) + (define result-items (if (txexpr? result) (list result) result)) ; might be txexpr, or list of new elements + (make-txexpr tag attr `(,@all-but-last ,@result-items))) + x))] + [else x])) + + (if ((car x) . in? . tags-to-pay-attention-to) + (find-last-word-space x) + x)) + +(module-test-internal + ;; todo: make some tougher tests, it gets flaky with edge cases + (check-equal? (nonbreaking-last-space '(p "Hi there")) '(p "Hi " "there")) ; nbsp in between last two words + (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "Ø") '(p "HiØ" "there")) ; but let's make it visible + (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "_up_") '(p "Hi_up_" "there")) + (check-equal? (nonbreaking-last-space '(p "Hi there") #:nbsp "_up_" #:minimum-word-length 3) + '(p "Hi " "there")) + (check-equal? (nonbreaking-last-space '(p "Hi here" (em "ho there")) #:nbsp "Ø") '(p "Hi here" (em "hoØ" "there")))) + + + +(provide when/block) +(define-syntax (when/block stx) + (syntax-case stx () + [(_ condition body ...) + #'(if condition (string-append* + (with-handlers ([exn:fail? (λ(exn) (error (format "within when/block, ~a" (exn-message exn))))]) + (map ->string (list body ...)))) + "")])) \ No newline at end of file diff --git a/pygments.rkt b/pollen/unstable/pygments.rkt similarity index 98% rename from pygments.rkt rename to pollen/unstable/pygments.rkt index e67c7e2..5c7869f 100644 --- a/pygments.rkt +++ b/pollen/unstable/pygments.rkt @@ -10,7 +10,7 @@ rackjure/str xml (only-in html read-html-as-xml) - pollen/debug) + "../private/debug.rkt") (provide highlight make-highlight-css) @@ -83,7 +83,7 @@ if zero is False: (define-values (pyg-in pyg-out pyg-pid pyg-err pyg-proc) (values #f #f #f #f #f)) -(define-runtime-path pipe.py "pipe.py") +(define-runtime-path pipe.py "../private/pipe.py") (define start (let ([start-attempted? #f]) diff --git a/pollen/unstable/tmpl.rkt b/pollen/unstable/tmpl.rkt new file mode 100644 index 0000000..33e362a --- /dev/null +++ b/pollen/unstable/tmpl.rkt @@ -0,0 +1,8 @@ +#lang racket/base +(require pollen/private/main-base) + +(define+provide-module-begin-in-mode world:mode-template) + +(module reader racket/base + (require pollen/private/reader-base) + (define+provide-reader-in-mode world:mode-template)) \ No newline at end of file diff --git a/world.rkt b/pollen/world.rkt similarity index 82% rename from world.rkt rename to pollen/world.rkt index bc870d4..5808fca 100644 --- a/world.rkt +++ b/pollen/world.rkt @@ -1,12 +1,13 @@ #lang racket/base -(require (for-syntax racket/base racket/syntax)) +(require (for-syntax racket/base racket/syntax) "private/version.rkt") (require racket/runtime-path) -(provide (prefix-out world: (all-defined-out))) +(provide (prefix-out world: (combine-out (all-defined-out) (all-from-out "private/version.rkt")))) (define current-project-root (make-parameter (current-directory))) (define directory-require "pollen.rkt") +(define env-name "POLLEN") (define (get-path-to-override [file-or-dir (current-directory)]) (define file-with-config-submodule directory-require) @@ -23,13 +24,13 @@ ;; parameters should not be made settable. -(define-for-syntax config-submodule-name 'config) +(define-for-syntax world-submodule-name 'world) (define-syntax (define-settable stx) (syntax-case stx () [(_ name default-value) (with-syntax ([base-name (format-id stx "~a" #'name)] [current-name (format-id stx "current-~a" #'name)] - [config-submodule (format-id stx "~a" config-submodule-name)] + [world-submodule (format-id stx "~a" world-submodule-name)] [fail-thunk-name (format-id stx "fail-thunk-~a" #'name)] ) #'(begin (define base-name default-value) @@ -37,9 +38,7 @@ ;; can take a dir argument that sets start point for (get-path-to-override) search. (define current-name (λ get-path-args (with-handlers ([exn:fail? fail-thunk-name]) - (dynamic-require `(submod ,(apply get-path-to-override get-path-args) config-submodule) 'base-name fail-thunk-name))))))])) - -(define-settable pollen-version "0.1508") + (dynamic-require `(submod ,(apply get-path-to-override get-path-args) world-submodule) 'base-name fail-thunk-name))))))])) (define-settable preproc-source-ext 'pp) (define-settable markup-source-ext 'pm) @@ -65,6 +64,7 @@ (define-settable default-pagetree (format "index.~a" (current-pagetree-source-ext))) (define-settable pagetree-root-node 'pagetree-root) +(define-settable main-root-node 'root) (define-settable command-char #\◊) (define-settable template-command-char #\∂) @@ -78,6 +78,9 @@ (define-settable meta-tag-name 'meta) (define-settable define-meta-name 'define-meta) +;; tags from https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements +(define-settable block-tags (cons (current-main-root-node) '(address article aside blockquote body canvas dd div dl fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr li main nav noscript ol output p pre section table tfoot ul video))) + (define-settable newline "\n") (define-settable linebreak-separator (current-newline)) (define-settable paragraph-separator "\n\n") @@ -91,7 +94,7 @@ (define-settable dashboard-css "poldash.css") -(define-runtime-path server-extras-dir "server-extras") +(define-runtime-path server-extras-dir "private/server-extras") (define current-server-extras-path (make-parameter server-extras-dir)) (define-settable publish-directory-name "publish") diff --git a/pre.rkt b/pre.rkt deleted file mode 100644 index 2b1b8b9..0000000 --- a/pre.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) - -(define+provide-module-begin-in-mode world:mode-preproc) - -(module reader racket/base - (require pollen/reader-base) - (define+provide-reader-in-mode world:mode-preproc)) \ No newline at end of file diff --git a/project.rkt b/project.rkt deleted file mode 100644 index a6b3374..0000000 --- a/project.rkt +++ /dev/null @@ -1,47 +0,0 @@ -#lang racket/base -(require "world.rkt" sugar/define sugar/coerce) - -(define (complete-paths? x) (and (list? x) (andmap complete-path? x))) - -(define/contract+provide (get-directory-require-files source-path) ; keep contract local to ensure coercion - (coerce/path? . -> . (or/c #f complete-paths?)) - - (define (dirname path) - (let-values ([(dir name dir?) (split-path path)]) - dir)) - - (define (find-upward filename-to-find) - (parameterize ([current-directory (dirname (->complete-path source-path))]) - (let loop ([dir (current-directory)][path (string->path filename-to-find)]) - (and dir ; dir is #f when it hits the top of the filesystem - (let ([completed-path (path->complete-path path)]) - (if (file-exists? completed-path) - (simplify-path completed-path) - (loop (dirname dir) (build-path 'up path)))))))) - - (define require-filenames (list world:directory-require)) - (define not-false? (λ(x) x)) - (define possible-requires (filter not-false? (map find-upward require-filenames))) - (and (not (null? possible-requires)) possible-requires)) - - -(define+provide/contract (require+provide-directory-require-files here-path #:provide [provide #t]) - (coerce/path? . -> . (or/c list? void?)) - - (define (put-file-in-require-form file) - `(file ,(path->string file))) - - (define directory-require-files (get-directory-require-files here-path)) - - (if directory-require-files - (let ([files-in-require-form (map put-file-in-require-form directory-require-files)]) - `(begin - (require ,@files-in-require-form) - ,@(if provide - (list `(provide (all-from-out ,@files-in-require-form))) - null))) - '(begin))) - - -(define+provide (require-directory-require-files here-path) - (require+provide-directory-require-files here-path #:provide #f)) \ No newline at end of file diff --git a/ptree.rkt b/ptree.rkt deleted file mode 100644 index 7d78356..0000000 --- a/ptree.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) - -(define+provide-module-begin-in-mode world:mode-pagetree) - -(module reader racket/base - (require pollen/reader-base) - (define+provide-reader-in-mode world:mode-pagetree)) \ No newline at end of file diff --git a/scribblings/file.scrbl b/scribblings/file.scrbl deleted file mode 100644 index d92fb1e..0000000 --- a/scribblings/file.scrbl +++ /dev/null @@ -1,248 +0,0 @@ -#lang scribble/manual - -@(require scribble/eval pollen/render pollen/world (for-label racket (except-in pollen #%module-begin) pollen/world sugar pollen/file)) - -@(define my-eval (make-base-eval)) -@(my-eval `(require pollen pollen/file)) - -@title[#:tag "file-types"]{File} - -@defmodule[pollen/file] - -A utility module that provides functions for working with Pollen source and output files. The tests rely on file extensions specified in @racket[pollen/world]. - -Pollen handles seven kinds of source files: - -@bold{Preprocessor}, with file extension @code[(format ".~a" world:preproc-source-ext)]. - -@bold{Markup}, with file extension @code[(format ".~a" world:markup-source-ext)]. - -@bold{Markdown}, with file extension @code[(format ".~a" world:markdown-source-ext)]. - -@bold{Template}, with file extension @code[(format ".~a" world:template-source-ext)]. - -@bold{Null}, with file extension @code[(format ".~a" world:null-source-ext)]. - -@bold{Scribble}, with file extension @code[(format ".~a" world:scribble-source-ext)]. - -For each kind of Pollen source file, the corresponding output file is generated by removing the extension from the name of the source file. So the preprocessor source file @filepath{default.css.pp} would become @filepath{default.css}. Scribble files work differently — the corresponding output file is the source file but with an @filepath{html} extension rather than @filepath{scrbl}. So @filepath["pollen.scrbl"] would become @filepath["pollen.html"]. - -@deftogether[ -(@defproc[ -(preproc-source? -[v any/c]) -boolean?] - -@defproc[ -(markup-source? -[v any/c]) -boolean?] - -@defproc[ -(markdown-source? -[v any/c]) -boolean?] - -@defproc[ -(template-source? -[v any/c]) -boolean?] - -@defproc[ -(null-source? -[v any/c]) -boolean?] - -@defproc[ -(scribble-source? -[v any/c]) -boolean?] - -@defproc[ -(pagetree-source? -[v any/c]) -boolean?] -)] -Test whether @racket[_v] is a path representing a source file of the specified type, based on file extension. - -@examples[#:eval my-eval -(preproc-source? "main.css.pp") -(markup-source? "default.html.pm") -(markdown-source? "default.html.pmd") -(template-source? "main.html.pt") -(null-source? "index.html.p") -(scribble-source? "file.scrbl") -(pagetree-source? "index.ptree") -] - - - -@deftogether[ -(@defproc[ -(has-preproc-source? -[v any/c]) -boolean?] - -@defproc[ -(has-markup-source? -[v any/c]) -boolean?] - -@defproc[ -(has-markdown-source? -[v any/c]) -boolean?] - -@defproc[ -(has-template-source? -[v any/c]) -boolean?] - -@defproc[ -(has-null-source? -[v any/c]) -boolean?] - -@defproc[ -(has-scribble-source? -[v any/c]) -boolean?] -)] -Test whether @racket[_v] is the output path for an existing source file of the specified type. - - - - - -@deftogether[ -(@defproc[ -(has/is-preproc-source? -[v any/c]) -boolean?] - -@defproc[ -(has/is-markup-source? -[v any/c]) -boolean?] - -@defproc[ -(has/is-markdown-source? -[v any/c]) -boolean?] - -@defproc[ -(has/is-template-source? -[v any/c]) -boolean?] - -@defproc[ -(has/is-null-source? -[v any/c]) -boolean?] - -@defproc[ -(has/is-scribble-source? -[v any/c]) -boolean?] -)] -Test whether @racket[_v] is a path representing a source file of the specified type, or is the output path for an existing source file of the specified type. In other words, @racket[has/is-preproc-source?] is equivalent to @racket[(or (preproc-source? v) (has-preproc-source? v))]. - - -@deftogether[ -(@defproc[ -(->preproc-source-path -[p pathish?]) -path?] - -@defproc[ -(->markup-source-path -[p pathish?]) -path?] - -@defproc[ -(->markdown-source-path -[p pathish?]) -path?] - -@defproc[ -(->template-source-path -[p pathish?]) -path?] - -@defproc[ -(->null-source-path -[p pathish?]) -path?] - -@defproc[ -(->scribble-source-path -[p pathish?]) -path?] -)] -Convert an output path @racket[_p] into the source path of the specified type that would produce this output path. This function simply generates a path for a file — it does not ask whether the file exists. - -@examples[#:eval my-eval -(define name "default.html") -(->preproc-source-path name) -(->markup-source-path name) -(->markdown-source-path name) -(->template-source-path name) -(->scribble-source-path name) -(->null-source-path name) -] - - -@deftogether[ -(@defproc[ -(get-preproc-source -[p pathish?]) -(or/c #f path?)] - -@defproc[ -(get-markup-source -[p pathish?]) -(or/c #f path?)] - -@defproc[ -(get-markdown-source -[p pathish?]) -(or/c #f path?)] - -@defproc[ -(get-template-source -[p pathish?]) -(or/c #f path?)] - -@defproc[ -(get-null-source -[p pathish?]) -(or/c #f path?)] - -@defproc[ -(get-scribble-source -[p pathish?]) -(or/c #f path?)] -)] -Find an existing source path of the specified type that would produce the output path @racket[_p]. If there is no source of the specified type, return @racket[#f]. - - -@defproc[ -(get-source -[p pathish?]) -(or/c #f path?)] -Find an existing source path that would produce the output path @racket[_p]. Check source formats in this order: @racket[get-markup-source], @racket[get-markdown-source], @racket[get-preproc-source], @racket[get-null-source], and @racket[get-scribble-source]. If there is no corresponding source, return @racket[#f]. - - - -@defproc[ -(->output-path -[p pathish?]) -path?] -Convert a source path @racket[_p] into its corresponding output path. This function simply generates a path for a file — it does not ask whether the file exists. - -@examples[#:eval my-eval -(->output-path "main.css.pp") -(->output-path "default.html.pm") -(->output-path "index.html.p") -(->output-path "file.scrbl") -] diff --git a/scribblings/third-tutorial-files/pollen.rkt b/scribblings/third-tutorial-files/pollen.rkt deleted file mode 100644 index d5d4dc9..0000000 --- a/scribblings/third-tutorial-files/pollen.rkt +++ /dev/null @@ -1,7 +0,0 @@ -#lang racket/base -(require pollen/decode txexpr) -(define (root . elements) - (make-txexpr 'root null (decode-elements elements - #:txexpr-elements-proc detect-paragraphs - #:string-proc (compose smart-quotes smart-dashes)))) -(provide root) \ No newline at end of file diff --git a/template.rkt b/template.rkt deleted file mode 100644 index 7eef8ca..0000000 --- a/template.rkt +++ /dev/null @@ -1,162 +0,0 @@ -#lang racket/base -(require (for-syntax racket/base)) -(require racket/string xml xml/path sugar/define sugar/container sugar/coerce sugar/test) -(require "file.rkt" txexpr "world.rkt" "cache.rkt" "pagetree.rkt" "debug.rkt") - -(provide (all-from-out sugar/coerce)) - - -(define/contract+provide (metas->here metas) - (hash? . -> . pagenode?) - (path->pagenode (or (select-from-metas (world:current-here-path-key) metas) 'unknown))) - - -(define (pagenode->path pagenode) - (build-path (world:current-project-root) (symbol->string pagenode))) - - -(define+provide/contract (select key value-source) - (coerce/symbol? (or/c hash? txexpr? pagenode? pathish?) . -> . (or/c #f txexpr-element?)) - ;; of value-source is specfically 'metas or 'doc, - ;; restrict the search to there. - ;; otherwise look in metas, then in doc for key - (define (do-doc-result) - (define doc-result (select-from-doc key value-source)) - (and doc-result (car doc-result))) - (cond - [(or (hash? value-source) (equal? value-source (world:current-meta-export))) (select-from-metas key value-source)] - [(equal? value-source (world:current-main-export)) (do-doc-result)] - [else - (define metas-result (and (not (txexpr? value-source)) (select-from-metas key value-source))) - (or metas-result (do-doc-result))])) - -(module-test-external - (check-equal? (select 'key '#hash((key . "value"))) "value") - (check-false (select 'absent-key '#hash((key . "value")))) - (check-equal? (select 'key '(root (key "value"))) "value") - (check-false (select 'absent-key '(root (key "value")))) - (let ([metas '#hash((key . "value"))]) - (check-equal? (select 'key metas) "value") - (check-false (select 'absent-key metas))) - (let ([doc '(root (key "value"))]) - (check-equal? (select 'key doc) "value") - (check-false (select 'absent-key doc)))) - - -(define+provide/contract (select* key value-source) - (coerce/symbol? (or/c hash? txexpr? pagenode? pathish?) . -> . (or/c #f txexpr-elements?)) - (define metas-result (and (not (txexpr? value-source)) (select-from-metas key value-source))) - (define doc-result (select-from-doc key value-source)) - (define result (append (or (and metas-result (list metas-result)) null) (or doc-result null))) - (and (not (null? result)) result)) - - -(define+provide/contract (select-from-metas key metas-source) - (coerce/symbol? (or/c hash? pagenode? pathish?) . -> . (or/c #f txexpr-element?)) - (define metas (cond - [(hash? metas-source) metas-source] - [else (get-metas metas-source)])) - (and (hash-has-key? metas key) (hash-ref metas key))) - -(module-test-external - (let ([metas '#hash((key . "value"))]) - (check-equal? (select-from-metas 'key metas) "value") - (check-false (select-from-metas 'absent-key metas)))) - - -(define+provide/contract (select-from-doc key doc-source) - (coerce/symbol? (or/c txexpr? pagenode? pathish?) . -> . (or/c #f txexpr-elements?)) - (define doc (cond - [(txexpr? doc-source) doc-source] - [else (get-doc doc-source)])) - (define result (se-path*/list (list key) doc)) - (and (not (null? result)) result)) - -(module-test-external - (check-equal? (select-from-doc 'key '(root (key "value"))) '("value")) - (check-false (select-from-doc 'absent-key '(root (key "value")))) - (let ([doc '(root (key "value"))]) - (check-equal? (select-from-doc 'key doc) '("value")) - (check-false (select-from-doc 'absent-key doc)))) - - -(define (pagenode-or-path->source pagenode-or-path) - (get-source (if (pagenode? pagenode-or-path) - (pagenode->path pagenode-or-path) - pagenode-or-path))) - - -(define+provide/contract (get-metas pagenode-or-path) - ((or/c pagenode? pathish?) . -> . hash?) - (define source-path (pagenode-or-path->source pagenode-or-path)) - (unless source-path - (error (format "get-metas: no source found for '~a' in directory ~a" pagenode-or-path (current-directory)))) - (cached-require source-path (world:current-meta-export))) - - -(define+provide/contract (get-doc pagenode-or-path) - ((or/c pagenode? pathish?) . -> . (or/c txexpr? string?)) - (define source-path (pagenode-or-path->source pagenode-or-path)) - (unless source-path - (error (format "get-doc: no source found for '~a' in directory ~a" pagenode-or-path (current-directory)))) - (cached-require source-path (world:current-main-export))) - - -(define (trim-outer-tag html) - (define matches (regexp-match #px"<.*?>(.*)" html)) - (define paren-match (cadr matches)) - paren-match) - -(define placeholder-tag (gensym)) - -(define+provide/contract (->html x-in #:tag [tag #f] #:attrs [attrs #f] #:splice [splice? #f]) - (((or/c xexpr? (listof xexpr?))) (#:tag (or/c #f txexpr-tag?) #:attrs (or/c #f txexpr-attrs?) #:splice boolean?) . ->* . string?) - - (define x (cond - [(txexpr? x-in) x-in] - [(list? x-in) (cons 'html x-in)] - [else x-in])) - - (when (and (not (txexpr? x)) attrs (not tag)) - (raise-argument-error '->html "can't use attribute list without a #:tag argument" tag)) - - (if (or tag (txexpr? x)) - (let () - (define html-tag (or tag (get-tag x))) - (define html-attrs (or attrs (and (txexpr? x) (get-attrs x)) null)) - (define html-elements (or (and (txexpr? x) (get-elements x)) (list x))) - (define html (xexpr->html (make-txexpr html-tag html-attrs html-elements))) - (if (or splice? (and (list? x-in) (not (txexpr? x-in)) (not tag))) - (trim-outer-tag html) - html)) - (xexpr->html x))) - -(module-test-external - (define tx '(root (p "hello"))) - (check-equal? (->html tx) "

hello

") - (check-equal? (->html #:tag 'brennan tx) "

hello

") - (check-equal? (->html #:attrs '((id "dale")) tx) "

hello

") - (check-equal? (->html #:splice #t tx) "

hello

") - (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) tx) "

hello

") - (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) #:splice #t tx) "

hello

") - (define x "hello") - (check-equal? (->html x) "hello") - (check-equal? (->html #:tag 'brennan x) "hello") - (check-exn exn:fail? (λ() (->html #:attrs '((id "dale")) x) "hello")) ;; won't work without tag - (check-equal? (->html #:splice #t x) "hello") - (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) x) "hello") - (check-equal? (->html #:tag 'brennan #:attrs '((id "dale")) #:splice #t x) "hello") - - (define xs '("hello " (em "you") " " 42)) - (check-equal? (->html xs) "hello you *") - (check-equal? (->html #:splice #t xs) "hello you *") - (check-equal? (->html #:tag 'div xs) "
hello you *
")) - -(provide when/block) -(define-syntax (when/block stx) - (syntax-case stx () - [(_ condition body ...) - #'(if condition (string-append* - (with-handlers ([exn:fail? (λ(exn) (error (format "within when/block, ~a" (exn-message exn))))]) - (map ->string (list body ...)))) - "")])) diff --git a/test/data/pollen-mode/pollen.rkt b/test/data/pollen-mode/pollen.rkt deleted file mode 100644 index 2a0728e..0000000 --- a/test/data/pollen-mode/pollen.rkt +++ /dev/null @@ -1,5 +0,0 @@ -#lang racket/base - -(module config racket/base - (provide (all-defined-out)) - (define command-char #\∆)) \ No newline at end of file diff --git a/tmpl.rkt b/tmpl.rkt deleted file mode 100644 index cae7e3f..0000000 --- a/tmpl.rkt +++ /dev/null @@ -1,8 +0,0 @@ -#lang racket/base -(require pollen/main-base) - -(define+provide-module-begin-in-mode world:mode-template) - -(module reader racket/base - (require pollen/reader-base) - (define+provide-reader-in-mode world:mode-template)) \ No newline at end of file