@geekity/cms 0.17.0 → 0.19.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/README.md +163 -50
  2. package/admin/components/public-admin-bar.njk +3 -1
  3. package/admin/pages/documents/editor.njk +286 -158
  4. package/admin/pages/documents/list.njk +2 -0
  5. package/admin/pages/indieauth/consent.njk +4 -0
  6. package/admin/pages/settings/privacy.njk +37 -0
  7. package/admin/pages/users/apps.njk +109 -3
  8. package/admin/static/admin.css +37 -14
  9. package/dist/admin/documents.d.ts +34 -4
  10. package/dist/admin/documents.d.ts.map +1 -1
  11. package/dist/admin/documents.js +161 -23
  12. package/dist/admin/documents.js.map +1 -1
  13. package/dist/admin/editor-layout.d.ts +13 -0
  14. package/dist/admin/editor-layout.d.ts.map +1 -0
  15. package/dist/admin/editor-layout.js +61 -0
  16. package/dist/admin/editor-layout.js.map +1 -0
  17. package/dist/admin/enclosure-field.d.ts +2 -3
  18. package/dist/admin/enclosure-field.d.ts.map +1 -1
  19. package/dist/admin/enclosure-field.js +27 -7
  20. package/dist/admin/enclosure-field.js.map +1 -1
  21. package/dist/admin/index.d.ts +1 -0
  22. package/dist/admin/index.d.ts.map +1 -1
  23. package/dist/admin/index.js +1 -0
  24. package/dist/admin/index.js.map +1 -1
  25. package/dist/admin/location-field.d.ts +27 -0
  26. package/dist/admin/location-field.d.ts.map +1 -0
  27. package/dist/admin/location-field.js +98 -0
  28. package/dist/admin/location-field.js.map +1 -0
  29. package/dist/admin/menu.d.ts.map +1 -1
  30. package/dist/admin/menu.js +1 -0
  31. package/dist/admin/menu.js.map +1 -1
  32. package/dist/admin/photo-field.d.ts +2 -3
  33. package/dist/admin/photo-field.d.ts.map +1 -1
  34. package/dist/admin/photo-field.js +4 -2
  35. package/dist/admin/photo-field.js.map +1 -1
  36. package/dist/admin/preview.d.ts.map +1 -1
  37. package/dist/admin/preview.js +18 -5
  38. package/dist/admin/preview.js.map +1 -1
  39. package/dist/admin/read-field.d.ts +22 -0
  40. package/dist/admin/read-field.d.ts.map +1 -0
  41. package/dist/admin/read-field.js +61 -0
  42. package/dist/admin/read-field.js.map +1 -0
  43. package/dist/admin/settings-page.d.ts +3 -3
  44. package/dist/admin/settings-page.js +2 -2
  45. package/dist/admin/settings-pages.d.ts +2 -2
  46. package/dist/admin/settings-pages.d.ts.map +1 -1
  47. package/dist/admin/settings-pages.js +4 -2
  48. package/dist/admin/settings-pages.js.map +1 -1
  49. package/dist/admin/settings-privacy.d.ts +3 -0
  50. package/dist/admin/settings-privacy.d.ts.map +1 -0
  51. package/dist/admin/settings-privacy.js +10 -0
  52. package/dist/admin/settings-privacy.js.map +1 -0
  53. package/dist/admin/settings-reading.js +2 -2
  54. package/dist/admin/settings-reading.js.map +1 -1
  55. package/dist/admin/settings.d.ts +18 -2
  56. package/dist/admin/settings.d.ts.map +1 -1
  57. package/dist/admin/settings.js +27 -0
  58. package/dist/admin/settings.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 +1 -0
  62. package/dist/admin/templates.js.map +1 -1
  63. package/dist/admin/uploads.d.ts.map +1 -1
  64. package/dist/admin/uploads.js +14 -1
  65. package/dist/admin/uploads.js.map +1 -1
  66. package/dist/cli.d.ts +1 -1
  67. package/dist/cli.d.ts.map +1 -1
  68. package/dist/cli.js +34 -0
  69. package/dist/cli.js.map +1 -1
  70. package/dist/comments/routes.js +2 -2
  71. package/dist/comments/routes.js.map +1 -1
  72. package/dist/contact/routes.js +2 -2
  73. package/dist/contact/routes.js.map +1 -1
  74. package/dist/content/kept-properties.d.ts +5 -0
  75. package/dist/content/kept-properties.d.ts.map +1 -0
  76. package/dist/content/kept-properties.js +12 -0
  77. package/dist/content/kept-properties.js.map +1 -0
  78. package/dist/content/location.d.ts +62 -0
  79. package/dist/content/location.d.ts.map +1 -0
  80. package/dist/content/location.js +240 -0
  81. package/dist/content/location.js.map +1 -0
  82. package/dist/content/locations.d.ts +6 -0
  83. package/dist/content/locations.d.ts.map +1 -0
  84. package/dist/content/locations.js +7 -0
  85. package/dist/content/locations.js.map +1 -0
  86. package/dist/content/metadata/gif.d.ts +3 -0
  87. package/dist/content/metadata/gif.d.ts.map +1 -0
  88. package/dist/content/metadata/gif.js +65 -0
  89. package/dist/content/metadata/gif.js.map +1 -0
  90. package/dist/content/metadata/index.d.ts +6 -0
  91. package/dist/content/metadata/index.d.ts.map +1 -0
  92. package/dist/content/metadata/index.js +24 -0
  93. package/dist/content/metadata/index.js.map +1 -0
  94. package/dist/content/metadata/isobmff.d.ts +22 -0
  95. package/dist/content/metadata/isobmff.d.ts.map +1 -0
  96. package/dist/content/metadata/isobmff.js +215 -0
  97. package/dist/content/metadata/isobmff.js.map +1 -0
  98. package/dist/content/metadata/jpeg.d.ts +3 -0
  99. package/dist/content/metadata/jpeg.d.ts.map +1 -0
  100. package/dist/content/metadata/jpeg.js +117 -0
  101. package/dist/content/metadata/jpeg.js.map +1 -0
  102. package/dist/content/metadata/png.d.ts +3 -0
  103. package/dist/content/metadata/png.d.ts.map +1 -0
  104. package/dist/content/metadata/png.js +74 -0
  105. package/dist/content/metadata/png.js.map +1 -0
  106. package/dist/content/metadata/shared.d.ts +17 -0
  107. package/dist/content/metadata/shared.d.ts.map +1 -0
  108. package/dist/content/metadata/shared.js +42 -0
  109. package/dist/content/metadata/shared.js.map +1 -0
  110. package/dist/content/metadata/sweep.d.ts +14 -0
  111. package/dist/content/metadata/sweep.d.ts.map +1 -0
  112. package/dist/content/metadata/sweep.js +54 -0
  113. package/dist/content/metadata/sweep.js.map +1 -0
  114. package/dist/content/metadata/tiff.d.ts +7 -0
  115. package/dist/content/metadata/tiff.d.ts.map +1 -0
  116. package/dist/content/metadata/tiff.js +56 -0
  117. package/dist/content/metadata/tiff.js.map +1 -0
  118. package/dist/content/metadata/webp.d.ts +3 -0
  119. package/dist/content/metadata/webp.d.ts.map +1 -0
  120. package/dist/content/metadata/webp.js +67 -0
  121. package/dist/content/metadata/webp.js.map +1 -0
  122. package/dist/content/permalink-file.d.ts +7 -0
  123. package/dist/content/permalink-file.d.ts.map +1 -0
  124. package/dist/content/permalink-file.js +77 -0
  125. package/dist/content/permalink-file.js.map +1 -0
  126. package/dist/content/post-type.d.ts +4 -2
  127. package/dist/content/post-type.d.ts.map +1 -1
  128. package/dist/content/post-type.js +9 -1
  129. package/dist/content/post-type.js.map +1 -1
  130. package/dist/content/read.d.ts +22 -0
  131. package/dist/content/read.d.ts.map +1 -0
  132. package/dist/content/read.js +67 -0
  133. package/dist/content/read.js.map +1 -0
  134. package/dist/content/store.d.ts +4 -4
  135. package/dist/content/store.d.ts.map +1 -1
  136. package/dist/content/store.js +19 -39
  137. package/dist/content/store.js.map +1 -1
  138. package/dist/content/sync.d.ts.map +1 -1
  139. package/dist/content/sync.js +3 -13
  140. package/dist/content/sync.js.map +1 -1
  141. package/dist/content/visibility.d.ts +11 -0
  142. package/dist/content/visibility.d.ts.map +1 -0
  143. package/dist/content/visibility.js +14 -0
  144. package/dist/content/visibility.js.map +1 -0
  145. package/dist/federation/article.d.ts +4 -3
  146. package/dist/federation/article.d.ts.map +1 -1
  147. package/dist/federation/article.js +66 -20
  148. package/dist/federation/article.js.map +1 -1
  149. package/dist/federation/citations.d.ts +7 -6
  150. package/dist/federation/citations.d.ts.map +1 -1
  151. package/dist/federation/citations.js +44 -28
  152. package/dist/federation/citations.js.map +1 -1
  153. package/dist/federation/delivery.d.ts +3 -1
  154. package/dist/federation/delivery.d.ts.map +1 -1
  155. package/dist/federation/delivery.js +29 -21
  156. package/dist/federation/delivery.js.map +1 -1
  157. package/dist/federation/mount.d.ts.map +1 -1
  158. package/dist/federation/mount.js +3 -1
  159. package/dist/federation/mount.js.map +1 -1
  160. package/dist/index.d.ts +6 -5
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +5 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/indexnow.js +2 -2
  165. package/dist/indexnow.js.map +1 -1
  166. package/dist/indieauth/activity-log.d.ts +2 -0
  167. package/dist/indieauth/activity-log.d.ts.map +1 -1
  168. package/dist/indieauth/activity-log.js +12 -2
  169. package/dist/indieauth/activity-log.js.map +1 -1
  170. package/dist/indieauth/app-activity.js +5 -1
  171. package/dist/indieauth/app-activity.js.map +1 -1
  172. package/dist/indieauth/bearer.d.ts +10 -6
  173. package/dist/indieauth/bearer.d.ts.map +1 -1
  174. package/dist/indieauth/bearer.js +28 -25
  175. package/dist/indieauth/bearer.js.map +1 -1
  176. package/dist/indieauth/client-id.d.ts +10 -0
  177. package/dist/indieauth/client-id.d.ts.map +1 -0
  178. package/dist/indieauth/client-id.js +30 -0
  179. package/dist/indieauth/client-id.js.map +1 -0
  180. package/dist/indieauth/connected-apps.d.ts +4 -0
  181. package/dist/indieauth/connected-apps.d.ts.map +1 -1
  182. package/dist/indieauth/connected-apps.js +149 -20
  183. package/dist/indieauth/connected-apps.js.map +1 -1
  184. package/dist/indieauth/consent.d.ts.map +1 -1
  185. package/dist/indieauth/consent.js +5 -1
  186. package/dist/indieauth/consent.js.map +1 -1
  187. package/dist/indieauth/grants.d.ts +2 -7
  188. package/dist/indieauth/grants.d.ts.map +1 -1
  189. package/dist/indieauth/grants.js.map +1 -1
  190. package/dist/indieauth/redeem.d.ts.map +1 -1
  191. package/dist/indieauth/redeem.js +10 -5
  192. package/dist/indieauth/redeem.js.map +1 -1
  193. package/dist/indieauth/request.d.ts +8 -4
  194. package/dist/indieauth/request.d.ts.map +1 -1
  195. package/dist/indieauth/request.js +29 -30
  196. package/dist/indieauth/request.js.map +1 -1
  197. package/dist/indieauth/token.js +2 -2
  198. package/dist/indieauth/token.js.map +1 -1
  199. package/dist/indieauth/tokens.d.ts +28 -7
  200. package/dist/indieauth/tokens.d.ts.map +1 -1
  201. package/dist/indieauth/tokens.js +26 -5
  202. package/dist/indieauth/tokens.js.map +1 -1
  203. package/dist/micropub/create.d.ts +26 -0
  204. package/dist/micropub/create.d.ts.map +1 -1
  205. package/dist/micropub/create.js +158 -13
  206. package/dist/micropub/create.js.map +1 -1
  207. package/dist/micropub/endpoint.d.ts +4 -5
  208. package/dist/micropub/endpoint.d.ts.map +1 -1
  209. package/dist/micropub/endpoint.js +83 -25
  210. package/dist/micropub/endpoint.js.map +1 -1
  211. package/dist/micropub/media.d.ts +6 -2
  212. package/dist/micropub/media.d.ts.map +1 -1
  213. package/dist/micropub/media.js +43 -37
  214. package/dist/micropub/media.js.map +1 -1
  215. package/dist/micropub/update.d.ts +13 -3
  216. package/dist/micropub/update.d.ts.map +1 -1
  217. package/dist/micropub/update.js +60 -7
  218. package/dist/micropub/update.js.map +1 -1
  219. package/dist/notify.d.ts.map +1 -1
  220. package/dist/notify.js +2 -5
  221. package/dist/notify.js.map +1 -1
  222. package/dist/web/absolute-urls.d.ts +2 -0
  223. package/dist/web/absolute-urls.d.ts.map +1 -0
  224. package/dist/web/absolute-urls.js +22 -0
  225. package/dist/web/absolute-urls.js.map +1 -0
  226. package/dist/web/admin-bar.d.ts.map +1 -1
  227. package/dist/web/admin-bar.js +25 -0
  228. package/dist/web/admin-bar.js.map +1 -1
  229. package/dist/web/context.d.ts +29 -1
  230. package/dist/web/context.d.ts.map +1 -1
  231. package/dist/web/context.js +33 -0
  232. package/dist/web/context.js.map +1 -1
  233. package/dist/web/conversation.d.ts.map +1 -1
  234. package/dist/web/conversation.js +5 -4
  235. package/dist/web/conversation.js.map +1 -1
  236. package/dist/web/documents.d.ts +34 -10
  237. package/dist/web/documents.d.ts.map +1 -1
  238. package/dist/web/documents.js +41 -15
  239. package/dist/web/documents.js.map +1 -1
  240. package/dist/web/feed-item.d.ts +25 -6
  241. package/dist/web/feed-item.d.ts.map +1 -1
  242. package/dist/web/feed-item.js +31 -7
  243. package/dist/web/feed-item.js.map +1 -1
  244. package/dist/web/feed-json.d.ts +3 -1
  245. package/dist/web/feed-json.d.ts.map +1 -1
  246. package/dist/web/feed-json.js +2 -0
  247. package/dist/web/feed-json.js.map +1 -1
  248. package/dist/web/feed-source.d.ts +6 -0
  249. package/dist/web/feed-source.d.ts.map +1 -1
  250. package/dist/web/feed-source.js.map +1 -1
  251. package/dist/web/feeds.d.ts.map +1 -1
  252. package/dist/web/feeds.js +2 -0
  253. package/dist/web/feeds.js.map +1 -1
  254. package/dist/web/html-attributes.d.ts +3 -0
  255. package/dist/web/html-attributes.d.ts.map +1 -0
  256. package/dist/web/html-attributes.js +15 -0
  257. package/dist/web/html-attributes.js.map +1 -0
  258. package/dist/web/index.d.ts +1 -1
  259. package/dist/web/index.d.ts.map +1 -1
  260. package/dist/web/index.js +1 -1
  261. package/dist/web/index.js.map +1 -1
  262. package/dist/web/negotiate.d.ts +2 -0
  263. package/dist/web/negotiate.d.ts.map +1 -1
  264. package/dist/web/negotiate.js +2 -1
  265. package/dist/web/negotiate.js.map +1 -1
  266. package/dist/web/render.d.ts +13 -4
  267. package/dist/web/render.d.ts.map +1 -1
  268. package/dist/web/render.js +25 -12
  269. package/dist/web/render.js.map +1 -1
  270. package/dist/web/routes.d.ts.map +1 -1
  271. package/dist/web/routes.js +26 -11
  272. package/dist/web/routes.js.map +1 -1
  273. package/dist/webmention/fetch-public.d.ts +3 -1
  274. package/dist/webmention/fetch-public.d.ts.map +1 -1
  275. package/dist/webmention/fetch-public.js +17 -11
  276. package/dist/webmention/fetch-public.js.map +1 -1
  277. package/dist/webmention/reply-context.d.ts +18 -5
  278. package/dist/webmention/reply-context.d.ts.map +1 -1
  279. package/dist/webmention/reply-context.js +118 -19
  280. package/dist/webmention/reply-context.js.map +1 -1
  281. package/dist/webmention/reply-contexts.d.ts +17 -14
  282. package/dist/webmention/reply-contexts.d.ts.map +1 -1
  283. package/dist/webmention/reply-contexts.js +32 -21
  284. package/dist/webmention/reply-contexts.js.map +1 -1
  285. package/dist/webmention/service.d.ts.map +1 -1
  286. package/dist/webmention/service.js +7 -2
  287. package/dist/webmention/service.js.map +1 -1
  288. package/package.json +9 -9
  289. package/themes/default/README.md +45 -7
  290. package/themes/default/layouts/base.njk +2 -0
  291. package/themes/default/layouts/post.njk +12 -7
  292. package/themes/default/partials/citations.njk +12 -3
  293. package/themes/default/partials/cited-page.njk +41 -0
  294. package/themes/default/partials/location.njk +12 -0
  295. package/themes/default/partials/post-list.njk +10 -5
  296. package/themes/default/partials/read.njk +5 -0
  297. package/themes/default/partials/reply-context.njk +2 -9
