ezal-theme-example 0.0.4 → 0.0.5

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.
@@ -6,7 +6,16 @@ import {
6
6
  initToc,
7
7
  } from './_article';
8
8
  import { initBase } from './_base';
9
- import { doc, handle } from './_utils';
9
+ import { $, doc, handle } from './_utils';
10
+
11
+ function initOutdate() {
12
+ const outdate = $<HTMLElement>('.article-outdate');
13
+ if (!outdate) return;
14
+ if (!outdate.dataset.time) return;
15
+ const time = new Date(outdate.dataset.time).getTime();
16
+ if (Date.now() < time) return;
17
+ outdate.classList.add('article-outdate-show');
18
+ }
10
19
 
11
20
  handle(doc, 'DOMContentLoaded', () => {
12
21
  initBase();
@@ -15,4 +24,5 @@ handle(doc, 'DOMContentLoaded', () => {
15
24
  initCodeblock();
16
25
  initFootnote();
17
26
  initImage();
27
+ initOutdate();
18
28
  });
@@ -1,73 +1,31 @@
1
1
  import { initBase } from './_base';
2
- import { $, $$, doc, handle } from './_utils';
2
+ import { $, doc, handle } from './_utils';
3
3
 
4
- let dx = 0;
5
- let dy = 0;
6
- let tx = 0;
7
- let ty = 0;
8
4
  let logo: HTMLElement;
9
- let prev = 0;
10
- let tick = 0;
11
-
12
- const nodes = () => $$('use', logo.parentNode!);
5
+ let nodes: SVGUseElement[];
13
6
 
14
7
  const USE = () => {
15
8
  const node = doc.createElementNS('http://www.w3.org/2000/svg', 'use');
16
9
  node.setAttribute('href', '#logo');
17
- (node as any).c = tick;
18
10
  return node;
19
11
  };
20
12
 
21
- function next() {
22
- const node = USE();
23
- logo.after(node);
24
- const animation = node.animate(
25
- [{}, { translate: '128px 128px', opacity: '0' }],
26
- { duration: 5000 },
27
- );
28
- (node as any).a = animation;
29
- animation.play();
30
- animation.onfinish = () => node.remove();
31
- }
32
-
33
- function animate() {
34
- if (dx < tx) dx = Math.min(dx + 0.1, tx);
35
- else if (dx > tx) dx = Math.max(dx - 0.1, tx);
36
- if (dy < ty) dy = Math.min(dy + 0.1, ty);
37
- else if (dy > ty) dy = Math.max(dy - 0.1, ty);
38
- if (tick - prev > 100) {
39
- next();
40
- prev = tick;
41
- }
42
- for (const node of nodes()) {
43
- const diff = tick - (node as any).c;
44
- node.setAttribute('x', String((dx * diff) / 20));
45
- node.setAttribute('y', String((dy * diff) / 20));
46
- }
47
- tick++;
48
- requestAnimationFrame(animate);
49
- }
50
-
51
13
  handle(doc, 'DOMContentLoaded', () => {
52
14
  initBase();
53
15
 
54
16
  logo = $('#logo')!;
55
17
  if (!logo) return;
56
- handle(window, 'blur', () => {
57
- for (const node of nodes()) {
58
- (node as any).a.pause();
59
- }
60
- });
61
- handle(window, 'focus', () => {
62
- for (const node of nodes()) {
63
- (node as any).a.play();
64
- }
65
- });
18
+ nodes = new Array(9).fill(0).map(USE);
19
+ logo.after(...nodes);
20
+
66
21
  handle(doc, 'mousemove', ({ x, y }: MouseEvent) => {
67
22
  const rw = innerWidth / 2;
68
23
  const rh = innerHeight / 2;
69
- tx = (rw - x) / rw;
70
- ty = (rh - y) / rh;
24
+ const tx = (rw - x) / rw;
25
+ const ty = (rh - y) / rh;
26
+ for (let [i, node] of nodes.entries()) {
27
+ i++;
28
+ node.style.translate = `${tx * i * 4}px ${ty * i * 4}px`;
29
+ }
71
30
  });
72
- requestAnimationFrame(animate);
73
31
  });
@@ -42,3 +42,11 @@ blockquote
42
42
 
43
43
  figure
44
44
  margin 16px 0
45
+
46
+ .mermaid
47
+ &:not(:has(svg))
48
+ opacity 0
49
+ // overflow auto
50
+ text-align center
51
+ svg
52
+ height auto
@@ -116,6 +116,13 @@ aside
116
116
  @import '_article/kbd'
117
117
  @import '_article/links'
118
118
 
119
+ .article-outdate
120
+ @extend blockquote
121
+ padding 16px
122
+ border-color var(--note-warn)
123
+ &:not(.article-outdate-show)
124
+ display none
125
+
119
126
  // MARK: Mobile
120
127
  nav .toc
121
128
  position absolute
@@ -12,8 +12,22 @@ header
12
12
  .home-title
13
13
  font 28px var(--font-title)
14
14
 
15
+ @keyframes home-logo
16
+ 100%
17
+ opacity var(--e-o)
18
+ x var(--e-p)
19
+ y var(--e-p)
20
+
15
21
  .home-logo
16
22
  max-width 350px
23
+ for i in 1 .. 9
24
+ &>:nth-child({i + 1})
25
+ opacity 1 - i * .1
26
+ animation 1s home-logo linear infinite
27
+ --e-o .9 - i * .1
28
+ --e-p 16px * i
29
+ x 16px * i - 16px
30
+ y 16px * i - 16px
17
31
 
18
32
  @keyframes indicator
19
33
  0%
package/dist/config.d.ts CHANGED
@@ -103,6 +103,8 @@ export interface ThemeConfig {
103
103
  walineCSS?: string;
104
104
  /** @default 'https://unpkg.com/@waline/client@v3/dist/waline.js' */
105
105
  walineJS?: string;
106
+ /** @default 'https://unpkg.com/mermaid@11/dist/mermaid.esm.min.mjs' */
107
+ mermaid?: string;
106
108
  };
107
109
  /** HTML 头部插入内容 */
108
110
  inject?: string;
package/dist/index.js CHANGED
@@ -971,7 +971,7 @@ async function highlighter(code, lang) {
971
971
  if ((0, ezal.getMode)() === "serve") updateStyles(toClass.getCSS());
972
972
  return [html, lang];
973
973
  }
974
- const { $: $$9 } = ezal_markdown.utils;
974
+ const { $: $$10 } = ezal_markdown.utils;
975
975
  function packager(html, lang, extra) {
976
976
  const name = LANGUAGE_MAP.get(lang) ?? lang;
977
977
  let mtk = "";
@@ -982,18 +982,18 @@ function packager(html, lang, extra) {
982
982
  else if (name$1.startsWith("mtk-")) mtk = name$1;
983
983
  return `class="${result.join(" ")}"`;
984
984
  }).replace(PATTERN_EMPTY_LINE, "</code></pre>");
985
- return $$9("figure", {
985
+ return $$10("figure", {
986
986
  class: [
987
987
  "code",
988
988
  "rounded",
989
989
  mtk
990
990
  ],
991
- html: [$$9("figcaption", {
991
+ html: [$$10("figcaption", {
992
992
  class: ["sticky", "rounded"],
993
993
  html: [
994
- $$9("code", name),
994
+ $$10("code", name),
995
995
  extra,
996
- $$9("button", {
996
+ $$10("button", {
997
997
  class: ["link", "icon-copy"],
998
998
  attr: { title: "复制代码" }
999
999
  })
@@ -1033,16 +1033,16 @@ function setupCodeblockStyle() {
1033
1033
 
1034
1034
  //#endregion
1035
1035
  //#region packages/ezal-theme-example/src/markdown/fold.ts
1036
- const PATTERN_START$2 = /(?<=^|\n) {0,3}(\+{3,}) {0,3}(\S.*)\n/;
1037
- const { $: $$8 } = ezal_markdown.utils;
1036
+ const PATTERN_START$3 = /(?<=^|\n) {0,3}(\+{3,}) {0,3}(\S.*)\n/;
1037
+ const { $: $$9 } = ezal_markdown.utils;
1038
1038
  const fold = {
1039
1039
  name: "fold",
1040
1040
  type: "block",
1041
1041
  order: 0,
1042
1042
  priority: 0,
1043
- start: PATTERN_START$2,
1043
+ start: PATTERN_START$3,
1044
1044
  parse(source$1, { md }) {
1045
- const matched = source$1.match(PATTERN_START$2);
1045
+ const matched = source$1.match(PATTERN_START$3);
1046
1046
  if (!matched) return;
1047
1047
  const size = matched[1].length;
1048
1048
  const summary = matched[2];
@@ -1058,12 +1058,12 @@ const fold = {
1058
1058
  };
1059
1059
  },
1060
1060
  render({ children: [summary, details] }) {
1061
- return $$8("details", {
1061
+ return $$9("details", {
1062
1062
  class: "rounded",
1063
- html: [$$8("summary", {
1063
+ html: [$$9("summary", {
1064
1064
  class: ["rounded", "sticky"],
1065
1065
  html: summary.html
1066
- }), $$8("div", {
1066
+ }), $$9("div", {
1067
1067
  class: "sticky-content",
1068
1068
  html: details.html
1069
1069
  })]
@@ -1073,7 +1073,7 @@ const fold = {
1073
1073
 
1074
1074
  //#endregion
1075
1075
  //#region packages/ezal-theme-example/src/markdown/footnote.ts
1076
- const { eachLine, $: $$7 } = ezal_markdown.utils;
1076
+ const { eachLine, $: $$8 } = ezal_markdown.utils;
1077
1077
  const PATTERN_SOURCE_START = /(?<=^|\n)\[\^.*?\]:/;
1078
1078
  const PATTERN_SOURCE_BEGIN = /^\[(.*?)\]:/;
1079
1079
  const PATTERN_SOURCE_INDENT = /^(\t| {1,4})/;
@@ -1082,7 +1082,7 @@ const render = {
1082
1082
  type: "inline",
1083
1083
  render({ id, label }, { counter }) {
1084
1084
  counter.count(label);
1085
- return $$7("sup", $$7("a", {
1085
+ return $$8("sup", $$8("a", {
1086
1086
  class: "footnote",
1087
1087
  attr: { href: id },
1088
1088
  content: label
@@ -1160,10 +1160,10 @@ const source = {
1160
1160
  render({ id, children }, { counter }) {
1161
1161
  for (const [label] of id) counter.count(label);
1162
1162
  for (const child of children) counter.count(child.raw);
1163
- return $$7("dl", children.flatMap((child, i) => [$$7("dt", {
1163
+ return $$8("dl", children.flatMap((child, i) => [$$8("dt", {
1164
1164
  content: id[i][0],
1165
1165
  id: id[i][1]
1166
- }), $$7("dd", child.html)]));
1166
+ }), $$8("dd", child.html)]));
1167
1167
  }
1168
1168
  };
1169
1169
  const footnote = {
@@ -1174,9 +1174,9 @@ const footnote = {
1174
1174
 
1175
1175
  //#endregion
1176
1176
  //#region packages/ezal-theme-example/src/markdown/image.ts
1177
- const { $: $$6 } = ezal_markdown.utils;
1177
+ const { $: $$7 } = ezal_markdown.utils;
1178
1178
  function img(info, src, alt, title) {
1179
- return $$6("img", {
1179
+ return $$7("img", {
1180
1180
  attr: {
1181
1181
  src: ezal.URL.for(src),
1182
1182
  alt,
@@ -1191,12 +1191,12 @@ function img(info, src, alt, title) {
1191
1191
  function renderImage(url, alt, title, page) {
1192
1192
  const info = getImageInfo(ezal.URL.resolve(page.url, url));
1193
1193
  if (!info?.rule) return img(info, url, alt, title);
1194
- const html = info.rule.slice(0, -1).map((ext) => $$6("source", { attr: {
1194
+ const html = info.rule.slice(0, -1).map((ext) => $$7("source", { attr: {
1195
1195
  srcset: ezal.URL.extname(url, `.opt${ext}`),
1196
1196
  type: mime_types.default.lookup(ext)
1197
1197
  } }));
1198
1198
  html.push(img(info, ezal.URL.extname(url, info.rule.at(-1)), alt, title));
1199
- return $$6("picture", html);
1199
+ return $$7("picture", html);
1200
1200
  }
1201
1201
  const blockRender = {
1202
1202
  name: "image",
@@ -1204,9 +1204,9 @@ const blockRender = {
1204
1204
  render({ title, url, alt }, { shared, counter }) {
1205
1205
  const page = shared.page;
1206
1206
  const html = [renderImage(url, alt, title, page)];
1207
- html.push($$6("figcaption", { content: alt }));
1207
+ html.push($$7("figcaption", { content: alt }));
1208
1208
  counter.count(alt);
1209
- return $$6("figure", {
1209
+ return $$7("figure", {
1210
1210
  class: "image",
1211
1211
  html
1212
1212
  });
@@ -1259,7 +1259,7 @@ const image = {
1259
1259
  //#endregion
1260
1260
  //#region packages/ezal-theme-example/src/markdown/kbd.ts
1261
1261
  const PATTERN = /{{\S+?}}/;
1262
- const { $: $$5 } = ezal_markdown.utils;
1262
+ const { $: $$6 } = ezal_markdown.utils;
1263
1263
  const kbd = {
1264
1264
  name: "kbd",
1265
1265
  type: "inline",
@@ -1276,14 +1276,14 @@ const kbd = {
1276
1276
  },
1277
1277
  render({ key }, { counter }) {
1278
1278
  counter.count(key);
1279
- return $$5("kbd", { content: key });
1279
+ return $$6("kbd", { content: key });
1280
1280
  }
1281
1281
  };
1282
1282
 
1283
1283
  //#endregion
1284
1284
  //#region packages/ezal-theme-example/src/markdown/link.ts
1285
1285
  const PATTERN_ABSOLUTE_LINK = /^[a-z][a-z0-9+.-]*:|^\/\//;
1286
- const { $: $$4 } = ezal_markdown.utils;
1286
+ const { $: $$5 } = ezal_markdown.utils;
1287
1287
  const link = {
1288
1288
  name: "link",
1289
1289
  type: "inline",
@@ -1296,7 +1296,7 @@ const link = {
1296
1296
  render(node) {
1297
1297
  const html = [...node.entires().map((node$1) => node$1.html)];
1298
1298
  const target = PATTERN_ABSOLUTE_LINK.test(node.destination) ? "_blank" : void 0;
1299
- return $$4("a", {
1299
+ return $$5("a", {
1300
1300
  attr: {
1301
1301
  href: ezal.URL.for(node.destination),
1302
1302
  target,
@@ -1312,7 +1312,7 @@ const link = {
1312
1312
  const PATTERN_ALL = /(?<=^|\n)@@\n.*?\n@@(\n|$)/s;
1313
1313
  const PATTERN_EACH = /(?<=^|\n)@ ?([^@\n].*\n){2,3}/g;
1314
1314
  const PATTERN_WHITESPACE = /\s+/;
1315
- const { $: $$3 } = ezal_markdown.utils;
1315
+ const { $: $$4 } = ezal_markdown.utils;
1316
1316
  const links = {
1317
1317
  name: "links",
1318
1318
  type: "block",
@@ -1338,27 +1338,27 @@ const links = {
1338
1338
  };
1339
1339
  },
1340
1340
  render({ links: links$1 }, { counter }) {
1341
- return $$3("div", {
1341
+ return $$4("div", {
1342
1342
  class: "links",
1343
1343
  html: links$1.map(({ href, icon, title, subtitle }) => {
1344
- const html = [$$3("i", { class: ["icon-link"] })];
1345
- if (icon) html.push($$3("img", {
1344
+ const html = [$$4("i", { class: ["icon-link"] })];
1345
+ if (icon) html.push($$4("img", {
1346
1346
  class: "rounded",
1347
1347
  attr: {
1348
1348
  src: ezal.URL.for(icon),
1349
1349
  alt: title
1350
1350
  }
1351
1351
  }));
1352
- html.push($$3("div", {
1352
+ html.push($$4("div", {
1353
1353
  class: "link-title",
1354
1354
  content: title
1355
1355
  }));
1356
1356
  counter.count(title);
1357
1357
  if (subtitle) {
1358
- html.push($$3("div", { content: subtitle }));
1358
+ html.push($$4("div", { content: subtitle }));
1359
1359
  counter.count(subtitle);
1360
1360
  }
1361
- return $$3("a", {
1361
+ return $$4("a", {
1362
1362
  class: "rounded",
1363
1363
  html,
1364
1364
  attr: { href: ezal.URL.for(href) }
@@ -1368,6 +1368,39 @@ const links = {
1368
1368
  }
1369
1369
  };
1370
1370
 
1371
+ //#endregion
1372
+ //#region packages/ezal-theme-example/src/markdown/mermaid.ts
1373
+ const PATTERN_START$2 = /(?<=^|\n)( {0,3})(`{3,}|~{3,})\s*mermaid\s*(?=$|\n)/i;
1374
+ const { $: $$3 } = ezal_markdown.utils;
1375
+ const mermaid = {
1376
+ name: "mermaid",
1377
+ type: "block",
1378
+ order: 0,
1379
+ priority: 1,
1380
+ start: PATTERN_START$2,
1381
+ parse(source$1) {
1382
+ const start = source$1.match(PATTERN_START$2);
1383
+ if (!start) return;
1384
+ const fenceLength = start[2].length;
1385
+ const fenceType = start[2][0];
1386
+ const startOffset = start[0].length;
1387
+ const end = source$1.slice(startOffset).match(/* @__PURE__ */ new RegExp(`(?<=\n)( {0,3})${fenceType}{${fenceLength},}[ \t]*(\n|$)`));
1388
+ const raw = source$1.slice(0, end?.index ? startOffset + end.index + end[0].length : void 0);
1389
+ return {
1390
+ raw,
1391
+ content: raw.slice(startOffset + 1, end?.index ? startOffset + end.index : void 0)
1392
+ };
1393
+ },
1394
+ render({ content }, { shared, counter }) {
1395
+ counter.count(content);
1396
+ shared.mermaid = true;
1397
+ return $$3("pre", {
1398
+ class: "mermaid",
1399
+ content
1400
+ });
1401
+ }
1402
+ };
1403
+
1371
1404
  //#endregion
1372
1405
  //#region packages/ezal-theme-example/src/markdown/note.ts
1373
1406
  const PATTERN_START$1 = /(?<=^|\n) {0,3}(!{3,}) ?(info|tip|warn|danger)(.*)\n/;
@@ -1604,7 +1637,7 @@ const setext = {
1604
1637
  render: () => ""
1605
1638
  };
1606
1639
  async function markdownPageHandler() {
1607
- renderer.set(ezal_markdown.plugins.heading({ shiftLevels: true }), image, table, await codeblock(), footnote, tex, tabs, note, fold, kbd, links, setext, link);
1640
+ renderer.set(ezal_markdown.plugins.heading({ shiftLevels: true }), image, table, await codeblock(), footnote, tex, tabs, note, fold, kbd, links, setext, link, mermaid);
1608
1641
  return {
1609
1642
  exts: ".md",
1610
1643
  async parser(src) {
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,\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","mermaid: CommonPlugin<'block', MermaidParsed>","source","$","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/mermaid.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\t/** @default 'https://unpkg.com/mermaid@11/dist/mermaid.esm.min.mjs' */\n\t\tmermaid?: 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 { type CommonPlugin, type Parsed, utils } from 'ezal-markdown';\n\ninterface MermaidParsed extends Parsed {\n\tcontent: string;\n}\n\nconst PATTERN_START = /(?<=^|\\n)( {0,3})(`{3,}|~{3,})\\s*mermaid\\s*(?=$|\\n)/i;\n\nconst { $ } = utils;\n\nexport const mermaid: CommonPlugin<'block', MermaidParsed> = {\n\tname: 'mermaid',\n\ttype: 'block',\n\torder: 0,\n\tpriority: 1,\n\tstart: PATTERN_START,\n\tparse(source) {\n\t\tconst start = source.match(PATTERN_START);\n\t\tif (!start) return;\n\t\tconst fenceLength = start[2].length;\n\t\tconst fenceType = start[2][0];\n\t\tconst startOffset = start[0].length;\n\t\tconst end = source\n\t\t\t.slice(startOffset)\n\t\t\t.match(\n\t\t\t\tnew RegExp(`(?<=\\n)( {0,3})${fenceType}{${fenceLength},}[ \\t]*(\\n|$)`),\n\t\t\t);\n\t\tconst raw = source.slice(\n\t\t\t0,\n\t\t\tend?.index ? startOffset + end.index + end[0].length : undefined,\n\t\t);\n\t\tconst content = raw.slice(\n\t\t\tstartOffset + 1,\n\t\t\tend?.index ? startOffset + end.index : undefined,\n\t\t);\n\t\treturn { raw, content };\n\t},\n\trender({ content }, { shared, counter }) {\n\t\tcounter.count(content);\n\t\tshared.mermaid = true;\n\t\treturn $('pre', { class: 'mermaid', content });\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 { mermaid } from './mermaid';\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\tmermaid,\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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"}
@@ -0,0 +1,6 @@
1
+ import { type CommonPlugin, type Parsed } from 'ezal-markdown';
2
+ interface MermaidParsed extends Parsed {
3
+ content: string;
4
+ }
5
+ export declare const mermaid: CommonPlugin<'block', MermaidParsed>;
6
+ export {};
@@ -1,7 +1,8 @@
1
- import { Article, URL } from 'ezal';
1
+ import { Article, Time, URL } from 'ezal';
2
2
  import type { Context } from 'ezal-markdown';
3
3
  import base from './base';
4
4
  import Image from './components/Image';
5
+ import { Temporal } from '@js-temporal/polyfill';
5
6
 
6
7
  const { theme } = context;
7
8
  const page = context.page as Article;
@@ -90,6 +91,18 @@ if (related.length > 0) {
90
91
  );
91
92
  } */
92
93
 
94
+ let outdateTemplate: JSX.Element | undefined;
95
+ if (page.data.outdate) {
96
+ const outdate = Time.parseDate(page.data.outdate.date, page.updated);
97
+ if (outdate) {
98
+ const outdated = outdate.epochMilliseconds <= Temporal.Now.zonedDateTimeISO().epochMilliseconds;
99
+ const classList = ['article-outdate'];
100
+ if (outdated) classList.push('article-outdate-show');
101
+ const time = outdate.toString({ timeZoneName: 'never' });
102
+ outdateTemplate = <div class={classList} data-time={time}>{page.data.outdate.message}</div>
103
+ }
104
+ }
105
+
93
106
  export default base(
94
107
  <header>
95
108
  {page.data.cover ? <Image url={page.data.cover} alt={page.title} /> : null}
@@ -123,6 +136,7 @@ export default base(
123
136
  <main>
124
137
  {toc}
125
138
  <article>
139
+ {outdateTemplate}
126
140
  <RawHTML html={page.content} />
127
141
  </article>
128
142
  </main>,
@@ -32,6 +32,31 @@ const enableComment =
32
32
  const waline =
33
33
  theme.cdn?.walineCSS ?? 'https://unpkg.com/@waline/client@v3/dist/waline.css';
34
34
 
35
+ const mermaid =
36
+ theme.cdn?.mermaid ?? 'https://unpkg.com/mermaid@11/dist/mermaid.esm.min.mjs';
37
+ const mermaidScript =
38
+ `import mermaid from '${mermaid}';` +
39
+ // 'window.mermaid = mermaid;' +
40
+ 'mermaid.initialize({startOnLoad:false});' +
41
+ `document.addEventListener('DOMContentLoaded', ()=>{` +
42
+ `const media=window?.matchMedia('(prefers-color-scheme: dark)');` +
43
+ `const theme=()=>media?.matches?'dark':'neutral';` +
44
+ 'const charts=new Map();' +
45
+ `for(const e of document.querySelectorAll('pre.mermaid')){` +
46
+ 'charts.set(e,e.textContent);' +
47
+ '}'+
48
+ 'const render=()=>{'+
49
+ 'for(const[e,t]of charts){'+
50
+ 'e.textContent=t;'+
51
+ `e.removeAttribute('data-processed');`+
52
+ '}' +
53
+ 'mermaid.initialize({theme:theme()});' +
54
+ 'mermaid.run();' +
55
+ '};'+
56
+ 'render();' +
57
+ 'media?.addListener(render);' +
58
+ '})';
59
+
35
60
  export default (slot?: any) => (
36
61
  <head>
37
62
  {/* 基本 */}
@@ -115,6 +140,11 @@ export default (slot?: any) => (
115
140
  {'renderedData' in page && page.renderedData.shared.codeblock ? (
116
141
  <link rel="stylesheet" href={URL.for('styles/code.css')} />
117
142
  ) : null}
143
+ {'renderedData' in page && page.renderedData.shared.mermaid ? (
144
+ <script type="module">
145
+ <RawHTML html={mermaidScript} />
146
+ </script>
147
+ ) : null}
118
148
  {/* 额外 */}
119
149
  {slot}
120
150
  {theme.inject ? <RawHTML html={theme.inject} /> : null}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ezal-theme-example",
3
- "version": "0.0.4",
4
- "author": "jonnyjong",
3
+ "version": "0.0.5",
4
+ "author": "jonnyjonny",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "peerDependencies": {
9
- "ezal": "^3.0.1"
9
+ "ezal": "^3.0.2"
10
10
  },
11
11
  "engines": {
12
12
  "node": ">=22"