Document format¶
A document is one YAML file in a project's templates/. Every key is
optional except that you need at least one template or page to render
anything. Lengths are millimetres unless suffixed; see
units.
document: daily # name; default: the file stem
modules: [../shared/extra.py] # extra module files, relative to this file
icons: [../shared/icons] # extra icon directories, relative to this file
page:
size: [105, 170] # [w, h] | {width, height} | a named size
margins:
top: 2.5
bottom: 7.5
inner: 15 # binding side
outer: 5
# all: 10 # sets the four above at once
# left: 10 # with right: disables mirroring
# right: 10
grid:
module: 2.5 # module grid step
dots:
spacing: 5
origin: [0, 2.5] # or a single number for both axes
radius: 0.125
colour: "#231F20"
opacity: 1
inset: 0
defaults:
gap: 2.5 # default space between modules; default: the module grid
theme: {} # see the theme reference
decorations: [] # drawn on every page; see below
templates:
<name>:
side: right # right (recto, default) | left (verso)
content: [] # the stack of modules
decorations: [] # this template only, in addition to the document's
theme: {} # merged over the document theme
margins: {} # replaces the document margins for this template
gap: 2.5 # replaces defaults.gap for this template
pages:
- front # a template name
- {template: back} # or a mapping…
- {template: daily, repeat: 31} # …repeated: daily-01 … daily-31
- {template: daily, side: left, name: x} # …with any template key overridden
Top level¶
| key | type | default | |
|---|---|---|---|
document |
string, or {name: …} |
file stem | output file prefix |
modules |
list of paths | [] |
Python files to import; the project's modules/ is loaded regardless |
icons |
list of paths | [] |
icon directories searched before the project's icons/ and the built-ins |
page |
mapping | a5, default margins | |
grid |
mapping or number | 2.5 |
a bare number is the module grid |
dots |
mapping | accepted at top level as an alias for grid.dots |
|
defaults.gap |
length | module grid | |
theme |
mapping | deep-merged over the defaults | |
decorations |
list | [] |
|
templates |
mapping | {} |
|
pages |
list | one page per template, in order |
page¶
size is a named size (a4 … hobonichi-weeks, see units), a
two-element list, or {width, height}.
margins default to {top: 10, bottom: 10, inner: 15, outer: 10}. inner
is the binding side and mirrors with side; left/right, if given,
replace the mirrored pair and disable mirroring.
grid¶
module is the step every module rectangle snaps to. dots describes the
page-anchored dot lattice: the lattice consists of points
(origin.x + i·spacing, origin.y + j·spacing) in page coordinates; modules
with dots: true draw the points strictly inside their rectangle.
colour, radius and opacity default to theme.dots.*.
Templates and pages¶
A template is a page definition. A page is an instance of one, and
the pages list is what gets rendered, in order. A page entry may be a bare
template name or a mapping with template plus any template key to
override; repeat: N expands it to N pages named <name>-01 … <name>-NN.
Without pages, every template renders once in declaration order.
Page names become part of output file names: <document>-<nn>-<name>.svg.
Modules in content¶
Each entry is a mapping with type and that module's parameters (see the
module reference), plus these common keys:
| key | |
|---|---|
height |
length, or fill |
width |
inside a row: length, or fill |
gap |
space before this module, overriding the default |
flex |
weight among sibling fill modules; default 1 |
valign |
inside a row: top (default), middle, bottom |
theme |
per-module theme overrides |
id |
a name for your own reference; unused by JournalKit |
stroke, stroke_width |
per-module overrides where the module draws a frame |
A bare string is shorthand for {type: <string>}, so - spacer works.
Any value may reference the theme as $theme.<path>.
Decorations¶
Each entry is a module spec drawn outside the content flow. Two placement forms:
- {type: rule, edge: inner, offset: 4} # full-length rule beside an edge
- type: text # explicit rectangle
text: "2026"
above: true # over the content; default under
at:
x: {from: outer, offset: 2} # number | anchor name | {from, offset}
y: {from: bottom, offset: 6}
width: 20 # length | full | content
height: 5
edge accepts inner, outer, left, right, center (vertical, full
height) and top, bottom (horizontal, full width). Anchors for at are
listed in the decorations guide.
Errors¶
A YAML syntax error is reported as <file>: <message>; an unknown module
type lists the known ones; an unknown template, page size, unit or anchor
names the offending value. All exit 1.