Overview
| Comment: | Flesh out makefile and build workflow (closes [aca89051]) |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
61bc0732b0b7319b916f9b79f15315eb |
| User & Date: | joel on 2019-04-27 19:06:48 |
| Other Links: | manifest | tags |
References
|
2019-04-27
| ||
| 19:09 | • Closed ticket [aca89051]: Add makefile plus 4 other changes artifact: 87190c55 user: joel | |
Context
|
2019-04-27
| ||
| 19:08 | Utility scripts use (main) check-in: 1e45b119 user: joel tags: trunk | |
| 19:06 | Flesh out makefile and build workflow (closes [aca89051]) check-in: 61bc0732 user: joel tags: trunk | |
| 03:31 | Fix cache watchlist check-in: ce114f72 user: joel tags: trunk | |
Changes
Modified .fossil-settings/ignore-glob from [9123c029] to [2a3c277b].
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | *.html *.out *.ltx *.aux *.log *.xml *.toc | | | 11 12 13 14 15 16 17 18 | *.html *.out *.ltx *.aux *.log *.xml *.toc *.mark |
Modified blog.rkt from [ca9ab776] to [44d9d7ad].
| ︙ | ︙ | |||
24 25 26 27 28 29 30 31 32 |
;; Builds the paginated “blog” HTML files (blog-pg1.html ...) from the SQLite cache
;; The files will be written out every time this module is evaluated! (see end)
(require "crystalize.rkt"
"snippets-html.rkt"
racket/file
sugar/list)
;; How many items per blog page
| > > | | | | | | | | | | | | > | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
;; Builds the paginated “blog” HTML files (blog-pg1.html ...) from the SQLite cache
;; The files will be written out every time this module is evaluated! (see end)
(require "crystalize.rkt"
"snippets-html.rkt"
racket/file
sugar/list)
(provide main)
;; How many items per blog page
(define per-page 5)
;; Returns a string containing the entire HTML contents of a given blog page
(define (blog-page posts-str pagenum total-pages)
(define page-nav (html$-paginate-navlinks pagenum total-pages "blog"))
◊string-append{
<!DOCTYPE html>
<html lang="en">
◊html$-page-head[(format "The Local Yarn: Blog, p. ~a" pagenum)]
◊html$-page-body-open[]
<aside><i>Everything, in reverse time order. Well, almost everything.</i></aside>
<nav id="top-nav"><ul>◊|page-nav|</ul></nav>
◊posts-str
<nav id="bottom-nav"><ul>◊|page-nav|</ul></nav>
◊html$-page-body-close[]
</html>})
;; Grabs all the articles+notes from the cache and writes out all the blog page files
(define (build-blog)
(spell-of-summoning!) ; Turn on the DB
(define articles+notes (slice-at (list/articles+notes 'listing_full_html #:series #f) per-page))
(define pagecount (length articles+notes))
(for ([pagenum (in-range 1 (+ 1 pagecount))]
[page (in-list articles+notes)])
(define filename (format "blog-pg~a.html" pagenum))
(displayln (format "Writing: ~a" filename))
(display-to-file (blog-page (apply string-append page) pagenum pagecount)
filename
#:mode 'text
#:exists 'replace)))
(define (main)
;; Do it!
(build-blog))
|
Modified dust.rkt from [4a46ea1e] to [62b90e17].
| ︙ | ︙ | |||
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
pollen/pagetree
pollen/setup
pollen/file
net/uri-codec
gregor
txexpr
racket/list
racket/string)
;; Provides common helper functions used throughout the project
(provide maybe-meta ; Select from (current-metas) or default value ("") if not available
maybe-attr ; Return an attribute’s value or a default ("") if not available
here-output-path
series-noun ; Retrieve noun-singular from current 'series meta, or ""
series-title ; Retrieve title of series in current 'series meta, or ""
series-pagenode
make-tag-predicate
tx-strs
ymd->english
ymd->dateformat
default-authorname
default-title
articles-folder
| > > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
pollen/pagetree
pollen/setup
pollen/file
net/uri-codec
gregor
txexpr
racket/list
racket/system
racket/string)
;; Provides common helper functions used throughout the project
(provide maybe-meta ; Select from (current-metas) or default value ("") if not available
maybe-attr ; Return an attribute’s value or a default ("") if not available
here-output-path
series-noun ; Retrieve noun-singular from current 'series meta, or ""
series-title ; Retrieve title of series in current 'series meta, or ""
series-pagenode
invalidate-series
make-tag-predicate
tx-strs
ymd->english
ymd->dateformat
default-authorname
default-title
articles-folder
|
| ︙ | ︙ | |||
57 58 59 60 61 62 63 64 65 | (define default-authorname "Joel Dueck") (define series-folder "series") (define articles-folder "articles") (define (default-title body-txprs) (format "“~a…”" (first-words body-txprs 5))) (define (maybe-meta m [missing ""]) | > | > | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
(define default-authorname "Joel Dueck")
(define series-folder "series")
(define articles-folder "articles")
(define (default-title body-txprs)
(format "“~a…”" (first-words body-txprs 5)))
(define (maybe-meta m [missing ""])
(cond [(current-metas) (or (select-from-metas m (current-metas)) missing)]
[else missing]))
;; Return the current output path, relative to (current-project-root)
;; Similar to the variable 'here' which is only accessible in Pollen templates,
;; except this is an actual path, not a string.
(define (here-output-path)
(cond [(current-metas)
(define-values (_ rel-path-parts)
|
| ︙ | ︙ | |||
92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
[else (or (select-from-metas 'noun-singular series-pnode) "")]))
(define (series-title)
(define series-pnode (series-pagenode))
(case series-pnode
['|| ""] ; no series specified
[else (or (select-from-metas 'title series-pnode) "")]))
;; ~~~ Project-wide Pagetrees ~~~
(define (include-in-pagetree folder extension)
(define (matching-file? f)
(string-suffix? f extension))
(define (file->output-pagenode f)
| > > > > > > > > > > > > > | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
[else (or (select-from-metas 'noun-singular series-pnode) "")]))
(define (series-title)
(define series-pnode (series-pagenode))
(case series-pnode
['|| ""] ; no series specified
[else (or (select-from-metas 'title series-pnode) "")]))
;; “Touches” the last-modified date on the current article’s series, if there is one
(define (invalidate-series)
(define series-name (maybe-meta 'series #f))
(when series-name
(define series-file (build-path (current-project-root)
series-folder
(format "~a.poly.pm" series-name)))
(when (file-exists? series-file)
(case (system-type 'os)
['windows (system (format "type nul >> ~a" series-file))]
[else (system (format "touch ~a" series-file))]))))
;; ~~~ Project-wide Pagetrees ~~~
(define (include-in-pagetree folder extension)
(define (matching-file? f)
(string-suffix? f extension))
(define (file->output-pagenode f)
|
| ︙ | ︙ |
Modified makefile from [3dd8fa71] to [604071f7].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Copyright 2019 Joel Dueck
# This file is part of The Local Yarn
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
#
spritz: ## Clear Pollen and Scribble cache
rm -rf compiled code-docs/compiled articles/compiled series/compiled
fossil clean code-docs/
scribble: ## Rebuild code documentation and update Fossil repo
scribble --htmls +m --redirect https://docs.racket-lang.org/local-redirect/ code-docs/main.scrbl
fossil uv rm scribbled/*
rm -rf scribbled/*
mv main/* scribbled/
cp code-docs/scribble-iframe.html scribbled/scribble.html
rm -rf main
fossil uv add scribbled/*
fossil uv sync
# Self-documenting makefile (http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html)
help: ## Displays this help screen
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
article: ## Start a new article from a template
racket util/newpost.rkt
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# Copyright 2019 Joel Dueck
# This file is part of The Local Yarn
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
#
SHELL = /bin/bash
# ~~~ Variables used by rules ~~~
#
core-files := pollen.rkt dust.rkt
html-deps := snippets-html.rkt tags-html.rkt
article-sources := $(wildcard articles/*.poly.pm)
articles-html := $(patsubst %.poly.pm, %.html, $(article-sources))
articles-pdf := $(patsubst %.poly.pm, %.pdf, $(article-sources))
series-sources := $(wildcard series/*.poly.pm)
series-html := $(patsubst %.poly.pm, %.html, $(series-sources))
# ~~~ Rules ~~
#
# The order of these dependencies is important. They will be processed left to right.
web: _article_htmls.mark $(articles-html) $(series-html) blog-pg1.html
web: ## Rebuild all web content (not PDFs)
# The file article_htmls.mark is a zero-byte file that serves only as a marker. If it is older than
# any of its dependencies (or missing) all of the articles will be rebuilt. Its dependencies are
# also on the Pollen cache watchlist (see pollen.rkt)
_article_htmls.mark: $(core-files) $(html-deps) template.html.p
raco pollen setup articles/
raco pollen render -p -t html articles/*.poly.p
raco pollen setup series/
raco pollen render -p -t html series/*.poly.pm
touch article_htmls.mark
# If the rule for article_htmls.mark was triggered, all the article HTML files will already have
# been re-rendered. (That rule comes before this one in the list of dependencies for "all") But if
# not, any individual files that have been edited will get re-rendered.
$(articles-html): %.html: %.poly.pm
raco pollen render $@
# Note that if any article is part of a series, it will touch its series .poly.pm file during its
# render, triggering this rule for that series.
$(series-html): %.html: %.poly.pm
raco pollen render $@
# This target will also rebuild pg2, pg3, etc.
blog-pg1.html: $(core-files) $(html-deps) $(articles-html) blog.rkt
rm -f blog*.html
racket -tm blog.rkt
spritz: ## Clear Pollen and Scribble cache
rm -rf compiled code-docs/compiled articles/compiled series/compiled
fossil clean code-docs/
publish: check-env
publish: ## Sync all HTML and PDF stuff to the public web server (does not rebuild any files)
raco pollen publish
rsync -av ~/Desktop/publish/ -e 'ssh -p $(WEB_SRV_PORT)' $(LOCALYARN_SRV) \
--delete \
--exclude=drafts \
--exclude=code-docs \
--exclude=util \
--exclude=x-mockup \
--exclude=repo-www \
--exclude=scribbled \
--exclude='*.sqlite' \
--exclude='*.fossil' \
--exclude=.fossil-settings \
--exclude=.fslckout \
--exclude='*.ltx' \
--exclude='*.swp' \
--exclude='*.mark' \
--exclude=.DS_Store \
--exclude='template*.*' \
--exclude=makefile
rm -rf ~/Desktop/publish
scribble: ## Rebuild code documentation and update Fossil repo
scribble --htmls +m --redirect https://docs.racket-lang.org/local-redirect/ code-docs/main.scrbl
fossil uv rm scribbled/*
rm -rf scribbled/*
mv main/* scribbled/
cp code-docs/scribble-iframe.html scribbled/scribble.html
rm -rf main
fossil uv add scribbled/*
fossil uv sync
# Self-documenting makefile (http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html)
help: ## Displays this help screen
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
article: ## Start a new article from a template
racket util/newpost.rkt
.PHONY: all scribble help spritz article publish check-env
.DEFAULT_GOAL := help
check-env:
ifndef LOCALYARN_SRV
$(error LOCALYARN_SRV env variable not set, should be a destination valid for rsync)
endif
ifndef WEB_SRV_PORT
$(error WEB_SRV_PORT env variable not set, should be SSH port number for web server)
endif
|
Modified tags-html.rkt from [392bb161] to [a9c3097d].
| ︙ | ︙ | |||
93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
(define html-center (default-tag-function 'div #:style "text-align: center"))
(define html-dialogue (default-tag-function 'dl #:class "dialogue"))
(define (html-block . elements)
`(section [[class "content-block"]] (div [[class "content-block-main"]] ,@elements)))
(define (html-root . elements)
(define first-pass
(decode-elements (append elements (list (html-footnote-block)))
#:txexpr-elements-proc decode-hardwrapped-paragraphs
#:exclude-tags '(script style figure table pre)))
(define second-pass
(decode-elements first-pass
#:block-txexpr-proc detect-newthoughts
| > | 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
(define html-center (default-tag-function 'div #:style "text-align: center"))
(define html-dialogue (default-tag-function 'dl #:class "dialogue"))
(define (html-block . elements)
`(section [[class "content-block"]] (div [[class "content-block-main"]] ,@elements)))
(define (html-root . elements)
(invalidate-series)
(define first-pass
(decode-elements (append elements (list (html-footnote-block)))
#:txexpr-elements-proc decode-hardwrapped-paragraphs
#:exclude-tags '(script style figure table pre)))
(define second-pass
(decode-elements first-pass
#:block-txexpr-proc detect-newthoughts
|
| ︙ | ︙ |