diff --git a/dist/index.d.ts b/dist/index.d.ts index 1bc96fe..63d9922 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -11,6 +11,7 @@ declare module "vfile" { interface DataMap { frontmatter?: { description?: string; + [key: string]: unknown; }; description: string; text: string; diff --git a/dist/index.js.map b/dist/index.js.map index bcb2ea6..778e798 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/transformer.ts"],"names":[],"mappings":";;;;AAYA,IAAM,cAAA,GAAqC;AAAA,EACzC,iBAAA,EAAmB,GAAA;AAAA,EACnB,oBAAA,EAAsB,GAAA;AAAA,EACtB,oBAAA,EAAsB;AACxB,CAAA;AAEA,IAAM,WAAW,IAAI,MAAA;AAAA,EACnB,8FAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,WAAA,GAAoE,CAAC,QAAA,KAAa;AAC7F,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,QAAA,EAAS;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,GAAc;AACZ,MAAA,OAAO;AAAA,QACL,MAAM;AACJ,UAAA,OAAO,OAAO,MAAgB,IAAA,KAAgB;AAC5C,YAAA,IAAI,sBAAA,GAAyB,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,WAAA;AACpD,YAAA,IAAI,IAAA,GAAO,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA;AAEpC,YAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,cAAA,sBAAA,GAAyB,sBAAA,EAAwB,OAAA;AAAA,gBAC/C,QAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,kBAAuB,CAAA;AAAA,YACvD;AAEA,YAAA,IAAI,sBAAA,EAAwB;AAC1B,cAAA,IAAA,CAAK,KAAK,WAAA,GAAc,sBAAA;AACxB,cAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AACjB,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,IAAA,GAAO,IAAA;AACb,YAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,MAAM,MAAM,CAAA;AACxD,YAAA,IAAI,SAAA,GAAY,EAAA;AAChB,YAAA,IAAI,WAAA,GAAc,CAAA;AAElB,YAAA,OAAO,WAAA,GAAc,UAAU,MAAA,EAAQ;AACrC,cAAA,MAAM,QAAA,GAAW,UAAU,WAAW,CAAA;AACtC,cAAA,IAAI,CAAC,QAAA,EAAU;AAEf,cAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,WAAW,QAAA,GAAW,GAAA;AACvE,cAAA,MAAM,aAAa,SAAA,CAAU,MAAA,GAAS,eAAA,CAAgB,MAAA,IAAU,YAAY,CAAA,GAAI,CAAA,CAAA;AAEhF,cAAA,IAAI,UAAA,IAAc,IAAA,CAAK,iBAAA,IAAqB,WAAA,KAAgB,CAAA,EAAG;AAC7D,gBAAA,SAAA,IAAA,CAAc,SAAA,GAAY,MAAM,EAAA,IAAM,eAAA;AACtC,gBAAA,WAAA,EAAA;AAAA,cACF,CAAA,MAAO;AACL,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAA,CAAK,IAAA,CAAK,WAAA,GACR,SAAA,CAAU,MAAA,GAAS,IAAA,CAAK,oBAAA,GACpB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,oBAAoB,CAAA,GAAI,KAAA,GAChD,SAAA;AACN,YAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAAA,UACnB,CAAA;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import type { Root as HTMLRoot } from \"hast\";\nimport { toString } from \"hast-util-to-string\";\nimport type { QuartzTransformerPlugin } from \"@quartz-community/types\";\nimport { escapeHTML } from \"@quartz-community/utils\";\nimport type { VFile } from \"vfile\";\n\nexport interface DescriptionOptions {\n descriptionLength: number;\n maxDescriptionLength: number;\n replaceExternalLinks: boolean;\n}\n\nconst defaultOptions: DescriptionOptions = {\n descriptionLength: 150,\n maxDescriptionLength: 300,\n replaceExternalLinks: true,\n};\n\nconst urlRegex = new RegExp(\n /(https?:\\/\\/)?(?([\\da-z.-]+)\\.([a-z.]{2,6})(:\\d+)?)(?[/\\w.-]*)(\\?[/\\w.=&;-]*)?/,\n \"g\",\n);\n\nexport const Description: QuartzTransformerPlugin> = (userOpts) => {\n const opts = { ...defaultOptions, ...userOpts };\n return {\n name: \"Description\",\n htmlPlugins() {\n return [\n () => {\n return async (tree: HTMLRoot, file: VFile) => {\n let frontMatterDescription = file.data.frontmatter?.description;\n let text = escapeHTML(toString(tree));\n\n if (opts.replaceExternalLinks) {\n frontMatterDescription = frontMatterDescription?.replace(\n urlRegex,\n \"$\" + \"$\",\n );\n text = text.replace(urlRegex, \"$\" + \"$\");\n }\n\n if (frontMatterDescription) {\n file.data.description = frontMatterDescription;\n file.data.text = text;\n return;\n }\n\n const desc = text;\n const sentences = desc.replace(/\\s+/g, \" \").split(/\\.\\s/);\n let finalDesc = \"\";\n let sentenceIdx = 0;\n\n while (sentenceIdx < sentences.length) {\n const sentence = sentences[sentenceIdx];\n if (!sentence) break;\n\n const currentSentence = sentence.endsWith(\".\") ? sentence : sentence + \".\";\n const nextLength = finalDesc.length + currentSentence.length + (finalDesc ? 1 : 0);\n\n if (nextLength <= opts.descriptionLength || sentenceIdx === 0) {\n finalDesc += (finalDesc ? \" \" : \"\") + currentSentence;\n sentenceIdx++;\n } else {\n break;\n }\n }\n\n file.data.description =\n finalDesc.length > opts.maxDescriptionLength\n ? finalDesc.slice(0, opts.maxDescriptionLength) + \"...\"\n : finalDesc;\n file.data.text = text;\n };\n },\n ];\n },\n };\n};\n\ndeclare module \"vfile\" {\n interface DataMap {\n frontmatter?: {\n description?: string;\n };\n description: string;\n text: string;\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/transformer.ts"],"names":[],"mappings":";;;;AAYA,IAAM,cAAA,GAAqC;AAAA,EACzC,iBAAA,EAAmB,GAAA;AAAA,EACnB,oBAAA,EAAsB,GAAA;AAAA,EACtB,oBAAA,EAAsB;AACxB,CAAA;AAEA,IAAM,WAAW,IAAI,MAAA;AAAA,EACnB,8FAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,WAAA,GAAoE,CAAC,QAAA,KAAa;AAC7F,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,QAAA,EAAS;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,GAAc;AACZ,MAAA,OAAO;AAAA,QACL,MAAM;AACJ,UAAA,OAAO,OAAO,MAAgB,IAAA,KAAgB;AAC5C,YAAA,IAAI,sBAAA,GAAyB,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,WAAA;AACpD,YAAA,IAAI,IAAA,GAAO,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA;AAEpC,YAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,cAAA,sBAAA,GAAyB,sBAAA,EAAwB,OAAA;AAAA,gBAC/C,QAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,kBAAuB,CAAA;AAAA,YACvD;AAEA,YAAA,IAAI,sBAAA,EAAwB;AAC1B,cAAA,IAAA,CAAK,KAAK,WAAA,GAAc,sBAAA;AACxB,cAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AACjB,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,IAAA,GAAO,IAAA;AACb,YAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,MAAM,MAAM,CAAA;AACxD,YAAA,IAAI,SAAA,GAAY,EAAA;AAChB,YAAA,IAAI,WAAA,GAAc,CAAA;AAElB,YAAA,OAAO,WAAA,GAAc,UAAU,MAAA,EAAQ;AACrC,cAAA,MAAM,QAAA,GAAW,UAAU,WAAW,CAAA;AACtC,cAAA,IAAI,CAAC,QAAA,EAAU;AAEf,cAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,WAAW,QAAA,GAAW,GAAA;AACvE,cAAA,MAAM,aAAa,SAAA,CAAU,MAAA,GAAS,eAAA,CAAgB,MAAA,IAAU,YAAY,CAAA,GAAI,CAAA,CAAA;AAEhF,cAAA,IAAI,UAAA,IAAc,IAAA,CAAK,iBAAA,IAAqB,WAAA,KAAgB,CAAA,EAAG;AAC7D,gBAAA,SAAA,IAAA,CAAc,SAAA,GAAY,MAAM,EAAA,IAAM,eAAA;AACtC,gBAAA,WAAA,EAAA;AAAA,cACF,CAAA,MAAO;AACL,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAA,CAAK,IAAA,CAAK,WAAA,GACR,SAAA,CAAU,MAAA,GAAS,IAAA,CAAK,oBAAA,GACpB,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,oBAAoB,CAAA,GAAI,KAAA,GAChD,SAAA;AACN,YAAA,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAAA,UACnB,CAAA;AAAA,QACF;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import type { Root as HTMLRoot } from \"hast\";\nimport { toString } from \"hast-util-to-string\";\nimport type { QuartzTransformerPlugin } from \"@quartz-community/types\";\nimport { escapeHTML } from \"@quartz-community/utils\";\nimport type { VFile } from \"vfile\";\n\nexport interface DescriptionOptions {\n descriptionLength: number;\n maxDescriptionLength: number;\n replaceExternalLinks: boolean;\n}\n\nconst defaultOptions: DescriptionOptions = {\n descriptionLength: 150,\n maxDescriptionLength: 300,\n replaceExternalLinks: true,\n};\n\nconst urlRegex = new RegExp(\n /(https?:\\/\\/)?(?([\\da-z.-]+)\\.([a-z.]{2,6})(:\\d+)?)(?[/\\w.-]*)(\\?[/\\w.=&;-]*)?/,\n \"g\",\n);\n\nexport const Description: QuartzTransformerPlugin> = (userOpts) => {\n const opts = { ...defaultOptions, ...userOpts };\n return {\n name: \"Description\",\n htmlPlugins() {\n return [\n () => {\n return async (tree: HTMLRoot, file: VFile) => {\n let frontMatterDescription = file.data.frontmatter?.description;\n let text = escapeHTML(toString(tree));\n\n if (opts.replaceExternalLinks) {\n frontMatterDescription = frontMatterDescription?.replace(\n urlRegex,\n \"$\" + \"$\",\n );\n text = text.replace(urlRegex, \"$\" + \"$\");\n }\n\n if (frontMatterDescription) {\n file.data.description = frontMatterDescription;\n file.data.text = text;\n return;\n }\n\n const desc = text;\n const sentences = desc.replace(/\\s+/g, \" \").split(/\\.\\s/);\n let finalDesc = \"\";\n let sentenceIdx = 0;\n\n while (sentenceIdx < sentences.length) {\n const sentence = sentences[sentenceIdx];\n if (!sentence) break;\n\n const currentSentence = sentence.endsWith(\".\") ? sentence : sentence + \".\";\n const nextLength = finalDesc.length + currentSentence.length + (finalDesc ? 1 : 0);\n\n if (nextLength <= opts.descriptionLength || sentenceIdx === 0) {\n finalDesc += (finalDesc ? \" \" : \"\") + currentSentence;\n sentenceIdx++;\n } else {\n break;\n }\n }\n\n file.data.description =\n finalDesc.length > opts.maxDescriptionLength\n ? finalDesc.slice(0, opts.maxDescriptionLength) + \"...\"\n : finalDesc;\n file.data.text = text;\n };\n },\n ];\n },\n };\n};\n\ndeclare module \"vfile\" {\n interface DataMap {\n frontmatter?: {\n description?: string;\n [key: string]: unknown;\n };\n description: string;\n text: string;\n }\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index af22aa2..7f9cb68 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ }, "peerDependencies": { "@jackyzha0/quartz": "^4.5.2", - "preact": "^10.0.0", - "hast-util-to-string": "^3.0.1" + "hast-util-to-string": "^3.0.1", + "preact": "^10.0.0" }, "peerDependenciesMeta": { "@jackyzha0/quartz": { diff --git a/src/transformer.ts b/src/transformer.ts index 7998db2..eb2e934 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -82,6 +82,7 @@ declare module "vfile" { interface DataMap { frontmatter?: { description?: string; + [key: string]: unknown; }; description: string; text: string;