agregar buscador de la forma más hacky posible
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
parent
02c9e6454c
commit
91fcbf2fa0
5 changed files with 110 additions and 15 deletions
15
buscador.htm
Normal file
15
buscador.htm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<script src="_pagefind/pagefind-ui.js" type="text/javascript" defer="defer"></script>
|
||||||
|
<div id="search"></div>
|
||||||
|
<script>
|
||||||
|
window.addEventListener("DOMContentLoaded", (event) => {
|
||||||
|
new PagefindUI({
|
||||||
|
element: "#search",
|
||||||
|
showImages: false,
|
||||||
|
translations: {
|
||||||
|
placeholder: "Buscar en todo el sitio...",
|
||||||
|
clear_search: "Limpiar",
|
||||||
|
},
|
||||||
|
debounceTimeoutMs: 100,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
46
compilar.ts
46
compilar.ts
|
@ -23,8 +23,14 @@ import {
|
||||||
article,
|
article,
|
||||||
main,
|
main,
|
||||||
img,
|
img,
|
||||||
|
script,
|
||||||
|
basicElement,
|
||||||
|
nav,
|
||||||
|
source,
|
||||||
} from "@nulo/html.js";
|
} from "@nulo/html.js";
|
||||||
|
|
||||||
|
const div = basicElement("div");
|
||||||
|
|
||||||
const reader = new commonmark.Parser({ smart: true });
|
const reader = new commonmark.Parser({ smart: true });
|
||||||
const writer = new commonmark.HtmlRenderer({ safe: false, smart: true });
|
const writer = new commonmark.HtmlRenderer({ safe: false, smart: true });
|
||||||
|
|
||||||
|
@ -46,6 +52,8 @@ const config: Config = {
|
||||||
buildPath: "build",
|
buildPath: "build",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const buscadorHtml = await readFile("buscador.htm", "utf-8");
|
||||||
|
|
||||||
const connections = await scanForConnections(config.sourcePath);
|
const connections = await scanForConnections(config.sourcePath);
|
||||||
|
|
||||||
await mkdir(config.buildPath, { recursive: true });
|
await mkdir(config.buildPath, { recursive: true });
|
||||||
|
@ -69,25 +77,35 @@ await Promise.all(pageList.map(({ src }) => compilePage(config, src)));
|
||||||
|
|
||||||
await compilePageList(config, pageList);
|
await compilePageList(config, pageList);
|
||||||
|
|
||||||
|
async function compileFile(
|
||||||
|
config: Config,
|
||||||
|
sourceFileName: string
|
||||||
|
): Promise<{ contentHtml: string; image?: Image }> {
|
||||||
|
if (extname(sourceFileName) === ".md") {
|
||||||
|
const { html: contentHtml, image } = await compileMarkdownHtml(config, sourceFileName);
|
||||||
|
return { contentHtml, image };
|
||||||
|
} else if (sourceFileName.endsWith(".gen.js")) {
|
||||||
|
const contentHtml = await compileJavascript(config, sourceFileName);
|
||||||
|
return { contentHtml };
|
||||||
|
} else if (sourceFileName.endsWith(".htm"))
|
||||||
|
return { contentHtml: await readFile(sourceFileName, "utf-8") };
|
||||||
|
else throw false;
|
||||||
|
}
|
||||||
|
|
||||||
async function compilePage(config: Config, sourceFileName: string) {
|
async function compilePage(config: Config, sourceFileName: string) {
|
||||||
const name = basename(sourceFileName, extname(sourceFileName));
|
const name = basename(sourceFileName, extname(sourceFileName));
|
||||||
const isIndex = name === "index";
|
const isIndex = name === "index";
|
||||||
const title = isIndex ? "nulo.ar" : formatNameToPlainText(name);
|
const title = isIndex ? "nulo.ar" : formatNameToPlainText(name);
|
||||||
const fileConnections = connections.filter(({ linked }) => linked === name);
|
const fileConnections = connections.filter(({ linked }) => linked === name);
|
||||||
|
|
||||||
let contentHtml, image;
|
const { contentHtml, image } = await compileFile(config, sourceFileName);
|
||||||
if (extname(sourceFileName) === ".md") {
|
|
||||||
({ html: contentHtml, image } = await compileMarkdownHtml(config, sourceFileName));
|
|
||||||
} else if (sourceFileName.endsWith(".gen.js"))
|
|
||||||
contentHtml = await compileJavascript(config, sourceFileName);
|
|
||||||
else throw false;
|
|
||||||
|
|
||||||
const html = render(
|
const html = renderHtml(
|
||||||
...generateHead(title, name),
|
...generateHead(title, name),
|
||||||
article(
|
article(
|
||||||
{ itemscope: "", itemtype: "https://schema.org/Article" },
|
{ itemscope: "", itemtype: "https://schema.org/Article" },
|
||||||
...(isIndex ? [] : generateHeader(name, sourceFileName, fileConnections.length > 0, image)),
|
...(isIndex ? [] : generateHeader(name, sourceFileName, fileConnections.length > 0, image)),
|
||||||
main({ itemprop: "articleBody" }, raw(contentHtml)),
|
main({ itemprop: "articleBody", "data-pagefind-body": "" }, raw(contentHtml)),
|
||||||
...generateConnectionsSection(fileConnections)
|
...generateConnectionsSection(fileConnections)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -143,10 +161,13 @@ async function compileJavascript(config: Config, sourceFileName: string): Promis
|
||||||
// Generated HTML
|
// Generated HTML
|
||||||
// ==============================================
|
// ==============================================
|
||||||
|
|
||||||
|
function renderHtml(...world: Renderable[]): string {
|
||||||
|
return `<!doctype html><html lang="es">` + render(...world) + "</html>";
|
||||||
|
}
|
||||||
|
|
||||||
function generateHead(titlee: string, outputName: string): Renderable[] {
|
function generateHead(titlee: string, outputName: string): Renderable[] {
|
||||||
// TODO: deshardcodear og:url
|
// TODO: deshardcodear og:url
|
||||||
return [
|
return [
|
||||||
doctype(),
|
|
||||||
metaUtf8,
|
metaUtf8,
|
||||||
meta({
|
meta({
|
||||||
name: "viewport",
|
name: "viewport",
|
||||||
|
@ -244,7 +265,7 @@ function generateHeader(
|
||||||
): Renderable[] {
|
): Renderable[] {
|
||||||
const parsedTitle = parseName(name);
|
const parsedTitle = parseName(name);
|
||||||
return [
|
return [
|
||||||
a({ href: "." }, "☚ Volver al inicio"),
|
nav(a({ href: "." }, "☚ Volver al inicio"), raw(buscadorHtml)),
|
||||||
header(
|
header(
|
||||||
...(image ? [img({ ...image, itemprop: "image" })] : []),
|
...(image ? [img({ ...image, itemprop: "image" })] : []),
|
||||||
...("title" in parsedTitle
|
...("title" in parsedTitle
|
||||||
|
@ -293,7 +314,7 @@ function generateConnectionsSection(fileConnections: Connection[]): Renderable[]
|
||||||
async function compilePageList(config: Config, pageList: { src: string }[]) {
|
async function compilePageList(config: Config, pageList: { src: string }[]) {
|
||||||
const name = "Lista de páginas";
|
const name = "Lista de páginas";
|
||||||
const outputPath = join(config.buildPath, name + ".html");
|
const outputPath = join(config.buildPath, name + ".html");
|
||||||
const html = render(
|
const html = renderHtml(
|
||||||
...generateHead(name, name),
|
...generateHead(name, name),
|
||||||
...generateHeader(name, "compilar.ts"),
|
...generateHeader(name, "compilar.ts"),
|
||||||
ul(
|
ul(
|
||||||
|
@ -340,8 +361,7 @@ async function hackilyTransformHtml(html: string): Promise<string> {
|
||||||
.replaceAll("<a h", '<a rel="noopener noreferrer" h')
|
.replaceAll("<a h", '<a rel="noopener noreferrer" h')
|
||||||
.replaceAll(wikilinkExp, (_, l) => render(internalLink(l)));
|
.replaceAll(wikilinkExp, (_, l) => render(internalLink(l)));
|
||||||
for (const [match, archivo] of html.matchAll(/<nulo-sitio-reemplazar-con archivo="(.+?)" \/>/g)) {
|
for (const [match, archivo] of html.matchAll(/<nulo-sitio-reemplazar-con archivo="(.+?)" \/>/g)) {
|
||||||
if (!archivo.endsWith(".gen.js")) throw false;
|
html = html.replace(match, (await compileFile(config, archivo)).contentHtml);
|
||||||
html = html.replace(match, await compileJavascript(config, archivo));
|
|
||||||
}
|
}
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
2
index.md
2
index.md
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
> What's bizarre? I mean, we're all pretty bizarre.<br>Some of us are just better at hiding it, that's all.
|
> What's bizarre? I mean, we're all pretty bizarre.<br>Some of us are just better at hiding it, that's all.
|
||||||
|
|
||||||
|
<nulo-sitio-reemplazar-con archivo="buscador.htm" />
|
||||||
|
|
||||||
¡Buenas! Este es mi mundo, bienvenidx. ¿Que, [[Quién soy]]? Soy Nulo :)
|
¡Buenas! Este es mi mundo, bienvenidx. ¿Que, [[Quién soy]]? Soy Nulo :)
|
||||||
|
|
||||||
- Perdete en la [[Lista de páginas]]
|
- Perdete en la [[Lista de páginas]]
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "esbuild compilar.ts *.js --target=node18 --outdir=build-js --sourcemap && node --enable-source-maps --trace-uncaught build-js/compilar.js",
|
"build": "esbuild compilar.ts *.js --target=node18 --outdir=build-js --sourcemap && node --enable-source-maps --trace-uncaught build-js/compilar.js && pagefind --source build",
|
||||||
"check": "tsc",
|
"check": "tsc",
|
||||||
"refresh-feeds": "node feeds.js refresh"
|
"refresh-feeds": "node feeds.js refresh"
|
||||||
},
|
},
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
"@nulo/html.js": "^0.0.8",
|
"@nulo/html.js": "^0.0.8",
|
||||||
"commonmark": "^0.30.0",
|
"commonmark": "^0.30.0",
|
||||||
"domutils": "^3.0.1",
|
"domutils": "^3.0.1",
|
||||||
"htmlparser2": "^8.0.2"
|
"htmlparser2": "^8.0.2",
|
||||||
|
"pagefind": "^0.12.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
lockfileVersion: '6.0'
|
lockfileVersion: '6.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nulo/html.js':
|
'@nulo/html.js':
|
||||||
specifier: ^0.0.8
|
specifier: ^0.0.8
|
||||||
|
@ -13,6 +17,9 @@ dependencies:
|
||||||
htmlparser2:
|
htmlparser2:
|
||||||
specifier: ^8.0.2
|
specifier: ^8.0.2
|
||||||
version: 8.0.2
|
version: 8.0.2
|
||||||
|
pagefind:
|
||||||
|
specifier: ^0.12.0
|
||||||
|
version: 0.12.0
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@types/commonmark':
|
'@types/commonmark':
|
||||||
|
@ -240,6 +247,15 @@ packages:
|
||||||
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
|
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/agent-base@6.0.2:
|
||||||
|
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||||
|
engines: {node: '>= 6.0.0'}
|
||||||
|
dependencies:
|
||||||
|
debug: 4.3.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
/commonmark@0.30.0:
|
/commonmark@0.30.0:
|
||||||
resolution: {integrity: sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==}
|
resolution: {integrity: sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -250,6 +266,18 @@ packages:
|
||||||
string.prototype.repeat: 0.2.0
|
string.prototype.repeat: 0.2.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/debug@4.3.4:
|
||||||
|
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||||
|
engines: {node: '>=6.0'}
|
||||||
|
peerDependencies:
|
||||||
|
supports-color: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
supports-color:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
ms: 2.1.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/dom-serializer@2.0.0:
|
/dom-serializer@2.0.0:
|
||||||
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
|
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -325,6 +353,16 @@ packages:
|
||||||
entities: 4.5.0
|
entities: 4.5.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/https-proxy-agent@5.0.1:
|
||||||
|
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
dependencies:
|
||||||
|
agent-base: 6.0.2
|
||||||
|
debug: 4.3.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
/mdurl@1.0.1:
|
/mdurl@1.0.1:
|
||||||
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
|
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -333,6 +371,25 @@ packages:
|
||||||
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
|
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ms@2.1.2:
|
||||||
|
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/pagefind@0.12.0:
|
||||||
|
resolution: {integrity: sha512-LHUmlYYweBM6/rK1G+7z2q2WjYeycrB7g5Kuw0w6yMkYztzsEdO2Qj2pJ3z8gsWV8eJsYQyAGOAdqE3SZWlCqA==}
|
||||||
|
hasBin: true
|
||||||
|
requiresBuild: true
|
||||||
|
dependencies:
|
||||||
|
https-proxy-agent: 5.0.1
|
||||||
|
proxy-from-env: 1.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/proxy-from-env@1.1.0:
|
||||||
|
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/string.prototype.repeat@0.2.0:
|
/string.prototype.repeat@0.2.0:
|
||||||
resolution: {integrity: sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==}
|
resolution: {integrity: sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
Reference in a new issue