@geekity/cms 0.3.0 → 0.5.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 +2217 -214
- package/admin/components/fields.njk +165 -0
- package/admin/layouts/base.njk +1 -1
- package/admin/layouts/settings-page.njk +26 -0
- package/admin/layouts/shell.njk +17 -3
- package/admin/pages/account/forgot.njk +47 -0
- package/admin/pages/account/login.njk +26 -0
- package/admin/pages/account/reset.njk +38 -0
- package/admin/pages/account/setup.njk +28 -0
- package/admin/pages/appearance/themes.njk +69 -0
- package/admin/pages/comments/all.njk +133 -0
- package/admin/{layouts/dashboard.njk → pages/dashboard/home.njk} +8 -15
- package/admin/{layouts/document-conflict.njk → pages/documents/conflict.njk} +1 -0
- package/admin/{layouts/document-editor.njk → pages/documents/editor.njk} +75 -59
- package/admin/{layouts/document-list.njk → pages/documents/list.njk} +19 -2
- package/admin/pages/documents/taxonomy.njk +95 -0
- package/admin/pages/federation/followers.njk +238 -0
- package/admin/pages/federation/settings.njk +77 -0
- package/admin/pages/media/library.njk +160 -0
- package/admin/pages/messages/all.njk +110 -0
- package/admin/pages/navigation/menus.njk +129 -0
- package/admin/{layouts → pages}/placeholder.njk +5 -1
- package/admin/pages/settings/discussion.njk +99 -0
- package/admin/pages/settings/email.njk +203 -0
- package/admin/pages/settings/general.njk +29 -0
- package/admin/pages/settings/permalinks.njk +50 -0
- package/admin/pages/settings/reading.njk +64 -0
- package/admin/pages/tools/content-index.njk +89 -0
- package/admin/pages/users/edit.njk +239 -0
- package/admin/pages/users/list.njk +51 -0
- package/admin/pages/users/new.njk +41 -0
- package/admin/static/admin.css +558 -3
- package/admin/static/copy.js +52 -0
- package/admin/static/editor.js +16 -16
- package/admin/static/slug.js +61 -0
- package/dist/access-log.d.ts +44 -0
- package/dist/access-log.d.ts.map +1 -0
- package/dist/access-log.js +71 -0
- package/dist/access-log.js.map +1 -0
- package/dist/admin/accounts.d.ts +413 -0
- package/dist/admin/accounts.d.ts.map +1 -0
- package/dist/admin/accounts.js +680 -0
- package/dist/admin/accounts.js.map +1 -0
- package/dist/admin/appearance.d.ts +80 -0
- package/dist/admin/appearance.d.ts.map +1 -0
- package/dist/admin/appearance.js +136 -0
- package/dist/admin/appearance.js.map +1 -0
- package/dist/admin/comments.d.ts +90 -0
- package/dist/admin/comments.d.ts.map +1 -0
- package/dist/admin/comments.js +244 -0
- package/dist/admin/comments.js.map +1 -0
- package/dist/admin/credentials.d.ts +26 -2
- package/dist/admin/credentials.d.ts.map +1 -1
- package/dist/admin/credentials.js +35 -2
- package/dist/admin/credentials.js.map +1 -1
- package/dist/admin/documents.d.ts +117 -10
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +328 -41
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/federation.d.ts +161 -50
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +235 -93
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/formatting.d.ts +20 -0
- package/dist/admin/formatting.d.ts.map +1 -0
- package/dist/admin/formatting.js +72 -0
- package/dist/admin/formatting.js.map +1 -0
- package/dist/admin/headers.d.ts +65 -0
- package/dist/admin/headers.d.ts.map +1 -0
- package/dist/admin/headers.js +104 -0
- package/dist/admin/headers.js.map +1 -0
- package/dist/admin/index.d.ts +38 -12
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +25 -7
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/media.d.ts +168 -0
- package/dist/admin/media.d.ts.map +1 -0
- package/dist/admin/media.js +295 -0
- package/dist/admin/media.js.map +1 -0
- package/dist/admin/menu.d.ts +79 -0
- package/dist/admin/menu.d.ts.map +1 -0
- package/dist/admin/menu.js +143 -0
- package/dist/admin/menu.js.map +1 -0
- package/dist/admin/messages.d.ts +80 -0
- package/dist/admin/messages.d.ts.map +1 -0
- package/dist/admin/messages.js +152 -0
- package/dist/admin/messages.js.map +1 -0
- package/dist/admin/navigation.d.ts +155 -0
- package/dist/admin/navigation.d.ts.map +1 -0
- package/dist/admin/navigation.js +292 -0
- package/dist/admin/navigation.js.map +1 -0
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +31 -7
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/recovery.d.ts +92 -0
- package/dist/admin/recovery.d.ts.map +1 -0
- package/dist/admin/recovery.js +229 -0
- package/dist/admin/recovery.js.map +1 -0
- package/dist/admin/routes.d.ts +0 -20
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +164 -105
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/session.d.ts +17 -3
- package/dist/admin/session.d.ts.map +1 -1
- package/dist/admin/session.js +19 -5
- package/dist/admin/session.js.map +1 -1
- package/dist/admin/settings-discussion.d.ts +37 -0
- package/dist/admin/settings-discussion.d.ts.map +1 -0
- package/dist/admin/settings-discussion.js +117 -0
- package/dist/admin/settings-discussion.js.map +1 -0
- package/dist/admin/settings-email.d.ts +54 -0
- package/dist/admin/settings-email.d.ts.map +1 -0
- package/dist/admin/settings-email.js +189 -0
- package/dist/admin/settings-email.js.map +1 -0
- package/dist/admin/settings-federation.d.ts +48 -0
- package/dist/admin/settings-federation.d.ts.map +1 -0
- package/dist/admin/settings-federation.js +123 -0
- package/dist/admin/settings-federation.js.map +1 -0
- package/dist/admin/settings-general.d.ts +12 -0
- package/dist/admin/settings-general.d.ts.map +1 -0
- package/dist/admin/settings-general.js +48 -0
- package/dist/admin/settings-general.js.map +1 -0
- package/dist/admin/settings-page.d.ts +119 -0
- package/dist/admin/settings-page.d.ts.map +1 -0
- package/dist/admin/settings-page.js +132 -0
- package/dist/admin/settings-page.js.map +1 -0
- package/dist/admin/settings-pages.d.ts +30 -0
- package/dist/admin/settings-pages.d.ts.map +1 -0
- package/dist/admin/settings-pages.js +43 -0
- package/dist/admin/settings-pages.js.map +1 -0
- package/dist/admin/settings-permalinks.d.ts +16 -0
- package/dist/admin/settings-permalinks.d.ts.map +1 -0
- package/dist/admin/settings-permalinks.js +32 -0
- package/dist/admin/settings-permalinks.js.map +1 -0
- package/dist/admin/settings-reading.d.ts +34 -0
- package/dist/admin/settings-reading.d.ts.map +1 -0
- package/dist/admin/settings-reading.js +49 -0
- package/dist/admin/settings-reading.js.map +1 -0
- package/dist/admin/settings.d.ts +339 -96
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +600 -308
- package/dist/admin/settings.js.map +1 -1
- package/dist/admin/store.d.ts +606 -152
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +863 -268
- package/dist/admin/store.js.map +1 -1
- package/dist/admin/taxonomy.d.ts +114 -0
- package/dist/admin/taxonomy.d.ts.map +1 -0
- package/dist/admin/taxonomy.js +289 -0
- package/dist/admin/taxonomy.js.map +1 -0
- package/dist/admin/templates.d.ts +46 -14
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +46 -14
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/throttle.d.ts +84 -0
- package/dist/admin/throttle.d.ts.map +1 -0
- package/dist/admin/throttle.js +143 -0
- package/dist/admin/throttle.js.map +1 -0
- package/dist/admin/tools.d.ts +111 -0
- package/dist/admin/tools.d.ts.map +1 -0
- package/dist/admin/tools.js +182 -0
- package/dist/admin/tools.js.map +1 -0
- package/dist/admin/uploads.d.ts +28 -2
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +43 -4
- package/dist/admin/uploads.js.map +1 -1
- package/dist/admin/users.d.ts +100 -13
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +412 -39
- package/dist/admin/users.js.map +1 -1
- package/dist/cache.d.ts +141 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +207 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +429 -21
- package/dist/cli.js.map +1 -1
- package/dist/comments/akismet.d.ts +130 -0
- package/dist/comments/akismet.d.ts.map +1 -0
- package/dist/comments/akismet.js +274 -0
- package/dist/comments/akismet.js.map +1 -0
- package/dist/comments/conversation.d.ts +29 -0
- package/dist/comments/conversation.d.ts.map +1 -0
- package/dist/comments/conversation.js +60 -0
- package/dist/comments/conversation.js.map +1 -0
- package/dist/comments/form.d.ts +123 -0
- package/dist/comments/form.d.ts.map +1 -0
- package/dist/comments/form.js +79 -0
- package/dist/comments/form.js.map +1 -0
- package/dist/comments/index.d.ts +16 -0
- package/dist/comments/index.d.ts.map +1 -0
- package/dist/comments/index.js +10 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/comments/markdown.d.ts +8 -0
- package/dist/comments/markdown.d.ts.map +1 -0
- package/dist/comments/markdown.js +85 -0
- package/dist/comments/markdown.js.map +1 -0
- package/dist/comments/moderate.d.ts +71 -0
- package/dist/comments/moderate.d.ts.map +1 -0
- package/dist/comments/moderate.js +88 -0
- package/dist/comments/moderate.js.map +1 -0
- package/dist/comments/policy.d.ts +57 -0
- package/dist/comments/policy.d.ts.map +1 -0
- package/dist/comments/policy.js +80 -0
- package/dist/comments/policy.js.map +1 -0
- package/dist/comments/records.d.ts +266 -0
- package/dist/comments/records.d.ts.map +1 -0
- package/dist/comments/records.js +487 -0
- package/dist/comments/records.js.map +1 -0
- package/dist/comments/routes.d.ts +60 -0
- package/dist/comments/routes.d.ts.map +1 -0
- package/dist/comments/routes.js +212 -0
- package/dist/comments/routes.js.map +1 -0
- package/dist/comments/submission.d.ts +297 -0
- package/dist/comments/submission.d.ts.map +1 -0
- package/dist/comments/submission.js +280 -0
- package/dist/comments/submission.js.map +1 -0
- package/dist/comments/viewer.d.ts +21 -0
- package/dist/comments/viewer.d.ts.map +1 -0
- package/dist/comments/viewer.js +45 -0
- package/dist/comments/viewer.js.map +1 -0
- package/dist/config.d.ts +225 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +121 -6
- package/dist/config.js.map +1 -1
- package/dist/contact/delivery.d.ts +60 -0
- package/dist/contact/delivery.d.ts.map +1 -0
- package/dist/contact/delivery.js +87 -0
- package/dist/contact/delivery.js.map +1 -0
- package/dist/contact/form.d.ts +130 -0
- package/dist/contact/form.d.ts.map +1 -0
- package/dist/contact/form.js +163 -0
- package/dist/contact/form.js.map +1 -0
- package/dist/contact/index.d.ts +17 -0
- package/dist/contact/index.d.ts.map +1 -0
- package/dist/contact/index.js +13 -0
- package/dist/contact/index.js.map +1 -0
- package/dist/contact/records.d.ts +124 -0
- package/dist/contact/records.d.ts.map +1 -0
- package/dist/contact/records.js +218 -0
- package/dist/contact/records.js.map +1 -0
- package/dist/contact/routes.d.ts +17 -0
- package/dist/contact/routes.d.ts.map +1 -0
- package/dist/contact/routes.js +127 -0
- package/dist/contact/routes.js.map +1 -0
- package/dist/contact/submission.d.ts +103 -0
- package/dist/contact/submission.d.ts.map +1 -0
- package/dist/contact/submission.js +166 -0
- package/dist/contact/submission.js.map +1 -0
- package/dist/content/document.d.ts +7 -2
- package/dist/content/document.d.ts.map +1 -1
- package/dist/content/document.js +1 -0
- package/dist/content/document.js.map +1 -1
- package/dist/content/index.d.ts +7 -2
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +4 -1
- package/dist/content/index.js.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +24 -2
- package/dist/content/markdown.js.map +1 -1
- package/dist/content/parser.d.ts.map +1 -1
- package/dist/content/parser.js +11 -4
- package/dist/content/parser.js.map +1 -1
- package/dist/content/save.d.ts +5 -0
- package/dist/content/save.d.ts.map +1 -1
- package/dist/content/save.js +44 -1
- package/dist/content/save.js.map +1 -1
- package/dist/content/schedule.d.ts +125 -0
- package/dist/content/schedule.d.ts.map +1 -0
- package/dist/content/schedule.js +207 -0
- package/dist/content/schedule.js.map +1 -0
- package/dist/content/search.d.ts +64 -0
- package/dist/content/search.d.ts.map +1 -0
- package/dist/content/search.js +136 -0
- package/dist/content/search.js.map +1 -0
- package/dist/content/store.d.ts +220 -7
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +392 -67
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts +7 -1
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +18 -10
- package/dist/content/sync.js.map +1 -1
- package/dist/content/time.d.ts +56 -0
- package/dist/content/time.d.ts.map +1 -0
- package/dist/content/time.js +141 -0
- package/dist/content/time.js.map +1 -0
- package/dist/content/writer.d.ts.map +1 -1
- package/dist/content/writer.js +3 -0
- package/dist/content/writer.js.map +1 -1
- package/dist/env.d.ts +70 -5
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/actor.d.ts +95 -41
- package/dist/federation/actor.d.ts.map +1 -1
- package/dist/federation/actor.js +180 -53
- package/dist/federation/actor.js.map +1 -1
- package/dist/federation/article.d.ts +44 -17
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +98 -46
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/delivery.d.ts +63 -15
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +154 -80
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts +22 -17
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +98 -77
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/followers.d.ts +3 -2
- package/dist/federation/followers.d.ts.map +1 -1
- package/dist/federation/followers.js +6 -5
- package/dist/federation/followers.js.map +1 -1
- package/dist/federation/import-wordpress.d.ts +128 -0
- package/dist/federation/import-wordpress.d.ts.map +1 -0
- package/dist/federation/import-wordpress.js +426 -0
- package/dist/federation/import-wordpress.js.map +1 -0
- package/dist/federation/inbox.d.ts +36 -13
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +120 -49
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +22 -10
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +13 -8
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/keys.d.ts +98 -20
- package/dist/federation/keys.d.ts.map +1 -1
- package/dist/federation/keys.js +269 -39
- package/dist/federation/keys.js.map +1 -1
- package/dist/federation/mount.d.ts +46 -10
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +300 -28
- package/dist/federation/mount.js.map +1 -1
- package/dist/federation/paths.d.ts +23 -35
- package/dist/federation/paths.d.ts.map +1 -1
- package/dist/federation/paths.js +26 -39
- package/dist/federation/paths.js.map +1 -1
- package/dist/federation/records.d.ts +223 -0
- package/dist/federation/records.d.ts.map +1 -0
- package/dist/federation/records.js +506 -0
- package/dist/federation/records.js.map +1 -0
- package/dist/federation/relays.d.ts +114 -0
- package/dist/federation/relays.d.ts.map +1 -0
- package/dist/federation/relays.js +290 -0
- package/dist/federation/relays.js.map +1 -0
- package/dist/federation/replies.d.ts +80 -0
- package/dist/federation/replies.d.ts.map +1 -0
- package/dist/federation/replies.js +166 -0
- package/dist/federation/replies.js.map +1 -0
- package/dist/federation/wordpress.d.ts +131 -0
- package/dist/federation/wordpress.d.ts.map +1 -0
- package/dist/federation/wordpress.js +341 -0
- package/dist/federation/wordpress.js.map +1 -0
- package/dist/files/atomic.d.ts +103 -0
- package/dist/files/atomic.d.ts.map +1 -0
- package/dist/files/atomic.js +150 -0
- package/dist/files/atomic.js.map +1 -0
- package/dist/files/index.d.ts +3 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +2 -0
- package/dist/files/index.js.map +1 -0
- package/dist/forms/protection.d.ts +85 -0
- package/dist/forms/protection.d.ts.map +1 -0
- package/dist/forms/protection.js +116 -0
- package/dist/forms/protection.js.map +1 -0
- package/dist/images/icons.d.ts +59 -0
- package/dist/images/icons.d.ts.map +1 -0
- package/dist/images/icons.js +131 -0
- package/dist/images/icons.js.map +1 -0
- package/dist/images/index.d.ts +7 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +4 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/markup.d.ts +47 -0
- package/dist/images/markup.d.ts.map +1 -0
- package/dist/images/markup.js +175 -0
- package/dist/images/markup.js.map +1 -0
- package/dist/images/paths.d.ts +34 -0
- package/dist/images/paths.d.ts.map +1 -0
- package/dist/images/paths.js +41 -0
- package/dist/images/paths.js.map +1 -0
- package/dist/images/variants.d.ts +104 -0
- package/dist/images/variants.d.ts.map +1 -0
- package/dist/images/variants.js +320 -0
- package/dist/images/variants.js.map +1 -0
- package/dist/index.d.ts +123 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +344 -25
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +18 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +34 -3
- package/dist/init.js.map +1 -1
- package/dist/mail/brevo.d.ts +35 -0
- package/dist/mail/brevo.d.ts.map +1 -0
- package/dist/mail/brevo.js +85 -0
- package/dist/mail/brevo.js.map +1 -0
- package/dist/mail/credentials.d.ts +62 -0
- package/dist/mail/credentials.d.ts.map +1 -0
- package/dist/mail/credentials.js +86 -0
- package/dist/mail/credentials.js.map +1 -0
- package/dist/mail/index.d.ts +15 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +8 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/memory.d.ts +35 -0
- package/dist/mail/memory.d.ts.map +1 -0
- package/dist/mail/memory.js +29 -0
- package/dist/mail/memory.js.map +1 -0
- package/dist/mail/provider.d.ts +80 -0
- package/dist/mail/provider.d.ts.map +1 -0
- package/dist/mail/provider.js +23 -0
- package/dist/mail/provider.js.map +1 -0
- package/dist/mail/service.d.ts +156 -0
- package/dist/mail/service.d.ts.map +1 -0
- package/dist/mail/service.js +265 -0
- package/dist/mail/service.js.map +1 -0
- package/dist/mail/smtp.d.ts +39 -0
- package/dist/mail/smtp.d.ts.map +1 -0
- package/dist/mail/smtp.js +58 -0
- package/dist/mail/smtp.js.map +1 -0
- package/dist/mail/templates.d.ts +91 -0
- package/dist/mail/templates.d.ts.map +1 -0
- package/dist/mail/templates.js +69 -0
- package/dist/mail/templates.js.map +1 -0
- package/dist/notifications/comments.d.ts +66 -0
- package/dist/notifications/comments.d.ts.map +1 -0
- package/dist/notifications/comments.js +151 -0
- package/dist/notifications/comments.js.map +1 -0
- package/dist/notifications/digest.d.ts +135 -0
- package/dist/notifications/digest.d.ts.map +1 -0
- package/dist/notifications/digest.js +287 -0
- package/dist/notifications/digest.js.map +1 -0
- package/dist/notifications/index.d.ts +13 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/links.d.ts +60 -0
- package/dist/notifications/links.d.ts.map +1 -0
- package/dist/notifications/links.js +63 -0
- package/dist/notifications/links.js.map +1 -0
- package/dist/notifications/optouts.d.ts +48 -0
- package/dist/notifications/optouts.d.ts.map +1 -0
- package/dist/notifications/optouts.js +93 -0
- package/dist/notifications/optouts.js.map +1 -0
- package/dist/notifications/preferences.d.ts +158 -0
- package/dist/notifications/preferences.d.ts.map +1 -0
- package/dist/notifications/preferences.js +195 -0
- package/dist/notifications/preferences.js.map +1 -0
- package/dist/notifications/routes.d.ts +28 -0
- package/dist/notifications/routes.d.ts.map +1 -0
- package/dist/notifications/routes.js +184 -0
- package/dist/notifications/routes.js.map +1 -0
- package/dist/notifications/tokens.d.ts +60 -0
- package/dist/notifications/tokens.d.ts.map +1 -0
- package/dist/notifications/tokens.js +125 -0
- package/dist/notifications/tokens.js.map +1 -0
- package/dist/notify.d.ts +84 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +149 -0
- package/dist/notify.js.map +1 -0
- package/dist/web/archive.d.ts +49 -0
- package/dist/web/archive.d.ts.map +1 -0
- package/dist/web/archive.js +59 -0
- package/dist/web/archive.js.map +1 -0
- package/dist/web/assets.d.ts +6 -5
- package/dist/web/assets.d.ts.map +1 -1
- package/dist/web/assets.js +5 -7
- package/dist/web/assets.js.map +1 -1
- package/dist/web/authors.d.ts +143 -0
- package/dist/web/authors.d.ts.map +1 -0
- package/dist/web/authors.js +178 -0
- package/dist/web/authors.js.map +1 -0
- package/dist/web/comments.d.ts +60 -0
- package/dist/web/comments.d.ts.map +1 -0
- package/dist/web/comments.js +207 -0
- package/dist/web/comments.js.map +1 -0
- package/dist/web/context.d.ts +162 -28
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +123 -26
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts +209 -0
- package/dist/web/conversation.d.ts.map +1 -0
- package/dist/web/conversation.js +557 -0
- package/dist/web/conversation.js.map +1 -0
- package/dist/web/documents.d.ts +36 -6
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +52 -10
- package/dist/web/documents.js.map +1 -1
- package/dist/web/feed-atom.d.ts +22 -0
- package/dist/web/feed-atom.d.ts.map +1 -0
- package/dist/web/feed-atom.js +83 -0
- package/dist/web/feed-atom.js.map +1 -0
- package/dist/web/feed-item.d.ts +145 -0
- package/dist/web/feed-item.d.ts.map +1 -0
- package/dist/web/feed-item.js +120 -0
- package/dist/web/feed-item.js.map +1 -0
- package/dist/web/feed-json.d.ts +79 -0
- package/dist/web/feed-json.d.ts.map +1 -0
- package/dist/web/feed-json.js +53 -0
- package/dist/web/feed-json.js.map +1 -0
- package/dist/web/feed-rss.d.ts +26 -0
- package/dist/web/feed-rss.d.ts.map +1 -0
- package/dist/web/feed-rss.js +203 -0
- package/dist/web/feed-rss.js.map +1 -0
- package/dist/web/feed-source.d.ts +244 -0
- package/dist/web/feed-source.d.ts.map +1 -0
- package/dist/web/feed-source.js +201 -0
- package/dist/web/feed-source.js.map +1 -0
- package/dist/web/feed-xml.d.ts +63 -0
- package/dist/web/feed-xml.d.ts.map +1 -0
- package/dist/web/feed-xml.js +116 -0
- package/dist/web/feed-xml.js.map +1 -0
- package/dist/web/feeds.d.ts +31 -96
- package/dist/web/feeds.d.ts.map +1 -1
- package/dist/web/feeds.js +94 -198
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/health.d.ts +31 -0
- package/dist/web/health.d.ts.map +1 -0
- package/dist/web/health.js +44 -0
- package/dist/web/health.js.map +1 -0
- package/dist/web/index.d.ts +30 -10
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +18 -7
- package/dist/web/index.js.map +1 -1
- package/dist/web/navigation.d.ts +195 -0
- package/dist/web/navigation.d.ts.map +1 -0
- package/dist/web/navigation.js +300 -0
- package/dist/web/navigation.js.map +1 -0
- package/dist/web/negotiate.d.ts +31 -0
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +31 -11
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/recent.d.ts +43 -0
- package/dist/web/recent.d.ts.map +1 -0
- package/dist/web/recent.js +37 -0
- package/dist/web/recent.js.map +1 -0
- package/dist/web/render.d.ts +203 -9
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +341 -17
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts +25 -8
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +854 -93
- package/dist/web/routes.js.map +1 -1
- package/dist/web/sanitize.d.ts +19 -0
- package/dist/web/sanitize.d.ts.map +1 -0
- package/dist/web/sanitize.js +272 -0
- package/dist/web/sanitize.js.map +1 -0
- package/dist/web/search.d.ts +79 -0
- package/dist/web/search.d.ts.map +1 -0
- package/dist/web/search.js +94 -0
- package/dist/web/search.js.map +1 -0
- package/dist/web/sitemap.d.ts +120 -0
- package/dist/web/sitemap.d.ts.map +1 -0
- package/dist/web/sitemap.js +199 -0
- package/dist/web/sitemap.js.map +1 -0
- package/dist/web/taxonomy.d.ts +152 -0
- package/dist/web/taxonomy.d.ts.map +1 -0
- package/dist/web/taxonomy.js +237 -0
- package/dist/web/taxonomy.js.map +1 -0
- package/dist/web/templates.d.ts +54 -16
- package/dist/web/templates.d.ts.map +1 -1
- package/dist/web/templates.js +109 -28
- package/dist/web/templates.js.map +1 -1
- package/dist/web/themes.d.ts +226 -0
- package/dist/web/themes.d.ts.map +1 -0
- package/dist/web/themes.js +314 -0
- package/dist/web/themes.js.map +1 -0
- package/dist/webmention/discovery.d.ts +51 -0
- package/dist/webmention/discovery.d.ts.map +1 -0
- package/dist/webmention/discovery.js +176 -0
- package/dist/webmention/discovery.js.map +1 -0
- package/dist/webmention/html.d.ts +71 -0
- package/dist/webmention/html.d.ts.map +1 -0
- package/dist/webmention/html.js +285 -0
- package/dist/webmention/html.js.map +1 -0
- package/dist/webmention/index.d.ts +12 -0
- package/dist/webmention/index.d.ts.map +1 -0
- package/dist/webmention/index.js +8 -0
- package/dist/webmention/index.js.map +1 -0
- package/dist/webmention/links.d.ts +18 -0
- package/dist/webmention/links.d.ts.map +1 -0
- package/dist/webmention/links.js +64 -0
- package/dist/webmention/links.js.map +1 -0
- package/dist/webmention/microformats.d.ts +93 -0
- package/dist/webmention/microformats.d.ts.map +1 -0
- package/dist/webmention/microformats.js +376 -0
- package/dist/webmention/microformats.js.map +1 -0
- package/dist/webmention/receive.d.ts +141 -0
- package/dist/webmention/receive.d.ts.map +1 -0
- package/dist/webmention/receive.js +264 -0
- package/dist/webmention/receive.js.map +1 -0
- package/dist/webmention/routes.d.ts +37 -0
- package/dist/webmention/routes.d.ts.map +1 -0
- package/dist/webmention/routes.js +75 -0
- package/dist/webmention/routes.js.map +1 -0
- package/dist/webmention/service.d.ts +94 -0
- package/dist/webmention/service.d.ts.map +1 -0
- package/dist/webmention/service.js +207 -0
- package/dist/webmention/service.js.map +1 -0
- package/package.json +11 -6
- package/templates/site/content/_data/site.json +8 -0
- package/templates/site/content/pages/about.md +7 -0
- package/templates/site/content/posts/2026-01-01-hello-world.md +5 -3
- package/templates/site/geekity.config.ts +11 -1
- package/templates/site/tsconfig.json +1 -1
- package/themes/default/README.md +1216 -50
- package/themes/default/layouts/404.njk +2 -3
- package/themes/default/layouts/author.njk +36 -0
- package/themes/default/layouts/base.njk +161 -31
- package/themes/default/layouts/category.njk +27 -0
- package/themes/default/layouts/front-page.njk +56 -0
- package/themes/default/layouts/home.njk +17 -1
- package/themes/default/layouts/page.njk +57 -5
- package/themes/default/layouts/post.njk +78 -19
- package/themes/default/layouts/search.njk +57 -0
- package/themes/default/layouts/tag.njk +3 -6
- package/themes/default/mail/comment-digest.html.njk +37 -0
- package/themes/default/mail/comment-digest.subject.njk +3 -0
- package/themes/default/mail/comment-digest.txt.njk +40 -0
- package/themes/default/mail/comment-pending.html.njk +27 -0
- package/themes/default/mail/comment-pending.subject.njk +2 -0
- package/themes/default/mail/comment-pending.txt.njk +24 -0
- package/themes/default/mail/comment-reply.html.njk +21 -0
- package/themes/default/mail/comment-reply.subject.njk +2 -0
- package/themes/default/mail/comment-reply.txt.njk +22 -0
- package/themes/default/mail/contact-message.html.njk +24 -0
- package/themes/default/mail/contact-message.subject.njk +5 -0
- package/themes/default/mail/contact-message.txt.njk +20 -0
- package/themes/default/mail/password-changed.html.njk +18 -0
- package/themes/default/mail/password-changed.subject.njk +2 -0
- package/themes/default/mail/password-changed.txt.njk +17 -0
- package/themes/default/mail/password-reset.html.njk +22 -0
- package/themes/default/mail/password-reset.subject.njk +2 -0
- package/themes/default/mail/password-reset.txt.njk +18 -0
- package/themes/default/mail/test.html.njk +14 -0
- package/themes/default/mail/test.subject.njk +2 -0
- package/themes/default/mail/test.txt.njk +12 -0
- package/themes/default/partials/archive.njk +27 -0
- package/themes/default/partials/bio.njk +71 -0
- package/themes/default/partials/comment-form.njk +137 -0
- package/themes/default/partials/contact-form.njk +88 -0
- package/themes/default/partials/conversation.njk +139 -0
- package/themes/default/partials/feeds.njk +26 -0
- package/themes/default/partials/jsonld.njk +120 -0
- package/themes/default/partials/menu.njk +32 -0
- package/themes/default/partials/pagination.njk +12 -6
- package/themes/default/partials/post-list.njk +51 -18
- package/themes/default/partials/search-form.njk +22 -0
- package/themes/default/partials/tags.njk +26 -5
- package/themes/default/static/highlight.js +4 -0
- package/themes/default/static/style.css +1142 -194
- package/themes/default/theme.json +9 -0
- package/admin/layouts/federation.njk +0 -145
- package/admin/layouts/login.njk +0 -23
- package/admin/layouts/settings.njk +0 -116
- package/admin/layouts/setup.njk +0 -27
- package/admin/layouts/users.njk +0 -91
- /package/admin/{layouts/_flash.njk → components/flash.njk} +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { elementsIn, parseHtml } from './html.js';
|
|
2
|
+
/**
|
|
3
|
+
* Which pages a post talks about.
|
|
4
|
+
*
|
|
5
|
+
* A webmention is "I wrote about you", so what goes out is decided by what the
|
|
6
|
+
* post links to. Only the links pointing somewhere else count: telling this
|
|
7
|
+
* site about its own pages would be a loop, and the conversation under a post
|
|
8
|
+
* is not the place for it.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Every external page a rendered body links to, in the order it links to them
|
|
12
|
+
* and each named once.
|
|
13
|
+
*
|
|
14
|
+
* A fragment is dropped. `#section` says where on a page to look and the page
|
|
15
|
+
* is what the webmention is about, so two links into one article are one
|
|
16
|
+
* target rather than two — and the `target` a receiver verifies is a page.
|
|
17
|
+
*/
|
|
18
|
+
export function externalLinks(html, baseUrl) {
|
|
19
|
+
const site = originOf(baseUrl);
|
|
20
|
+
const found = new Set();
|
|
21
|
+
for (const element of elementsIn(parseHtml(html))) {
|
|
22
|
+
if (element.name !== 'a')
|
|
23
|
+
continue;
|
|
24
|
+
const target = linkTarget(element.attributes['href'], baseUrl);
|
|
25
|
+
if (target === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
if (site !== undefined && originOf(target) === site)
|
|
28
|
+
continue;
|
|
29
|
+
found.add(target);
|
|
30
|
+
}
|
|
31
|
+
return [...found];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One `href` as the page it names, or `undefined` when it names none this can
|
|
35
|
+
* send a webmention to.
|
|
36
|
+
*
|
|
37
|
+
* Relative links are resolved against the site, which is where a rendered body
|
|
38
|
+
* lives; anything that is not http or https is not a page with an endpoint.
|
|
39
|
+
*/
|
|
40
|
+
function linkTarget(href, baseUrl) {
|
|
41
|
+
if (href === undefined || href.trim() === '')
|
|
42
|
+
return undefined;
|
|
43
|
+
let url;
|
|
44
|
+
try {
|
|
45
|
+
url = new URL(href, baseUrl);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
51
|
+
return undefined;
|
|
52
|
+
url.hash = '';
|
|
53
|
+
return url.href;
|
|
54
|
+
}
|
|
55
|
+
/** One URL's origin, or `undefined` when it is not a URL at all. */
|
|
56
|
+
function originOf(value) {
|
|
57
|
+
try {
|
|
58
|
+
return new URL(value).origin;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/webmention/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAElD;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG;YAAE,SAAS;QAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,SAAS;QAC9D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,IAAwB,EAAE,OAAe;IAC3D,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAE/D,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5E,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,oEAAoE;AACpE,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { HtmlElement } from './html.ts';
|
|
2
|
+
/**
|
|
3
|
+
* What somebody else's page says about this one.
|
|
4
|
+
*
|
|
5
|
+
* Two questions, and the receiver asks them in this order: does the source
|
|
6
|
+
* really link to the target ({@link linksTo}, which is the whole of what
|
|
7
|
+
* verification means), and if it does, what is it — a reply, a like, a repost
|
|
8
|
+
* or a plain mention — and who wrote it ({@link sourceEntry}).
|
|
9
|
+
*
|
|
10
|
+
* The second question is microformats2, of which this reads a deliberate
|
|
11
|
+
* subset: `h-entry` and `h-card`, the four properties that say what a mention
|
|
12
|
+
* is, and the four that say who and what and when. A full mf2 parser —
|
|
13
|
+
* `microformats-parser` is the usual one, MIT, and it pulls `parse5` with it —
|
|
14
|
+
* implements nested items, backcompat with classic `hentry`, `rel-urls`,
|
|
15
|
+
* implied properties in all their detail and the value-class pattern, none of
|
|
16
|
+
* which changes what ends up in a comment file. The subset here is around two
|
|
17
|
+
* hundred lines against a dependency tree, so it is the subset.
|
|
18
|
+
*
|
|
19
|
+
* Everything it reads is a stranger's markup, so nothing here throws and
|
|
20
|
+
* nothing it returns is trusted: the HTML goes through `sanitizeCommentHtml`
|
|
21
|
+
* before it is stored, and every URL is resolved and re-serialised.
|
|
22
|
+
*/
|
|
23
|
+
/** What kind of thing a source page is, as far as the target is concerned. */
|
|
24
|
+
export type WebmentionKind = 'reply' | 'like' | 'repost' | 'mention';
|
|
25
|
+
/** What a source page turned out to be. */
|
|
26
|
+
export interface SourceEntry {
|
|
27
|
+
/** Which of the four it is. */
|
|
28
|
+
readonly kind: WebmentionKind;
|
|
29
|
+
/** Who wrote it, as far as the page says. */
|
|
30
|
+
readonly author: {
|
|
31
|
+
/** Their name, or the source's host when the page never gives one. */
|
|
32
|
+
readonly name: string;
|
|
33
|
+
/** Their own page, or `null`. */
|
|
34
|
+
readonly url: string | null;
|
|
35
|
+
/** Their avatar, or `null`. */
|
|
36
|
+
readonly photo: string | null;
|
|
37
|
+
};
|
|
38
|
+
/** What it says. */
|
|
39
|
+
readonly content: {
|
|
40
|
+
/** The markup of its `e-content`, **unsanitised**, or empty. */
|
|
41
|
+
readonly html: string;
|
|
42
|
+
/** The same as text, or the page's title when it has no content at all. */
|
|
43
|
+
readonly text: string;
|
|
44
|
+
};
|
|
45
|
+
/** When it says it was published, as an ISO 8601 instant, or `null`. */
|
|
46
|
+
readonly published: string | null;
|
|
47
|
+
/** Where it lives: its own `u-url`, else the URL it was fetched from. */
|
|
48
|
+
readonly url: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether a source page really links to the target.
|
|
52
|
+
*
|
|
53
|
+
* This is verification, and it is deliberately about links rather than about
|
|
54
|
+
* text: a page that merely writes the target's address out is not talking to
|
|
55
|
+
* it, and one that links to it in an `<img>`, a `<video>` or a `<link>` is.
|
|
56
|
+
* The comparison is on the whole URL after both sides are resolved and
|
|
57
|
+
* normalised, so a link written relative counts and a link to a different page
|
|
58
|
+
* on the same site does not.
|
|
59
|
+
*/
|
|
60
|
+
export declare function linksTo(html: string, sourceUrl: string, target: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* What a source page is, read out of its microformats.
|
|
63
|
+
*
|
|
64
|
+
* The entry chosen is the one that is actually about the target: the first
|
|
65
|
+
* `h-entry` whose `in-reply-to`, `like-of` or `repost-of` names it, else the
|
|
66
|
+
* first that links to it at all, else the first on the page. A page with no
|
|
67
|
+
* `h-entry` is still a mention — plenty of pages have no microformats and
|
|
68
|
+
* still link — and it is described from its `<title>` and its host.
|
|
69
|
+
*/
|
|
70
|
+
export declare function sourceEntry(html: string, sourceUrl: string, target: string): SourceEntry;
|
|
71
|
+
/** One microformat found on a page. */
|
|
72
|
+
export interface MicroformatItem {
|
|
73
|
+
/** Its types: `h-entry`, `h-card` and so on. */
|
|
74
|
+
readonly types: readonly string[];
|
|
75
|
+
/** Its properties, each of which may have been written more than once. */
|
|
76
|
+
readonly properties: Readonly<Record<string, MicroformatValue[]>>;
|
|
77
|
+
/** The microformats inside it that are not properties of it. */
|
|
78
|
+
readonly children: readonly MicroformatItem[];
|
|
79
|
+
/** The element it was read off, for the questions the properties cannot answer. */
|
|
80
|
+
readonly element: HtmlElement;
|
|
81
|
+
}
|
|
82
|
+
/** One value of one property. */
|
|
83
|
+
export interface MicroformatValue {
|
|
84
|
+
/** The value as text, or as a URL for a `u-` property. */
|
|
85
|
+
readonly text: string;
|
|
86
|
+
/** The markup, for an `e-` property. */
|
|
87
|
+
readonly html?: string;
|
|
88
|
+
/** The microformat the value was, when it was one. */
|
|
89
|
+
readonly item?: MicroformatItem;
|
|
90
|
+
}
|
|
91
|
+
/** The microformats at the top of a page: roots that are inside no other root. */
|
|
92
|
+
export declare function itemsIn(root: HtmlElement, base: string): MicroformatItem[];
|
|
93
|
+
//# sourceMappingURL=microformats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microformats.d.ts","sourceRoot":"","sources":["../../src/webmention/microformats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AASrE,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE;QACf,sEAAsE;QACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,iCAAiC;QACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,+BAA+B;QAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;IACF,oBAAoB;IACpB,QAAQ,CAAC,OAAO,EAAE;QAChB,gEAAgE;QAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,2EAA2E;QAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOhF;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAkBxF;AAgHD,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAClE,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;CACjC;AAwBD,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAa1E"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { classesOf, elementsIn, innerHtmlOf, isElement, parseHtml, textOf } from './html.js';
|
|
2
|
+
/** The property whose value naming the target makes a mention that kind. */
|
|
3
|
+
const KIND_PROPERTIES = {
|
|
4
|
+
'in-reply-to': 'reply',
|
|
5
|
+
'like-of': 'like',
|
|
6
|
+
'repost-of': 'repost',
|
|
7
|
+
};
|
|
8
|
+
/** The attributes that make an element a link to somewhere. */
|
|
9
|
+
const LINK_ATTRIBUTES = ['href', 'src', 'data', 'poster', 'cite'];
|
|
10
|
+
/**
|
|
11
|
+
* Whether a source page really links to the target.
|
|
12
|
+
*
|
|
13
|
+
* This is verification, and it is deliberately about links rather than about
|
|
14
|
+
* text: a page that merely writes the target's address out is not talking to
|
|
15
|
+
* it, and one that links to it in an `<img>`, a `<video>` or a `<link>` is.
|
|
16
|
+
* The comparison is on the whole URL after both sides are resolved and
|
|
17
|
+
* normalised, so a link written relative counts and a link to a different page
|
|
18
|
+
* on the same site does not.
|
|
19
|
+
*/
|
|
20
|
+
export function linksTo(html, sourceUrl, target) {
|
|
21
|
+
const root = parseHtml(html);
|
|
22
|
+
const base = baseOf(root, sourceUrl);
|
|
23
|
+
const wanted = normalize(target, target);
|
|
24
|
+
if (wanted === undefined)
|
|
25
|
+
return false;
|
|
26
|
+
return linkedFrom(root, base).has(wanted);
|
|
27
|
+
}
|
|
28
|
+
/** Every URL an element and everything under it links to, normalised. */
|
|
29
|
+
function linkedFrom(root, base) {
|
|
30
|
+
const found = new Set();
|
|
31
|
+
for (const element of elementsIn(root)) {
|
|
32
|
+
for (const attribute of LINK_ATTRIBUTES) {
|
|
33
|
+
const value = element.attributes[attribute];
|
|
34
|
+
if (value === undefined)
|
|
35
|
+
continue;
|
|
36
|
+
const resolved = normalize(value, base);
|
|
37
|
+
if (resolved !== undefined)
|
|
38
|
+
found.add(resolved);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return found;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* What a source page is, read out of its microformats.
|
|
45
|
+
*
|
|
46
|
+
* The entry chosen is the one that is actually about the target: the first
|
|
47
|
+
* `h-entry` whose `in-reply-to`, `like-of` or `repost-of` names it, else the
|
|
48
|
+
* first that links to it at all, else the first on the page. A page with no
|
|
49
|
+
* `h-entry` is still a mention — plenty of pages have no microformats and
|
|
50
|
+
* still link — and it is described from its `<title>` and its host.
|
|
51
|
+
*/
|
|
52
|
+
export function sourceEntry(html, sourceUrl, target) {
|
|
53
|
+
const root = parseHtml(html);
|
|
54
|
+
const base = baseOf(root, sourceUrl);
|
|
55
|
+
const items = itemsIn(root, base);
|
|
56
|
+
const entries = itemsOfType(items, 'h-entry');
|
|
57
|
+
const wanted = normalize(target, target);
|
|
58
|
+
const chosen = chooseEntry(entries, wanted, base);
|
|
59
|
+
const author = authorOf(chosen, items, sourceUrl);
|
|
60
|
+
const content = contentOf(chosen, root);
|
|
61
|
+
return {
|
|
62
|
+
kind: chosen === undefined ? 'mention' : kindOf(chosen, wanted),
|
|
63
|
+
author,
|
|
64
|
+
content,
|
|
65
|
+
published: chosen === undefined ? null : instantOf(first(chosen, 'published')),
|
|
66
|
+
url: (chosen === undefined ? undefined : first(chosen, 'url')?.text) ?? sourceUrl,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** The entry a webmention is about, or `undefined` when the page has none. */
|
|
70
|
+
function chooseEntry(entries, target, base) {
|
|
71
|
+
if (target !== undefined) {
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (kindOf(entry, target) !== 'mention')
|
|
74
|
+
return entry;
|
|
75
|
+
}
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
if (linkedFrom(entry.element, base).has(target))
|
|
78
|
+
return entry;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return entries[0];
|
|
82
|
+
}
|
|
83
|
+
/** Which of the four an entry is, given what the target is. */
|
|
84
|
+
function kindOf(entry, target) {
|
|
85
|
+
if (target === undefined)
|
|
86
|
+
return 'mention';
|
|
87
|
+
for (const [property, kind] of Object.entries(KIND_PROPERTIES)) {
|
|
88
|
+
for (const value of entry.properties[property] ?? []) {
|
|
89
|
+
if (value.text === target)
|
|
90
|
+
return kind;
|
|
91
|
+
// A property written as a nested `h-cite` names the target with its own
|
|
92
|
+
// `url` rather than with the value the property carries.
|
|
93
|
+
if (value.item !== undefined && first(value.item, 'url')?.text === target)
|
|
94
|
+
return kind;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return 'mention';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Who wrote an entry.
|
|
101
|
+
*
|
|
102
|
+
* The entry's own `p-author` first, then a representative `h-card` on the page,
|
|
103
|
+
* then the source's host — which is not a name but is the truest thing the site
|
|
104
|
+
* knows, and is better on a page than an empty byline.
|
|
105
|
+
*/
|
|
106
|
+
function authorOf(entry, items, sourceUrl) {
|
|
107
|
+
const named = entry === undefined ? undefined : first(entry, 'author');
|
|
108
|
+
if (named?.item !== undefined)
|
|
109
|
+
return cardOf(named.item);
|
|
110
|
+
if (named !== undefined && named.text !== '') {
|
|
111
|
+
return { name: named.text, url: null, photo: null };
|
|
112
|
+
}
|
|
113
|
+
const card = itemsOfType(items, 'h-card')[0];
|
|
114
|
+
if (card !== undefined) {
|
|
115
|
+
const read = cardOf(card);
|
|
116
|
+
if (read.name !== '')
|
|
117
|
+
return read;
|
|
118
|
+
}
|
|
119
|
+
return { name: hostOf(sourceUrl), url: null, photo: null };
|
|
120
|
+
}
|
|
121
|
+
/** One `h-card` as a name, a page and an avatar. */
|
|
122
|
+
function cardOf(card) {
|
|
123
|
+
return {
|
|
124
|
+
name: first(card, 'name')?.text ?? '',
|
|
125
|
+
url: first(card, 'url')?.text ?? null,
|
|
126
|
+
photo: first(card, 'photo')?.text ?? null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** What an entry says, or the page's title when it says nothing. */
|
|
130
|
+
function contentOf(entry, root) {
|
|
131
|
+
const content = entry === undefined ? undefined : first(entry, 'content');
|
|
132
|
+
if (content !== undefined && (content.html ?? '') !== '') {
|
|
133
|
+
return { html: content.html ?? '', text: content.text };
|
|
134
|
+
}
|
|
135
|
+
const summary = entry === undefined ? undefined : (first(entry, 'summary') ?? first(entry, 'name'));
|
|
136
|
+
if (summary !== undefined && summary.text !== '')
|
|
137
|
+
return { html: '', text: summary.text };
|
|
138
|
+
return { html: '', text: titleOf(root) };
|
|
139
|
+
}
|
|
140
|
+
/** The page's `<title>`, or an empty string. */
|
|
141
|
+
function titleOf(root) {
|
|
142
|
+
for (const element of elementsIn(root)) {
|
|
143
|
+
if (element.name === 'title')
|
|
144
|
+
return textOf(element);
|
|
145
|
+
}
|
|
146
|
+
return '';
|
|
147
|
+
}
|
|
148
|
+
/** A `dt-published` as an ISO instant, or `null` when it is not a date. */
|
|
149
|
+
function instantOf(value) {
|
|
150
|
+
if (value === undefined || value.text === '')
|
|
151
|
+
return null;
|
|
152
|
+
const at = new Date(value.text);
|
|
153
|
+
return Number.isNaN(at.getTime()) ? null : at.toISOString();
|
|
154
|
+
}
|
|
155
|
+
/** The host a source is on, for a page that never says who wrote it. */
|
|
156
|
+
function hostOf(sourceUrl) {
|
|
157
|
+
try {
|
|
158
|
+
return new URL(sourceUrl).host;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return sourceUrl;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** The first value of one property, or `undefined`. */
|
|
165
|
+
function first(item, property) {
|
|
166
|
+
return item.properties[property]?.[0];
|
|
167
|
+
}
|
|
168
|
+
/** Every item of one type, at any depth. */
|
|
169
|
+
function itemsOfType(items, type) {
|
|
170
|
+
const found = [];
|
|
171
|
+
for (const item of items) {
|
|
172
|
+
if (item.types.includes(type))
|
|
173
|
+
found.push(item);
|
|
174
|
+
found.push(...itemsOfType(item.children, type));
|
|
175
|
+
for (const values of Object.values(item.properties)) {
|
|
176
|
+
for (const value of values) {
|
|
177
|
+
if (value.item !== undefined)
|
|
178
|
+
found.push(...itemsOfType([value.item], type));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return found;
|
|
183
|
+
}
|
|
184
|
+
/** The microformats at the top of a page: roots that are inside no other root. */
|
|
185
|
+
export function itemsIn(root, base) {
|
|
186
|
+
const items = [];
|
|
187
|
+
const walk = (element) => {
|
|
188
|
+
for (const child of element.children) {
|
|
189
|
+
if (!isElement(child))
|
|
190
|
+
continue;
|
|
191
|
+
if (rootTypesOf(child).length > 0)
|
|
192
|
+
items.push(parseItem(child, base));
|
|
193
|
+
else
|
|
194
|
+
walk(child);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
walk(root);
|
|
198
|
+
return items;
|
|
199
|
+
}
|
|
200
|
+
/** The `h-*` classes an element carries. */
|
|
201
|
+
function rootTypesOf(element) {
|
|
202
|
+
return classesOf(element).filter((name) => name.startsWith('h-') && name.length > 2);
|
|
203
|
+
}
|
|
204
|
+
/** The property classes an element carries, as `{prefix, name}` pairs. */
|
|
205
|
+
function propertiesOf(element) {
|
|
206
|
+
const found = [];
|
|
207
|
+
for (const value of classesOf(element)) {
|
|
208
|
+
const match = /^(p|u|e|dt)-(.+)$/.exec(value);
|
|
209
|
+
if (match !== null)
|
|
210
|
+
found.push({ prefix: match[1] ?? '', name: match[2] ?? '' });
|
|
211
|
+
}
|
|
212
|
+
return found;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* One microformat, with the properties written inside it.
|
|
216
|
+
*
|
|
217
|
+
* The walk stops at a nested root: an `h-card` inside an `h-entry` is a value
|
|
218
|
+
* of the entry, and the card's own `p-name` is the card's rather than the
|
|
219
|
+
* entry's. That one rule is what keeps an author's name out of the entry's
|
|
220
|
+
* title.
|
|
221
|
+
*/
|
|
222
|
+
function parseItem(element, base) {
|
|
223
|
+
const properties = {};
|
|
224
|
+
const children = [];
|
|
225
|
+
const add = (name, value) => {
|
|
226
|
+
(properties[name] ??= []).push(value);
|
|
227
|
+
};
|
|
228
|
+
const walk = (parent) => {
|
|
229
|
+
for (const child of parent.children) {
|
|
230
|
+
if (!isElement(child))
|
|
231
|
+
continue;
|
|
232
|
+
const roots = rootTypesOf(child);
|
|
233
|
+
const named = propertiesOf(child);
|
|
234
|
+
if (roots.length > 0) {
|
|
235
|
+
const nested = parseItem(child, base);
|
|
236
|
+
if (named.length === 0)
|
|
237
|
+
children.push(nested);
|
|
238
|
+
else {
|
|
239
|
+
for (const { prefix, name } of named) {
|
|
240
|
+
add(name, { text: nestedText(prefix, nested, child, base), item: nested });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
for (const { prefix, name } of named)
|
|
246
|
+
add(name, valueOf(prefix, child, base));
|
|
247
|
+
walk(child);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
walk(element);
|
|
251
|
+
implied(element, properties, base);
|
|
252
|
+
return { types: rootTypesOf(element), properties, children, element };
|
|
253
|
+
}
|
|
254
|
+
/** What a nested microformat is worth as a value of the property holding it. */
|
|
255
|
+
function nestedText(prefix, item, element, base) {
|
|
256
|
+
if (prefix === 'u')
|
|
257
|
+
return first(item, 'url')?.text ?? valueOf('u', element, base).text;
|
|
258
|
+
return first(item, 'name')?.text ?? textOf(element);
|
|
259
|
+
}
|
|
260
|
+
/** One element as the value of one property. */
|
|
261
|
+
function valueOf(prefix, element, base) {
|
|
262
|
+
const attributes = element.attributes;
|
|
263
|
+
if (prefix === 'u') {
|
|
264
|
+
const raw = attributeFor(element, ['a', 'area', 'link'], 'href') ??
|
|
265
|
+
attributeFor(element, ['img', 'audio', 'video', 'source', 'iframe'], 'src') ??
|
|
266
|
+
attributeFor(element, ['object'], 'data') ??
|
|
267
|
+
attributeFor(element, ['video'], 'poster') ??
|
|
268
|
+
attributeFor(element, ['data'], 'value') ??
|
|
269
|
+
textOf(element);
|
|
270
|
+
return { text: normalize(raw, base) ?? raw.trim() };
|
|
271
|
+
}
|
|
272
|
+
if (prefix === 'dt') {
|
|
273
|
+
return {
|
|
274
|
+
text: attributeFor(element, ['time', 'ins', 'del'], 'datetime') ??
|
|
275
|
+
attributeFor(element, ['abbr'], 'title') ??
|
|
276
|
+
attributeFor(element, ['data'], 'value') ??
|
|
277
|
+
textOf(element),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
if (prefix === 'e')
|
|
281
|
+
return { text: textOf(element), html: innerHtmlOf(element) };
|
|
282
|
+
return {
|
|
283
|
+
text: attributeFor(element, ['img', 'area'], 'alt') ??
|
|
284
|
+
attributeFor(element, ['abbr'], 'title') ??
|
|
285
|
+
attributeFor(element, ['data', 'input'], 'value') ??
|
|
286
|
+
(element.name === 'meta' ? attributes['content'] : undefined) ??
|
|
287
|
+
textOf(element),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/** One attribute, when the element is one of these and carries it. */
|
|
291
|
+
function attributeFor(element, names, attribute) {
|
|
292
|
+
if (!names.includes(element.name))
|
|
293
|
+
return undefined;
|
|
294
|
+
return element.attributes[attribute];
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* The name, the page and the avatar a microformat implies when it did not
|
|
298
|
+
* spell them out.
|
|
299
|
+
*
|
|
300
|
+
* `<a class="h-card" href="https://ada.example/">Ada</a>` is the commonest
|
|
301
|
+
* `h-card` on the web and says none of its three properties explicitly. The
|
|
302
|
+
* full rules are longer than this; what is here covers the shapes a webmention
|
|
303
|
+
* actually arrives in and stops short of guessing.
|
|
304
|
+
*/
|
|
305
|
+
function implied(element, properties, base) {
|
|
306
|
+
if (properties['name'] === undefined) {
|
|
307
|
+
const name = attributeFor(element, ['img', 'area'], 'alt') ??
|
|
308
|
+
attributeFor(element, ['abbr'], 'title') ??
|
|
309
|
+
textOf(element);
|
|
310
|
+
if (name !== '')
|
|
311
|
+
properties['name'] = [{ text: name }];
|
|
312
|
+
}
|
|
313
|
+
if (properties['url'] === undefined) {
|
|
314
|
+
const href = attributeFor(element, ['a', 'area', 'link'], 'href') ??
|
|
315
|
+
onlyAttribute(element, ['a', 'area', 'link'], 'href');
|
|
316
|
+
const url = href === undefined ? undefined : normalize(href, base);
|
|
317
|
+
if (url !== undefined)
|
|
318
|
+
properties['url'] = [{ text: url }];
|
|
319
|
+
}
|
|
320
|
+
if (properties['photo'] === undefined) {
|
|
321
|
+
const src = attributeFor(element, ['img'], 'src') ?? onlyAttribute(element, ['img'], 'src');
|
|
322
|
+
const photo = src === undefined ? undefined : normalize(src, base);
|
|
323
|
+
if (photo !== undefined)
|
|
324
|
+
properties['photo'] = [{ text: photo }];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* The attribute of the one such element inside this one, when there is exactly
|
|
329
|
+
* one and it is not a microformat of its own.
|
|
330
|
+
*
|
|
331
|
+
* Exactly one, because two links inside a card give no reason to prefer
|
|
332
|
+
* either, and a guess in a byline is worse than an empty one.
|
|
333
|
+
*/
|
|
334
|
+
function onlyAttribute(element, names, attribute) {
|
|
335
|
+
let found;
|
|
336
|
+
for (const candidate of elementsIn(element)) {
|
|
337
|
+
if (!names.includes(candidate.name))
|
|
338
|
+
continue;
|
|
339
|
+
if (rootTypesOf(candidate).length > 0)
|
|
340
|
+
continue;
|
|
341
|
+
const value = candidate.attributes[attribute];
|
|
342
|
+
if (value === undefined)
|
|
343
|
+
continue;
|
|
344
|
+
if (found !== undefined)
|
|
345
|
+
return undefined;
|
|
346
|
+
found = value;
|
|
347
|
+
}
|
|
348
|
+
return found;
|
|
349
|
+
}
|
|
350
|
+
/** The `<base href>` a page declares, or the URL it was fetched from. */
|
|
351
|
+
function baseOf(root, sourceUrl) {
|
|
352
|
+
for (const element of elementsIn(root)) {
|
|
353
|
+
if (element.name !== 'base')
|
|
354
|
+
continue;
|
|
355
|
+
const href = element.attributes['href'];
|
|
356
|
+
if (href === undefined)
|
|
357
|
+
continue;
|
|
358
|
+
const resolved = normalize(href, sourceUrl);
|
|
359
|
+
if (resolved !== undefined)
|
|
360
|
+
return resolved;
|
|
361
|
+
}
|
|
362
|
+
return sourceUrl;
|
|
363
|
+
}
|
|
364
|
+
/** One href as an absolute URL, or `undefined` when it is not one. */
|
|
365
|
+
function normalize(href, base) {
|
|
366
|
+
const trimmed = href.trim();
|
|
367
|
+
if (trimmed === '')
|
|
368
|
+
return undefined;
|
|
369
|
+
try {
|
|
370
|
+
return new URL(trimmed, base).href;
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return undefined;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=microformats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microformats.js","sourceRoot":"","sources":["../../src/webmention/microformats.ts"],"names":[],"mappings":"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"}
|