make it possible to use `require` in templates

pull/225/head
Matthew Butterick 5 years ago
parent ae29f16513
commit f8240fd02e

@ -47,5 +47,6 @@
(or (select-from-metas (setup:here-path-key SOURCE-PATH-STRING) metas) 'unknown))) (or (select-from-metas (setup:here-path-key SOURCE-PATH-STRING) metas) 'unknown)))
(if (bytes? doc) ; if main export is binary, just pass it through (if (bytes? doc) ; if main export is binary, just pass it through
doc doc
(include-template #:command-char COMMAND-CHAR (file TEMPLATE-PATH-STRING))))) (splicing-let-syntax ([require (make-rename-transformer #'local-require)])
(include-template #:command-char COMMAND-CHAR (file TEMPLATE-PATH-STRING))))))
(provide result)))))])) (provide result)))))]))

@ -1 +1 @@
1589922948 1589922957

@ -199,11 +199,11 @@ The goal of this whole endeavor was to derive multiple output files from one sou
@seclink["Templates" #:tag-prefixes '("tutorial-2")] should be familiar to you by now. As usual, the name of the template is @tt{template} plus the relevant file extension, so in this case @filepath{template.txt.p}. Add the file as follows: @seclink["Templates" #:tag-prefixes '("tutorial-2")] should be familiar to you by now. As usual, the name of the template is @tt{template} plus the relevant file extension, so in this case @filepath{template.txt.p}. Add the file as follows:
@fileblock["template.txt.p" @codeblock|{ @fileblock["template.txt.p" @codeblock|{
◊(local-require racket/list) ◊(require racket/list)
◊(apply string-append (filter string? (flatten doc))) ◊(apply string-append (filter string? (flatten doc)))
}|] }|]
What we're doing here is converting the X-expression to text in a smarter way. Because we're in a template, we use @racket[local-require] (rather than plain @racket[require]) to bring in @racketmodname[racket/list] so we can use the @racket[flatten] function. What we're doing here is converting the X-expression to text in a smarter way. We use @racket[require] to bring in @racketmodname[racket/list] so we can use the @racket[flatten] function.
To understand what the next line does, just read it from the inside out: ``Take the @racket[doc] export from the source file (which is an X-expression), @racket[flatten] it into a list, @racket[filter] with @racket[string?] (creating a list that's only strings) and @racket[apply] the @racket[string-append] function to these, resulting in one big string.'' Which is exactly what we need for a plain-text file. To understand what the next line does, just read it from the inside out: ``Take the @racket[doc] export from the source file (which is an X-expression), @racket[flatten] it into a list, @racket[filter] with @racket[string?] (creating a list that's only strings) and @racket[apply] the @racket[string-append] function to these, resulting in one big string.'' Which is exactly what we need for a plain-text file.
@ -304,7 +304,7 @@ Then a @filepath{template.ltx.p}:
@fileblock["template.ltx.p" @codeblock|{ @fileblock["template.ltx.p" @codeblock|{
\documentclass[a4paper,12pt]{letter} \documentclass[a4paper,12pt]{letter}
\begin{document} \begin{document}
◊(local-require racket/list) ◊(require racket/list)
◊(apply string-append (filter string? (flatten doc))) ◊(apply string-append (filter string? (flatten doc)))
\end{document} \end{document}
}|] }|]
@ -366,7 +366,7 @@ The template, not as easy:
@fileblock["template.pdf.p" @codeblock|{ @fileblock["template.pdf.p" @codeblock|{
◊(local-require racket/file racket/system) ◊(require racket/file racket/system)
◊(define latex-source ◊string-append{ ◊(define latex-source ◊string-append{
\documentclass[a4paper,12pt]{letter} \documentclass[a4paper,12pt]{letter}
\begin{document} \begin{document}
@ -391,7 +391,7 @@ First, we use @filepath{template.pdf.p} rather than @filepath{template.pdf} for
A quick narrative of the rest: A quick narrative of the rest:
@codeblock|{ @codeblock|{
◊(local-require racket/file racket/system) ◊(require racket/file racket/system)
}| }|
We need @racketmodname[racket/file] for @racket[display-to-file] and @racket[file->bytes]; we need @racketmodname[racket/system] for @racket[system] (to use the command line). We need @racketmodname[racket/file] for @racket[display-to-file] and @racket[file->bytes]; we need @racketmodname[racket/system] for @racket[system] (to use the command line).

@ -298,7 +298,7 @@ And two major differences:
@margin-note{``So a template is also a Pollen source file?'' Not quite. More accurately, it's a fragment of Pollen source that is completed by adding the X-expression that comes out of one of your source files. Because of this, there are a few extra limitations on the code you can put in a template, though with easy workarounds (for instance, you can't use @racket[require] in a template, but you can use @racket[local-require], which accomplishes the same thing).} @margin-note{``So a template is also a Pollen source file?'' Not quite. More accurately, it's a fragment of Pollen source that is completed by adding the X-expression that comes out of one of your source files. Because of this, there are a few extra limitations on the code you can put in a template, though with easy workarounds.}
To see how this works, let's return to the source file we started in the last section: To see how this works, let's return to the source file we started in the last section:

@ -1,2 +1,2 @@
◊(local-require racket/list) ◊(require racket/list)
◊(apply string-append (filter string? (flatten doc))) ◊(apply string-append (filter string? (flatten doc)))

@ -1,2 +1,2 @@
◊(local-require racket/list) ◊(require racket/list)
◊(apply string-append (filter string? (flatten doc))) ◊(apply string-append (filter string? (flatten doc)))
Loading…
Cancel
Save