@heroiclands/package-build 23.13.0 → 24.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +2 -1
  3. package/assets/preview/gitea.ini +12 -7
  4. package/assets/styles/content-base.css +150 -1
  5. package/bin/content-commands.mjs +356 -210
  6. package/bin/package-build.mjs +3 -2
  7. package/ci/check-banners.mjs +7 -7
  8. package/config.mjs +21 -6
  9. package/content-config.mjs +199 -80
  10. package/docs/api.md +93 -72
  11. package/docs/authoring/links-and-markup.md +316 -78
  12. package/docs/commands.md +244 -78
  13. package/docs/configuration.md +210 -102
  14. package/docs/content-format.md +2 -2
  15. package/docs/diagnostics.md +2 -2
  16. package/docs/getting-started.md +1 -1
  17. package/docs/guides/icons.md +1 -1
  18. package/docs/guides/module-project.md +5 -8
  19. package/docs/guides/release-and-deploy.md +2 -2
  20. package/docs/guides/site.md +112 -23
  21. package/docs/guides/system-project.md +1 -1
  22. package/docs/guides/writing-in-invented-scripts.md +1247 -0
  23. package/docs/index.md +1 -0
  24. package/docs/project-setup.md +28 -30
  25. package/docs/reference/format-details.md +589 -308
  26. package/docs/reference/note-types.md +40 -10
  27. package/docs/reference/theme-pages.md +127 -108
  28. package/docs/source-preview.md +15 -1
  29. package/engine/asset-shipping.mjs +22 -10
  30. package/engine/base-compiler.mjs +62 -104
  31. package/engine/changelog-lint.mjs +1 -1
  32. package/engine/content-address.mjs +1 -1
  33. package/engine/content-alerts.mjs +8 -4
  34. package/engine/content-blocks.mjs +26 -11
  35. package/engine/content-embeds.mjs +1 -1
  36. package/engine/content-expand.mjs +376 -0
  37. package/engine/content-figures.mjs +13 -6
  38. package/engine/content-format.yaml +8 -0
  39. package/engine/content-glyphs.mjs +213 -0
  40. package/engine/content-images.mjs +6 -7
  41. package/engine/content-links.mjs +3 -3
  42. package/engine/content-lint.mjs +1 -1
  43. package/engine/content-render.mjs +453 -0
  44. package/engine/content-scripts.mjs +326 -27
  45. package/engine/content-spans.mjs +4 -1
  46. package/engine/content-styles.mjs +91 -0
  47. package/engine/content-symbols.mjs +186 -0
  48. package/engine/content-verse.mjs +6 -18
  49. package/engine/core-report.mjs +169 -0
  50. package/engine/core-vocabulary.mjs +208 -0
  51. package/engine/dictionary-html.mjs +119 -0
  52. package/engine/field-reference.mjs +1 -1
  53. package/engine/frontmatter-lint.mjs +1 -1
  54. package/engine/heading-attributes.mjs +89 -0
  55. package/engine/helpers.mjs +61 -101
  56. package/engine/homepage.mjs +17 -29
  57. package/engine/html-minify.mjs +70 -0
  58. package/engine/index.mjs +8 -5
  59. package/engine/language-rows.mjs +8 -2
  60. package/engine/language-terms.mjs +115 -14
  61. package/engine/language-words.mjs +12 -0
  62. package/engine/logographic.mjs +255 -0
  63. package/engine/map-lexicon.mjs +221 -25
  64. package/engine/map-places.mjs +5 -4
  65. package/engine/markdown-expressions.mjs +0 -2
  66. package/engine/markdownlint-run.mjs +9 -3
  67. package/engine/markup-validation.mjs +21 -0
  68. package/engine/metre-declaration.mjs +134 -0
  69. package/engine/note-matter.mjs +2 -2
  70. package/engine/note-vocabulary.mjs +187 -3
  71. package/engine/pdf-build.mjs +68 -133
  72. package/engine/pdf-render.mjs +102 -44
  73. package/engine/post-fields.mjs +157 -0
  74. package/engine/preview-index.mjs +130 -0
  75. package/engine/preview-source.mjs +450 -0
  76. package/engine/project-init.mjs +5 -12
  77. package/engine/prose-config.mjs +3 -3
  78. package/engine/run-words.mjs +3 -2
  79. package/engine/script-emphasis-terms.mjs +38 -0
  80. package/engine/script-emphasis.mjs +295 -0
  81. package/engine/script-font-delivery.mjs +4 -4
  82. package/engine/site-build.mjs +259 -314
  83. package/engine/site-config.mjs +26 -238
  84. package/engine/site-files.mjs +175 -0
  85. package/engine/site-index.mjs +9 -4
  86. package/engine/site-preview.mjs +50 -523
  87. package/engine/site-render.mjs +593 -0
  88. package/engine/site-root.mjs +22 -13
  89. package/engine/site-search.mjs +161 -0
  90. package/engine/site-serve.mjs +273 -0
  91. package/engine/site-theme-banner.mjs +154 -0
  92. package/engine/site-theme-urls.mjs +125 -0
  93. package/engine/site-theme.mjs +926 -0
  94. package/engine/text-maps.mjs +57 -10
  95. package/engine/typographer.mjs +248 -0
  96. package/engine/verse-metre.mjs +357 -0
  97. package/engine/wikilink-syntax.mjs +29 -47
  98. package/engine/wikilinks.mjs +758 -279
  99. package/engine/word-forms.mjs +39 -24
  100. package/engine/word-rows.mjs +12 -2
  101. package/engine/word-terms.mjs +29 -4
  102. package/manifest.mjs +3 -4
  103. package/package.json +10 -7
  104. package/{hugo-theme → site-theme}/data/banners.yaml +6 -10
  105. package/site-theme/layouts/base.hbs +31 -0
  106. package/site-theme/layouts/blog-list.hbs +30 -0
  107. package/site-theme/layouts/blog-post.hbs +40 -0
  108. package/site-theme/layouts/home.hbs +35 -0
  109. package/site-theme/layouts/list.hbs +20 -0
  110. package/site-theme/layouts/not-found.hbs +31 -0
  111. package/site-theme/layouts/page.hbs +7 -0
  112. package/site-theme/partials/copy-buttons.hbs +37 -0
  113. package/site-theme/partials/draft-notice.hbs +5 -0
  114. package/site-theme/partials/exturl.hbs +2 -0
  115. package/{hugo-theme/layouts/partials/footer.html → site-theme/partials/footer.hbs} +10 -7
  116. package/site-theme/partials/header.hbs +44 -0
  117. package/site-theme/partials/hero-banner.hbs +11 -0
  118. package/site-theme/partials/infobox-entry.hbs +2 -0
  119. package/site-theme/partials/infobox-section.hbs +31 -0
  120. package/site-theme/partials/infobox-value.hbs +2 -0
  121. package/site-theme/partials/infobox.hbs +18 -0
  122. package/site-theme/partials/list-members.hbs +9 -0
  123. package/site-theme/partials/nav-links.hbs +5 -0
  124. package/site-theme/partials/page-body.hbs +48 -0
  125. package/site-theme/partials/page-list.hbs +14 -0
  126. package/site-theme/partials/related.hbs +24 -0
  127. package/site-theme/partials/search-meta.hbs +6 -0
  128. package/site-theme/partials/search-names.hbs +2 -0
  129. package/site-theme/partials/search.hbs +52 -0
  130. package/site-theme/partials/tags.hbs +4 -0
  131. package/site-theme/partials/toc.hbs +7 -0
  132. package/{hugo-theme → site-theme}/static/css/style.css +14 -0
  133. package/stage.mjs +1 -2
  134. package/types/config.d.mts +8 -4
  135. package/types/content-config.d.mts +15 -15
  136. package/types/engine/asset-shipping.d.mts +5 -2
  137. package/types/engine/base-compiler.d.mts +20 -2
  138. package/types/engine/content-address.d.mts +1 -1
  139. package/types/engine/content-alerts.d.mts +8 -2
  140. package/types/engine/content-blocks.d.mts +11 -4
  141. package/types/engine/content-expand.d.mts +288 -0
  142. package/types/engine/content-figures.d.mts +11 -3
  143. package/types/engine/content-glyphs.d.mts +85 -0
  144. package/types/engine/content-images.d.mts +6 -7
  145. package/types/engine/content-links.d.mts +1 -1
  146. package/types/engine/content-render.d.mts +199 -0
  147. package/types/engine/content-scripts.d.mts +62 -0
  148. package/types/engine/content-spans.d.mts +1 -1
  149. package/types/engine/content-styles.d.mts +33 -0
  150. package/types/engine/content-symbols.d.mts +35 -0
  151. package/types/engine/core-report.d.mts +45 -0
  152. package/types/engine/core-vocabulary.d.mts +53 -0
  153. package/types/engine/dictionary-html.d.mts +8 -0
  154. package/types/engine/field-reference.d.mts +1 -1
  155. package/types/engine/heading-attributes.d.mts +20 -0
  156. package/types/engine/helpers.d.mts +3 -10
  157. package/types/engine/homepage.d.mts +11 -24
  158. package/types/engine/html-minify.d.mts +9 -0
  159. package/types/engine/index.d.mts +2 -1
  160. package/types/engine/language-terms.d.mts +24 -2
  161. package/types/engine/logographic.d.mts +45 -0
  162. package/types/engine/map-lexicon.d.mts +48 -8
  163. package/types/engine/map-places.d.mts +8 -0
  164. package/types/engine/markdown-expressions.d.mts +0 -2
  165. package/types/engine/metre-declaration.d.mts +39 -0
  166. package/types/engine/pdf-render.d.mts +6 -2
  167. package/types/engine/post-fields.d.mts +44 -0
  168. package/types/engine/preview-index.d.mts +72 -0
  169. package/types/engine/preview-source.d.mts +51 -0
  170. package/types/engine/script-emphasis-terms.d.mts +21 -0
  171. package/types/engine/script-emphasis.d.mts +84 -0
  172. package/types/engine/script-font-delivery.d.mts +4 -4
  173. package/types/engine/site-build.d.mts +71 -113
  174. package/types/engine/site-config.d.mts +14 -134
  175. package/types/engine/site-files.d.mts +73 -0
  176. package/types/engine/site-index.d.mts +11 -3
  177. package/types/engine/site-preview.d.mts +15 -19
  178. package/types/engine/site-render.d.mts +171 -0
  179. package/types/engine/site-root.d.mts +12 -4
  180. package/types/engine/site-search.d.mts +54 -0
  181. package/types/engine/site-serve.d.mts +44 -0
  182. package/types/engine/site-theme-banner.d.mts +51 -0
  183. package/types/engine/site-theme-urls.d.mts +60 -0
  184. package/types/engine/site-theme.d.mts +127 -0
  185. package/types/engine/text-maps.d.mts +17 -3
  186. package/types/engine/typographer.d.mts +11 -0
  187. package/types/engine/verse-metre.d.mts +131 -0
  188. package/types/engine/wikilink-syntax.d.mts +30 -48
  189. package/types/engine/wikilinks.d.mts +330 -14
  190. package/types/engine/word-forms.d.mts +3 -2
  191. package/types/manifest.d.mts +3 -4
  192. package/types/stage.d.mts +1 -2
  193. package/types/vendor/markdownlint.d.mts +8 -0
  194. package/vendor/markdownlint.mjs +20388 -0
  195. package/engine/web-wikilinks.mjs +0 -594
  196. package/hugo-theme/layouts/404.html +0 -85
  197. package/hugo-theme/layouts/_default/baseof.html +0 -67
  198. package/hugo-theme/layouts/_default/list.html +0 -139
  199. package/hugo-theme/layouts/_default/single.html +0 -4
  200. package/hugo-theme/layouts/blog/list.html +0 -54
  201. package/hugo-theme/layouts/blog-post/single.html +0 -36
  202. package/hugo-theme/layouts/index.html +0 -75
  203. package/hugo-theme/layouts/partials/banner-url.html +0 -141
  204. package/hugo-theme/layouts/partials/cdn-url.html +0 -36
  205. package/hugo-theme/layouts/partials/dictionary-lists.html +0 -58
  206. package/hugo-theme/layouts/partials/draft-notice.html +0 -41
  207. package/hugo-theme/layouts/partials/draft-state.html +0 -26
  208. package/hugo-theme/layouts/partials/header.html +0 -35
  209. package/hugo-theme/layouts/partials/hero-banner.html +0 -85
  210. package/hugo-theme/layouts/partials/infobox/entry.html +0 -18
  211. package/hugo-theme/layouts/partials/infobox/items.html +0 -26
  212. package/hugo-theme/layouts/partials/infobox/section.html +0 -56
  213. package/hugo-theme/layouts/partials/infobox/value.html +0 -43
  214. package/hugo-theme/layouts/partials/infobox.html +0 -57
  215. package/hugo-theme/layouts/partials/page-body.html +0 -152
  216. package/hugo-theme/layouts/partials/related.html +0 -138
  217. package/hugo-theme/layouts/partials/search.html +0 -84
  218. package/hugo-theme/layouts/partials/site-url.html +0 -32
  219. package/hugo-theme/layouts/partials/tags.html +0 -30
  220. package/hugo-theme/layouts/partials/toc.html +0 -28
  221. package/hugo-theme/layouts/partials/warn-missing-banner.html +0 -3
  222. package/hugo-theme/layouts/shortcodes/cartouche.html +0 -64
  223. package/hugo-theme/layouts/shortcodes/exturl.html +0 -12
  224. package/hugo-theme/layouts/shortcodes/glyph.html +0 -43
  225. package/hugo-theme/layouts/shortcodes/pagelist.html +0 -63
  226. package/hugo-theme/theme.toml +0 -11
  227. package/types/engine/web-wikilinks.d.mts +0 -107
  228. /package/{hugo-theme → site-theme}/data/banner-kinds.yaml +0 -0
  229. /package/{hugo-theme → site-theme}/static/css/sohl-icons.css +0 -0
  230. /package/{hugo-theme → site-theme}/static/fonts/game-icons-kb.woff2 +0 -0
  231. /package/{hugo-theme → site-theme}/static/img/banners/takheperu-hieroglyphs.svg +0 -0
  232. /package/{hugo-theme → site-theme}/static/img/cartouches/takheperu.svg +0 -0
  233. /package/{hugo-theme → site-theme}/static/js/inline-spoilers.js +0 -0
