/
modify_urls.ts
69 lines (58 loc) 路 1.96 KB
/
modify_urls.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { merge } from "../core/utils.ts";
import type { Element } from "../deps/dom.ts";
import type { Page, Site } from "../core.ts";
export interface Options {
/** The list of extensions this plugin applies to */
extensions: string[];
/** The function to generate the new url */
fn: (url: string, page: Page) => string;
}
// Default options
export const defaults: Options = {
extensions: [".html"],
fn: (url) => url,
};
/** A plugin to modify all URLs found in the HTML documents */
export default function (userOptions?: Partial<Options>) {
const options = merge(defaults, userOptions);
const replace = (url: string | null, page: Page) => {
return url ? options.fn(url, page) : "";
};
return (site: Site) => {
site.process(options.extensions, (page: Page) => {
page.document?.querySelectorAll("[href]").forEach((node) => {
const element = node as Element;
element.setAttribute(
"href",
replace(element.getAttribute("href"), page),
);
});
page.document?.querySelectorAll("[src]").forEach((node) => {
const element = node as Element;
element.setAttribute("src", replace(element.getAttribute("src"), page));
});
const srcsetUrlRegex =
/(?<=^\s*|,\s+|\s,+|\s[^\s,]+,+)[^\s,](?:\S*[^\s,])?/g;
page.document?.querySelectorAll("[srcset]").forEach((node) => {
const element = node as Element;
element.setAttribute(
"srcset",
element.getAttribute("srcset")!.replace(
srcsetUrlRegex,
(url: string) => replace(url, page),
),
);
});
page.document?.querySelectorAll("[imagesrcset]").forEach((node) => {
const element = node as Element;
element.setAttribute(
"imagesrcset",
element.getAttribute("imagesrcset")!.replace(
srcsetUrlRegex,
(url: string) => replace(url, page),
),
);
});
});
};
}