@@ -26,6 +26,8 @@ themes/default/
26
26
  kicker.njk the line above an entry naming its kind and date
27
27
  reply-context.njk the citation of what a reply answers
28
28
  citations.njk the citation of what a like, repost or bookmark cites
29
+ cited-page.njk the name and author both citations print
30
+ read.njk what a read post read, and how far
29
31
  bio.njk who an entry is by, as an h-card
30
32
  menu.njk one named menu, as a nav of links
31
33
  feeds.njk macros for the feed links in <head>
@@ -404,16 +406,49 @@ is an `h3` inside the form's section.
404
406
  `div.reply-context.cite.u-in-reply-to.h-cite`: a rule on the start side, a
405
407
  `p.cite-line` saying "In reply to" and the target's name, author and date as
406
408
  far as they are known, and its excerpt as a `blockquote.cite-quote.p-content`.
407
- An untitled reply prints it under the kicker; a titled reply prints it above
408
- its header. The same partial cites a reply in a feed.
409
+ Where it goes depends on whether the post shows a title. An untitled reply
410
+ opens on it, under the kicker and before its words. A titled reply prints its
411
+ `header.post-header` first and the citation after it, before the `e-content`,
412
+ so the page opens on its title rather than on a link. A listing follows the
413
+ same rule: an untitled entry cites under its kicker, a titled one after its
414
+ title and summary. The same partial cites a reply in a feed. The layouts own
415
+ the placement; the partial owns only what the citation says, and it stays
416
+ inside the `h-entry` wherever it is printed.
409
417
 
