This commit is contained in:
Cat /dev/Nulo 2023-01-12 15:30:52 -03:00
parent 9447af6a3a
commit 4f0fdc352c
4 changed files with 105 additions and 51 deletions

1
.npmrc Normal file
View file

@ -0,0 +1 @@
@nulo:registry=https://gitea.nulo.in/api/packages/nulo/npm/

View file

@ -3,6 +3,23 @@ import { basename, extname, join } from "path";
import { execFile as execFileCallback } from "child_process"; import { execFile as execFileCallback } from "child_process";
import { promisify } from "util"; import { promisify } from "util";
import * as commonmark from "commonmark"; import * as commonmark from "commonmark";
import {
a,
doctype,
h1,
header,
section,
li,
link,
meta,
metaUtf8,
render,
Renderable,
title,
ul,
h2,
raw,
} from "@nulo/html.js";
const execFile = promisify(execFileCallback); const execFile = promisify(execFileCallback);
@ -65,13 +82,14 @@ async function compilePage(config: Config, sourceFileName: string) {
const contentHtml = await compileContentHtml(config, sourceFileName); const contentHtml = await compileContentHtml(config, sourceFileName);
const html = const html = render(
generateHead(title, name) + ...generateHead(title, name),
(isIndex ...(isIndex
? "" ? []
: generateHeader(title, sourceFileName, fileConnections.length > 0)) + : generateHeader(title, sourceFileName, fileConnections.length > 0)),
contentHtml + raw(contentHtml),
generateConnectionsSection(fileConnections); ...generateConnectionsSection(fileConnections)
);
const outputPath = join(config.buildPath, name + ".html"); const outputPath = join(config.buildPath, name + ".html");
await writeFile(outputPath, html); await writeFile(outputPath, html);
@ -118,65 +136,97 @@ async function compileExecutableHtml(
// Generated HTML // Generated HTML
// ============================================== // ==============================================
function generateHead(title: string, outputName: string) { function generateHead(titlee: string, outputName: string): Renderable[] {
// TODO: deshardcodear og:url // TODO: deshardcodear og:url
return `<!doctype html> return [
<meta charset=utf-8> doctype(),
<meta name=viewport content="width=device-width, initial-scale=1.0"> metaUtf8,
<meta name=author content=Nulo> meta({
<meta property=og:title content="${title}"> name: "viewport",
<meta property=og:type content=website> content: "width=device-width, initial-scale=1.0",
<meta property=og:url content="https://nulo.in/${outputName}.html"> }),
<meta property=og:image content=cowboy.svg> meta({
<link rel=stylesheet href=drip.css> name: "author",
<link rel=icon href=cowboy.svg> content: "Nulo",
<title>${title}</title> }),
`; meta({
property: "og:title",
content: titlee,
}),
meta({
property: "og:type",
content: "website",
}),
meta({
property: "og:url",
content: `https://nulo.in/${outputName}.html`,
}),
meta({
property: "og:image",
content: "cowboy.svg",
}),
link({
rel: "stylesheet",
href: "drip.css",
}),
link({
rel: "icon",
href: "cowboy.svg",
}),
title(titlee),
];
} }
function generateHeader( function generateHeader(
title: string, title: string,
sourceCodePath: string, sourceCodePath: string,
linkConexiones = false linkConexiones = false
) { ): Renderable[] {
return `<a href=.>☚ Volver al inicio</a><header> return [
<h1>${title}</h1> a({ href: "." }, "☚ Volver al inicio"),
<a href="https://gitea.nulo.in/Nulo/sitio/commits/branch/ANTIFASCISTA/${sourceCodePath}">Historial</a>${ header(
linkConexiones h1(title),
? ` / a(
<a href="#conexiones">Conexiones</a>` {
: "" href: `https://gitea.nulo.in/Nulo/sitio/commits/branch/ANTIFASCISTA/${sourceCodePath}`,
} },
</header>`; "Historial"
),
...(linkConexiones ? [a({ href: "#conexiones" }, "Conexiones")] : [])
),
];
} }
function generateConnectionsSection(fileConnections: Connection[]): string { function generateConnectionsSection(
fileConnections: Connection[]
): Renderable[] {
return fileConnections.length > 0 return fileConnections.length > 0
? ` ? [
<section id=conexiones> section(
<h2> Conexiones (${fileConnections.length})</h2> { id: "conexiones" },
<ul> h2(`⥆ Conexiones (${fileConnections.length})`),
${fileConnections ul(
.map(({ linker }) => `<li><a href="${linker}.html">${linker}</a></li>`) ...fileConnections.map(({ linker }) =>
.join("\n")} li(a({ href: `${linker}.html` }, linker))
</ul> )
</section>` )
: ""; ),
]
: [];
} }
async function compilePageList(config: Config, pageList: string[]) { async function compilePageList(config: Config, pageList: 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 = const html = render(
generateHead(name, name) + ...generateHead(name, name),
generateHeader(name, "compilar.ts") + ...generateHeader(name, "compilar.ts"),
`<ul> ul(
${pageList ...pageList
.sort((a, b) => a.localeCompare(b, "es", { sensitivity: "base" })) .sort((a, b) => a.localeCompare(b, "es", { sensitivity: "base" }))
.map((name) => `<li><a href="${name}.html">${name}</a></li>`) .map((name) => li(a({ href: `${name}.html` }, name)))
.join("\n")} )
</ul> );
`;
await writeFile(outputPath, html); await writeFile(outputPath, html);
} }

View file

@ -19,6 +19,7 @@
"typescript": "^4.9.4" "typescript": "^4.9.4"
}, },
"dependencies": { "dependencies": {
"@nulo/html.js": "^0.0.2",
"commonmark": "^0.30.0" "commonmark": "^0.30.0"
} }
} }

View file

@ -1,6 +1,7 @@
lockfileVersion: 5.4 lockfileVersion: 5.4
specifiers: specifiers:
'@nulo/html.js': ^0.0.2
'@types/commonmark': ^0.27.5 '@types/commonmark': ^0.27.5
'@types/node': ^18.11.17 '@types/node': ^18.11.17
commonmark: ^0.30.0 commonmark: ^0.30.0
@ -8,6 +9,7 @@ specifiers:
typescript: ^4.9.4 typescript: ^4.9.4
dependencies: dependencies:
'@nulo/html.js': link:../html.js
commonmark: 0.30.0 commonmark: 0.30.0
devDependencies: devDependencies: