1kiln(1) General Commands Manual kiln(1)
2
3
4
6 kiln - a simple static site generator
7
9 kiln build [-c config]
10
11 kiln new path
12
14 kiln build builds a kiln site.
15
16 kiln new creates a new kiln site at the given path.
17
19 kiln build
20 -c config
21 Specifies the configuration file to use. Defaults to "config.toml".
22
24 A kiln site is built in one or more steps called tasks. Tasks read con‐
25 tent from the content directory, process the content, and write the
26 content to the output directory. Tasks can also be configured to copy
27 static content to the output directory.
28
29 The following directories are common to all tasks:
30
31 ┌───────────┬─────────────────────┐
32 │Directory │ Description │
33 ├───────────┼─────────────────────┤
34 │content/ │ Content directory │
35 ├───────────┼─────────────────────┤
36 │templates/ │ Templates directory │
37 └───────────┴─────────────────────┘
38 The basic unit of a kiln site is the page. Each page either represents
39 a content file or a subdirectory containing other pages. Pages may be
40 preprocessed, run through templates, and postprocessed (in that order).
41 Each operation takes the output of the last operation as input.
42
44 The content directory contains site content files which can be nested
45 in subdirectories. Any file or directory in the content directory whose
46 name begins with "_" will be ignored, with the exception of files with
47 the name "_index" (e.g. "_index.gmi").
48
49 Content files can specify dates in their filenames. For example, the
50 file content/2020-11-20-Hello-world.gmi will result in a page with a
51 path of /Hello-world/ and a date of November 20, 2020.
52
53 Files with the name "_index" are treated specially. They can be used to
54 provide frontmatter and content for the parent directory which will
55 otherwise have none. If an "_index" file is present in a directory, an
56 index page (e.g. "index.gmi") for that directory will be generated and
57 written to the output directory.
58
59 FRONTMATTER
60 Pages can specify additional metadata in frontmatter. Frontmatter is
61 delimited by "---" and is specified in YAML. Newlines after the closing
62 delimiter are removed from the content.
63
64 Example:
65
66 ---
67 title: Page title
68 date: 2021-04-24
69 params:
70 key: value
71 ---
72
73 Page content
74
75 The following keys are supported:
76
77 title
78 The title of the page.
79
80 Example:
81
82 ---
83 title: My first post
84 ---
85
86 date
87 The date of the page. Pages are sorted by date in reverse order, so
88 newer pages will be placed above older pages.
89
90 Example:
91
92 ---
93 date: 2021-05-21
94 ---
95
96 weight
97 The weight of the page. Pages are sorted by weight in increasing
98 order, so pages with a smaller weight will be placed above pages
99 with a larger weight.
100
101 Example:
102
103 ---
104 weight: 1
105 ---
106
107 outputs
108 Optionally specifies a list of tasks that can build this page. De‐
109 faults to all tasks.
110
111 Example:
112
113 ---
114 outputs: ["Gemini", "HTTPS"]
115 ---
116
117 ---
118 outputs: [] # Excluded from all tasks
119 ---
120
121 template
122 Optionally specifies the name of the template to use when building
123 this page. If unspecified, defaults to "page" for regular pages and
124 "index" for index pages. The template is then found according to
125 TEMPLATE RESOLUTION.
126
127 Example:
128
129 ---
130 title: About me
131 template: about
132 ---
133
134 params
135 Specifies extra parameters to be provided to templates.
136
137 Example:
138
139 ---
140 params:
141 key: value
142 ---
143
144 SORTING
145 Pages are sorted automatically. Pages are first ordered by weight in
146 increasing order, then by date from newest to oldest, and then by file‐
147 name in alphabetical order.
148
150 The templates directory contains templates for use when building the
151 site. Templates use the Go templating language. The following templates
152 are supported:
153
154 ┌──────────┬──────────────────────────┐
155 │Template │ Description │
156 ├──────────┼──────────────────────────┤
157 │page.ext │ Page template │
158 ├──────────┼──────────────────────────┤
159 │index.ext │ Directory index template │
160 ├──────────┼──────────────────────────┤
161 │base.ext │ Base template from which │
162 │ │ the page and index tem‐ │
163 │ │ plates inherit │
164 ├──────────┼──────────────────────────┤
165 │atom.xml │ Atom feed template │
166 └──────────┴──────────────────────────┘
167 The extension of page and index templates is configurable and will re‐
168 place ".ext" above. See CONFIGURATION.
169
170 For more information on the Go templating language, see
171 https://golang.org/pkg/text/template/.
172
173 PAGE AND INDEX TEMPLATES
174 The content for page and index templates can be accessed using the
175 .Content page variable. For example:
176
177 page header
178 {{ .Content }}
179 page footer
180
181 Other page variables are documented in PAGE VARIABLES.
182
183 In HTML templates, page content is escaped by default. If the content
184 is known to be safe, it must be marked as safe to avoid escaping. For
185 example:
186
187 <body>
188 {{ .Content | safeHTML }}
189 </body>
190
191 See TEMPLATE FUNCTIONS for more information.
192
193 BASE TEMPLATES
194 Base templates are inherited only by page and index templates. Base
195 templates generally define at least one block which can be customized
196 by page and index templates, according to the Go templating language.
197
198 For example, the base template could contain:
199
200 {{ block "body" . }}
201 Blocks can have default content
202 {{ end }}
203 {{ block "extra_content" . }}{{ end }}
204
205 The page and index templates can then customize these blocks, for exam‐
206 ple:
207
208 {{ define "body" }}
209 Body goes here
210 {{ end }}
211
212 TEMPLATE RESOLUTION
213 The scope of a template is limited by the directory it is placed in.
214 For example, a page template in the templates/blog/ directory will only
215 apply to files in content/blog/. A page template placed in templates/
216 will only apply to files in content/ and not its subdirectories.
217
218 Fallback templates can be specified in the templates/_default/ direc‐
219 tory. These templates will apply only when the required kind of tem‐
220 plate is not found in the template directory.
221
222 The template for a specific page can be overridden by setting the tem‐
223 plate key in the page's frontmatter. See FRONTMATTER for more details.
224
225 For example, the page file content/blog/my_first_post.gmi will be ren‐
226 dered with the template templates/blog/page.ext. If that template is
227 not found, it falls back to templates/_default/page.ext. If that tem‐
228 plate is also not found, then no template will be used.
229
230 Base templates also follow the same rules. For example, the index tem‐
231 plate templates/blog/index.ext inherits firstly from tem‐
232 plates/blog/base.ext, and then falls back to templates/_de‐
233 fault/base.ext if present.
234
235 There is no override mechanism for base templates.
236
237 PARTIAL TEMPLATES
238 Partial templates can be placed in the templates/_partials directory.
239 Partial templates can be executed from any other template using the
240 partial function. For example, a template could contain:
241
242 {{ partial "navbar.ext" . }}
243
244 Then templates/_partials/navbar.ext is executed. Since argument . is
245 provided, all data from the current context is provided. See TEMPLATE
246 FUNCTIONS for more information.
247
248 In HTML templates, the partial template content is escaped by default.
249 If the content is known to be safe, it must be marked as safe to avoid
250 escaping. For example:
251
252 <body>
253 {{ partial "navbar.ext" . | safeHTML }}
254 </body>
255
256 See TEMPLATE FUNCTIONS for more information.
257
259 By default, kiln looks for a configuration file named "config.toml". An
260 alternative configuration file can be specified with the -c flag. See
261 OPTIONS.
262
263 The configuration file uses the TOML format.
264
265 The following keys are supported:
266
267 ┌───────┬────────────────────────┐
268 │Key │ Description │
269 ├───────┼────────────────────────┤
270 │title │ Site title │
271 ├───────┼────────────────────────┤
272 │params │ Extra parameters made │
273 │ │ available to templates │
274 └───────┴────────────────────────┘
275
276 TASKS
277 Tasks can be specified in the [[tasks]] array of tables.
278
279 The following configuration options are supported per task:
280
281 name
282 An optional name for the task.
283
284 Example:
285
286 [[tasks]]
287 name = "Gemini"
288
289 [[tasks]]
290 name = "HTML export"
291
292 input
293 A list of input file extensions. Files in the content directory
294 with a matching extension will be processed.
295
296 Example:
297
298 [[tasks]]
299 input = [".gmi", ".md"]
300
301 output
302 The output file extension. Files written to the output directory
303 will use this extension.
304
305 Example:
306
307 [[tasks]]
308 output = ".html"
309
310 template
311 The template file extension. Templates with this file extension
312 will be used to format the content. If unset, no templates will be
313 used.
314
315 Example:
316
317 [[tasks]]
318 template = ".gmi"
319
320 preprocess
321 Maps file extensions to preprocess commands. Preprocess commands
322 will run before templating. The commands will be provided the con‐
323 tent of the page as standard input and should write the processed
324 content to standard output.
325
326 Example:
327
328 [[tasks]]
329 input = [".gmi", ".md"]
330 output = ".html"
331 preprocess.gmi = "gmnitohtml"
332 preprocess.md = "mdtohtml"
333
334 postprocess
335 Specifies a command which will run after templating and before con‐
336 tent is written to the output directory. It will be provided the
337 content of the page as standard input and should write the pro‐
338 cessed content to standard output.
339
340 Example:
341
342 [[tasks]]
343 input = [".gmi"]
344 output = ".html"
345 template = ".gmi"
346 postprocess = "gmnitohtml"
347
348 static_dir
349 Specifies a directory from which to read static content. All files
350 in this directory will be copied to the output directory without
351 modificiation. Static assets like images should be stored in this
352 directory. If unset, no static content directory will be used.
353
354 Example:
355
356 [[tasks]]
357 static_dir = "static"
358
359 output_dir
360 Specifies the directory to which output files will be written.
361
362 Example:
363
364 [[tasks]]
365 output_dir = "public"
366
367 url
368 The base URL to use for page URLs. The base URL should not have
369 trailing forward slashes.
370
371 ugly_urls
372 Specifies whether page paths will contain file extensions. By de‐
373 fault, clean paths without any extension are used.
374
375 Example:
376
377 [[tasks]]
378 ugly_urls = true
379
380 The following configuration builds a simple Gemini site.
381
382 [[tasks]]
383 input = [".gmi"]
384 output = ".gmi"
385 template = ".gmi"
386 output_dir = "public"
387
388 The following configuration generates a Gemini text site and also ex‐
389 ports an HTML version of the site. This configuration makes use of the
390 gmnitohtml(1) command to convert Gemini text to HTML.
391
392 # Build the site
393 [[tasks]]
394 input = [".gmi"]
395 output = ".gmi"
396 template = ".gmi"
397 static_dir = "static"
398 output_dir = "public"
399
400 # Export an HTML version of the site
401 [[tasks]]
402 input = [".gmi"]
403 output = ".html"
404 template = ".gmi"
405 postprocess = "gmnitohtml"
406 static_dir = "static"
407 output_dir = "public_html"
408
409 The following configuration generates an HTML site from Markdown and
410 Gemini text files in the content directory and HTML templates in the
411 templates directory. This configuration makes use of the mdtohtml(1)
412 command to convert Markdown to HTML, and the gmnitohtml(1) command to
413 convert Gemini text to HTML.
414
415 [[tasks]]
416 input = [".md", ".gmi"]
417 output = ".html"
418 template = ".html"
419 preprocess.md = "mdtohtml"
420 preprocess.gmi = "gmnitohtml"
421 static_dir = "static"
422 output_dir = "public"
423
424 PERMALINKS
425 Permalinks can be used to rewrite page paths. Permalinks are specified
426 in the [tasks.permalinks] table of the configuration file. Keys denote
427 a path to a directory, and values use the Go templating language to re‐
428 write the final path of pages in that directory. The templates have the
429 same data that page templates have available to them (see PAGE VARI‐
430 ABLES).
431
432 The following configuration will rewrite the paths of pages in the con‐
433 tent/blog directory to /YYYY/MM/DD/slug. For example, the file con‐
434 tent/blog/2021-05-12-hello-world.gmi will have a path of
435 /2021/05/12/hello-world/.
436
437 [[tasks]]
438 # ...
439
440 [tasks.permalinks]
441 "/blog/" = "/{{ .Date.Format `2006/01/02` }}/{{ path.Base .Path }}"
442
443 For more information on templates, see TEMPLATES.
444
445 FEEDS
446 Feeds can be specified in the [[tasks.feeds]] array of tables. Multiple
447 feeds can be specified per task.
448
449 Example feed configuration:
450
451 [[tasks]]
452 # ...
453
454 # This generates a feed for the files in content/blog
455 # and writes it to blog/atom.xml (relative to the output directory)
456 [[tasks.feeds]]
457 input_dir = "blog"
458 title = "My Blog"
459 template = "atom.xml"
460 output = "blog/atom.xml"
461
462 # You can generate multiple feeds per task
463 # The generated feed can be written anywhere
464 # Here it is written to feed.xml (relative to the output directory)
465 [[tasks.feeds]]
466 input_dir = "blog"
467 title = "My Blog"
468 template = "custom_feed.xml"
469 output = "feed.xml"
470
471 input_dir
472 the content folder with which to populate the feed
473
474 title
475 the title of the feed, accessible via {{ .Title }} in the feed tem‐
476 plate
477
478 template
479 the template to use for the feed
480
481 output
482 the output path for the rendered feed
483
485 Templates have certain data and functions available to them.
486
487 SITE VARIABLES
488 The following site-wide variables are available:
489
490 .Title
491 The title of the site.
492
493 .Params
494 Extra parameters specified in configuration.
495
496 .Generated
497 Site generation time.
498
499 .Root
500 The root page of the site. See PAGE VARIABLES.
501
502 Some of these variables are defined in your site's configuration. See
503 CONFIGURATION.
504
505 Site variables can be accessed from templates with the site function.
506 See TEMPLATE FUNCTIONS.
507
508 PAGE VARIABLES
509 The following page variables are available:
510
511 .Title
512 The title of the page
513
514 .Date
515 The date of the page
516
517 .Weight
518 The weight of the page
519
520 .Path
521 The path to the page
522
523 .URL
524 The URL of the page. If no base URL is configured, it is equivalent
525 to .Path.
526
527 .FilePath
528 The path of the page file or directory relative to the content di‐
529 rectory
530
531 .Content
532 The contents of the page
533
534 .Params
535 Extra parameters specified in frontmatter
536
537 .Prev
538 The previous page in sorted order
539
540 .Next
541 The next page in sorted order
542
543 .Pages
544 List of pages in this directory
545
546 .Dirs
547 List of subdirectories in this directory
548
549 Some of these variables are defined in page frontmatter. See FRONTMAT‐
550 TER.
551
552 Page variables can be accessed from page and index templates.
553
554 PAGE FUNCTIONS
555 The following page functions are available:
556
557 .GetPage path
558 Retrieves the page in this directory with the given path, which may
559 be relative or absolute.
560
561 Example:
562
563 {{/* Retrieve a directory relative to the root directory
564 and iterate over its pages */}}
565 {{ with site.Root.GetPage "/blog" }}
566 {{ range .Pages }}
567 {{ .Title }}
568 {{ end }}
569 {{ end }}
570
571 {{/* Retrieve a directory relative to the current directory
572 and iterate over its pages */}}
573 {{ with .GetPage "posts" }}
574 {{ range .Pages }}
575 {{ .Title }}
576 {{ end }}
577 {{ end }}
578
579 {{/* Retrieve a page relative to the current directory */}}
580 {{ with .GetPage "posts/hello-world.gmi" }}
581 {{ .Title }}
582 {{ end }}
583
584 Page functions can be accessed from page and index templates.
585
586 FEED VARIABLES
587 The following feed variables are available:
588
589 .Title
590 The title of the feed
591
592 .Path
593 The path to the feed directory
594
595 .URL
596 The URL of the feed directory
597
598 .Pages
599 List of pages in this feed
600
601 Some of these variables are defined in feed configuration. See FEEDS.
602
603 Feed variables can be accessed from feed templates.
604
605 PARTIAL TEMPLATES
606 Partial templates can be placed in the templates/_partials directory.
607 Partial templates can be executed from any other template with the par‐
608 tial function. See TEMPLATE FUNCTIONS.
609
610 TEMPLATE FUNCTIONS
611 All templates have the following functions available to them:
612
613 and args...
614 Returns the boolean AND of its arguments by returning the first
615 empty argument or the last argument, that is, "and x y" behaves as
616 "if x then y else x". All the arguments are evaluated.
617
618 call function, args...
619 Returns the result of calling the first argument, which must be a
620 function, with the remaining arguments as parameters. Thus "call
621 .X.Y 1 2" is, in Go notation, dot.X.Y(1, 2) where Y is a func-val‐
622 ued field, map entry, or the like. The first argument must be the
623 result of an evaluation that yields a value of function type (as
624 distinct from a predefined function such as print). The function
625 must return either one or two result values, the second of which is
626 of type error. If the arguments don't match the function or the re‐
627 turned error value is non-nil, execution stops.
628
629 eq arg1, arg2
630 Returns the boolean truth of arg1 == arg2.
631
632 exec command, input
633 Executes the given external command with input provided as standard
634 input. Returns its standard output.
635
636 ge arg1, arg2
637 Returns the boolean truth of arg1 >= arg2.
638
639 gt arg1, arg2
640 Returns the boolean truth of arg1 > arg2.
641
642 html args...
643 Returns the escaped HTML equivalent of the textual representation
644 of its arguments. This function is unavailable in HTML templates,
645 with a few exceptions.
646
647 index collection, args...
648 Returns the result of indexing its first argument by the following
649 arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each
650 indexed item must be a map, slice, or array.
651
652 js args...
653 Returns the escaped JavaScript equivalent of the textual represen‐
654 tation of its arguments.
655
656 le arg1, arg2
657 Returns the boolean truth of arg1 <= arg2.
658
659 len list
660 Returns the integer length of its argument.
661
662 lt arg1, arg2
663 Returns the boolean truth of arg1 < arg2.
664
665 math.Add arg1, arg2
666 Returns arg1 + arg2 as an integer if both arguments are integers,
667 otherwise as a float.
668
669 math.Sub arg1, arg2
670 Returns arg1 - arg2 as an integer if both arguments are integers,
671 otherwise as a float.
672
673 math.Mul arg1, arg2
674 Returns arg1 * arg2 as an integer if both arguments are integers,
675 otherwise as a float.
676
677 math.Div arg1, arg2
678 Returns arg1 / arg2 as a float.
679
680 math.Mod arg1, arg2
681 Returns arg1 % arg2 as an integer.
682
683 math.Ceil arg
684 Returns the least integer value greater than or equal to arg.
685
686 math.Floor arg
687 Returns the greatest integer value less than or equal to arg.
688
689 math.Log arg
690 Returns the natural logarithm of arg as a float.
691
692 math.Max arg1, arg2
693 Returns the greater of arg1 and arg2 as an integer if both argu‐
694 ments are integers, otherwise as a float.
695
696 math.Min arg1, arg2
697 Returns the lesser of arg1 and arg2 as an integer if both arguments
698 are integers, otherwise as a float.
699
700 math.Pow arg1, arg2
701 Returns arg1 ^ arg2 as a float.
702
703 math.Round arg
704 Returns the nearest integer to arg, rounding half away from zero.
705
706 math.Sqrt arg
707 Returns square root of arg as a float.
708
709 ne arg1, arg2
710 Returns the boolean truth of arg1 != arg2.
711
712 not arg
713 Returns the boolean negation of its single argument.
714
715 or args...
716 Returns the boolean OR of its arguments by returning the first non-
717 empty argument or the last argument, that is, "or x y" behaves as
718 "if x then x else y". All the arguments are evaluated.
719
720 partial name, data
721 Executes the named partial template with the provided data. See
722 PARTIAL TEMPLATES.
723
724 Example:
725
726 {{ partial "header.gmi" . }}
727
728 path.Base path
729 Returns the last element of path.
730
731 path.Clean path
732 Returns the shortest path name equivalent to path.
733
734 path.Dir path
735 Returns all but the last element of path, typically the path's di‐
736 rectory.
737
738 path.Ext path
739 Returns the filename extension used by path.
740
741 path.Join elem...
742 Joins any number of path elements into a single path.
743
744 print args...
745 Formats using the default formats for its operands and returns the
746 resulting string. Spaces are added between operands when neither is
747 a string.
748
749 printf format, args...
750 Formats according to a format specifier and returns the resulting
751 string.
752
753 println args...
754 Formats using the default formats for its operands and returns the
755 resulting string. Spaces are always added between operands and a
756 newline is appended.
757
758 reverse list
759 Returns a reversed copy of the provided slice or array.
760
761 safeCSS css
762 Encapsulates known safe CSS content.
763
764 safeHTML html
765 Encapsulates a known safe HTML document fragment.
766
767 safeHTMLAttr attr
768 Encapsulates an HTML attribute from a trusted source.
769
770 safeJS js
771 Encapsulates a known safe JavaScript expression.
772
773 safeURL url
774 Encapsulates a known safe URL or URL substring.
775
776 site
777 Returns site information (see SITE VARIABLES).
778
779 slice list, args...
780 slice returns the result of slicing its first argument by the re‐
781 maining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2],
782 while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3"
783 is x[1:2:3]. The first argument must be a string, slice, or array.
784
785 strings.Count string, substr
786 Counts the number of non-overlapping instances of substr in string.
787 If substr is an empty string, Count returns 1 + the number of Uni‐
788 code code points in string.
789
790 strings.HasPrefix string, prefix
791 Reports whether string begins with prefix.
792
793 strings.HasSuffix string, suffix
794 Reports whether string ends with suffix.
795
796 strings.Join elems, sep
797 Concatenates the elements of its first argument to create a single
798 string. The separator string sep is placed between elements in the
799 resulting string.
800
801 strings.Repeat string, count
802 Returns a new string consisting of count copies of string.
803
804 It panics if count is negative or if the result of (len(string) *
805 count) overflows.
806
807 strings.Replace string, old, new, n
808 Returns a copy of string with the first n non-overlapping instances
809 of old replaced by new. If old is empty, it matches at the begin‐
810 ning of the string and after each UTF-8 sequence, yielding up to
811 k+1 replacements for a k-rune string. If n < 0, there is no limit
812 on the number of replacements.
813
814 strings.ReplaceAll string, old, new
815 Returns a copy of string with all non-overlapping instances of old
816 replaced by new. If old is empty, it matches at the beginning of
817 the string and after each UTF-8 sequence, yielding up to k+1 re‐
818 placements for a k-rune string.
819
820 strings.Split string, sep
821 Slices string into all substrings separated by sep and returns a
822 slice of the substrings between those separators.
823
824 If string does not contain sep and sep is not empty, Split returns
825 a slice of length 1 whose only element is string.
826
827 If sep is empty, Split splits after each UTF-8 sequence. If both
828 string and sep are empty, Split returns an empty slice.
829
830 strings.Title string
831 Returns a copy of the string with all Unicode letters that begin
832 words mapped to their Unicode title case.
833
834 BUG: The rule Title uses for word boundaries does not handle Uni‐
835 code punctuation properly.
836
837 strings.ToLower string
838 Returns string with all Unicode letters mapped to their lower case.
839
840 strings.ToUpper string
841 Returns string with all Unicode letters mapped to their upper case.
842
843 strings.Trim string, cutset
844 Returns a slice of string with all leading and trailing Unicode
845 code points contained in cutset removed.
846
847 strings.TrimLeft string, cutset
848 Returns a slice of string with all leading Unicode code points con‐
849 tained in cutset removed.
850
851 To remove a prefix, use strings.TrimPrefix instead.
852
853 strings.TrimPrefix string, prefix
854 Returns string without the provided leading prefix string. If
855 string doesn't start with prefix, it is returned unchanged.
856
857 strings.TrimRight string, cutset
858 Returns a slice of string with all trailing Unicode code points
859 contained in cutset removed.
860
861 To remove a suffix, use strings.TrimSuffix instead.
862
863 strings.TrimSpace string
864 Returns a slice of string with all leading and trailing white space
865 removed, as defined by Unicode.
866
867 strings.TrimSuffix string, suffix
868 Returns string without the provided trailing suffix string. If
869 string doesn't end with suffix, it is returned unchanged.
870
871 urlquery args...
872 Returns the escaped value of the textual representation of its ar‐
873 guments in a form suitable for embedding in a URL query. This func‐
874 tion is unavailable in HTML templates, with a few exceptions.
875
876
877
878 2023-07-20 kiln(1)