410
418
  **A like, a repost or a bookmark cites what it cites** (TASK-169) with
411
419
  `partials/citations.njk`, beside the reply context and drawn the same way: one
412
420
  `div.reply-context.cite.h-cite` per entry of `citations`, classed
413
421
  `u-repost-of`, `u-like-of` or `u-bookmark-of`, whose `p.cite-line` says
414
- Reposted, Liked or Bookmarked and links the target as its `u-url`. Its kicker
415
- and its hidden `h1` say Repost, Like or Bookmark. A listing cites each entry's
416
- from the same partial.
422
+ Reposted, Liked or Bookmarked and links the target as its `u-url`. The link
423
+ says the target's name, as the reply context does, with its author after it as
424
+ a `p-author h-card`, when the target was read when the post was saved
425
+ (TASK-244): its `h-entry` name, its oEmbed title, or its `<title>`. With only
426
+ an author it says "a post", and with neither the bare URL. Its kicker
427
+ and its hidden `h1` say Repost, Like or Bookmark. It is placed as the reply
428
+ context is: at the top of an untitled post, after the header of a titled one.
429
+ A listing cites each entry's from the same partial, by the same rule.
430
+
431
+ **Both citations name the cited page** through `partials/cited-page.njk`, so
432
+ they print its name and author by one rule. A name that already ends in " by "
433
+ and the author's name, in any case, does not print the author again
434
+ (TASK-247): SoundCloud titles a track "Flickermood by Forss" and names Forss
435
+ as its author. The title link stops before " by ", and the words after it
436
+ become the `p-author h-card`, so the line reads "Liked Flickermood by Forss"
437
+ and a parser still reads the whole title as the `p-name`. A name that mentions
438
+ its author anywhere else, such as "Rick Astley - Never Gonna Give You Up" by
439
+ Rick Astley, keeps the author after it.
440
+
441
+ **A read says what was read** (TASK-229) with `partials/read.njk`, a
442
+ `p.read-line` at the top of the `e-content` that reads like indiebookclub's
443
+ own: a `data.p-read-status` whose value is `to-read`, `reading` or `finished`
444
+ and whose text is Want to read, Currently reading or Finished reading, then a
445
+ `span.p-read-of.h-cite` with the title as a `cite.p-name` (linked as its
446
+ `u-url` when the post gives one), the author as a `p-author`, and the
447
+ identifier as a `data.p-uid` whose value is the `isbn:` or `doi:` uid. Its
448
+ kicker and its hidden `h1` say Read. A listing prints each entry's from the
449
+ same partial. The partial prints `read.line`, the same HTML the feeds and the
450
+ federated Note open with (TASK-233); `read.status`, `read.statusLabel` and
451
+ `read.of` are there for a theme that marks it up differently.
417
452
 
