Skip to content

Commit 912a342

Browse files
committed
vendor all the things
1 parent 281c3db commit 912a342

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+9565
-183
lines changed

.github/workflows/ci.yml

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ on:
1010
jobs:
1111
CI:
1212
runs-on: ubuntu-latest
13+
permissions:
14+
pages: write
15+
id-token: write
1316

1417
steps:
1518
- uses: actions/checkout@v4
@@ -19,10 +22,7 @@ jobs:
1922

2023
- run: deno task build --blogroll
2124

22-
- name: Deploy
23-
uses: peaceiris/actions-gh-pages@364c31d33bb99327c77b3a5438a83a357a6729ad # v3.4.0
25+
- uses: actions/upload-pages-artifact@v3
2426
with:
25-
github_token: ${{ secrets.GITHUB_TOKEN }}
26-
publish_branch: gh-pages
27-
publish_dir: out/res
28-
force_orphan: true
27+
path: ./out/www
28+
- uses: actions/deploy-pages@v4

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
/out
2-
/build

deno.jsonc

+21-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
11
{
2-
"importMap": "import_map.json",
32
"lock": {
43
"frozen": true
54
},
5+
"vendor": true,
66
"tasks": {
7-
"build": " deno run --lock --allow-write=./out,./build --allow-read=./out,./build,./content --allow-net --allow-import ./src/main.ts build --profile",
8-
"watch": "rm -rf ./out && deno run --lock --allow-write=./out,./build --allow-read=./out,./build,./content --allow-net --allow-import --watch ./src/main.ts watch",
9-
"serve": "deno task watch & live-server --host 127.0.0.1 --port 8080 ./out/res",
7+
"build": " deno run --lock --allow-write=./out --allow-read=./out,./content --allow-net --allow-import ./src/main.ts build --profile",
8+
"watch": "rm -rf ./out && deno run --lock --allow-write=./out --allow-read=./out,./content --allow-net --allow-import --watch ./src/main.ts watch",
9+
"serve": "deno task watch & live-server --host 127.0.0.1 --port 8080 ./out/www",
1010
"touch": "deno run --allow-write=./content/posts ./src/main.ts touch"
11+
},
12+
"imports": {
13+
"@highlightjs/": "https://unpkg.com/@highlightjs/cdn-assets@11.6.0/es/",
14+
15+
"@std/async/debounce": "https://raw.githubusercontent.com/denoland/std/refs/tags/release-2025.03.04/async/debounce.ts",
16+
"@rss": "https://raw.githubusercontent.com/MikaelPorttila/rss/refs/tags/1.0.3/mod.ts",
17+
"jsr:@maxim-mazurok/sax-ts@1.2.13": "https://raw.githubusercontent.com/Maxim-Mazurok/sax-ts/refs/tags/v1.2.13/src/sax.ts",
18+
19+
"@djot/": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/",
20+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/ast": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/ast.ts",
21+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/attributes": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/attributes.ts",
22+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/block": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/block.ts",
23+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/event": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/event.ts",
24+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/find": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/find.ts",
25+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/inline": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/inline.ts",
26+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/options": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/options.ts",
27+
"https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/parse": "https://raw.githubusercontent.com/jgm/djot.js/@djot/djot@0.3.2/src/parse.ts"
1128
}
1229
}

deno.lock

+33-105
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

import_map.json

-21
This file was deleted.

src/blogroll.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// deno-lint-ignore-file
2-
import { parseFeed } from "jsr:@mikaelporttila/rss@1.0.3";
2+
import { parseFeed } from "@rss";
33

