@geekity/cms 0.18.0 → 0.20.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.
- package/README.md +29 -25
- package/admin/components/admin-bar.njk +4 -3
- package/admin/components/public-admin-bar.njk +3 -1
- package/admin/layouts/shell.njk +1 -0
- package/admin/pages/documents/editor.njk +291 -192
- package/admin/static/admin.css +123 -13
- package/admin/static/location.js +38 -0
- package/dist/admin/documents.d.ts +18 -3
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +150 -21
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-layout.d.ts +13 -0
- package/dist/admin/editor-layout.d.ts.map +1 -0
- package/dist/admin/editor-layout.js +62 -0
- package/dist/admin/editor-layout.js.map +1 -0
- package/dist/admin/enclosure-field.d.ts +2 -3
- package/dist/admin/enclosure-field.d.ts.map +1 -1
- package/dist/admin/enclosure-field.js +27 -7
- package/dist/admin/enclosure-field.js.map +1 -1
- package/dist/admin/headers.d.ts +1 -0
- package/dist/admin/headers.d.ts.map +1 -1
- package/dist/admin/headers.js +3 -0
- package/dist/admin/headers.js.map +1 -1
- package/dist/admin/location-field.d.ts +4 -3
- package/dist/admin/location-field.d.ts.map +1 -1
- package/dist/admin/location-field.js +10 -2
- package/dist/admin/location-field.js.map +1 -1
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +3 -0
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/photo-field.d.ts +2 -3
- package/dist/admin/photo-field.d.ts.map +1 -1
- package/dist/admin/photo-field.js +4 -2
- package/dist/admin/photo-field.js.map +1 -1
- package/dist/admin/read-field.d.ts +2 -3
- package/dist/admin/read-field.d.ts.map +1 -1
- package/dist/admin/read-field.js +12 -4
- package/dist/admin/read-field.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/content/citation.d.ts +5 -0
- package/dist/content/citation.d.ts.map +1 -1
- package/dist/content/citation.js +17 -0
- package/dist/content/citation.js.map +1 -1
- package/dist/content/kept-properties.d.ts +5 -0
- package/dist/content/kept-properties.d.ts.map +1 -0
- package/dist/content/kept-properties.js +12 -0
- package/dist/content/kept-properties.js.map +1 -0
- package/dist/content/location.d.ts +4 -0
- package/dist/content/location.d.ts.map +1 -1
- package/dist/content/location.js +35 -3
- package/dist/content/location.js.map +1 -1
- package/dist/content/locations.d.ts +2 -5
- package/dist/content/locations.d.ts.map +1 -1
- package/dist/content/locations.js +2 -77
- package/dist/content/locations.js.map +1 -1
- package/dist/content/markdown.d.ts +9 -0
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +37 -1
- package/dist/content/markdown.js.map +1 -1
- package/dist/content/permalink-file.d.ts +7 -0
- package/dist/content/permalink-file.d.ts.map +1 -0
- package/dist/content/permalink-file.js +77 -0
- package/dist/content/permalink-file.js.map +1 -0
- package/dist/content/post-type.d.ts +1 -6
- package/dist/content/post-type.d.ts.map +1 -1
- package/dist/content/post-type.js +13 -14
- package/dist/content/post-type.js.map +1 -1
- package/dist/content/slug.d.ts +2 -1
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +3 -1
- package/dist/content/slug.js.map +1 -1
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/article.d.ts +8 -7
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +37 -18
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/citations.d.ts +7 -6
- package/dist/federation/citations.d.ts.map +1 -1
- package/dist/federation/citations.js +44 -28
- package/dist/federation/citations.js.map +1 -1
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +23 -16
- package/dist/federation/delivery.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/indieauth/bearer.d.ts +10 -6
- package/dist/indieauth/bearer.d.ts.map +1 -1
- package/dist/indieauth/bearer.js +11 -9
- package/dist/indieauth/bearer.js.map +1 -1
- package/dist/indieauth/token.js +1 -1
- package/dist/indieauth/token.js.map +1 -1
- package/dist/micropub/content.d.ts +15 -0
- package/dist/micropub/content.d.ts.map +1 -0
- package/dist/micropub/content.js +254 -0
- package/dist/micropub/content.js.map +1 -0
- package/dist/micropub/create.d.ts +7 -3
- package/dist/micropub/create.d.ts.map +1 -1
- package/dist/micropub/create.js +75 -24
- package/dist/micropub/create.js.map +1 -1
- package/dist/micropub/endpoint.d.ts +4 -5
- package/dist/micropub/endpoint.d.ts.map +1 -1
- package/dist/micropub/endpoint.js +33 -12
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/micropub/media.d.ts +6 -4
- package/dist/micropub/media.d.ts.map +1 -1
- package/dist/micropub/media.js +7 -5
- package/dist/micropub/media.js.map +1 -1
- package/dist/micropub/update.d.ts +7 -1
- package/dist/micropub/update.d.ts.map +1 -1
- package/dist/micropub/update.js +32 -7
- package/dist/micropub/update.js.map +1 -1
- package/dist/web/admin-bar.d.ts.map +1 -1
- package/dist/web/admin-bar.js +27 -1
- package/dist/web/admin-bar.js.map +1 -1
- package/dist/web/context.d.ts +10 -3
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +12 -2
- package/dist/web/context.js.map +1 -1
- package/dist/web/documents.d.ts +21 -6
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +23 -12
- package/dist/web/documents.js.map +1 -1
- package/dist/web/feed-item.d.ts +26 -3
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +63 -6
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-rss.js +3 -3
- package/dist/web/feed-rss.js.map +1 -1
- package/dist/web/feed-source.d.ts +7 -0
- package/dist/web/feed-source.d.ts.map +1 -1
- package/dist/web/feed-source.js.map +1 -1
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js +7 -1
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/negotiate.d.ts +4 -0
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +5 -1
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/render.d.ts +5 -4
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +34 -12
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +16 -4
- package/dist/web/routes.js.map +1 -1
- package/dist/web/sanitize.d.ts +10 -0
- package/dist/web/sanitize.d.ts.map +1 -1
- package/dist/web/sanitize.js +180 -0
- package/dist/web/sanitize.js.map +1 -1
- package/dist/web/templates.d.ts.map +1 -1
- package/dist/web/templates.js +2 -0
- package/dist/web/templates.js.map +1 -1
- package/dist/webmention/cited-picture.d.ts +37 -0
- package/dist/webmention/cited-picture.d.ts.map +1 -0
- package/dist/webmention/cited-picture.js +121 -0
- package/dist/webmention/cited-picture.js.map +1 -0
- package/dist/webmention/fetch-public.d.ts +26 -8
- package/dist/webmention/fetch-public.d.ts.map +1 -1
- package/dist/webmention/fetch-public.js +22 -12
- package/dist/webmention/fetch-public.js.map +1 -1
- package/dist/webmention/reply-context.d.ts +30 -8
- package/dist/webmention/reply-context.d.ts.map +1 -1
- package/dist/webmention/reply-context.js +238 -27
- package/dist/webmention/reply-context.js.map +1 -1
- package/dist/webmention/reply-contexts.d.ts +28 -16
- package/dist/webmention/reply-contexts.d.ts.map +1 -1
- package/dist/webmention/reply-contexts.js +108 -25
- package/dist/webmention/reply-contexts.js.map +1 -1
- package/package.json +10 -9
- package/themes/default/README.md +83 -9
- package/themes/default/layouts/post.njk +7 -7
- package/themes/default/partials/citations.njk +25 -4
- package/themes/default/partials/cited-page.njk +58 -0
- package/themes/default/partials/post-list.njk +8 -5
- package/themes/default/partials/reply-context.njk +9 -11
- package/themes/default/src/style.css +37 -0
- package/themes/default/static/style.css +83 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-contexts.js","sourceRoot":"","sources":["../../src/webmention/reply-contexts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"reply-contexts.js","sourceRoot":"","sources":["../../src/webmention/reply-contexts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekity/cms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A file-first CMS: Markdown content, a SQLite index, a Hono server that is both the editor and the public site.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,25 +28,26 @@
|
|
|
28
28
|
"LICENSE"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@fedify/fedify": "^2.
|
|
32
|
-
"@fedify/hono": "^2.
|
|
33
|
-
"@fedify/vocab": "^2.
|
|
34
|
-
"@hono/node-server": "^2.1.
|
|
31
|
+
"@fedify/fedify": "^2.4.0",
|
|
32
|
+
"@fedify/hono": "^2.4.0",
|
|
33
|
+
"@fedify/vocab": "^2.4.0",
|
|
34
|
+
"@hono/node-server": "^2.1.3",
|
|
35
35
|
"@js-temporal/polyfill": "^0.5.1",
|
|
36
36
|
"chokidar": "^5.0.0",
|
|
37
37
|
"gray-matter": "^4.0.3",
|
|
38
|
-
"hono": "^4.13.
|
|
38
|
+
"hono": "^4.13.12",
|
|
39
39
|
"js-yaml": "^5.4.2",
|
|
40
40
|
"markdown-it": "^15.0.2",
|
|
41
41
|
"markdown-it-footnote": "^4.0.0",
|
|
42
|
-
"nodemailer": "^10.0.
|
|
42
|
+
"nodemailer": "^10.0.13",
|
|
43
43
|
"nunjucks": "^3.2.4",
|
|
44
|
-
"sharp": "^0.35.
|
|
44
|
+
"sharp": "^0.35.5",
|
|
45
|
+
"turndown": "^7.2.4"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
48
|
"@11ty/eleventy": "^3.1.6",
|
|
48
49
|
"@codemirror/lang-markdown": "^6.5.2",
|
|
49
|
-
"@fedify/cli": "2.
|
|
50
|
+
"@fedify/cli": "2.4.0",
|
|
50
51
|
"@tailwindcss/cli": "^4.3.3",
|
|
51
52
|
"@types/markdown-it-footnote": "^3.0.4",
|
|
52
53
|
"@types/node": "^26.6.3",
|
package/themes/default/README.md
CHANGED
|
@@ -26,6 +26,7 @@ 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
|
|
29
30
|
read.njk what a read post read, and how far
|
|
30
31
|
bio.njk who an entry is by, as an h-card
|
|
31
32
|
menu.njk one named menu, as a nav of links
|
|
@@ -385,7 +386,10 @@ copies elsewhere (`syndication`) after **Also on**. A page never prints either,
|
|
|
385
386
|
and its line is a `p.page-meta` rather than a `p.entry-meta`.
|
|
386
387
|
|
|
387
388
|
**Every post's page has one `h1`.** A post with a name of its own is headed by
|
|
388
|
-
it, as above.
|
|
389
|
+
it, as above. So is a post with a title and no words, such as a titled like,
|
|
390
|
+
repost or bookmark (TASK-256): its header comes first and its citation after
|
|
391
|
+
it. A title that only repeats a post's opening words is no name. A note, or a
|
|
392
|
+
reply without a title, opens on its words instead,
|
|
389
393
|
set larger, so it has no `header`; in its place is an `h1` a screen reader and
|
|
390
394
|
a crawler navigate by and a sighted reader never sees, saying what the post is,
|
|
391
395
|
who wrote it and when, and then the kicker:
|
|
@@ -405,16 +409,84 @@ is an `h3` inside the form's section.
|
|
|
405
409
|
`div.reply-context.cite.u-in-reply-to.h-cite`: a rule on the start side, a
|
|
406
410
|
`p.cite-line` saying "In reply to" and the target's name, author and date as
|
|
407
411
|
far as they are known, and its excerpt as a `blockquote.cite-quote.p-content`.
|
|
408
|
-
|
|
409
|
-
|
|
412
|
+
Where it goes depends on whether the post shows a title. An untitled reply
|
|
413
|
+
opens on it, under the kicker and before its words. A titled reply prints its
|
|
414
|
+
`header.post-header` first and the citation after it, before the `e-content`,
|
|
415
|
+
so the page opens on its title rather than on a link. A listing follows the
|
|
416
|
+
same rule: an untitled entry cites under its kicker, a titled one after its
|
|
417
|
+
title and summary. The same partial cites a reply in a feed. The layouts own
|
|
418
|
+
the placement; the partial owns only what the citation says, and it stays
|
|
419
|
+
inside the `h-entry` wherever it is printed.
|
|
410
420
|
|
|
411
421
|
**A like, a repost or a bookmark cites what it cites** (TASK-169) with
|
|
412
422
|
`partials/citations.njk`, beside the reply context and drawn the same way: one
|
|
413
423
|
`div.reply-context.cite.h-cite` per entry of `citations`, classed
|
|
414
424
|
`u-repost-of`, `u-like-of` or `u-bookmark-of`, whose `p.cite-line` says
|
|
415
|
-
Reposted, Liked or Bookmarked and links the target as its `u-url`.
|
|
416
|
-
|
|
417
|
-
|
|
425
|
+
Reposted, Liked or Bookmarked and links the target as its `u-url`. The link
|
|
426
|
+
says the target's name, as the reply context does, with its author after it as
|
|
427
|
+
a `p-author h-card`, when the target was read when the post was saved
|
|
428
|
+
(TASK-244): its `h-entry` name, its oEmbed title, or its `og:title` or
|
|
429
|
+
`<title>`. A YouTube, TikTok, Reddit or Giphy target is named by that
|
|
430
|
+
provider's known oEmbed endpoint, asked before its page, which is read only
|
|
431
|
+
when the endpoint names nothing (TASK-251, TASK-253). Any other target's oEmbed
|
|
432
|
+
title comes from the endpoint its page links. A title that is only a site suffix such as "- YouTube" is
|
|
433
|
+
no title. With only an author it says "a post", and with neither "a page on"
|
|
434
|
+
the target's host, never the bare URL, which can run to hundreds of
|
|
435
|
+
characters: "Bookmarked a page on example.com" (TASK-255). Its kicker
|
|
436
|
+
and its hidden `h1` say Repost, Like or Bookmark. It is placed as the reply
|
|
437
|
+
context is: at the top of an untitled post, after the header of a titled one.
|
|
438
|
+
A listing cites each entry's from the same partial, by the same rule.
|
|
439
|
+
|
|
440
|
+
**Both citations name the cited page** through `partials/cited-page.njk`, so
|
|
441
|
+
they print its name and author by one rule. A name that already ends in " by "
|
|
442
|
+
and the author's name, in any case, does not print the author again
|
|
443
|
+
(TASK-247): SoundCloud titles a track "Flickermood by Forss" and names Forss
|
|
444
|
+
as its author. The title link stops before " by ", and the words after it
|
|
445
|
+
become the `p-author h-card`, so the line reads "Liked Flickermood by Forss"
|
|
446
|
+
and a parser still reads the whole title as the `p-name`. A name that mentions
|
|
447
|
+
its author anywhere else, such as "Rick Astley - Never Gonna Give You Up" by
|
|
448
|
+
Rick Astley, keeps the author after it. A page that names no author but names
|
|
449
|
+
its site, its `og:site_name`, is followed by a middle dot and the site as a
|
|
450
|
+
plain `span.cite-site`, never an `h-card`, because a site is not an author: a
|
|
451
|
+
bookmark of a Scripting News post reads "Bookmarked RSS tip #2 · Scripting
|
|
452
|
+
News". A like's, a repost's or a bookmark's citation never prints the page's
|
|
453
|
+
description, which on many sites describes the site rather than the post.
|
|
454
|
+
|
|
455
|
+
**A citation shows the cited page's picture** (TASK-252) when the page named
|
|
456
|
+
one and the post has not removed its preview. The picture is the page's
|
|
457
|
+
oEmbed photo, else its oEmbed thumbnail, else its `og:image`, else its
|
|
458
|
+
`twitter:image`, copied into the site's uploads when the post was saved, so
|
|
459
|
+
a reader's browser never asks the cited site or its CDN for anything. It is
|
|
460
|
+
`context.picture`: `{ src, width, height, kind, video, shownInFull, imgHtml }`, where
|
|
461
|
+
`imgHtml` is an `img.u-photo` inside the `h-cite`, responsive when the copy has
|
|
462
|
+
variants. A repost of a photo (`shownInFull`, such as a Giphy GIF) prints it in full
|
|
463
|
+
under the line, as `a.cite-photo` linking to the target, with the target's
|
|
464
|
+
name as its alt text. Every other citation with a picture (a like, a bookmark,
|
|
465
|
+
a reply, a repost of a video or a page) is classed `cite-with-thumb` and
|
|
466
|
+
prints it as `a.cite-thumb` beside the line: a 6rem thumbnail linking to the
|
|
467
|
+
target, out of the tab order and hidden from assistive technology because the
|
|
468
|
+
title beside it is the same link, with an empty alt text. A video's thumbnail
|
|
469
|
+
is also classed `cite-video`, which the stylesheet draws a play mark on. A
|
|
470
|
+
picture that could not be copied, was bigger than the site's upload limit or
|
|
471
|
+
was never named leaves the citation as it was, with no picture. A post whose
|
|
472
|
+
front matter says `preview: false`, which the editor's remove control writes,
|
|
473
|
+
prints the plain citation, and so do its listing entry and its feed items.
|
|
474
|
+
There is never an iframe or a script from the cited page.
|
|
475
|
+
|
|
476
|
+
**A cited URL that is itself an image** (TASK-255), one that answers with an
|
|
477
|
+
`image/*` type rather than a page, is copied as its own picture of kind
|
|
478
|
+
`photo` and has no name, so `context.image` is true and the line says "an
|
|
479
|
+
image from" its host as the link: "Reposted an image from edu.casio.com". A
|
|
480
|
+
repost shows it in full like a reposted GIF, a like or a bookmark as a
|
|
481
|
+
thumbnail beside "Liked an image from edu.casio.com", and a post that hid its
|
|
482
|
+
preview still says it reposted an image. Its alt text is the post's
|
|
483
|
+
`cited-alt`, which the editor's card writes, else the post's title, else
|
|
484
|
+
empty. An image that could not be copied, or was bigger than the site's
|
|
485
|
+
upload limit, keeps no context, so its citation says "a page on" its host.
|
|
486
|
+
|
|
487
|
+
The feeds open each
|
|
488
|
+
citing post's HTML with the same citation as a `p.cite-line`, the picture
|
|
489
|
+
after it with an absolute `src`.
|
|
418
490
|
|
|
419
491
|
**A read says what was read** (TASK-229) with `partials/read.njk`, a
|
|
420
492
|
`p.read-line` at the top of the `e-content` that reads like indiebookclub's
|
|
@@ -602,7 +674,9 @@ its kicker:
|
|
|
602
674
|
**Only an article has a headline.** A note, which has no title, is printed
|
|
603
675
|
whole as its `e-content`, and the date in its kicker is its `u-url`. A reply is
|
|
604
676
|
a note that first cites what it answers with `partials/reply-context.njk`, and
|
|
605
|
-
a reply with a title is an article that
|
|
677
|
+
a reply with a title is an article that cites it after its title and summary.
|
|
678
|
+
A like, a repost and a bookmark place `partials/citations.njk` the same way,
|
|
679
|
+
and one with a title and no words is listed by its title too. An article's categories are in
|
|
606
680
|
its kicker; a note's are on its own page.
|
|
607
681
|
|
|
608
682
|
The excerpt is the entry's `summary`, the very line the feeds publish, so a
|
|
@@ -1179,7 +1253,7 @@ A document — one post, one page, or one entry of a listing — adds:
|
|
|
1179
1253
|
| `lang` | The `lang` front matter as a canonical tag, such as `fr-CA`. Absent when it names none or no tag. |
|
|
1180
1254
|
| `enclosure` | The post's recording, parsed, with `player` (`audio` or `video`) and `transcript.captions`. Absent with none. |
|
|
1181
1255
|
| `photos` | The post's photos, each `{ url, alt, html }`; `html` is the `img.u-photo`, responsive. Empty with none. |
|
|
1182
|
-
| `citations` | What it reposts, likes or bookmarks, each `{ property, url }
|
|
1256
|
+
| `citations` | What it reposts, likes or bookmarks, each `{ property, url, context }`; `context` as `replyContext`, when known. |
|
|
1183
1257
|
| `read` | A read post's `{ status, statusLabel, of, line }`; `of` is `{ name, author, uid, uidLabel, url }`. |
|
|
1184
1258
|
| `syndicateTo` | On a post's page, the syndication targets it selects, each `{ id, name, url }`. Empty with none. |
|
|
1185
1259
|
| `syndication` | Its copies elsewhere, each `{ url, label }`: front matter `syndication`, and on its page the copies targets made. |
|
|
@@ -1191,7 +1265,7 @@ A document — one post, one page, or one entry of a listing — adds:
|
|
|
1191
1265
|
| `postsPage` | The page carrying the listing, as `{ title, url }`, on the front page only. Absent when the site names none. |
|
|
1192
1266
|
| `archiveMonths` | Every published post as `{ month, posts }`, newest month first. Only on a page that says `archive: true`. |
|
|
1193
1267
|
| `webmention` | Where a webmention about this page is sent. Only on a rendered document, and only while the site takes them. |
|
|
1194
|
-
| `noindex` | `true` on
|
|
1268
|
+
| `noindex` | `true` on an unlisted or unpublished page, which the base layout prints as a robots `noindex` meta. Else absent. |
|
|
1195
1269
|
| `conversation` | The replies, likes and boosts under the post. Only when there are any. See [The conversation](#the-conversation). |
|
|
1196
1270
|
| everything else | Any front matter key the CMS does not model is on the context under its own name. |
|
|
1197
1271
|
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
a kicker that names its kind (Article, Note, Reply) and the categories it is
|
|
4
4
|
filed under.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
A post with a title its words do not open with (an article, a titled reply,
|
|
7
|
+
a titled like with no words at all) has the only headline: the title as its
|
|
7
8
|
`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.
|
|
9
|
-
|
|
9
|
+
`p-summary`. A post with no title opens on its words, set larger. What a
|
|
10
|
+
reply answers, and what a like, repost or bookmark cites, opens a post with
|
|
11
|
+
no title and follows the header of one with a title, before its words.
|
|
10
12
|
Then the Published line, the tags, a rule and the bio. The neighbouring posts,
|
|
11
13
|
the conversation and the comment form follow the entry.
|
|
12
14
|
|
|
@@ -36,10 +38,6 @@
|
|
|
36
38
|
hidden from sight. It is no `p-name`: a parser would take that as a
|
|
37
39
|
title and read the note as an article. -#}
|
|
38
40
|
{% 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
41
|
<header class="post-header">
|
|
44
42
|
{{ kicker.line(postType | capitalize, false, false, categories) }}
|
|
45
43
|
<h1 class="p-name">{{ title }}</h1>
|
|
@@ -47,6 +45,8 @@
|
|
|
47
45
|
<p class="post-deck p-summary">{{ description }}</p>
|
|
48
46
|
{% endif %}
|
|
49
47
|
</header>
|
|
48
|
+
{% include "partials/reply-context.njk" %}
|
|
49
|
+
{% include "partials/citations.njk" %}
|
|
50
50
|
{% else %}
|
|
51
51
|
<h1 class="screen-reader-text">
|
|
52
52
|
{{- postType | capitalize if postType in ["reply", "like", "repost", "bookmark", "read"] else "Note" }}
|
|
@@ -6,12 +6,33 @@
|
|
|
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; for a URL that is an image,
|
|
16
|
+
"an image from" its host; with nothing, "a page on" its host.
|
|
17
|
+
|
|
18
|
+
`context.picture` is the target's picture, copied into the site's uploads
|
|
19
|
+
(TASK-252), absent when there is none or the post hid its previews. A
|
|
20
|
+
repost of a photo (`picture.shownInFull`) shows it in full under the line; any
|
|
21
|
+
other citation shows it as a thumbnail beside the line. Both link to the
|
|
22
|
+
target, and `picture.imgHtml` is the `img.u-photo` inside the `h-cite`.
|
|
11
23
|
#}
|
|
24
|
+
{% import "partials/cited-page.njk" as cited %}
|
|
12
25
|
{% set citationVerbs = { "repost-of": "Reposted", "like-of": "Liked", "bookmark-of": "Bookmarked" } %}
|
|
13
26
|
{% for citation in citations %}
|
|
14
|
-
|
|
15
|
-
|
|
27
|
+
{% set citedPage = citation.context %}
|
|
28
|
+
{% set picture = citedPage.picture %}
|
|
29
|
+
<div class="reply-context cite u-{{ citation.property }} h-cite{% if picture and not picture.shownInFull %} cite-with-thumb{% endif %}">
|
|
30
|
+
{%- if picture and not picture.shownInFull %}{{ cited.thumb(citation.url, picture) }}{% endif %}
|
|
31
|
+
<p class="cite-line small">{{ citationVerbs[citation.property] }}
|
|
32
|
+
{{- cited.page(citation.url, citedPage) -}}
|
|
33
|
+
</p>
|
|
34
|
+
{%- if picture.shownInFull %}
|
|
35
|
+
<a class="cite-photo" href="{{ citation.url }}">{{ picture.imgHtml | safe }}</a>
|
|
36
|
+
{%- endif %}
|
|
16
37
|
</div>
|
|
17
38
|
{% endfor %}
|
|
@@ -0,0 +1,58 @@
|
|
|
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; a URL that is itself an image
|
|
12
|
+
(`context.image`, TASK-255) is "an image from" its host; anything else is "a
|
|
13
|
+
page on" its host, never the bare URL, which can run to hundreds of
|
|
14
|
+
characters. The author follows as an `h-card`.
|
|
15
|
+
|
|
16
|
+
A name that already ends in " by " and the author's name, matched without
|
|
17
|
+
regard to case (SoundCloud's oEmbed gives "Flickermood by Forss" by Forss),
|
|
18
|
+
is not followed by the author again. Its last words become the `h-card`,
|
|
19
|
+
printed as the title wrote them, and the whole name stays the `p-name`, so a
|
|
20
|
+
parser reads the same name and author either way.
|
|
21
|
+
|
|
22
|
+
A page that names no author may name its site, `context.site` (its
|
|
23
|
+
`og:site_name`), printed after a middle dot as plain text: a site is not an
|
|
24
|
+
author, so it is no `h-card`.
|
|
25
|
+
|
|
26
|
+
`thumb(url, picture)` is a cited page's thumbnail (TASK-252): a link to the
|
|
27
|
+
page around `picture.imgHtml`, out of the tab order and hidden from assistive
|
|
28
|
+
technology because the title beside it is the same link. A video's carries
|
|
29
|
+
`cite-video`, which the stylesheet draws a play mark on.
|
|
30
|
+
#}
|
|
31
|
+
{% macro page(url, context) %}
|
|
32
|
+
{%- set title = (context.name or "") | trim -%}
|
|
33
|
+
{%- set author = (context.author.name or "") | trim if context.author else "" -%}
|
|
34
|
+
{%- set cut = title.length - author.length - 4 -%}
|
|
35
|
+
{%- set byline = title.slice(cut) if (author and cut > 0) else "" -%}
|
|
36
|
+
{%- set named = byline and byline.slice(0, 4).toLowerCase() == " by " and byline.slice(4).toLowerCase() == author.toLowerCase() -%}
|
|
37
|
+
{%- 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>
|
|
38
|
+
{%- else %}
|
|
39
|
+
{%- if context.name %} <a class="u-url p-name" href="{{ url }}">{{ context.name }}</a>
|
|
40
|
+
{%- elif context.author %} <a class="u-url" href="{{ url }}">a post</a>
|
|
41
|
+
{%- elif context.image %} <a class="u-url" href="{{ url }}">an image from {{ url | host }}</a>
|
|
42
|
+
{%- else %} <a class="u-url" href="{{ url }}">a page on {{ url | host }}</a>
|
|
43
|
+
{%- endif %}
|
|
44
|
+
{%- if context.author %} by {{ card(context.author, context.author.name) }}
|
|
45
|
+
{%- elif context.site %} · <span class="cite-site">{{ context.site }}</span>{% endif %}
|
|
46
|
+
{%- endif %}
|
|
47
|
+
{%- endmacro %}
|
|
48
|
+
|
|
49
|
+
{% macro thumb(url, picture) -%}
|
|
50
|
+
<a class="cite-thumb{% if picture.video %} cite-video{% endif %}" href="{{ url }}" tabindex="-1" aria-hidden="true">{{ picture.imgHtml | safe }}</a>
|
|
51
|
+
{%- endmacro %}
|
|
52
|
+
|
|
53
|
+
{% macro card(author, name) -%}
|
|
54
|
+
<span class="p-author h-card">
|
|
55
|
+
{%- if author.url %}<a class="u-url p-name" href="{{ author.url }}">{{ name }}</a>
|
|
56
|
+
{%- else %}<span class="p-name">{{ name }}</span>{% endif -%}
|
|
57
|
+
</span>
|
|
58
|
+
{%- endmacro %}
|
|
@@ -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
|
|
12
|
-
|
|
13
|
-
|
|
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,17 @@
|
|
|
32
33
|
{% else %}
|
|
33
34
|
{{ kicker.line(post.postType | capitalize, post.date, post.url, [], post.label, lang=post.lang) }}
|
|
34
35
|
{% endif %}
|
|
35
|
-
{
|
|
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 %}
|
|
45
47
|
{% set read = post.read %}
|
|
46
48
|
{% include "partials/read.njk" %}
|
|
47
49
|
{% if post.photos.length %}
|
|
@@ -62,6 +64,7 @@
|
|
|
62
64
|
<p>{{ post.summary | truncate(280) }}</p>
|
|
63
65
|
</div>
|
|
64
66
|
{% endif %}
|
|
67
|
+
{{ cited | safe }}
|
|
65
68
|
<p class="feed-more">
|
|
66
69
|
<a href="{{ post.url | url }}" aria-label="Continue reading: {{ post.title }}">Continue reading<span aria-hidden="true"> →</span></a>
|
|
67
70
|
</p>
|
|
@@ -12,22 +12,20 @@
|
|
|
12
12
|
or synced: its name, a short excerpt, its author and its date, each only when
|
|
13
13
|
it said so. It is somebody else's words, so every piece is printed through
|
|
14
14
|
autoescaping and none of it with `safe`. With a name, the name is the link;
|
|
15
|
-
with only an author, "a post" is; with neither,
|
|
15
|
+
with only an author, "a post" is; with neither, "a page on" its host. Its date is
|
|
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
|
+
|
|
19
|
+
`replyContext.picture`, when the target has one and the reply shows it, is
|
|
20
|
+
drawn as a thumbnail beside the line, as `citations.njk` draws it (TASK-252).
|
|
18
21
|
#}
|
|
22
|
+
{% import "partials/cited-page.njk" as cited %}
|
|
19
23
|
{% if inReplyTo %}
|
|
20
|
-
|
|
24
|
+
{% set picture = replyContext.picture %}
|
|
25
|
+
<div class="reply-context cite u-in-reply-to h-cite{% if picture %} cite-with-thumb{% endif %}">
|
|
26
|
+
{%- if picture %}{{ cited.thumb(inReplyTo, picture) }}{% endif %}
|
|
21
27
|
<p class="cite-line small">In reply to
|
|
22
|
-
{
|
|
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 %}
|
|
28
|
+
{{- cited.page(inReplyTo, replyContext) }}
|
|
31
29
|
{%- if replyContext.published %}, <time class="dt-published" datetime="{{ replyContext.published | date("iso") }}">{{ replyContext.published | date("readable", none, lang) }}</time>
|
|
32
30
|
{%- endif -%}
|
|
33
31
|
</p>
|
|
@@ -643,6 +643,43 @@
|
|
|
643
643
|
@apply mt-1 text-[0.98rem] leading-snug text-muted italic;
|
|
644
644
|
}
|
|
645
645
|
|
|
646
|
+
.cite-with-thumb {
|
|
647
|
+
@apply grid grid-cols-[6rem_minmax(0,1fr)] items-start gap-x-3;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.cite-with-thumb > :not(.cite-thumb) {
|
|
651
|
+
@apply col-start-2;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
.cite-thumb {
|
|
655
|
+
@apply relative row-span-2 block;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
.cite-thumb img {
|
|
659
|
+
@apply block aspect-[4/3] h-auto w-full rounded-sm object-cover;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
.cite-video::before {
|
|
663
|
+
@apply absolute inset-0 m-auto size-9 rounded-full;
|
|
664
|
+
content: '';
|
|
665
|
+
background: rgb(0 0 0 / 0.65);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
.cite-video::after {
|
|
669
|
+
@apply absolute inset-0 m-auto h-4 w-3.5 translate-x-[10%];
|
|
670
|
+
content: '';
|
|
671
|
+
background: #fff;
|
|
672
|
+
clip-path: polygon(0 0, 100% 50%, 0 100%);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.cite-photo {
|
|
676
|
+
@apply mt-2 block;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.cite-photo img {
|
|
680
|
+
@apply block h-auto max-w-full rounded-sm;
|
|
681
|
+
}
|
|
682
|
+
|
|
646
683
|
/* One post or page: `article.blog-post.h-entry`. */
|
|
647
684
|
.post-header {
|
|
648
685
|
@apply mb-8;
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
--tw-font-weight: initial;
|
|
8
8
|
--tw-tracking: initial;
|
|
9
9
|
--tw-border-style: solid;
|
|
10
|
+
--tw-translate-x: 0;
|
|
11
|
+
--tw-translate-y: 0;
|
|
12
|
+
--tw-translate-z: 0;
|
|
10
13
|
--tw-space-y-reverse: 0;
|
|
11
14
|
--tw-shadow: 0 0 #0000;
|
|
12
15
|
--tw-shadow-color: initial;
|
|
@@ -1156,6 +1159,68 @@
|
|
|
1156
1159
|
font-style: italic;
|
|
1157
1160
|
}
|
|
1158
1161
|
|
|
1162
|
+
.cite-with-thumb {
|
|
1163
|
+
align-items: flex-start;
|
|
1164
|
+
column-gap: calc(var(--spacing) * 3);
|
|
1165
|
+
grid-template-columns: 6rem minmax(0, 1fr);
|
|
1166
|
+
display: grid;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
.cite-with-thumb > :not(.cite-thumb) {
|
|
1170
|
+
grid-column-start: 2;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
.cite-thumb {
|
|
1174
|
+
grid-row: span 2 / span 2;
|
|
1175
|
+
display: block;
|
|
1176
|
+
position: relative;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
.cite-thumb img {
|
|
1180
|
+
aspect-ratio: 4 / 3;
|
|
1181
|
+
border-radius: var(--radius-sm);
|
|
1182
|
+
object-fit: cover;
|
|
1183
|
+
width: 100%;
|
|
1184
|
+
height: auto;
|
|
1185
|
+
display: block;
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
.cite-video:before {
|
|
1189
|
+
width: calc(var(--spacing) * 9);
|
|
1190
|
+
height: calc(var(--spacing) * 9);
|
|
1191
|
+
content: "";
|
|
1192
|
+
background: #000000a6;
|
|
1193
|
+
border-radius: 3.40282e38px;
|
|
1194
|
+
margin: auto;
|
|
1195
|
+
position: absolute;
|
|
1196
|
+
inset: 0;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
.cite-video:after {
|
|
1200
|
+
height: calc(var(--spacing) * 4);
|
|
1201
|
+
width: calc(var(--spacing) * 3.5);
|
|
1202
|
+
--tw-translate-x: 10%;
|
|
1203
|
+
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
1204
|
+
content: "";
|
|
1205
|
+
clip-path: polygon(0 0, 100% 50%, 0 100%);
|
|
1206
|
+
background: #fff;
|
|
1207
|
+
margin: auto;
|
|
1208
|
+
position: absolute;
|
|
1209
|
+
inset: 0;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
.cite-photo {
|
|
1213
|
+
margin-top: calc(var(--spacing) * 2);
|
|
1214
|
+
display: block;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
.cite-photo img {
|
|
1218
|
+
border-radius: var(--radius-sm);
|
|
1219
|
+
max-width: 100%;
|
|
1220
|
+
height: auto;
|
|
1221
|
+
display: block;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1159
1224
|
.post-header {
|
|
1160
1225
|
margin-bottom: calc(var(--spacing) * 8);
|
|
1161
1226
|
}
|
|
@@ -2283,6 +2348,24 @@
|
|
|
2283
2348
|
initial-value: solid;
|
|
2284
2349
|
}
|
|
2285
2350
|
|
|
2351
|
+
@property --tw-translate-x {
|
|
2352
|
+
syntax: "*";
|
|
2353
|
+
inherits: false;
|
|
2354
|
+
initial-value: 0;
|
|
2355
|
+
}
|
|
2356
|
+
|
|
2357
|
+
@property --tw-translate-y {
|
|
2358
|
+
syntax: "*";
|
|
2359
|
+
inherits: false;
|
|
2360
|
+
initial-value: 0;
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
@property --tw-translate-z {
|
|
2364
|
+
syntax: "*";
|
|
2365
|
+
inherits: false;
|
|
2366
|
+
initial-value: 0;
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2286
2369
|
@property --tw-space-y-reverse {
|
|
2287
2370
|
syntax: "*";
|
|
2288
2371
|
inherits: false;
|