Skip to main content

internal/docsite/docsite.go

internal/docsite · 390 lines · 17 declarations · source

This file carries the package documentation, rendered on the package page.

Declarations

type Options

type Options struct {
// Root is the repository checkout.
Root string
// Out is the renderer's document directory. It is replaced on every build, so it must be a
// directory of its own: never the repository, never an ancestor of it, never inside docs/.
Out string
// Sidebars is the file the navigation is written to, in the renderer's sidebar format.
Sidebars string
// DSN names a disposable PostgreSQL substrate. The build creates a scratch database there,
// migrates and inspects it, and drops it. Bootstrapping resets the instance roles' passwords the
// way the test suite does, so this must never be a deployment's database.
DSN string
// Repo and Ref are where source links point: "owner/name" and a commit or branch.
Repo, Ref string
}

Options says where the repository is, where the site's source goes, and what source links point at.

source

type Report

type Report struct {
Documents, Packages, Files, Declarations, Tests, Migrations, Tables int
}

Report counts what the build covered, so a caller can say it rather than claim it.

source

type page

type page struct {
Repo, Stage string
Body string
}

page is one staged markdown file. Repo is its path in the repository ("" when generated), Stage is its path under the document directory.

source

const summaryMarker

const summaryMarker = "<!-- generated reference -->"

summaryMarker is where the generated reference is spliced into docs/SUMMARY.md.

source

func Build

func Build(ctx context.Context, opts Options) (Report, error)

Build writes the site's source and returns what it covered.

source

method Options.validate

func (o Options) validate() error

source

func stageDocuments

func stageDocuments(root string) ([]page, string, error)

stageDocuments reads every markdown file under docs/ and returns the navigation file separately. The repository README is not a page: it is the repository's front door on GitHub, and the site has its own.

source

func spliceSummary

func spliceSummary(summary, nav string) (string, error)

source

func checkListed

func checkListed(summary string, docs []page) error

checkListed refuses a published document the navigation does not reach.

source

const keptMarker

const keptMarker = "<!-- kept in the repository, not on the site"

keptMarker opens the comment in docs/SUMMARY.md naming the documents that stay in the repository: records for the people building Taisce, such as the decision register and dated measurement runs, rather than documentation for the people using it. The list is a comment so that GitHub, where the same file reads as a table of contents, shows nothing for it.

A list rather than a directory: the register's path is the one the project's rules and code comments cite, and moving files to change what a website shows would break every one of those.

source

var keptEntry

var keptEntry = regexp.MustCompile(`^-\s+(\S+\.md)$`)

source

func publishedDocuments

func publishedDocuments(summary string, docs []page) ([]page, error)

publishedDocuments removes the kept documents from docs. A document is on the site or kept, never both and never neither; checkListed refuses neither, and this refuses both, together with a kept name that is no document, because a list naming nothing is how a moved record goes unnoticed. It reads the navigation as written, before links are resolved, since a link to a kept document is rewritten to its source and would no longer read as listed.

source

func keptDocuments

func keptDocuments(summary string) (map[string]bool, error)

keptDocuments reads the kept comment: one "- name.md" line per document, up to the comment's close.

source

var leadingComments, alertStart, admonition

var (
leadingComments = regexp.MustCompile(`^(?:\s*<!--[\s\S]*?-->\s*\n)+`)
alertStart = regexp.MustCompile(`^>\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$`)
admonition = map[string]string{"NOTE": "note", "TIP": "tip", "IMPORTANT": "info", "WARNING": "warning", "CAUTION": "danger"}
)

source

func forRenderer

func forRenderer(body string) string

forRenderer adapts a page written for GitHub to the renderer, without changing what it says: the licence comment belongs to the source file rather than the rendered page, and a GitHub alert becomes the renderer's admonition of the same kind.

source

func writeSite

func writeSite(opts Options, pages []page, sidebars []byte) error

writeSite replaces the document directory with the pages and writes the navigation.

source

func relative

func relative(fromStage, toStage string) string

relative returns the shortest link from one staged page to another staged path (which may carry an anchor).

source