ezal-theme-example 0.0.3 → 0.0.4

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.
@@ -21,52 +21,54 @@ export function initTabs() {
21
21
  }
22
22
 
23
23
  export function initToc() {
24
+ const docE = doc.documentElement;
24
25
  const toc = [...$$('aside a')];
25
26
  if (toc.length === 0) return;
26
27
  const headings = [...$$('h2,h3,h4,h5,h6', $('article')!)];
27
- const docE = doc.documentElement;
28
-
29
- function getIndex(): number {
30
- if (docE.scrollTop < 100) return 0;
31
- if (docE.scrollTop + innerHeight >= docE.scrollHeight - 5) {
32
- return toc.length - 1;
33
- }
34
-
35
- const triggerLine = innerHeight / 3;
36
- for (const [i, heading] of headings.entries()) {
37
- const { top } = heading.getBoundingClientRect();
38
- if (top > triggerLine) return Math.max(0, i - 1);
39
- }
40
- return toc.length - 1;
41
- }
42
-
43
- handle(doc, 'scroll', () => {
44
- const index = getIndex();
45
- const target = toc[index];
46
-
47
- if (target.classList.contains('active')) return;
48
- for (const element of $$('aside .active')) {
49
- element.classList.remove('active');
50
- }
51
- target.classList.add('active');
52
- target.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
53
- });
54
28
 
55
29
  const nav = $<HTMLElement>('nav')!;
56
- const mobileToc = $('.toc')!.cloneNode(true) as HTMLElement;
57
- nav.append(mobileToc);
30
+ const mobileTocContainer = $('.toc')!.cloneNode(true) as HTMLElement;
31
+ const mobileToc = [...$$('a', mobileTocContainer)];
32
+ nav.append(mobileTocContainer);
58
33
  const height = () => {
59
34
  nav.style.maxHeight = `${nav.scrollHeight}px`;
60
35
  };
36
+ const move = (event: MouseEvent, items: Element[]) => {
37
+ const { target } = event;
38
+ if ((target as Element).tagName !== 'A') return;
39
+ event.preventDefault();
40
+ nav.classList.remove('nav-show');
41
+ const heading = headings[items.indexOf(target as Element)];
42
+ if (!heading) return;
43
+ const { top } = heading.getBoundingClientRect();
44
+ docE.scroll(0, top - 50 + docE.scrollTop);
45
+ };
61
46
  handle(window, 'resize', height);
62
- for (const a of $$('a', mobileToc)) {
63
- handle(a, 'click', async () => {
64
- nav.classList.remove('nav-show');
65
- await sleep(10);
66
- nav.classList.add('nav-hide');
67
- });
68
- }
47
+ handle(mobileTocContainer, 'click', (event: MouseEvent) =>
48
+ move(event, mobileToc),
49
+ );
50
+ handle($('aside')!, 'click', (event: MouseEvent) => move(event, toc));
69
51
  height();
52
+
53
+ const observer = new IntersectionObserver((entries) => {
54
+ for (const {
55
+ target,
56
+ isIntersecting,
57
+ boundingClientRect: { top },
58
+ } of entries) {
59
+ const index = headings.indexOf(target);
60
+ if (isIntersecting) {
61
+ toc[index].classList.add('active');
62
+ toc[index - 1]?.classList.add('active');
63
+ continue;
64
+ }
65
+ if (top > 0) toc[index].classList.remove('active');
66
+ if (top < 0) toc[index - 1]?.classList.remove('active');
67
+ }
68
+ });
69
+ for (const heading of headings) {
70
+ observer.observe(heading);
71
+ }
70
72
  }
71
73
 
