diff --git a/dist/components/index.js b/dist/components/index.js index 8f58007..5863506 100644 --- a/dist/components/index.js +++ b/dist/components/index.js @@ -1,5 +1,6 @@ import { createRequire } from 'module'; import { formatDate } from '@quartz-community/utils/date'; +import { getDate } from '@quartz-community/utils/sort'; import { jsx } from 'preact/jsx-runtime'; const require$1 = createRequire(import.meta.url); @@ -190,16 +191,6 @@ var locales = { function i18n(locale) { return locales[locale] || en_US_default; } -function getDate(cfg, data) { - const dateType = data.defaultDateType ?? cfg.defaultDateType; - if (!dateType) { - throw new Error( - `Field 'defaultDateType' was not set. Either configure it in the CreatedModifiedDate plugin options or set it in quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.` - ); - } - const dates = data.dates; - return dates?.[dateType]; -} function DateComponent({ date, locale }) { return /* @__PURE__ */ jsx("time", { datetime: date.toISOString(), children: formatDate(date, locale) }); } @@ -218,7 +209,11 @@ var ContentMeta_default = ((opts) => { const segments = []; if (fileData.dates) { const locale = cfg.locale || "en-US"; - segments.push(/* @__PURE__ */ jsx(DateComponent, { date: getDate(cfg, fileData), locale })); + const dataWithDefaultDateType = { + ...fileData, + defaultDateType: cfg.defaultDateType + }; + segments.push(/* @__PURE__ */ jsx(DateComponent, { date: getDate(dataWithDefaultDateType), locale })); } if (options.showReadingTime) { const { minutes, words: _words } = (0, import_reading_time.default)(text); diff --git a/dist/components/index.js.map b/dist/components/index.js.map index 8d4d63a..e5d3f2b 100644 --- a/dist/components/index.js.map +++ b/dist/components/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/reading-time/lib/reading-time.js","../../node_modules/reading-time/lib/stream.js","../../node_modules/reading-time/index.js","../../src/components/ContentMeta.tsx","../../src/util/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/util/date.tsx","../../src/components/styles/contentMeta.scss"],"names":["exports","readingTime","require_reading_time","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n */\n\n/**\n * @param {number} number\n * @param {number[][]} arrayOfRanges\n */\nfunction codeIsInRanges(number, arrayOfRanges) {\n return arrayOfRanges.some(([lowerBound, upperBound]) =>\n (lowerBound <= number) && (number <= upperBound)\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isCJK(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n // Help wanted!\n // This should be good for most cases, but if you find it unsatisfactory\n // (e.g. some other language where each character should be standalone words),\n // contributions welcome!\n return codeIsInRanges(\n charCode,\n [\n // Hiragana (Katakana not included on purpose,\n // context: https://github.com/ngryman/reading-time/pull/35#issuecomment-853364526)\n // If you think Katakana should be included and have solid reasons, improvement is welcomed\n [0x3040, 0x309f],\n // CJK Unified ideographs\n [0x4e00, 0x9fff],\n // Hangul\n [0xac00, 0xd7a3],\n // CJK extensions\n [0x20000, 0x2ebe0]\n ]\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isAnsiWordBound(c) {\n return ' \\n\\r\\t'.includes(c)\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isPunctuation(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n return codeIsInRanges(\n charCode,\n [\n [0x21, 0x2f],\n [0x3a, 0x40],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n // CJK Symbols and Punctuation\n [0x3000, 0x303f],\n // Full-width ASCII punctuation variants\n [0xff00, 0xffef]\n ]\n )\n}\n\n/**\n * @type {import('reading-time').default}\n */\nfunction readingTime(text, options = {}) {\n let words = 0, start = 0, end = text.length - 1\n\n // use provided value if available\n const wordsPerMinute = options.wordsPerMinute || 200\n\n // use provided function if available\n const isWordBound = options.wordBound || isAnsiWordBound\n\n // fetch bounds\n while (isWordBound(text[start])) start++\n while (isWordBound(text[end])) end--\n\n // Add a trailing word bound to make handling edges more convenient\n const normalizedText = `${text}\\n`\n\n // calculate the number of words\n for (let i = start; i <= end; i++) {\n // A CJK character is a always word;\n // A non-word bound followed by a word bound / CJK is the end of a word.\n if (\n isCJK(normalizedText[i]) ||\n (!isWordBound(normalizedText[i]) &&\n (isWordBound(normalizedText[i + 1]) || isCJK(normalizedText[i + 1]))\n )\n ) {\n words++\n }\n // In case of CJK followed by punctuations, those characters have to be eaten as well\n if (isCJK(normalizedText[i])) {\n while (\n i <= end &&\n (isPunctuation(normalizedText[i + 1]) || isWordBound(normalizedText[i + 1]))\n ) {\n i++\n }\n }\n }\n\n // reading time stats\n const minutes = words / wordsPerMinute\n // Math.round used to resolve floating point funkyness\n // http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\n const time = Math.round(minutes * 60 * 1000)\n const displayed = Math.ceil(minutes.toFixed(2))\n\n return {\n text: displayed + ' min read',\n minutes: minutes,\n time: time,\n words: words\n }\n}\n\n/**\n * Export\n */\nmodule.exports = readingTime\n","/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst readingTime = require('./reading-time')\nconst Transform = require('stream').Transform\nconst util = require('util')\n\n/**\n * @typedef {import('reading-time').Options} Options\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n * @typedef {import('reading-time').readingTimeStream} ReadingTimeStream\n * @typedef {import('stream').TransformCallback} TransformCallback\n */\n\n/**\n * @param {Options} options\n * @returns {ReadingTimeStream}\n */\nfunction ReadingTimeStream(options) {\n // allow use without new\n if (!(this instanceof ReadingTimeStream)) {\n return new ReadingTimeStream(options)\n }\n\n Transform.call(this, { objectMode: true })\n\n this.options = options || {}\n this.stats = {\n minutes: 0,\n time: 0,\n words: 0\n }\n}\nutil.inherits(ReadingTimeStream, Transform)\n\n/**\n * @param {Buffer} chunk\n * @param {BufferEncoding} encoding\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._transform = function(chunk, encoding, callback) {\n const stats = readingTime(chunk.toString(encoding), this.options)\n\n this.stats.minutes += stats.minutes\n this.stats.time += stats.time\n this.stats.words += stats.words\n\n callback()\n}\n\n/**\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._flush = function(callback) {\n this.stats.text = Math.ceil(this.stats.minutes.toFixed(2)) + ' min read'\n\n this.push(this.stats)\n callback()\n}\n\n/**\n * Export\n */\nmodule.exports = ReadingTimeStream\n","module.exports.default = module.exports = require('./lib/reading-time')\nmodule.exports.readingTimeStream = require('./lib/stream')\n","import type { QuartzComponentConstructor, QuartzComponentProps } from \"@quartz-community/types\";\nimport readingTime from \"reading-time\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { DateComponent, getDate } from \"../util/date\";\nimport type { JSX } from \"preact\";\nimport style from \"./styles/contentMeta.scss\";\n\nexport interface ContentMetaOptions {\n /**\n * Whether to display reading time\n */\n showReadingTime: boolean;\n showComma: boolean;\n}\n\nconst defaultOptions: ContentMetaOptions = {\n showReadingTime: true,\n showComma: true,\n};\n\nexport default ((opts?: Partial) => {\n // Merge options with defaults\n const options: ContentMetaOptions = { ...defaultOptions, ...opts };\n\n function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) {\n const text = fileData.text;\n\n if (text) {\n const segments: (string | JSX.Element)[] = [];\n\n if (fileData.dates) {\n const locale = cfg.locale || \"en-US\";\n segments.push();\n }\n\n // Display reading time if enabled\n if (options.showReadingTime) {\n const { minutes, words: _words } = readingTime(text as string);\n const locale = cfg.locale || \"en-US\";\n const i18nData = i18n(locale);\n const displayedTime = i18nData.components.contentMeta.readingTime({\n minutes: Math.ceil(minutes),\n });\n segments.push({displayedTime});\n }\n\n return (\n

\n {segments}\n

\n );\n } else {\n return null;\n }\n }\n\n ContentMetadata.css = style;\n\n return ContentMetadata;\n}) satisfies QuartzComponentConstructor;\n","export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n contentMeta: {\n readingTime: ({ minutes }: { minutes: number }) => {\n if (minutes === 1) {\n return \"1 min read\";\n }\n return `${minutes} min read`;\n },\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { formatDate } from \"@quartz-community/utils/date\";\n\nexport type ValidDateType = \"created\" | \"modified\" | \"published\";\n\ninterface Props {\n date: Date;\n locale?: string;\n}\n\nexport function getDate(\n cfg: { defaultDateType?: string },\n data: Record,\n): Date | undefined {\n const dateType = (data.defaultDateType as string) ?? cfg.defaultDateType;\n if (!dateType) {\n throw new Error(\n `Field 'defaultDateType' was not set. Either configure it in the CreatedModifiedDate plugin options or set it in quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`,\n );\n }\n const dates = data.dates as Record | undefined;\n return dates?.[dateType];\n}\n\nexport function DateComponent({ date, locale }: Props) {\n return ;\n}\n",".content-meta {\n margin-top: 0;\n color: var(--darkgray);\n}\n.content-meta[show-comma=true] > *:not(:last-child) {\n margin-right: 8px;\n}\n.content-meta[show-comma=true] > *:not(:last-child)::after {\n content: \",\";\n}"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/reading-time/lib/reading-time.js","../../node_modules/reading-time/lib/stream.js","../../node_modules/reading-time/index.js","../../src/components/ContentMeta.tsx","../../src/util/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/util/date.tsx","../../src/components/styles/contentMeta.scss"],"names":["exports","readingTime","require_reading_time","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n */\n\n/**\n * @param {number} number\n * @param {number[][]} arrayOfRanges\n */\nfunction codeIsInRanges(number, arrayOfRanges) {\n return arrayOfRanges.some(([lowerBound, upperBound]) =>\n (lowerBound <= number) && (number <= upperBound)\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isCJK(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n // Help wanted!\n // This should be good for most cases, but if you find it unsatisfactory\n // (e.g. some other language where each character should be standalone words),\n // contributions welcome!\n return codeIsInRanges(\n charCode,\n [\n // Hiragana (Katakana not included on purpose,\n // context: https://github.com/ngryman/reading-time/pull/35#issuecomment-853364526)\n // If you think Katakana should be included and have solid reasons, improvement is welcomed\n [0x3040, 0x309f],\n // CJK Unified ideographs\n [0x4e00, 0x9fff],\n // Hangul\n [0xac00, 0xd7a3],\n // CJK extensions\n [0x20000, 0x2ebe0]\n ]\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isAnsiWordBound(c) {\n return ' \\n\\r\\t'.includes(c)\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isPunctuation(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n return codeIsInRanges(\n charCode,\n [\n [0x21, 0x2f],\n [0x3a, 0x40],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n // CJK Symbols and Punctuation\n [0x3000, 0x303f],\n // Full-width ASCII punctuation variants\n [0xff00, 0xffef]\n ]\n )\n}\n\n/**\n * @type {import('reading-time').default}\n */\nfunction readingTime(text, options = {}) {\n let words = 0, start = 0, end = text.length - 1\n\n // use provided value if available\n const wordsPerMinute = options.wordsPerMinute || 200\n\n // use provided function if available\n const isWordBound = options.wordBound || isAnsiWordBound\n\n // fetch bounds\n while (isWordBound(text[start])) start++\n while (isWordBound(text[end])) end--\n\n // Add a trailing word bound to make handling edges more convenient\n const normalizedText = `${text}\\n`\n\n // calculate the number of words\n for (let i = start; i <= end; i++) {\n // A CJK character is a always word;\n // A non-word bound followed by a word bound / CJK is the end of a word.\n if (\n isCJK(normalizedText[i]) ||\n (!isWordBound(normalizedText[i]) &&\n (isWordBound(normalizedText[i + 1]) || isCJK(normalizedText[i + 1]))\n )\n ) {\n words++\n }\n // In case of CJK followed by punctuations, those characters have to be eaten as well\n if (isCJK(normalizedText[i])) {\n while (\n i <= end &&\n (isPunctuation(normalizedText[i + 1]) || isWordBound(normalizedText[i + 1]))\n ) {\n i++\n }\n }\n }\n\n // reading time stats\n const minutes = words / wordsPerMinute\n // Math.round used to resolve floating point funkyness\n // http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\n const time = Math.round(minutes * 60 * 1000)\n const displayed = Math.ceil(minutes.toFixed(2))\n\n return {\n text: displayed + ' min read',\n minutes: minutes,\n time: time,\n words: words\n }\n}\n\n/**\n * Export\n */\nmodule.exports = readingTime\n","/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst readingTime = require('./reading-time')\nconst Transform = require('stream').Transform\nconst util = require('util')\n\n/**\n * @typedef {import('reading-time').Options} Options\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n * @typedef {import('reading-time').readingTimeStream} ReadingTimeStream\n * @typedef {import('stream').TransformCallback} TransformCallback\n */\n\n/**\n * @param {Options} options\n * @returns {ReadingTimeStream}\n */\nfunction ReadingTimeStream(options) {\n // allow use without new\n if (!(this instanceof ReadingTimeStream)) {\n return new ReadingTimeStream(options)\n }\n\n Transform.call(this, { objectMode: true })\n\n this.options = options || {}\n this.stats = {\n minutes: 0,\n time: 0,\n words: 0\n }\n}\nutil.inherits(ReadingTimeStream, Transform)\n\n/**\n * @param {Buffer} chunk\n * @param {BufferEncoding} encoding\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._transform = function(chunk, encoding, callback) {\n const stats = readingTime(chunk.toString(encoding), this.options)\n\n this.stats.minutes += stats.minutes\n this.stats.time += stats.time\n this.stats.words += stats.words\n\n callback()\n}\n\n/**\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._flush = function(callback) {\n this.stats.text = Math.ceil(this.stats.minutes.toFixed(2)) + ' min read'\n\n this.push(this.stats)\n callback()\n}\n\n/**\n * Export\n */\nmodule.exports = ReadingTimeStream\n","module.exports.default = module.exports = require('./lib/reading-time')\nmodule.exports.readingTimeStream = require('./lib/stream')\n","import type {\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport readingTime from \"reading-time\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { DateComponent, getDate } from \"../util/date\";\nimport type { JSX } from \"preact\";\nimport style from \"./styles/contentMeta.scss\";\n\nexport interface ContentMetaOptions {\n /**\n * Whether to display reading time\n */\n showReadingTime: boolean;\n showComma: boolean;\n}\n\nconst defaultOptions: ContentMetaOptions = {\n showReadingTime: true,\n showComma: true,\n};\n\nexport default ((opts?: Partial) => {\n // Merge options with defaults\n const options: ContentMetaOptions = { ...defaultOptions, ...opts };\n\n function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) {\n const text = fileData.text;\n\n if (text) {\n const segments: (string | JSX.Element)[] = [];\n\n if (fileData.dates) {\n const locale = cfg.locale || \"en-US\";\n const dataWithDefaultDateType: QuartzPluginData = {\n ...(fileData as QuartzPluginData),\n defaultDateType: cfg.defaultDateType as ValidDateType,\n };\n segments.push();\n }\n\n // Display reading time if enabled\n if (options.showReadingTime) {\n const { minutes, words: _words } = readingTime(text as string);\n const locale = cfg.locale || \"en-US\";\n const i18nData = i18n(locale);\n const displayedTime = i18nData.components.contentMeta.readingTime({\n minutes: Math.ceil(minutes),\n });\n segments.push({displayedTime});\n }\n\n return (\n

\n {segments}\n

\n );\n } else {\n return null;\n }\n }\n\n ContentMetadata.css = style;\n\n return ContentMetadata;\n}) satisfies QuartzComponentConstructor;\n","export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n contentMeta: {\n readingTime: ({ minutes }: { minutes: number }) => {\n if (minutes === 1) {\n return \"1 min read\";\n }\n return `${minutes} min read`;\n },\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { formatDate } from \"@quartz-community/utils/date\";\nimport { getDate } from \"@quartz-community/utils/sort\";\n\ninterface Props {\n date: Date;\n locale?: string;\n}\n\nexport { getDate };\n\nexport function DateComponent({ date, locale }: Props) {\n return ;\n}\n",".content-meta {\n margin-top: 0;\n color: var(--darkgray);\n}\n.content-meta[show-comma=true] > *:not(:last-child) {\n margin-right: 8px;\n}\n.content-meta[show-comma=true] > *:not(:last-child)::after {\n content: \",\";\n}"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 8f58007..5863506 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,5 +1,6 @@ import { createRequire } from 'module'; import { formatDate } from '@quartz-community/utils/date'; +import { getDate } from '@quartz-community/utils/sort'; import { jsx } from 'preact/jsx-runtime'; const require$1 = createRequire(import.meta.url); @@ -190,16 +191,6 @@ var locales = { function i18n(locale) { return locales[locale] || en_US_default; } -function getDate(cfg, data) { - const dateType = data.defaultDateType ?? cfg.defaultDateType; - if (!dateType) { - throw new Error( - `Field 'defaultDateType' was not set. Either configure it in the CreatedModifiedDate plugin options or set it in quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.` - ); - } - const dates = data.dates; - return dates?.[dateType]; -} function DateComponent({ date, locale }) { return /* @__PURE__ */ jsx("time", { datetime: date.toISOString(), children: formatDate(date, locale) }); } @@ -218,7 +209,11 @@ var ContentMeta_default = ((opts) => { const segments = []; if (fileData.dates) { const locale = cfg.locale || "en-US"; - segments.push(/* @__PURE__ */ jsx(DateComponent, { date: getDate(cfg, fileData), locale })); + const dataWithDefaultDateType = { + ...fileData, + defaultDateType: cfg.defaultDateType + }; + segments.push(/* @__PURE__ */ jsx(DateComponent, { date: getDate(dataWithDefaultDateType), locale })); } if (options.showReadingTime) { const { minutes, words: _words } = (0, import_reading_time.default)(text); diff --git a/dist/index.js.map b/dist/index.js.map index 4e6135c..03f1b6e 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/reading-time/lib/reading-time.js","../node_modules/reading-time/lib/stream.js","../node_modules/reading-time/index.js","../src/components/ContentMeta.tsx","../src/util/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/util/date.tsx","../src/components/styles/contentMeta.scss"],"names":["exports","readingTime","require_reading_time","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n */\n\n/**\n * @param {number} number\n * @param {number[][]} arrayOfRanges\n */\nfunction codeIsInRanges(number, arrayOfRanges) {\n return arrayOfRanges.some(([lowerBound, upperBound]) =>\n (lowerBound <= number) && (number <= upperBound)\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isCJK(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n // Help wanted!\n // This should be good for most cases, but if you find it unsatisfactory\n // (e.g. some other language where each character should be standalone words),\n // contributions welcome!\n return codeIsInRanges(\n charCode,\n [\n // Hiragana (Katakana not included on purpose,\n // context: https://github.com/ngryman/reading-time/pull/35#issuecomment-853364526)\n // If you think Katakana should be included and have solid reasons, improvement is welcomed\n [0x3040, 0x309f],\n // CJK Unified ideographs\n [0x4e00, 0x9fff],\n // Hangul\n [0xac00, 0xd7a3],\n // CJK extensions\n [0x20000, 0x2ebe0]\n ]\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isAnsiWordBound(c) {\n return ' \\n\\r\\t'.includes(c)\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isPunctuation(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n return codeIsInRanges(\n charCode,\n [\n [0x21, 0x2f],\n [0x3a, 0x40],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n // CJK Symbols and Punctuation\n [0x3000, 0x303f],\n // Full-width ASCII punctuation variants\n [0xff00, 0xffef]\n ]\n )\n}\n\n/**\n * @type {import('reading-time').default}\n */\nfunction readingTime(text, options = {}) {\n let words = 0, start = 0, end = text.length - 1\n\n // use provided value if available\n const wordsPerMinute = options.wordsPerMinute || 200\n\n // use provided function if available\n const isWordBound = options.wordBound || isAnsiWordBound\n\n // fetch bounds\n while (isWordBound(text[start])) start++\n while (isWordBound(text[end])) end--\n\n // Add a trailing word bound to make handling edges more convenient\n const normalizedText = `${text}\\n`\n\n // calculate the number of words\n for (let i = start; i <= end; i++) {\n // A CJK character is a always word;\n // A non-word bound followed by a word bound / CJK is the end of a word.\n if (\n isCJK(normalizedText[i]) ||\n (!isWordBound(normalizedText[i]) &&\n (isWordBound(normalizedText[i + 1]) || isCJK(normalizedText[i + 1]))\n )\n ) {\n words++\n }\n // In case of CJK followed by punctuations, those characters have to be eaten as well\n if (isCJK(normalizedText[i])) {\n while (\n i <= end &&\n (isPunctuation(normalizedText[i + 1]) || isWordBound(normalizedText[i + 1]))\n ) {\n i++\n }\n }\n }\n\n // reading time stats\n const minutes = words / wordsPerMinute\n // Math.round used to resolve floating point funkyness\n // http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\n const time = Math.round(minutes * 60 * 1000)\n const displayed = Math.ceil(minutes.toFixed(2))\n\n return {\n text: displayed + ' min read',\n minutes: minutes,\n time: time,\n words: words\n }\n}\n\n/**\n * Export\n */\nmodule.exports = readingTime\n","/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst readingTime = require('./reading-time')\nconst Transform = require('stream').Transform\nconst util = require('util')\n\n/**\n * @typedef {import('reading-time').Options} Options\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n * @typedef {import('reading-time').readingTimeStream} ReadingTimeStream\n * @typedef {import('stream').TransformCallback} TransformCallback\n */\n\n/**\n * @param {Options} options\n * @returns {ReadingTimeStream}\n */\nfunction ReadingTimeStream(options) {\n // allow use without new\n if (!(this instanceof ReadingTimeStream)) {\n return new ReadingTimeStream(options)\n }\n\n Transform.call(this, { objectMode: true })\n\n this.options = options || {}\n this.stats = {\n minutes: 0,\n time: 0,\n words: 0\n }\n}\nutil.inherits(ReadingTimeStream, Transform)\n\n/**\n * @param {Buffer} chunk\n * @param {BufferEncoding} encoding\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._transform = function(chunk, encoding, callback) {\n const stats = readingTime(chunk.toString(encoding), this.options)\n\n this.stats.minutes += stats.minutes\n this.stats.time += stats.time\n this.stats.words += stats.words\n\n callback()\n}\n\n/**\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._flush = function(callback) {\n this.stats.text = Math.ceil(this.stats.minutes.toFixed(2)) + ' min read'\n\n this.push(this.stats)\n callback()\n}\n\n/**\n * Export\n */\nmodule.exports = ReadingTimeStream\n","module.exports.default = module.exports = require('./lib/reading-time')\nmodule.exports.readingTimeStream = require('./lib/stream')\n","import type { QuartzComponentConstructor, QuartzComponentProps } from \"@quartz-community/types\";\nimport readingTime from \"reading-time\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { DateComponent, getDate } from \"../util/date\";\nimport type { JSX } from \"preact\";\nimport style from \"./styles/contentMeta.scss\";\n\nexport interface ContentMetaOptions {\n /**\n * Whether to display reading time\n */\n showReadingTime: boolean;\n showComma: boolean;\n}\n\nconst defaultOptions: ContentMetaOptions = {\n showReadingTime: true,\n showComma: true,\n};\n\nexport default ((opts?: Partial) => {\n // Merge options with defaults\n const options: ContentMetaOptions = { ...defaultOptions, ...opts };\n\n function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) {\n const text = fileData.text;\n\n if (text) {\n const segments: (string | JSX.Element)[] = [];\n\n if (fileData.dates) {\n const locale = cfg.locale || \"en-US\";\n segments.push();\n }\n\n // Display reading time if enabled\n if (options.showReadingTime) {\n const { minutes, words: _words } = readingTime(text as string);\n const locale = cfg.locale || \"en-US\";\n const i18nData = i18n(locale);\n const displayedTime = i18nData.components.contentMeta.readingTime({\n minutes: Math.ceil(minutes),\n });\n segments.push({displayedTime});\n }\n\n return (\n

\n {segments}\n

\n );\n } else {\n return null;\n }\n }\n\n ContentMetadata.css = style;\n\n return ContentMetadata;\n}) satisfies QuartzComponentConstructor;\n","export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n contentMeta: {\n readingTime: ({ minutes }: { minutes: number }) => {\n if (minutes === 1) {\n return \"1 min read\";\n }\n return `${minutes} min read`;\n },\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { formatDate } from \"@quartz-community/utils/date\";\n\nexport type ValidDateType = \"created\" | \"modified\" | \"published\";\n\ninterface Props {\n date: Date;\n locale?: string;\n}\n\nexport function getDate(\n cfg: { defaultDateType?: string },\n data: Record,\n): Date | undefined {\n const dateType = (data.defaultDateType as string) ?? cfg.defaultDateType;\n if (!dateType) {\n throw new Error(\n `Field 'defaultDateType' was not set. Either configure it in the CreatedModifiedDate plugin options or set it in quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`,\n );\n }\n const dates = data.dates as Record | undefined;\n return dates?.[dateType];\n}\n\nexport function DateComponent({ date, locale }: Props) {\n return ;\n}\n",".content-meta {\n margin-top: 0;\n color: var(--darkgray);\n}\n.content-meta[show-comma=true] > *:not(:last-child) {\n margin-right: 8px;\n}\n.content-meta[show-comma=true] > *:not(:last-child)::after {\n content: \",\";\n}"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/reading-time/lib/reading-time.js","../node_modules/reading-time/lib/stream.js","../node_modules/reading-time/index.js","../src/components/ContentMeta.tsx","../src/util/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/util/date.tsx","../src/components/styles/contentMeta.scss"],"names":["exports","readingTime","require_reading_time","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n */\n\n/**\n * @param {number} number\n * @param {number[][]} arrayOfRanges\n */\nfunction codeIsInRanges(number, arrayOfRanges) {\n return arrayOfRanges.some(([lowerBound, upperBound]) =>\n (lowerBound <= number) && (number <= upperBound)\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isCJK(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n // Help wanted!\n // This should be good for most cases, but if you find it unsatisfactory\n // (e.g. some other language where each character should be standalone words),\n // contributions welcome!\n return codeIsInRanges(\n charCode,\n [\n // Hiragana (Katakana not included on purpose,\n // context: https://github.com/ngryman/reading-time/pull/35#issuecomment-853364526)\n // If you think Katakana should be included and have solid reasons, improvement is welcomed\n [0x3040, 0x309f],\n // CJK Unified ideographs\n [0x4e00, 0x9fff],\n // Hangul\n [0xac00, 0xd7a3],\n // CJK extensions\n [0x20000, 0x2ebe0]\n ]\n )\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isAnsiWordBound(c) {\n return ' \\n\\r\\t'.includes(c)\n}\n\n/**\n * @type {WordBoundFunction}\n */\nfunction isPunctuation(c) {\n if ('string' !== typeof c) {\n return false\n }\n const charCode = c.charCodeAt(0)\n return codeIsInRanges(\n charCode,\n [\n [0x21, 0x2f],\n [0x3a, 0x40],\n [0x5b, 0x60],\n [0x7b, 0x7e],\n // CJK Symbols and Punctuation\n [0x3000, 0x303f],\n // Full-width ASCII punctuation variants\n [0xff00, 0xffef]\n ]\n )\n}\n\n/**\n * @type {import('reading-time').default}\n */\nfunction readingTime(text, options = {}) {\n let words = 0, start = 0, end = text.length - 1\n\n // use provided value if available\n const wordsPerMinute = options.wordsPerMinute || 200\n\n // use provided function if available\n const isWordBound = options.wordBound || isAnsiWordBound\n\n // fetch bounds\n while (isWordBound(text[start])) start++\n while (isWordBound(text[end])) end--\n\n // Add a trailing word bound to make handling edges more convenient\n const normalizedText = `${text}\\n`\n\n // calculate the number of words\n for (let i = start; i <= end; i++) {\n // A CJK character is a always word;\n // A non-word bound followed by a word bound / CJK is the end of a word.\n if (\n isCJK(normalizedText[i]) ||\n (!isWordBound(normalizedText[i]) &&\n (isWordBound(normalizedText[i + 1]) || isCJK(normalizedText[i + 1]))\n )\n ) {\n words++\n }\n // In case of CJK followed by punctuations, those characters have to be eaten as well\n if (isCJK(normalizedText[i])) {\n while (\n i <= end &&\n (isPunctuation(normalizedText[i + 1]) || isWordBound(normalizedText[i + 1]))\n ) {\n i++\n }\n }\n }\n\n // reading time stats\n const minutes = words / wordsPerMinute\n // Math.round used to resolve floating point funkyness\n // http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html\n const time = Math.round(minutes * 60 * 1000)\n const displayed = Math.ceil(minutes.toFixed(2))\n\n return {\n text: displayed + ' min read',\n minutes: minutes,\n time: time,\n words: words\n }\n}\n\n/**\n * Export\n */\nmodule.exports = readingTime\n","/*!\n * reading-time\n * Copyright (c) Nicolas Gryman \n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n */\nconst readingTime = require('./reading-time')\nconst Transform = require('stream').Transform\nconst util = require('util')\n\n/**\n * @typedef {import('reading-time').Options} Options\n * @typedef {import('reading-time').Options['wordBound']} WordBoundFunction\n * @typedef {import('reading-time').readingTimeStream} ReadingTimeStream\n * @typedef {import('stream').TransformCallback} TransformCallback\n */\n\n/**\n * @param {Options} options\n * @returns {ReadingTimeStream}\n */\nfunction ReadingTimeStream(options) {\n // allow use without new\n if (!(this instanceof ReadingTimeStream)) {\n return new ReadingTimeStream(options)\n }\n\n Transform.call(this, { objectMode: true })\n\n this.options = options || {}\n this.stats = {\n minutes: 0,\n time: 0,\n words: 0\n }\n}\nutil.inherits(ReadingTimeStream, Transform)\n\n/**\n * @param {Buffer} chunk\n * @param {BufferEncoding} encoding\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._transform = function(chunk, encoding, callback) {\n const stats = readingTime(chunk.toString(encoding), this.options)\n\n this.stats.minutes += stats.minutes\n this.stats.time += stats.time\n this.stats.words += stats.words\n\n callback()\n}\n\n/**\n * @param {TransformCallback} callback\n */\nReadingTimeStream.prototype._flush = function(callback) {\n this.stats.text = Math.ceil(this.stats.minutes.toFixed(2)) + ' min read'\n\n this.push(this.stats)\n callback()\n}\n\n/**\n * Export\n */\nmodule.exports = ReadingTimeStream\n","module.exports.default = module.exports = require('./lib/reading-time')\nmodule.exports.readingTimeStream = require('./lib/stream')\n","import type {\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport readingTime from \"reading-time\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { DateComponent, getDate } from \"../util/date\";\nimport type { JSX } from \"preact\";\nimport style from \"./styles/contentMeta.scss\";\n\nexport interface ContentMetaOptions {\n /**\n * Whether to display reading time\n */\n showReadingTime: boolean;\n showComma: boolean;\n}\n\nconst defaultOptions: ContentMetaOptions = {\n showReadingTime: true,\n showComma: true,\n};\n\nexport default ((opts?: Partial) => {\n // Merge options with defaults\n const options: ContentMetaOptions = { ...defaultOptions, ...opts };\n\n function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) {\n const text = fileData.text;\n\n if (text) {\n const segments: (string | JSX.Element)[] = [];\n\n if (fileData.dates) {\n const locale = cfg.locale || \"en-US\";\n const dataWithDefaultDateType: QuartzPluginData = {\n ...(fileData as QuartzPluginData),\n defaultDateType: cfg.defaultDateType as ValidDateType,\n };\n segments.push();\n }\n\n // Display reading time if enabled\n if (options.showReadingTime) {\n const { minutes, words: _words } = readingTime(text as string);\n const locale = cfg.locale || \"en-US\";\n const i18nData = i18n(locale);\n const displayedTime = i18nData.components.contentMeta.readingTime({\n minutes: Math.ceil(minutes),\n });\n segments.push({displayedTime});\n }\n\n return (\n

\n {segments}\n

\n );\n } else {\n return null;\n }\n }\n\n ContentMetadata.css = style;\n\n return ContentMetadata;\n}) satisfies QuartzComponentConstructor;\n","export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n contentMeta: {\n readingTime: ({ minutes }: { minutes: number }) => {\n if (minutes === 1) {\n return \"1 min read\";\n }\n return `${minutes} min read`;\n },\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { formatDate } from \"@quartz-community/utils/date\";\nimport { getDate } from \"@quartz-community/utils/sort\";\n\ninterface Props {\n date: Date;\n locale?: string;\n}\n\nexport { getDate };\n\nexport function DateComponent({ date, locale }: Props) {\n return ;\n}\n",".content-meta {\n margin-top: 0;\n color: var(--darkgray);\n}\n.content-meta[show-comma=true] > *:not(:last-child) {\n margin-right: 8px;\n}\n.content-meta[show-comma=true] > *:not(:last-child)::after {\n content: \",\";\n}"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cbf7135..c1b2c4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1039,7 +1039,7 @@ }, "node_modules/@quartz-community/types": { "version": "0.2.1", - "resolved": "git+ssh://git@github.com/quartz-community/types.git#653aece4c90759fb911d62d4af89bf300865f85d", + "resolved": "git+ssh://git@github.com/quartz-community/types.git#d413569b02ff0cd9a7e8d74dee125d20a5e5ec72", "license": "MIT", "engines": { "node": ">=22", @@ -1060,7 +1060,7 @@ }, "node_modules/@quartz-community/utils": { "version": "0.1.0", - "resolved": "git+ssh://git@github.com/quartz-community/utils.git#8b6e32ba07b62500dce10f0c79ca43bb7d7e55bc", + "resolved": "git+ssh://git@github.com/quartz-community/utils.git#20b1ac1844ea477b4e32f206a515a5be8d01c56e", "license": "MIT", "dependencies": { "@quartz-community/types": "github:quartz-community/types" diff --git a/src/components/ContentMeta.tsx b/src/components/ContentMeta.tsx index ead5a93..dccc0e2 100644 --- a/src/components/ContentMeta.tsx +++ b/src/components/ContentMeta.tsx @@ -1,4 +1,9 @@ -import type { QuartzComponentConstructor, QuartzComponentProps } from "@quartz-community/types"; +import type { + QuartzComponentConstructor, + QuartzComponentProps, + QuartzPluginData, + ValidDateType, +} from "@quartz-community/types"; import readingTime from "reading-time"; import { classNames } from "../util/lang"; import { i18n } from "../i18n"; @@ -31,7 +36,11 @@ export default ((opts?: Partial) => { if (fileData.dates) { const locale = cfg.locale || "en-US"; - segments.push(); + const dataWithDefaultDateType: QuartzPluginData = { + ...(fileData as QuartzPluginData), + defaultDateType: cfg.defaultDateType as ValidDateType, + }; + segments.push(); } // Display reading time if enabled diff --git a/src/util/date.tsx b/src/util/date.tsx index caafa33..75e17fb 100644 --- a/src/util/date.tsx +++ b/src/util/date.tsx @@ -1,25 +1,12 @@ import { formatDate } from "@quartz-community/utils/date"; - -export type ValidDateType = "created" | "modified" | "published"; +import { getDate } from "@quartz-community/utils/sort"; interface Props { date: Date; locale?: string; } -export function getDate( - cfg: { defaultDateType?: string }, - data: Record, -): Date | undefined { - const dateType = (data.defaultDateType as string) ?? cfg.defaultDateType; - if (!dateType) { - throw new Error( - `Field 'defaultDateType' was not set. Either configure it in the CreatedModifiedDate plugin options or set it in quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`, - ); - } - const dates = data.dates as Record | undefined; - return dates?.[dateType]; -} +export { getDate }; export function DateComponent({ date, locale }: Props) { return ;