-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
103 lines (92 loc) · 4.32 KB
/
index.js
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const LINKS = [
{ "name": "cloudflare", "url": "https://www.cloudflare.com/" },
{ "name": "github", "url": "https://www.github.com" },
{ "name": "cloudflare wrangler", "url": "https://github.com/cloudflare/wrangler" },
];
const STATIC_LINK = 'https://static-links-page.signalnerve.workers.dev';
const avatar_src = "https://media-exp1.licdn.com/dms/image/C4E03AQFVThL5gSdlJA/profile-displayphoto-shrink_400_400/0?e=1609372800&v=beta&t=PV4etq9lHXANz2dtNLReKCwOTx0QG6wLKCkpBpvHXlM";
const SVG_linkedin = '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LinkedIn icon</title><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>';
const SVG_github = '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub icon</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>';
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
});
/**
* @param {Request} request
*/
async function handleRequest(request) {
const link = new URL(request.url);
try {
if (link.pathname === '/links') {
return new Response(JSON.stringify(LINKS), {
headers: { "Content-Type": "application/json;charset=UTF-8" }
});
}
else {
const jsonLink = new URL('/links', link);
return getStatic(jsonLink.href);
}
} catch(err) {
console.log("error: ", err.message)
return new Response("ERROR", { status: 500 });
}
};
async function getStatic() {
const res = await fetch(STATIC_LINK, {
headers: { "content-type": "text/html" }
});
return new HTMLRewriter()
.on("div#links", new LinksHandler())
.on("div#profile", new AttrRemover("style"))
.on("img#avatar", new AttrRewriter("src", avatar_src))
.on("h1#name", new ContentEdditor("add", "Linlu Liu"))
.on("div#social", new AttrRemover("style"))
.on("div#social", new ContentEdditor("add", `<a href="https://www.linkedin.com/in/linlu-liu-707b5b186/">${SVG_linkedin}</a>`))
.on("div#social", new ContentEdditor("add", `<a href="https://github.com/lil131">${SVG_github}</a>`))
.on("title", new ContentEdditor("set", "Linlu Liu"))
.on("body", new AttrRewriter("style", "background-color : #73C3D5"))
.transform(res);
}
class LinksHandler {
//add in a new a for each link in your API using HTMLRewriter.
element(element) {
try {
let myLinks = LINKS;
myLinks.forEach(link => {
element.append(`<a href=${link.url}>${link.name}</a>`, { html: Boolean });
});
} catch (error) {
console.log(error.message)
}
}
}
class AttrRemover {
constructor(attributeName) {
this.attributeName = attributeName;
}
element(element) {
element.removeAttribute('style');
}
}
class AttrRewriter {
constructor(attributeName, value) {
this.attributeName = attributeName;
this.value = value;
};
element(element) {
element.setAttribute(this.attributeName, this.value);
};
}
class ContentEdditor {
constructor(action, content) {
this.action = action;
this.content = content;
}
element(element) {
if (this.action === 'add') {
element.append(this.content, { html: Boolean });
}
if (this.action === 'set') {
element.setInnerContent(this.content);
}
}
}