@@ -7,10 +7,9 @@ subType: howto
7
7
 
8
8
  # Build a content website
9
9
 
10
- `package-build site` turns the package's content notes into a Hugo source
11
- tree. Hugo renders that tree with the shared theme. The build reads the same
12
- note addresses used by content indexes and links, so a page's URL follows the
13
- note it publishes.
10
+ `package-build site build` renders the package's content notes as a website
11
+ with the shared theme. The build reads the same note addresses used by content
12
+ indexes and links, so a page's URL follows the note it publishes.
14
13
 
15
14
  The site has an authored homepage and one page for each other publishable note
16
15
  in the content tree. The [configuration reference](../configuration.md)
@@ -62,15 +61,13 @@ site:
62
61
  description: A guide to the setting and its people.
63
62
  ```
64
63
 
65
- The site title goes into Hugo's generated configuration. `site.description`
64
+ The site title is the title of every page. `site.description`
66
65
  is plain text for the page's metadata. `site.assets` is an absolute HTTP or
67
66
  HTTPS host for imagery. `package.json` supplies the homepage URL; it must
68
67
  agree with the content package's address. The
69
68
  [configuration reference](../configuration.md#site) covers the other site
70
- keys, including `base`, `packages`, `notfound`, and `hugo`.
69
+ keys, including `base`, `packages`, and `notfound`.
71
70
 
72
- `site.hugo` can add Hugo options the build does not derive. Keys the build
73
- owns, such as `baseURL`, `title`, and the generated menu, are refused there.
74
71
  The menu comes from the navigation fetched by `package-build deps fetch`.
75
72
  The site build reads that cached navigation and reports a missing cache.
76
73
 
@@ -107,10 +104,54 @@ record available. A SQL fence queries the content index; the
107
104
  [content format](../content-format.md) defines its result columns and fence
108
105
  options.
109
106
 
110
- The build writes no automatic section, type, tag, or listing pages between
111
- the homepage and the authored pages. Hugo's section, taxonomy, term, and RSS
112
- kinds are disabled for these sites. A package's navigation above individual
113
- notes is therefore a set of authored pages, each choosing its own contents.
107
+ The build writes no automatic type or listing pages between the homepage and
108
+ the authored pages: a package's navigation above individual notes is a set of
109
+ authored pages, each choosing its own contents. A site writes tag pages only
110
+ with `site.tags`, and section pages only for the sections `site.sections` and
111
+ `site.feed` name.
112
+
113
+ ## Write a blog
114
+
115
+ A blog is a section of posts. A post is a `doc` note of `subType: post`, which
116
+ states the day it was published and may name who wrote it; its `tags` are the
117
+ ones any note carries:
118
+
119
+ ```markdown
120
+ ---
121
+ type: doc
122
+ subType: post
123
+ shortcode: welcome
124
+ name: { full: Welcome to Heroic Lands }
125
+ description: A first post, and a short note on what this blog is for.
126
+ tags: [meta, announcements]
127
+ data:
128
+ date: 2026-04-15
129
+ author: Tom Rodriguez
130
+ ---
131
+
132
+ The first post.
133
+ ```
134
+
135
+ A post that names no `data.author` carries the site's byline, the first entry
136
+ of `authors`. `site.feed` names the section the posts are published in, and
137
+ `site.sections` can give that section a page of its own, a `doc` note whose
138
+ title and body introduce the list:
139
+
140
+ ```yaml
141
+ site:
142
+ sections:
143
+ blog: doc-blog
144
+ feed: blog
145
+ tags: true
146
+ ```
147
+
148
+ The section's page at `/blog/` lists every post newest first, and
149
+ `/blog/atom.xml` feeds them. A post publishes at its own address,
150
+ `/doc-welcome/`, like any note, and a link to `doc-blog` reaches `/blog/`. With
151
+ `site.tags`, each tag a page carries links to a page listing every page that
152
+ carries it. See [where a site is served, and what it
153
+ lists](../configuration.md#where-a-site-is-served-and-what-it-lists) for every
154
+ key.
114
155
 
115
156
  ## Use links, relations, and maps
116
157
 
@@ -142,7 +183,7 @@ format and link behavior in the [content format](../content-format.md).
142
183
 
143
184
  ## What an emitted page carries
144
185
 
145
- A theme reads the front matter `package-build site` writes: the note's own
186
+ A page is drawn from its front matter: the note's own
146
187
  front matter, plus the values the build derives. Which is which matters,
147
188
  because an authored value under a derived key is discarded.
148
189
 
@@ -191,7 +232,7 @@ in `devDependencies`, as the
191
232
  describes. Nothing else is configured: the build reads which faces the notes use
192
233
  from their `font=` keys.
193
234
 
194
- `package-build site` copies the font stylesheet, the WOFF2 files and the
235
+ `package-build site build` copies the font stylesheet, the WOFF2 files and the
195
236
  licence to a path that names the fonts package's version,
196
237
  `fonts/heroiclands/<version>/` beside the pages, and the theme links the
197
238
  stylesheet from every page. The copied stylesheet lists only the WOFF2
@@ -206,16 +247,64 @@ package.
206
247
  ```bash
