{"version":3,"file":"index.mjs","sources":["../../src/vitepress/constants.ts","../../src/vitepress/options.ts","../../src/vitepress/utils/emoji.ts","../../src/vitepress/utils/svg/escape.ts","../../src/vitepress/utils/svg/render.ts","../../src/vitepress/utils/task.ts","../../src/vitepress/utils/vitepress/locales.ts","../../src/vitepress/utils/vitepress/sidebar.ts","../../src/vitepress/index.ts"],"sourcesContent":["import { cyan, gray } from 'colorette'\n\nexport const logModulePrefix = `${cyan(`@nolebase/vitepress-plugin-og-image`)}${gray(':')}`\n","import type { SiteConfig } from 'vitepress'\nimport type { BuildEndGenerateOpenGraphImagesOptionsCategory, PageItem } from './types'\nimport { dirname, resolve } from 'node:path'\n\nimport { fileURLToPath } from 'node:url'\nimport { red, yellow } from 'colorette'\n\nimport fs from 'fs-extra'\nimport { logModulePrefix } from './constants'\n\nexport async function tryToLocateTemplateSVGFile(siteConfig: SiteConfig, configTemplateSvgPath?: string): Promise<string | undefined> {\n  if (configTemplateSvgPath != null)\n    return resolve(siteConfig.srcDir, configTemplateSvgPath)\n\n  const templateSvgPathUnderPublicDir = resolve(siteConfig.srcDir, 'public', 'og-template.svg')\n  if (await fs.pathExists(templateSvgPathUnderPublicDir))\n    return templateSvgPathUnderPublicDir\n\n  const __dirname = dirname(fileURLToPath(import.meta.url))\n  const templateSvgPathUnderRootDir = resolve(__dirname, 'assets', 'og-template.svg')\n  if (await fs.pathExists(templateSvgPathUnderRootDir))\n    return templateSvgPathUnderRootDir\n}\n\nexport async function tryToLocateFontFile(siteConfig: SiteConfig): Promise<string | undefined> {\n  const fontPathUnderPublicDir = resolve(siteConfig.srcDir, 'public', 'SourceHanSansSC.otf')\n  if (await fs.pathExists(fontPathUnderPublicDir))\n    return fontPathUnderPublicDir\n\n  const __dirname = dirname(fileURLToPath(import.meta.url))\n  const fontPathUnderRootDir = resolve(__dirname, 'assets', 'SourceHanSansSC.otf')\n  if (await fs.pathExists(fontPathUnderRootDir))\n    return fontPathUnderRootDir\n}\n\nexport async function applyCategoryText(pageItem: PageItem, categoryOptions?: BuildEndGenerateOpenGraphImagesOptionsCategory): Promise<string | void> {\n  if (typeof categoryOptions?.byCustomGetter !== 'undefined') {\n    const gotTextMaybePromise = categoryOptions.byCustomGetter({ ...pageItem })\n\n    if (typeof gotTextMaybePromise !== 'undefined') {\n      if (gotTextMaybePromise instanceof Promise)\n        return await gotTextMaybePromise\n\n      if (gotTextMaybePromise)\n        return gotTextMaybePromise\n    }\n  }\n\n  if (typeof categoryOptions?.byPathPrefix !== 'undefined') {\n    for (const { prefix, text } of categoryOptions.byPathPrefix) {\n      if (pageItem.normalizedSourceFilePath.startsWith(prefix)) {\n        if (!text) {\n          console.warn(\n            `${logModulePrefix} ${yellow('[WARN]')} empty text for prefix ${prefix} when processing ${pageItem.sourceFilePath} with categoryOptions.byPathPrefix, will ignore...`,\n          )\n\n          return\n        }\n\n        return text\n      }\n      if (pageItem.normalizedSourceFilePath.startsWith(`/${prefix}`)) {\n        if (!text) {\n          console.warn(\n            `${logModulePrefix} ${yellow('[WARN]')} empty text for prefix ${prefix} when processing ${pageItem.sourceFilePath} with categoryOptions.byPathPrefix, will ignore...`,\n          )\n\n          return\n        }\n\n        return text\n      }\n    }\n\n    console.warn(\n      `${logModulePrefix} ${yellow('[WARN]')} no path prefix matched for ${pageItem.sourceFilePath} with categoryOptions.byPathPrefix, will ignore...`,\n    )\n\n    return\n  }\n\n  if (typeof categoryOptions?.byLevel !== 'undefined') {\n    const level = Number.parseInt(String(categoryOptions?.byLevel ?? 0))\n    if (Number.isNaN(level)) {\n      console.warn(\n        `${logModulePrefix} ${yellow('[ERROR]')} byLevel must be a number, but got ${categoryOptions.byLevel} instead when processing ${pageItem.sourceFilePath} with categoryOptions.byLevel, will ignore...`,\n      )\n      return\n    }\n\n    const dirs = pageItem.sourceFilePath.split('/')\n    if (dirs.length > level)\n      return dirs[level]\n\n    console.warn(`${logModulePrefix} ${red(`[ERROR] byLevel is out of range for ${pageItem.sourceFilePath} with categoryOptions.byLevel.`)} will ignore...`)\n  }\n}\n\nexport async function applyCategoryTextWithFallback(pageItem: PageItem, categoryOptions?: BuildEndGenerateOpenGraphImagesOptionsCategory): Promise<string> {\n  const customText = await applyCategoryText(pageItem, categoryOptions)\n  if (customText)\n    return customText\n\n  const fallbackWithFrontmatter = typeof categoryOptions?.fallbackWithFrontmatter === 'undefined'\n    ? true\n    : categoryOptions.fallbackWithFrontmatter\n\n  if (fallbackWithFrontmatter\n    && 'category' in pageItem.frontmatter\n    && pageItem.frontmatter.category\n    && typeof pageItem.frontmatter.category === 'string'\n  ) {\n    return (pageItem.frontmatter as { category?: string }).category ?? ''\n  }\n\n  console.warn(`${logModulePrefix} ${yellow('[WARN]')} no category text found for ${pageItem.sourceFilePath} with categoryOptions ${JSON.stringify(categoryOptions)}.}`)\n  return 'Un-categorized'\n}\n","import regexCreator from 'emoji-regex'\n\nconst emojiRegex = regexCreator()\n\nexport function removeEmoji(str: string) {\n  return str.replace(emojiRegex, '')\n}\n","// miketheprogrammer/xml-escape: Escape XML in javascript (NodeJS)\n// https://github.com/miketheprogrammer/xml-escape\n\nconst escapeMap: Record<string, string> = {\n  '<': '&lt;',\n  '>': '&gt;',\n  '\\'': '&apos;',\n  '\"': '&quot;',\n  '&': '&amp;',\n}\n\nexport function escape(content: string, ignore?: string): string {\n  ignore = (ignore || '').replace(/[^&\"<>']/g, '')\n  const pattern = '([&\"<>\\'])'.replace(new RegExp(`[${ignore}]`, 'g'), '')\n\n  return content.replace(new RegExp(pattern, 'g'), (_, item) => {\n    return escapeMap[item]\n  })\n}\n","import type { BuildEndGenerateOpenGraphImagesOptions } from '../../../vitepress/types'\nimport { Buffer } from 'node:buffer'\nimport { readFile } from 'node:fs/promises'\n\nimport { createRequire } from 'node:module'\nimport { initWasm, Resvg } from '@resvg/resvg-wasm'\nimport { removeEmoji } from '../emoji'\nimport { escape } from './escape'\n\nconst imageBuffers = new Map<string, Promise<Buffer>>()\n\nexport function templateSVG(siteName: string, siteDescription: string, title: string, category: string, ogTemplate: string, maxCharactersPerLine?: number): string {\n  maxCharactersPerLine ??= 17\n\n  // Remove emoji and split lines\n  const lines = removeEmoji(title)\n    .trim()\n    .replaceAll('\\r\\n', '\\n')\n    .split('\\n')\n    .map(line => line.trim())\n\n  // Restricted `maxCharactersPerLine` characters per line\n  for (let i = 0; i < lines.length; i++) {\n    const val = lines[i].trim()\n\n    if (val.length > maxCharactersPerLine) {\n      // attempt to break at a space\n      let breakPoint = val.lastIndexOf(' ', maxCharactersPerLine)\n\n      // attempt to break before before a capital letter\n      if (breakPoint < 0) {\n        for (let j = Math.min(val.length - 1, maxCharactersPerLine); j > 0; j--) {\n          if (val[j] === val[j].toUpperCase()) {\n            breakPoint = j\n            break\n          }\n        }\n      }\n      if (breakPoint < 0)\n        breakPoint = maxCharactersPerLine\n\n      lines[i] = val.slice(0, breakPoint)\n      lines[i + 1] = `${val.slice(lines[i].length)}${lines[i + 1] || ''}`\n    }\n    lines[i] = lines[i].trim()\n  }\n\n  const categoryStr = category ? removeEmoji(category).trim() : ''\n\n  const data = {\n    siteName,\n    siteDescription,\n    category: categoryStr,\n    line1: lines[0] || '',\n    line2: lines[1] || '',\n    line3: `${lines[2] || ''}${lines[3] ? '...' : ''}`,\n  }\n\n  return ogTemplate.replace(/\\{\\{([^}]+)\\}\\}/g, (_, name) => {\n    if (!name || typeof name !== 'string' || !(name in data))\n      return ''\n\n    const nameKeyOf = name as keyof typeof data\n    return escape(data[nameKeyOf])\n  })\n}\n\nlet resvgInit = false\n\nexport async function initSVGRenderer() {\n  try {\n    if (!resvgInit) {\n      const wasm = readFile(createRequire(import.meta.url).resolve('@resvg/resvg-wasm/index_bg.wasm'))\n      await initWasm(wasm)\n      resvgInit = true\n    }\n  }\n  catch (err) {\n    throw new Error(`Failed to init resvg wasm due to ${err}`)\n  }\n}\n\nlet fontBuffer: Uint8Array\n\nexport async function initFontBuffer(options?: { fontPath?: string }): Promise<Uint8Array | undefined> {\n  if (!options?.fontPath)\n    return\n  if (fontBuffer)\n    return fontBuffer\n\n  try {\n    fontBuffer = await readFile(options.fontPath)\n  }\n  catch (err) {\n    throw new Error(`Failed to read font file due to ${err}`)\n  }\n\n  return fontBuffer\n}\n\nexport async function renderSVG(\n  svgContent: string,\n  fontBuffer?: Uint8Array,\n  imageUrlResolver?: BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver'],\n  additionalFontBuffers?: Uint8Array[],\n  resultImageWidth?: number,\n): Promise<{\n    png: Uint8Array\n    width: number\n    height: number\n  }> {\n  try {\n    const resvg = new Resvg(\n      svgContent,\n      {\n        fitTo: { mode: 'width', value: resultImageWidth ?? 1200 },\n        font: {\n          fontBuffers: fontBuffer\n            ? [fontBuffer, ...(additionalFontBuffers ?? [])]\n            : (additionalFontBuffers ?? []),\n          // Load system fonts might cost more time\n          loadSystemFonts: false,\n        },\n      },\n    )\n\n    try {\n      const resolvedImages = await Promise.all(\n        resvg.imagesToResolve().map(async (url) => {\n          return {\n            url,\n            buffer: await resolveImageUrlWithCache(url, imageUrlResolver),\n          }\n        }),\n      )\n\n      for (const { url, buffer } of resolvedImages)\n        resvg.resolveImage(url, buffer)\n\n      const res = resvg.render()\n\n      return {\n        png: res.asPng(),\n        width: res.width,\n        height: res.height,\n      }\n    }\n    catch (err) {\n      throw new Error(`Failed to render open graph images on path due to ${err}`)\n    }\n  }\n  catch (err) {\n    throw new Error(`Failed to initiate Resvg instance to render open graph images due to ${err}`)\n  }\n}\n\nfunction resolveImageUrlWithCache(url: string, imageUrlResolver?: BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver']): Promise<Buffer> {\n  if (imageBuffers.has(url))\n    return imageBuffers.get(url)!\n\n  const result = resolveImageUrl(url, imageUrlResolver)\n  imageBuffers.set(url, result)\n\n  return result\n}\n\nasync function resolveImageUrl(url: string, imageUrlResolver?: BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver']) {\n  if (imageUrlResolver != null) {\n    const res = await imageUrlResolver(url)\n    if (res != null)\n      return res\n  }\n\n  const res = await fetch(url)\n  const buffer = await res.arrayBuffer()\n  return Buffer.from(buffer)\n}\n","// vitepress/src/node/utils/task.ts at df8753bd927c2b57b9188fb292c1429e9c3c8ab6 · vuejs/vitepress\n// https://github.com/vuejs/vitepress/blob/df8753bd927c2b57b9188fb292c1429e9c3c8ab6/src/node/utils/task.ts\n\nimport type { SiteConfig } from 'vitepress'\nimport { relative } from 'node:path'\nimport { cyan, gray, green, red, yellow } from 'colorette'\nimport ora from 'ora'\n\ninterface TaskResultSuccess {\n  status: 'success'\n  filePath: string\n}\n\ninterface TaskResultSkipped {\n  status: 'skipped'\n  reason: string\n  filePath: string\n}\n\ninterface TaskResultErrored {\n  status: 'errored'\n  reason: string\n  filePath: string\n}\n\nexport type TaskResult = TaskResultSuccess | TaskResultSkipped | TaskResultErrored\n\nexport const okMark = green('✓')\nexport const failMark = red('✖')\n\nexport async function task(taskName: string, task: () => Promise<string | undefined>) {\n  const startsAt = Date.now()\n\n  const moduleNamePrefix = cyan('@nolebase/vitepress-plugin-og-image')\n  const grayPrefix = gray(':')\n  const spinnerPrefix = `${moduleNamePrefix}${grayPrefix}`\n\n  const spinner = ora({ discardStdin: false })\n  spinner.start(`${spinnerPrefix} ${taskName}...`)\n\n  let result: string | undefined\n\n  try {\n    result = await task()\n  }\n  catch (e) {\n    spinner.stopAndPersist({ symbol: failMark })\n    throw e\n  }\n\n  const elapsed = Date.now() - startsAt\n  const suffixText = `${gray(`(${elapsed}ms)`)} ${result || ''}`\n\n  spinner.stopAndPersist({ symbol: okMark, suffixText })\n}\n\nexport function renderTaskResultsSummary(results: TaskResult[], siteConfig: SiteConfig) {\n  const successCount = results.filter(item => item.status === 'success') as TaskResultSuccess[]\n  const skippedCount = results.filter(item => item.status === 'skipped') as TaskResultSkipped[]\n  const erroredCount = results.filter(item => item.status === 'errored') as TaskResultErrored[]\n\n  const stats = `${green(`${successCount.length} generated`)}, ${yellow(`${skippedCount.length} skipped`)}, ${red(`${erroredCount.length} errored`)}`\n  const skippedList = ` - ${yellow('Following files were skipped')}:\\n\\n${skippedCount.map((item) => {\n    return gray(`    - ${relative(siteConfig.root, item.filePath)}: ${item.reason}`)\n  }).join('\\n')}`\n  const erroredList = ` - ${red('Following files encountered errors')}\\n\\n${erroredCount.map((item) => {\n    return gray(`    - ${relative(siteConfig.root, item.filePath)}: ${item.reason}`)\n  }).join('\\n')}`\n\n  const overallResults = [stats]\n\n  if (skippedCount.length > 0)\n    overallResults.push(skippedList)\n  if (erroredCount.length > 0)\n    overallResults.push(erroredList)\n\n  return overallResults.join('\\n\\n')\n}\n","import type { DefaultTheme, SiteData } from 'vitepress'\n\nexport function getLocales(siteData: SiteData<DefaultTheme.Config>) {\n  const locales: string[] = []\n  locales.push(siteData.lang ?? 'root')\n\n  if (Object.keys(siteData.locales).length === 0)\n    return locales\n\n  for (const locale in siteData.locales) {\n    if (locale !== siteData.lang)\n      locales.push(locale)\n  }\n\n  return locales\n}\n\nexport function getTitleWithLocales(siteData: SiteData<DefaultTheme.Config>, locale: string): string {\n  if (Object.keys(siteData.locales).length > 0) {\n    const title = siteData.locales[locale]?.title\n    if (title)\n      return title\n    if (siteData.locales.root.title)\n      return siteData.locales.root.title\n    return siteData.title\n  }\n\n  return siteData.title\n}\n\nexport function getDescriptionWithLocales(siteData: SiteData<DefaultTheme.Config>, locale: string): string {\n  if (Object.keys(siteData.locales).length > 0) {\n    const description = siteData.locales[locale]?.description\n    if (description)\n      return description\n    if (siteData.locales.root.description)\n      return siteData.locales.root.description\n    return siteData.description\n  }\n\n  return siteData.description\n}\n","import type { DefaultTheme, SiteData } from 'vitepress'\nimport { getLocales } from './locales'\n\ninterface AggregatedSidebar {\n  defaultLocale: string\n  locales: string[]\n  sidebar: Record<string, DefaultTheme.SidebarItem[]>\n}\n\n/**\n * Search for available sidebars in both the default locale and other locales over the site data and theme config.\n *\n * @param {SiteConfig<DefaultTheme.Config>} siteData Site data\n * @param {DefaultTheme.Config} themeConfig Theme config\n * @returns {AggregatedSidebar} Aggregated sidebar\n */\nexport function getSidebar(siteData: SiteData<DefaultTheme.Config>, themeConfig: DefaultTheme.Config): AggregatedSidebar {\n  const locales = getLocales(siteData)\n\n  if (locales.length === 0) {\n    return {\n      defaultLocale: siteData.lang,\n      locales: locales || [],\n      sidebar: {\n        [siteData.lang]: flattenThemeConfigSidebar(themeConfig.sidebar) || [],\n      },\n    }\n  }\n\n  const sidebar: AggregatedSidebar = {\n    defaultLocale: siteData.lang,\n    locales,\n    sidebar: {},\n  }\n\n  for (const locale of locales) {\n    let themeConfigSidebar: DefaultTheme.Sidebar = []\n    if (typeof siteData.locales[locale]?.themeConfig?.sidebar !== 'undefined')\n      themeConfigSidebar = siteData.locales[locale]?.themeConfig?.sidebar || []\n    else if (typeof siteData.themeConfig?.sidebar !== 'undefined')\n      themeConfigSidebar = siteData.themeConfig?.sidebar || []\n    else if (typeof themeConfig.sidebar !== 'undefined')\n      themeConfigSidebar = themeConfig.sidebar\n    else\n      themeConfigSidebar = []\n\n    sidebar.sidebar[locale] = flattenThemeConfigSidebar(themeConfigSidebar) || []\n  }\n\n  return sidebar\n}\n\n/**\n * Since sidebar is possible to be either items or multi-sidebars, we need to flatten it to a single array.\n * @param {DefaultTheme.Sidebar} sidebar\n * @returns {DefaultTheme.Sidebar} Flattened sidebar\n */\nfunction flattenThemeConfigSidebar(sidebar?: DefaultTheme.Sidebar): DefaultTheme.SidebarItem[] {\n  if (!sidebar)\n    return []\n\n  if (Array.isArray(sidebar))\n    return sidebar\n\n  return Object.keys(sidebar).reduce((prev, curr) => {\n    const items = sidebar[curr]\n    return prev.concat(items)\n  }, [] as DefaultTheme.SidebarItem[])\n}\n\nexport function flattenSidebar(sidebar: DefaultTheme.SidebarItem[], base?: string): DefaultTheme.SidebarItem[] {\n  return sidebar.reduce((prev, curr) => {\n    if (curr.items) {\n      return prev.concat(\n        flattenSidebar(\n          curr.items.map(item => addBaseToItem(item, curr.base ?? base)),\n          curr.base ?? base,\n        )\n          .concat(\n            curr.link == null\n              ? []\n              : [{\n                  ...curr,\n                  items: undefined,\n                  link: curr.link != null\n                    ? ((curr.base ?? '') + curr.link)\n                    : curr.link,\n                }],\n          ),\n      )\n    }\n\n    return prev.concat(curr)\n  }, [] as DefaultTheme.SidebarItem[])\n}\n\nfunction addBaseToItem(item: DefaultTheme.SidebarItem, base?: string) {\n  if (base == null || base === '')\n    return item\n\n  return {\n    ...item,\n    link: item.link != null\n      ? (base + item.link)\n      : item.link,\n  }\n}\n","import type { Buffer } from 'node:buffer'\nimport type { DefaultTheme, SiteConfig } from 'vitepress'\nimport type { BuildEndGenerateOpenGraphImagesOptions, PageItem } from './types'\nimport type { TaskResult } from './utils/task'\nimport { basename, dirname, join, relative, sep } from 'node:path'\nimport { sep as posixSep } from 'node:path/posix'\nimport { gray, green, red, yellow } from 'colorette'\nimport { defu } from 'defu'\nimport fs from 'fs-extra'\nimport GrayMatter from 'gray-matter'\nimport RehypeMeta from 'rehype-meta'\nimport RehypeParse from 'rehype-parse'\nimport RehypeStringify from 'rehype-stringify'\n\nimport { glob } from 'tinyglobby'\nimport { unified } from 'unified'\nimport { visit } from 'unist-util-visit'\nimport { logModulePrefix } from './constants'\nimport { applyCategoryTextWithFallback, tryToLocateFontFile, tryToLocateTemplateSVGFile } from './options'\nimport { initFontBuffer, initSVGRenderer, renderSVG, templateSVG } from './utils/svg/render'\nimport { renderTaskResultsSummary, task } from './utils/task'\nimport { getDescriptionWithLocales, getTitleWithLocales } from './utils/vitepress/locales'\nimport { flattenSidebar, getSidebar } from './utils/vitepress/sidebar'\n\n/**\n * Render SVG and rewrite HTML\n *\n * Will always save the rendered Open Graph image as PNG under the same directory as the HTML file with\n * the name `og-${fileName of rendered HTML}.png`.\n *\n * @param {SiteConfig} siteConfig - Site configuration\n * @param {string} siteTitle - Site title\n * @param {string} siteDescription - Site description\n * @param {PageItem} page - Page item\n * @param {string} file - File path\n * @param {string} ogImageTemplateSvg - Open Graph image template SVG\n * @param {string} ogImageTemplateSvgPath - Open Graph image template SVG path\n * @param {string} domain - Domain\n * @param {BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver']} imageUrlResolver - SVG image URL resolver\n * @param {Buffer[]} additionalFontBuffers - Additional font buffers\n * @param {number} resultImageWidth - Result image width\n * @param {number} maxCharactersPerLine - Max characters per line\n * @param {boolean} overrideExistingMetaTags - Whether to override existing meta tags\n * @returns {Promise<TaskResult>} Task result\n */\nasync function renderSVGAndRewriteHTML(\n  siteConfig: SiteConfig,\n  siteTitle: string,\n  siteDescription: string,\n  page: PageItem,\n  file: string,\n  ogImageTemplateSvg: string,\n  ogImageTemplateSvgPath: string,\n  domain: string,\n  imageUrlResolver: BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver'],\n  additionalFontBuffers?: Buffer[],\n  resultImageWidth?: number,\n  maxCharactersPerLine?: number,\n  overrideExistingMetaTags?: boolean,\n): Promise<TaskResult> {\n  const fileName = basename(file, '.html')\n  const ogImageFilePathBaseName = `og-${fileName}.png`\n  const ogImageFilePathFullName = `${dirname(file)}/${ogImageFilePathBaseName}`\n\n  const html = await fs.readFile(file, 'utf-8')\n  const parsedHtml = unified()\n    .use(RehypeParse, { fragment: true })\n    .parse(html)\n\n  let hasOgImage: string | false = false\n  visit(parsedHtml, 'element', (node) => {\n    if (node.tagName === 'meta' && (node.properties?.name === 'og:image' || node.properties?.name === 'twitter:image'))\n      hasOgImage = node.properties.name\n    else\n      return true\n  })\n\n  if (hasOgImage && !overrideExistingMetaTags) {\n    return {\n      filePath: file,\n      status: 'skipped',\n      reason: `already has ${hasOgImage} meta tag`,\n    }\n  }\n\n  const templatedOgImageSvg = templateSVG(\n    siteTitle,\n    siteDescription,\n    page.title,\n    page.category ?? '',\n    ogImageTemplateSvg,\n    maxCharactersPerLine,\n  )\n\n  let width: number\n  let height: number\n  try {\n    const res = await renderSVGAndSavePNG(\n      templatedOgImageSvg,\n      ogImageFilePathFullName,\n      ogImageTemplateSvgPath,\n      relative(siteConfig.srcDir, file),\n      { fontPath: await tryToLocateFontFile(siteConfig), imageUrlResolver, additionalFontBuffers, resultImageWidth },\n    )\n    width = res.width\n    height = res.height\n  }\n  catch (err) {\n    return {\n      filePath: file,\n      status: 'errored',\n      reason: String(err),\n    }\n  }\n\n  const result = await unified()\n    .use(RehypeParse)\n    .use(RehypeMeta, {\n      og: true,\n      twitter: true,\n      image: {\n        url: `${domain}/${\n          relative(siteConfig.outDir, ogImageFilePathFullName)\n            .split(sep)\n            .map(item => encodeURIComponent(item))\n            .join('/')\n        }`,\n        width,\n        height,\n      },\n    })\n    .use(RehypeStringify)\n    .process(html)\n\n  try {\n    await fs.writeFile(file, String(result), 'utf-8')\n  }\n  catch (err) {\n    console.error(\n      `${logModulePrefix} `,\n      `${red('[ERROR] ✗')} failed to write transformed HTML on path [${relative(siteConfig.srcDir, file)}] due to ${err}`,\n      `\\n${red((err as Error).message)}\\n${gray(String((err as Error).stack))}`,\n    )\n    return {\n      filePath: file,\n      status: 'errored',\n      reason: String(err),\n    }\n  }\n\n  return {\n    filePath: file,\n    status: 'success',\n  }\n}\n\nasync function renderSVGAndSavePNG(\n  svgContent: string,\n  saveAs: string,\n  forSvgSource: string,\n  forFile: string,\n  options: {\n    fontPath?: string\n    imageUrlResolver?: BuildEndGenerateOpenGraphImagesOptions['svgImageUrlResolver']\n    additionalFontBuffers?: Buffer[]\n    resultImageWidth?: number\n  },\n) {\n  try {\n    const { png: pngBuffer, width, height } = await renderSVG(svgContent, await initFontBuffer(options), options.imageUrlResolver, options.additionalFontBuffers, options.resultImageWidth)\n\n    try {\n      await fs.writeFile(saveAs, pngBuffer, 'binary')\n    }\n    catch (err) {\n      console.error(\n        `${logModulePrefix} `,\n        `${red('[ERROR] ✗')} open graph image rendered successfully, but failed to write generated open graph image on path [${saveAs}] due to ${err}`,\n        `\\n${red((err as Error).message)}\\n${gray(String((err as Error).stack))}`,\n      )\n\n      throw err\n    }\n\n    return {\n      width,\n      height,\n    }\n  }\n  catch (err) {\n    console.error(\n      `${logModulePrefix} `,\n      `${red('[ERROR] ✗')} failed to generate open graph image as ${green(`[${saveAs}]`)} with ${green(`[${forSvgSource}]`)} due to ${red(String(err))}`,\n      `skipped open graph image generation for ${green(`[${forFile}]`)}`,\n      `\\n\\nSVG Content:\\n\\n${svgContent}`,\n      `\\n\\nDetailed stack information bellow:\\n\\n${red((err as Error).message)}\\n${gray(String((err as Error).stack))}`,\n    )\n\n    throw err\n  }\n}\n\n/**\n * Build end generate open graph images.\n * @param {BuildEndGenerateOpenGraphImagesOptions} options - Options used for generating open graph images.\n * @returns Build end hook for VitePress\n */\nexport function buildEndGenerateOpenGraphImages(options: BuildEndGenerateOpenGraphImagesOptions) {\n  options = defu(options, {\n    resultImageWidth: 1200,\n    maxCharactersPerLine: 17,\n    overrideExistingMetaTags: true,\n  } satisfies Omit<BuildEndGenerateOpenGraphImagesOptions, 'baseUrl'>)\n\n  return async (siteConfig: SiteConfig) => {\n    await initSVGRenderer()\n\n    const ogImageTemplateSvgPath = await tryToLocateTemplateSVGFile(siteConfig, options.templateSvgPath)\n\n    await task('rendering open graph images', async (): Promise<string | undefined> => {\n      const themeConfig = siteConfig.site.themeConfig as unknown as DefaultTheme.Config\n      const sidebar = getSidebar(siteConfig.site, themeConfig)\n\n      // Flatten sidebar\n      let pages: PageItem[] = []\n\n      for (const locale of sidebar.locales) {\n        const flattenedSidebar = flattenSidebar(sidebar.sidebar[locale])\n        const items: PageItem[] = []\n\n        for (const item of flattenedSidebar) {\n          const relativeLink = item.link ?? ''\n          const sourceFilePath = relativeLink.endsWith('/')\n            ? `${relativeLink}index.md`\n            : relativeLink.endsWith('.md')\n              ? relativeLink\n              : `${relativeLink}.md`\n\n          const sourceFileContent = fs.readFileSync(`${join(siteConfig.srcDir, sourceFilePath)}`, 'utf-8')\n          const { data } = GrayMatter(sourceFileContent)\n          const res: PageItem = {\n            ...item,\n            title: item.text ?? (item as any).title ?? 'Untitled',\n            category: '',\n            locale,\n            frontmatter: data,\n            sourceFilePath,\n            normalizedSourceFilePath: sourceFilePath.split(sep).join(posixSep),\n          }\n\n          res.category = await applyCategoryTextWithFallback(res, options.category)\n\n          items.push(res)\n        }\n\n        pages = pages.concat(items)\n      }\n\n      const files = await glob(`${siteConfig.outDir}/**/*.html`, { onlyFiles: true })\n\n      if (!ogImageTemplateSvgPath) {\n        return ''\n          + `${green(`${0} generated`)}, `\n          + `${yellow(`${files.length} (all) skipped`)}, `\n          + `${red(`${0} errored`)}.`\n          + `\\n\\n`\n          + ` - ${red('Failed to locate')} og-template.svg ${red('under public or plugin directory')}, did you forget to put it? will skip open graph image generation.`\n      }\n\n      const ogImageTemplateSvg = fs.readFileSync(ogImageTemplateSvgPath, 'utf-8')\n      const generatedForFiles = await Promise.all(files.map(async (file): Promise<TaskResult> => {\n        const relativePath = relative(siteConfig.outDir, file)\n\n        const link = `/${\n          relativePath\n            .slice(0, relativePath.lastIndexOf('.'))\n            .replaceAll(sep, '/')\n        }`.split('/index')[0]\n\n        const page = pages.find((item) => {\n          let itemLink = item.link\n          if (itemLink?.endsWith('.md'))\n            itemLink = itemLink.slice(0, -'.md'.length)\n\n          if (itemLink === link)\n            return true\n\n          if (itemLink === `${link}/`)\n            return true\n\n          return false\n        })\n        if (!page) {\n          return {\n            filePath: file,\n            status: 'skipped',\n            reason: 'correspond Markdown page not found in sidebar',\n          }\n        }\n\n        const siteTitle = getTitleWithLocales(siteConfig.site, page.locale)\n        const siteDescription = getDescriptionWithLocales(siteConfig.site, page.locale)\n\n        return await renderSVGAndRewriteHTML(\n          siteConfig,\n          siteTitle,\n          siteDescription,\n          page,\n          file,\n          ogImageTemplateSvg,\n          ogImageTemplateSvgPath,\n          options.baseUrl,\n          options.svgImageUrlResolver,\n          options.svgFontBuffers,\n          options.resultImageWidth,\n          options.maxCharactersPerLine,\n          options.overrideExistingMetaTags,\n        )\n      }))\n\n      return renderTaskResultsSummary(generatedForFiles, siteConfig)\n    })\n  }\n}\n"],"names":["fontBuffer","res","task","posixSep"],"mappings":"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"}