72
74
  export function initCodeblock(scope: ParentNode = doc) {
@@ -3,6 +3,9 @@
3
3
  *
4
4
  box-sizing border-box
5
5
 
6
+ :root
7
+ scroll-behavior smooth
8
+
6
9
  body
7
10
  margin 0
8
11
  background var(--bg)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["config: ThemeConfig","config","author: Author","feed: Feed","assets: { rss: FeedAsset; atom: FeedAsset; feed: FeedAsset }","VirtualAssets","#type","feed","theme","Feed","Article","Category","assets","item","image","URL","item: Item","dir: string | undefined","path","dir","sharp","VirtualAssets","URL","asset","#filepath","#ext","#optimizedPath","fs","db: DB.Database","statements: Record<'get' | 'update' | 'delete', DB.Statement>","path","DB","asset","color: string | null","Vibrant","metadata: ImageMetadata","path","logger","Logger","asset","ext","fs","assets","logger","Logger","urls: string[]","Article","Page","IndexNow","SEARCH_ENGINES","context: Context","layoutConfig: LayoutConfig","path","path","cleaner","CleanCSS","VirtualAssets","Cache","#baseCache","asset: CodeblockStyle","asset","ModelOperations","shiki: HighlighterGeneric<BundledLanguage, BundledTheme>","shikiClassName: string[]","transformers: ShikiTransformer[]","shiki","theme","utils","result: string[]","name","$","origin","plugins","render","indented: CommonPlugin<'block', CodeblockParsed>","fenced: CommonPlugin<'block', CodeblockParsed>","PATTERN_START","utils","fold: CommonPlugin<'block', FoldParsed>","source","$","utils","render: RendererPlugin<'inline', LinkParsed>","$","ast: ASTPlugin<'inline', LinkNode>","LinkNode","ParsedNode","source: CommonPlugin<'block', SourceParsed>","contents: string[]","id: [string, string][]","indentState: boolean | null","source","utils","$","URL","html: string[]","mime","blockRender: RendererPlugin<'block', ImageParsed>","block: ASTPlugin<'inline', ParsedNode>","Paragraph","ImageNode","image","ParsedNode","inline: ASTPlugin<'inline', ImageNode>","node","utils","kbd: CommonPlugin<'inline', KbdParsed>","source","$","utils","link: ASTPlugin<'inline', LinkNode>","LinkNode","node","$","URL","utils","links: CommonPlugin<'block', LinksParsed>","source","matched","$","links","html: string[]","URL","PATTERN_START","utils","NOTE_TITLE: Record<string, string>","note: CommonPlugin<'block', NoteParsed>","source","$","utils","plugins","table: typeof origin","$","source","utils","tabs: CommonPlugin<'block', TabsParsed, number>","source","children: TabsParsed['children']","id: TabsParsed['id']","content","inline: CommonPlugin<'inline', TexParsed>","source","tex","logger","block: CommonPlugin<'block', TexParsed>","logger","Logger","EzalMarkdown","setext: CommonPlugin<'block'>","plugins","fs","config","VirtualPage","indexPage: ArchivePage","getArticles","Article","VirtualPage","scanned","createPage","data: CategoryPageData","VirtualPage","scanned","Category","pages: HomePage[]","index","Article","createPage","data: HomePageData","VirtualPage","scanned","data: TagPageData","VirtualPage","Tag","Logger","index: pagefind.PagefindIndex","VirtualAssets","path","asset","Article","errors: string[]","Page","img","URL","VirtualAssets","SitemapStream","Article","Page","asset: Sitemap","scriptTransformRule: TransformRule","path","src","STYLE_CONFIGS: Record<string, () => any>","CleanCSS","styleTransformRule: TransformRule","fs","renderer","path","config","path"],"sources":["../src/config.ts","../src/utils.ts","../src/feed.ts","../src/image/utils.ts","../src/image/asset.ts","../src/image/db.ts","../src/image/metadata.ts","../src/image/index.ts","../src/index-now.ts","../src/layout.ts","../src/markdown/codeblock/data.ts","../src/markdown/codeblock/style.ts","../src/markdown/codeblock/index.ts","../src/markdown/fold.ts","../src/markdown/footnote.ts","../src/markdown/image.ts","../src/markdown/kbd.ts","../src/markdown/link.ts","../src/markdown/links.ts","../src/markdown/note.ts","../src/markdown/table.ts","../src/markdown/tabs.ts","../src/markdown/tex.ts","../src/markdown/index.ts","../src/page/404.ts","../src/page/archive.ts","../src/page/category.ts","../src/page/home.ts","../src/page/tag.ts","../src/pagefind.ts","../src/sitemap.ts","../src/transform/script.ts","../src/transform/stylus.ts","../src/index.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport type { ArrayOr } from 'ezal';\nimport type { TokenizeOptions } from 'ezal-markdown';\nimport type { RawTheme } from 'shiki';\n\nexport interface NavItem {\n\tname: string;\n\tlink: string;\n}\n\nexport interface Contact {\n\turl: string;\n\tname: string;\n\ticon: string;\n\tcolor: string;\n}\n\nexport interface Link {\n\tname: string;\n\tdescription: string;\n\tlink: string;\n\tavatar: string;\n\tcolor: string;\n}\n\nexport interface LinkGroup {\n\ttitle: string;\n\tdescription: string;\n\titems: Link[];\n}\n\nexport type LinkPageStyles =\n\t| 'image'\n\t| 'table'\n\t| 'heading'\n\t| 'list'\n\t| 'footnote'\n\t| 'tabs'\n\t| 'note'\n\t| 'fold'\n\t| 'kbd';\n\nexport interface ThemeConfig {\n\t/** 导航栏 */\n\tnav?: NavItem[];\n\t/** 站点图标 */\n\tfavicon?: ArrayOr<string>;\n\t/** 主题色 */\n\tcolor?: {\n\t\t/** @default '#006000' */\n\t\tlight?: string;\n\t\t/** @default '#00BB00' */\n\t\tdark?: string;\n\t};\n\t/** 建站时间 */\n\tsince?: Temporal.ZonedDateTime;\n\t/** 联系方式 */\n\tcontact?: Contact[];\n\t/** 友情链接 */\n\tlinks?: LinkGroup[];\n\t/**\n\t * 友情链接页面启用的样式\n\t * @default 全部启用\n\t */\n\tlinkPageStyles?: LinkPageStyles[];\n\t/** Markdown 配置 */\n\tmarkdown?: {\n\t\t/**\n\t\t * 换行规则\n\t\t * @description\n\t\t * - `common-mark`:CommonMark 规范,行尾 2+ 空格渲染为换行\n\t\t * - `soft`:软换行,换行符 `\\n` 渲染为换行\n\t\t * @default `common-mark`\n\t\t */\n\t\tlineBreak?: TokenizeOptions['lineBreak'];\n\t\t/**\n\t\t * 代码块主题\n\t\t * @default {light:'light-plus',dark:'dark-plus'}\n\t\t */\n\t\tcodeBlockTheme?: { light: RawTheme; dark: RawTheme };\n\t};\n\t/** 主页设置 */\n\thome?: {\n\t\t/**\n\t\t * 每页文章数量\n\t\t * @default 10\n\t\t */\n\t\tarticlesPrePage?: number;\n\t\tlogo?: {\n\t\t\tviewBox: string;\n\t\t\tg: string;\n\t\t};\n\t\tslogan?: string;\n\t};\n\timageCache?: {\n\t\t/**\n\t\t * 图像元数据缓存路径\n\t\t * @description\n\t\t * 支持绝对路径和相对路径,相对路径将以工作目录为起点。\n\t\t * 默认为工作目录下 `image-metadata.sqlite`。\n\t\t */\n\t\tmetadata?: string;\n\t\t/**\n\t\t * 优化版图像缓存路径\n\t\t * @description\n\t\t * 支持绝对路径和相对路径,相对路径将以工作目录为起点。\n\t\t * 默认为工作目录下 `cache`。\n\t\t */\n\t\toptimized?: string;\n\t};\n\tcdn?: {\n\t\t/** @default 'https://unpkg.com/katex@0.16.21/dist/katex.min.css' */\n\t\tkatex?: string;\n\t\t/** @default 'https://unpkg.com/@waline/client@v3/dist/waline.css' */\n\t\twalineCSS?: string;\n\t\t/** @default 'https://unpkg.com/@waline/client@v3/dist/waline.js' */\n\t\twalineJS?: string;\n\t};\n\t/** HTML 头部插入内容 */\n\tinject?: string;\n\t/** IndexNow 配置 */\n\tindexNow?: {\n\t\t/** Bing IndexNow 密钥 */\n\t\tbing?: string;\n\t\t/** Yandex IndexNow 密钥 */\n\t\tyandex?: string;\n\t};\n\t/** Waline 评论配置 */\n\twaline?: {\n\t\t/** 后端地址 */\n\t\tserverURL: string;\n\t\tvisitor?: boolean;\n\t\tcommentCount?: boolean;\n\t\tpageview?: boolean;\n\t\temoji?: string[];\n\t\treaction?: string[];\n\t};\n}\n\nlet config: ThemeConfig;\n\nexport function setThemeConfig(cfg?: ThemeConfig) {\n\tconfig = cfg ?? {};\n}\n\nexport function getThemeConfig() {\n\treturn config;\n}\n","import type { Article } from 'ezal';\n\nexport function compareByDate(a: Article, b: Article): number {\n\treturn b.date.epochMilliseconds - a.date.epochMilliseconds;\n}\n","import { Article, Category, getConfig, URL, VirtualAssets } from 'ezal';\nimport { type Author, Feed, type Item } from 'feed';\nimport { getThemeConfig } from './config';\nimport { compareByDate } from './utils';\n\nconst FEED_TYPE_URL = {\n\trss: '/rss.xml',\n\tatom: '/atom.xml',\n\tfeed: '/feed.json',\n} as const;\n\nlet author: Author;\nlet feed: Feed;\nlet assets: { rss: FeedAsset; atom: FeedAsset; feed: FeedAsset };\n\nclass FeedAsset extends VirtualAssets {\n\t#type: 'rss' | 'atom' | 'feed';\n\tconstructor(type: 'rss' | 'atom' | 'feed') {\n\t\tsuper(FEED_TYPE_URL[type]);\n\t\tthis.#type = type;\n\t}\n\tbuild() {\n\t\tswitch (this.#type) {\n\t\t\tcase 'rss':\n\t\t\t\treturn feed.rss2();\n\t\t\tcase 'atom':\n\t\t\t\treturn feed.atom1();\n\t\t\tcase 'feed':\n\t\t\t\treturn feed.json1();\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\nexport function initFeed() {\n\tconst { site } = getConfig();\n\tconst theme = getThemeConfig();\n\tconst since = theme.since?.year;\n\tauthor = { name: site.author, link: site.domain };\n\tfeed = new Feed({\n\t\ttitle: site.title,\n\t\tdescription: site.description,\n\t\tid: site.domain,\n\t\tlanguage: site.language,\n\t\tfavicon: theme.favicon?.[0],\n\t\tcopyright: `© ${since ? `${since}-` : ''}${new Date().getFullYear()} ${site.author}`,\n\t\tauthor,\n\t\tupdated: new Date(),\n\t\tfeedLinks: {\n\t\t\trss: `${site.domain}/rss.xml`,\n\t\t\tatom: `${site.domain}/atom.xml`,\n\t\t\tjson: `${site.domain}/feed.json`,\n\t\t},\n\t});\n\tassets = {\n\t\trss: new FeedAsset('rss'),\n\t\tatom: new FeedAsset('atom'),\n\t\tfeed: new FeedAsset('feed'),\n\t};\n\tfor (const article of Article.getAll().sort(compareByDate)) {\n\t\tupdateFeedItem(article);\n\t}\n\tfor (const category of Category.getAll()) {\n\t\tupdateFeedCategory(category);\n\t}\n}\n\nfunction refreshAsset() {\n\tif (!assets) return;\n\tassets.rss.invalidated();\n\tassets.atom.invalidated();\n\tassets.feed.invalidated();\n}\n\nexport function updateFeedItem(article: Article) {\n\tif (!feed) return;\n\tconst i = feed.items.findIndex((item) => item.id === article.id);\n\t// Delete\n\tif (article.destroyed) {\n\t\tif (i === -1) return;\n\t\tfeed.items.splice(i, 1);\n\t\treturn refreshAsset();\n\t}\n\t// Update\n\tconst { site } = getConfig();\n\tlet image = article.data?.cover\n\t\t? URL.resolve(article.url, article.data.cover)\n\t\t: undefined;\n\tif (image) image = site.domain + image;\n\tconst item: Item = {\n\t\ttitle: article.title,\n\t\tid: article.id,\n\t\tlink: site.domain + article.url,\n\t\tdescription: article.description,\n\t\tcontent: article.content,\n\t\tauthor: [author],\n\t\tdate: new Date(article.date.toInstant().epochMilliseconds),\n\t\timage,\n\t\tcategory: article.categories\n\t\t\t.values()\n\t\t\t.toArray()\n\t\t\t.map((category) => ({ name: category.path.join('/') })),\n\t};\n\tif (i === -1) feed.addItem(item);\n\telse feed.items[i] = item;\n\trefreshAsset();\n}\n\nexport function updateFeedCategory(category: Category) {\n\tif (!feed) return;\n\tconst name = category.path.join('/');\n\tconst i = feed.categories.indexOf(name);\n\t// Delete\n\tif (category.destroyed) {\n\t\tif (i === -1) return;\n\t\tfeed.categories.splice(i, 1);\n\t\treturn refreshAsset();\n\t}\n\t// Update\n\tif (i !== -1) return;\n\tfeed.addCategory(name);\n\trefreshAsset();\n}\n","import path from 'node:path';\nimport { getThemeConfig } from '../config';\n\nlet dir: string | undefined;\nfunction getCacheDir(): string {\n\tif (dir) return dir;\n\tdir = getThemeConfig().imageCache?.optimized ?? 'cache';\n\tif (!path.isAbsolute(dir)) dir = path.resolve(dir);\n\treturn dir;\n}\n\nexport function getOptimizedPath(filepath: string, ext: string): string {\n\tconst dir = getCacheDir();\n\tconst cachePath = path.relative(process.cwd(), filepath);\n\treturn `${path.join(dir, cachePath)}.opt${ext}`;\n}\n","import { createReadStream } from 'node:fs';\nimport { type Asset, fs, URL, VirtualAssets } from 'ezal';\nimport Sharp from 'sharp';\nimport { getOptimizedPath } from './utils';\n\nconst OPTIMIZE = {\n\t'.avif': (sharp) => sharp.avif().toBuffer(),\n\t'.webp': (sharp) => sharp.webp().toBuffer(),\n\t'.jxl': (sharp) => sharp.jxl().toBuffer(),\n\t'.jpg': (sharp) =>\n\t\tsharp\n\t\t\t.jpeg({\n\t\t\t\ttrellisQuantisation: true,\n\t\t\t\tovershootDeringing: true,\n\t\t\t\tprogressive: true,\n\t\t\t\toptimiseScans: true,\n\t\t\t})\n\t\t\t.toBuffer(),\n\t'.png': (sharp) =>\n\t\tsharp.png({ progressive: true, adaptiveFiltering: true }).toBuffer(),\n\t'.gif': (sharp) => sharp.gif().toBuffer(),\n} as const satisfies Record<string, (sharp: Sharp.Sharp) => Promise<Buffer>>;\n\nexport type OptimizedImageExt = keyof typeof OPTIMIZE;\n\nexport class OptimizedImage extends VirtualAssets {\n\t#optimizedPath: string;\n\t#filepath: string;\n\t#ext: OptimizedImageExt;\n\t/**\n\t * @param asset 源资源\n\t * @param target 目标优化格式\n\t */\n\tconstructor(asset: Asset, ext: OptimizedImageExt) {\n\t\tsuper(URL.extname(asset.url, `.opt${ext}`));\n\t\tthis.#filepath = asset.filepath;\n\t\tthis.#ext = ext;\n\t\tthis.#optimizedPath = getOptimizedPath(this.#filepath, ext);\n\t}\n\tasync build() {\n\t\tif (await fs.isFile(this.#optimizedPath)) {\n\t\t\treturn createReadStream(this.#optimizedPath);\n\t\t}\n\t\tconst sharp = Sharp(this.#filepath);\n\t\tconst buffer = await OPTIMIZE[this.#ext](sharp);\n\t\tfs.writeFile(this.#optimizedPath, buffer);\n\t\treturn buffer;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n","import path from 'node:path';\nimport DB from 'better-sqlite3';\nimport { getThemeConfig } from '../config';\n\nexport interface ImageMetadata {\n\tpath: string;\n\thash: string;\n\twidth: number;\n\theight: number;\n\tcolor: string | null;\n}\n\nlet db: DB.Database;\nlet statements: Record<'get' | 'update' | 'delete', DB.Statement>;\n\nfunction getMetadata(url: string): ImageMetadata | null {\n\treturn statements.get.get(url) as ImageMetadata | null;\n}\n\nfunction updateMetadata(data: ImageMetadata): boolean {\n\treturn (\n\t\tstatements.update.run(\n\t\t\tdata.path,\n\t\t\tdata.hash,\n\t\t\tdata.width,\n\t\t\tdata.height,\n\t\t\tdata.color,\n\t\t).changes !== 0\n\t);\n}\n\nfunction deleteMetadata(url: string): boolean {\n\treturn statements.delete.run(url).changes !== 0;\n}\n\nfunction initImageMetadataDB() {\n\tlet filename =\n\t\tgetThemeConfig().imageCache?.metadata ?? 'image-metadata.sqlite';\n\tif (!path.isAbsolute(filename)) filename = path.resolve(filename);\n\tdb = new DB(filename);\n\tdb.exec(`CREATE TABLE IF NOT EXISTS image_metadata (\n\t\tpath TEXT PRIMARY KEY,\n\t\thash TEXT NOT NULL,\n\t\twidth INTEGER NOT NULL,\n\t\theight INTEGER NOT NULL,\n\t\tcolor TEXT(8)\n\t)`);\n\tstatements = {\n\t\tget: db.prepare('SELECT * FROM image_metadata WHERE path = ?'),\n\t\tdelete: db.prepare('DELETE FROM image_metadata WHERE path = ?'),\n\t\tupdate: db.prepare(`INSERT OR REPLACE INTO image_metadata\n\t\t\t(path, hash, width, height, color)\n\t\t\tVALUES (?, ?, ?, ?, ?)\n\t\t`),\n\t};\n}\n\nexport const imageDB = {\n\tinit: initImageMetadataDB,\n\tget: getMetadata,\n\tupdate: updateMetadata,\n\tdelete: deleteMetadata,\n};\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport type { Asset } from 'ezal';\nimport { Vibrant } from 'node-vibrant/node';\nimport Sharp from 'sharp';\nimport { type ImageMetadata, imageDB } from './db';\n\nexport async function updateImageMetadata(asset: Asset): Promise<boolean> {\n\tconst buffer = await readFile(asset.filepath);\n\t// Hash\n\tconst hash = createHash('sha256').update(buffer).digest('hex');\n\t// Check\n\tif (imageDB.get(asset.url)?.hash === hash) return false;\n\t// Size\n\tconst sharp = Sharp(buffer);\n\tconst { width, height, format } = await sharp.metadata();\n\t// Color\n\tlet color: string | null = null;\n\tif (format !== 'svg') {\n\t\ttry {\n\t\t\tconst palette = await Vibrant.from(buffer).getPalette();\n\t\t\tcolor = palette.Muted?.hex ?? null;\n\t\t} catch {}\n\t}\n\t// Update\n\tconst metadata: ImageMetadata = {\n\t\tpath: asset.url,\n\t\thash,\n\t\twidth,\n\t\theight,\n\t\tcolor,\n\t};\n\timageDB.update(metadata);\n\treturn true;\n}\n","import path from 'node:path/posix';\nimport { type Asset, fs, Logger } from 'ezal';\nimport { OptimizedImage, type OptimizedImageExt } from './asset';\nimport { type ImageMetadata, imageDB } from './db';\nimport { updateImageMetadata } from './metadata';\nimport { getOptimizedPath } from './utils';\n\nexport interface ImageInfo {\n\tmetadata: ImageMetadata | null;\n\trule?: string[];\n}\n\nconst INFO = {\n\tADD: 'Add image file:',\n\tUPDATE: 'Update image file:',\n\tREMOVE: 'Remove image file:',\n\tOPTIMIZE: (path: string) =>\n\t\t`The image \"${path}\" will be generated in this format:`,\n} as const;\nconst ERR = {\n\tMETADATA: (path: string) => `Unable to update metadata for \"${path}\"`,\n} as const;\n\nconst SUPPORT_EXTS = new Set<string>([\n\t'.jpeg',\n\t'.jpg',\n\t'.png',\n\t'.gif',\n\t'.webp',\n\t'.svg',\n\t'.tiff',\n\t'.tif',\n\t'.avif',\n\t'.heif',\n\t'.jxl',\n]);\n\nconst OPTIMIZE_RULES = new Map<string, OptimizedImageExt[]>([\n\t['.jpeg', ['.avif', '.webp', '.jxl', '.jpg']],\n\t['.jpg', ['.avif', '.webp', '.jpg']],\n\t['.png', ['.avif', '.webp', '.png']],\n\t['.webp', ['.avif', '.webp', '.png']],\n\t['.avif', ['.avif', '.webp', '.png']],\n]);\n\nconst logger = new Logger('theme:image');\n\nconst assetsMap = new Map<string, OptimizedImage[]>();\n\nexport function getImageInfo(url: string): ImageInfo | null {\n\tconst ext = path.extname(url).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return null;\n\tconst metadata = imageDB.get(url);\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\treturn { metadata, rule };\n}\n\nasync function cleanOptimized(asset: Asset) {\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\tif (!rule) return;\n\tawait Promise.all(\n\t\trule\n\t\t\t.map((ext) => getOptimizedPath(asset.filepath, ext))\n\t\t\t.map((filepath) => fs.remove(filepath)),\n\t);\n}\n\nexport async function imageAddHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.ADD, asset.filepath);\n\tlet updated = false;\n\t// Metadata\n\ttry {\n\t\tupdated = await updateImageMetadata(asset);\n\t} catch (error) {\n\t\tlogger.error(ERR.METADATA(asset.filepath), error);\n\t}\n\t// Asset\n\tif (updated) await cleanOptimized(asset);\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\tif (!rule) return;\n\tlogger.debug(INFO.OPTIMIZE(asset.filepath), rule);\n\tconst assets = rule\n\t\t.map<OptimizedImage | null>((ext) => {\n\t\t\ttry {\n\t\t\t\treturn new OptimizedImage(asset, ext);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn(error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t})\n\t\t.filter((v) => v) as OptimizedImage[];\n\tassetsMap.set(asset.url, assets);\n}\n\nexport async function imageUpdateHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.UPDATE, asset.filepath);\n\tlet updated = false;\n\t// Metadata\n\ttry {\n\t\tupdated = await updateImageMetadata(asset);\n\t} catch (error) {\n\t\tlogger.error(ERR.METADATA(asset.filepath), error);\n\t}\n\t// Asset\n\tif (updated) await cleanOptimized(asset);\n\tconst assets = assetsMap.get(asset.url);\n\tif (!assets) return;\n\tfor (const asset of assets) {\n\t\tasset.invalidated();\n\t}\n}\n\nexport function imageRemoveHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.REMOVE, asset.filepath);\n\timageDB.delete(asset.filepath);\n\tconst assets = assetsMap.get(asset.url);\n\tif (!assets) return;\n\tassetsMap.delete(asset.url);\n\tfor (const asset of assets) {\n\t\tasset.destroy();\n\t}\n}\n","import { Article, getConfig, Logger, Page } from 'ezal';\nimport IndexNow, { SEARCH_ENGINES } from 'indexnow';\nimport { getThemeConfig } from './config';\n\nconst logger = new Logger('theme:index-now');\n\nexport async function exeIndexNow() {\n\tconst { site } = getConfig();\n\tconst { indexNow } = getThemeConfig();\n\tif (!indexNow) return;\n\n\tlogger.log('Collecting data...');\n\tconst urls: string[] = [];\n\tfor (const article of Article.getAll()) {\n\t\tif (article.data?.robots === false) continue;\n\t\turls.push(site.domain + article.url);\n\t}\n\tfor (const page of Page.getAll()) {\n\t\tif (!page.data?.robots) continue;\n\t\turls.push(site.domain + page.url);\n\t}\n\n\tif (indexNow.bing) {\n\t\tlogger.log('Submitting urls to Bing...');\n\t\tconst bing = new IndexNow(SEARCH_ENGINES.BING, indexNow.bing);\n\t\tawait bing.submitUrls(site.domain, urls);\n\t}\n\n\tif (indexNow.yandex) {\n\t\tlogger.log('Submitting urls to Yandex...');\n\t\tconst bing = new IndexNow(SEARCH_ENGINES.YANDEX, indexNow.yandex);\n\t\tawait bing.submitUrls(site.domain, urls);\n\t}\n\n\tlogger.log('Finished');\n}\n","import path from 'node:path';\nimport {\n\ttype LayoutRenderer as EzalLayoutRenderer,\n\tgetConfig,\n\ttype LayoutCompiled,\n\ttype LayoutConfig,\n\tnormalizeError,\n\ttype PromiseOr,\n} from 'ezal';\nimport { compile, type LayoutRenderer } from 'ezal-layout';\nimport mime from 'mime-types';\nimport type { Context } from '../layouts/context';\nimport { getThemeConfig } from './config';\nimport { getImageInfo } from './image';\nimport { compareByDate } from './utils';\n\nconst EXTERNAL_MODULES = Object.fromEntries(\n\t['mime-types', 'ezal', '@js-temporal/polyfill'].map<[string, any]>((name) => [\n\t\tname,\n\t\trequire(name),\n\t]),\n);\n\nfunction createRenderer(template: LayoutRenderer) {\n\treturn (page: Context['page']): PromiseOr<string | Error> => {\n\t\tconst { site } = getConfig();\n\t\tconst theme = getThemeConfig();\n\t\tconst context: Context = {\n\t\t\tpage,\n\t\t\tsite,\n\t\t\ttheme,\n\t\t\tgetImageInfo,\n\t\t\tmime,\n\t\t\tcompareByDate,\n\t\t};\n\t\ttry {\n\t\t\treturn template(context);\n\t\t} catch (error) {\n\t\t\treturn normalizeError(error);\n\t\t}\n\t};\n}\n\nasync function compiler(src: string): Promise<LayoutCompiled | Error> {\n\ttry {\n\t\tconst { renderer: template, dependencies } = await compile(\n\t\t\tsrc,\n\t\t\tEXTERNAL_MODULES,\n\t\t);\n\t\treturn {\n\t\t\trenderer: createRenderer(template) as EzalLayoutRenderer,\n\t\t\tdependencies,\n\t\t};\n\t} catch (error) {\n\t\treturn normalizeError(error);\n\t}\n}\n\nexport const layoutConfig: LayoutConfig = {\n\troot: path.join(__dirname, '../layouts'),\n\tcompiler,\n};\n","export const LANGUAGE_MAP = new Map([\n\t['markup', 'Markup'],\n\t['html', 'HTML'],\n\t['xml', 'XML'],\n\t['svg', 'SVG'],\n\t['mathml', 'MathML'],\n\t['ssml', 'SSML'],\n\t['atom', 'Atom'],\n\t['rss', 'RSS'],\n\t['css', 'CSS'],\n\t['clike', 'C-like'],\n\t['javascript', 'JavaScript'],\n\t['js', 'JavaScript'],\n\t['abap', 'ABAP'],\n\t['abnf', 'ABNF'],\n\t['actionscript', 'ActionScript'],\n\t['ada', 'Ada'],\n\t['agda', 'Agda'],\n\t['al', 'AL'],\n\t['antlr4', 'ANTLR4'],\n\t['g4', 'ANTLR4'],\n\t['apacheconf', 'Apache Configuration'],\n\t['apex', 'Apex'],\n\t['apl', 'APL'],\n\t['applescript', 'AppleScript'],\n\t['aql', 'AQL'],\n\t['arduino', 'Arduino'],\n\t['ino', 'Arduino'],\n\t['arff', 'ARFF'],\n\t['armasm', 'ARM Assembly'],\n\t['arm-asm', 'ARM Assembly'],\n\t['arturo', 'Arturo'],\n\t['art', 'Arturo'],\n\t['asciidoc', 'AsciiDoc'],\n\t['adoc', 'AsciiDoc'],\n\t['aspnet', 'ASP.NET (C#)'],\n\t['asm6502', '6502 Assembly'],\n\t['asmatmel', 'Atmel AVR Assembly'],\n\t['autohotkey', 'AutoHotkey'],\n\t['autoit', 'AutoIt'],\n\t['avisynth', 'AviSynth'],\n\t['avs', 'AviSynth'],\n\t['avro-idl', 'Avro IDL'],\n\t['avdl', 'Avro IDL'],\n\t['awk', 'AWK'],\n\t['gawk', 'AWK'],\n\t['bash', 'Bash'],\n\t['sh', 'Bash'],\n\t['shell', 'Bash'],\n\t['basic', 'BASIC'],\n\t['batch', 'Batch'],\n\t['bbcode', 'BBcode'],\n\t['shortcode', 'BBcode'],\n\t['bbj', 'BBj'],\n\t['bicep', 'Bicep'],\n\t['birb', 'Birb'],\n\t['bison', 'Bison'],\n\t['bnf', 'BNF'],\n\t['rbnf', 'BNF'],\n\t['bqn', 'BQN'],\n\t['brainfuck', 'Brainfuck'],\n\t['brightscript', 'BrightScript'],\n\t['bro', 'Bro'],\n\t['bsl', 'BSL (1C:Enterprise)'],\n\t['oscript', 'BSL (1C:Enterprise)'],\n\t['c', 'C'],\n\t['csharp', 'C#'],\n\t['cs', 'C#'],\n\t['dotnet', 'C#'],\n\t['cpp', 'C++'],\n\t['cfscript', 'CFScript'],\n\t['cfc', 'CFScript'],\n\t['chaiscript', 'ChaiScript'],\n\t['cil', 'CIL'],\n\t['cilkc', 'Cilk/C'],\n\t['cilk-c', 'Cilk/C'],\n\t['cilkcpp', 'Cilk/C++'],\n\t['cilk-cpp', 'Cilk/C++'],\n\t['cilk', 'Cilk/C++'],\n\t['clojure', 'Clojure'],\n\t['cmake', 'CMake'],\n\t['cobol', 'COBOL'],\n\t['coffeescript', 'CoffeeScript'],\n\t['coffee', 'CoffeeScript'],\n\t['concurnas', 'Concurnas'],\n\t['conc', 'Concurnas'],\n\t['csp', 'Content-Security-Policy'],\n\t['cooklang', 'Cooklang'],\n\t['coq', 'Coq'],\n\t['crystal', 'Crystal'],\n\t['css-extras', 'CSS Extras'],\n\t['csv', 'CSV'],\n\t['cue', 'CUE'],\n\t['cypher', 'Cypher'],\n\t['d', 'D'],\n\t['dart', 'Dart'],\n\t['dataweave', 'DataWeave'],\n\t['dax', 'DAX'],\n\t['dhall', 'Dhall'],\n\t['diff', 'Diff'],\n\t['django', 'Django/Jinja2'],\n\t['jinja2', 'Django/Jinja2'],\n\t['dns-zone-file', 'DNS zone file'],\n\t['dns-zone', 'DNS zone file'],\n\t['docker', 'Docker'],\n\t['dockerfile', 'Docker'],\n\t['dot', 'DOT (Graphviz)'],\n\t['gv', 'DOT (Graphviz)'],\n\t['ebnf', 'EBNF'],\n\t['editorconfig', 'EditorConfig'],\n\t['eiffel', 'Eiffel'],\n\t['ejs', 'EJS'],\n\t['eta', 'EJS'],\n\t['elixir', 'Elixir'],\n\t['elm', 'Elm'],\n\t['etlua', 'Embedded Lua templating'],\n\t['erb', 'ERB'],\n\t['erlang', 'Erlang'],\n\t['excel-formula', 'Excel Formula'],\n\t['xlsx', 'Excel Formula'],\n\t['xls', 'Excel Formula'],\n\t['fsharp', 'F#'],\n\t['factor', 'Factor'],\n\t['false', 'False'],\n\t['firestore-security-rules', 'Firestore security rules'],\n\t['flow', 'Flow'],\n\t['fortran', 'Fortran'],\n\t['ftl', 'FreeMarker Template Language'],\n\t['gml', 'GameMaker Language'],\n\t['gamemakerlanguage', 'GameMaker Language'],\n\t['gap', 'GAP (CAS)'],\n\t['gcode', 'G-code'],\n\t['gdscript', 'GDScript'],\n\t['gedcom', 'GEDCOM'],\n\t['gettext', 'gettext'],\n\t['po', 'gettext'],\n\t['gherkin', 'Gherkin'],\n\t['git', 'Git'],\n\t['glsl', 'GLSL'],\n\t['gn', 'GN'],\n\t['gni', 'GN'],\n\t['linker-script', 'GNU Linker Script'],\n\t['ld', 'GNU Linker Script'],\n\t['go', 'Go'],\n\t['go-module', 'Go module'],\n\t['go-mod', 'Go module'],\n\t['gradle', 'Gradle'],\n\t['graphql', 'GraphQL'],\n\t['groovy', 'Groovy'],\n\t['haml', 'Haml'],\n\t['handlebars', 'Handlebars'],\n\t['hbs', 'Handlebars'],\n\t['mustache', 'Handlebars'],\n\t['haskell', 'Haskell'],\n\t['hs', 'Haskell'],\n\t['haxe', 'Haxe'],\n\t['hcl', 'HCL'],\n\t['hlsl', 'HLSL'],\n\t['hoon', 'Hoon'],\n\t['http', 'HTTP'],\n\t['hpkp', 'HTTP Public-Key-Pins'],\n\t['hsts', 'HTTP Strict-Transport-Security'],\n\t['ichigojam', 'IchigoJam'],\n\t['icon', 'Icon'],\n\t['icu-message-format', 'ICU Message Format'],\n\t['idris', 'Idris'],\n\t['idr', 'Idris'],\n\t['ignore', '.ignore'],\n\t['gitignore', '.ignore'],\n\t['hgignore', '.ignore'],\n\t['npmignore', '.ignore'],\n\t['inform7', 'Inform 7'],\n\t['ini', 'Ini'],\n\t['io', 'Io'],\n\t['j', 'J'],\n\t['java', 'Java'],\n\t['javadoc', 'JavaDoc'],\n\t['javadoclike', 'JavaDoc-like'],\n\t['javastacktrace', 'Java stack trace'],\n\t['jexl', 'Jexl'],\n\t['jolie', 'Jolie'],\n\t['jq', 'JQ'],\n\t['jsdoc', 'JSDoc'],\n\t['js-extras', 'JS Extras'],\n\t['json', 'JSON'],\n\t['webmanifest', 'JSON'],\n\t['json5', 'JSON5'],\n\t['jsonp', 'JSONP'],\n\t['jsstacktrace', 'JS stack trace'],\n\t['js-templates', 'JS Templates'],\n\t['julia', 'Julia'],\n\t['keepalived', 'Keepalived Configure'],\n\t['keyman', 'Keyman'],\n\t['kotlin', 'Kotlin'],\n\t['kt', 'Kotlin'],\n\t['kts', 'Kotlin'],\n\t['kumir', 'KuMir (КуМир)'],\n\t['kum', 'KuMir (КуМир)'],\n\t['kusto', 'Kusto'],\n\t['latex', 'LaTeX'],\n\t['tex', 'LaTeX'],\n\t['context', 'LaTeX'],\n\t['latte', 'Latte'],\n\t['less', 'Less'],\n\t['lilypond', 'LilyPond'],\n\t['ly', 'LilyPond'],\n\t['liquid', 'Liquid'],\n\t['lisp', 'Lisp'],\n\t['emacs', 'Lisp'],\n\t['elisp', 'Lisp'],\n\t['emacs-lisp', 'Lisp'],\n\t['livescript', 'LiveScript'],\n\t['llvm', 'LLVM IR'],\n\t['log', 'Log file'],\n\t['lolcode', 'LOLCODE'],\n\t['lua', 'Lua'],\n\t['magma', 'Magma (CAS)'],\n\t['makefile', 'Makefile'],\n\t['markdown', 'Markdown'],\n\t['md', 'Markdown'],\n\t['markup-templating', 'Markup templating'],\n\t['mata', 'Mata'],\n\t['matlab', 'MATLAB'],\n\t['maxscript', 'MAXScript'],\n\t['mel', 'MEL'],\n\t['mermaid', 'Mermaid'],\n\t['metafont', 'METAFONT'],\n\t['mizar', 'Mizar'],\n\t['mongodb', 'MongoDB'],\n\t['monkey', 'Monkey'],\n\t['moonscript', 'MoonScript'],\n\t['moon', 'MoonScript'],\n\t['n1ql', 'N1QL'],\n\t['n4js', 'N4JS'],\n\t['n4jsd', 'N4JS'],\n\t['nand2tetris-hdl', 'Nand To Tetris HDL'],\n\t['naniscript', 'Naninovel Script'],\n\t['nani', 'Naninovel Script'],\n\t['nasm', 'NASM'],\n\t['neon', 'NEON'],\n\t['nevod', 'Nevod'],\n\t['nginx', 'nginx'],\n\t['nim', 'Nim'],\n\t['nix', 'Nix'],\n\t['nsis', 'NSIS'],\n\t['objectivec', 'Objective-C'],\n\t['objc', 'Objective-C'],\n\t['ocaml', 'OCaml'],\n\t['odin', 'Odin'],\n\t['opencl', 'OpenCL'],\n\t['openqasm', 'OpenQasm'],\n\t['qasm', 'OpenQasm'],\n\t['oz', 'Oz'],\n\t['parigp', 'PARI/GP'],\n\t['parser', 'Parser'],\n\t['pascal', 'Pascal'],\n\t['objectpascal', 'Pascal'],\n\t['pascaligo', 'Pascaligo'],\n\t['psl', 'PATROL Scripting Language'],\n\t['pcaxis', 'PC-Axis'],\n\t['px', 'PC-Axis'],\n\t['peoplecode', 'PeopleCode'],\n\t['pcode', 'PeopleCode'],\n\t['perl', 'Perl'],\n\t['php', 'PHP'],\n\t['phpdoc', 'PHPDoc'],\n\t['php-extras', 'PHP Extras'],\n\t['plant-uml', 'PlantUML'],\n\t['plantuml', 'PlantUML'],\n\t['plsql', 'PL/SQL'],\n\t['powerquery', 'PowerQuery'],\n\t['pq', 'PowerQuery'],\n\t['mscript', 'PowerQuery'],\n\t['powershell', 'PowerShell'],\n\t['processing', 'Processing'],\n\t['prolog', 'Prolog'],\n\t['promql', 'PromQL'],\n\t['properties', '.properties'],\n\t['protobuf', 'Protocol Buffers'],\n\t['pug', 'Pug'],\n\t['puppet', 'Puppet'],\n\t['pure', 'Pure'],\n\t['purebasic', 'PureBasic'],\n\t['pbfasm', 'PureBasic'],\n\t['purescript', 'PureScript'],\n\t['purs', 'PureScript'],\n\t['python', 'Python'],\n\t['py', 'Python'],\n\t['qsharp', 'Q#'],\n\t['qs', 'Q#'],\n\t['q', 'Q (kdb+ database)'],\n\t['qml', 'QML'],\n\t['qore', 'Qore'],\n\t['r', 'R'],\n\t['racket', 'Racket'],\n\t['rkt', 'Racket'],\n\t['cshtml', 'Razor C#'],\n\t['razor', 'Razor C#'],\n\t['jsx', 'React JSX'],\n\t['tsx', 'React TSX'],\n\t['reason', 'Reason'],\n\t['regex', 'Regex'],\n\t['rego', 'Rego'],\n\t['renpy', \"Ren'py\"],\n\t['rpy', \"Ren'py\"],\n\t['rescript', 'ReScript'],\n\t['res', 'ReScript'],\n\t['rest', 'reST (reStructuredText)'],\n\t['rip', 'Rip'],\n\t['roboconf', 'Roboconf'],\n\t['robotframework', 'Robot Framework'],\n\t['robot', 'Robot Framework'],\n\t['ruby', 'Ruby'],\n\t['rb', 'Ruby'],\n\t['rust', 'Rust'],\n\t['sas', 'SAS'],\n\t['sass', 'Sass (Sass)'],\n\t['scss', 'Sass (SCSS)'],\n\t['scala', 'Scala'],\n\t['scheme', 'Scheme'],\n\t['shell-session', 'Shell session'],\n\t['sh-session', 'Shell session'],\n\t['shellsession', 'Shell session'],\n\t['smali', 'Smali'],\n\t['smalltalk', 'Smalltalk'],\n\t['smarty', 'Smarty'],\n\t['sml', 'SML'],\n\t['smlnj', 'SML'],\n\t['solidity', 'Solidity (Ethereum)'],\n\t['sol', 'Solidity (Ethereum)'],\n\t['solution-file', 'Solution file'],\n\t['sln', 'Solution file'],\n\t['soy', 'Soy (Closure Template)'],\n\t['sparql', 'SPARQL'],\n\t['rq', 'SPARQL'],\n\t['splunk-spl', 'Splunk SPL'],\n\t['sqf', 'SQF: Status Quo Function (Arma 3)'],\n\t['sql', 'SQL'],\n\t['squirrel', 'Squirrel'],\n\t['stan', 'Stan'],\n\t['stata', 'Stata Ado'],\n\t['iecst', 'Structured Text (IEC 61131-3)'],\n\t['stylus', 'Stylus'],\n\t['supercollider', 'SuperCollider'],\n\t['sclang', 'SuperCollider'],\n\t['swift', 'Swift'],\n\t['systemd', 'Systemd configuration file'],\n\t['t4-templating', 'T4 templating'],\n\t['t4-cs', 'T4 Text Templates (C#)'],\n\t['t4', 'T4 Text Templates (C#)'],\n\t['t4-vb', 'T4 Text Templates (VB)'],\n\t['tap', 'TAP'],\n\t['tcl', 'Tcl'],\n\t['tt2', 'Template Toolkit 2'],\n\t['textile', 'Textile'],\n\t['toml', 'TOML'],\n\t['tremor', 'Tremor'],\n\t['trickle', 'Tremor'],\n\t['troy', 'Tremor'],\n\t['turtle', 'Turtle'],\n\t['trig', 'Turtle'],\n\t['twig', 'Twig'],\n\t['typescript', 'TypeScript'],\n\t['ts', 'TypeScript'],\n\t['typoscript', 'TypoScript'],\n\t['tsconfig', 'TypoScript'],\n\t['unrealscript', 'UnrealScript'],\n\t['uscript', 'UnrealScript'],\n\t['uc', 'UnrealScript'],\n\t['uorazor', 'UO Razor Script'],\n\t['uri', 'URI'],\n\t['url', 'URI'],\n\t['v', 'V'],\n\t['vala', 'Vala'],\n\t['vbnet', 'VB.Net'],\n\t['velocity', 'Velocity'],\n\t['verilog', 'Verilog'],\n\t['vhdl', 'VHDL'],\n\t['vim', 'vim'],\n\t['visual-basic', 'Visual Basic'],\n\t['vb', 'Visual Basic'],\n\t['vba', 'Visual Basic'],\n\t['warpscript', 'WarpScript'],\n\t['wasm', 'WebAssembly'],\n\t['web-idl', 'Web IDL'],\n\t['webidl', 'Web IDL'],\n\t['wgsl', 'WGSL'],\n\t['wiki', 'Wiki markup'],\n\t['wolfram', 'Wolfram language'],\n\t['mathematica', 'Wolfram language'],\n\t['nb', 'Wolfram language'],\n\t['wl', 'Wolfram language'],\n\t['wren', 'Wren'],\n\t['xeora', 'Xeora'],\n\t['xeoracube', 'Xeora'],\n\t['xml-doc', 'XML doc (.net)'],\n\t['xojo', 'Xojo (REALbasic)'],\n\t['xquery', 'XQuery'],\n\t['yaml', 'YAML'],\n\t['yml', 'YAML'],\n\t['yang', 'YANG'],\n\t['zig', 'Zig'],\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport CleanCSS from 'clean-css';\nimport { Cache, getMode, VirtualAssets } from 'ezal';\nimport stylus from 'stylus';\n\nconst base = path.join(__dirname, '../assets/styles/_code.styl');\n\nconst cleaner = new CleanCSS();\n\nclass CodeblockStyle extends VirtualAssets {\n\t#baseCache = new Cache<string>();\n\textra = '';\n\tconstructor() {\n\t\tsuper('/styles/code.css');\n\t\tsuper.updateDependencies([base]);\n\t}\n\tasync build() {\n\t\tlet cache = this.#baseCache.get();\n\t\tif (!cache) {\n\t\t\tconst file = await readFile(base, 'utf8');\n\t\t\tcache = stylus.render(file);\n\t\t\tthis.#baseCache.set(cache);\n\t\t}\n\t\tconst result = this.extra + cache;\n\t\tif (getMode() !== 'build') return result;\n\t\treturn cleaner.minify(result).styles;\n\t}\n\tprotected onDependenciesChanged() {\n\t\tsuper.invalidated();\n\t\tthis.#baseCache.clean();\n\t}\n}\n\nlet asset: CodeblockStyle;\nexport function updateStyles(css: string) {\n\tif (css === asset.extra) return;\n\tasset.extra = css;\n\tasset.invalidated();\n}\n\nexport function initCodeblockStyle() {\n\tasset = new CodeblockStyle();\n}\n","import { transformerColorizedBrackets } from '@shikijs/colorized-brackets';\nimport {\n\ttransformerNotationDiff,\n\ttransformerNotationErrorLevel,\n\ttransformerNotationFocus,\n\ttransformerNotationHighlight,\n\ttransformerNotationWordHighlight,\n\ttransformerStyleToClass,\n} from '@shikijs/transformers';\nimport { ModelOperations } from '@vscode/vscode-languagedetection';\nimport { getMode } from 'ezal';\nimport {\n\ttype CodeblockParsed,\n\ttype CommonPlugin,\n\ttype PluginContext,\n\tplugins,\n\tutils,\n} from 'ezal-markdown';\nimport {\n\ttype BundledLanguage,\n\ttype BundledTheme,\n\tcreateHighlighter,\n\ttype HighlighterGeneric,\n\ttype ShikiTransformer,\n} from 'shiki';\nimport { getThemeConfig } from '../../config';\nimport { LANGUAGE_MAP } from './data';\nimport { updateStyles } from './style';\n\nconst PATTERN_CLASS = /class=\"([A-Za-z0-9 -]+)\"/;\nconst PATTERN_EMPTY_LINE =\n\t/\\n<span class=\"line\">(<span class=\"mtk-\\d+\"><\\/span>)?<\\/span><\\/code><\\/pre>$/;\n\nconst modelOperations = new ModelOperations();\n\nasync function getLang(code: string, lang?: string): Promise<string> {\n\tif (lang) return lang;\n\tconst result = await modelOperations.runModel(code);\n\treturn result.toSorted((a, b) => b.confidence - a.confidence)[0].languageId;\n}\n\nlet shiki: HighlighterGeneric<BundledLanguage, BundledTheme>;\nconst shikiClassName: string[] = [];\nconst toClass = transformerStyleToClass({\n\tclassReplacer(name) {\n\t\tlet i = shikiClassName.indexOf(name);\n\t\tif (i === -1) {\n\t\t\ti = shikiClassName.length;\n\t\t\tshikiClassName.push(name);\n\t\t}\n\t\treturn `mtk-${i}`;\n\t},\n});\nconst transformers: ShikiTransformer[] = [\n\ttransformerNotationDiff(),\n\ttransformerNotationHighlight(),\n\ttransformerNotationWordHighlight(),\n\ttransformerNotationFocus(),\n\ttransformerNotationErrorLevel(),\n\ttransformerColorizedBrackets(),\n\ttoClass,\n];\n\nasync function highlighter(\n\tcode: string,\n\tlang?: string,\n): Promise<[html: string, lang: string]> {\n\tlang = await getLang(code, lang);\n\tlet loadedLanguage = lang;\n\ttry {\n\t\tawait shiki.loadLanguage(lang as any);\n\t} catch {\n\t\tloadedLanguage = 'plain';\n\t}\n\tconst theme = getThemeConfig().markdown?.codeBlockTheme;\n\tconst html = await shiki.codeToHtml(code, {\n\t\tlang: loadedLanguage,\n\t\tthemes: {\n\t\t\tlight: theme?.light.name ?? 'light-plus',\n\t\t\tdark: theme?.dark.name ?? 'dark-plus',\n\t\t},\n\t\ttransformers,\n\t});\n\tif (getMode() === 'serve') updateStyles(toClass.getCSS());\n\treturn [html, lang];\n}\n\nconst { $ } = utils;\n\nfunction packager(html: string, lang: string, extra: string): string {\n\tconst name = LANGUAGE_MAP.get(lang) ?? lang;\n\tlet mtk = '';\n\thtml = html\n\t\t.replace(PATTERN_CLASS, (_, className: string) => {\n\t\t\tconst classes = className.split(' ');\n\t\t\tconst result: string[] = ['shiki'];\n\t\t\tfor (const name of classes) {\n\t\t\t\tif (name.startsWith('has-')) result.push(name);\n\t\t\t\telse if (name.startsWith('mtk-')) mtk = name;\n\t\t\t}\n\t\t\treturn `class=\"${result.join(' ')}\"`;\n\t\t})\n\t\t.replace(PATTERN_EMPTY_LINE, '</code></pre>');\n\treturn $('figure', {\n\t\tclass: ['code', 'rounded', mtk],\n\t\thtml: [\n\t\t\t$('figcaption', {\n\t\t\t\tclass: ['sticky', 'rounded'],\n\t\t\t\thtml: [\n\t\t\t\t\t$('code', name),\n\t\t\t\t\textra,\n\t\t\t\t\t$('button', { class: ['link', 'icon-copy'], attr: { title: '复制代码' } }),\n\t\t\t\t],\n\t\t\t}),\n\t\t\thtml,\n\t\t],\n\t});\n}\n\nconst origin = plugins.codeblock();\n\nasync function render(\n\t{ code, lang, children }: CodeblockParsed,\n\t{ shared, counter }: PluginContext,\n): Promise<string> {\n\tcounter.count(code);\n\tshared.codeblock = true;\n\tconst result = await highlighter(code, lang);\n\treturn packager(result[0], result[1], children?.html ?? '');\n}\n\nconst indented: CommonPlugin<'block', CodeblockParsed> = {\n\t...origin.indentedCodeblock,\n\trender,\n};\n\nconst fenced: CommonPlugin<'block', CodeblockParsed> = {\n\t...origin.fencedCodeblock,\n\trender,\n};\n\nexport async function codeblock() {\n\tconst theme = getThemeConfig().markdown?.codeBlockTheme;\n\tshiki = await createHighlighter({\n\t\tthemes: theme ? [theme.light, theme.dark] : ['light-plus', 'dark-plus'],\n\t\tlangs: [],\n\t});\n\treturn { indented, fenced };\n}\n\nexport function setupCodeblockStyle() {\n\tupdateStyles(toClass.getCSS());\n}\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface FoldParsed extends Parsed {\n\tchildren: [summary: ParsedChild, details: ParsedChild];\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(\\+{3,}) {0,3}(\\S.*)\\n/;\n\nconst { $ } = utils;\n\nexport const fold: CommonPlugin<'block', FoldParsed> = {\n\tname: 'fold',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { md }) {\n\t\tconst matched = source.match(PATTERN_START);\n\t\tif (!matched) return;\n\t\tconst size = matched[1].length;\n\t\tconst summary = matched[2];\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}\\\\+{${size}}\\\\s*(\\\\n|$)`);\n\t\tconst endMatched = source.match(pattern);\n\t\tconst end = endMatched?.index ?? Infinity;\n\t\tconst rawEnd = end + (endMatched?.[0].length ?? 0);\n\t\tconst raw = source.slice(0, rawEnd);\n\t\tconst details = raw.slice(matched[0].length, end);\n\t\treturn {\n\t\t\traw,\n\t\t\tchildren: [md(summary, 'inline'), md(details, 'block')],\n\t\t};\n\t},\n\trender({ children: [summary, details] }) {\n\t\treturn $('details', {\n\t\t\tclass: 'rounded',\n\t\t\thtml: [\n\t\t\t\t$('summary', { class: ['rounded', 'sticky'], html: summary.html }),\n\t\t\t\t$('div', { class: 'sticky-content', html: details.html }),\n\t\t\t],\n\t\t});\n\t},\n};\n","import {\n\ttype ASTPlugin,\n\ttype CommonPlugin,\n\tLinkNode,\n\ttype Parsed,\n\ttype ParsedChild,\n\tParsedNode,\n\ttype RendererPlugin,\n\tutils,\n} from 'ezal-markdown';\n\ninterface LinkParsed extends Parsed {\n\tid: string;\n\tlabel: string;\n}\n\ninterface SourceParsed extends Parsed {\n\tchildren: ParsedChild[];\n\tid: [label: string, id: string][];\n}\n\nconst { eachLine, $ } = utils;\n\nconst PATTERN_SOURCE_START = /(?<=^|\\n)\\[\\^.*?\\]:/;\nconst PATTERN_SOURCE_BEGIN = /^\\[(.*?)\\]:/;\nconst PATTERN_SOURCE_INDENT = /^(\\t| {1,4})/;\n\nconst render: RendererPlugin<'inline', LinkParsed> = {\n\tname: 'footnote',\n\ttype: 'inline',\n\trender({ id, label }, { counter }) {\n\t\tcounter.count(label);\n\t\treturn $(\n\t\t\t'sup',\n\t\t\t$('a', {\n\t\t\t\tclass: 'footnote',\n\t\t\t\tattr: { href: id },\n\t\t\t\tcontent: label,\n\t\t\t}),\n\t\t);\n\t},\n};\n\nconst ast: ASTPlugin<'inline', LinkNode> = {\n\tname: 'footnote-ast',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: -1,\n\tparse(root) {\n\t\tfor (const child of root.entires().toArray()) {\n\t\t\tif (!(child instanceof LinkNode)) continue;\n\t\t\tif (child.label?.[0] !== '^') continue;\n\t\t\tif (child.raw?.length !== child.label.length + 2) continue;\n\t\t\tconst id = child.destination;\n\t\t\tconst label = child.raw.slice(2, -1);\n\t\t\tchild.before(\n\t\t\t\tnew ParsedNode('footnote', 'inline', { id, label } as LinkParsed),\n\t\t\t);\n\t\t\tchild.remove();\n\t\t}\n\t},\n\tverifyNode: (_): _ is LinkNode => false,\n\trender: () => '',\n};\n\nconst source: CommonPlugin<'block', SourceParsed> = {\n\tname: 'footnote-source',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_SOURCE_START,\n\tparse(source, { anchors, refMap, md }) {\n\t\tconst contents: string[] = [];\n\t\tconst id: [string, string][] = [];\n\t\tlet current = '';\n\t\tlet raw = '';\n\t\tlet indentState: boolean | null = null;\n\t\tfor (const [line] of eachLine(source)) {\n\t\t\tconst matched = line.match(PATTERN_SOURCE_BEGIN);\n\t\t\t// 首行\n\t\t\tif (matched) {\n\t\t\t\tif (matched[1][0] !== '^') break;\n\t\t\t\tif (raw) contents.push(current);\n\t\t\t\tconst label = matched[1].slice(1);\n\t\t\t\tconst hash = anchors.register(label);\n\t\t\t\tid.push([label, hash]);\n\t\t\t\trefMap.set(matched[1], { destination: `#${hash}` });\n\t\t\t\tcurrent = line.slice(matched[0].length);\n\t\t\t\traw += line;\n\t\t\t\tindentState = null;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// 懒续行\n\t\t\tconst indent = PATTERN_SOURCE_INDENT.test(line);\n\t\t\tconst empty = line.trim().length === 0;\n\t\t\t// 第二行设置缩进状态:若第二行为空则后续必须缩进\n\t\t\tif (indentState === null) indentState = indent || empty;\n\t\t\t// 若无需缩进或之前存在无缩进行,且当前行为空行则结束\n\t\t\tif (!indentState && empty) break;\n\t\t\t// 若需要缩进而为缩进则结束\n\t\t\tif (indentState && !indent) break;\n\t\t\t// 若不为空行且未缩进则设置为无缩进\n\t\t\tif (!(empty || indent)) indentState = false;\n\t\t\tcurrent += line;\n\t\t\traw += line;\n\t\t}\n\t\tif (id.length !== contents.length) contents.push(current);\n\t\tconst children = contents.map((content) =>\n\t\t\tmd(content, { skipParagraphWrapping: true, maxLevel: 'block' }),\n\t\t);\n\t\treturn { raw, id, children };\n\t},\n\trender({ id, children }, { counter }) {\n\t\tfor (const [label] of id) {\n\t\t\tcounter.count(label);\n\t\t}\n\t\tfor (const child of children) {\n\t\t\tcounter.count(child.raw);\n\t\t}\n\t\treturn $(\n\t\t\t'dl',\n\t\t\tchildren.flatMap((child, i) => [\n\t\t\t\t$('dt', { content: id[i][0], id: id[i][1] }),\n\t\t\t\t$('dd', child.html),\n\t\t\t]),\n\t\t);\n\t},\n};\n\nexport const footnote = { source, ast, render };\n","import { escapeHTML, type Page, URL } from 'ezal';\nimport {\n\ttype ASTPlugin,\n\tImageNode,\n\tParagraph,\n\ttype Parsed,\n\tParsedNode,\n\ttype RendererPlugin,\n\tutils,\n} from 'ezal-markdown';\nimport mime from 'mime-types';\nimport { getImageInfo, type ImageInfo } from '../image';\n\nconst { $ } = utils;\n\nfunction img(\n\tinfo: ImageInfo | null,\n\tsrc: string,\n\talt: string,\n\ttitle?: string,\n): string {\n\treturn $('img', {\n\t\tattr: {\n\t\t\tsrc: URL.for(src),\n\t\t\talt,\n\t\t\twidth: info?.metadata?.width,\n\t\t\theight: info?.metadata?.height,\n\t\t\tloading: 'lazy',\n\t\t\ttitle,\n\t\t},\n\t\tstyle: { $imgColor: info?.metadata?.color },\n\t});\n}\n\ninterface ImageParsed extends Parsed {\n\ttitle?: string;\n\talt: string;\n\turl: string;\n}\n\nfunction renderImage(\n\turl: string,\n\talt: string,\n\ttitle: string | undefined,\n\tpage: Page,\n): string {\n\tconst info = getImageInfo(URL.resolve(page.url, url));\n\tif (!info?.rule) return img(info, url, alt, title);\n\tconst html: string[] = info.rule.slice(0, -1).map((ext) =>\n\t\t$('source', {\n\t\t\tattr: { srcset: URL.extname(url, `.opt${ext}`), type: mime.lookup(ext) },\n\t\t}),\n\t);\n\thtml.push(img(info, URL.extname(url, info.rule.at(-1)!), alt, title));\n\treturn $('picture', html);\n}\n\nconst blockRender: RendererPlugin<'block', ImageParsed> = {\n\tname: 'image',\n\ttype: 'block',\n\trender({ title, url, alt }, { shared, counter }) {\n\t\tconst page = shared.page as any as Page;\n\t\tconst html: string[] = [renderImage(url, alt, title, page)];\n\t\thtml.push($('figcaption', { content: alt }));\n\t\tcounter.count(alt);\n\t\treturn $('figure', { class: 'image', html });\n\t},\n};\n\nconst block: ASTPlugin<'inline', ParsedNode> = {\n\tname: 'image-post',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: -1,\n\tparse(root) {\n\t\tif (!(root instanceof Paragraph)) return;\n\t\tif (root.size !== 1) return;\n\t\tconst child = root.child(0);\n\t\tif (!(child instanceof ImageNode)) return;\n\t\tconst alt = child\n\t\t\t.entires()\n\t\t\t.map((node) => node.raw ?? '')\n\t\t\t.toArray()\n\t\t\t.join('');\n\t\tconst image = new ParsedNode('image', 'block', {\n\t\t\traw: child.raw ?? '',\n\t\t\ttitle: child.title,\n\t\t\talt: escapeHTML(alt),\n\t\t\turl: child.destination,\n\t\t} as ImageParsed);\n\t\troot.before(image);\n\t\troot.remove();\n\t},\n\tverifyNode: (_node): _node is ParsedNode => false,\n\trender: () => '',\n};\n\nconst inline: ASTPlugin<'inline', ImageNode> = {\n\tname: 'image',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: 1,\n\tparse() {},\n\tverifyNode(node): node is ImageNode {\n\t\treturn node instanceof ImageNode;\n\t},\n\trender(node, { shared }) {\n\t\tconst page = shared.page as any as Page;\n\t\tconst { destination, title } = node;\n\t\tconst alt = escapeHTML(\n\t\t\tnode\n\t\t\t\t.entires()\n\t\t\t\t.map((node) => node.html)\n\t\t\t\t.toArray()\n\t\t\t\t.join(''),\n\t\t);\n\t\treturn renderImage(destination, alt, title, page);\n\t},\n};\n\nexport const image = { block, blockRender, inline };\n","import { type CommonPlugin, type Parsed, utils } from 'ezal-markdown';\n\ninterface KbdParsed extends Parsed {\n\tkey: string;\n}\n\nconst PATTERN = /{{\\S+?}}/;\n\nconst { $ } = utils;\n\nexport const kbd: CommonPlugin<'inline', KbdParsed> = {\n\tname: 'kbd',\n\ttype: 'inline',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN);\n\t\tif (!matched) return;\n\t\treturn { raw: matched[0], key: matched[0].slice(2, -2) };\n\t},\n\trender({ key }, { counter }) {\n\t\tcounter.count(key);\n\t\treturn $('kbd', { content: key });\n\t},\n};\n","import { URL } from 'ezal';\nimport { type ASTPlugin, LinkNode, utils } from 'ezal-markdown';\n\nconst PATTERN_ABSOLUTE_LINK = /^[a-z][a-z0-9+.-]*:|^\\/\\//;\n\nconst { $ } = utils;\n\nexport const link: ASTPlugin<'inline', LinkNode> = {\n\tname: 'link',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: 1,\n\tparse() {},\n\tverifyNode(node): node is LinkNode {\n\t\treturn node instanceof LinkNode;\n\t},\n\trender(node) {\n\t\tconst html = [...node.entires().map((node) => node.html)];\n\t\tconst target = PATTERN_ABSOLUTE_LINK.test(node.destination)\n\t\t\t? '_blank'\n\t\t\t: undefined;\n\t\treturn $('a', {\n\t\t\tattr: { href: URL.for(node.destination), target, title: node.title },\n\t\t\thtml,\n\t\t});\n\t},\n};\n","import { URL } from 'ezal';\nimport { type CommonPlugin, type Parsed, utils } from 'ezal-markdown';\n\ninterface Link {\n\thref: string;\n\ticon?: string;\n\ttitle: string;\n\tsubtitle?: string;\n}\n\ninterface LinksParsed extends Parsed {\n\tlinks: Link[];\n}\n\nconst PATTERN_ALL = /(?<=^|\\n)@@\\n.*?\\n@@(\\n|$)/s;\nconst PATTERN_EACH = /(?<=^|\\n)@ ?([^@\\n].*\\n){2,3}/g;\nconst PATTERN_WHITESPACE = /\\s+/;\n\nconst { $ } = utils;\n\nexport const links: CommonPlugin<'block', LinksParsed> = {\n\tname: 'links',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_ALL,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_ALL);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst links = [\n\t\t\t...raw.matchAll(PATTERN_EACH).map<Link>((matched) => {\n\t\t\t\tconst lines = matched[0].split('\\n');\n\t\t\t\tconst args = lines[0].slice(1).trim().split(PATTERN_WHITESPACE);\n\t\t\t\treturn {\n\t\t\t\t\thref: args[0],\n\t\t\t\t\ticon: args[1],\n\t\t\t\t\ttitle: lines[1],\n\t\t\t\t\tsubtitle: lines[2],\n\t\t\t\t};\n\t\t\t}),\n\t\t];\n\t\treturn { raw, links };\n\t},\n\trender({ links }, { counter }) {\n\t\tconst html = links.map<string>(({ href, icon, title, subtitle }) => {\n\t\t\tconst html: string[] = [$('i', { class: ['icon-link'] })];\n\t\t\tif (icon) {\n\t\t\t\thtml.push(\n\t\t\t\t\t$('img', { class: 'rounded', attr: { src: URL.for(icon), alt: title } }),\n\t\t\t\t);\n\t\t\t}\n\t\t\thtml.push($('div', { class: 'link-title', content: title }));\n\t\t\tcounter.count(title);\n\t\t\tif (subtitle) {\n\t\t\t\thtml.push($('div', { content: subtitle }));\n\t\t\t\tcounter.count(subtitle);\n\t\t\t}\n\t\t\treturn $('a', { class: 'rounded', html, attr: { href: URL.for(href) } });\n\t\t});\n\t\treturn $('div', { class: 'links', html });\n\t},\n};\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface NoteParsed extends Parsed {\n\ttype: string;\n\ttitle: string;\n\tchildren: ParsedChild;\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(!{3,}) ?(info|tip|warn|danger)(.*)\\n/;\n\nconst { $ } = utils;\n\nconst NOTE_TITLE: Record<string, string> = {\n\tinfo: '注意',\n\ttip: '提示',\n\twarn: '警告',\n\tdanger: '危险',\n};\n\nexport const note: CommonPlugin<'block', NoteParsed> = {\n\tname: 'note',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { md }) {\n\t\tconst matched = source.match(PATTERN_START);\n\t\tif (!matched) return;\n\t\tconst size = matched[1].length;\n\t\tconst type = matched[2];\n\t\tlet title = matched[3]?.trim();\n\t\tif (!title) title = NOTE_TITLE[type];\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}!{${size}}\\\\s*(\\\\n|$)`);\n\t\tconst endMatched = source.match(pattern);\n\t\tconst end = endMatched?.index ?? Infinity;\n\t\tconst rawEnd = end + (endMatched?.[0].length ?? 0);\n\t\tconst raw = source.slice(0, rawEnd);\n\t\tconst content = raw.slice(matched[0].length, end);\n\t\treturn { raw, type, title, children: md(content, 'block') };\n\t},\n\trender({ type, title, children }) {\n\t\treturn $('div', {\n\t\t\tclass: ['note', `note-${type}`],\n\t\t\thtml: [$('p', [$('i', { class: `icon-${type}` }), title]), children.html],\n\t\t});\n\t},\n};\n","import { plugins, utils } from 'ezal-markdown';\n\nconst { $ } = utils;\n\nconst origin = plugins.table();\n\nexport const table: typeof origin = {\n\t...origin,\n\trender(source, context, options) {\n\t\treturn $('div', {\n\t\t\tclass: ['table', 'rounded'],\n\t\t\tattr: { tabindex: '0' },\n\t\t\thtml: origin.render(source, context, options) as string,\n\t\t});\n\t},\n};\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface TabsParsed extends Parsed {\n\tchildren: [tab: ParsedChild, content: ParsedChild][];\n\tid: string[];\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(:{3,}) {0,3}\\S/;\n\nconst { $ } = utils;\n\nexport const tabs: CommonPlugin<'block', TabsParsed, number> = {\n\tname: 'tabs',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { anchors, md }) {\n\t\tconst size = source.match(PATTERN_START)?.[1].length ?? 0;\n\t\tif (!size) return;\n\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}:{${size}}(.*)(\\\\n|$)`);\n\t\tconst children: TabsParsed['children'] = [];\n\t\tconst id: TabsParsed['id'] = [];\n\n\t\tlet matched = source.match(pattern);\n\t\tlet offset = 0;\n\t\twhile (matched) {\n\t\t\toffset += matched[0].length;\n\t\t\tif (matched[1].trim().length === 0) break;\n\t\t\tconst tab = md(matched[1], 'inline');\n\t\t\tmatched = source.slice(offset).match(pattern);\n\t\t\tconst next = (matched?.index ?? Infinity) + offset;\n\t\t\tconst content = md(source.slice(offset, next), 'block');\n\t\t\toffset = next;\n\t\t\tid.push(anchors.register('tab'));\n\t\t\tchildren.push([tab, content]);\n\t\t}\n\n\t\tif (children.length === 0) return;\n\n\t\treturn { raw: source.slice(0, offset), children, id };\n\t},\n\trender({ children, id }, context) {\n\t\tconst name = `tabs-${context.self}`;\n\t\tcontext.self++;\n\t\tconst nav = children.map(([tab], i) =>\n\t\t\t$('label', {\n\t\t\t\tattr: { for: id[i] },\n\t\t\t\thtml: [\n\t\t\t\t\t$('input', { attr: { type: 'radio', name, checked: i === 0 }, id: id[i] }),\n\t\t\t\t\ttab.html,\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\t\tconst content = children.map(([_, content], i) =>\n\t\t\t$('div', { class: i === 0 ? 'active' : undefined, html: content.html }),\n\t\t);\n\t\treturn $('div', {\n\t\t\tclass: ['tabs', 'rounded'],\n\t\t\thtml: [\n\t\t\t\t$('div', { class: ['tab-nav', 'rounded', 'sticky'], html: nav }),\n\t\t\t\t$('div', { class: ['tab-content', 'sticky-content'], html: content }),\n\t\t\t],\n\t\t});\n\t},\n\tcontext: () => 0,\n};\n","import type { CommonPlugin, Parsed, PluginLogger } from 'ezal-markdown';\nimport katex, { type StrictFunction } from 'katex';\n\nconst PATTERN_INLINE = /(?<=\\s|\\W|^)(?<!\\$)(\\$\\$?)(.+?)(\\1)(?!\\$)(?=\\s|\\W|$)/;\nconst PATTERN_BLOCK = /(?<=^|\\n) {0,3}\\$\\$.*?\\$\\$\\s*(\\n|$)/s;\n\nconst katexErrorHandler =\n\t(logger: PluginLogger): StrictFunction =>\n\t(errorCode, errorMsg, token) => {\n\t\tswitch (errorCode) {\n\t\t\tcase 'unknownSymbol':\n\t\t\tcase 'unicodeTextInMathMode':\n\t\t\tcase 'mathVsTextUnits':\n\t\t\tcase 'newLineInDisplayMode':\n\t\t\tcase 'htmlExtension':\n\t\t\t\tlogger.warn(`${errorCode}: ${errorMsg}`, token);\n\t\t\t\tbreak;\n\t\t\tcase 'commentAtEnd':\n\t\t\t\tlogger.error(`${errorCode}: ${errorMsg}`, token);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t};\n\ninterface TexParsed extends Parsed {\n\ttex: string;\n}\n\nconst inline: CommonPlugin<'inline', TexParsed> = {\n\tname: 'tex',\n\ttype: 'inline',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_INLINE,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_INLINE);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst tex = matched[2];\n\t\treturn { raw, tex };\n\t},\n\trender({ tex }, { logger, shared, counter }) {\n\t\tshared.tex = true;\n\t\tcounter.count(tex);\n\t\treturn katex.renderToString(tex, {\n\t\t\toutput: 'html',\n\t\t\tthrowOnError: false,\n\t\t\tstrict: katexErrorHandler(logger),\n\t\t});\n\t},\n};\n\nconst block: CommonPlugin<'block', TexParsed> = {\n\tname: 'tex',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_BLOCK,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_BLOCK);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst start = raw.indexOf('$$');\n\t\tconst end = raw.lastIndexOf('$$');\n\t\tconst tex = raw.slice(start + 2, end).trim();\n\t\treturn { raw, tex };\n\t},\n\trender({ tex }, { logger, shared, counter }) {\n\t\tshared.tex = true;\n\t\tcounter.count(tex);\n\t\treturn katex.renderToString(tex, {\n\t\t\tdisplayMode: true,\n\t\t\toutput: 'html',\n\t\t\tthrowOnError: false,\n\t\t\tstrict: katexErrorHandler(logger),\n\t\t});\n\t},\n};\n\nexport const tex = { inline, block };\n","import { fs, Logger, type PageHandler } from 'ezal';\nimport {\n\ttype CommonPlugin,\n\tEzalMarkdown,\n\textractFrontmatter,\n\tplugins,\n} from 'ezal-markdown';\nimport { getThemeConfig } from '../config';\nimport { codeblock } from './codeblock';\nimport { fold } from './fold';\nimport { footnote } from './footnote';\nimport { image } from './image';\nimport { kbd } from './kbd';\nimport { link } from './link';\nimport { links } from './links';\nimport { note } from './note';\nimport { table } from './table';\nimport { tabs } from './tabs';\nimport { tex } from './tex';\n\nconst logger = new Logger('markdown');\n\nconst renderer = new EzalMarkdown();\nrenderer.logger = {\n\tdebug(data) {\n\t\tlogger.debug(`[${data.name}]`, data.message, data.errObj);\n\t},\n\tinfo(data) {\n\t\tlogger.log(`[${data.name}]`, data.message, data.errObj);\n\t},\n\twarn(data) {\n\t\t// HACK: 忽略因脚注引起的警告\n\t\tif (\n\t\t\tdata.name === 'link-reference-define' &&\n\t\t\tdata.message.includes('label ^')\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tlogger.warn(`[${data.name}]`, data.message, data.errObj);\n\t},\n\terror(data) {\n\t\tlogger.error(`[${data.name}]`, data.message, data.errObj);\n\t},\n};\n\nconst setext: CommonPlugin<'block'> = {\n\tname: 'setext-heading',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: () => null,\n\tparse: () => null,\n\trender: () => '',\n};\n\nexport async function markdownPageHandler(): Promise<PageHandler> {\n\trenderer.set(\n\t\tplugins.heading({ shiftLevels: true }),\n\t\timage,\n\t\ttable,\n\t\tawait codeblock(),\n\t\tfootnote,\n\t\ttex,\n\t\ttabs as any,\n\t\tnote,\n\t\tfold,\n\t\tkbd,\n\t\tlinks,\n\t\tsetext,\n\t\tlink,\n\t);\n\treturn {\n\t\texts: '.md',\n\t\tasync parser(src) {\n\t\t\tconst file = await fs.readFile(src);\n\t\t\tif (file instanceof Error) return file;\n\t\t\tconst frontmatter = await extractFrontmatter(file);\n\t\t\tlet data = frontmatter?.data as Record<string, any>;\n\t\t\tif (typeof data !== 'object') data = {};\n\t\t\tconst content = file.slice(frontmatter?.raw.length ?? 0);\n\t\t\treturn { content, data };\n\t\t},\n\t\tasync renderer(content, page) {\n\t\t\tconst config = getThemeConfig();\n\t\t\tconst result = await renderer.renderHTML(content, {\n\t\t\t\tlineBreak: config.markdown?.lineBreak,\n\t\t\t\tshared: { page } as any,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\thtml: result.html,\n\t\t\t\tdata: result.context,\n\t\t\t};\n\t\t},\n\t};\n}\n","import { VirtualPage } from 'ezal';\n\nexport function init404Page() {\n\tnew VirtualPage({ id: '404', src: '/404.html', layout: '404' });\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { ArchivePage, ArchivePageData } from '../../layouts/context';\nimport { compareByDate } from '../utils';\n\nlet indexPage: ArchivePage;\nconst years = new Map<number, number>();\n\nfunction getArticles(year: number): Article[] {\n\treturn Article.getAll()\n\t\t.filter((article) => article.date.year === year)\n\t\t.toSorted(compareByDate);\n}\n\nfunction createIndex() {\n\tconst data: ArchivePageData = { years, getArticles };\n\tindexPage = new VirtualPage({\n\t\tid: 'archive',\n\t\tsrc: '/archive/',\n\t\tlayout: 'archive',\n\t\ttitle: '归档',\n\t\tdata,\n\t}) as ArchivePage;\n}\n\nlet scanned = false;\nexport function updateArchivePage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tif (!indexPage) createIndex();\n\tconst newYears = new Map<number, number>();\n\tfor (const article of Article.getAll()) {\n\t\tconst year = article.date.year;\n\t\tlet count = newYears.get(year);\n\t\tif (count === undefined) count = 0;\n\t\tcount++;\n\t\tnewYears.set(year, count);\n\t}\n\tyears.clear();\n\tfor (const [year, count] of newYears) {\n\t\tyears.set(year, count);\n\t}\n\tindexPage.invalidated();\n}\n","import { Category, VirtualPage } from 'ezal';\nimport type { CategoryPage, CategoryPageData } from '../../layouts/context';\n\nconst categories = new Map<Category, CategoryPage>();\n\nfunction createPage(category: Category): CategoryPage {\n\tconst id = `category/${category.path.join('/')}`;\n\tconst data: CategoryPageData = { category };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `分类:${category.name}`,\n\t\tlayout: 'category',\n\t\tdata,\n\t}) as CategoryPage;\n}\n\nlet scanned = false;\nexport function updateCategoryPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [category, page] of categories.entries().toArray()) {\n\t\tif (!category.destroyed) continue;\n\t\tpage.destroy();\n\t\tcategories.delete(category);\n\t}\n\tfor (const category of Category.getAll()) {\n\t\tif (categories.has(category)) continue;\n\t\tcategories.set(category, createPage(category));\n\t}\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { HomePage, HomePageData } from '../../layouts/context';\nimport { getThemeConfig } from '../config';\nimport { compareByDate } from '../utils';\n\nconst pages: HomePage[] = [];\n\nfunction getArticles(index: number): Article[] {\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst offset = index * pre;\n\treturn Article.getAll()\n\t\t.toSorted(compareByDate)\n\t\t.slice(offset, offset + pre);\n}\n\nfunction getPages() {\n\treturn pages;\n}\n\nfunction createPage(index: number): HomePage {\n\tconst i = String(index + 1);\n\tconst data: HomePageData = { index, getPages, getArticles };\n\treturn new VirtualPage({\n\t\tid: index ? `${i}/` : '',\n\t\tsrc: `/${index ? `${i}/` : ''}`,\n\t\tlayout: 'home',\n\t\tdata,\n\t}) as HomePage;\n}\n\nlet scanned = false;\nexport function updateHomePage(article?: Article) {\n\tif (!scanned && article) return;\n\tscanned = true;\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\tif (count > pages.length) {\n\t\tfor (let i = pages.length; i < count; i++) {\n\t\t\tpages.push(createPage(i));\n\t\t}\n\t} else if (count < pages.length) {\n\t\tfor (const page of pages.splice(count)) {\n\t\t\tpage.destroy();\n\t\t}\n\t}\n\tfor (const page of pages) {\n\t\tpage.invalidated();\n\t}\n}\n","import { Tag, VirtualPage } from 'ezal';\nimport type { TagPage, TagPageData } from '../../layouts/context';\n\nconst tags = new Map<Tag, TagPage>();\n\nfunction createPage(tag: Tag): TagPage {\n\tconst id = `tag/${tag.name}`;\n\tconst data: TagPageData = { tag };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `标签:${tag.name}`,\n\t\tlayout: 'tag',\n\t\tdata,\n\t}) as TagPage;\n}\n\nlet scanned = false;\nexport function updateTagPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [tag, page] of tags.entries().toArray()) {\n\t\tif (!tag.destroyed) continue;\n\t\tpage.destroy();\n\t\ttags.delete(tag);\n\t}\n\tfor (const tag of Tag.getAll()) {\n\t\tif (tags.has(tag)) continue;\n\t\ttags.set(tag, createPage(tag));\n\t}\n}\n","import {\n\tArticle,\n\tgetConfig,\n\tgetMode,\n\tLogger,\n\tPage,\n\ttype PromiseOr,\n\tVirtualAssets,\n} from 'ezal';\nimport type { RouteContent } from 'ezal/dist/route';\nimport type * as pagefind from 'pagefind';\n\nconst logger = new Logger('theme:index');\n\nlet index: pagefind.PagefindIndex;\nconst assets = new Map<string, PagefindIndex>();\n\nclass PagefindIndex extends VirtualAssets {\n\tbuffer: Buffer;\n\tconstructor(url: string, buffer: Buffer) {\n\t\tsuper(url);\n\t\tthis.buffer = buffer;\n\t}\n\tbuild(): PromiseOr<RouteContent> {\n\t\treturn this.buffer;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\n/** 重建索引文件虚拟资源 */\nasync function rebuildIndexFile() {\n\tif (!index) return;\n\tconst { errors, files } = await index.getFiles();\n\tif (errors.length > 0) {\n\t\tif (getMode() === 'build') logger.fatal(errors);\n\t\telse logger.error(errors);\n\t\treturn;\n\t}\n\tconst fileMap = new Map(\n\t\tfiles.map(({ path, content }) => [path, Buffer.from(content)]),\n\t);\n\tfor (const [path, asset] of assets.entries().toArray()) {\n\t\tif (fileMap.has(path)) continue;\n\t\tasset.destroy();\n\t\tassets.delete(path);\n\t}\n\tfor (const [path, buffer] of fileMap) {\n\t\tlet asset = assets.get(path);\n\t\tif (asset) {\n\t\t\tasset.buffer = buffer;\n\t\t\tasset.invalidated();\n\t\t\tcontinue;\n\t\t}\n\t\tasset = new PagefindIndex(path, buffer);\n\t\tassets.set(path, asset);\n\t}\n}\n\n/**\n * 添加页面\n * @description 构建模式下需启用强制才能添加索引\n */\nexport async function addPage(page: Page, force?: boolean): Promise<string[]> {\n\tif (!index) return [];\n\tif (getMode() === 'build' && !force) return [];\n\n\tconst allowIndex = page.data?.index;\n\tif (page instanceof Article) {\n\t\tif (allowIndex === false) return [];\n\t} else if (!allowIndex) return [];\n\n\tconst { errors } = await index.addCustomRecord({\n\t\turl: page.url,\n\t\tcontent: page.content ?? page.markdownContent ?? '',\n\t\tlanguage: getConfig().site.language,\n\t\tmeta: { title: page.title },\n\t});\n\tif (errors.length > 0) logger.error(errors);\n\tif (!force) await rebuildIndexFile();\n\treturn errors;\n}\n\n/** 创建所有页面索引 */\nasync function buildAllIndex(): Promise<string[]> {\n\tconst errors: string[] = [];\n\tfor (const article of Article.getAll()) {\n\t\terrors.push(...(await addPage(article, true)));\n\t}\n\tfor (const page of Page.getAll()) {\n\t\terrors.push(...(await addPage(page, true)));\n\t}\n\treturn errors;\n}\n\n/**\n * 清除并重建索引\n * @description 构建模式下无效\n */\nexport async function rebuildPagefind() {\n\tif (!index) return;\n\tif (getMode() === 'build') return;\n\tawait index.deleteIndex();\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/** 构建 Pagefind */\nexport async function buildPagefind() {\n\tif (!index) throw new Error('Pagefind not initialized');\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/**\n * 初始化 PageFind\n * @description 构建模式下不会构建索引\n */\nexport async function initPagefind() {\n\tif (index) return;\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tif (getMode() === 'build') return;\n\tawait rebuildPagefind();\n}\n\n/** 停止 PageFind */\nexport async function stopPagefind() {\n\tconst pagefind = await import('pagefind');\n\tawait pagefind.close();\n}\n","import { Article, getConfig, Page, URL, VirtualAssets } from 'ezal';\nimport { SitemapStream } from 'sitemap';\nimport { getThemeConfig } from './config';\n\nfunction getInfo(page: Page): {\n\turl: string;\n\tchangefreq: string;\n\timg?: string;\n} {\n\tlet img = page.data?.cover;\n\tif (img) img = URL.resolve(page.url, img);\n\treturn { url: page.url, changefreq: 'weekly', img };\n}\n\nclass Sitemap extends VirtualAssets {\n\tconstructor() {\n\t\tsuper('/sitemap.xml');\n\t}\n\tbuild() {\n\t\tconst { site } = getConfig();\n\t\tconst stream = new SitemapStream({ hostname: site.domain });\n\n\t\tstream.write({ url: '/' });\n\t\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\t\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\t\tfor (let i = 2; i <= count; i++) stream.write({ url: `/${i}/` });\n\n\t\tfor (const article of Article.getAll()) {\n\t\t\tif (article.data?.sitemap === false) continue;\n\t\t\tstream.write(getInfo(article));\n\t\t}\n\n\t\tfor (const page of Page.getAll()) {\n\t\t\tif (!page.data?.sitemap) continue;\n\t\t\tstream.write(getInfo(page));\n\t\t}\n\n\t\tstream.end();\n\n\t\treturn stream;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\nlet asset: Sitemap;\n\nexport function initSitemap() {\n\tasset = new Sitemap();\n}\n\nexport function updateSitemap() {\n\tasset?.invalidated();\n}\n","import path from 'node:path';\nimport esbuild from 'esbuild';\nimport { getMode, type TransformRule } from 'ezal';\n\nexport const scriptTransformRule: TransformRule = {\n\tfrom: '.ts',\n\tto: '.js',\n\tasync transformer(src: string) {\n\t\tconst buildMode = getMode() === 'build';\n\t\tconst {\n\t\t\toutputFiles,\n\t\t\tmetafile: { inputs },\n\t\t} = await esbuild.build({\n\t\t\t// Load\n\t\t\tentryPoints: [src],\n\t\t\tloader: { '.ts': 'ts' },\n\t\t\texternal: ['../pagefind.js'],\n\t\t\t// Output\n\t\t\tbundle: true,\n\t\t\tplatform: 'browser',\n\t\t\tformat: 'iife',\n\t\t\ttarget: 'es2024',\n\t\t\twrite: false,\n\t\t\tmetafile: true,\n\t\t\tsourcemap: buildMode ? false : 'inline',\n\t\t\t// Other\n\t\t\ttreeShaking: buildMode,\n\t\t\tminify: buildMode,\n\t\t});\n\t\tconst cwd = process.cwd();\n\t\tconst result = outputFiles[0].text;\n\t\tconst dependencies = Object.keys(inputs).map((src) => path.join(cwd, src));\n\t\treturn { result, dependencies };\n\t},\n};\n","import path from 'node:path';\nimport CleanCSS from 'clean-css';\nimport { fs, getMode, normalizeError, type TransformRule } from 'ezal';\nimport stylus from 'stylus';\nimport { getThemeConfig, type LinkPageStyles } from '../config';\n\nconst STYLE_CONFIGS: Record<string, () => any> = {\n\t'color.light': () => getThemeConfig().color?.light,\n\t'color.dark': () => getThemeConfig().color?.dark,\n\twaline: () => !!getThemeConfig().waline,\n};\n\nfunction config({ val }: { val: string }) {\n\tif (val in STYLE_CONFIGS) return STYLE_CONFIGS[val]();\n}\n\nfunction linksStyle({ val }: { val: LinkPageStyles }): boolean {\n\tconst styles = getThemeConfig().linkPageStyles;\n\tif (!styles) return true;\n\treturn styles.includes(val);\n}\n\nconst cleaner = new CleanCSS();\n\nexport const styleTransformRule: TransformRule = {\n\tfrom: '.styl',\n\tto: '.css',\n\tasync transformer(src: string) {\n\t\tconst file = await fs.readFile(src);\n\t\tif (file instanceof Error) return file;\n\t\ttry {\n\t\t\tconst renderer = stylus(file, {\n\t\t\t\tpaths: [path.join(src, '..')],\n\t\t\t\tfilename: path.basename(src),\n\t\t\t\tfunctions: { config, linksStyle },\n\t\t\t\t// @ts-expect-error\n\t\t\t\t'include css': true,\n\t\t\t});\n\t\t\tconst dependencies = renderer.deps().map((dep) => {\n\t\t\t\tif (!dep.startsWith('//?/')) return dep;\n\t\t\t\treturn path.normalize(dep.slice(4));\n\t\t\t});\n\t\t\tlet result = renderer.render();\n\t\t\tif (getMode() === 'build') result = cleaner.minify(result).styles;\n\t\t\treturn { result, dependencies };\n\t\t} catch (error) {\n\t\t\treturn normalizeError(error);\n\t\t}\n\t},\n};\n","import path from 'node:path';\nimport type { ThemeConfig as EzalThemeConfig } from 'ezal';\nimport { setThemeConfig, type ThemeConfig } from './config';\nimport { initFeed, updateFeedCategory, updateFeedItem } from './feed';\nimport { imageAddHook, imageRemoveHook, imageUpdateHook } from './image';\nimport { imageDB } from './image/db';\nimport { exeIndexNow } from './index-now';\nimport { layoutConfig } from './layout';\nimport { markdownPageHandler } from './markdown';\nimport { setupCodeblockStyle } from './markdown/codeblock';\nimport { initCodeblockStyle } from './markdown/codeblock/style';\nimport { init404Page } from './page/404';\nimport { updateArchivePage } from './page/archive';\nimport { updateCategoryPage } from './page/category';\nimport { updateHomePage } from './page/home';\nimport { updateTagPage } from './page/tag';\nimport {\n\taddPage,\n\tbuildPagefind,\n\tinitPagefind,\n\trebuildPagefind,\n\tstopPagefind,\n} from './pagefind';\nimport { initSitemap, updateSitemap } from './sitemap';\nimport { scriptTransformRule } from './transform/script';\nimport { styleTransformRule } from './transform/stylus';\n\nexport async function theme(config?: ThemeConfig): Promise<EzalThemeConfig> {\n\tsetThemeConfig(config);\n\timageDB.init();\n\treturn {\n\t\tassetsRoot: path.join(__dirname, '../assets'),\n\t\ttransformRules: [styleTransformRule, scriptTransformRule],\n\t\tlayout: layoutConfig,\n\t\tpageHandlers: [await markdownPageHandler()],\n\t\thooks: {\n\t\t\t'config:after': [initCodeblockStyle],\n\t\t\t'scan:after': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\tupdateCategoryPage,\n\t\t\t\tupdateTagPage,\n\t\t\t\tinit404Page,\n\t\t\t\tinitPagefind,\n\t\t\t\tinitSitemap,\n\t\t\t\tinitFeed,\n\t\t\t],\n\t\t\t'asset:add': [imageAddHook],\n\t\t\t'asset:update': [imageUpdateHook],\n\t\t\t'asset:remove': [imageRemoveHook],\n\t\t\t'build:before:assets-virtual': [\n\t\t\t\tsetupCodeblockStyle,\n\t\t\t\tbuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t],\n\t\t\t'build:after': [stopPagefind, exeIndexNow],\n\t\t\t'article:add': [updateHomePage, updateArchivePage],\n\t\t\t'article:update': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\taddPage,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:remove': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\trebuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:build:after': [addPage, updateFeedItem],\n\t\t\t'page:update': [addPage, updateSitemap],\n\t\t\t'page:remove': [rebuildPagefind, updateSitemap],\n\t\t\t'page:build:after': [addPage],\n\t\t\t'category:add': [updateCategoryPage],\n\t\t\t'category:update': [updateCategoryPage, updateFeedCategory],\n\t\t\t'category:remove': [updateCategoryPage, updateFeedCategory],\n\t\t\t'tag:add': [updateTagPage],\n\t\t\t'tag:update': [updateTagPage],\n\t\t\t'tag:remove': [updateTagPage],\n\t\t\t'preview:stop': [stopPagefind],\n\t\t},\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["config: ThemeConfig","config","author: Author","feed: Feed","assets: { rss: FeedAsset; atom: FeedAsset; feed: FeedAsset }","VirtualAssets","#type","feed","theme","Feed","Article","Category","assets","item","image","URL","item: Item","dir: string | undefined","path","dir","sharp","VirtualAssets","URL","asset","#filepath","#ext","#optimizedPath","fs","db: DB.Database","statements: Record<'get' | 'update' | 'delete', DB.Statement>","path","DB","asset","color: string | null","Vibrant","metadata: ImageMetadata","path","logger","Logger","asset","ext","fs","assets","logger","Logger","urls: string[]","Article","Page","IndexNow","SEARCH_ENGINES","context: Context","layoutConfig: LayoutConfig","path","path","cleaner","CleanCSS","VirtualAssets","Cache","#baseCache","asset: CodeblockStyle","asset","ModelOperations","shiki: HighlighterGeneric<BundledLanguage, BundledTheme>","shikiClassName: string[]","transformers: ShikiTransformer[]","shiki","theme","utils","result: string[]","name","$","origin","plugins","render","indented: CommonPlugin<'block', CodeblockParsed>","fenced: CommonPlugin<'block', CodeblockParsed>","PATTERN_START","utils","fold: CommonPlugin<'block', FoldParsed>","source","$","utils","render: RendererPlugin<'inline', LinkParsed>","$","ast: ASTPlugin<'inline', LinkNode>","LinkNode","ParsedNode","source: CommonPlugin<'block', SourceParsed>","contents: string[]","id: [string, string][]","indentState: boolean | null","source","utils","$","URL","html: string[]","mime","blockRender: RendererPlugin<'block', ImageParsed>","block: ASTPlugin<'inline', ParsedNode>","Paragraph","ImageNode","image","ParsedNode","inline: ASTPlugin<'inline', ImageNode>","node","utils","kbd: CommonPlugin<'inline', KbdParsed>","source","$","utils","link: ASTPlugin<'inline', LinkNode>","LinkNode","node","$","URL","utils","links: CommonPlugin<'block', LinksParsed>","source","matched","$","links","html: string[]","URL","PATTERN_START","utils","NOTE_TITLE: Record<string, string>","note: CommonPlugin<'block', NoteParsed>","source","$","utils","plugins","table: typeof origin","$","source","utils","tabs: CommonPlugin<'block', TabsParsed, number>","source","children: TabsParsed['children']","id: TabsParsed['id']","content","inline: CommonPlugin<'inline', TexParsed>","source","tex","logger","block: CommonPlugin<'block', TexParsed>","logger","Logger","EzalMarkdown","setext: CommonPlugin<'block'>","plugins","fs","config","VirtualPage","indexPage: ArchivePage","getArticles","Article","VirtualPage","scanned","createPage","data: CategoryPageData","VirtualPage","scanned","Category","pages: HomePage[]","index","Article","createPage","data: HomePageData","VirtualPage","scanned","data: TagPageData","VirtualPage","Tag","Logger","index: pagefind.PagefindIndex","VirtualAssets","path","asset","Article","errors: string[]","Page","img","URL","VirtualAssets","SitemapStream","Article","Page","asset: Sitemap","scriptTransformRule: TransformRule","path","src","STYLE_CONFIGS: Record<string, () => any>","CleanCSS","styleTransformRule: TransformRule","fs","renderer","path","config","path"],"sources":["../src/config.ts","../src/utils.ts","../src/feed.ts","../src/image/utils.ts","../src/image/asset.ts","../src/image/db.ts","../src/image/metadata.ts","../src/image/index.ts","../src/index-now.ts","../src/layout.ts","../src/markdown/codeblock/data.ts","../src/markdown/codeblock/style.ts","../src/markdown/codeblock/index.ts","../src/markdown/fold.ts","../src/markdown/footnote.ts","../src/markdown/image.ts","../src/markdown/kbd.ts","../src/markdown/link.ts","../src/markdown/links.ts","../src/markdown/note.ts","../src/markdown/table.ts","../src/markdown/tabs.ts","../src/markdown/tex.ts","../src/markdown/index.ts","../src/page/404.ts","../src/page/archive.ts","../src/page/category.ts","../src/page/home.ts","../src/page/tag.ts","../src/pagefind.ts","../src/sitemap.ts","../src/transform/script.ts","../src/transform/stylus.ts","../src/index.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport type { ArrayOr } from 'ezal';\nimport type { TokenizeOptions } from 'ezal-markdown';\nimport type { RawTheme } from 'shiki';\n\nexport interface NavItem {\n\tname: string;\n\tlink: string;\n}\n\nexport interface Contact {\n\turl: string;\n\tname: string;\n\ticon: string;\n\tcolor: string;\n}\n\nexport interface Link {\n\tname: string;\n\tdescription: string;\n\tlink: string;\n\tavatar: string;\n\tcolor: string;\n}\n\nexport interface LinkGroup {\n\ttitle: string;\n\tdescription: string;\n\titems: Link[];\n}\n\nexport type LinkPageStyles =\n\t| 'image'\n\t| 'table'\n\t| 'heading'\n\t| 'list'\n\t| 'footnote'\n\t| 'tabs'\n\t| 'note'\n\t| 'fold'\n\t| 'kbd';\n\nexport interface ThemeConfig {\n\t/** 导航栏 */\n\tnav?: NavItem[];\n\t/** 站点图标 */\n\tfavicon?: ArrayOr<string>;\n\t/** 主题色 */\n\tcolor?: {\n\t\t/** @default '#006000' */\n\t\tlight?: string;\n\t\t/** @default '#00BB00' */\n\t\tdark?: string;\n\t};\n\t/** 建站时间 */\n\tsince?: Temporal.ZonedDateTime;\n\t/** 联系方式 */\n\tcontact?: Contact[];\n\t/** 友情链接 */\n\tlinks?: LinkGroup[];\n\t/**\n\t * 友情链接页面启用的样式\n\t * @default 全部启用\n\t */\n\tlinkPageStyles?: LinkPageStyles[];\n\t/** Markdown 配置 */\n\tmarkdown?: {\n\t\t/**\n\t\t * 换行规则\n\t\t * @description\n\t\t * - `common-mark`:CommonMark 规范,行尾 2+ 空格渲染为换行\n\t\t * - `soft`:软换行,换行符 `\\n` 渲染为换行\n\t\t * @default `common-mark`\n\t\t */\n\t\tlineBreak?: TokenizeOptions['lineBreak'];\n\t\t/**\n\t\t * 代码块主题\n\t\t * @default {light:'light-plus',dark:'dark-plus'}\n\t\t */\n\t\tcodeBlockTheme?: { light: RawTheme; dark: RawTheme };\n\t};\n\t/** 主页设置 */\n\thome?: {\n\t\t/**\n\t\t * 每页文章数量\n\t\t * @default 10\n\t\t */\n\t\tarticlesPrePage?: number;\n\t\tlogo?: {\n\t\t\tviewBox: string;\n\t\t\tg: string;\n\t\t};\n\t\tslogan?: string;\n\t};\n\timageCache?: {\n\t\t/**\n\t\t * 图像元数据缓存路径\n\t\t * @description\n\t\t * 支持绝对路径和相对路径,相对路径将以工作目录为起点。\n\t\t * 默认为工作目录下 `image-metadata.sqlite`。\n\t\t */\n\t\tmetadata?: string;\n\t\t/**\n\t\t * 优化版图像缓存路径\n\t\t * @description\n\t\t * 支持绝对路径和相对路径,相对路径将以工作目录为起点。\n\t\t * 默认为工作目录下 `cache`。\n\t\t */\n\t\toptimized?: string;\n\t};\n\tcdn?: {\n\t\t/** @default 'https://unpkg.com/katex@0.16.21/dist/katex.min.css' */\n\t\tkatex?: string;\n\t\t/** @default 'https://unpkg.com/@waline/client@v3/dist/waline.css' */\n\t\twalineCSS?: string;\n\t\t/** @default 'https://unpkg.com/@waline/client@v3/dist/waline.js' */\n\t\twalineJS?: string;\n\t};\n\t/** HTML 头部插入内容 */\n\tinject?: string;\n\t/** IndexNow 配置 */\n\tindexNow?: {\n\t\t/** Bing IndexNow 密钥 */\n\t\tbing?: string;\n\t\t/** Yandex IndexNow 密钥 */\n\t\tyandex?: string;\n\t};\n\t/** Waline 评论配置 */\n\twaline?: {\n\t\t/** 后端地址 */\n\t\tserverURL: string;\n\t\tvisitor?: boolean;\n\t\tcommentCount?: boolean;\n\t\tpageview?: boolean;\n\t\temoji?: string[];\n\t\treaction?: string[];\n\t};\n}\n\nlet config: ThemeConfig;\n\nexport function setThemeConfig(cfg?: ThemeConfig) {\n\tconfig = cfg ?? {};\n}\n\nexport function getThemeConfig() {\n\treturn config;\n}\n","import type { Article } from 'ezal';\n\nexport function compareByDate(a: Article, b: Article): number {\n\treturn b.date.epochMilliseconds - a.date.epochMilliseconds;\n}\n","import { Article, Category, getConfig, URL, VirtualAssets } from 'ezal';\nimport { type Author, Feed, type Item } from 'feed';\nimport { getThemeConfig } from './config';\nimport { compareByDate } from './utils';\n\nconst FEED_TYPE_URL = {\n\trss: '/rss.xml',\n\tatom: '/atom.xml',\n\tfeed: '/feed.json',\n} as const;\n\nlet author: Author;\nlet feed: Feed;\nlet assets: { rss: FeedAsset; atom: FeedAsset; feed: FeedAsset };\n\nclass FeedAsset extends VirtualAssets {\n\t#type: 'rss' | 'atom' | 'feed';\n\tconstructor(type: 'rss' | 'atom' | 'feed') {\n\t\tsuper(FEED_TYPE_URL[type]);\n\t\tthis.#type = type;\n\t}\n\tbuild() {\n\t\tswitch (this.#type) {\n\t\t\tcase 'rss':\n\t\t\t\treturn feed.rss2();\n\t\t\tcase 'atom':\n\t\t\t\treturn feed.atom1();\n\t\t\tcase 'feed':\n\t\t\t\treturn feed.json1();\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\nexport function initFeed() {\n\tconst { site } = getConfig();\n\tconst theme = getThemeConfig();\n\tconst since = theme.since?.year;\n\tauthor = { name: site.author, link: site.domain };\n\tfeed = new Feed({\n\t\ttitle: site.title,\n\t\tdescription: site.description,\n\t\tid: site.domain,\n\t\tlanguage: site.language,\n\t\tfavicon: theme.favicon?.[0],\n\t\tcopyright: `© ${since ? `${since}-` : ''}${new Date().getFullYear()} ${site.author}`,\n\t\tauthor,\n\t\tupdated: new Date(),\n\t\tfeedLinks: {\n\t\t\trss: `${site.domain}/rss.xml`,\n\t\t\tatom: `${site.domain}/atom.xml`,\n\t\t\tjson: `${site.domain}/feed.json`,\n\t\t},\n\t});\n\tassets = {\n\t\trss: new FeedAsset('rss'),\n\t\tatom: new FeedAsset('atom'),\n\t\tfeed: new FeedAsset('feed'),\n\t};\n\tfor (const article of Article.getAll().sort(compareByDate)) {\n\t\tupdateFeedItem(article);\n\t}\n\tfor (const category of Category.getAll()) {\n\t\tupdateFeedCategory(category);\n\t}\n}\n\nfunction refreshAsset() {\n\tif (!assets) return;\n\tassets.rss.invalidated();\n\tassets.atom.invalidated();\n\tassets.feed.invalidated();\n}\n\nexport function updateFeedItem(article: Article) {\n\tif (!feed) return;\n\tconst i = feed.items.findIndex((item) => item.id === article.id);\n\t// Delete\n\tif (article.destroyed) {\n\t\tif (i === -1) return;\n\t\tfeed.items.splice(i, 1);\n\t\treturn refreshAsset();\n\t}\n\t// Update\n\tconst { site } = getConfig();\n\tlet image = article.data?.cover\n\t\t? URL.resolve(article.url, article.data.cover)\n\t\t: undefined;\n\tif (image) image = site.domain + image;\n\tconst item: Item = {\n\t\ttitle: article.title,\n\t\tid: article.id,\n\t\tlink: site.domain + article.url,\n\t\tdescription: article.description,\n\t\tcontent: article.content,\n\t\tauthor: [author],\n\t\tdate: new Date(article.date.toInstant().epochMilliseconds),\n\t\timage,\n\t\tcategory: article.categories\n\t\t\t.values()\n\t\t\t.toArray()\n\t\t\t.map((category) => ({ name: category.path.join('/') })),\n\t};\n\tif (i === -1) feed.addItem(item);\n\telse feed.items[i] = item;\n\trefreshAsset();\n}\n\nexport function updateFeedCategory(category: Category) {\n\tif (!feed) return;\n\tconst name = category.path.join('/');\n\tconst i = feed.categories.indexOf(name);\n\t// Delete\n\tif (category.destroyed) {\n\t\tif (i === -1) return;\n\t\tfeed.categories.splice(i, 1);\n\t\treturn refreshAsset();\n\t}\n\t// Update\n\tif (i !== -1) return;\n\tfeed.addCategory(name);\n\trefreshAsset();\n}\n","import path from 'node:path';\nimport { getThemeConfig } from '../config';\n\nlet dir: string | undefined;\nfunction getCacheDir(): string {\n\tif (dir) return dir;\n\tdir = getThemeConfig().imageCache?.optimized ?? 'cache';\n\tif (!path.isAbsolute(dir)) dir = path.resolve(dir);\n\treturn dir;\n}\n\nexport function getOptimizedPath(filepath: string, ext: string): string {\n\tconst dir = getCacheDir();\n\tconst cachePath = path.relative(process.cwd(), filepath);\n\treturn `${path.join(dir, cachePath)}.opt${ext}`;\n}\n","import { createReadStream } from 'node:fs';\nimport { type Asset, fs, URL, VirtualAssets } from 'ezal';\nimport Sharp from 'sharp';\nimport { getOptimizedPath } from './utils';\n\nconst OPTIMIZE = {\n\t'.avif': (sharp) => sharp.avif().toBuffer(),\n\t'.webp': (sharp) => sharp.webp().toBuffer(),\n\t'.jxl': (sharp) => sharp.jxl().toBuffer(),\n\t'.jpg': (sharp) =>\n\t\tsharp\n\t\t\t.jpeg({\n\t\t\t\ttrellisQuantisation: true,\n\t\t\t\tovershootDeringing: true,\n\t\t\t\tprogressive: true,\n\t\t\t\toptimiseScans: true,\n\t\t\t})\n\t\t\t.toBuffer(),\n\t'.png': (sharp) =>\n\t\tsharp.png({ progressive: true, adaptiveFiltering: true }).toBuffer(),\n\t'.gif': (sharp) => sharp.gif().toBuffer(),\n} as const satisfies Record<string, (sharp: Sharp.Sharp) => Promise<Buffer>>;\n\nexport type OptimizedImageExt = keyof typeof OPTIMIZE;\n\nexport class OptimizedImage extends VirtualAssets {\n\t#optimizedPath: string;\n\t#filepath: string;\n\t#ext: OptimizedImageExt;\n\t/**\n\t * @param asset 源资源\n\t * @param target 目标优化格式\n\t */\n\tconstructor(asset: Asset, ext: OptimizedImageExt) {\n\t\tsuper(URL.extname(asset.url, `.opt${ext}`));\n\t\tthis.#filepath = asset.filepath;\n\t\tthis.#ext = ext;\n\t\tthis.#optimizedPath = getOptimizedPath(this.#filepath, ext);\n\t}\n\tasync build() {\n\t\tif (await fs.isFile(this.#optimizedPath)) {\n\t\t\treturn createReadStream(this.#optimizedPath);\n\t\t}\n\t\tconst sharp = Sharp(this.#filepath);\n\t\tconst buffer = await OPTIMIZE[this.#ext](sharp);\n\t\tfs.writeFile(this.#optimizedPath, buffer);\n\t\treturn buffer;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n","import path from 'node:path';\nimport DB from 'better-sqlite3';\nimport { getThemeConfig } from '../config';\n\nexport interface ImageMetadata {\n\tpath: string;\n\thash: string;\n\twidth: number;\n\theight: number;\n\tcolor: string | null;\n}\n\nlet db: DB.Database;\nlet statements: Record<'get' | 'update' | 'delete', DB.Statement>;\n\nfunction getMetadata(url: string): ImageMetadata | null {\n\treturn statements.get.get(url) as ImageMetadata | null;\n}\n\nfunction updateMetadata(data: ImageMetadata): boolean {\n\treturn (\n\t\tstatements.update.run(\n\t\t\tdata.path,\n\t\t\tdata.hash,\n\t\t\tdata.width,\n\t\t\tdata.height,\n\t\t\tdata.color,\n\t\t).changes !== 0\n\t);\n}\n\nfunction deleteMetadata(url: string): boolean {\n\treturn statements.delete.run(url).changes !== 0;\n}\n\nfunction initImageMetadataDB() {\n\tlet filename =\n\t\tgetThemeConfig().imageCache?.metadata ?? 'image-metadata.sqlite';\n\tif (!path.isAbsolute(filename)) filename = path.resolve(filename);\n\tdb = new DB(filename);\n\tdb.exec(`CREATE TABLE IF NOT EXISTS image_metadata (\n\t\tpath TEXT PRIMARY KEY,\n\t\thash TEXT NOT NULL,\n\t\twidth INTEGER NOT NULL,\n\t\theight INTEGER NOT NULL,\n\t\tcolor TEXT(8)\n\t)`);\n\tstatements = {\n\t\tget: db.prepare('SELECT * FROM image_metadata WHERE path = ?'),\n\t\tdelete: db.prepare('DELETE FROM image_metadata WHERE path = ?'),\n\t\tupdate: db.prepare(`INSERT OR REPLACE INTO image_metadata\n\t\t\t(path, hash, width, height, color)\n\t\t\tVALUES (?, ?, ?, ?, ?)\n\t\t`),\n\t};\n}\n\nexport const imageDB = {\n\tinit: initImageMetadataDB,\n\tget: getMetadata,\n\tupdate: updateMetadata,\n\tdelete: deleteMetadata,\n};\n","import { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport type { Asset } from 'ezal';\nimport { Vibrant } from 'node-vibrant/node';\nimport Sharp from 'sharp';\nimport { type ImageMetadata, imageDB } from './db';\n\nexport async function updateImageMetadata(asset: Asset): Promise<boolean> {\n\tconst buffer = await readFile(asset.filepath);\n\t// Hash\n\tconst hash = createHash('sha256').update(buffer).digest('hex');\n\t// Check\n\tif (imageDB.get(asset.url)?.hash === hash) return false;\n\t// Size\n\tconst sharp = Sharp(buffer);\n\tconst { width, height, format } = await sharp.metadata();\n\t// Color\n\tlet color: string | null = null;\n\tif (format !== 'svg') {\n\t\ttry {\n\t\t\tconst palette = await Vibrant.from(buffer).getPalette();\n\t\t\tcolor = palette.Muted?.hex ?? null;\n\t\t} catch {}\n\t}\n\t// Update\n\tconst metadata: ImageMetadata = {\n\t\tpath: asset.url,\n\t\thash,\n\t\twidth,\n\t\theight,\n\t\tcolor,\n\t};\n\timageDB.update(metadata);\n\treturn true;\n}\n","import path from 'node:path/posix';\nimport { type Asset, fs, Logger } from 'ezal';\nimport { OptimizedImage, type OptimizedImageExt } from './asset';\nimport { type ImageMetadata, imageDB } from './db';\nimport { updateImageMetadata } from './metadata';\nimport { getOptimizedPath } from './utils';\n\nexport interface ImageInfo {\n\tmetadata: ImageMetadata | null;\n\trule?: string[];\n}\n\nconst INFO = {\n\tADD: 'Add image file:',\n\tUPDATE: 'Update image file:',\n\tREMOVE: 'Remove image file:',\n\tOPTIMIZE: (path: string) =>\n\t\t`The image \"${path}\" will be generated in this format:`,\n} as const;\nconst ERR = {\n\tMETADATA: (path: string) => `Unable to update metadata for \"${path}\"`,\n} as const;\n\nconst SUPPORT_EXTS = new Set<string>([\n\t'.jpeg',\n\t'.jpg',\n\t'.png',\n\t'.gif',\n\t'.webp',\n\t'.svg',\n\t'.tiff',\n\t'.tif',\n\t'.avif',\n\t'.heif',\n\t'.jxl',\n]);\n\nconst OPTIMIZE_RULES = new Map<string, OptimizedImageExt[]>([\n\t['.jpeg', ['.avif', '.webp', '.jxl', '.jpg']],\n\t['.jpg', ['.avif', '.webp', '.jpg']],\n\t['.png', ['.avif', '.webp', '.png']],\n\t['.webp', ['.avif', '.webp', '.png']],\n\t['.avif', ['.avif', '.webp', '.png']],\n]);\n\nconst logger = new Logger('theme:image');\n\nconst assetsMap = new Map<string, OptimizedImage[]>();\n\nexport function getImageInfo(url: string): ImageInfo | null {\n\tconst ext = path.extname(url).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return null;\n\tconst metadata = imageDB.get(url);\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\treturn { metadata, rule };\n}\n\nasync function cleanOptimized(asset: Asset) {\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\tif (!rule) return;\n\tawait Promise.all(\n\t\trule\n\t\t\t.map((ext) => getOptimizedPath(asset.filepath, ext))\n\t\t\t.map((filepath) => fs.remove(filepath)),\n\t);\n}\n\nexport async function imageAddHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.ADD, asset.filepath);\n\tlet updated = false;\n\t// Metadata\n\ttry {\n\t\tupdated = await updateImageMetadata(asset);\n\t} catch (error) {\n\t\tlogger.error(ERR.METADATA(asset.filepath), error);\n\t}\n\t// Asset\n\tif (updated) await cleanOptimized(asset);\n\tconst rule = OPTIMIZE_RULES.get(ext);\n\tif (!rule) return;\n\tlogger.debug(INFO.OPTIMIZE(asset.filepath), rule);\n\tconst assets = rule\n\t\t.map<OptimizedImage | null>((ext) => {\n\t\t\ttry {\n\t\t\t\treturn new OptimizedImage(asset, ext);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn(error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t})\n\t\t.filter((v) => v) as OptimizedImage[];\n\tassetsMap.set(asset.url, assets);\n}\n\nexport async function imageUpdateHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.UPDATE, asset.filepath);\n\tlet updated = false;\n\t// Metadata\n\ttry {\n\t\tupdated = await updateImageMetadata(asset);\n\t} catch (error) {\n\t\tlogger.error(ERR.METADATA(asset.filepath), error);\n\t}\n\t// Asset\n\tif (updated) await cleanOptimized(asset);\n\tconst assets = assetsMap.get(asset.url);\n\tif (!assets) return;\n\tfor (const asset of assets) {\n\t\tasset.invalidated();\n\t}\n}\n\nexport function imageRemoveHook(asset: Asset) {\n\tif (asset.level !== 'user') return;\n\tconst ext = path.extname(asset.filepath).toLowerCase();\n\tif (!SUPPORT_EXTS.has(ext)) return;\n\tlogger.debug(INFO.REMOVE, asset.filepath);\n\timageDB.delete(asset.filepath);\n\tconst assets = assetsMap.get(asset.url);\n\tif (!assets) return;\n\tassetsMap.delete(asset.url);\n\tfor (const asset of assets) {\n\t\tasset.destroy();\n\t}\n}\n","import { Article, getConfig, Logger, Page } from 'ezal';\nimport IndexNow, { SEARCH_ENGINES } from 'indexnow';\nimport { getThemeConfig } from './config';\n\nconst logger = new Logger('theme:index-now');\n\nexport async function exeIndexNow() {\n\tconst { site } = getConfig();\n\tconst { indexNow } = getThemeConfig();\n\tif (!indexNow) return;\n\n\tlogger.log('Collecting data...');\n\tconst urls: string[] = [];\n\tfor (const article of Article.getAll()) {\n\t\tif (article.data?.robots === false) continue;\n\t\turls.push(site.domain + article.url);\n\t}\n\tfor (const page of Page.getAll()) {\n\t\tif (!page.data?.robots) continue;\n\t\turls.push(site.domain + page.url);\n\t}\n\n\tif (indexNow.bing) {\n\t\tlogger.log('Submitting urls to Bing...');\n\t\tconst bing = new IndexNow(SEARCH_ENGINES.BING, indexNow.bing);\n\t\tawait bing.submitUrls(site.domain, urls);\n\t}\n\n\tif (indexNow.yandex) {\n\t\tlogger.log('Submitting urls to Yandex...');\n\t\tconst bing = new IndexNow(SEARCH_ENGINES.YANDEX, indexNow.yandex);\n\t\tawait bing.submitUrls(site.domain, urls);\n\t}\n\n\tlogger.log('Finished');\n}\n","import path from 'node:path';\nimport {\n\ttype LayoutRenderer as EzalLayoutRenderer,\n\tgetConfig,\n\ttype LayoutCompiled,\n\ttype LayoutConfig,\n\tnormalizeError,\n\ttype PromiseOr,\n} from 'ezal';\nimport { compile, type LayoutRenderer } from 'ezal-layout';\nimport mime from 'mime-types';\nimport type { Context } from '../layouts/context';\nimport { getThemeConfig } from './config';\nimport { getImageInfo } from './image';\nimport { compareByDate } from './utils';\n\nconst EXTERNAL_MODULES = Object.fromEntries(\n\t['mime-types', 'ezal', '@js-temporal/polyfill'].map<[string, any]>((name) => [\n\t\tname,\n\t\trequire(name),\n\t]),\n);\n\nfunction createRenderer(template: LayoutRenderer) {\n\treturn (page: Context['page']): PromiseOr<string | Error> => {\n\t\tconst { site } = getConfig();\n\t\tconst theme = getThemeConfig();\n\t\tconst context: Context = {\n\t\t\tpage,\n\t\t\tsite,\n\t\t\ttheme,\n\t\t\tgetImageInfo,\n\t\t\tmime,\n\t\t\tcompareByDate,\n\t\t};\n\t\ttry {\n\t\t\treturn template(context);\n\t\t} catch (error) {\n\t\t\treturn normalizeError(error);\n\t\t}\n\t};\n}\n\nasync function compiler(src: string): Promise<LayoutCompiled | Error> {\n\ttry {\n\t\tconst { renderer: template, dependencies } = await compile(\n\t\t\tsrc,\n\t\t\tEXTERNAL_MODULES,\n\t\t);\n\t\treturn {\n\t\t\trenderer: createRenderer(template) as EzalLayoutRenderer,\n\t\t\tdependencies,\n\t\t};\n\t} catch (error) {\n\t\treturn normalizeError(error);\n\t}\n}\n\nexport const layoutConfig: LayoutConfig = {\n\troot: path.join(__dirname, '../layouts'),\n\tcompiler,\n};\n","export const LANGUAGE_MAP = new Map([\n\t['markup', 'Markup'],\n\t['html', 'HTML'],\n\t['xml', 'XML'],\n\t['svg', 'SVG'],\n\t['mathml', 'MathML'],\n\t['ssml', 'SSML'],\n\t['atom', 'Atom'],\n\t['rss', 'RSS'],\n\t['css', 'CSS'],\n\t['clike', 'C-like'],\n\t['javascript', 'JavaScript'],\n\t['js', 'JavaScript'],\n\t['abap', 'ABAP'],\n\t['abnf', 'ABNF'],\n\t['actionscript', 'ActionScript'],\n\t['ada', 'Ada'],\n\t['agda', 'Agda'],\n\t['al', 'AL'],\n\t['antlr4', 'ANTLR4'],\n\t['g4', 'ANTLR4'],\n\t['apacheconf', 'Apache Configuration'],\n\t['apex', 'Apex'],\n\t['apl', 'APL'],\n\t['applescript', 'AppleScript'],\n\t['aql', 'AQL'],\n\t['arduino', 'Arduino'],\n\t['ino', 'Arduino'],\n\t['arff', 'ARFF'],\n\t['armasm', 'ARM Assembly'],\n\t['arm-asm', 'ARM Assembly'],\n\t['arturo', 'Arturo'],\n\t['art', 'Arturo'],\n\t['asciidoc', 'AsciiDoc'],\n\t['adoc', 'AsciiDoc'],\n\t['aspnet', 'ASP.NET (C#)'],\n\t['asm6502', '6502 Assembly'],\n\t['asmatmel', 'Atmel AVR Assembly'],\n\t['autohotkey', 'AutoHotkey'],\n\t['autoit', 'AutoIt'],\n\t['avisynth', 'AviSynth'],\n\t['avs', 'AviSynth'],\n\t['avro-idl', 'Avro IDL'],\n\t['avdl', 'Avro IDL'],\n\t['awk', 'AWK'],\n\t['gawk', 'AWK'],\n\t['bash', 'Bash'],\n\t['sh', 'Bash'],\n\t['shell', 'Bash'],\n\t['basic', 'BASIC'],\n\t['batch', 'Batch'],\n\t['bbcode', 'BBcode'],\n\t['shortcode', 'BBcode'],\n\t['bbj', 'BBj'],\n\t['bicep', 'Bicep'],\n\t['birb', 'Birb'],\n\t['bison', 'Bison'],\n\t['bnf', 'BNF'],\n\t['rbnf', 'BNF'],\n\t['bqn', 'BQN'],\n\t['brainfuck', 'Brainfuck'],\n\t['brightscript', 'BrightScript'],\n\t['bro', 'Bro'],\n\t['bsl', 'BSL (1C:Enterprise)'],\n\t['oscript', 'BSL (1C:Enterprise)'],\n\t['c', 'C'],\n\t['csharp', 'C#'],\n\t['cs', 'C#'],\n\t['dotnet', 'C#'],\n\t['cpp', 'C++'],\n\t['cfscript', 'CFScript'],\n\t['cfc', 'CFScript'],\n\t['chaiscript', 'ChaiScript'],\n\t['cil', 'CIL'],\n\t['cilkc', 'Cilk/C'],\n\t['cilk-c', 'Cilk/C'],\n\t['cilkcpp', 'Cilk/C++'],\n\t['cilk-cpp', 'Cilk/C++'],\n\t['cilk', 'Cilk/C++'],\n\t['clojure', 'Clojure'],\n\t['cmake', 'CMake'],\n\t['cobol', 'COBOL'],\n\t['coffeescript', 'CoffeeScript'],\n\t['coffee', 'CoffeeScript'],\n\t['concurnas', 'Concurnas'],\n\t['conc', 'Concurnas'],\n\t['csp', 'Content-Security-Policy'],\n\t['cooklang', 'Cooklang'],\n\t['coq', 'Coq'],\n\t['crystal', 'Crystal'],\n\t['css-extras', 'CSS Extras'],\n\t['csv', 'CSV'],\n\t['cue', 'CUE'],\n\t['cypher', 'Cypher'],\n\t['d', 'D'],\n\t['dart', 'Dart'],\n\t['dataweave', 'DataWeave'],\n\t['dax', 'DAX'],\n\t['dhall', 'Dhall'],\n\t['diff', 'Diff'],\n\t['django', 'Django/Jinja2'],\n\t['jinja2', 'Django/Jinja2'],\n\t['dns-zone-file', 'DNS zone file'],\n\t['dns-zone', 'DNS zone file'],\n\t['docker', 'Docker'],\n\t['dockerfile', 'Docker'],\n\t['dot', 'DOT (Graphviz)'],\n\t['gv', 'DOT (Graphviz)'],\n\t['ebnf', 'EBNF'],\n\t['editorconfig', 'EditorConfig'],\n\t['eiffel', 'Eiffel'],\n\t['ejs', 'EJS'],\n\t['eta', 'EJS'],\n\t['elixir', 'Elixir'],\n\t['elm', 'Elm'],\n\t['etlua', 'Embedded Lua templating'],\n\t['erb', 'ERB'],\n\t['erlang', 'Erlang'],\n\t['excel-formula', 'Excel Formula'],\n\t['xlsx', 'Excel Formula'],\n\t['xls', 'Excel Formula'],\n\t['fsharp', 'F#'],\n\t['factor', 'Factor'],\n\t['false', 'False'],\n\t['firestore-security-rules', 'Firestore security rules'],\n\t['flow', 'Flow'],\n\t['fortran', 'Fortran'],\n\t['ftl', 'FreeMarker Template Language'],\n\t['gml', 'GameMaker Language'],\n\t['gamemakerlanguage', 'GameMaker Language'],\n\t['gap', 'GAP (CAS)'],\n\t['gcode', 'G-code'],\n\t['gdscript', 'GDScript'],\n\t['gedcom', 'GEDCOM'],\n\t['gettext', 'gettext'],\n\t['po', 'gettext'],\n\t['gherkin', 'Gherkin'],\n\t['git', 'Git'],\n\t['glsl', 'GLSL'],\n\t['gn', 'GN'],\n\t['gni', 'GN'],\n\t['linker-script', 'GNU Linker Script'],\n\t['ld', 'GNU Linker Script'],\n\t['go', 'Go'],\n\t['go-module', 'Go module'],\n\t['go-mod', 'Go module'],\n\t['gradle', 'Gradle'],\n\t['graphql', 'GraphQL'],\n\t['groovy', 'Groovy'],\n\t['haml', 'Haml'],\n\t['handlebars', 'Handlebars'],\n\t['hbs', 'Handlebars'],\n\t['mustache', 'Handlebars'],\n\t['haskell', 'Haskell'],\n\t['hs', 'Haskell'],\n\t['haxe', 'Haxe'],\n\t['hcl', 'HCL'],\n\t['hlsl', 'HLSL'],\n\t['hoon', 'Hoon'],\n\t['http', 'HTTP'],\n\t['hpkp', 'HTTP Public-Key-Pins'],\n\t['hsts', 'HTTP Strict-Transport-Security'],\n\t['ichigojam', 'IchigoJam'],\n\t['icon', 'Icon'],\n\t['icu-message-format', 'ICU Message Format'],\n\t['idris', 'Idris'],\n\t['idr', 'Idris'],\n\t['ignore', '.ignore'],\n\t['gitignore', '.ignore'],\n\t['hgignore', '.ignore'],\n\t['npmignore', '.ignore'],\n\t['inform7', 'Inform 7'],\n\t['ini', 'Ini'],\n\t['io', 'Io'],\n\t['j', 'J'],\n\t['java', 'Java'],\n\t['javadoc', 'JavaDoc'],\n\t['javadoclike', 'JavaDoc-like'],\n\t['javastacktrace', 'Java stack trace'],\n\t['jexl', 'Jexl'],\n\t['jolie', 'Jolie'],\n\t['jq', 'JQ'],\n\t['jsdoc', 'JSDoc'],\n\t['js-extras', 'JS Extras'],\n\t['json', 'JSON'],\n\t['webmanifest', 'JSON'],\n\t['json5', 'JSON5'],\n\t['jsonp', 'JSONP'],\n\t['jsstacktrace', 'JS stack trace'],\n\t['js-templates', 'JS Templates'],\n\t['julia', 'Julia'],\n\t['keepalived', 'Keepalived Configure'],\n\t['keyman', 'Keyman'],\n\t['kotlin', 'Kotlin'],\n\t['kt', 'Kotlin'],\n\t['kts', 'Kotlin'],\n\t['kumir', 'KuMir (КуМир)'],\n\t['kum', 'KuMir (КуМир)'],\n\t['kusto', 'Kusto'],\n\t['latex', 'LaTeX'],\n\t['tex', 'LaTeX'],\n\t['context', 'LaTeX'],\n\t['latte', 'Latte'],\n\t['less', 'Less'],\n\t['lilypond', 'LilyPond'],\n\t['ly', 'LilyPond'],\n\t['liquid', 'Liquid'],\n\t['lisp', 'Lisp'],\n\t['emacs', 'Lisp'],\n\t['elisp', 'Lisp'],\n\t['emacs-lisp', 'Lisp'],\n\t['livescript', 'LiveScript'],\n\t['llvm', 'LLVM IR'],\n\t['log', 'Log file'],\n\t['lolcode', 'LOLCODE'],\n\t['lua', 'Lua'],\n\t['magma', 'Magma (CAS)'],\n\t['makefile', 'Makefile'],\n\t['markdown', 'Markdown'],\n\t['md', 'Markdown'],\n\t['markup-templating', 'Markup templating'],\n\t['mata', 'Mata'],\n\t['matlab', 'MATLAB'],\n\t['maxscript', 'MAXScript'],\n\t['mel', 'MEL'],\n\t['mermaid', 'Mermaid'],\n\t['metafont', 'METAFONT'],\n\t['mizar', 'Mizar'],\n\t['mongodb', 'MongoDB'],\n\t['monkey', 'Monkey'],\n\t['moonscript', 'MoonScript'],\n\t['moon', 'MoonScript'],\n\t['n1ql', 'N1QL'],\n\t['n4js', 'N4JS'],\n\t['n4jsd', 'N4JS'],\n\t['nand2tetris-hdl', 'Nand To Tetris HDL'],\n\t['naniscript', 'Naninovel Script'],\n\t['nani', 'Naninovel Script'],\n\t['nasm', 'NASM'],\n\t['neon', 'NEON'],\n\t['nevod', 'Nevod'],\n\t['nginx', 'nginx'],\n\t['nim', 'Nim'],\n\t['nix', 'Nix'],\n\t['nsis', 'NSIS'],\n\t['objectivec', 'Objective-C'],\n\t['objc', 'Objective-C'],\n\t['ocaml', 'OCaml'],\n\t['odin', 'Odin'],\n\t['opencl', 'OpenCL'],\n\t['openqasm', 'OpenQasm'],\n\t['qasm', 'OpenQasm'],\n\t['oz', 'Oz'],\n\t['parigp', 'PARI/GP'],\n\t['parser', 'Parser'],\n\t['pascal', 'Pascal'],\n\t['objectpascal', 'Pascal'],\n\t['pascaligo', 'Pascaligo'],\n\t['psl', 'PATROL Scripting Language'],\n\t['pcaxis', 'PC-Axis'],\n\t['px', 'PC-Axis'],\n\t['peoplecode', 'PeopleCode'],\n\t['pcode', 'PeopleCode'],\n\t['perl', 'Perl'],\n\t['php', 'PHP'],\n\t['phpdoc', 'PHPDoc'],\n\t['php-extras', 'PHP Extras'],\n\t['plant-uml', 'PlantUML'],\n\t['plantuml', 'PlantUML'],\n\t['plsql', 'PL/SQL'],\n\t['powerquery', 'PowerQuery'],\n\t['pq', 'PowerQuery'],\n\t['mscript', 'PowerQuery'],\n\t['powershell', 'PowerShell'],\n\t['processing', 'Processing'],\n\t['prolog', 'Prolog'],\n\t['promql', 'PromQL'],\n\t['properties', '.properties'],\n\t['protobuf', 'Protocol Buffers'],\n\t['pug', 'Pug'],\n\t['puppet', 'Puppet'],\n\t['pure', 'Pure'],\n\t['purebasic', 'PureBasic'],\n\t['pbfasm', 'PureBasic'],\n\t['purescript', 'PureScript'],\n\t['purs', 'PureScript'],\n\t['python', 'Python'],\n\t['py', 'Python'],\n\t['qsharp', 'Q#'],\n\t['qs', 'Q#'],\n\t['q', 'Q (kdb+ database)'],\n\t['qml', 'QML'],\n\t['qore', 'Qore'],\n\t['r', 'R'],\n\t['racket', 'Racket'],\n\t['rkt', 'Racket'],\n\t['cshtml', 'Razor C#'],\n\t['razor', 'Razor C#'],\n\t['jsx', 'React JSX'],\n\t['tsx', 'React TSX'],\n\t['reason', 'Reason'],\n\t['regex', 'Regex'],\n\t['rego', 'Rego'],\n\t['renpy', \"Ren'py\"],\n\t['rpy', \"Ren'py\"],\n\t['rescript', 'ReScript'],\n\t['res', 'ReScript'],\n\t['rest', 'reST (reStructuredText)'],\n\t['rip', 'Rip'],\n\t['roboconf', 'Roboconf'],\n\t['robotframework', 'Robot Framework'],\n\t['robot', 'Robot Framework'],\n\t['ruby', 'Ruby'],\n\t['rb', 'Ruby'],\n\t['rust', 'Rust'],\n\t['sas', 'SAS'],\n\t['sass', 'Sass (Sass)'],\n\t['scss', 'Sass (SCSS)'],\n\t['scala', 'Scala'],\n\t['scheme', 'Scheme'],\n\t['shell-session', 'Shell session'],\n\t['sh-session', 'Shell session'],\n\t['shellsession', 'Shell session'],\n\t['smali', 'Smali'],\n\t['smalltalk', 'Smalltalk'],\n\t['smarty', 'Smarty'],\n\t['sml', 'SML'],\n\t['smlnj', 'SML'],\n\t['solidity', 'Solidity (Ethereum)'],\n\t['sol', 'Solidity (Ethereum)'],\n\t['solution-file', 'Solution file'],\n\t['sln', 'Solution file'],\n\t['soy', 'Soy (Closure Template)'],\n\t['sparql', 'SPARQL'],\n\t['rq', 'SPARQL'],\n\t['splunk-spl', 'Splunk SPL'],\n\t['sqf', 'SQF: Status Quo Function (Arma 3)'],\n\t['sql', 'SQL'],\n\t['squirrel', 'Squirrel'],\n\t['stan', 'Stan'],\n\t['stata', 'Stata Ado'],\n\t['iecst', 'Structured Text (IEC 61131-3)'],\n\t['stylus', 'Stylus'],\n\t['supercollider', 'SuperCollider'],\n\t['sclang', 'SuperCollider'],\n\t['swift', 'Swift'],\n\t['systemd', 'Systemd configuration file'],\n\t['t4-templating', 'T4 templating'],\n\t['t4-cs', 'T4 Text Templates (C#)'],\n\t['t4', 'T4 Text Templates (C#)'],\n\t['t4-vb', 'T4 Text Templates (VB)'],\n\t['tap', 'TAP'],\n\t['tcl', 'Tcl'],\n\t['tt2', 'Template Toolkit 2'],\n\t['textile', 'Textile'],\n\t['toml', 'TOML'],\n\t['tremor', 'Tremor'],\n\t['trickle', 'Tremor'],\n\t['troy', 'Tremor'],\n\t['turtle', 'Turtle'],\n\t['trig', 'Turtle'],\n\t['twig', 'Twig'],\n\t['typescript', 'TypeScript'],\n\t['ts', 'TypeScript'],\n\t['typoscript', 'TypoScript'],\n\t['tsconfig', 'TypoScript'],\n\t['unrealscript', 'UnrealScript'],\n\t['uscript', 'UnrealScript'],\n\t['uc', 'UnrealScript'],\n\t['uorazor', 'UO Razor Script'],\n\t['uri', 'URI'],\n\t['url', 'URI'],\n\t['v', 'V'],\n\t['vala', 'Vala'],\n\t['vbnet', 'VB.Net'],\n\t['velocity', 'Velocity'],\n\t['verilog', 'Verilog'],\n\t['vhdl', 'VHDL'],\n\t['vim', 'vim'],\n\t['visual-basic', 'Visual Basic'],\n\t['vb', 'Visual Basic'],\n\t['vba', 'Visual Basic'],\n\t['warpscript', 'WarpScript'],\n\t['wasm', 'WebAssembly'],\n\t['web-idl', 'Web IDL'],\n\t['webidl', 'Web IDL'],\n\t['wgsl', 'WGSL'],\n\t['wiki', 'Wiki markup'],\n\t['wolfram', 'Wolfram language'],\n\t['mathematica', 'Wolfram language'],\n\t['nb', 'Wolfram language'],\n\t['wl', 'Wolfram language'],\n\t['wren', 'Wren'],\n\t['xeora', 'Xeora'],\n\t['xeoracube', 'Xeora'],\n\t['xml-doc', 'XML doc (.net)'],\n\t['xojo', 'Xojo (REALbasic)'],\n\t['xquery', 'XQuery'],\n\t['yaml', 'YAML'],\n\t['yml', 'YAML'],\n\t['yang', 'YANG'],\n\t['zig', 'Zig'],\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport CleanCSS from 'clean-css';\nimport { Cache, getMode, VirtualAssets } from 'ezal';\nimport stylus from 'stylus';\n\nconst base = path.join(__dirname, '../assets/styles/_code.styl');\n\nconst cleaner = new CleanCSS();\n\nclass CodeblockStyle extends VirtualAssets {\n\t#baseCache = new Cache<string>();\n\textra = '';\n\tconstructor() {\n\t\tsuper('/styles/code.css');\n\t\tsuper.updateDependencies([base]);\n\t}\n\tasync build() {\n\t\tlet cache = this.#baseCache.get();\n\t\tif (!cache) {\n\t\t\tconst file = await readFile(base, 'utf8');\n\t\t\tcache = stylus.render(file);\n\t\t\tthis.#baseCache.set(cache);\n\t\t}\n\t\tconst result = this.extra + cache;\n\t\tif (getMode() !== 'build') return result;\n\t\treturn cleaner.minify(result).styles;\n\t}\n\tprotected onDependenciesChanged() {\n\t\tsuper.invalidated();\n\t\tthis.#baseCache.clean();\n\t}\n}\n\nlet asset: CodeblockStyle;\nexport function updateStyles(css: string) {\n\tif (css === asset.extra) return;\n\tasset.extra = css;\n\tasset.invalidated();\n}\n\nexport function initCodeblockStyle() {\n\tasset = new CodeblockStyle();\n}\n","import { transformerColorizedBrackets } from '@shikijs/colorized-brackets';\nimport {\n\ttransformerNotationDiff,\n\ttransformerNotationErrorLevel,\n\ttransformerNotationFocus,\n\ttransformerNotationHighlight,\n\ttransformerNotationWordHighlight,\n\ttransformerStyleToClass,\n} from '@shikijs/transformers';\nimport { ModelOperations } from '@vscode/vscode-languagedetection';\nimport { getMode } from 'ezal';\nimport {\n\ttype CodeblockParsed,\n\ttype CommonPlugin,\n\ttype PluginContext,\n\tplugins,\n\tutils,\n} from 'ezal-markdown';\nimport {\n\ttype BundledLanguage,\n\ttype BundledTheme,\n\tcreateHighlighter,\n\ttype HighlighterGeneric,\n\ttype ShikiTransformer,\n} from 'shiki';\nimport { getThemeConfig } from '../../config';\nimport { LANGUAGE_MAP } from './data';\nimport { updateStyles } from './style';\n\nconst PATTERN_CLASS = /class=\"([A-Za-z0-9 -]+)\"/;\nconst PATTERN_EMPTY_LINE =\n\t/\\n<span class=\"line\">(<span class=\"mtk-\\d+\"><\\/span>)?<\\/span><\\/code><\\/pre>$/;\n\nconst modelOperations = new ModelOperations();\n\nasync function getLang(code: string, lang?: string): Promise<string> {\n\tif (lang) return lang;\n\tconst result = await modelOperations.runModel(code);\n\treturn result.toSorted((a, b) => b.confidence - a.confidence)[0].languageId;\n}\n\nlet shiki: HighlighterGeneric<BundledLanguage, BundledTheme>;\nconst shikiClassName: string[] = [];\nconst toClass = transformerStyleToClass({\n\tclassReplacer(name) {\n\t\tlet i = shikiClassName.indexOf(name);\n\t\tif (i === -1) {\n\t\t\ti = shikiClassName.length;\n\t\t\tshikiClassName.push(name);\n\t\t}\n\t\treturn `mtk-${i}`;\n\t},\n});\nconst transformers: ShikiTransformer[] = [\n\ttransformerNotationDiff(),\n\ttransformerNotationHighlight(),\n\ttransformerNotationWordHighlight(),\n\ttransformerNotationFocus(),\n\ttransformerNotationErrorLevel(),\n\ttransformerColorizedBrackets(),\n\ttoClass,\n];\n\nasync function highlighter(\n\tcode: string,\n\tlang?: string,\n): Promise<[html: string, lang: string]> {\n\tlang = await getLang(code, lang);\n\tlet loadedLanguage = lang;\n\ttry {\n\t\tawait shiki.loadLanguage(lang as any);\n\t} catch {\n\t\tloadedLanguage = 'plain';\n\t}\n\tconst theme = getThemeConfig().markdown?.codeBlockTheme;\n\tconst html = await shiki.codeToHtml(code, {\n\t\tlang: loadedLanguage,\n\t\tthemes: {\n\t\t\tlight: theme?.light.name ?? 'light-plus',\n\t\t\tdark: theme?.dark.name ?? 'dark-plus',\n\t\t},\n\t\ttransformers,\n\t});\n\tif (getMode() === 'serve') updateStyles(toClass.getCSS());\n\treturn [html, lang];\n}\n\nconst { $ } = utils;\n\nfunction packager(html: string, lang: string, extra: string): string {\n\tconst name = LANGUAGE_MAP.get(lang) ?? lang;\n\tlet mtk = '';\n\thtml = html\n\t\t.replace(PATTERN_CLASS, (_, className: string) => {\n\t\t\tconst classes = className.split(' ');\n\t\t\tconst result: string[] = ['shiki'];\n\t\t\tfor (const name of classes) {\n\t\t\t\tif (name.startsWith('has-')) result.push(name);\n\t\t\t\telse if (name.startsWith('mtk-')) mtk = name;\n\t\t\t}\n\t\t\treturn `class=\"${result.join(' ')}\"`;\n\t\t})\n\t\t.replace(PATTERN_EMPTY_LINE, '</code></pre>');\n\treturn $('figure', {\n\t\tclass: ['code', 'rounded', mtk],\n\t\thtml: [\n\t\t\t$('figcaption', {\n\t\t\t\tclass: ['sticky', 'rounded'],\n\t\t\t\thtml: [\n\t\t\t\t\t$('code', name),\n\t\t\t\t\textra,\n\t\t\t\t\t$('button', { class: ['link', 'icon-copy'], attr: { title: '复制代码' } }),\n\t\t\t\t],\n\t\t\t}),\n\t\t\thtml,\n\t\t],\n\t});\n}\n\nconst origin = plugins.codeblock();\n\nasync function render(\n\t{ code, lang, children }: CodeblockParsed,\n\t{ shared, counter }: PluginContext,\n): Promise<string> {\n\tcounter.count(code);\n\tshared.codeblock = true;\n\tconst result = await highlighter(code, lang);\n\treturn packager(result[0], result[1], children?.html ?? '');\n}\n\nconst indented: CommonPlugin<'block', CodeblockParsed> = {\n\t...origin.indentedCodeblock,\n\trender,\n};\n\nconst fenced: CommonPlugin<'block', CodeblockParsed> = {\n\t...origin.fencedCodeblock,\n\trender,\n};\n\nexport async function codeblock() {\n\tconst theme = getThemeConfig().markdown?.codeBlockTheme;\n\tshiki = await createHighlighter({\n\t\tthemes: theme ? [theme.light, theme.dark] : ['light-plus', 'dark-plus'],\n\t\tlangs: [],\n\t});\n\treturn { indented, fenced };\n}\n\nexport function setupCodeblockStyle() {\n\tupdateStyles(toClass.getCSS());\n}\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface FoldParsed extends Parsed {\n\tchildren: [summary: ParsedChild, details: ParsedChild];\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(\\+{3,}) {0,3}(\\S.*)\\n/;\n\nconst { $ } = utils;\n\nexport const fold: CommonPlugin<'block', FoldParsed> = {\n\tname: 'fold',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { md }) {\n\t\tconst matched = source.match(PATTERN_START);\n\t\tif (!matched) return;\n\t\tconst size = matched[1].length;\n\t\tconst summary = matched[2];\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}\\\\+{${size}}\\\\s*(\\\\n|$)`);\n\t\tconst endMatched = source.match(pattern);\n\t\tconst end = endMatched?.index ?? Infinity;\n\t\tconst rawEnd = end + (endMatched?.[0].length ?? 0);\n\t\tconst raw = source.slice(0, rawEnd);\n\t\tconst details = raw.slice(matched[0].length, end);\n\t\treturn {\n\t\t\traw,\n\t\t\tchildren: [md(summary, 'inline'), md(details, 'block')],\n\t\t};\n\t},\n\trender({ children: [summary, details] }) {\n\t\treturn $('details', {\n\t\t\tclass: 'rounded',\n\t\t\thtml: [\n\t\t\t\t$('summary', { class: ['rounded', 'sticky'], html: summary.html }),\n\t\t\t\t$('div', { class: 'sticky-content', html: details.html }),\n\t\t\t],\n\t\t});\n\t},\n};\n","import {\n\ttype ASTPlugin,\n\ttype CommonPlugin,\n\tLinkNode,\n\ttype Parsed,\n\ttype ParsedChild,\n\tParsedNode,\n\ttype RendererPlugin,\n\tutils,\n} from 'ezal-markdown';\n\ninterface LinkParsed extends Parsed {\n\tid: string;\n\tlabel: string;\n}\n\ninterface SourceParsed extends Parsed {\n\tchildren: ParsedChild[];\n\tid: [label: string, id: string][];\n}\n\nconst { eachLine, $ } = utils;\n\nconst PATTERN_SOURCE_START = /(?<=^|\\n)\\[\\^.*?\\]:/;\nconst PATTERN_SOURCE_BEGIN = /^\\[(.*?)\\]:/;\nconst PATTERN_SOURCE_INDENT = /^(\\t| {1,4})/;\n\nconst render: RendererPlugin<'inline', LinkParsed> = {\n\tname: 'footnote',\n\ttype: 'inline',\n\trender({ id, label }, { counter }) {\n\t\tcounter.count(label);\n\t\treturn $(\n\t\t\t'sup',\n\t\t\t$('a', {\n\t\t\t\tclass: 'footnote',\n\t\t\t\tattr: { href: id },\n\t\t\t\tcontent: label,\n\t\t\t}),\n\t\t);\n\t},\n};\n\nconst ast: ASTPlugin<'inline', LinkNode> = {\n\tname: 'footnote-ast',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: -1,\n\tparse(root) {\n\t\tfor (const child of root.entires().toArray()) {\n\t\t\tif (!(child instanceof LinkNode)) continue;\n\t\t\tif (child.label?.[0] !== '^') continue;\n\t\t\tif (child.raw?.length !== child.label.length + 2) continue;\n\t\t\tconst id = child.destination;\n\t\t\tconst label = child.raw.slice(2, -1);\n\t\t\tchild.before(\n\t\t\t\tnew ParsedNode('footnote', 'inline', { id, label } as LinkParsed),\n\t\t\t);\n\t\t\tchild.remove();\n\t\t}\n\t},\n\tverifyNode: (_): _ is LinkNode => false,\n\trender: () => '',\n};\n\nconst source: CommonPlugin<'block', SourceParsed> = {\n\tname: 'footnote-source',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_SOURCE_START,\n\tparse(source, { anchors, refMap, md }) {\n\t\tconst contents: string[] = [];\n\t\tconst id: [string, string][] = [];\n\t\tlet current = '';\n\t\tlet raw = '';\n\t\tlet indentState: boolean | null = null;\n\t\tfor (const [line] of eachLine(source)) {\n\t\t\tconst matched = line.match(PATTERN_SOURCE_BEGIN);\n\t\t\t// 首行\n\t\t\tif (matched) {\n\t\t\t\tif (matched[1][0] !== '^') break;\n\t\t\t\tif (raw) contents.push(current);\n\t\t\t\tconst label = matched[1].slice(1);\n\t\t\t\tconst hash = anchors.register(label);\n\t\t\t\tid.push([label, hash]);\n\t\t\t\trefMap.set(matched[1], { destination: `#${hash}` });\n\t\t\t\tcurrent = line.slice(matched[0].length);\n\t\t\t\traw += line;\n\t\t\t\tindentState = null;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// 懒续行\n\t\t\tconst indent = PATTERN_SOURCE_INDENT.test(line);\n\t\t\tconst empty = line.trim().length === 0;\n\t\t\t// 第二行设置缩进状态:若第二行为空则后续必须缩进\n\t\t\tif (indentState === null) indentState = indent || empty;\n\t\t\t// 若无需缩进或之前存在无缩进行,且当前行为空行则结束\n\t\t\tif (!indentState && empty) break;\n\t\t\t// 若需要缩进而为缩进则结束\n\t\t\tif (indentState && !indent) break;\n\t\t\t// 若不为空行且未缩进则设置为无缩进\n\t\t\tif (!(empty || indent)) indentState = false;\n\t\t\tcurrent += line;\n\t\t\traw += line;\n\t\t}\n\t\tif (id.length !== contents.length) contents.push(current);\n\t\tconst children = contents.map((content) =>\n\t\t\tmd(content, { skipParagraphWrapping: true, maxLevel: 'block' }),\n\t\t);\n\t\treturn { raw, id, children };\n\t},\n\trender({ id, children }, { counter }) {\n\t\tfor (const [label] of id) {\n\t\t\tcounter.count(label);\n\t\t}\n\t\tfor (const child of children) {\n\t\t\tcounter.count(child.raw);\n\t\t}\n\t\treturn $(\n\t\t\t'dl',\n\t\t\tchildren.flatMap((child, i) => [\n\t\t\t\t$('dt', { content: id[i][0], id: id[i][1] }),\n\t\t\t\t$('dd', child.html),\n\t\t\t]),\n\t\t);\n\t},\n};\n\nexport const footnote = { source, ast, render };\n","import { escapeHTML, type Page, URL } from 'ezal';\nimport {\n\ttype ASTPlugin,\n\tImageNode,\n\tParagraph,\n\ttype Parsed,\n\tParsedNode,\n\ttype RendererPlugin,\n\tutils,\n} from 'ezal-markdown';\nimport mime from 'mime-types';\nimport { getImageInfo, type ImageInfo } from '../image';\n\nconst { $ } = utils;\n\nfunction img(\n\tinfo: ImageInfo | null,\n\tsrc: string,\n\talt: string,\n\ttitle?: string,\n): string {\n\treturn $('img', {\n\t\tattr: {\n\t\t\tsrc: URL.for(src),\n\t\t\talt,\n\t\t\twidth: info?.metadata?.width,\n\t\t\theight: info?.metadata?.height,\n\t\t\tloading: 'lazy',\n\t\t\ttitle,\n\t\t},\n\t\tstyle: { $imgColor: info?.metadata?.color },\n\t});\n}\n\ninterface ImageParsed extends Parsed {\n\ttitle?: string;\n\talt: string;\n\turl: string;\n}\n\nfunction renderImage(\n\turl: string,\n\talt: string,\n\ttitle: string | undefined,\n\tpage: Page,\n): string {\n\tconst info = getImageInfo(URL.resolve(page.url, url));\n\tif (!info?.rule) return img(info, url, alt, title);\n\tconst html: string[] = info.rule.slice(0, -1).map((ext) =>\n\t\t$('source', {\n\t\t\tattr: { srcset: URL.extname(url, `.opt${ext}`), type: mime.lookup(ext) },\n\t\t}),\n\t);\n\thtml.push(img(info, URL.extname(url, info.rule.at(-1)!), alt, title));\n\treturn $('picture', html);\n}\n\nconst blockRender: RendererPlugin<'block', ImageParsed> = {\n\tname: 'image',\n\ttype: 'block',\n\trender({ title, url, alt }, { shared, counter }) {\n\t\tconst page = shared.page as any as Page;\n\t\tconst html: string[] = [renderImage(url, alt, title, page)];\n\t\thtml.push($('figcaption', { content: alt }));\n\t\tcounter.count(alt);\n\t\treturn $('figure', { class: 'image', html });\n\t},\n};\n\nconst block: ASTPlugin<'inline', ParsedNode> = {\n\tname: 'image-post',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: -1,\n\tparse(root) {\n\t\tif (!(root instanceof Paragraph)) return;\n\t\tif (root.size !== 1) return;\n\t\tconst child = root.child(0);\n\t\tif (!(child instanceof ImageNode)) return;\n\t\tconst alt = child\n\t\t\t.entires()\n\t\t\t.map((node) => node.raw ?? '')\n\t\t\t.toArray()\n\t\t\t.join('');\n\t\tconst image = new ParsedNode('image', 'block', {\n\t\t\traw: child.raw ?? '',\n\t\t\ttitle: child.title,\n\t\t\talt: escapeHTML(alt),\n\t\t\turl: child.destination,\n\t\t} as ImageParsed);\n\t\troot.before(image);\n\t\troot.remove();\n\t},\n\tverifyNode: (_node): _node is ParsedNode => false,\n\trender: () => '',\n};\n\nconst inline: ASTPlugin<'inline', ImageNode> = {\n\tname: 'image',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: 1,\n\tparse() {},\n\tverifyNode(node): node is ImageNode {\n\t\treturn node instanceof ImageNode;\n\t},\n\trender(node, { shared }) {\n\t\tconst page = shared.page as any as Page;\n\t\tconst { destination, title } = node;\n\t\tconst alt = escapeHTML(\n\t\t\tnode\n\t\t\t\t.entires()\n\t\t\t\t.map((node) => node.html)\n\t\t\t\t.toArray()\n\t\t\t\t.join(''),\n\t\t);\n\t\treturn renderImage(destination, alt, title, page);\n\t},\n};\n\nexport const image = { block, blockRender, inline };\n","import { type CommonPlugin, type Parsed, utils } from 'ezal-markdown';\n\ninterface KbdParsed extends Parsed {\n\tkey: string;\n}\n\nconst PATTERN = /{{\\S+?}}/;\n\nconst { $ } = utils;\n\nexport const kbd: CommonPlugin<'inline', KbdParsed> = {\n\tname: 'kbd',\n\ttype: 'inline',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN);\n\t\tif (!matched) return;\n\t\treturn { raw: matched[0], key: matched[0].slice(2, -2) };\n\t},\n\trender({ key }, { counter }) {\n\t\tcounter.count(key);\n\t\treturn $('kbd', { content: key });\n\t},\n};\n","import { URL } from 'ezal';\nimport { type ASTPlugin, LinkNode, utils } from 'ezal-markdown';\n\nconst PATTERN_ABSOLUTE_LINK = /^[a-z][a-z0-9+.-]*:|^\\/\\//;\n\nconst { $ } = utils;\n\nexport const link: ASTPlugin<'inline', LinkNode> = {\n\tname: 'link',\n\ttype: 'inline',\n\tphase: 'post',\n\tpriority: 1,\n\tparse() {},\n\tverifyNode(node): node is LinkNode {\n\t\treturn node instanceof LinkNode;\n\t},\n\trender(node) {\n\t\tconst html = [...node.entires().map((node) => node.html)];\n\t\tconst target = PATTERN_ABSOLUTE_LINK.test(node.destination)\n\t\t\t? '_blank'\n\t\t\t: undefined;\n\t\treturn $('a', {\n\t\t\tattr: { href: URL.for(node.destination), target, title: node.title },\n\t\t\thtml,\n\t\t});\n\t},\n};\n","import { URL } from 'ezal';\nimport { type CommonPlugin, type Parsed, utils } from 'ezal-markdown';\n\ninterface Link {\n\thref: string;\n\ticon?: string;\n\ttitle: string;\n\tsubtitle?: string;\n}\n\ninterface LinksParsed extends Parsed {\n\tlinks: Link[];\n}\n\nconst PATTERN_ALL = /(?<=^|\\n)@@\\n.*?\\n@@(\\n|$)/s;\nconst PATTERN_EACH = /(?<=^|\\n)@ ?([^@\\n].*\\n){2,3}/g;\nconst PATTERN_WHITESPACE = /\\s+/;\n\nconst { $ } = utils;\n\nexport const links: CommonPlugin<'block', LinksParsed> = {\n\tname: 'links',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_ALL,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_ALL);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst links = [\n\t\t\t...raw.matchAll(PATTERN_EACH).map<Link>((matched) => {\n\t\t\t\tconst lines = matched[0].split('\\n');\n\t\t\t\tconst args = lines[0].slice(1).trim().split(PATTERN_WHITESPACE);\n\t\t\t\treturn {\n\t\t\t\t\thref: args[0],\n\t\t\t\t\ticon: args[1],\n\t\t\t\t\ttitle: lines[1],\n\t\t\t\t\tsubtitle: lines[2],\n\t\t\t\t};\n\t\t\t}),\n\t\t];\n\t\treturn { raw, links };\n\t},\n\trender({ links }, { counter }) {\n\t\tconst html = links.map<string>(({ href, icon, title, subtitle }) => {\n\t\t\tconst html: string[] = [$('i', { class: ['icon-link'] })];\n\t\t\tif (icon) {\n\t\t\t\thtml.push(\n\t\t\t\t\t$('img', { class: 'rounded', attr: { src: URL.for(icon), alt: title } }),\n\t\t\t\t);\n\t\t\t}\n\t\t\thtml.push($('div', { class: 'link-title', content: title }));\n\t\t\tcounter.count(title);\n\t\t\tif (subtitle) {\n\t\t\t\thtml.push($('div', { content: subtitle }));\n\t\t\t\tcounter.count(subtitle);\n\t\t\t}\n\t\t\treturn $('a', { class: 'rounded', html, attr: { href: URL.for(href) } });\n\t\t});\n\t\treturn $('div', { class: 'links', html });\n\t},\n};\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface NoteParsed extends Parsed {\n\ttype: string;\n\ttitle: string;\n\tchildren: ParsedChild;\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(!{3,}) ?(info|tip|warn|danger)(.*)\\n/;\n\nconst { $ } = utils;\n\nconst NOTE_TITLE: Record<string, string> = {\n\tinfo: '注意',\n\ttip: '提示',\n\twarn: '警告',\n\tdanger: '危险',\n};\n\nexport const note: CommonPlugin<'block', NoteParsed> = {\n\tname: 'note',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { md }) {\n\t\tconst matched = source.match(PATTERN_START);\n\t\tif (!matched) return;\n\t\tconst size = matched[1].length;\n\t\tconst type = matched[2];\n\t\tlet title = matched[3]?.trim();\n\t\tif (!title) title = NOTE_TITLE[type];\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}!{${size}}\\\\s*(\\\\n|$)`);\n\t\tconst endMatched = source.match(pattern);\n\t\tconst end = endMatched?.index ?? Infinity;\n\t\tconst rawEnd = end + (endMatched?.[0].length ?? 0);\n\t\tconst raw = source.slice(0, rawEnd);\n\t\tconst content = raw.slice(matched[0].length, end);\n\t\treturn { raw, type, title, children: md(content, 'block') };\n\t},\n\trender({ type, title, children }) {\n\t\treturn $('div', {\n\t\t\tclass: ['note', `note-${type}`],\n\t\t\thtml: [$('p', [$('i', { class: `icon-${type}` }), title]), children.html],\n\t\t});\n\t},\n};\n","import { plugins, utils } from 'ezal-markdown';\n\nconst { $ } = utils;\n\nconst origin = plugins.table();\n\nexport const table: typeof origin = {\n\t...origin,\n\trender(source, context, options) {\n\t\treturn $('div', {\n\t\t\tclass: ['table', 'rounded'],\n\t\t\tattr: { tabindex: '0' },\n\t\t\thtml: origin.render(source, context, options) as string,\n\t\t});\n\t},\n};\n","import {\n\ttype CommonPlugin,\n\ttype Parsed,\n\ttype ParsedChild,\n\tutils,\n} from 'ezal-markdown';\n\ninterface TabsParsed extends Parsed {\n\tchildren: [tab: ParsedChild, content: ParsedChild][];\n\tid: string[];\n}\n\nconst PATTERN_START = /(?<=^|\\n) {0,3}(:{3,}) {0,3}\\S/;\n\nconst { $ } = utils;\n\nexport const tabs: CommonPlugin<'block', TabsParsed, number> = {\n\tname: 'tabs',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_START,\n\tparse(source, { anchors, md }) {\n\t\tconst size = source.match(PATTERN_START)?.[1].length ?? 0;\n\t\tif (!size) return;\n\n\t\tconst pattern = new RegExp(`(?<=^|\\\\n) {0,3}:{${size}}(.*)(\\\\n|$)`);\n\t\tconst children: TabsParsed['children'] = [];\n\t\tconst id: TabsParsed['id'] = [];\n\n\t\tlet matched = source.match(pattern);\n\t\tlet offset = 0;\n\t\twhile (matched) {\n\t\t\toffset += matched[0].length;\n\t\t\tif (matched[1].trim().length === 0) break;\n\t\t\tconst tab = md(matched[1], 'inline');\n\t\t\tmatched = source.slice(offset).match(pattern);\n\t\t\tconst next = (matched?.index ?? Infinity) + offset;\n\t\t\tconst content = md(source.slice(offset, next), 'block');\n\t\t\toffset = next;\n\t\t\tid.push(anchors.register('tab'));\n\t\t\tchildren.push([tab, content]);\n\t\t}\n\n\t\tif (children.length === 0) return;\n\n\t\treturn { raw: source.slice(0, offset), children, id };\n\t},\n\trender({ children, id }, context) {\n\t\tconst name = `tabs-${context.self}`;\n\t\tcontext.self++;\n\t\tconst nav = children.map(([tab], i) =>\n\t\t\t$('label', {\n\t\t\t\tattr: { for: id[i] },\n\t\t\t\thtml: [\n\t\t\t\t\t$('input', { attr: { type: 'radio', name, checked: i === 0 }, id: id[i] }),\n\t\t\t\t\ttab.html,\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\t\tconst content = children.map(([_, content], i) =>\n\t\t\t$('div', { class: i === 0 ? 'active' : undefined, html: content.html }),\n\t\t);\n\t\treturn $('div', {\n\t\t\tclass: ['tabs', 'rounded'],\n\t\t\thtml: [\n\t\t\t\t$('div', { class: ['tab-nav', 'rounded', 'sticky'], html: nav }),\n\t\t\t\t$('div', { class: ['tab-content', 'sticky-content'], html: content }),\n\t\t\t],\n\t\t});\n\t},\n\tcontext: () => 0,\n};\n","import type { CommonPlugin, Parsed, PluginLogger } from 'ezal-markdown';\nimport katex, { type StrictFunction } from 'katex';\n\nconst PATTERN_INLINE = /(?<=\\s|\\W|^)(?<!\\$)(\\$\\$?)(.+?)(\\1)(?!\\$)(?=\\s|\\W|$)/;\nconst PATTERN_BLOCK = /(?<=^|\\n) {0,3}\\$\\$.*?\\$\\$\\s*(\\n|$)/s;\n\nconst katexErrorHandler =\n\t(logger: PluginLogger): StrictFunction =>\n\t(errorCode, errorMsg, token) => {\n\t\tswitch (errorCode) {\n\t\t\tcase 'unknownSymbol':\n\t\t\tcase 'unicodeTextInMathMode':\n\t\t\tcase 'mathVsTextUnits':\n\t\t\tcase 'newLineInDisplayMode':\n\t\t\tcase 'htmlExtension':\n\t\t\t\tlogger.warn(`${errorCode}: ${errorMsg}`, token);\n\t\t\t\tbreak;\n\t\t\tcase 'commentAtEnd':\n\t\t\t\tlogger.error(`${errorCode}: ${errorMsg}`, token);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t};\n\ninterface TexParsed extends Parsed {\n\ttex: string;\n}\n\nconst inline: CommonPlugin<'inline', TexParsed> = {\n\tname: 'tex',\n\ttype: 'inline',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_INLINE,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_INLINE);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst tex = matched[2];\n\t\treturn { raw, tex };\n\t},\n\trender({ tex }, { logger, shared, counter }) {\n\t\tshared.tex = true;\n\t\tcounter.count(tex);\n\t\treturn katex.renderToString(tex, {\n\t\t\toutput: 'html',\n\t\t\tthrowOnError: false,\n\t\t\tstrict: katexErrorHandler(logger),\n\t\t});\n\t},\n};\n\nconst block: CommonPlugin<'block', TexParsed> = {\n\tname: 'tex',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: PATTERN_BLOCK,\n\tparse(source) {\n\t\tconst matched = source.match(PATTERN_BLOCK);\n\t\tif (!matched) return;\n\t\tconst raw = matched[0];\n\t\tconst start = raw.indexOf('$$');\n\t\tconst end = raw.lastIndexOf('$$');\n\t\tconst tex = raw.slice(start + 2, end).trim();\n\t\treturn { raw, tex };\n\t},\n\trender({ tex }, { logger, shared, counter }) {\n\t\tshared.tex = true;\n\t\tcounter.count(tex);\n\t\treturn katex.renderToString(tex, {\n\t\t\tdisplayMode: true,\n\t\t\toutput: 'html',\n\t\t\tthrowOnError: false,\n\t\t\tstrict: katexErrorHandler(logger),\n\t\t});\n\t},\n};\n\nexport const tex = { inline, block };\n","import { fs, Logger, type PageHandler } from 'ezal';\nimport {\n\ttype CommonPlugin,\n\tEzalMarkdown,\n\textractFrontmatter,\n\tplugins,\n} from 'ezal-markdown';\nimport { getThemeConfig } from '../config';\nimport { codeblock } from './codeblock';\nimport { fold } from './fold';\nimport { footnote } from './footnote';\nimport { image } from './image';\nimport { kbd } from './kbd';\nimport { link } from './link';\nimport { links } from './links';\nimport { note } from './note';\nimport { table } from './table';\nimport { tabs } from './tabs';\nimport { tex } from './tex';\n\nconst logger = new Logger('markdown');\n\nconst renderer = new EzalMarkdown();\nrenderer.logger = {\n\tdebug(data) {\n\t\tlogger.debug(`[${data.name}]`, data.message, data.errObj);\n\t},\n\tinfo(data) {\n\t\tlogger.log(`[${data.name}]`, data.message, data.errObj);\n\t},\n\twarn(data) {\n\t\t// HACK: 忽略因脚注引起的警告\n\t\tif (\n\t\t\tdata.name === 'link-reference-define' &&\n\t\t\tdata.message.includes('label ^')\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tlogger.warn(`[${data.name}]`, data.message, data.errObj);\n\t},\n\terror(data) {\n\t\tlogger.error(`[${data.name}]`, data.message, data.errObj);\n\t},\n};\n\nconst setext: CommonPlugin<'block'> = {\n\tname: 'setext-heading',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 0,\n\tstart: () => null,\n\tparse: () => null,\n\trender: () => '',\n};\n\nexport async function markdownPageHandler(): Promise<PageHandler> {\n\trenderer.set(\n\t\tplugins.heading({ shiftLevels: true }),\n\t\timage,\n\t\ttable,\n\t\tawait codeblock(),\n\t\tfootnote,\n\t\ttex,\n\t\ttabs,\n\t\tnote,\n\t\tfold,\n\t\tkbd,\n\t\tlinks,\n\t\tsetext,\n\t\tlink,\n\t);\n\treturn {\n\t\texts: '.md',\n\t\tasync parser(src) {\n\t\t\tconst file = await fs.readFile(src);\n\t\t\tif (file instanceof Error) return file;\n\t\t\tconst frontmatter = await extractFrontmatter(file);\n\t\t\tlet data = frontmatter?.data as Record<string, any>;\n\t\t\tif (typeof data !== 'object') data = {};\n\t\t\tconst content = file.slice(frontmatter?.raw.length ?? 0);\n\t\t\treturn { content, data };\n\t\t},\n\t\tasync renderer(content, page) {\n\t\t\tconst config = getThemeConfig();\n\t\t\tconst result = await renderer.renderHTML(content, {\n\t\t\t\tlineBreak: config.markdown?.lineBreak,\n\t\t\t\tshared: { page } as any,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\thtml: result.html,\n\t\t\t\tdata: result.context,\n\t\t\t};\n\t\t},\n\t};\n}\n","import { VirtualPage } from 'ezal';\n\nexport function init404Page() {\n\tnew VirtualPage({ id: '404', src: '/404.html', layout: '404' });\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { ArchivePage, ArchivePageData } from '../../layouts/context';\nimport { compareByDate } from '../utils';\n\nlet indexPage: ArchivePage;\nconst years = new Map<number, number>();\n\nfunction getArticles(year: number): Article[] {\n\treturn Article.getAll()\n\t\t.filter((article) => article.date.year === year)\n\t\t.toSorted(compareByDate);\n}\n\nfunction createIndex() {\n\tconst data: ArchivePageData = { years, getArticles };\n\tindexPage = new VirtualPage({\n\t\tid: 'archive',\n\t\tsrc: '/archive/',\n\t\tlayout: 'archive',\n\t\ttitle: '归档',\n\t\tdata,\n\t}) as ArchivePage;\n}\n\nlet scanned = false;\nexport function updateArchivePage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tif (!indexPage) createIndex();\n\tconst newYears = new Map<number, number>();\n\tfor (const article of Article.getAll()) {\n\t\tconst year = article.date.year;\n\t\tlet count = newYears.get(year);\n\t\tif (count === undefined) count = 0;\n\t\tcount++;\n\t\tnewYears.set(year, count);\n\t}\n\tyears.clear();\n\tfor (const [year, count] of newYears) {\n\t\tyears.set(year, count);\n\t}\n\tindexPage.invalidated();\n}\n","import { Category, VirtualPage } from 'ezal';\nimport type { CategoryPage, CategoryPageData } from '../../layouts/context';\n\nconst categories = new Map<Category, CategoryPage>();\n\nfunction createPage(category: Category): CategoryPage {\n\tconst id = `category/${category.path.join('/')}`;\n\tconst data: CategoryPageData = { category };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `分类:${category.name}`,\n\t\tlayout: 'category',\n\t\tdata,\n\t}) as CategoryPage;\n}\n\nlet scanned = false;\nexport function updateCategoryPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [category, page] of categories.entries().toArray()) {\n\t\tif (!category.destroyed) continue;\n\t\tpage.destroy();\n\t\tcategories.delete(category);\n\t}\n\tfor (const category of Category.getAll()) {\n\t\tif (categories.has(category)) continue;\n\t\tcategories.set(category, createPage(category));\n\t}\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { HomePage, HomePageData } from '../../layouts/context';\nimport { getThemeConfig } from '../config';\nimport { compareByDate } from '../utils';\n\nconst pages: HomePage[] = [];\n\nfunction getArticles(index: number): Article[] {\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst offset = index * pre;\n\treturn Article.getAll()\n\t\t.toSorted(compareByDate)\n\t\t.slice(offset, offset + pre);\n}\n\nfunction getPages() {\n\treturn pages;\n}\n\nfunction createPage(index: number): HomePage {\n\tconst i = String(index + 1);\n\tconst data: HomePageData = { index, getPages, getArticles };\n\treturn new VirtualPage({\n\t\tid: index ? `${i}/` : '',\n\t\tsrc: `/${index ? `${i}/` : ''}`,\n\t\tlayout: 'home',\n\t\tdata,\n\t}) as HomePage;\n}\n\nlet scanned = false;\nexport function updateHomePage(article?: Article) {\n\tif (!scanned && article) return;\n\tscanned = true;\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\tif (count > pages.length) {\n\t\tfor (let i = pages.length; i < count; i++) {\n\t\t\tpages.push(createPage(i));\n\t\t}\n\t} else if (count < pages.length) {\n\t\tfor (const page of pages.splice(count)) {\n\t\t\tpage.destroy();\n\t\t}\n\t}\n\tfor (const page of pages) {\n\t\tpage.invalidated();\n\t}\n}\n","import { Tag, VirtualPage } from 'ezal';\nimport type { TagPage, TagPageData } from '../../layouts/context';\n\nconst tags = new Map<Tag, TagPage>();\n\nfunction createPage(tag: Tag): TagPage {\n\tconst id = `tag/${tag.name}`;\n\tconst data: TagPageData = { tag };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `标签:${tag.name}`,\n\t\tlayout: 'tag',\n\t\tdata,\n\t}) as TagPage;\n}\n\nlet scanned = false;\nexport function updateTagPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [tag, page] of tags.entries().toArray()) {\n\t\tif (!tag.destroyed) continue;\n\t\tpage.destroy();\n\t\ttags.delete(tag);\n\t}\n\tfor (const tag of Tag.getAll()) {\n\t\tif (tags.has(tag)) continue;\n\t\ttags.set(tag, createPage(tag));\n\t}\n}\n","import {\n\tArticle,\n\tgetConfig,\n\tgetMode,\n\tLogger,\n\tPage,\n\ttype PromiseOr,\n\tVirtualAssets,\n} from 'ezal';\nimport type { RouteContent } from 'ezal/dist/route';\nimport type * as pagefind from 'pagefind';\n\nconst logger = new Logger('theme:index');\n\nlet index: pagefind.PagefindIndex;\nconst assets = new Map<string, PagefindIndex>();\n\nclass PagefindIndex extends VirtualAssets {\n\tbuffer: Buffer;\n\tconstructor(url: string, buffer: Buffer) {\n\t\tsuper(url);\n\t\tthis.buffer = buffer;\n\t}\n\tbuild(): PromiseOr<RouteContent> {\n\t\treturn this.buffer;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\n/** 重建索引文件虚拟资源 */\nasync function rebuildIndexFile() {\n\tif (!index) return;\n\tconst { errors, files } = await index.getFiles();\n\tif (errors.length > 0) {\n\t\tif (getMode() === 'build') logger.fatal(errors);\n\t\telse logger.error(errors);\n\t\treturn;\n\t}\n\tconst fileMap = new Map(\n\t\tfiles.map(({ path, content }) => [path, Buffer.from(content)]),\n\t);\n\tfor (const [path, asset] of assets.entries().toArray()) {\n\t\tif (fileMap.has(path)) continue;\n\t\tasset.destroy();\n\t\tassets.delete(path);\n\t}\n\tfor (const [path, buffer] of fileMap) {\n\t\tlet asset = assets.get(path);\n\t\tif (asset) {\n\t\t\tasset.buffer = buffer;\n\t\t\tasset.invalidated();\n\t\t\tcontinue;\n\t\t}\n\t\tasset = new PagefindIndex(path, buffer);\n\t\tassets.set(path, asset);\n\t}\n}\n\n/**\n * 添加页面\n * @description 构建模式下需启用强制才能添加索引\n */\nexport async function addPage(page: Page, force?: boolean): Promise<string[]> {\n\tif (!index) return [];\n\tif (getMode() === 'build' && !force) return [];\n\n\tconst allowIndex = page.data?.index;\n\tif (page instanceof Article) {\n\t\tif (allowIndex === false) return [];\n\t} else if (!allowIndex) return [];\n\n\tconst { errors } = await index.addCustomRecord({\n\t\turl: page.url,\n\t\tcontent: page.content ?? page.markdownContent ?? '',\n\t\tlanguage: getConfig().site.language,\n\t\tmeta: { title: page.title },\n\t});\n\tif (errors.length > 0) logger.error(errors);\n\tif (!force) await rebuildIndexFile();\n\treturn errors;\n}\n\n/** 创建所有页面索引 */\nasync function buildAllIndex(): Promise<string[]> {\n\tconst errors: string[] = [];\n\tfor (const article of Article.getAll()) {\n\t\terrors.push(...(await addPage(article, true)));\n\t}\n\tfor (const page of Page.getAll()) {\n\t\terrors.push(...(await addPage(page, true)));\n\t}\n\treturn errors;\n}\n\n/**\n * 清除并重建索引\n * @description 构建模式下无效\n */\nexport async function rebuildPagefind() {\n\tif (!index) return;\n\tif (getMode() === 'build') return;\n\tawait index.deleteIndex();\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/** 构建 Pagefind */\nexport async function buildPagefind() {\n\tif (!index) throw new Error('Pagefind not initialized');\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/**\n * 初始化 PageFind\n * @description 构建模式下不会构建索引\n */\nexport async function initPagefind() {\n\tif (index) return;\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tif (getMode() === 'build') return;\n\tawait rebuildPagefind();\n}\n\n/** 停止 PageFind */\nexport async function stopPagefind() {\n\tconst pagefind = await import('pagefind');\n\tawait pagefind.close();\n}\n","import { Article, getConfig, Page, URL, VirtualAssets } from 'ezal';\nimport { SitemapStream } from 'sitemap';\nimport { getThemeConfig } from './config';\n\nfunction getInfo(page: Page): {\n\turl: string;\n\tchangefreq: string;\n\timg?: string;\n} {\n\tlet img = page.data?.cover;\n\tif (img) img = URL.resolve(page.url, img);\n\treturn { url: page.url, changefreq: 'weekly', img };\n}\n\nclass Sitemap extends VirtualAssets {\n\tconstructor() {\n\t\tsuper('/sitemap.xml');\n\t}\n\tbuild() {\n\t\tconst { site } = getConfig();\n\t\tconst stream = new SitemapStream({ hostname: site.domain });\n\n\t\tstream.write({ url: '/' });\n\t\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\t\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\t\tfor (let i = 2; i <= count; i++) stream.write({ url: `/${i}/` });\n\n\t\tfor (const article of Article.getAll()) {\n\t\t\tif (article.data?.sitemap === false) continue;\n\t\t\tstream.write(getInfo(article));\n\t\t}\n\n\t\tfor (const page of Page.getAll()) {\n\t\t\tif (!page.data?.sitemap) continue;\n\t\t\tstream.write(getInfo(page));\n\t\t}\n\n\t\tstream.end();\n\n\t\treturn stream;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\nlet asset: Sitemap;\n\nexport function initSitemap() {\n\tasset = new Sitemap();\n}\n\nexport function updateSitemap() {\n\tasset?.invalidated();\n}\n","import path from 'node:path';\nimport esbuild from 'esbuild';\nimport { getMode, type TransformRule } from 'ezal';\n\nexport const scriptTransformRule: TransformRule = {\n\tfrom: '.ts',\n\tto: '.js',\n\tasync transformer(src: string) {\n\t\tconst buildMode = getMode() === 'build';\n\t\tconst {\n\t\t\toutputFiles,\n\t\t\tmetafile: { inputs },\n\t\t} = await esbuild.build({\n\t\t\t// Load\n\t\t\tentryPoints: [src],\n\t\t\tloader: { '.ts': 'ts' },\n\t\t\texternal: ['../pagefind.js'],\n\t\t\t// Output\n\t\t\tbundle: true,\n\t\t\tplatform: 'browser',\n\t\t\tformat: 'iife',\n\t\t\ttarget: 'es2024',\n\t\t\twrite: false,\n\t\t\tmetafile: true,\n\t\t\tsourcemap: buildMode ? false : 'inline',\n\t\t\t// Other\n\t\t\ttreeShaking: buildMode,\n\t\t\tminify: buildMode,\n\t\t});\n\t\tconst cwd = process.cwd();\n\t\tconst result = outputFiles[0].text;\n\t\tconst dependencies = Object.keys(inputs).map((src) => path.join(cwd, src));\n\t\treturn { result, dependencies };\n\t},\n};\n","import path from 'node:path';\nimport CleanCSS from 'clean-css';\nimport { fs, getMode, normalizeError, type TransformRule } from 'ezal';\nimport stylus from 'stylus';\nimport { getThemeConfig, type LinkPageStyles } from '../config';\n\nconst STYLE_CONFIGS: Record<string, () => any> = {\n\t'color.light': () => getThemeConfig().color?.light,\n\t'color.dark': () => getThemeConfig().color?.dark,\n\twaline: () => !!getThemeConfig().waline,\n};\n\nfunction config({ val }: { val: string }) {\n\tif (val in STYLE_CONFIGS) return STYLE_CONFIGS[val]();\n}\n\nfunction linksStyle({ val }: { val: LinkPageStyles }): boolean {\n\tconst styles = getThemeConfig().linkPageStyles;\n\tif (!styles) return true;\n\treturn styles.includes(val);\n}\n\nconst cleaner = new CleanCSS();\n\nexport const styleTransformRule: TransformRule = {\n\tfrom: '.styl',\n\tto: '.css',\n\tasync transformer(src: string) {\n\t\tconst file = await fs.readFile(src);\n\t\tif (file instanceof Error) return file;\n\t\ttry {\n\t\t\tconst renderer = stylus(file, {\n\t\t\t\tpaths: [path.join(src, '..')],\n\t\t\t\tfilename: path.basename(src),\n\t\t\t\tfunctions: { config, linksStyle },\n\t\t\t\t// @ts-expect-error\n\t\t\t\t'include css': true,\n\t\t\t});\n\t\t\tconst dependencies = renderer.deps().map((dep) => {\n\t\t\t\tif (!dep.startsWith('//?/')) return dep;\n\t\t\t\treturn path.normalize(dep.slice(4));\n\t\t\t});\n\t\t\tlet result = renderer.render();\n\t\t\tif (getMode() === 'build') result = cleaner.minify(result).styles;\n\t\t\treturn { result, dependencies };\n\t\t} catch (error) {\n\t\t\treturn normalizeError(error);\n\t\t}\n\t},\n};\n","import path from 'node:path';\nimport type { ThemeConfig as EzalThemeConfig } from 'ezal';\nimport { setThemeConfig, type ThemeConfig } from './config';\nimport { initFeed, updateFeedCategory, updateFeedItem } from './feed';\nimport { imageAddHook, imageRemoveHook, imageUpdateHook } from './image';\nimport { imageDB } from './image/db';\nimport { exeIndexNow } from './index-now';\nimport { layoutConfig } from './layout';\nimport { markdownPageHandler } from './markdown';\nimport { setupCodeblockStyle } from './markdown/codeblock';\nimport { initCodeblockStyle } from './markdown/codeblock/style';\nimport { init404Page } from './page/404';\nimport { updateArchivePage } from './page/archive';\nimport { updateCategoryPage } from './page/category';\nimport { updateHomePage } from './page/home';\nimport { updateTagPage } from './page/tag';\nimport {\n\taddPage,\n\tbuildPagefind,\n\tinitPagefind,\n\trebuildPagefind,\n\tstopPagefind,\n} from './pagefind';\nimport { initSitemap, updateSitemap } from './sitemap';\nimport { scriptTransformRule } from './transform/script';\nimport { styleTransformRule } from './transform/stylus';\n\nexport async function theme(config?: ThemeConfig): Promise<EzalThemeConfig> {\n\tsetThemeConfig(config);\n\timageDB.init();\n\treturn {\n\t\tassetsRoot: path.join(__dirname, '../assets'),\n\t\ttransformRules: [styleTransformRule, scriptTransformRule],\n\t\tlayout: layoutConfig,\n\t\tpageHandlers: [await markdownPageHandler()],\n\t\thooks: {\n\t\t\t'config:after': [initCodeblockStyle],\n\t\t\t'scan:after': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\tupdateCategoryPage,\n\t\t\t\tupdateTagPage,\n\t\t\t\tinit404Page,\n\t\t\t\tinitPagefind,\n\t\t\t\tinitSitemap,\n\t\t\t\tinitFeed,\n\t\t\t],\n\t\t\t'asset:add': [imageAddHook],\n\t\t\t'asset:update': [imageUpdateHook],\n\t\t\t'asset:remove': [imageRemoveHook],\n\t\t\t'build:before:assets-virtual': [\n\t\t\t\tsetupCodeblockStyle,\n\t\t\t\tbuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t],\n\t\t\t'build:after': [stopPagefind, exeIndexNow],\n\t\t\t'article:add': [updateHomePage, updateArchivePage],\n\t\t\t'article:update': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\taddPage,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:remove': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\trebuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:build:after': [addPage, updateFeedItem],\n\t\t\t'page:update': [addPage, updateSitemap],\n\t\t\t'page:remove': [rebuildPagefind, updateSitemap],\n\t\t\t'page:build:after': [addPage],\n\t\t\t'category:add': [updateCategoryPage],\n\t\t\t'category:update': [updateCategoryPage, updateFeedCategory],\n\t\t\t'category:remove': [updateCategoryPage, updateFeedCategory],\n\t\t\t'tag:add': [updateTagPage],\n\t\t\t'tag:update': [updateTagPage],\n\t\t\t'tag:remove': [updateTagPage],\n\t\t\t'preview:stop': [stopPagefind],\n\t\t},\n\t};\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ezal-theme-example",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "author": "jonnyjong",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "d3-cloud": "^1.2.7",
22
22
  "d3-hierarchy": "^3.1.2",
23
23
  "esbuild": "^0.27.0",
24
- "ezal-markdown": "^0.4.4",
24
+ "ezal-markdown": "0.4.5",
25
25
  "feed": "^5.1.0",
26
26
  "hammerjs": "^2.0.8",
27
27
  "indexnow": "^0.1.0",