418
453
  The tags are printed under the words and inside the article, so that each link
419
454
  is a `p-category` of this entry, as one `p.post-categories` from
@@ -589,7 +624,8 @@ its kicker:
589
624
  **Only an article has a headline.** A note, which has no title, is printed
590
625
  whole as its `e-content`, and the date in its kicker is its `u-url`. A reply is
591
626
  a note that first cites what it answers with `partials/reply-context.njk`, and
592
- a reply with a title is an article that does. An article's categories are in
627
+ a reply with a title is an article that cites it after its title and summary.
628
+ A like, a repost and a bookmark place `partials/citations.njk` the same way. An article's categories are in
593
629
  its kicker; a note's are on its own page.
594
630
 
595
631
  The excerpt is the entry's `summary`, the very line the feeds publish, so a
@@ -1166,7 +1202,8 @@ A document — one post, one page, or one entry of a listing — adds:
1166
1202
  | `lang` | The `lang` front matter as a canonical tag, such as `fr-CA`. Absent when it names none or no tag. |
1167
1203
  | `enclosure` | The post's recording, parsed, with `player` (`audio` or `video`) and `transcript.captions`. Absent with none. |
1168
1204
  | `photos` | The post's photos, each `{ url, alt, html }`; `html` is the `img.u-photo`, responsive. Empty with none. |
