Compare commits

..

1 Commits

Author SHA1 Message Date
Leni Aniva d18c3f62c7
refactor: Add series filter on `getPosts` 2024-10-27 20:17:42 -07:00
8 changed files with 19 additions and 49 deletions

View File

@ -11,7 +11,7 @@ repos:
hooks: hooks:
- id: conventional-pre-commit - id: conventional-pre-commit
stages: [commit-msg] stages: [commit-msg]
args: [feat, fix, chore, test, build, merge, refactor, doc] args: [feat, fix, chore, test, build, merge, refactor]
- repo: local - repo: local
hooks: hooks:
- id: eslint - id: eslint

View File

@ -19,18 +19,6 @@ To insert custom content, create a directory with a similar structure to
directory. The website will be built statically in `build/`. Note that changing directory. The website will be built statically in `build/`. Note that changing
`favicon.svg` will require modifying the `static/` folder. `favicon.svg` will require modifying the `static/` folder.
Set `metadata.json` based on the example to have a custom avatar and background
image.
- `name`: Displayed name on the home page
- `blogName`: Displayed name of the blog
- `url`: The site url
- `frontDescription`: The text above the main navbar
- `frontCover`: Path to the cover image
- `picture`: Avatar
- `links`: A map of brands to links
- `extra`: Extra pages showing on the navbar
- `markdown`: `{ "highlighterLangs": [ ... ], "katex": [ ... ] }`
## Developing ## Developing
Install [pre-commit](https://pre-commit.com/). Install [pre-commit](https://pre-commit.com/).

View File

@ -12,12 +12,5 @@
}, },
"extra": [ "extra": [
{ "route": "/archives", "name": "Archives" } { "route": "/archives", "name": "Archives" }
], ]
"markdown": {
"highlighterLangs": [
"python",
"lean",
"tex"
]
}
} }

View File

@ -26,7 +26,3 @@ $$
$$ $$
\vec z^{(l+1)} = \mat M\vec z^{(l)} + \vec b \vec z^{(l+1)} = \mat M\vec z^{(l)} + \vec b
$$ $$
```tex
\\newcommand{\\cirno}{9}
```

View File

@ -15,7 +15,8 @@ export function transformPostMeta(metadata: PostMetadata, slug: string) : Post {
}; };
} }
export async function getPosts(tag: string | null = null) : Promise<Post[]> { // Generates a list of all posts filtering by tags and series
export async function getPosts(filter: { tag?: string, series?: string }) : Promise<Post[]> {
const allPostFiles = import.meta.glob('$content/post/*.md'); const allPostFiles = import.meta.glob('$content/post/*.md');
const iterablePostFiles = Object.entries(allPostFiles); const iterablePostFiles = Object.entries(allPostFiles);
@ -27,8 +28,10 @@ export async function getPosts(tag: string | null = null) : Promise<Post[]> {
return transformPostMeta(metadata, slug); return transformPostMeta(metadata, slug);
}) })
); );
if (tag) if (filter?.tag)
posts = posts.filter(post => post.tags.includes(tag)) posts = posts.filter(post => post.tags.includes(filter.tag!))
if (filter?.series)
posts = posts.filter(post => post.series?.includes(filter.series!) ?? false)
posts.sort((post1, post2) => { posts.sort((post1, post2) => {
const date1: Date = post1.date; const date1: Date = post1.date;

View File

@ -19,22 +19,15 @@
import metadata from '$content/metadata.json'; import metadata from '$content/metadata.json';
const iconMap: Map<string, string> = { const iconMap: Map<string, string> = {
"orcid": "fa-brands fa-orcid", "bitbucket": "fa-brands fa-bitbucket",
"google-scholar": "fa-brands fa-google-scholar",
"discord": "fa-brands fa-discord", "discord": "fa-brands fa-discord",
"email": "fa-solid fa-envelope", "email": "fa-solid fa-envelope",
"bitbucket": "fa-brands fa-bitbucket",
"github": "fa-brands fa-github", "github": "fa-brands fa-github",
"gitlab": "fa-brands fa-gitlab", "gitlab": "fa-brands fa-gitlab",
"open-source": "fa-brands fa-osi", "google-scholar": "fa-brands fa-google-scholar",
"bluesky": "fa-brands fa-bluesky",
"youtube": "fa-brands fa-youtube",
"instagram": "fa-brands fa-instagram", "instagram": "fa-brands fa-instagram",
"bandcamp": "fa-brands fa-bandcamp", "open-source": "fa-brands fa-osi",
"pixiv": "fa-brands fa-pixiv", "orcid": "fa-brands fa-orcid",
}; };
const iconLinks: [string, string][] = Object.entries(metadata.links).map( const iconLinks: [string, string][] = Object.entries(metadata.links).map(
([key, link]) => [iconMap[key], link]); ([key, link]) => [iconMap[key], link]);

View File

@ -2,7 +2,7 @@ import type { PageLoad } from './$types';
import { getPosts } from '$lib/posts'; import { getPosts } from '$lib/posts';
export const load: PageLoad = async ({ params }) => { export const load: PageLoad = async ({ params }) => {
const posts = await getPosts(params.slug); const posts = await getPosts({ tag: params.slug });
return { return {
name: params.slug, name: params.slug,
posts, posts,

View File

@ -1,6 +1,5 @@
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import adapter from '@sveltejs/adapter-static'; import adapter from '@sveltejs/adapter-static';
import fs from 'fs';
import { mdsvex, escapeSvelte } from 'mdsvex'; import { mdsvex, escapeSvelte } from 'mdsvex';
import remarkAlert from './src/lib/markdown.js' import remarkAlert from './src/lib/markdown.js'
@ -13,9 +12,7 @@ import remarkMath from 'remark-math'
const contentDir = process.env?.CHRYSOBLOG_CONTENT ?? "src/content"; const contentDir = process.env?.CHRYSOBLOG_CONTENT ?? "src/content";
const metadata = await fs.promises.readFile(contentDir + "/metadata.json") const langs = [
.then((file) => JSON.parse(file.toString()));
const langs = metadata?.markdown.highlighterLangs ?? [
"javascript", "javascript",
"lean", "lean",
"lisp", "lisp",
@ -29,7 +26,11 @@ const langs = metadata?.markdown.highlighterLangs ?? [
"c++", "c++",
"sh", "sh",
]; ];
const katexOptions = metadata?.markdown.katex ?? { const highlightingThemes = {
light: 'vitesse-light',
dark: 'vitesse-dark',
};
const katexOptions = {
macros: { macros: {
"\\Nat": "\\mathbb N", "\\Nat": "\\mathbb N",
"\\Complex": "\\mathbb C", "\\Complex": "\\mathbb C",
@ -38,10 +39,6 @@ const katexOptions = metadata?.markdown.katex ?? {
"\\rv": "\\mathrm", "\\rv": "\\mathrm",
}, },
}; };
const highlightingThemes = {
light: 'vitesse-light',
dark: 'vitesse-dark',
};
const themes = Object.keys(highlightingThemes).map(function(k){ return highlightingThemes[k] }); const themes = Object.keys(highlightingThemes).map(function(k){ return highlightingThemes[k] });
const highlighter = await getHighlighter({ const highlighter = await getHighlighter({