ADDED code-docs/crystalize.scrbl Index: code-docs/crystalize.scrbl ================================================================== --- code-docs/crystalize.scrbl +++ code-docs/crystalize.scrbl @@ -0,0 +1,65 @@ +#lang scribble/manual + +@; Copyright (c) 2019 Joel Dueck +@; +@; 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. + +@(require "scribble-helpers.rkt") + +@(require (for-label "../pollen.rkt" + "../dust.rkt" + "../crystalize.rkt" + racket/base + racket/contract + racket/string + txexpr + pollen/template + pollen/pagetree + sugar/coerce)) + +@title{@filepath{crystalize.rkt}} + +@defmodule["crystalize.rkt" #:packages ()] + +“Crystalizing” is an extra layer in between docs and templates that destructures the doc and stores +it in various pieces in a SQLite cache. Individual articles save chunks of rendered HTML to the +cache when their individual pages are rendered. The SQLite cache is then referenced by any page that +collects multiple articles and notes together. This is much faster than fetching docs and metas +through Pollen’s cache and re-converting them to HTML. + +This module only provides three functions; almost all its code is private. + +@defproc[(spell-of-summoning!) void?] + +Initializes the SQLite database cache file. This involves creating the file +(@filepath{vitreous.sqlite}) if it does not exist, and running queries to create tables in the +database if they do not exist. + +This function should be called near the beginning of any HTML template used to render an individual +article. + +I could have made it so the function is called automatically every time Pollen is run. But that +would mean it gets run even when the target is not HTML, which is unnecessary. + +@defproc[(crystalize-article! [pagenode pagenode?] [doc txexpr?]) non-empty-string?] + +Returns a string containing the HTML of doc. @margin-note{This is one function that breaks my +convention of using a prefix of @tt{html$-} for functions that return strings of HTML.} Privately, +however, it does a lot of other work. The article is saved to the SQLite cache. If the article +specifies a @racket['series] meta, information about that series is fetched and used in the +rendering of the article. If there are @racket[note]s in the doc, they are parsed and saved +individually to the SQLite cache. If any of the notes use the @code{#:disposition} attribute, +information about the disposition is parsed out and used in the rendering of the article. + +@defproc[(article-plain-title [pagenode pagenode?]) non-empty-string?] + +Fetches the “plain” title (i.e., with no HTML markup) for the given article from the SQLite cache. +If the article did not specify a title, a default title is supplied. If the article contained +a @racket[note] that used the @code{#:disposition} attribute, the disposition-mark may be included +in the title. + +Note that this needs to be called @emph{after} @racket[crystalize-article!] in order to get an +up-to-date value. Index: code-docs/dust.scrbl ================================================================== --- code-docs/dust.scrbl +++ code-docs/dust.scrbl @@ -25,12 +25,12 @@ @title{@filepath{dust.rkt}} @defmodule["dust.rkt" #:packages ()] This is where I put constants and helper functions that are needed pretty much everywhere in the -project. In a simpler project these would go in @filepath{pollen.rkt} but here I have other modules -sitting “behind” that one in the @tt{require} chain. +project. In a simpler project these would go in @seclink["pollen-rkt"]{@filepath{pollen.rkt}} but +here I have other modules sitting “behind” that one in the @tt{require} chain. @section{Constants} @defthing[default-authorname string? #:value "Joel Dueck"] Index: code-docs/main.scrbl ================================================================== --- code-docs/main.scrbl +++ code-docs/main.scrbl @@ -35,6 +35,7 @@ @include-section["pollen.scrbl"] @; pollen.rkt @include-section["dust.scrbl"] @; dust.rkt @include-section["sqlite-tools.scrbl"] @; sqlite-tools.rkt @include-section["snippets-html.scrbl"] @; you get the idea +@include-section["crystalize.scrbl"]