@geekity/cms 0.17.0 → 0.18.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 +162 -50
- package/admin/pages/documents/editor.njk +63 -0
- package/admin/pages/documents/list.njk +2 -0
- package/admin/pages/indieauth/consent.njk +4 -0
- package/admin/pages/settings/privacy.njk +37 -0
- package/admin/pages/users/apps.njk +109 -3
- package/dist/admin/documents.d.ts +29 -1
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +88 -6
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/index.d.ts +1 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/location-field.d.ts +26 -0
- package/dist/admin/location-field.d.ts.map +1 -0
- package/dist/admin/location-field.js +90 -0
- package/dist/admin/location-field.js.map +1 -0
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +1 -0
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +18 -5
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/read-field.d.ts +23 -0
- package/dist/admin/read-field.d.ts.map +1 -0
- package/dist/admin/read-field.js +53 -0
- package/dist/admin/read-field.js.map +1 -0
- package/dist/admin/settings-page.d.ts +3 -3
- package/dist/admin/settings-page.js +2 -2
- package/dist/admin/settings-pages.d.ts +2 -2
- package/dist/admin/settings-pages.d.ts.map +1 -1
- package/dist/admin/settings-pages.js +4 -2
- package/dist/admin/settings-pages.js.map +1 -1
- package/dist/admin/settings-privacy.d.ts +3 -0
- package/dist/admin/settings-privacy.d.ts.map +1 -0
- package/dist/admin/settings-privacy.js +10 -0
- package/dist/admin/settings-privacy.js.map +1 -0
- package/dist/admin/settings-reading.js +2 -2
- package/dist/admin/settings-reading.js.map +1 -1
- package/dist/admin/settings.d.ts +18 -2
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +27 -0
- package/dist/admin/settings.js.map +1 -1
- package/dist/admin/templates.d.ts +1 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +1 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/uploads.d.ts.map +1 -1
- package/dist/admin/uploads.js +14 -1
- package/dist/admin/uploads.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -1
- package/dist/comments/routes.js +2 -2
- package/dist/comments/routes.js.map +1 -1
- package/dist/contact/routes.js +2 -2
- package/dist/contact/routes.js.map +1 -1
- package/dist/content/location.d.ts +58 -0
- package/dist/content/location.d.ts.map +1 -0
- package/dist/content/location.js +208 -0
- package/dist/content/location.js.map +1 -0
- package/dist/content/locations.d.ts +9 -0
- package/dist/content/locations.d.ts.map +1 -0
- package/dist/content/locations.js +82 -0
- package/dist/content/locations.js.map +1 -0
- package/dist/content/metadata/gif.d.ts +3 -0
- package/dist/content/metadata/gif.d.ts.map +1 -0
- package/dist/content/metadata/gif.js +65 -0
- package/dist/content/metadata/gif.js.map +1 -0
- package/dist/content/metadata/index.d.ts +6 -0
- package/dist/content/metadata/index.d.ts.map +1 -0
- package/dist/content/metadata/index.js +24 -0
- package/dist/content/metadata/index.js.map +1 -0
- package/dist/content/metadata/isobmff.d.ts +22 -0
- package/dist/content/metadata/isobmff.d.ts.map +1 -0
- package/dist/content/metadata/isobmff.js +215 -0
- package/dist/content/metadata/isobmff.js.map +1 -0
- package/dist/content/metadata/jpeg.d.ts +3 -0
- package/dist/content/metadata/jpeg.d.ts.map +1 -0
- package/dist/content/metadata/jpeg.js +117 -0
- package/dist/content/metadata/jpeg.js.map +1 -0
- package/dist/content/metadata/png.d.ts +3 -0
- package/dist/content/metadata/png.d.ts.map +1 -0
- package/dist/content/metadata/png.js +74 -0
- package/dist/content/metadata/png.js.map +1 -0
- package/dist/content/metadata/shared.d.ts +17 -0
- package/dist/content/metadata/shared.d.ts.map +1 -0
- package/dist/content/metadata/shared.js +42 -0
- package/dist/content/metadata/shared.js.map +1 -0
- package/dist/content/metadata/sweep.d.ts +14 -0
- package/dist/content/metadata/sweep.d.ts.map +1 -0
- package/dist/content/metadata/sweep.js +54 -0
- package/dist/content/metadata/sweep.js.map +1 -0
- package/dist/content/metadata/tiff.d.ts +7 -0
- package/dist/content/metadata/tiff.d.ts.map +1 -0
- package/dist/content/metadata/tiff.js +56 -0
- package/dist/content/metadata/tiff.js.map +1 -0
- package/dist/content/metadata/webp.d.ts +3 -0
- package/dist/content/metadata/webp.d.ts.map +1 -0
- package/dist/content/metadata/webp.js +67 -0
- package/dist/content/metadata/webp.js.map +1 -0
- package/dist/content/post-type.d.ts +4 -2
- package/dist/content/post-type.d.ts.map +1 -1
- package/dist/content/post-type.js +9 -1
- package/dist/content/post-type.js.map +1 -1
- package/dist/content/read.d.ts +22 -0
- package/dist/content/read.d.ts.map +1 -0
- package/dist/content/read.js +67 -0
- package/dist/content/read.js.map +1 -0
- package/dist/content/store.d.ts +4 -4
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +19 -39
- package/dist/content/store.js.map +1 -1
- package/dist/content/sync.d.ts.map +1 -1
- package/dist/content/sync.js +3 -13
- package/dist/content/sync.js.map +1 -1
- package/dist/content/visibility.d.ts +11 -0
- package/dist/content/visibility.d.ts.map +1 -0
- package/dist/content/visibility.js +14 -0
- package/dist/content/visibility.js.map +1 -0
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +41 -14
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/delivery.d.ts +3 -1
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +6 -5
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/mount.d.ts.map +1 -1
- package/dist/federation/mount.js +3 -1
- package/dist/federation/mount.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/indexnow.js +2 -2
- package/dist/indexnow.js.map +1 -1
- package/dist/indieauth/activity-log.d.ts +2 -0
- package/dist/indieauth/activity-log.d.ts.map +1 -1
- package/dist/indieauth/activity-log.js +12 -2
- package/dist/indieauth/activity-log.js.map +1 -1
- package/dist/indieauth/app-activity.js +5 -1
- package/dist/indieauth/app-activity.js.map +1 -1
- package/dist/indieauth/bearer.d.ts.map +1 -1
- package/dist/indieauth/bearer.js +17 -16
- package/dist/indieauth/bearer.js.map +1 -1
- package/dist/indieauth/client-id.d.ts +10 -0
- package/dist/indieauth/client-id.d.ts.map +1 -0
- package/dist/indieauth/client-id.js +30 -0
- package/dist/indieauth/client-id.js.map +1 -0
- package/dist/indieauth/connected-apps.d.ts +4 -0
- package/dist/indieauth/connected-apps.d.ts.map +1 -1
- package/dist/indieauth/connected-apps.js +149 -20
- package/dist/indieauth/connected-apps.js.map +1 -1
- package/dist/indieauth/consent.d.ts.map +1 -1
- package/dist/indieauth/consent.js +5 -1
- package/dist/indieauth/consent.js.map +1 -1
- package/dist/indieauth/grants.d.ts +2 -7
- package/dist/indieauth/grants.d.ts.map +1 -1
- package/dist/indieauth/grants.js.map +1 -1
- package/dist/indieauth/redeem.d.ts.map +1 -1
- package/dist/indieauth/redeem.js +10 -5
- package/dist/indieauth/redeem.js.map +1 -1
- package/dist/indieauth/request.d.ts +8 -4
- package/dist/indieauth/request.d.ts.map +1 -1
- package/dist/indieauth/request.js +29 -30
- package/dist/indieauth/request.js.map +1 -1
- package/dist/indieauth/token.js +1 -1
- package/dist/indieauth/token.js.map +1 -1
- package/dist/indieauth/tokens.d.ts +28 -7
- package/dist/indieauth/tokens.d.ts.map +1 -1
- package/dist/indieauth/tokens.js +26 -5
- package/dist/indieauth/tokens.js.map +1 -1
- package/dist/micropub/create.d.ts +22 -0
- package/dist/micropub/create.d.ts.map +1 -1
- package/dist/micropub/create.js +107 -8
- package/dist/micropub/create.js.map +1 -1
- package/dist/micropub/endpoint.d.ts.map +1 -1
- package/dist/micropub/endpoint.js +71 -20
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/micropub/media.d.ts +4 -2
- package/dist/micropub/media.d.ts.map +1 -1
- package/dist/micropub/media.js +41 -37
- package/dist/micropub/media.js.map +1 -1
- package/dist/micropub/update.d.ts +6 -2
- package/dist/micropub/update.d.ts.map +1 -1
- package/dist/micropub/update.js +31 -3
- package/dist/micropub/update.js.map +1 -1
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +2 -5
- package/dist/notify.js.map +1 -1
- package/dist/web/absolute-urls.d.ts +2 -0
- package/dist/web/absolute-urls.d.ts.map +1 -0
- package/dist/web/absolute-urls.js +22 -0
- package/dist/web/absolute-urls.js.map +1 -0
- package/dist/web/context.d.ts +29 -1
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +33 -0
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +5 -4
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/documents.d.ts +19 -10
- package/dist/web/documents.d.ts.map +1 -1
- package/dist/web/documents.js +28 -13
- package/dist/web/documents.js.map +1 -1
- package/dist/web/feed-item.d.ts +25 -6
- package/dist/web/feed-item.d.ts.map +1 -1
- package/dist/web/feed-item.js +31 -7
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-json.d.ts +3 -1
- package/dist/web/feed-json.d.ts.map +1 -1
- package/dist/web/feed-json.js +2 -0
- package/dist/web/feed-json.js.map +1 -1
- package/dist/web/feed-source.d.ts +6 -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 +2 -0
- package/dist/web/feeds.js.map +1 -1
- package/dist/web/html-attributes.d.ts +3 -0
- package/dist/web/html-attributes.d.ts.map +1 -0
- package/dist/web/html-attributes.js +15 -0
- package/dist/web/html-attributes.js.map +1 -0
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +1 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/negotiate.d.ts +2 -0
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +2 -1
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/render.d.ts +8 -0
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +5 -1
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +14 -10
- package/dist/web/routes.js.map +1 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +7 -2
- package/dist/webmention/service.js.map +1 -1
- package/package.json +1 -1
- package/themes/default/README.md +15 -0
- package/themes/default/layouts/base.njk +2 -0
- package/themes/default/layouts/post.njk +7 -1
- package/themes/default/partials/location.njk +12 -0
- package/themes/default/partials/post-list.njk +2 -0
- package/themes/default/partials/read.njk +5 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ascii, view } from './shared.js';
|
|
2
|
+
const ORIENTATION_TAG = 0x0112;
|
|
3
|
+
/**
|
|
4
|
+
* The orientation an EXIF block's first IFD gives, or 1 — upright — when it
|
|
5
|
+
* gives none or cannot be read. `tiff` starts at the byte-order mark.
|
|
6
|
+
*/
|
|
7
|
+
function exifOrientation(tiff) {
|
|
8
|
+
if (tiff.length < 8)
|
|
9
|
+
return 1;
|
|
10
|
+
const little = tiff[0] === 0x49 && tiff[1] === 0x49;
|
|
11
|
+
if (!little && !(tiff[0] === 0x4d && tiff[1] === 0x4d))
|
|
12
|
+
return 1;
|
|
13
|
+
const data = view(tiff);
|
|
14
|
+
const ifd = data.getUint32(4, little);
|
|
15
|
+
if (ifd + 2 > tiff.length)
|
|
16
|
+
return 1;
|
|
17
|
+
const entries = data.getUint16(ifd, little);
|
|
18
|
+
for (let index = 0; index < entries; index += 1) {
|
|
19
|
+
const entry = ifd + 2 + index * 12;
|
|
20
|
+
if (entry + 12 > tiff.length)
|
|
21
|
+
return 1;
|
|
22
|
+
if (data.getUint16(entry, little) === ORIENTATION_TAG &&
|
|
23
|
+
data.getUint16(entry + 2, little) === 3) {
|
|
24
|
+
const value = data.getUint16(entry + 8, little);
|
|
25
|
+
return value >= 1 && value <= 8 ? value : 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* An EXIF block holding the orientation and nothing else: a big-endian TIFF
|
|
32
|
+
* header, one IFD with one SHORT entry, no next IFD.
|
|
33
|
+
*/
|
|
34
|
+
function orientationOnlyTiff(orientation) {
|
|
35
|
+
const tiff = new Uint8Array(26);
|
|
36
|
+
const data = view(tiff);
|
|
37
|
+
tiff.set(ascii('MM'));
|
|
38
|
+
data.setUint16(2, 42);
|
|
39
|
+
data.setUint32(4, 8);
|
|
40
|
+
data.setUint16(8, 1);
|
|
41
|
+
data.setUint16(10, ORIENTATION_TAG);
|
|
42
|
+
data.setUint16(12, 3);
|
|
43
|
+
data.setUint32(14, 1);
|
|
44
|
+
data.setUint16(18, orientation);
|
|
45
|
+
return tiff;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* What a format should keep of an EXIF block: the orientation alone when the
|
|
49
|
+
* picture is turned, since dropping it would show a phone photo sideways, and
|
|
50
|
+
* nothing when it is upright.
|
|
51
|
+
*/
|
|
52
|
+
export function keptExif(tiff) {
|
|
53
|
+
const orientation = exifOrientation(tiff);
|
|
54
|
+
return orientation === 1 ? undefined : orientationOnlyTiff(orientation);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiff.js","sourceRoot":"","sources":["../../../src/content/metadata/tiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAgB;IACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QACvC,IACE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,eAAe;YACjD,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EACvC,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAChD,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webp.d.ts","sourceRoot":"","sources":["../../../src/content/metadata/webp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQ5C,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CAmDrD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ascii, concat, fourcc, sameBytes, startsWith, stripped, view } from './shared.js';
|
|
2
|
+
import { keptExif } from './tiff.js';
|
|
3
|
+
const PICTURE = new Set(['VP8 ', 'VP8L', 'VP8X', 'ALPH', 'ANIM', 'ANMF', 'ICCP']);
|
|
4
|
+
const HAS_EXIF = 0x08;
|
|
5
|
+
const HAS_XMP = 0x04;
|
|
6
|
+
export function stripWebp(bytes) {
|
|
7
|
+
const data = view(bytes);
|
|
8
|
+
const chunks = [];
|
|
9
|
+
const removed = [];
|
|
10
|
+
let keptExifChunk = false;
|
|
11
|
+
let vp8x;
|
|
12
|
+
for (let at = 12; at < bytes.length;) {
|
|
13
|
+
if (at + 8 > bytes.length) {
|
|
14
|
+
chunks.push(bytes.subarray(at));
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
const type = fourcc(bytes, at);
|
|
18
|
+
const size = data.getUint32(at + 4, true);
|
|
19
|
+
const end = Math.min(bytes.length, at + 8 + size + (size % 2));
|
|
20
|
+
const original = bytes.subarray(at, end);
|
|
21
|
+
if (type === 'EXIF') {
|
|
22
|
+
let tiff = bytes.subarray(at + 8, Math.min(bytes.length, at + 8 + size));
|
|
23
|
+
// Some writers keep JPEG's "Exif\0\0" in front of the TIFF header.
|
|
24
|
+
if (startsWith(tiff, ascii('Exif\0\0')))
|
|
25
|
+
tiff = tiff.subarray(6);
|
|
26
|
+
const kept = keptExif(tiff);
|
|
27
|
+
if (kept === undefined) {
|
|
28
|
+
removed.push('EXIF');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const replacement = riffChunk('EXIF', kept);
|
|
32
|
+
if (!sameBytes(replacement, original))
|
|
33
|
+
removed.push('EXIF');
|
|
34
|
+
chunks.push(replacement);
|
|
35
|
+
keptExifChunk = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (PICTURE.has(type)) {
|
|
39
|
+
if (type === 'VP8X')
|
|
40
|
+
vp8x = chunks.length;
|
|
41
|
+
chunks.push(original);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
removed.push(type === 'XMP ' ? 'XMP' : `${type.trim()} chunk`);
|
|
45
|
+
}
|
|
46
|
+
at = end;
|
|
47
|
+
}
|
|
48
|
+
if (vp8x !== undefined) {
|
|
49
|
+
const header = Uint8Array.from(chunks[vp8x]);
|
|
50
|
+
const flags = header[8] ?? 0;
|
|
51
|
+
header[8] = (flags & ~(HAS_EXIF | HAS_XMP)) | (keptExifChunk ? HAS_EXIF : 0);
|
|
52
|
+
chunks[vp8x] = header;
|
|
53
|
+
}
|
|
54
|
+
const body = concat(chunks);
|
|
55
|
+
const riff = new Uint8Array(12);
|
|
56
|
+
riff.set(bytes.subarray(0, 12));
|
|
57
|
+
view(riff).setUint32(4, body.length + 4, true);
|
|
58
|
+
return stripped(bytes, [riff, body], removed);
|
|
59
|
+
}
|
|
60
|
+
function riffChunk(type, body) {
|
|
61
|
+
const out = new Uint8Array(8 + body.length + (body.length % 2));
|
|
62
|
+
out.set(ascii(type));
|
|
63
|
+
view(out).setUint32(4, body.length, true);
|
|
64
|
+
out.set(body, 8);
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=webp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webp.js","sourceRoot":"","sources":["../../../src/content/metadata/webp.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ import type { Document } from './document.ts';
|
|
|
18
18
|
* types as something else keeps that type, and a bookmark claims only what
|
|
19
19
|
* the spec would have called a note or an article.
|
|
20
20
|
*/
|
|
21
|
-
export type PostType = 'repost' | 'like' | 'reply' | 'photo' | 'bookmark' | 'note' | 'article';
|
|
21
|
+
export type PostType = 'repost' | 'like' | 'reply' | 'photo' | 'read' | 'bookmark' | 'note' | 'article';
|
|
22
22
|
/** The mf2 properties the algorithm reads, each as its plain-text value. */
|
|
23
23
|
export interface PostProperties {
|
|
24
24
|
name?: string | undefined;
|
|
@@ -30,6 +30,8 @@ export interface PostProperties {
|
|
|
30
30
|
'repost-of'?: string | undefined;
|
|
31
31
|
'like-of'?: string | undefined;
|
|
32
32
|
'bookmark-of'?: string | undefined;
|
|
33
|
+
'read-of'?: string | undefined;
|
|
34
|
+
'read-status'?: string | undefined;
|
|
33
35
|
}
|
|
34
36
|
/** The type of a post with these properties. */
|
|
35
37
|
export declare function discoverPostType(properties: PostProperties): PostType;
|
|
@@ -55,6 +57,6 @@ type PostDocument = Pick<Document, 'title' | 'html' | 'description' | 'inReplyTo
|
|
|
55
57
|
* The words a link to a document says: its title, or for an untitled post the
|
|
56
58
|
* first words of its text, so a note is never an empty link.
|
|
57
59
|
*/
|
|
58
|
-
export declare function postLabel(document: Pick<Document, 'title' | 'html' | 'description'>): string;
|
|
60
|
+
export declare function postLabel(document: Pick<Document, 'title' | 'html' | 'description' | 'extra'>): string;
|
|
59
61
|
export {};
|
|
60
62
|
//# sourceMappingURL=post-type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-type.d.ts","sourceRoot":"","sources":["../../src/content/post-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"post-type.d.ts","sourceRoot":"","sources":["../../src/content/post-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,QAAQ,GAClB,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnF,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,QAAQ,CAUrE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,MAAM,GAAG,SAAS,CAErF;AAED,yDAAyD;AACzD,KAAK,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC;AA0B7F;;;GAGG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,GACnE,MAAM,CASR"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { citationsOf } from './citation.js';
|
|
2
2
|
import { photosOf } from './photo.js';
|
|
3
|
+
import { isReadStatus, readLine, readOf } from './read.js';
|
|
3
4
|
import { htmlToText } from './search.js';
|
|
4
5
|
/** The type of a post with these properties. */
|
|
5
6
|
export function discoverPostType(properties) {
|
|
@@ -11,6 +12,9 @@ export function discoverPostType(properties) {
|
|
|
11
12
|
return 'reply';
|
|
12
13
|
if ((properties.photo ?? []).length > 0)
|
|
13
14
|
return 'photo';
|
|
15
|
+
if ((properties['read-of'] ?? '') !== '' && isReadStatus(properties['read-status'])) {
|
|
16
|
+
return 'read';
|
|
17
|
+
}
|
|
14
18
|
if (validUrl(properties['bookmark-of']) !== undefined)
|
|
15
19
|
return 'bookmark';
|
|
16
20
|
return isNamedPost(properties) ? 'article' : 'note';
|
|
@@ -38,6 +42,7 @@ export function replyTarget(document) {
|
|
|
38
42
|
return validUrl(document.inReplyTo);
|
|
39
43
|
}
|
|
40
44
|
function propertiesOf(document) {
|
|
45
|
+
const read = readOf(document.extra);
|
|
41
46
|
return {
|
|
42
47
|
name: document.title,
|
|
43
48
|
content: htmlToText(document.html),
|
|
@@ -50,6 +55,8 @@ function propertiesOf(document) {
|
|
|
50
55
|
property,
|
|
51
56
|
url,
|
|
52
57
|
])),
|
|
58
|
+
'read-of': read?.of.name,
|
|
59
|
+
'read-status': read?.status,
|
|
53
60
|
};
|
|
54
61
|
}
|
|
55
62
|
/** How many words of an untitled post's text {@link postLabel} keeps. */
|
|
@@ -61,7 +68,8 @@ const LABEL_WORDS = 10;
|
|
|
61
68
|
export function postLabel(document) {
|
|
62
69
|
if (document.title !== '')
|
|
63
70
|
return document.title;
|
|
64
|
-
const
|
|
71
|
+
const html = readLine(readOf(document.extra)) + document.html;
|
|
72
|
+
const text = normalize(htmlToText(html)) || normalize(document.description ?? '');
|
|
65
73
|
if (text === '')
|
|
66
74
|
return 'Untitled';
|
|
67
75
|
const words = text.split(' ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-type.js","sourceRoot":"","sources":["../../src/content/post-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"post-type.js","sourceRoot":"","sources":["../../src/content/post-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const READ_OF_FRONT_MATTER_KEY = "read-of";
|
|
2
|
+
export declare const READ_STATUS_FRONT_MATTER_KEY = "read-status";
|
|
3
|
+
export declare const READ_STATUSES: readonly ['to-read', 'reading', 'finished'];
|
|
4
|
+
export type ReadStatus = (typeof READ_STATUSES)[number];
|
|
5
|
+
export declare const READ_STATUS_LABELS: Readonly<Record<ReadStatus, string>>;
|
|
6
|
+
export interface ReadOf {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly author?: string | undefined;
|
|
9
|
+
readonly uid?: string | undefined;
|
|
10
|
+
readonly url?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface Read {
|
|
13
|
+
readonly status: ReadStatus;
|
|
14
|
+
readonly of: ReadOf;
|
|
15
|
+
}
|
|
16
|
+
export declare function isReadStatus(value: unknown): value is ReadStatus;
|
|
17
|
+
export declare function readOf(extra: Readonly<Record<string, unknown>>): Read | undefined;
|
|
18
|
+
export declare function readWork(value: unknown): ReadOf | undefined;
|
|
19
|
+
export declare function uidLabel(uid: string): string;
|
|
20
|
+
export declare function readWorkFrontMatter({ name, author, uid, url }: ReadOf): ReadOf;
|
|
21
|
+
export declare function readLine(read: Read | undefined): string;
|
|
22
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/content/read.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAClD,eAAO,MAAM,4BAA4B,gBAAgB,CAAC;AAE1D,eAAO,MAAM,aAAa,YAAI,SAAS,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAInE,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAKjF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW3D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,GAAG,MAAM,CAO9E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAcvD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { isWebUrl } from './enclosure.js';
|
|
2
|
+
export const READ_OF_FRONT_MATTER_KEY = 'read-of';
|
|
3
|
+
export const READ_STATUS_FRONT_MATTER_KEY = 'read-status';
|
|
4
|
+
export const READ_STATUSES = ['to-read', 'reading', 'finished'];
|
|
5
|
+
export const READ_STATUS_LABELS = {
|
|
6
|
+
'to-read': 'Want to read',
|
|
7
|
+
reading: 'Currently reading',
|
|
8
|
+
finished: 'Finished reading',
|
|
9
|
+
};
|
|
10
|
+
export function isReadStatus(value) {
|
|
11
|
+
return READ_STATUSES.includes(value);
|
|
12
|
+
}
|
|
13
|
+
export function readOf(extra) {
|
|
14
|
+
const status = extra[READ_STATUS_FRONT_MATTER_KEY];
|
|
15
|
+
const of = readWork(extra[READ_OF_FRONT_MATTER_KEY]);
|
|
16
|
+
if (!isReadStatus(status) || of === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
return { status, of: isWebUrl(of.url ?? '') ? of : { ...of, url: undefined } };
|
|
19
|
+
}
|
|
20
|
+
export function readWork(value) {
|
|
21
|
+
if (typeof value === 'string')
|
|
22
|
+
return value.trim() === '' ? undefined : { name: value.trim() };
|
|
23
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
24
|
+
return undefined;
|
|
25
|
+
const fields = value;
|
|
26
|
+
const word = (key) => {
|
|
27
|
+
const field = fields[key];
|
|
28
|
+
return typeof field === 'string' && field.trim() !== '' ? field.trim() : undefined;
|
|
29
|
+
};
|
|
30
|
+
const name = word('name');
|
|
31
|
+
if (name === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
return readWorkFrontMatter({ name, author: word('author'), uid: word('uid'), url: word('url') });
|
|
34
|
+
}
|
|
35
|
+
export function uidLabel(uid) {
|
|
36
|
+
return /^isbn:/i.test(uid) ? `ISBN: ${uid.slice('isbn:'.length)}` : uid;
|
|
37
|
+
}
|
|
38
|
+
export function readWorkFrontMatter({ name, author, uid, url }) {
|
|
39
|
+
return {
|
|
40
|
+
name,
|
|
41
|
+
...(author ? { author } : {}),
|
|
42
|
+
...(uid ? { uid } : {}),
|
|
43
|
+
...(url ? { url } : {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function readLine(read) {
|
|
47
|
+
if (read === undefined)
|
|
48
|
+
return '';
|
|
49
|
+
const { status, of } = read;
|
|
50
|
+
const cited = `<cite class="p-name">${escapeHtml(of.name)}</cite>`;
|
|
51
|
+
return (`<p class="read-line"><data class="p-read-status" value="${status}">` +
|
|
52
|
+
`${READ_STATUS_LABELS[status]}</data>: <span class="p-read-of h-cite">` +
|
|
53
|
+
(of.url === undefined ? cited : `<a class="u-url" href="${escapeHtml(of.url)}">${cited}</a>`) +
|
|
54
|
+
(of.author === undefined ? '' : ` by <span class="p-author">${escapeHtml(of.author)}</span>`) +
|
|
55
|
+
(of.uid === undefined
|
|
56
|
+
? ''
|
|
57
|
+
: `, <data class="p-uid" value="${escapeHtml(of.uid)}">${escapeHtml(uidLabel(of.uid))}</data>`) +
|
|
58
|
+
'</span></p>\n');
|
|
59
|
+
}
|
|
60
|
+
function escapeHtml(value) {
|
|
61
|
+
return value
|
|
62
|
+
.replaceAll('&', '&')
|
|
63
|
+
.replaceAll('<', '<')
|
|
64
|
+
.replaceAll('>', '>')
|
|
65
|
+
.replaceAll('"', '"');
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/content/read.ts"],"names":[],"mappings":"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"}
|
package/dist/content/store.d.ts
CHANGED
|
@@ -101,7 +101,7 @@ export interface ContentStore {
|
|
|
101
101
|
* years, so the newest match wins.
|
|
102
102
|
*/
|
|
103
103
|
getBySlug(slug: string): Document | undefined;
|
|
104
|
-
/** Published, untrashed, already-due posts, newest first. */
|
|
104
|
+
/** Published, untrashed, already-due, listed posts, newest first. */
|
|
105
105
|
listPosts(options?: ListOptions): Document[];
|
|
106
106
|
/**
|
|
107
107
|
* Published, untrashed, already-due posts dated at or after an instant,
|
|
@@ -289,9 +289,9 @@ export interface ListAllOptions extends ListOptions {
|
|
|
289
289
|
export interface ContentCounts {
|
|
290
290
|
/** Every indexed document, trash included. */
|
|
291
291
|
total: number;
|
|
292
|
-
/** Published, untrashed, already-due posts: the size of the public archive. */
|
|
292
|
+
/** Published, untrashed, already-due, listed posts: the size of the public archive. */
|
|
293
293
|
posts: number;
|
|
294
|
-
/** Published, untrashed, already-due pages. */
|
|
294
|
+
/** Published, untrashed, already-due, listed pages. */
|
|
295
295
|
pages: number;
|
|
296
296
|
/** Untrashed drafts of either type. */
|
|
297
297
|
drafts: number;
|
|
@@ -322,7 +322,7 @@ export type TaxonomyName = 'tag' | 'category';
|
|
|
322
322
|
export interface TermUsage {
|
|
323
323
|
/** The term itself, as the files spell it. */
|
|
324
324
|
term: string;
|
|
325
|
-
/** Documents the public site lists under it: published, untrashed, due. */
|
|
325
|
+
/** Documents the public site lists under it: published, untrashed, due, listed. */
|
|
326
326
|
published: number;
|
|
327
327
|
/** Every file carrying it, drafts, scheduled posts and the trash included. */
|
|
328
328
|
total: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/content/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAuB,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/content/store.ts"],"names":[],"mappings":"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"}
|
package/dist/content/store.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { databaseFile, openDatabase } from '../cache.js';
|
|
2
2
|
import { featuredPosts, PINNED_FRONT_MATTER_KEY } from './pinned.js';
|
|
3
3
|
import { searchExpression, searchText, SNIPPET_CLOSE, SNIPPET_OPEN } from './search.js';
|
|
4
|
+
import { VISIBILITIES, VISIBILITY_FRONT_MATTER_KEY } from './visibility.js';
|
|
4
5
|
export { DATABASE_FILE } from '../cache.js';
|
|
5
6
|
/** Directory name that marks a document as thrown away but not yet deleted. */
|
|
6
7
|
export const TRASH_DIRECTORY = '_trash';
|
|
@@ -61,6 +62,9 @@ export function dateSortKey(date) {
|
|
|
61
62
|
const DUE_CLAUSE = '(date_sort IS NULL OR date_sort <= ?)';
|
|
62
63
|
/** The reverse: a document whose date is still ahead of the clock. */
|
|
63
64
|
const SCHEDULED_CLAUSE = '(date_sort IS NOT NULL AND date_sort > ?)';
|
|
65
|
+
const VISIBILITY_SQL = `COALESCE(json_extract(extra, '$.${VISIBILITY_FRONT_MATTER_KEY}'), 'public')`;
|
|
66
|
+
const SERVED_CLAUSE = `(draft = 0 AND trashed = 0 AND ${DUE_CLAUSE} AND ${VISIBILITY_SQL} IN (${VISIBILITIES.map((visibility) => `'${visibility}'`).join(', ')}))`;
|
|
67
|
+
const LISTED_CLAUSE = `(${SERVED_CLAUSE} AND ${VISIBILITY_SQL} = 'public')`;
|
|
64
68
|
/**
|
|
65
69
|
* A document whose front matter carries a `pinned` key that is not `false`.
|
|
66
70
|
* Which moment it was pinned at, and whether it is readable at all, is
|
|
@@ -94,8 +98,7 @@ const SEARCH_FROM = `
|
|
|
94
98
|
FROM documents_fts
|
|
95
99
|
JOIN documents ON documents.path = documents_fts.path
|
|
96
100
|
WHERE documents_fts MATCH ?
|
|
97
|
-
AND
|
|
98
|
-
AND (documents.date_sort IS NULL OR documents.date_sort <= ?)
|
|
101
|
+
AND ${LISTED_CLAUSE}
|
|
99
102
|
`;
|
|
100
103
|
/**
|
|
101
104
|
* How much a match in each column of the index counts, in the order the table
|
|
@@ -159,7 +162,7 @@ export function openContentStore(options) {
|
|
|
159
162
|
SELECT documents.* FROM documents
|
|
160
163
|
JOIN document_redirects ON document_redirects.path = documents.path
|
|
161
164
|
WHERE document_redirects.url = ?
|
|
162
|
-
AND
|
|
165
|
+
AND ${SERVED_CLAUSE}
|
|
163
166
|
ORDER BY documents.updated DESC, documents.path DESC
|
|
164
167
|
LIMIT 1
|
|
165
168
|
`),
|
|
@@ -171,8 +174,8 @@ export function openContentStore(options) {
|
|
|
171
174
|
counts: db.prepare(`
|
|
172
175
|
SELECT
|
|
173
176
|
COUNT(*) AS total,
|
|
174
|
-
COALESCE(SUM(type = 'post' AND
|
|
175
|
-
COALESCE(SUM(type = 'page' AND
|
|
177
|
+
COALESCE(SUM(type = 'post' AND ${LISTED_CLAUSE}), 0) AS posts,
|
|
178
|
+
COALESCE(SUM(type = 'page' AND ${LISTED_CLAUSE}), 0) AS pages,
|
|
176
179
|
COALESCE(SUM(draft = 1 AND trashed = 0), 0) AS drafts,
|
|
177
180
|
COALESCE(SUM(draft = 0 AND trashed = 0 AND ${SCHEDULED_CLAUSE}), 0) AS scheduled,
|
|
178
181
|
COALESCE(SUM(trashed = 1), 0) AS trashed
|
|
@@ -182,8 +185,7 @@ export function openContentStore(options) {
|
|
|
182
185
|
SELECT document_tags.tag AS tag, COUNT(*) AS count
|
|
183
186
|
FROM document_tags
|
|
184
187
|
JOIN documents ON documents.path = document_tags.path
|
|
185
|
-
WHERE
|
|
186
|
-
AND (documents.date_sort IS NULL OR documents.date_sort <= ?)
|
|
188
|
+
WHERE ${LISTED_CLAUSE}
|
|
187
189
|
GROUP BY document_tags.tag
|
|
188
190
|
ORDER BY count DESC, tag ASC
|
|
189
191
|
`),
|
|
@@ -191,8 +193,7 @@ export function openContentStore(options) {
|
|
|
191
193
|
SELECT document_categories.category AS category, COUNT(*) AS count
|
|
192
194
|
FROM document_categories
|
|
193
195
|
JOIN documents ON documents.path = document_categories.path
|
|
194
|
-
WHERE
|
|
195
|
-
AND (documents.date_sort IS NULL OR documents.date_sort <= ?)
|
|
196
|
+
WHERE ${LISTED_CLAUSE}
|
|
196
197
|
GROUP BY document_categories.category
|
|
197
198
|
ORDER BY count DESC, category ASC
|
|
198
199
|
`),
|
|
@@ -276,12 +277,7 @@ export function openContentStore(options) {
|
|
|
276
277
|
* tables, so neither can drift from the other.
|
|
277
278
|
*/
|
|
278
279
|
function selectByTerm(table, column, term, options) {
|
|
279
|
-
const where = [
|
|
280
|
-
'draft = 0',
|
|
281
|
-
'trashed = 0',
|
|
282
|
-
DUE_CLAUSE,
|
|
283
|
-
`path IN (SELECT path FROM ${table} WHERE ${column} = ?)`,
|
|
284
|
-
];
|
|
280
|
+
const where = [LISTED_CLAUSE, `path IN (SELECT path FROM ${table} WHERE ${column} = ?)`];
|
|
285
281
|
const params = [nowKey(), term];
|
|
286
282
|
if (options.type !== undefined) {
|
|
287
283
|
where.unshift('type = ?');
|
|
@@ -291,12 +287,7 @@ export function openContentStore(options) {
|
|
|
291
287
|
}
|
|
292
288
|
/** {@link selectByTerm}'s total, for the pager and the archive's existence. */
|
|
293
289
|
function countByTerm(table, column, term, options) {
|
|
294
|
-
const where = [
|
|
295
|
-
'documents.draft = 0',
|
|
296
|
-
'documents.trashed = 0',
|
|
297
|
-
'(documents.date_sort IS NULL OR documents.date_sort <= ?)',
|
|
298
|
-
`${table}.${column} = ?`,
|
|
299
|
-
];
|
|
290
|
+
const where = [LISTED_CLAUSE, `${table}.${column} = ?`];
|
|
300
291
|
const params = [nowKey(), term];
|
|
301
292
|
if (options.type !== undefined) {
|
|
302
293
|
where.push('documents.type = ?');
|
|
@@ -319,7 +310,7 @@ export function openContentStore(options) {
|
|
|
319
310
|
function neighbour(direction, order, key, contentPath) {
|
|
320
311
|
const row = db
|
|
321
312
|
.prepare(`SELECT * FROM documents
|
|
322
|
-
WHERE type = 'post' AND
|
|
313
|
+
WHERE type = 'post' AND ${LISTED_CLAUSE}
|
|
323
314
|
AND date_sort IS NOT NULL
|
|
324
315
|
AND (date_sort, path) ${direction} (?, ?)
|
|
325
316
|
ORDER BY date_sort ${order}, path ${order}
|
|
@@ -396,13 +387,13 @@ export function openContentStore(options) {
|
|
|
396
387
|
return hydrate(statements.bySlug.get(slug));
|
|
397
388
|
},
|
|
398
389
|
listPosts(options = {}) {
|
|
399
|
-
return select(["type = 'post'",
|
|
390
|
+
return select(["type = 'post'", LISTED_CLAUSE], [nowKey()], options);
|
|
400
391
|
},
|
|
401
392
|
listPostsSince(instant) {
|
|
402
393
|
const since = dateSortKey(instant);
|
|
403
394
|
if (since === null)
|
|
404
395
|
return [];
|
|
405
|
-
return select(["type = 'post'",
|
|
396
|
+
return select(["type = 'post'", LISTED_CLAUSE, 'date_sort >= ?'], [nowKey(), since], {});
|
|
406
397
|
},
|
|
407
398
|
neighbours(document) {
|
|
408
399
|
// A page is nobody's neighbour, and neither is a document the archive
|
|
@@ -440,19 +431,12 @@ export function openContentStore(options) {
|
|
|
440
431
|
listByAuthor(names, options = {}) {
|
|
441
432
|
if (names.length === 0)
|
|
442
433
|
return [];
|
|
443
|
-
return select(["type = 'post'",
|
|
434
|
+
return select(["type = 'post'", LISTED_CLAUSE, authorClause(names)], [nowKey(), ...names], options);
|
|
444
435
|
},
|
|
445
436
|
listPinnedByAuthor(names) {
|
|
446
437
|
if (names.length === 0)
|
|
447
438
|
return [];
|
|
448
|
-
return featuredPosts(select([
|
|
449
|
-
"type = 'post'",
|
|
450
|
-
'draft = 0',
|
|
451
|
-
'trashed = 0',
|
|
452
|
-
DUE_CLAUSE,
|
|
453
|
-
authorClause(names),
|
|
454
|
-
PINNED_CLAUSE,
|
|
455
|
-
], [nowKey(), ...names], {}));
|
|
439
|
+
return featuredPosts(select(["type = 'post'", LISTED_CLAUSE, authorClause(names), PINNED_CLAUSE], [nowKey(), ...names], {}));
|
|
456
440
|
},
|
|
457
441
|
listAll(options = {}) {
|
|
458
442
|
const where = [];
|
|
@@ -510,8 +494,7 @@ export function openContentStore(options) {
|
|
|
510
494
|
return 0;
|
|
511
495
|
const row = db
|
|
512
496
|
.prepare(`SELECT COUNT(*) AS count FROM documents
|
|
513
|
-
WHERE type = 'post' AND
|
|
514
|
-
AND ${DUE_CLAUSE} AND ${authorClause(names)}`)
|
|
497
|
+
WHERE type = 'post' AND ${LISTED_CLAUSE} AND ${authorClause(names)}`)
|
|
515
498
|
.get(...[nowKey(), ...names]);
|
|
516
499
|
return Number(row['count']);
|
|
517
500
|
},
|
|
@@ -568,10 +551,7 @@ export function openContentStore(options) {
|
|
|
568
551
|
function termUsageSql(table, column) {
|
|
569
552
|
return `
|
|
570
553
|
SELECT ${table}.${column} AS term,
|
|
571
|
-
COALESCE(SUM(
|
|
572
|
-
documents.draft = 0 AND documents.trashed = 0
|
|
573
|
-
AND (documents.date_sort IS NULL OR documents.date_sort <= ?)
|
|
574
|
-
), 0) AS published,
|
|
554
|
+
COALESCE(SUM(${LISTED_CLAUSE}), 0) AS published,
|
|
575
555
|
COUNT(*) AS total
|
|
576
556
|
FROM ${table}
|
|
577
557
|
JOIN documents ON documents.path = ${table}.path
|