fix: markdown parsing

This commit is contained in:
Cory Dransfeldt 2024-11-04 17:00:13 -08:00
parent 0bbff10d8b
commit 74d3fe1b44
No known key found for this signature in database
2 changed files with 68 additions and 68 deletions

18
package-lock.json generated
View file

@ -722,9 +722,9 @@
"peer": true "peer": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.8.6", "version": "22.8.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz",
"integrity": "sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==", "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.19.8" "undici-types": "~6.19.8"
@ -1163,9 +1163,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001676", "version": "1.0.30001677",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz",
"integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==", "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -1788,9 +1788,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.50", "version": "1.5.51",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.51.tgz",
"integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==", "integrity": "sha512-kKeWV57KSS8jH4alKt/jKnvHPmJgBxXzGUSbMd4eQF+iOsVPl7bz2KUmu6eo80eMP8wVioTfTyTzdMgM15WXNg==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },

View file

@ -6,6 +6,64 @@ import { ICON_MAP } from "./icons.js";
const warningBanner = `<div class="banner warning"><p>${ICON_MAP["alertTriangle"]}There are probably spoilers after this banner — this is a warning about them.</p></div>`; const warningBanner = `<div class="banner warning"><p>${ICON_MAP["alertTriangle"]}There are probably spoilers after this banner — this is a warning about them.</p></div>`;
export const generateMetadata = (data, type, globals) => {
let title = globals["site_name"];
let description = data["description"] || globals["site_description"];
const canonicalUrl = data["url"]
? `${globals["url"]}${data["url"]}`
: globals["url"];
const ogImage = `${globals["cdn_url"]}${(data["backdrop"] ? data["backdrop"] : data["image"]) || globals["avatar"]}?class=w800`;
description = convert(
truncateHtml(md.render(description), 100, {
byWords: true,
ellipsis: "...",
}),
{
wordwrap: false,
selectors: [
{ selector: "a", options: { ignoreHref: true } },
{ selector: "h1", options: { uppercase: false } },
{ selector: "h2", options: { uppercase: false } },
{ selector: "h3", options: { uppercase: false } },
{ selector: "*", format: "block" },
],
}
)
.replace(/\s+/g, " ")
.trim();
switch (type) {
case "artist":
title = `Artists / ${data["name"]} / ${globals["site_name"]}`;
break;
case "genre":
title = `Genre / ${data["name"]} / ${globals["site_name"]}`;
break;
case "book":
title = `Books / ${data["title"]} by ${data["author"]} / ${globals["site_name"]}`;
break;
case "movie":
title = `Movies / ${data["title"]} (${data["year"]}) / ${globals["site_name"]}`;
break;
case "show":
title = `Shows / ${data["title"]} / ${globals["site_name"]}`;
break;
default:
title = `${data["title"] || globals["site_name"]}`;
}
return {
title,
description,
"og:title": title,
"og:description": description,
"og:image": ogImage,
"og:url": canonicalUrl,
canonical: canonicalUrl,
};
};
const generateAssociatedMediaHTML = (data, isGenre = false) => { const generateAssociatedMediaHTML = (data, isGenre = false) => {
const sections = [ const sections = [
{ {
@ -299,7 +357,7 @@ export const generateBookHTML = (book, globals) => {
</div> </div>
${ ${
book["review"] book["review"]
? `${warningBanner}<h2>My thoughts</h2><p>${book["review"]}</p>` ? `${warningBanner}<h2>My thoughts</h2><p>${md.render(book["review"])}</p>`
: "" : ""
} }
${generateAssociatedMediaHTML(book)} ${generateAssociatedMediaHTML(book)}
@ -346,64 +404,6 @@ export const generateGenreHTML = (genre) => {
`; `;
}; };
export const generateMetadata = (data, type, globals) => {
let title = globals["site_name"];
let description = data["description"] || globals["site_description"];
const canonicalUrl = data["url"]
? `${globals["url"]}${data["url"]}`
: globals["url"];
const ogImage = `${globals["cdn_url"]}${(data["backdrop"] ? data["backdrop"] : data["image"]) || globals["avatar"]}?class=w800`;
description = convert(
truncateHtml(md.render(description), 100, {
byWords: true,
ellipsis: "...",
}),
{
wordwrap: false,
selectors: [
{ selector: "a", options: { ignoreHref: true } },
{ selector: "h1", options: { uppercase: false } },
{ selector: "h2", options: { uppercase: false } },
{ selector: "h3", options: { uppercase: false } },
{ selector: "*", format: "block" },
],
}
)
.replace(/\s+/g, " ")
.trim();
switch (type) {
case "artist":
title = `Artists / ${data["name"]} / ${globals["site_name"]}`;
break;
case "genre":
title = `Genre / ${data["name"]} / ${globals["site_name"]}`;
break;
case "book":
title = `Books / ${data["title"]} by ${data["author"]} / ${globals["site_name"]}`;
break;
case "movie":
title = `Movies / ${data["title"]} (${data["year"]}) / ${globals["site_name"]}`;
break;
case "show":
title = `Shows / ${data["title"]} / ${globals["site_name"]}`;
break;
default:
title = `${data["title"] || globals["site_name"]}`;
}
return {
title,
description,
"og:title": title,
"og:description": description,
"og:image": ogImage,
"og:url": canonicalUrl,
canonical: canonicalUrl,
};
};
export const generateWatchingHTML = (media, globals, type) => { export const generateWatchingHTML = (media, globals, type) => {
const isShow = type === "show"; const isShow = type === "show";
const label = isShow ? "show" : "movie"; const label = isShow ? "show" : "movie";