44
export async function blogroll(): Promise<FeedEntry[]> {
55
const urls = (await Deno.readTextFile("content/blogroll.txt"))

src/djot.ts

+19-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { highlight } from "./highlight.ts";
22
import { HtmlString, time } from "./templates.ts";
33

4-
import * as djot from "djot";
4+
import { parse as djot_parse } from "@djot/parse.ts";
5+
import { HTMLRenderer, renderHTML } from "@djot/html.ts";
56
import {
67
AstNode,
78
BlockQuote,
@@ -17,10 +18,10 @@ import {
1718
Str,
1819
Url,
1920
Visitor,
20-
} from "djot/ast.ts";
21+
} from "@djot/ast.ts";
2122

2223
export function parse(source: string): Doc {
23-
return djot.parse(source);
24+
return djot_parse(source);
2425
}
2526

2627
type RenderCtx = {
@@ -31,8 +32,8 @@ type RenderCtx = {
3132

3233
export function render(doc: Doc, ctx: RenderCtx): HtmlString {
3334
let section: Section | undefined = undefined;
34-
const overrides: Visitor<djot.HTMLRenderer, string> = {
35-
section: (node: Section, r: djot.HTMLRenderer): string => {
35+
const overrides: Visitor<HTMLRenderer, string> = {
36+
section: (node: Section, r: HTMLRenderer): string => {
3637
const section_prev = section;
3738
section = node;
3839
const result = get_child(node, "heading")?.level == 1
@@ -41,9 +42,11 @@ export function render(doc: Doc, ctx: RenderCtx): HtmlString {
4142
section = section_prev;
4243
return result;
4344
},
44-
heading: (node: Heading, r: djot.HTMLRenderer) => {
45+
heading: (node: Heading, r: HTMLRenderer) => {
4546
const tag = `h${node.level}`;
46-
const date = node.level == 1 && ctx.date ? time(ctx.date, "meta").value : "";
47+
const date = node.level == 1 && ctx.date
48+
? time(ctx.date, "meta").value
49+
: "";
4750
const children = r.renderChildren(node);
4851
if (node.level == 1) ctx.title = get_string_content(node);
4952
const id = node.level > 1 && section?.attributes?.id;
@@ -58,11 +61,11 @@ export function render(doc: Doc, ctx: RenderCtx): HtmlString {
5861
}>${children} ${date}</${tag}>\n`;
5962
}
6063
},
61-
ordered_list: (node: OrderedList, r: djot.HTMLRenderer): string => {
64+
ordered_list: (node: OrderedList, r: HTMLRenderer): string => {
6265
if (node.style === "1)") add_class(node, "callout");
6366
return r.renderAstNodeDefault(node);
6467
},
65-
para: (node: Para, r: djot.HTMLRenderer) => {
68+
para: (node: Para, r: HTMLRenderer) => {
6669
if (node.children.length == 1 && node.children[0].tag == "image") {
6770
node.attributes = node.attributes || {};
6871
let cap = extract_cap(node);
@@ -83,7 +86,7 @@ ${r.renderChildren(node)}
8386
if (!ctx.summary) ctx.summary = get_string_content(node);
8487
return result;
8588
},
86-
block_quote: (node: BlockQuote, r: djot.HTMLRenderer) => {
89+
block_quote: (node: BlockQuote, r: HTMLRenderer) => {
8790
let source = undefined;
8891
if (node.children.length > 0) {
8992
const last_child: { tag: string; children?: AstNode[] } =
@@ -108,7 +111,7 @@ ${cite}
108111
</figure>
109112
`;
110113
},
111-
div: (node: Div, r: djot.HTMLRenderer): string => {
114+
div: (node: Div, r: HTMLRenderer): string => {
112115
let admon_icon = "";
113116
if (has_class(node, "note")) admon_icon = "info";
114117
if (has_class(node, "quiz")) admon_icon = "question";
@@ -167,7 +170,7 @@ ${pre}
167170
</figure>
168171
`;
169172
},
170-
image: (node: Image, r: djot.HTMLRenderer): string => {
173+
image: (node: Image, r: HTMLRenderer): string => {
171174
if (has_class(node, "video")) {
172175
if (!node.destination) throw "missing destination";
173176
if (has_class(node, "loop")) {
@@ -178,7 +181,7 @@ ${pre}
178181
}
179182
return r.renderAstNodeDefault(node);
180183
},
181-
span: (node: Span, r: djot.HTMLRenderer) => {
184+
span: (node: Span, r: HTMLRenderer) => {
182185
if (has_class(node, "code")) {
183186
const children = r.renderChildren(node);
184187
return `<code>${children}</code>`;
@@ -202,19 +205,19 @@ ${pre}
202205
}
203206
return r.renderAstNodeDefault(node);
204207
},
205-
str: (node: Str, r: djot.HTMLRenderer) => {
208+
str: (node: Str, r: HTMLRenderer) => {
206209
if (has_class(node, "dfn")) {
207210
return `<dfn>${node.text}</dfn>`;
208211
}
209212
return r.renderAstNodeDefault(node);
210213
},
211-
url: (node: Url, r: djot.HTMLRenderer) => {
214+
url: (node: Url, r: HTMLRenderer) => {
212215
add_class(node, "url");
213216
return r.renderAstNodeDefault(node);
214217
},
215218
};
216219

217-
const result = djot.renderHTML(doc, { overrides });
220+
const result = renderHTML(doc, { overrides });
218221
return new HtmlString(result);
219222
}
220223

src/highlight.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { html, HtmlString } from "./templates.ts";
22

3-
import hljs_ from "highlightjs/highlight.min.js";
3+
import hljs_ from "@highlightjs/highlight.min.js";
44
const hljs: any = hljs_;
55
hljs.configure({ classPrefix: "hl-" });
66

7-
import latex from "highlightjs/languages/latex.min.js";
8-
import nix from "highlightjs/languages/nix.min.js";
9-
import x86asm from "highlightjs/languages/x86asm.min.js";
7+
import latex from "@highlightjs/languages/latex.min.js";
8+
import nix from "@highlightjs/languages/nix.min.js";
9+
import x86asm from "@highlightjs/languages/x86asm.min.js";
1010
import zig from "./highlightjs-zig.js";
1111

1212
hljs.registerLanguage("latex", latex);

src/main.ts

+43-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import * as async from "std/async/mod.ts";
2-
import * as fs from "std/fs/mod.ts";
1+
import { debounce } from "@std/async/debounce";
32
import * as templates from "./templates.ts";
43
import * as djot from "./djot.ts";
54
import * as blogroll from "./blogroll.ts";
@@ -87,7 +86,7 @@ async function watch(params: { filter: string }) {
8786

8887
signal.resolve(true);
8988

90-
const rebuild_debounced = async.debounce(
89+
const rebuild_debounced = debounce(
9190
() => signal.resolve(true),
9291
16,
9392
);
@@ -119,26 +118,32 @@ async function build(params: {
119118
const t = performance.now();
120119

121120
const ctx = new Ctx();
122-
if (params.update) {
123-
await Deno.mkdir("./out/res", { recursive: true });
124-
} else {
125-
await fs.emptyDir("./out/res");
121+
122+
if (!params.update) {
123+
try {
124+
await Deno.remove("./out/www", { recursive: true });
125+
} catch (err) {
126+
if (!(err instanceof Deno.errors.NotFound)) {
127+
throw err;
128+
}
129+
}
126130
}
131+
await Deno.mkdir("./out/www", { recursive: true });
127132

128133
const posts = await collect_posts(ctx, params.filter);
129-
await update_file("out/res/index.html", templates.post_list(posts).value);
130-
await update_file("out/res/feed.xml", templates.feed(posts).value);
134+
await update_file("out/www/index.html", templates.post_list(posts).value);
135+
await update_file("out/www/feed.xml", templates.feed(posts).value);
131136
for (const post of posts) {
132137
await update_file(
133-
`out/res${post.path}`,
138+
`out/www${post.path}`,
134139
templates.post(post, params.spell).value,
135140
);
136141
}
137142

138143
if (params.blogroll) {
139144
const blogroll_posts = await blogroll.blogroll();
140145
await update_file(
141-
"out/res/blogroll.html",
146+
"out/www/blogroll.html",
142147
templates.blogroll_list(blogroll_posts).value,
143148
);
144149
}
@@ -148,15 +153,15 @@ async function build(params: {
148153
const text = await Deno.readTextFile(`content/${page}.dj`);
149154
const ast = await djot.parse(text);
150155
const html = djot.render(ast, {});
151-
await update_file(`out/res/${page}.html`, templates.page(page, html).value);
156+
await update_file(`out/www/${page}.html`, templates.page(page, html).value);
152157
}
153158

154159
const redirects = [
155160
["/2024/09/32/-what-is-io-uring.html", "/2024/09/23/what-is-io-uring.html"],
156161
];
157162

158163
for (const [from, to] of redirects) {
159-
await update_file(`out/res/${from}`, templates.redirect(to).value);
164+
await update_file(`out/www/${from}`, templates.redirect(to).value);
160165
}
161166

162167
const paths = [
@@ -176,11 +181,15 @@ async function build(params: {
176181
if (params.profile) console.log(JSON.stringify(ctx));
177182
}
178183

184+
function dirname(path: string): string {
185+
return path.substring(0, path.lastIndexOf("/"));
186+
}
187+
179188
async function update_file(path: string, content: Uint8Array | string) {
180189
if (!content) return;
181-
await fs.ensureFile(path);
182-
await fs.ensureDir("./build");
183-
const temp = await Deno.makeTempFile({ dir: "./build" });
190+
await Deno.mkdir(dirname(path), { recursive: true });
191+
await Deno.mkdir("./out/tmp", { recursive: true });
192+
const temp = await Deno.makeTempFile({ dir: "./out/tmp" });
184193
if (content instanceof Uint8Array) {
185194
await Deno.writeFile(temp, content);
186195
} else {
@@ -201,7 +210,7 @@ async function update_path(path: string) {
201210
await Promise.all(futs);
202211
} else {
203212
await update_file(
204-
`out/res/${path}`,
213+
`out/www/${path}`,
205214
await Deno.readFile(`content/${path}`),
206215
);
207216
}
@@ -223,21 +232,19 @@ export type Post = {
223232
async function collect_posts(ctx: Ctx, filter: string): Promise<Post[]> {
224233
const start = performance.now();
225234
const posts = [];
226-
for await (
227-
const entry of fs.walk("./content/posts", { includeDirs: false })
228-
) {
229-
if (!entry.name.endsWith(".dj")) continue;
235+
for await (const file_path of walk("./content/posts/")) {
236+
if (!file_path.endsWith(".dj")) continue;
230237
if (filter !== "") {
231-
if (entry.name.indexOf(filter) === -1) continue;
238+
if (file_path.indexOf(filter) === -1) continue;
232239
}
233-
const [, y, m, d, slug] = entry.name.match(
234-
/^(\d\d\d\d)-(\d\d)-(\d\d)-(.*)\.dj$/,
240+
const [, y, m, d, slug] = file_path.match(
241+
/^.*(\d\d\d\d)-(\d\d)-(\d\d)-(.*)\.dj$/,
235242
)!;
236243
const [year, month, day] = [y, m, d].map((it) => parseInt(it, 10));
237244
const date = new Date(Date.UTC(year, month - 1, day));
238245

239246
let t = performance.now();
240-
const text = await Deno.readTextFile(entry.path);
247+
const text = await Deno.readTextFile(file_path);
241248
ctx.read_ms += performance.now() - t;
242249

243250
t = performance.now();
@@ -267,4 +274,15 @@ async function collect_posts(ctx: Ctx, filter: string): Promise<Post[]> {
267274
return posts;
268275
}
269276

277+
async function* walk(root: string): AsyncIterableIterator<string> {
278+
for await (const entry of Deno.readDir(root)) {
279+
const path = `${root}${entry.name}`;
280+
if (entry.isDirectory) {
281+
yield* walk(path);
282+
} else {
283+
yield path;
284+
}
285+
}
286+
}
287+
270288
if (import.meta.main) await main();

vendor/manifest.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"folders": {
3+
"https://raw.githubusercontent.com/Maxim-Mazurok/": "raw.githubusercontent.com/#maxim-mazurok_46176",
4+
"https://raw.githubusercontent.com/MikaelPorttila/": "raw.githubusercontent.com/#mikaelporttila_0c368",
5+
"https://raw.githubusercontent.com/jgm/djot.js/": "raw.githubusercontent.com/jgm/#djot.js_af886"
6+
}
7+
}

0 commit comments

Comments
 (0)