1169
- | `citations` | What it reposts, likes or bookmarks, each `{ property, url }` with `property` the mf2 name. Empty with none. |
1205
+ | `citations` | What it reposts, likes or bookmarks, each `{ property, url, context }`; `context` as `replyContext`, when known. |
1206
+ | `read` | A read post's `{ status, statusLabel, of, line }`; `of` is `{ name, author, uid, uidLabel, url }`. |
1170
1207
  | `syndicateTo` | On a post's page, the syndication targets it selects, each `{ id, name, url }`. Empty with none. |
1171
1208
  | `syndication` | Its copies elsewhere, each `{ url, label }`: front matter `syndication`, and on its page the copies targets made. |
1172
1209
  | `author` | Who wrote it, as a profile rather than a string. See [Bylines and author archives](#bylines-and-author-archives). |
@@ -1177,6 +1214,7 @@ A document — one post, one page, or one entry of a listing — adds:
1177
1214
  | `postsPage` | The page carrying the listing, as `{ title, url }`, on the front page only. Absent when the site names none. |
1178
1215
  | `archiveMonths` | Every published post as `{ month, posts }`, newest month first. Only on a page that says `archive: true`. |
1179
1216
  | `webmention` | Where a webmention about this page is sent. Only on a rendered document, and only while the site takes them. |
1217
+ | `noindex` | `true` on an unlisted or unpublished page, which the base layout prints as a robots `noindex` meta. Else absent. |
1180
1218
  | `conversation` | The replies, likes and boosts under the post. Only when there are any. See [The conversation](#the-conversation). |
1181
1219
  | everything else | Any front matter key the CMS does not model is on the context under its own name. |
1182
1220
 
@@ -99,6 +99,8 @@
99
99
  <title>{% block title %}{% if pageTitle %}{{ pageTitle }} &middot; {% endif %}{{ site.title }}{% endblock %}</title>
100
100
  {% if metaDescription %}
101
101
  <meta name="description" content="{{ metaDescription }}">
102
+ {% endif %}{% if noindex %}
103
+ <meta name="robots" content="noindex">
102
104
  {% endif %}
103
105
  <link rel="canonical" href="{{ (page.url or "/") | absoluteUrl }}">
104
106
  <link rel="stylesheet" href="{{ "style.css" | asset }}">
@@ -5,8 +5,9 @@
5
5
 
6
6
  An article, and a reply with a title, has the only headline: the title as its
7
7
  `p-name` and the author's `description` under it as the deck, a
8
- `p-summary`. A post with no title opens on its words, set larger. A reply
9
- cites what it answers above its words, or above its header when it has one.
8
+ `p-summary`. A post with no title opens on its words, set larger. What a
9
+ reply answers, and what a like, repost or bookmark cites, opens a post with
10
+ no title and follows the header of one with a title, before its words.
10
11
  Then the Published line, the tags, a rule and the bio. The neighbouring posts,
11
12
  the conversation and the comment form follow the entry.
12
13
 
@@ -36,10 +37,6 @@
36
37
  hidden from sight. It is no `p-name`: a parser would take that as a
37
38
  title and read the note as an article. -#}
38
39
  {% if named %}
39
- {#- A reply cites the post it answers, whose URL is also the link its
40
- webmention points a receiver at. -#}
41
- {% include "partials/reply-context.njk" %}
42
- {% include "partials/citations.njk" %}
43
40
  <header class="post-header">
44
41
  {{ kicker.line(postType | capitalize, false, false, categories) }}
45
42
  <h1 class="p-name">{{ title }}</h1>
@@ -47,9 +44,11 @@
47
44
  <p class="post-deck p-summary">{{ description }}</p>
48
45
  {% endif %}
49
46
  </header>
47
+ {% include "partials/reply-context.njk" %}
48
+ {% include "partials/citations.njk" %}
50
49
  {% else %}
51
50
  <h1 class="screen-reader-text">
52
- {{- postType | capitalize if postType in ["reply", "like", "repost", "bookmark"] else "Note" }}
51
+ {{- postType | capitalize if postType in ["reply", "like", "repost", "bookmark", "read"] else "Note" }}
53
52
  {%- if bioAuthor.name %} by {{ bioAuthor.name }}{% endif %}
54
53
  {%- if date %}, {{ date | date("readable", none, lang) }}{% endif -%}
55
54
  </h1>
@@ -67,6 +66,9 @@
67
66
  {% endif %}
68
67
 
69
68
  <section class="e-content">
69
+ {#- Inside the content, so a parser that reads only the content of a
70
+ read, as a webmention receiver does, has its sentence. -#}
71
+ {% include "partials/read.njk" %}
70
72
  {{ content | safe }}
71
73
  <p class="entry-meta">
72
74
  {#- The line opens with a link to each syndication target the post
@@ -89,6 +91,9 @@
89
91
  {%- if syndication.length %}
90
92
  {% if date or updated %} <span aria-hidden="true">·</span> {% endif %}<span class="small">Also on {% for copy in syndication %}<a class="u-syndication" href="{{ copy.url }}">{{ copy.label }}</a>{% if not loop.last %}, {% endif %}{% endfor %}</span>
91
93
  {%- endif -%}
94
+ {%- if location %}
95
+ {% if date or updated or syndication.length %} <span aria-hidden="true">·</span> {% endif %}<span class="small">{% include "partials/location.njk" %}</span>
96
+ {%- endif -%}
92
97
  </p>
93
98
  </section>
94
99
 
@@ -6,12 +6,21 @@
6
6
  webmention names links to it.
7
7
 
8
8
  Drawn as the same citation block as `reply-context.njk` (doc-9). An entry
9
- includes it with `citations` on the context, a list of `{ property, url }`;
10
- a feed sets it from the entry it is printing.
9
+ includes it with `citations` on the context, a list of `{ property, url,
10
+ context }`; a feed sets it from the entry it is printing.
11
+
12
+ `context` is what the target said about itself when the post was saved or
13
+ synced (TASK-244), only when it said something: its `name` and `author`,
14
+ printed through autoescaping like a reply's context. With a name, the name
15
+ is the link; with only an author, "a post" is; with neither, the bare URL.
11
16
  #}
17
+ {% import "partials/cited-page.njk" as cited %}
12
18
  {% set citationVerbs = { "repost-of": "Reposted", "like-of": "Liked", "bookmark-of": "Bookmarked" } %}
13
19
  {% for citation in citations %}
20
+ {% set citedPage = citation.context %}
14
21
  <div class="reply-context cite u-{{ citation.property }} h-cite">
15
- <p class="cite-line small">{{ citationVerbs[citation.property] }} <a class="u-url" href="{{ citation.url }}">{{ citation.url }}</a></p>
22
+ <p class="cite-line small">{{ citationVerbs[citation.property] }}
23
+ {{- cited.page(citation.url, citedPage) -}}
24
+ </p>
16
25
  </div>
17
26
  {% endfor %}
@@ -0,0 +1,41 @@
1
+ {#
2
+ What a citation says of the page it cites: its name and its author, the part
3
+ of the line after "In reply to", "Liked" and the rest. Shared by
4
+ `reply-context.njk` and `citations.njk` (TASK-247).
5
+
6
+ {% import "partials/cited-page.njk" as cited %}
7
+ {{ cited.page(inReplyTo, replyContext) }}
8
+
9
+ `url` is the cited page, always its `u-url`. `context` is what the page said
10
+ about itself, from the reply contexts file. With a name, the name is the
11
+ link; with only an author, "a post" is; with neither, the bare URL. The
12
+ author follows as an `h-card`.
13
+
14
+ A name that already ends in " by " and the author's name, matched without
15
+ regard to case (SoundCloud's oEmbed gives "Flickermood by Forss" by Forss),
16
+ is not followed by the author again. Its last words become the `h-card`,
17
+ printed as the title wrote them, and the whole name stays the `p-name`, so a
18
+ parser reads the same name and author either way.
19
+ #}
20
+ {% macro page(url, context) %}
21
+ {%- set title = (context.name or "") | trim -%}
22
+ {%- set author = (context.author.name or "") | trim if context.author else "" -%}
23
+ {%- set cut = title.length - author.length - 4 -%}
24
+ {%- set byline = title.slice(cut) if (author and cut > 0) else "" -%}
25
+ {%- set named = byline and byline.slice(0, 4).toLowerCase() == " by " and byline.slice(4).toLowerCase() == author.toLowerCase() -%}
26
+ {%- if named %} <span class="p-name"><a class="u-url" href="{{ url }}">{{ title.slice(0, cut) }}</a>{{ byline.slice(0, 4) }}{{ card(context.author, byline.slice(4)) }}</span>
27
+ {%- else %}
28
+ {%- if context.name %} <a class="u-url p-name" href="{{ url }}">{{ context.name }}</a>
29
+ {%- elif context.author %} <a class="u-url" href="{{ url }}">a post</a>
30
+ {%- else %} <a class="u-url" href="{{ url }}">{{ url }}</a>
31
+ {%- endif %}
32
+ {%- if context.author %} by {{ card(context.author, context.author.name) }}{% endif %}
33
+ {%- endif %}
34
+ {%- endmacro %}
35
+
36
+ {% macro card(author, name) -%}
37
+ <span class="p-author h-card">
38
+ {%- if author.url %}<a class="u-url p-name" href="{{ author.url }}">{{ name }}</a>
39
+ {%- else %}<span class="p-name">{{ name }}</span>{% endif -%}
40
+ </span>
41
+ {%- endmacro %}
@@ -0,0 +1,12 @@
1
+ <span class="p-location {{ location.type }}">
2
+ {%- for word in location.words -%}
3
+ <span class="{{ word.property }}">{{ word.text }}</span>{% if not loop.last %}, {% endif %}
4
+ {%- endfor -%}
5
+ {%- if location.geo -%}
6
+ {%- if location.words.length -%}
7
+ <data class="p-latitude" value="{{ location.geo.latitude }}"></data><data class="p-longitude" value="{{ location.geo.longitude }}"></data>
8
+ {%- else -%}
9
+ <data class="p-latitude" value="{{ location.geo.latitude }}">{{ location.geo.latitude }}</data>, <data class="p-longitude" value="{{ location.geo.longitude }}">{{ location.geo.longitude }}</data>
10
+ {%- endif -%}
11
+ {%- endif -%}
12
+ </span>
@@ -8,9 +8,10 @@
8
8
  categories it is filed under in its kicker. A note, which has no title, is
9
9
  printed whole as its `e-content`, and its date in the kicker is the link to
10
10
  it. A reply is a note that first cites what it answers, and a reply with a
11
- title is an article that does. Tags are deliberately not here: an entry's
12
- tags belong under the entry, and a feed of twenty posts listing everyone's
13
- would be a wall of links rather than a list of writing.
11
+ title is an article that cites it after its title and summary; a like, a
12
+ repost and a bookmark cite theirs the same way. Tags are deliberately not
13
+ here: an entry's tags belong under the entry, and a feed of twenty posts
14
+ listing everyone's would be a wall of links rather than a list of writing.
14
15
 
15
16
  `feedHeading` is the heading level, which belongs to the layout rather than
16
17
  to the list: a listing is a page of entries and heads each one at 2, and a
@@ -32,16 +33,19 @@
32
33
  {% else %}
33
34
  {{ kicker.line(post.postType | capitalize, post.date, post.url, [], post.label, lang=post.lang) }}
34
35
  {% endif %}
35
- {#- What a reply answers, from the same partial an entry cites it with. -#}
36
+ {% set cited %}
36
37
  {% if post.inReplyTo %}
37
38
  {% set inReplyTo = post.inReplyTo %}
38
39
  {% set replyContext = post.replyContext %}
39
40
  {% set lang = post.lang %}
40
41
  {% include "partials/reply-context.njk" %}
41
42
  {% endif %}
42
- {#- What it reposts, likes or bookmarks, from the partial an entry uses. -#}
43
43
  {% set citations = post.citations %}
44
44
  {% include "partials/citations.njk" %}
45
+ {% endset %}
46
+ {% if not post.named %}{{ cited | safe }}{% endif %}
47
+ {% set read = post.read %}
48
+ {% include "partials/read.njk" %}
45
49
  {% if post.photos.length %}
46
50
  {% set photos = post.photos %}
47
51
  {% include "partials/photos.njk" %}
@@ -60,6 +64,7 @@
60
64
  <p>{{ post.summary | truncate(280) }}</p>
61
65
  </div>
62
66
  {% endif %}
67
+ {{ cited | safe }}
63
68
  <p class="feed-more">
64
69
  <a href="{{ post.url | url }}" aria-label="Continue reading: {{ post.title }}">Continue reading<span aria-hidden="true"> &rarr;</span></a>
65
70
  </p>
@@ -0,0 +1,5 @@
1
+ {#
2
+ An entry includes it with `read` on the context; a listing sets it from the
3
+ entry it is printing. Nothing is printed for a post that read nothing.
4
+ #}
5
+ {% if read %}{{ read.line | safe }}{% endif %}
@@ -16,18 +16,11 @@
16
16
  written in `lang`, the language of the entry it sits in (TASK-189), so a
17
17
  listing sets `lang` from each entry as it sets `replyContext`.
18
18
  #}
19
+ {% import "partials/cited-page.njk" as cited %}
19
20
  {% if inReplyTo %}
20
21
  <div class="reply-context cite u-in-reply-to h-cite">
21
22
  <p class="cite-line small">In reply to
22
- {%- if replyContext.name %} <a class="u-url p-name" href="{{ inReplyTo }}">{{ replyContext.name }}</a>
23
- {%- elif replyContext.author %} <a class="u-url" href="{{ inReplyTo }}">a post</a>
24
- {%- else %} <a class="u-url" href="{{ inReplyTo }}">{{ inReplyTo }}</a>
25
- {%- endif %}
26
- {%- if replyContext.author %} by <span class="p-author h-card">
27
- {%- if replyContext.author.url %}<a class="u-url p-name" href="{{ replyContext.author.url }}">{{ replyContext.author.name }}</a>
28
- {%- else %}<span class="p-name">{{ replyContext.author.name }}</span>{% endif -%}
29
- </span>
30
- {%- endif %}
23
+ {{- cited.page(inReplyTo, replyContext) }}
31
24
  {%- if replyContext.published %}, <time class="dt-published" datetime="{{ replyContext.published | date("iso") }}">{{ replyContext.published | date("readable", none, lang) }}</time>
32
25
  {%- endif -%}
33
26
  </p>