ezal-theme-example 0.0.3 → 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.
- package/assets/scripts/_article.ts +38 -36
- package/assets/scripts/article.ts +11 -1
- package/assets/scripts/home.ts +11 -53
- package/assets/styles/_article/other.styl +8 -0
- package/assets/styles/_index.styl +3 -0
- package/assets/styles/article.styl +7 -0
- package/assets/styles/home.styl +14 -0
- package/dist/config.d.ts +2 -0
- package/dist/index.js +67 -34
- package/dist/index.js.map +1 -1
- package/dist/markdown/mermaid.d.ts +6 -0
- package/layouts/article.tsx +15 -1
- package/layouts/components/Head.tsx +30 -0
- package/package.json +4 -4
|
@@ -21,52 +21,54 @@ export function initTabs() {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export function initToc() {
|
|
24
|
+
const docE = doc.documentElement;
|
|
24
25
|
const toc = [...$$('aside a')];
|
|
25
26
|
if (toc.length === 0) return;
|
|
26
27
|
const headings = [...$$('h2,h3,h4,h5,h6', $('article')!)];
|
|
27
|
-
const docE = doc.documentElement;
|
|
28
|
-
|
|
29
|
-
function getIndex(): number {
|
|
30
|
-
if (docE.scrollTop < 100) return 0;
|
|
31
|
-
if (docE.scrollTop + innerHeight >= docE.scrollHeight - 5) {
|
|
32
|
-
return toc.length - 1;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const triggerLine = innerHeight / 3;
|
|
36
|
-
for (const [i, heading] of headings.entries()) {
|
|
37
|
-
const { top } = heading.getBoundingClientRect();
|
|
38
|
-
if (top > triggerLine) return Math.max(0, i - 1);
|
|
39
|
-
}
|
|
40
|
-
return toc.length - 1;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
handle(doc, 'scroll', () => {
|
|
44
|
-
const index = getIndex();
|
|
45
|
-
const target = toc[index];
|
|
46
|
-
|
|
47
|
-
if (target.classList.contains('active')) return;
|
|
48
|
-
for (const element of $$('aside .active')) {
|
|
49
|
-
element.classList.remove('active');
|
|
50
|
-
}
|
|
51
|
-
target.classList.add('active');
|
|
52
|
-
target.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
53
|
-
});
|
|
54
28
|
|
|
55
29
|
const nav = $<HTMLElement>('nav')!;
|
|
56
|
-
const
|
|
57
|
-
|
|
30
|
+
const mobileTocContainer = $('.toc')!.cloneNode(true) as HTMLElement;
|
|
31
|
+
const mobileToc = [...$$('a', mobileTocContainer)];
|
|
32
|
+
nav.append(mobileTocContainer);
|
|
58
33
|
const height = () => {
|
|
59
34
|
nav.style.maxHeight = `${nav.scrollHeight}px`;
|
|
60
35
|
};
|
|
36
|
+
const move = (event: MouseEvent, items: Element[]) => {
|
|
37
|
+
const { target } = event;
|
|
38
|
+
if ((target as Element).tagName !== 'A') return;
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
nav.classList.remove('nav-show');
|
|
41
|
+
const heading = headings[items.indexOf(target as Element)];
|
|
42
|
+
if (!heading) return;
|
|
43
|
+
const { top } = heading.getBoundingClientRect();
|
|
44
|
+
docE.scroll(0, top - 50 + docE.scrollTop);
|
|
45
|
+
};
|
|
61
46
|
handle(window, 'resize', height);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
nav.classList.add('nav-hide');
|
|
67
|
-
});
|
|
68
|
-
}
|
|
47
|
+
handle(mobileTocContainer, 'click', (event: MouseEvent) =>
|
|
48
|
+
move(event, mobileToc),
|
|
49
|
+
);
|
|
50
|
+
handle($('aside')!, 'click', (event: MouseEvent) => move(event, toc));
|
|
69
51
|
height();
|
|
52
|
+
|
|
53
|
+
const observer = new IntersectionObserver((entries) => {
|
|
54
|
+
for (const {
|
|
55
|
+
target,
|
|
56
|
+
isIntersecting,
|
|
57
|
+
boundingClientRect: { top },
|
|
58
|
+
} of entries) {
|
|
59
|
+
const index = headings.indexOf(target);
|
|
60
|
+
if (isIntersecting) {
|
|
61
|
+
toc[index].classList.add('active');
|
|
62
|
+
toc[index - 1]?.classList.add('active');
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (top > 0) toc[index].classList.remove('active');
|
|
66
|
+
if (top < 0) toc[index - 1]?.classList.remove('active');
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
for (const heading of headings) {
|
|
70
|
+
observer.observe(heading);
|
|
71
|
+
}
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
export function initCodeblock(scope: ParentNode = doc) {
|
|
@@ -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
|
});
|
package/assets/scripts/home.ts
CHANGED
|
@@ -1,73 +1,31 @@
|
|
|
1
1
|
import { initBase } from './_base';
|
|
2
|
-
import { $,
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
});
|
|
@@ -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
|
package/assets/styles/home.styl
CHANGED
|
@@ -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 { $: $$
|
|
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 $$
|
|
985
|
+
return $$10("figure", {
|
|
986
986
|
class: [
|
|
987
987
|
"code",
|
|
988
988
|
"rounded",
|
|
989
989
|
mtk
|
|
990
990
|
],
|
|
991
|
-
html: [$$
|
|
991
|
+
html: [$$10("figcaption", {
|
|
992
992
|
class: ["sticky", "rounded"],
|
|
993
993
|
html: [
|
|
994
|
-
$$
|
|
994
|
+
$$10("code", name),
|
|
995
995
|
extra,
|
|
996
|
-
$$
|
|
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$
|
|
1037
|
-
const { $: $$
|
|
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$
|
|
1043
|
+
start: PATTERN_START$3,
|
|
1044
1044
|
parse(source$1, { md }) {
|
|
1045
|
-
const matched = source$1.match(PATTERN_START$
|
|
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 $$
|
|
1061
|
+
return $$9("details", {
|
|
1062
1062
|
class: "rounded",
|
|
1063
|
-
html: [$$
|
|
1063
|
+
html: [$$9("summary", {
|
|
1064
1064
|
class: ["rounded", "sticky"],
|
|
1065
1065
|
html: summary.html
|
|
1066
|
-
}), $$
|
|
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, $: $$
|
|
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 $$
|
|
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 $$
|
|
1163
|
+
return $$8("dl", children.flatMap((child, i) => [$$8("dt", {
|
|
1164
1164
|
content: id[i][0],
|
|
1165
1165
|
id: id[i][1]
|
|
1166
|
-
}), $$
|
|
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 { $: $$
|
|
1177
|
+
const { $: $$7 } = ezal_markdown.utils;
|
|
1178
1178
|
function img(info, src, alt, title) {
|
|
1179
|
-
return $$
|
|
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) => $$
|
|
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 $$
|
|
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($$
|
|
1207
|
+
html.push($$7("figcaption", { content: alt }));
|
|
1208
1208
|
counter.count(alt);
|
|
1209
|
-
return $$
|
|
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 { $: $$
|
|
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 $$
|
|
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 { $: $$
|
|
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 $$
|
|
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 { $: $$
|
|
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 $$
|
|
1341
|
+
return $$4("div", {
|
|
1342
1342
|
class: "links",
|
|
1343
1343
|
html: links$1.map(({ href, icon, title, subtitle }) => {
|
|
1344
|
-
const html = [$$
|
|
1345
|
-
if (icon) html.push($$
|
|
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($$
|
|
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($$
|
|
1358
|
+
html.push($$4("div", { content: subtitle }));
|
|
1359
1359
|
counter.count(subtitle);
|
|
1360
1360
|
}
|
|
1361
|
-
return $$
|
|
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 as any,\n\t\tnote,\n\t\tfold,\n\t\tkbd,\n\t\tlinks,\n\t\tsetext,\n\t\tlink,\n\t);\n\treturn {\n\t\texts: '.md',\n\t\tasync parser(src) {\n\t\t\tconst file = await fs.readFile(src);\n\t\t\tif (file instanceof Error) return file;\n\t\t\tconst frontmatter = await extractFrontmatter(file);\n\t\t\tlet data = frontmatter?.data as Record<string, any>;\n\t\t\tif (typeof data !== 'object') data = {};\n\t\t\tconst content = file.slice(frontmatter?.raw.length ?? 0);\n\t\t\treturn { content, data };\n\t\t},\n\t\tasync renderer(content, page) {\n\t\t\tconst config = getThemeConfig();\n\t\t\tconst result = await renderer.renderHTML(content, {\n\t\t\t\tlineBreak: config.markdown?.lineBreak,\n\t\t\t\tshared: { page } as any,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\thtml: result.html,\n\t\t\t\tdata: result.context,\n\t\t\t};\n\t\t},\n\t};\n}\n","import { VirtualPage } from 'ezal';\n\nexport function init404Page() {\n\tnew VirtualPage({ id: '404', src: '/404.html', layout: '404' });\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { ArchivePage, ArchivePageData } from '../../layouts/context';\nimport { compareByDate } from '../utils';\n\nlet indexPage: ArchivePage;\nconst years = new Map<number, number>();\n\nfunction getArticles(year: number): Article[] {\n\treturn Article.getAll()\n\t\t.filter((article) => article.date.year === year)\n\t\t.toSorted(compareByDate);\n}\n\nfunction createIndex() {\n\tconst data: ArchivePageData = { years, getArticles };\n\tindexPage = new VirtualPage({\n\t\tid: 'archive',\n\t\tsrc: '/archive/',\n\t\tlayout: 'archive',\n\t\ttitle: '归档',\n\t\tdata,\n\t}) as ArchivePage;\n}\n\nlet scanned = false;\nexport function updateArchivePage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tif (!indexPage) createIndex();\n\tconst newYears = new Map<number, number>();\n\tfor (const article of Article.getAll()) {\n\t\tconst year = article.date.year;\n\t\tlet count = newYears.get(year);\n\t\tif (count === undefined) count = 0;\n\t\tcount++;\n\t\tnewYears.set(year, count);\n\t}\n\tyears.clear();\n\tfor (const [year, count] of newYears) {\n\t\tyears.set(year, count);\n\t}\n\tindexPage.invalidated();\n}\n","import { Category, VirtualPage } from 'ezal';\nimport type { CategoryPage, CategoryPageData } from '../../layouts/context';\n\nconst categories = new Map<Category, CategoryPage>();\n\nfunction createPage(category: Category): CategoryPage {\n\tconst id = `category/${category.path.join('/')}`;\n\tconst data: CategoryPageData = { category };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `分类:${category.name}`,\n\t\tlayout: 'category',\n\t\tdata,\n\t}) as CategoryPage;\n}\n\nlet scanned = false;\nexport function updateCategoryPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [category, page] of categories.entries().toArray()) {\n\t\tif (!category.destroyed) continue;\n\t\tpage.destroy();\n\t\tcategories.delete(category);\n\t}\n\tfor (const category of Category.getAll()) {\n\t\tif (categories.has(category)) continue;\n\t\tcategories.set(category, createPage(category));\n\t}\n}\n","import { Article, VirtualPage } from 'ezal';\nimport type { HomePage, HomePageData } from '../../layouts/context';\nimport { getThemeConfig } from '../config';\nimport { compareByDate } from '../utils';\n\nconst pages: HomePage[] = [];\n\nfunction getArticles(index: number): Article[] {\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst offset = index * pre;\n\treturn Article.getAll()\n\t\t.toSorted(compareByDate)\n\t\t.slice(offset, offset + pre);\n}\n\nfunction getPages() {\n\treturn pages;\n}\n\nfunction createPage(index: number): HomePage {\n\tconst i = String(index + 1);\n\tconst data: HomePageData = { index, getPages, getArticles };\n\treturn new VirtualPage({\n\t\tid: index ? `${i}/` : '',\n\t\tsrc: `/${index ? `${i}/` : ''}`,\n\t\tlayout: 'home',\n\t\tdata,\n\t}) as HomePage;\n}\n\nlet scanned = false;\nexport function updateHomePage(article?: Article) {\n\tif (!scanned && article) return;\n\tscanned = true;\n\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\tif (count > pages.length) {\n\t\tfor (let i = pages.length; i < count; i++) {\n\t\t\tpages.push(createPage(i));\n\t\t}\n\t} else if (count < pages.length) {\n\t\tfor (const page of pages.splice(count)) {\n\t\t\tpage.destroy();\n\t\t}\n\t}\n\tfor (const page of pages) {\n\t\tpage.invalidated();\n\t}\n}\n","import { Tag, VirtualPage } from 'ezal';\nimport type { TagPage, TagPageData } from '../../layouts/context';\n\nconst tags = new Map<Tag, TagPage>();\n\nfunction createPage(tag: Tag): TagPage {\n\tconst id = `tag/${tag.name}`;\n\tconst data: TagPageData = { tag };\n\treturn new VirtualPage({\n\t\tid,\n\t\tsrc: `/${id}/`,\n\t\ttitle: `标签:${tag.name}`,\n\t\tlayout: 'tag',\n\t\tdata,\n\t}) as TagPage;\n}\n\nlet scanned = false;\nexport function updateTagPage(_any?: any) {\n\tif (!scanned && _any) return;\n\tscanned = true;\n\tfor (const [tag, page] of tags.entries().toArray()) {\n\t\tif (!tag.destroyed) continue;\n\t\tpage.destroy();\n\t\ttags.delete(tag);\n\t}\n\tfor (const tag of Tag.getAll()) {\n\t\tif (tags.has(tag)) continue;\n\t\ttags.set(tag, createPage(tag));\n\t}\n}\n","import {\n\tArticle,\n\tgetConfig,\n\tgetMode,\n\tLogger,\n\tPage,\n\ttype PromiseOr,\n\tVirtualAssets,\n} from 'ezal';\nimport type { RouteContent } from 'ezal/dist/route';\nimport type * as pagefind from 'pagefind';\n\nconst logger = new Logger('theme:index');\n\nlet index: pagefind.PagefindIndex;\nconst assets = new Map<string, PagefindIndex>();\n\nclass PagefindIndex extends VirtualAssets {\n\tbuffer: Buffer;\n\tconstructor(url: string, buffer: Buffer) {\n\t\tsuper(url);\n\t\tthis.buffer = buffer;\n\t}\n\tbuild(): PromiseOr<RouteContent> {\n\t\treturn this.buffer;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\n/** 重建索引文件虚拟资源 */\nasync function rebuildIndexFile() {\n\tif (!index) return;\n\tconst { errors, files } = await index.getFiles();\n\tif (errors.length > 0) {\n\t\tif (getMode() === 'build') logger.fatal(errors);\n\t\telse logger.error(errors);\n\t\treturn;\n\t}\n\tconst fileMap = new Map(\n\t\tfiles.map(({ path, content }) => [path, Buffer.from(content)]),\n\t);\n\tfor (const [path, asset] of assets.entries().toArray()) {\n\t\tif (fileMap.has(path)) continue;\n\t\tasset.destroy();\n\t\tassets.delete(path);\n\t}\n\tfor (const [path, buffer] of fileMap) {\n\t\tlet asset = assets.get(path);\n\t\tif (asset) {\n\t\t\tasset.buffer = buffer;\n\t\t\tasset.invalidated();\n\t\t\tcontinue;\n\t\t}\n\t\tasset = new PagefindIndex(path, buffer);\n\t\tassets.set(path, asset);\n\t}\n}\n\n/**\n * 添加页面\n * @description 构建模式下需启用强制才能添加索引\n */\nexport async function addPage(page: Page, force?: boolean): Promise<string[]> {\n\tif (!index) return [];\n\tif (getMode() === 'build' && !force) return [];\n\n\tconst allowIndex = page.data?.index;\n\tif (page instanceof Article) {\n\t\tif (allowIndex === false) return [];\n\t} else if (!allowIndex) return [];\n\n\tconst { errors } = await index.addCustomRecord({\n\t\turl: page.url,\n\t\tcontent: page.content ?? page.markdownContent ?? '',\n\t\tlanguage: getConfig().site.language,\n\t\tmeta: { title: page.title },\n\t});\n\tif (errors.length > 0) logger.error(errors);\n\tif (!force) await rebuildIndexFile();\n\treturn errors;\n}\n\n/** 创建所有页面索引 */\nasync function buildAllIndex(): Promise<string[]> {\n\tconst errors: string[] = [];\n\tfor (const article of Article.getAll()) {\n\t\terrors.push(...(await addPage(article, true)));\n\t}\n\tfor (const page of Page.getAll()) {\n\t\terrors.push(...(await addPage(page, true)));\n\t}\n\treturn errors;\n}\n\n/**\n * 清除并重建索引\n * @description 构建模式下无效\n */\nexport async function rebuildPagefind() {\n\tif (!index) return;\n\tif (getMode() === 'build') return;\n\tawait index.deleteIndex();\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/** 构建 Pagefind */\nexport async function buildPagefind() {\n\tif (!index) throw new Error('Pagefind not initialized');\n\tawait buildAllIndex();\n\tawait rebuildIndexFile();\n}\n\n/**\n * 初始化 PageFind\n * @description 构建模式下不会构建索引\n */\nexport async function initPagefind() {\n\tif (index) return;\n\tconst pagefind = await import('pagefind');\n\tconst response = await pagefind.createIndex();\n\tif (!response.index) throw response.errors;\n\tindex = response.index;\n\tif (getMode() === 'build') return;\n\tawait rebuildPagefind();\n}\n\n/** 停止 PageFind */\nexport async function stopPagefind() {\n\tconst pagefind = await import('pagefind');\n\tawait pagefind.close();\n}\n","import { Article, getConfig, Page, URL, VirtualAssets } from 'ezal';\nimport { SitemapStream } from 'sitemap';\nimport { getThemeConfig } from './config';\n\nfunction getInfo(page: Page): {\n\turl: string;\n\tchangefreq: string;\n\timg?: string;\n} {\n\tlet img = page.data?.cover;\n\tif (img) img = URL.resolve(page.url, img);\n\treturn { url: page.url, changefreq: 'weekly', img };\n}\n\nclass Sitemap extends VirtualAssets {\n\tconstructor() {\n\t\tsuper('/sitemap.xml');\n\t}\n\tbuild() {\n\t\tconst { site } = getConfig();\n\t\tconst stream = new SitemapStream({ hostname: site.domain });\n\n\t\tstream.write({ url: '/' });\n\t\tconst pre = getThemeConfig().home?.articlesPrePage ?? 10;\n\t\tconst count = Math.ceil(Math.max(Article.getAll().length / pre, 1));\n\t\tfor (let i = 2; i <= count; i++) stream.write({ url: `/${i}/` });\n\n\t\tfor (const article of Article.getAll()) {\n\t\t\tif (article.data?.sitemap === false) continue;\n\t\t\tstream.write(getInfo(article));\n\t\t}\n\n\t\tfor (const page of Page.getAll()) {\n\t\t\tif (!page.data?.sitemap) continue;\n\t\t\tstream.write(getInfo(page));\n\t\t}\n\n\t\tstream.end();\n\n\t\treturn stream;\n\t}\n\tprotected onDependenciesChanged() {}\n}\n\nlet asset: Sitemap;\n\nexport function initSitemap() {\n\tasset = new Sitemap();\n}\n\nexport function updateSitemap() {\n\tasset?.invalidated();\n}\n","import path from 'node:path';\nimport esbuild from 'esbuild';\nimport { getMode, type TransformRule } from 'ezal';\n\nexport const scriptTransformRule: TransformRule = {\n\tfrom: '.ts',\n\tto: '.js',\n\tasync transformer(src: string) {\n\t\tconst buildMode = getMode() === 'build';\n\t\tconst {\n\t\t\toutputFiles,\n\t\t\tmetafile: { inputs },\n\t\t} = await esbuild.build({\n\t\t\t// Load\n\t\t\tentryPoints: [src],\n\t\t\tloader: { '.ts': 'ts' },\n\t\t\texternal: ['../pagefind.js'],\n\t\t\t// Output\n\t\t\tbundle: true,\n\t\t\tplatform: 'browser',\n\t\t\tformat: 'iife',\n\t\t\ttarget: 'es2024',\n\t\t\twrite: false,\n\t\t\tmetafile: true,\n\t\t\tsourcemap: buildMode ? false : 'inline',\n\t\t\t// Other\n\t\t\ttreeShaking: buildMode,\n\t\t\tminify: buildMode,\n\t\t});\n\t\tconst cwd = process.cwd();\n\t\tconst result = outputFiles[0].text;\n\t\tconst dependencies = Object.keys(inputs).map((src) => path.join(cwd, src));\n\t\treturn { result, dependencies };\n\t},\n};\n","import path from 'node:path';\nimport CleanCSS from 'clean-css';\nimport { fs, getMode, normalizeError, type TransformRule } from 'ezal';\nimport stylus from 'stylus';\nimport { getThemeConfig, type LinkPageStyles } from '../config';\n\nconst STYLE_CONFIGS: Record<string, () => any> = {\n\t'color.light': () => getThemeConfig().color?.light,\n\t'color.dark': () => getThemeConfig().color?.dark,\n\twaline: () => !!getThemeConfig().waline,\n};\n\nfunction config({ val }: { val: string }) {\n\tif (val in STYLE_CONFIGS) return STYLE_CONFIGS[val]();\n}\n\nfunction linksStyle({ val }: { val: LinkPageStyles }): boolean {\n\tconst styles = getThemeConfig().linkPageStyles;\n\tif (!styles) return true;\n\treturn styles.includes(val);\n}\n\nconst cleaner = new CleanCSS();\n\nexport const styleTransformRule: TransformRule = {\n\tfrom: '.styl',\n\tto: '.css',\n\tasync transformer(src: string) {\n\t\tconst file = await fs.readFile(src);\n\t\tif (file instanceof Error) return file;\n\t\ttry {\n\t\t\tconst renderer = stylus(file, {\n\t\t\t\tpaths: [path.join(src, '..')],\n\t\t\t\tfilename: path.basename(src),\n\t\t\t\tfunctions: { config, linksStyle },\n\t\t\t\t// @ts-expect-error\n\t\t\t\t'include css': true,\n\t\t\t});\n\t\t\tconst dependencies = renderer.deps().map((dep) => {\n\t\t\t\tif (!dep.startsWith('//?/')) return dep;\n\t\t\t\treturn path.normalize(dep.slice(4));\n\t\t\t});\n\t\t\tlet result = renderer.render();\n\t\t\tif (getMode() === 'build') result = cleaner.minify(result).styles;\n\t\t\treturn { result, dependencies };\n\t\t} catch (error) {\n\t\t\treturn normalizeError(error);\n\t\t}\n\t},\n};\n","import path from 'node:path';\nimport type { ThemeConfig as EzalThemeConfig } from 'ezal';\nimport { setThemeConfig, type ThemeConfig } from './config';\nimport { initFeed, updateFeedCategory, updateFeedItem } from './feed';\nimport { imageAddHook, imageRemoveHook, imageUpdateHook } from './image';\nimport { imageDB } from './image/db';\nimport { exeIndexNow } from './index-now';\nimport { layoutConfig } from './layout';\nimport { markdownPageHandler } from './markdown';\nimport { setupCodeblockStyle } from './markdown/codeblock';\nimport { initCodeblockStyle } from './markdown/codeblock/style';\nimport { init404Page } from './page/404';\nimport { updateArchivePage } from './page/archive';\nimport { updateCategoryPage } from './page/category';\nimport { updateHomePage } from './page/home';\nimport { updateTagPage } from './page/tag';\nimport {\n\taddPage,\n\tbuildPagefind,\n\tinitPagefind,\n\trebuildPagefind,\n\tstopPagefind,\n} from './pagefind';\nimport { initSitemap, updateSitemap } from './sitemap';\nimport { scriptTransformRule } from './transform/script';\nimport { styleTransformRule } from './transform/stylus';\n\nexport async function theme(config?: ThemeConfig): Promise<EzalThemeConfig> {\n\tsetThemeConfig(config);\n\timageDB.init();\n\treturn {\n\t\tassetsRoot: path.join(__dirname, '../assets'),\n\t\ttransformRules: [styleTransformRule, scriptTransformRule],\n\t\tlayout: layoutConfig,\n\t\tpageHandlers: [await markdownPageHandler()],\n\t\thooks: {\n\t\t\t'config:after': [initCodeblockStyle],\n\t\t\t'scan:after': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\tupdateCategoryPage,\n\t\t\t\tupdateTagPage,\n\t\t\t\tinit404Page,\n\t\t\t\tinitPagefind,\n\t\t\t\tinitSitemap,\n\t\t\t\tinitFeed,\n\t\t\t],\n\t\t\t'asset:add': [imageAddHook],\n\t\t\t'asset:update': [imageUpdateHook],\n\t\t\t'asset:remove': [imageRemoveHook],\n\t\t\t'build:before:assets-virtual': [\n\t\t\t\tsetupCodeblockStyle,\n\t\t\t\tbuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t],\n\t\t\t'build:after': [stopPagefind, exeIndexNow],\n\t\t\t'article:add': [updateHomePage, updateArchivePage],\n\t\t\t'article:update': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\taddPage,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:remove': [\n\t\t\t\tupdateHomePage,\n\t\t\t\tupdateArchivePage,\n\t\t\t\trebuildPagefind,\n\t\t\t\tupdateSitemap,\n\t\t\t\tupdateFeedItem,\n\t\t\t],\n\t\t\t'article:build:after': [addPage, updateFeedItem],\n\t\t\t'page:update': [addPage, updateSitemap],\n\t\t\t'page:remove': [rebuildPagefind, updateSitemap],\n\t\t\t'page:build:after': [addPage],\n\t\t\t'category:add': [updateCategoryPage],\n\t\t\t'category:update': [updateCategoryPage, updateFeedCategory],\n\t\t\t'category:remove': [updateCategoryPage, updateFeedCategory],\n\t\t\t'tag:add': [updateTagPage],\n\t\t\t'tag:update': [updateTagPage],\n\t\t\t'tag:remove': [updateTagPage],\n\t\t\t'preview:stop': [stopPagefind],\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["config: ThemeConfig","config","author: Author","feed: Feed","assets: { rss: FeedAsset; atom: FeedAsset; feed: FeedAsset }","VirtualAssets","#type","feed","theme","Feed","Article","Category","assets","item","image","URL","item: Item","dir: string | undefined","path","dir","sharp","VirtualAssets","URL","asset","#filepath","#ext","#optimizedPath","fs","db: DB.Database","statements: Record<'get' | 'update' | 'delete', DB.Statement>","path","DB","asset","color: string | null","Vibrant","metadata: ImageMetadata","path","logger","Logger","asset","ext","fs","assets","logger","Logger","urls: string[]","Article","Page","IndexNow","SEARCH_ENGINES","context: Context","layoutConfig: LayoutConfig","path","path","cleaner","CleanCSS","VirtualAssets","Cache","#baseCache","asset: CodeblockStyle","asset","ModelOperations","shiki: HighlighterGeneric<BundledLanguage, BundledTheme>","shikiClassName: string[]","transformers: ShikiTransformer[]","shiki","theme","utils","result: string[]","name","$","origin","plugins","render","indented: CommonPlugin<'block', CodeblockParsed>","fenced: CommonPlugin<'block', CodeblockParsed>","PATTERN_START","utils","fold: CommonPlugin<'block', FoldParsed>","source","$","utils","render: RendererPlugin<'inline', LinkParsed>","$","ast: ASTPlugin<'inline', LinkNode>","LinkNode","ParsedNode","source: CommonPlugin<'block', SourceParsed>","contents: string[]","id: [string, string][]","indentState: boolean | null","source","utils","$","URL","html: string[]","mime","blockRender: RendererPlugin<'block', ImageParsed>","block: ASTPlugin<'inline', ParsedNode>","Paragraph","ImageNode","image","ParsedNode","inline: ASTPlugin<'inline', ImageNode>","node","utils","kbd: CommonPlugin<'inline', KbdParsed>","source","$","utils","link: ASTPlugin<'inline', LinkNode>","LinkNode","node","$","URL","utils","links: CommonPlugin<'block', LinksParsed>","source","matched","$","links","html: string[]","URL","PATTERN_START","utils","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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"}
|
package/layouts/article.tsx
CHANGED
|
@@ -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
|
-
"author": "
|
|
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.
|
|
9
|
+
"ezal": "^3.0.2"
|
|
10
10
|
},
|
|
11
11
|
"engines": {
|
|
12
12
|
"node": ">=22"
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"d3-cloud": "^1.2.7",
|
|
22
22
|
"d3-hierarchy": "^3.1.2",
|
|
23
23
|
"esbuild": "^0.27.0",
|
|
24
|
-
"ezal-markdown": "
|
|
24
|
+
"ezal-markdown": "0.4.5",
|
|
25
25
|
"feed": "^5.1.0",
|
|
26
26
|
"hammerjs": "^2.0.8",
|
|
27
27
|
"indexnow": "^0.1.0",
|