@geekity/cms 0.39.0 → 0.41.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 (297) hide show
  1. package/admin/pages/appearance/look.njk +135 -0
  2. package/admin/pages/dashboard/home.njk +9 -3
  3. package/admin/pages/documents/conflict.njk +35 -10
  4. package/admin/pages/documents/editor.njk +28 -0
  5. package/admin/pages/documents/list.njk +44 -1
  6. package/admin/pages/settings/general.njk +4 -0
  7. package/admin/pages/users/edit.njk +1 -1
  8. package/admin/src/admin.css +32 -0
  9. package/admin/static/admin.css +197 -3
  10. package/admin/static/dashboard.js +51 -23
  11. package/admin/static/editor.js +19 -19
  12. package/dist/admin/autosave-client.d.ts +85 -0
  13. package/dist/admin/autosave-client.d.ts.map +1 -0
  14. package/dist/admin/autosave-client.js +218 -0
  15. package/dist/admin/autosave-client.js.map +1 -0
  16. package/dist/admin/autosave.d.ts +11 -0
  17. package/dist/admin/autosave.d.ts.map +1 -0
  18. package/dist/admin/autosave.js +76 -0
  19. package/dist/admin/autosave.js.map +1 -0
  20. package/dist/admin/dashboard.d.ts +2 -2
  21. package/dist/admin/dashboard.d.ts.map +1 -1
  22. package/dist/admin/dashboard.js +23 -15
  23. package/dist/admin/dashboard.js.map +1 -1
  24. package/dist/admin/documents.d.ts.map +1 -1
  25. package/dist/admin/documents.js +205 -16
  26. package/dist/admin/documents.js.map +1 -1
  27. package/dist/admin/flash.d.ts +2 -0
  28. package/dist/admin/flash.d.ts.map +1 -1
  29. package/dist/admin/flash.js +12 -0
  30. package/dist/admin/flash.js.map +1 -1
  31. package/dist/admin/focus-mode.d.ts +39 -0
  32. package/dist/admin/focus-mode.d.ts.map +1 -0
  33. package/dist/admin/focus-mode.js +81 -0
  34. package/dist/admin/focus-mode.js.map +1 -0
  35. package/dist/admin/formatting.d.ts +0 -2
  36. package/dist/admin/formatting.d.ts.map +1 -1
  37. package/dist/admin/formatting.js +0 -8
  38. package/dist/admin/formatting.js.map +1 -1
  39. package/dist/admin/look.d.ts +12 -0
  40. package/dist/admin/look.d.ts.map +1 -0
  41. package/dist/admin/look.js +179 -0
  42. package/dist/admin/look.js.map +1 -0
  43. package/dist/admin/menu.d.ts.map +1 -1
  44. package/dist/admin/menu.js +5 -3
  45. package/dist/admin/menu.js.map +1 -1
  46. package/dist/admin/preview.d.ts.map +1 -1
  47. package/dist/admin/preview.js +1 -0
  48. package/dist/admin/preview.js.map +1 -1
  49. package/dist/admin/routes.d.ts.map +1 -1
  50. package/dist/admin/routes.js +6 -4
  51. package/dist/admin/routes.js.map +1 -1
  52. package/dist/admin/settings-fields.d.ts +1 -1
  53. package/dist/admin/settings-fields.d.ts.map +1 -1
  54. package/dist/admin/settings-fields.js +1 -0
  55. package/dist/admin/settings-fields.js.map +1 -1
  56. package/dist/admin/settings-general.d.ts.map +1 -1
  57. package/dist/admin/settings-general.js +1 -0
  58. package/dist/admin/settings-general.js.map +1 -1
  59. package/dist/admin/templates.d.ts +1 -0
  60. package/dist/admin/templates.d.ts.map +1 -1
  61. package/dist/admin/templates.js +2 -1
  62. package/dist/admin/templates.js.map +1 -1
  63. package/dist/admin/users.d.ts.map +1 -1
  64. package/dist/admin/users.js +2 -0
  65. package/dist/admin/users.js.map +1 -1
  66. package/dist/admin/widget-fediverse.js +1 -1
  67. package/dist/admin/widget-posting.d.ts.map +1 -1
  68. package/dist/admin/widget-posting.js +4 -75
  69. package/dist/admin/widget-posting.js.map +1 -1
  70. package/dist/admin/widget-scheduled.js +1 -1
  71. package/dist/admin/widget-top-posts.js +1 -1
  72. package/dist/autosave/index.d.ts +5 -0
  73. package/dist/autosave/index.d.ts.map +1 -0
  74. package/dist/autosave/index.js +3 -0
  75. package/dist/autosave/index.js.map +1 -0
  76. package/dist/autosave/key.d.ts +13 -0
  77. package/dist/autosave/key.d.ts.map +1 -0
  78. package/dist/autosave/key.js +29 -0
  79. package/dist/autosave/key.js.map +1 -0
  80. package/dist/autosave/store.d.ts +23 -0
  81. package/dist/autosave/store.d.ts.map +1 -0
  82. package/dist/autosave/store.js +114 -0
  83. package/dist/autosave/store.js.map +1 -0
  84. package/dist/cli.js +1 -1
  85. package/dist/cli.js.map +1 -1
  86. package/dist/cms/app.d.ts.map +1 -1
  87. package/dist/cms/app.js +1 -0
  88. package/dist/cms/app.js.map +1 -1
  89. package/dist/cms/boot.d.ts.map +1 -1
  90. package/dist/cms/boot.js +2 -0
  91. package/dist/cms/boot.js.map +1 -1
  92. package/dist/cms/create.d.ts +6 -0
  93. package/dist/cms/create.d.ts.map +1 -1
  94. package/dist/cms/create.js +1 -0
  95. package/dist/cms/create.js.map +1 -1
  96. package/dist/cms/server-error.d.ts.map +1 -1
  97. package/dist/cms/server-error.js +6 -6
  98. package/dist/cms/server-error.js.map +1 -1
  99. package/dist/cms/services.d.ts +2 -0
  100. package/dist/cms/services.d.ts.map +1 -1
  101. package/dist/cms/services.js +9 -0
  102. package/dist/cms/services.js.map +1 -1
  103. package/dist/{micropub/content.d.ts → content/html-to-markdown.d.ts} +1 -1
  104. package/dist/content/html-to-markdown.d.ts.map +1 -0
  105. package/dist/{micropub/content.js → content/html-to-markdown.js} +11 -9
  106. package/dist/content/html-to-markdown.js.map +1 -0
  107. package/dist/content/post-type.d.ts +1 -0
  108. package/dist/content/post-type.d.ts.map +1 -1
  109. package/dist/content/post-type.js +1 -1
  110. package/dist/content/post-type.js.map +1 -1
  111. package/dist/content/review.d.ts +14 -0
  112. package/dist/content/review.d.ts.map +1 -1
  113. package/dist/content/review.js +31 -8
  114. package/dist/content/review.js.map +1 -1
  115. package/dist/content/write.d.ts +8 -0
  116. package/dist/content/write.d.ts.map +1 -1
  117. package/dist/content/write.js +1 -1
  118. package/dist/content/write.js.map +1 -1
  119. package/dist/files/data-files.d.ts +2 -0
  120. package/dist/files/data-files.d.ts.map +1 -1
  121. package/dist/files/data-files.js +12 -0
  122. package/dist/files/data-files.js.map +1 -1
  123. package/dist/fonts/css.d.ts +25 -0
  124. package/dist/fonts/css.d.ts.map +1 -0
  125. package/dist/fonts/css.js +88 -0
  126. package/dist/fonts/css.js.map +1 -0
  127. package/dist/fonts/family.d.ts +23 -0
  128. package/dist/fonts/family.d.ts.map +1 -0
  129. package/dist/fonts/family.js +41 -0
  130. package/dist/fonts/family.js.map +1 -0
  131. package/dist/fonts/index.d.ts +10 -0
  132. package/dist/fonts/index.d.ts.map +1 -0
  133. package/dist/fonts/index.js +6 -0
  134. package/dist/fonts/index.js.map +1 -0
  135. package/dist/fonts/job.d.ts +20 -0
  136. package/dist/fonts/job.d.ts.map +1 -0
  137. package/dist/fonts/job.js +49 -0
  138. package/dist/fonts/job.js.map +1 -0
  139. package/dist/fonts/roles.d.ts +53 -0
  140. package/dist/fonts/roles.d.ts.map +1 -0
  141. package/dist/fonts/roles.js +64 -0
  142. package/dist/fonts/roles.js.map +1 -0
  143. package/dist/fonts/store.d.ts +69 -0
  144. package/dist/fonts/store.d.ts.map +1 -0
  145. package/dist/fonts/store.js +237 -0
  146. package/dist/fonts/store.js.map +1 -0
  147. package/dist/maintenance.d.ts +1 -0
  148. package/dist/maintenance.d.ts.map +1 -1
  149. package/dist/maintenance.js +1 -1
  150. package/dist/maintenance.js.map +1 -1
  151. package/dist/micropub/create.js +1 -1
  152. package/dist/micropub/create.js.map +1 -1
  153. package/dist/plugin.d.ts +1 -1
  154. package/dist/plugin.d.ts.map +1 -1
  155. package/dist/settings/registry.d.ts.map +1 -1
  156. package/dist/settings/registry.js +5 -1
  157. package/dist/settings/registry.js.map +1 -1
  158. package/dist/settings/types.d.ts +1 -1
  159. package/dist/settings/types.d.ts.map +1 -1
  160. package/dist/site/dashboard-layout.d.ts +33 -26
  161. package/dist/site/dashboard-layout.d.ts.map +1 -1
  162. package/dist/site/dashboard-layout.js +94 -39
  163. package/dist/site/dashboard-layout.js.map +1 -1
  164. package/dist/site/namespace.d.ts +5 -0
  165. package/dist/site/namespace.d.ts.map +1 -1
  166. package/dist/site/namespace.js +40 -1
  167. package/dist/site/namespace.js.map +1 -1
  168. package/dist/store/schema.d.ts.map +1 -1
  169. package/dist/store/schema.js +4 -0
  170. package/dist/store/schema.js.map +1 -1
  171. package/dist/store/sessions.d.ts +2 -1
  172. package/dist/store/sessions.d.ts.map +1 -1
  173. package/dist/store/sessions.js +30 -12
  174. package/dist/store/sessions.js.map +1 -1
  175. package/dist/theme/font-family.d.ts +13 -0
  176. package/dist/theme/font-family.d.ts.map +1 -0
  177. package/dist/theme/font-family.js +21 -0
  178. package/dist/theme/font-family.js.map +1 -0
  179. package/dist/theme/scheme-tokens.d.ts +50 -0
  180. package/dist/theme/scheme-tokens.d.ts.map +1 -0
  181. package/dist/theme/scheme-tokens.js +240 -0
  182. package/dist/theme/scheme-tokens.js.map +1 -0
  183. package/dist/theme/site-data.d.ts +12 -0
  184. package/dist/theme/site-data.d.ts.map +1 -1
  185. package/dist/theme/site-data.js +15 -0
  186. package/dist/theme/site-data.js.map +1 -1
  187. package/dist/theme/themes.d.ts +74 -0
  188. package/dist/theme/themes.d.ts.map +1 -1
  189. package/dist/theme/themes.js +100 -9
  190. package/dist/theme/themes.js.map +1 -1
  191. package/dist/util/file-size.d.ts +3 -0
  192. package/dist/util/file-size.d.ts.map +1 -0
  193. package/dist/util/file-size.js +9 -0
  194. package/dist/util/file-size.js.map +1 -0
  195. package/dist/web/asset-routes.d.ts.map +1 -1
  196. package/dist/web/asset-routes.js +2 -1
  197. package/dist/web/asset-routes.js.map +1 -1
  198. package/dist/web/conversation.d.ts +15 -0
  199. package/dist/web/conversation.d.ts.map +1 -1
  200. package/dist/web/conversation.js +10 -3
  201. package/dist/web/conversation.js.map +1 -1
  202. package/dist/web/document-page.d.ts.map +1 -1
  203. package/dist/web/document-page.js +11 -13
  204. package/dist/web/document-page.js.map +1 -1
  205. package/dist/web/embed.d.ts.map +1 -1
  206. package/dist/web/embed.js +4 -2
  207. package/dist/web/embed.js.map +1 -1
  208. package/dist/web/env.d.ts +2 -0
  209. package/dist/web/env.d.ts.map +1 -1
  210. package/dist/web/federation-routes.d.ts.map +1 -1
  211. package/dist/web/federation-routes.js +2 -1
  212. package/dist/web/federation-routes.js.map +1 -1
  213. package/dist/web/feed-routes.d.ts +4 -2
  214. package/dist/web/feed-routes.d.ts.map +1 -1
  215. package/dist/web/feed-routes.js +22 -4
  216. package/dist/web/feed-routes.js.map +1 -1
  217. package/dist/web/feed-source.d.ts +1 -1
  218. package/dist/web/feed-source.d.ts.map +1 -1
  219. package/dist/web/feed-source.js +1 -1
  220. package/dist/web/feed-source.js.map +1 -1
  221. package/dist/web/font-routes.d.ts +13 -0
  222. package/dist/web/font-routes.d.ts.map +1 -0
  223. package/dist/web/font-routes.js +27 -0
  224. package/dist/web/font-routes.js.map +1 -0
  225. package/dist/web/listing-pages.d.ts.map +1 -1
  226. package/dist/web/listing-pages.js +12 -14
  227. package/dist/web/listing-pages.js.map +1 -1
  228. package/dist/web/maintenance.d.ts.map +1 -1
  229. package/dist/web/maintenance.js +12 -8
  230. package/dist/web/maintenance.js.map +1 -1
  231. package/dist/web/manifest.d.ts +8 -5
  232. package/dist/web/manifest.d.ts.map +1 -1
  233. package/dist/web/manifest.js +10 -7
  234. package/dist/web/manifest.js.map +1 -1
  235. package/dist/web/markdown-conversation.d.ts +72 -0
  236. package/dist/web/markdown-conversation.d.ts.map +1 -0
  237. package/dist/web/markdown-conversation.js +63 -0
  238. package/dist/web/markdown-conversation.js.map +1 -0
  239. package/dist/web/markdown-page.d.ts +39 -0
  240. package/dist/web/markdown-page.d.ts.map +1 -1
  241. package/dist/web/markdown-page.js +5 -2
  242. package/dist/web/markdown-page.js.map +1 -1
  243. package/dist/web/markdown-representation.d.ts +31 -1
  244. package/dist/web/markdown-representation.d.ts.map +1 -1
  245. package/dist/web/markdown-representation.js +161 -8
  246. package/dist/web/markdown-representation.js.map +1 -1
  247. package/dist/web/negotiate.d.ts +3 -2
  248. package/dist/web/negotiate.d.ts.map +1 -1
  249. package/dist/web/negotiate.js +7 -3
  250. package/dist/web/negotiate.js.map +1 -1
  251. package/dist/web/oembed.d.ts +17 -3
  252. package/dist/web/oembed.d.ts.map +1 -1
  253. package/dist/web/oembed.js +68 -26
  254. package/dist/web/oembed.js.map +1 -1
  255. package/dist/web/render.d.ts +64 -5
  256. package/dist/web/render.d.ts.map +1 -1
  257. package/dist/web/render.js +185 -10
  258. package/dist/web/render.js.map +1 -1
  259. package/dist/web/request.d.ts +0 -3
  260. package/dist/web/request.d.ts.map +1 -1
  261. package/dist/web/request.js +0 -7
  262. package/dist/web/request.js.map +1 -1
  263. package/dist/web/routes.d.ts.map +1 -1
  264. package/dist/web/routes.js +13 -7
  265. package/dist/web/routes.js.map +1 -1
  266. package/dist/web/search.d.ts +6 -3
  267. package/dist/web/search.d.ts.map +1 -1
  268. package/dist/web/search.js +20 -5
  269. package/dist/web/search.js.map +1 -1
  270. package/dist/web/site-index.d.ts.map +1 -1
  271. package/dist/web/site-index.js +2 -1
  272. package/dist/web/site-index.js.map +1 -1
  273. package/dist/web/status-pages.d.ts +19 -0
  274. package/dist/web/status-pages.d.ts.map +1 -0
  275. package/dist/web/status-pages.js +44 -0
  276. package/dist/web/status-pages.js.map +1 -0
  277. package/dist/webmention/fetch-public.d.ts +6 -0
  278. package/dist/webmention/fetch-public.d.ts.map +1 -1
  279. package/dist/webmention/fetch-public.js +6 -1
  280. package/dist/webmention/fetch-public.js.map +1 -1
  281. package/package.json +1 -1
  282. package/themes/default/layouts/404.md.njk +8 -0
  283. package/themes/default/layouts/410.md.njk +7 -0
  284. package/themes/default/layouts/500.md.njk +8 -0
  285. package/themes/default/layouts/503.md.njk +9 -0
  286. package/themes/default/layouts/base.njk +28 -16
  287. package/themes/default/layouts/page.njk +4 -8
  288. package/themes/default/partials/bio.njk +1 -1
  289. package/themes/default/partials/contact-form.njk +1 -1
  290. package/themes/default/partials/markdown-footer.md.njk +121 -3
  291. package/themes/default/partials/markdown-header.md.njk +102 -0
  292. package/themes/default/partials/markdown-reply.md.njk +31 -0
  293. package/themes/default/src/style.css +326 -15
  294. package/themes/default/static/style.css +489 -3
  295. package/themes/default/theme.json +23 -1
  296. package/dist/micropub/content.d.ts.map +0 -1
  297. package/dist/micropub/content.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  {#
2
2
  The end of every page's Markdown: the archive on a page that asked for one,
3
- then a heading and link lists.
3
+ what the page is filed under, what links to it, a post's neighbours, the
4
+ conversation, where the comment and contact forms are, the feeds, then a
5
+ heading and the site's link lists.
4
6
 
5
7
  `archiveMonths` is on the context only of a page whose front matter says
6
8
  `archive: true`: every published post as `{ month, posts }`, newest month
@@ -8,16 +10,42 @@
8
10
  `description` already on one line, written here in the shape a listing's
9
11
  Markdown has.
10
12
 
13
+ `categories` and `tags` are a post's, each a `label` (the term as written)
14
+ and the `url` of its archive. `backlinks` are the site's posts and pages
15
+ that link to this one, newest first, each a `label`, a `url` and a `date`.
16
+ This theme leaves them off a homepage that is a page, as its front page
17
+ layout does; a site theme may print them there.
18
+ `feeds` are the feeds the HTML head advertises, each a `label` (the feed's
19
+ title), a `url`, a `format` (`RSS`, `Atom` or `JSON Feed`) and a `type`.
20
+ `conversation` is on a post or page that has been answered: what
21
+ `conversation.njk` draws, from the same reader, so nothing the HTML hides
22
+ is in it. Its `rsvps`, `likes`, `boosts` and `mentions` are people, each a
23
+ `label` and a `url` when there is one. Its `replies` are threaded as the
24
+ HTML's are, each a `key`, `source`, `author` (a `label` and a `url`), `url`,
25
+ `published`, `rsvp`, `text` (its words as Markdown) and its own `replies`,
26
+ or a `withheld` placeholder with only `replies`. `nest` indents a reply
27
+ under its list item. `commentForm` and `contactForm` are each the `url` of
28
+ the form on the HTML page, printed as it is, since a form needs HTML;
29
+ `commentForm` is absent while comments are closed. `webmention` is there
30
+ when the site takes webmentions.
31
+ `thread` is on a comment's own page, as the header describes it: its
32
+ `comment.replies` are threaded as a conversation's are, and `onPostUrl` is the
33
+ comment on the post's page.
34
+ `type` is `post`, `page`, `listing`, `comment` or `status` (a 404, 410,
35
+ 500 or 503 page); a listing's newer and older pages are written by the CMS
36
+ above this, so only a post's `previous` and `next` are printed here.
37
+
11
38
  `byline` is a post's author, a `label` and the `url` of their archive.
12
39
  `navigation` is every item of every menu the site stores, each URL once,
13
40
  each a `label` and a `url`; `menus` has them by menu name, as the HTML
14
- does. `home`, `previous` and `next` are here too, though the
15
- front matter already carries them for a Markdown browser.
41
+ does. `home`, `previous` and `next` are here too; the front matter carries
42
+ them as well, for a Markdown browser.
16
43
 
17
44
  Each link is a line of its own, with its own words, so the same data can be
18
45
  written as a Gemini link line. Nothing is printed when there is nothing to
19
46
  link.
20
47
  #}
48
+ {% import "partials/markdown-reply.md.njk" as conversing with context %}
21
49
  {% for group in archiveMonths %}
22
50
  ## {{ group.month | escapeMarkdown }}
23
51
 
@@ -26,6 +54,96 @@
26
54
  {% endfor %}
27
55
 
28
56
  {% endfor %}
57
+ {% if categories.length or tags.length %}
58
+ ## Filed under
59
+
60
+ {% for link in categories %}
61
+ - [Category: {{ link.label | escapeMarkdown }}]({{ link.url | markdownUrl }})
62
+ {% endfor %}
63
+ {% for link in tags %}
64
+ - [Tag: {{ link.label | escapeMarkdown }}]({{ link.url | markdownUrl }})
65
+ {% endfor %}
66
+
67
+ {% endif %}
68
+ {% if backlinks.length and not staticFrontPage %}
69
+ ## Linked from
70
+
71
+ {% for entry in backlinks %}
72
+ - [{{ (((entry.date + " ") if entry.date) + entry.label) | escapeMarkdown }}]({{ entry.url | markdownUrl }})
73
+ {% endfor %}
74
+
75
+ {% endif %}
76
+ {% if type == "post" and (previous or next) %}
77
+ ## More posts
78
+
79
+ {% if previous %}
80
+ - [Previous: {{ previous.label | escapeMarkdown }}]({{ previous.url | markdownUrl }})
81
+ {% endif %}
82
+ {% if next %}
83
+ - [Next: {{ next.label | escapeMarkdown }}]({{ next.url | markdownUrl }})
84
+ {% endif %}
85
+
86
+ {% endif %}
87
+ {% if conversation %}
88
+ {% for group in conversation.rsvps.concat([{ label: "Likes", people: conversation.likes }, { label: "Boosts", people: conversation.boosts }, { label: "Mentions", people: conversation.mentions }]) %}
89
+ {% if group.people.length %}
90
+ ## {{ group.label | escapeMarkdown }} ({{ group.people.length }})
91
+
92
+ {% for person in group.people %}
93
+ - {{ conversing.named(person) }}
94
+ {% endfor %}
95
+
96
+ {% endif %}
97
+ {% endfor %}
98
+ {% if conversation.replies.length %}
99
+ ## {{ conversation.counts.replies | plural({ one: "One reply", other: "# replies" }, "en") }}
100
+
101
+ {% for entry in conversation.replies %}
102
+ {{ conversing.reply(entry) | trim }}
103
+
104
+ {% endfor %}
105
+ {% if not commentForm %}
106
+ Comments are closed.
107
+
108
+ {% endif %}
109
+ {% endif %}
110
+ {% endif %}
111
+ {% if thread %}
112
+ {% if thread.comment.replies.length %}
113
+ ## Replies
114
+
115
+ {% for entry in thread.comment.replies %}
116
+ {{ conversing.reply(entry) | trim }}
117
+
118
+ {% endfor %}
119
+ {% endif %}
120
+ [The whole conversation on {{ thread.post.label | escapeMarkdown }}]({{ thread.onPostUrl | markdownUrl }})
121
+
122
+ {% endif %}
123
+ {% if commentForm %}
124
+ ## Leave a comment
125
+
126
+ [Leave a comment on the web page]({{ commentForm.url }})
127
+
128
+ {% if webmention %}
129
+ Or reply from your own site and send a [webmention](https://indieweb.org/Webmention).
130
+
131
+ {% endif %}
132
+ {% endif %}
133
+ {% if contactForm %}
134
+ ## Send a message
135
+
136
+ [Send a message on the web page]({{ contactForm.url }})
137
+
138
+ {% endif %}
139
+ {% if feeds.length %}
140
+ ## Feeds
141
+
142
+ {% for feed in feeds %}
143
+ - [{{ (feed.label + " (" + feed.format + ")") | escapeMarkdown }}]({{ feed.url | markdownUrl }})
144
+ {% endfor %}
145
+
146
+ {% endif %}
29
147
  {% if byline or navigation.length %}
30
148
  ## {{ site.title | escapeMarkdown }}
31
149
 
@@ -15,11 +15,91 @@
15
15
  and a `url`). `staticFrontPage` is true on a homepage that is a page. This
16
16
  theme prints the bio there only when the homepage lists posts, as its HTML
17
17
  does (decision-45); a site theme may print it on a static homepage too.
18
+
19
+ A post then says what kind it is, with the data its HTML partials read.
20
+ `event` is an event's `start`, its `end` and its `location`, printed in the
21
+ site's zone as `event.njk` prints them. `cites` are what it answers or cites,
22
+ each a `verb`, a `url` and a `name`, as `reply-context.njk` and
23
+ `citations.njk` name them, with an `author` or `site`, an event's
24
+ `startDate` (in `startZone` when it has one), a `published` date, a
25
+ `location`, and a silo `copy`, each only when it is known. `review` is the
26
+ HTML's review with its words in plain text: `link`, `about`, `by`, `uid`
27
+ and `details`. `location` is where the post was written, only as far as
28
+ Settings > Privacy shares it, in the shape `location.njk` reads. `lang` is
29
+ the post's own language, which its dates are written in.
30
+
31
+ Then the post's recording and photos, in the order its HTML draws them.
32
+ `enclosure` is the object `recording.njk` reads: `player` (`audio` or
33
+ `video`), `url`, `type`, `length` in bytes (printed through `fileSize`), a
34
+ `transcript` with `url` and `captions`, and `alternates`, each a `url` and a
35
+ `type` with a `title` and a `length` when the front matter gives them.
36
+ `photos` are each a `url` and an `alt`, the alt text `photos.njk` prints.
37
+
38
+ `thread` is on a comment's own page, the chain `layouts/comment.njk` draws:
39
+ `post` (a `label`, a `url`, an `author` with a `label` and a `url`, a
40
+ `date` and a plain-text `summary`), then `ancestors`, the comments it
41
+ answers from the top of the thread down, each a reply as the footer's
42
+ conversation has one or `null` for one a reader may not see, then the
43
+ `comment` itself. The comment's words are the page's body, below this.
44
+ `quote` writes Markdown as a blockquote.
18
45
  #}
46
+ {% import "partials/markdown-reply.md.njk" as conversing with context %}
19
47
  {% if title %}
20
48
  # {{ title | escapeMarkdown }}
21
49
 
22
50
  {% endif %}
51
+ {% if event %}
52
+ When: {{ event.start | date("datetime", none, lang) }}{{ (" to " + (event.end | date("datetime", none, lang))) if event.end }}
53
+
54
+ {% if event.location %}
55
+ Where: {{ ("Online at [" + (event.location.url | host | escapeMarkdown) + "](" + (event.location.url | markdownUrl) + ")") if event.location.kind == "virtual" else (event.location.name | escapeMarkdown) }}
56
+
57
+ {% endif %}
58
+ {% endif %}
59
+ {% for cite in cites %}
60
+ {{ cite.verb }} [{{ cite.name | escapeMarkdown }}]({{ cite.url | markdownUrl }}){{ (" by " + (cite.author | escapeMarkdown)) if cite.author }}{{ (" · " + (cite.site | escapeMarkdown)) if cite.site }}{{ (", " + (cite.startDate | date("readable", cite.startZone, lang))) if cite.startDate }}{{ (", " + (cite.published | date("readable", none, lang))) if cite.published }}{{ (", " + (cite.location | escapeMarkdown)) if cite.location }}
61
+
62
+ {% if cite.copy %}
63
+ Also in reply to [its copy on {{ cite.copy | host | escapeMarkdown }}]({{ cite.copy }})
64
+
65
+ {% endif %}
66
+ {% endfor %}
67
+ {% if review %}
68
+ Review of {{ ("[" + (review.item.name | escapeMarkdown) + "](" + (review.link | markdownUrl) + ")") if review.link else (review.item.name | escapeMarkdown) }}{{ (" (" + (review.about | join(", ") | escapeMarkdown) + ")") if review.about.length }}{{ (", " + (review.by | escapeMarkdown)) if review.by }}{{ (", " + (review.uid | escapeMarkdown)) if review.uid }}
69
+
70
+ {% if review.details.length %}
71
+ {{ review.details | join(" ") | escapeMarkdown }}
72
+
73
+ {% endif %}
74
+ {% if review.rating %}
75
+ Rated {{ review.rating }} out of {{ review.best }}
76
+
77
+ {% endif %}
78
+ {% endif %}
79
+ {% if location %}
80
+ Location: {% for word in location.words %}{{ word.text | escapeMarkdown }}{{ ", " if not loop.last }}{% endfor %}{{ (location.geo.latitude + ", " + location.geo.longitude) if location.geo and not location.words.length }}
81
+
82
+ {% endif %}
83
+ {% if enclosure %}
84
+ [Download the {{ "video" if enclosure.player == "video" else "recording" }}]({{ enclosure.url | markdownUrl }}) ({{ enclosure.type }}, {{ enclosure.length | fileSize }})
85
+
86
+ {% if enclosure.transcript %}
87
+ [{{ "Captions" if enclosure.transcript.captions else "Transcript" }}]({{ enclosure.transcript.url | markdownUrl }})
88
+
89
+ {% endif %}
90
+ {% if enclosure.alternates.length %}
91
+ Other versions:
92
+
93
+ {% for alternate in enclosure.alternates %}
94
+ - [{{ (alternate.title or alternate.type) | escapeMarkdown }}]({{ alternate.url | markdownUrl }}){{ (" (" + ([alternate.type if alternate.title, alternate.length | fileSize] | select | join(", ")) + ")") if alternate.title or alternate.length }}
95
+ {% endfor %}
96
+
97
+ {% endif %}
98
+ {% endif %}
99
+ {% for photo in photos %}
100
+ ![{{ photo.alt | escapeMarkdown }}]({{ photo.url | markdownUrl }})
101
+
102
+ {% endfor %}
23
103
  {% if bio and not staticFrontPage %}
24
104
  {% if bio.note %}
25
105
  {{ bio.note | escapeMarkdown }}
@@ -29,3 +109,25 @@
29
109
  - [{{ link.label | escapeMarkdown }}]({{ link.url | markdownUrl }})
30
110
  {% endfor %}
31
111
  {% endif %}
112
+ {% if thread %}
113
+ On [{{ thread.post.label | escapeMarkdown }}]({{ thread.post.url | markdownUrl }}){{ (" by " + conversing.named(thread.post.author)) if thread.post.author }}{{ (", " + (thread.post.date | date)) if thread.post.date }}
114
+
115
+ {% if thread.post.summary %}
116
+ {{ thread.post.summary | escapeMarkdown | quote }}
117
+
118
+ {% endif %}
119
+ {% for step in thread.ancestors %}
120
+ {% if step %}
121
+ In reply to {{ conversing.said(step) }}
122
+
123
+ {% if step.text %}
124
+ {{ step.text | quote }}
125
+
126
+ {% endif %}
127
+ {% else %}
128
+ In reply to a comment that is no longer shown.
129
+
130
+ {% endif %}
131
+ {% endfor %}
132
+ {{ conversing.said(thread.comment) }}
133
+ {% endif %}
@@ -0,0 +1,31 @@
1
+ {#
2
+ The macros the Markdown header and footer write a conversation with,
3
+ imported `with context` so `markdownUrl` gives a page of the site its `.md`.
4
+
5
+ `named(person)` is a person as a link, or their name when they have no URL.
6
+ `said(entry)` is a reply's byline: its author, its date linked to where it
7
+ can be read, and where it came from when that was not the comment form.
8
+ `reply(entry)` is a reply as a list item, its words and its own replies
9
+ indented under it, or the placeholder for a hidden one.
10
+ #}
11
+ {% macro named(person) %}{{ ("[" + (person.label | escapeMarkdown) + "](" + (person.url | markdownUrl) + ")") if person.url else (person.label | escapeMarkdown) }}{% endmacro %}
12
+ {% macro said(entry) %}{{ named(entry.author) }}, {{ ("[" + (entry.published | date) + "](" + (entry.url | markdownUrl) + ")") if entry.url else (entry.published | date) }}{{ ", via webmention" if entry.source == "webmention" }}{{ ", via the fediverse" if entry.source == "activitypub" }}{% endmacro %}
13
+ {% macro reply(entry) %}
14
+ {% if entry.withheld %}
15
+ - This comment is no longer shown.
16
+ {% else %}
17
+ - {{ said(entry) }}
18
+ {% if entry.rsvp %}
19
+
20
+ {{ entry.rsvp.label | escapeMarkdown }}
21
+ {% endif %}
22
+ {% if entry.text %}
23
+
24
+ {{ entry.text | nest(2) }}
25
+ {% endif %}
26
+ {% endif %}
27
+ {% for child in entry.replies %}
28
+
29
+ {{ reply(child) | trim | nest(2) }}
30
+ {% endfor %}
31
+ {% endmacro %}