feat: Add treefmt #4
|
@ -1,25 +1,25 @@
|
|||
import { defineConfig } from 'astro/config';
|
||||
import { defineConfig } from "astro/config";
|
||||
|
||||
import rehypeSanitize from 'rehype-sanitize';
|
||||
import rehypeStringify from 'rehype-stringify';
|
||||
import rehypeRaw from 'rehype-raw';
|
||||
import remarkParse from 'remark-parse';
|
||||
import remarkRehype from 'remark-rehype';
|
||||
import rehypeSanitize from "rehype-sanitize";
|
||||
import rehypeStringify from "rehype-stringify";
|
||||
import rehypeRaw from "rehype-raw";
|
||||
import remarkParse from "remark-parse";
|
||||
import remarkRehype from "remark-rehype";
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
markdown: {
|
||||
remarkRehype: {
|
||||
allowDangerousHtml: true
|
||||
// This is fine because we are using rehypeSanitize to sanitize XSS.
|
||||
// See https://github.com/remarkjs/remark-rehype?tab=readme-ov-file#example-supporting-html-in-markdown-properly
|
||||
},
|
||||
remarkPlugins: [
|
||||
remarkParse,
|
||||
remarkRehype,
|
||||
rehypeRaw,
|
||||
rehypeSanitize,
|
||||
rehypeStringify,
|
||||
]
|
||||
}
|
||||
markdown: {
|
||||
remarkRehype: {
|
||||
allowDangerousHtml: true,
|
||||
// This is fine because we are using rehypeSanitize to sanitize XSS.
|
||||
// See https://github.com/remarkjs/remark-rehype?tab=readme-ov-file#example-supporting-html-in-markdown-properly
|
||||
},
|
||||
remarkPlugins: [
|
||||
remarkParse,
|
||||
remarkRehype,
|
||||
rehypeRaw,
|
||||
rehypeSanitize,
|
||||
rehypeStringify,
|
||||
],
|
||||
},
|
||||
});
|
||||
|
|
15
flake.nix
15
flake.nix
|
@ -28,11 +28,14 @@
|
|||
namespace = "auxolotl--docs-site";
|
||||
};
|
||||
|
||||
outputs-builder = channels: let
|
||||
treefmt = inputs.treefmt-nix.lib.evalModule channels.nixpkgs ./treefmt.nix;
|
||||
in {
|
||||
formatter = treefmt.config.build.wrapper;
|
||||
checks.formatting = treefmt.config.build.check inputs.self;
|
||||
};
|
||||
outputs-builder =
|
||||
channels:
|
||||
let
|
||||
treefmt = inputs.treefmt-nix.lib.evalModule channels.nixpkgs ./treefmt.nix;
|
||||
in
|
||||
{
|
||||
formatter = treefmt.config.build.wrapper;
|
||||
checks.formatting = treefmt.config.build.check inputs.self;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -13,4 +13,4 @@ const { Content } = await post.render();
|
|||
|
||||
<div class="contents">
|
||||
<Content />
|
||||
</div>
|
||||
</div>s
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2,162 +2,181 @@ import type { CollectionEntry } from "astro:content";
|
|||
import { parse, join, sep } from "node:path";
|
||||
|
||||
export interface PageLinkData {
|
||||
id: string;
|
||||
data: { title: string; };
|
||||
id: string;
|
||||
data: { title: string };
|
||||
}
|
||||
|
||||
type AllPathInformation = Map<string, CollectionEntry<"wiki"> | null>;
|
||||
|
||||
export interface Paths {
|
||||
siblingPages: PageLinkData[];
|
||||
siblingDirectories: PageLinkData[];
|
||||
childPages: PageLinkData[];
|
||||
childDirectories: PageLinkData[];
|
||||
siblingPages: PageLinkData[];
|
||||
siblingDirectories: PageLinkData[];
|
||||
childPages: PageLinkData[];
|
||||
childDirectories: PageLinkData[];
|
||||
|
||||
parentDirectory: PageLinkData | null;
|
||||
currentPage: PageLinkData;
|
||||
};
|
||||
|
||||
export function relativePagePaths(wikiEntries: PageLinkData[], currentPath: string): Paths {
|
||||
let currentPage: PageLinkData | undefined;
|
||||
let parentDirectory: PageLinkData | undefined | null;
|
||||
const siblingPages: Map<string, PageLinkData> = new Map();
|
||||
const childPages: Map<string, PageLinkData> = new Map();
|
||||
|
||||
const currentPathParsed = parse(currentPath);
|
||||
const currentPathExtensionless = join(currentPathParsed.dir, currentPathParsed.name);
|
||||
|
||||
const childDirectoryPaths: Set<string> = new Set();
|
||||
const siblingDirectoryPaths: Set<string> = new Set();
|
||||
|
||||
for (const entry of wikiEntries) {
|
||||
const pagePathParsed = parse(entry.id);
|
||||
const pagePathExtensionless = join(pagePathParsed.dir, pagePathParsed.name);
|
||||
|
||||
if (pagePathExtensionless === currentPathExtensionless) {
|
||||
currentPage = entry
|
||||
continue;
|
||||
}
|
||||
|
||||
const isInCurrentDirectory = pagePathParsed.dir === currentPathParsed.dir;
|
||||
if (isInCurrentDirectory) {
|
||||
siblingPages.set(pagePathExtensionless, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
const isDirectChild = pagePathParsed.dir === currentPathExtensionless;
|
||||
if (isDirectChild) {
|
||||
childPages.set(pagePathExtensionless, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
const isIndirectChild = pagePathParsed.dir.startsWith(currentPathExtensionless + sep);
|
||||
if (isIndirectChild) {
|
||||
const nextPathSeparator = pagePathParsed.dir.indexOf(sep, currentPathExtensionless.length + 1);
|
||||
|
||||
if (nextPathSeparator === -1) {
|
||||
childDirectoryPaths.add(pagePathParsed.dir);
|
||||
continue;
|
||||
}
|
||||
|
||||
childDirectoryPaths.add(pagePathParsed.dir.slice(0, nextPathSeparator));
|
||||
continue;
|
||||
}
|
||||
|
||||
const isIndirectInCurrentDirectory = currentPathParsed.dir === "" || pagePathParsed.dir.startsWith(currentPathParsed.dir + sep);
|
||||
if (isIndirectInCurrentDirectory) {
|
||||
const nextPathSeparator = pagePathParsed.dir.indexOf(sep, currentPathParsed.dir.length + 1);
|
||||
|
||||
if (nextPathSeparator === -1) {
|
||||
siblingDirectoryPaths.add(pagePathParsed.dir);
|
||||
continue;
|
||||
}
|
||||
|
||||
siblingDirectoryPaths.add(pagePathParsed.dir.slice(0, nextPathSeparator));
|
||||
continue;
|
||||
}
|
||||
|
||||
const isParentDirectory = pagePathExtensionless === currentPathParsed.dir;
|
||||
if (isParentDirectory) {
|
||||
parentDirectory = entry;
|
||||
}
|
||||
}
|
||||
|
||||
const childDirectories: PageLinkData[] = [];
|
||||
for (const childDirectoryPath of childDirectoryPaths.values()) {
|
||||
const childDirectoryPage = childPages.get(childDirectoryPath);
|
||||
if (childDirectoryPage) {
|
||||
childDirectories.push(childDirectoryPage);
|
||||
childPages.delete(childDirectoryPath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const childDirectoryPathParsed = parse(childDirectoryPath);
|
||||
childDirectories.push({
|
||||
id: childDirectoryPath,
|
||||
data: { title: childDirectoryPathParsed.name }
|
||||
});
|
||||
}
|
||||
|
||||
const siblingDirectories: PageLinkData[] = [];
|
||||
for (const siblingDirectoryPath of siblingDirectoryPaths.values()) {
|
||||
const siblingDirectoryPage = siblingPages.get(siblingDirectoryPath);
|
||||
if (siblingDirectoryPage) {
|
||||
siblingDirectories.push(siblingDirectoryPage);
|
||||
siblingPages.delete(siblingDirectoryPath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const siblingDirectoryPathParsed = parse(siblingDirectoryPath);
|
||||
siblingDirectories.push({
|
||||
id: siblingDirectoryPath,
|
||||
data: { title: siblingDirectoryPathParsed.name }
|
||||
});
|
||||
}
|
||||
|
||||
if (currentPage === undefined) {
|
||||
currentPage = {
|
||||
id: currentPath,
|
||||
data: { title: currentPathParsed.name }
|
||||
};
|
||||
}
|
||||
|
||||
if (parentDirectory === undefined) {
|
||||
if (currentPathParsed.dir) {
|
||||
const parentDirectoryPathParsed = parse(currentPathParsed.dir);
|
||||
parentDirectory = {
|
||||
id: currentPathParsed.dir,
|
||||
data: { title: parentDirectoryPathParsed.name }
|
||||
};
|
||||
} else {
|
||||
parentDirectory = null;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
siblingPages: Array.from(siblingPages.values()).sort(),
|
||||
childPages: Array.from(childPages.values()).sort(),
|
||||
|
||||
siblingDirectories: siblingDirectories.sort(),
|
||||
childDirectories: childDirectories.sort(),
|
||||
|
||||
currentPage,
|
||||
parentDirectory,
|
||||
}
|
||||
parentDirectory: PageLinkData | null;
|
||||
currentPage: PageLinkData;
|
||||
}
|
||||
|
||||
export function allPageAndDirectoryPaths(wikiEntries: CollectionEntry<"wiki">[]): AllPathInformation {
|
||||
const pathInformation: Map<string, CollectionEntry<"wiki"> | null> = new Map();
|
||||
export function relativePagePaths(
|
||||
wikiEntries: PageLinkData[],
|
||||
currentPath: string,
|
||||
): Paths {
|
||||
let currentPage: PageLinkData | undefined;
|
||||
let parentDirectory: PageLinkData | undefined | null;
|
||||
const siblingPages: Map<string, PageLinkData> = new Map();
|
||||
const childPages: Map<string, PageLinkData> = new Map();
|
||||
|
||||
for (const entry of wikiEntries) {
|
||||
pathInformation.set(entry.id, entry);
|
||||
const currentPathParsed = parse(currentPath);
|
||||
const currentPathExtensionless = join(
|
||||
currentPathParsed.dir,
|
||||
currentPathParsed.name,
|
||||
);
|
||||
|
||||
let parsedEntryPath = parse(entry.id);
|
||||
while (parsedEntryPath.dir) {
|
||||
pathInformation.set(parsedEntryPath.dir, null);
|
||||
parsedEntryPath = parse(parsedEntryPath.dir);
|
||||
}
|
||||
const childDirectoryPaths: Set<string> = new Set();
|
||||
const siblingDirectoryPaths: Set<string> = new Set();
|
||||
|
||||
for (const entry of wikiEntries) {
|
||||
const pagePathParsed = parse(entry.id);
|
||||
const pagePathExtensionless = join(pagePathParsed.dir, pagePathParsed.name);
|
||||
|
||||
if (pagePathExtensionless === currentPathExtensionless) {
|
||||
currentPage = entry;
|
||||
continue;
|
||||
}
|
||||
|
||||
return pathInformation;
|
||||
}
|
||||
const isInCurrentDirectory = pagePathParsed.dir === currentPathParsed.dir;
|
||||
if (isInCurrentDirectory) {
|
||||
siblingPages.set(pagePathExtensionless, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
const isDirectChild = pagePathParsed.dir === currentPathExtensionless;
|
||||
if (isDirectChild) {
|
||||
childPages.set(pagePathExtensionless, entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
const isIndirectChild = pagePathParsed.dir.startsWith(
|
||||
currentPathExtensionless + sep,
|
||||
);
|
||||
if (isIndirectChild) {
|
||||
const nextPathSeparator = pagePathParsed.dir.indexOf(
|
||||
sep,
|
||||
currentPathExtensionless.length + 1,
|
||||
);
|
||||
|
||||
if (nextPathSeparator === -1) {
|
||||
childDirectoryPaths.add(pagePathParsed.dir);
|
||||
continue;
|
||||
}
|
||||
|
||||
childDirectoryPaths.add(pagePathParsed.dir.slice(0, nextPathSeparator));
|
||||
continue;
|
||||
}
|
||||
|
||||
const isIndirectInCurrentDirectory =
|
||||
currentPathParsed.dir === "" ||
|
||||
pagePathParsed.dir.startsWith(currentPathParsed.dir + sep);
|
||||
if (isIndirectInCurrentDirectory) {
|
||||
const nextPathSeparator = pagePathParsed.dir.indexOf(
|
||||
sep,
|
||||
currentPathParsed.dir.length + 1,
|
||||
);
|
||||
|
||||
if (nextPathSeparator === -1) {
|
||||
siblingDirectoryPaths.add(pagePathParsed.dir);
|
||||
continue;
|
||||
}
|
||||
|
||||
siblingDirectoryPaths.add(pagePathParsed.dir.slice(0, nextPathSeparator));
|
||||
continue;
|
||||
}
|
||||
|
||||
const isParentDirectory = pagePathExtensionless === currentPathParsed.dir;
|
||||
if (isParentDirectory) {
|
||||
parentDirectory = entry;
|
||||
}
|
||||
}
|
||||
|
||||
const childDirectories: PageLinkData[] = [];
|
||||
for (const childDirectoryPath of childDirectoryPaths.values()) {
|
||||
const childDirectoryPage = childPages.get(childDirectoryPath);
|
||||
if (childDirectoryPage) {
|
||||
childDirectories.push(childDirectoryPage);
|
||||
childPages.delete(childDirectoryPath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const childDirectoryPathParsed = parse(childDirectoryPath);
|
||||
childDirectories.push({
|
||||
id: childDirectoryPath,
|
||||
data: { title: childDirectoryPathParsed.name },
|
||||
});
|
||||
}
|
||||
|
||||
const siblingDirectories: PageLinkData[] = [];
|
||||
for (const siblingDirectoryPath of siblingDirectoryPaths.values()) {
|
||||
const siblingDirectoryPage = siblingPages.get(siblingDirectoryPath);
|
||||
if (siblingDirectoryPage) {
|
||||
siblingDirectories.push(siblingDirectoryPage);
|
||||
siblingPages.delete(siblingDirectoryPath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const siblingDirectoryPathParsed = parse(siblingDirectoryPath);
|
||||
siblingDirectories.push({
|
||||
id: siblingDirectoryPath,
|
||||
data: { title: siblingDirectoryPathParsed.name },
|
||||
});
|
||||
}
|
||||
|
||||
if (currentPage === undefined) {
|
||||
currentPage = {
|
||||
id: currentPath,
|
||||
data: { title: currentPathParsed.name },
|
||||
};
|
||||
}
|
||||
|
||||
if (parentDirectory === undefined) {
|
||||
if (currentPathParsed.dir) {
|
||||
const parentDirectoryPathParsed = parse(currentPathParsed.dir);
|
||||
parentDirectory = {
|
||||
id: currentPathParsed.dir,
|
||||
data: { title: parentDirectoryPathParsed.name },
|
||||
};
|
||||
} else {
|
||||
parentDirectory = null;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
siblingPages: Array.from(siblingPages.values()).sort(),
|
||||
childPages: Array.from(childPages.values()).sort(),
|
||||
|
||||
siblingDirectories: siblingDirectories.sort(),
|
||||
childDirectories: childDirectories.sort(),
|
||||
|
||||
currentPage,
|
||||
parentDirectory,
|
||||
};
|
||||
}
|
||||
|
||||
export function allPageAndDirectoryPaths(
|
||||
wikiEntries: CollectionEntry<"wiki">[],
|
||||
): AllPathInformation {
|
||||
const pathInformation: Map<string, CollectionEntry<"wiki"> | null> =
|
||||
new Map();
|
||||
|
||||
for (const entry of wikiEntries) {
|
||||
pathInformation.set(entry.id, entry);
|
||||
|
||||
let parsedEntryPath = parse(entry.id);
|
||||
while (parsedEntryPath.dir) {
|
||||
pathInformation.set(parsedEntryPath.dir, null);
|
||||
parsedEntryPath = parse(parsedEntryPath.dir);
|
||||
}
|
||||
}
|
||||
|
||||
return pathInformation;
|
||||
}
|
||||
|
|
2
src/reset.d.ts
vendored
2
src/reset.d.ts
vendored
|
@ -1 +1 @@
|
|||
import "@total-typescript/ts-reset";
|
||||
import "@total-typescript/ts-reset";
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
.contents table {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.contents td {
|
||||
padding: 1em;
|
||||
border: 1px solid black;
|
||||
padding: 1em;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
.contents {
|
||||
overflow: scroll;
|
||||
height: 100vh;
|
||||
padding: 0em 2em;
|
||||
}
|
||||
overflow: scroll;
|
||||
height: 100vh;
|
||||
padding: 0em 2em;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
a:visited {
|
||||
color: blue;
|
||||
color: blue;
|
||||
}
|
||||
|
||||
.contents {
|
||||
width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"extends": "astro/tsconfigs/strictest"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue