fix(description): calculate description properly when first sentence is longer than max

This commit is contained in:
Jacky Zhao 2025-03-13 14:22:11 -07:00
parent b579950ae5
commit e26658f4ed

View file

@ -5,11 +5,13 @@ import { escapeHTML } from "../../util/escape"
export interface Options { export interface Options {
descriptionLength: number descriptionLength: number
maxDescriptionLength: number
replaceExternalLinks: boolean replaceExternalLinks: boolean
} }
const defaultOptions: Options = { const defaultOptions: Options = {
descriptionLength: 150, descriptionLength: 150,
maxDescriptionLength: 300,
replaceExternalLinks: true, replaceExternalLinks: true,
} }
@ -37,35 +39,41 @@ export const Description: QuartzTransformerPlugin<Partial<Options>> = (userOpts)
text = text.replace(urlRegex, "$<domain>" + "$<path>") text = text.replace(urlRegex, "$<domain>" + "$<path>")
} }
const desc = frontMatterDescription ?? text if (frontMatterDescription) {
const sentences = desc.replace(/\s+/g, " ").split(/\.\s/) file.data.description = frontMatterDescription
const finalDesc: string[] = [] file.data.text = text
const len = opts.descriptionLength return
let sentenceIdx = 0
let currentDescriptionLength = 0
if (sentences[0] !== undefined && sentences[0].length >= len) {
const firstSentence = sentences[0].split(" ")
while (currentDescriptionLength < len) {
const sentence = firstSentence[sentenceIdx]
if (!sentence) break
finalDesc.push(sentence)
currentDescriptionLength += sentence.length
sentenceIdx++
} }
finalDesc.push("...")
} else { // otherwise, use the text content
while (currentDescriptionLength < len) { const desc = text
const sentences = desc.replace(/\s+/g, " ").split(/\.\s/)
let finalDesc = ""
let sentenceIdx = 0
// Add full sentences until we exceed the guideline length
while (sentenceIdx < sentences.length) {
const sentence = sentences[sentenceIdx] const sentence = sentences[sentenceIdx]
if (!sentence) break if (!sentence) break
const currentSentence = sentence.endsWith(".") ? sentence : sentence + "." const currentSentence = sentence.endsWith(".") ? sentence : sentence + "."
finalDesc.push(currentSentence) const nextLength = finalDesc.length + currentSentence.length + (finalDesc ? 1 : 0)
currentDescriptionLength += currentSentence.length
// Add the sentence if we're under the guideline length
// or if this is the first sentence (always include at least one)
if (nextLength <= opts.descriptionLength || sentenceIdx === 0) {
finalDesc += (finalDesc ? " " : "") + currentSentence
sentenceIdx++ sentenceIdx++
} else {
break
} }
} }
file.data.description = finalDesc.join(" ") // truncate to max length if necessary
file.data.description =
finalDesc.length > opts.maxDescriptionLength
? finalDesc.slice(0, opts.maxDescriptionLength) + "..."
: finalDesc
file.data.text = text file.data.text = text
} }
}, },