207
248
  package-build deps fetch
208
249
  package-build content-index
209
- package-build site
210
- hugo --source build/hugo
250
+ package-build site build
251
+ ```
252
+
253
+ `package-build site build` renders every page and writes the site under
254
+ `build/site/<contentPackage>/`: the pages, `404.html`, `sitemap.xml`, the
255
+ theme's files and the script fonts, then `_headers` beside it and the search
256
+ index inside it. Nothing else renders the pages: the body of each is the same
257
+ HTML the Foundry journals and the editor preview read, drawn into the site
258
+ theme's layouts and minified.
259
+
260
+ ```bash
261
+ package-build site serve
211
262
  ```
212
263
 
213
- `package-build site` writes `build/hugo/hugo.toml` and its content mount
214
- under `build/hugo/content/`. Hugo writes rendered pages under `build/site/`.
215
- `package-build site-root` adds the root headers and search index after Hugo
216
- runs. The output under `build/` is disposable; a site build replaces its
217
- content mount so a deleted note cannot leave a page behind.
264
+ `package-build site serve` builds the site the same way and serves it at
265
+ `http://127.0.0.1:1313/<contentPackage>/`. Edit a note and its page is written
266
+ again and the browser reloads; edit the theme and every page is drawn again.
267
+ A change that moves, renames or adds a note builds the whole site again. See
268
+ [`site serve`](../commands.md#package-build-site-serve) for the whole table.
218
269
 
219
270
  A package created by `package-build init` includes `npm run build:site` for
220
- this sequence and `npm run serve:site` for a local Hugo server. The site
221
- requires Hugo Extended and the shared theme in the project's dependencies.
271
+ `site build` and `npm run serve:site` for `site serve`, each preceded by the
272
+ dependency and content-index steps. Neither needs anything installed beyond
273
+ the project's dependencies.
274
+
275
+ ## Search
276
+
277
+ A site whose `site.search` is left on carries a search box in its header and a
278
+ [Pagefind](https://pagefind.app) index beside its pages. A search can be
279
+ narrowed by what each page tells it:
280
+
281
+ | Filter | Values |
282
+ | ----------- | -------------------------------------------- |
283
+ | `package` | the package that publishes the note |
284
+ | `type` | the note's `type` |
285
+ | `subtype` | the note's `subType` |
286
+ | `culture` | the name of the culture `data.culture` names |
287
+ | `continent` | the continent the note lies in |
288
+ | `region` | the outermost region beneath that continent |
289
+
290
+ A place lies where its `parents` lead, a being where its `data.homes` are, and
291
+ a scenario where its `data.locations` are. A continent is a `place/region`
292
+ whose parent is the world, and the region a note is found under is the region
293
+ directly beneath its continent, however deep the note sits: a settlement in a
294
+ valley in a march is found under the march. A note that lies in more than one
295
+ place carries every continent and region it reaches, so a being with a home in
296
+ each of two regions is found under both.
297
+
298
+ A note's name and its aliases count ten times a word of its body, so a search
299
+ for a name opens that note first and a search for an alias finds it. A result
300
+ shows the note's `data.icon`, or its hero banner where it has none. A note's
301
+ tags and its draft state are not filters. Secret blocks, inline secrets and
302
+ `.secret` sections are kept out of the index.
303
+
304
+ A post carries `author` and `tags` filters and sorts by its `date`. A site's
305
+ search can read other sites' indexes beside its own: given each package site in
306
+ [`site.mergeIndexes`](../configuration.md#where-a-site-is-served-and-what-it-lists),
307
+ the search box finds every site's pages from one box. Each index is read from
308
+ `/<package>/pagefind/` on the site's own origin, so the merged search works
309
+ where the sites share an origin and finds only the site's own pages under
310
+ `package-build site serve`.
@@ -40,6 +40,6 @@ npm run build:book
40
40
  npm run build:noci
41
41
  ```
42
42
 
43
- `build:db` writes the content index, stages assets, and compiles configured packs. `build:site` writes site content and renders it with Hugo Extended; `serve:site` starts a local Hugo preview. `build:book` uses Typst. `build:noci` runs lint, database, and manifest steps without reinstalling dependencies. Inspect `build/packs-json/` for compiled document data and `build/stage/` for what Foundry receives. Everything under `build/` is generated and can be deleted.
43
+ `build:db` writes the content index, stages assets, and compiles configured packs. `build:site` renders the site; `serve:site` serves it locally. `build:book` uses Typst. `build:noci` runs lint, database, and manifest steps without reinstalling dependencies. Inspect `build/packs-json/` for compiled document data and `build/stage/` for what Foundry receives. Everything under `build/` is generated and can be deleted.
44
44
 
45
45
  The [testing guide](e2e.md) covers a disposable Foundry world. The [release guide](release-and-deploy.md) covers packaging and deployment. Site deployment needs its own hosting configuration; local builds do not.