Compare commits
No commits in common. "7daa6eb70d1adfef196bc041ff02e6ce47cb951e" and "5dbb8e7a8c0d6c87ca037e3acf97121670611fbe" have entirely different histories.
7daa6eb70d
...
5dbb8e7a8c
|
@ -15,8 +15,7 @@ export function transformPostMeta(metadata: PostMetadata, slug: string) : Post {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generates a list of all posts filtering by tags and series, reverse chronologically ordered.
|
export async function getPosts(tag: string | null = null) : Promise<Post[]> {
|
||||||
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);
|
||||||
|
|
||||||
|
@ -28,10 +27,8 @@ export async function getPosts(filter: { tag?: string, series?: string }) : Prom
|
||||||
return transformPostMeta(metadata, slug);
|
return transformPostMeta(metadata, slug);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
if (filter?.tag)
|
if (tag)
|
||||||
posts = posts.filter(post => post.tags.includes(filter.tag!))
|
posts = posts.filter(post => post.tags.includes(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;
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { TrackPrevious, TrackNext } from 'svelte-radix';
|
|
||||||
import type { PageData } from './$types';
|
import type { PageData } from './$types';
|
||||||
export let data: PageData;
|
export let data: PageData;
|
||||||
const { post, Content, seriesNeighbours } = data;
|
const { post, Content } = data;
|
||||||
import siteMetadata from '$content/metadata.json';
|
import siteMetadata from '$content/metadata.json';
|
||||||
import PostHeader from '$lib/components/PostHeader.svelte';
|
import PostHeader from '$lib/components/PostHeader.svelte';
|
||||||
</script>
|
</script>
|
||||||
|
@ -18,39 +17,3 @@
|
||||||
<Content />
|
<Content />
|
||||||
</article>
|
</article>
|
||||||
<hr />
|
<hr />
|
||||||
<ul id="series">
|
|
||||||
{#each seriesNeighbours as { name, prevSlug, prevTitle, nextSlug, nextTitle }}
|
|
||||||
<li class="series-neighbour">
|
|
||||||
{#if prevTitle}
|
|
||||||
<a href="/post/{prevSlug}">{prevTitle}</a>
|
|
||||||
<p class="dummy"><TrackPrevious /></p>
|
|
||||||
{/if}
|
|
||||||
<p class="series-tag">{name}</p>
|
|
||||||
{#if nextTitle}
|
|
||||||
<p class="dummy"><TrackNext /></p>
|
|
||||||
<a href="/post/{nextSlug}">{nextTitle}</a>
|
|
||||||
{/if}
|
|
||||||
</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
#series {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.series-tag {
|
|
||||||
color: var(--series);
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.dummy {
|
|
||||||
display: inline-block;
|
|
||||||
color: rgba(128,128,128, .6);
|
|
||||||
vertical-align: middle;
|
|
||||||
padding-left: 1em;
|
|
||||||
padding-right: 1em;
|
|
||||||
}
|
|
||||||
.series-neighbour {
|
|
||||||
padding-left: 2em;
|
|
||||||
padding-right: 2em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,54 +1,16 @@
|
||||||
import { error } from '@sveltejs/kit';
|
import { error } from '@sveltejs/kit';
|
||||||
import type { PageLoad } from './$types';
|
import type { PageLoad } from './$types';
|
||||||
import type { Post } from '$lib/types'
|
import { transformPostMeta } from '$lib/posts';
|
||||||
import { getPosts, transformPostMeta } from '$lib/posts';
|
|
||||||
|
|
||||||
export const load: PageLoad = async ({ params }) => {
|
export const load: PageLoad = async ({ params }) => {
|
||||||
try {
|
try {
|
||||||
const post = await import(`$content/post/${params.slug}.md`);
|
const post = await import(`$content/post/${params.slug}.md`);
|
||||||
if (!post) throw error(404);
|
if (!post) throw error(404);
|
||||||
const metadata: Post = transformPostMeta(post.metadata, params.slug);
|
|
||||||
const Content = post.default;
|
const Content = post.default;
|
||||||
|
|
||||||
const seriesNeighbours : {
|
|
||||||
name: string,
|
|
||||||
prevSlug?: string,
|
|
||||||
prevTitle?: string,
|
|
||||||
nextSlug?: string,
|
|
||||||
nextTitle?: string,
|
|
||||||
}[] = await Promise.all((metadata.series || []).map(async (series: string) => {
|
|
||||||
const postInSeries: Post[] = await getPosts({ series });
|
|
||||||
|
|
||||||
let prevSlug = undefined;
|
|
||||||
let prevTitle = undefined;
|
|
||||||
let nextSlug = undefined;
|
|
||||||
let nextTitle = undefined;
|
|
||||||
|
|
||||||
for (const p of postInSeries) {
|
|
||||||
if (p.date > metadata.date) {
|
|
||||||
nextSlug = p.slug;
|
|
||||||
nextTitle = p.title;
|
|
||||||
}
|
|
||||||
if (p.date < metadata.date) {
|
|
||||||
prevSlug = p.slug;
|
|
||||||
prevTitle = p.title;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: series,
|
|
||||||
prevSlug,
|
|
||||||
prevTitle,
|
|
||||||
nextSlug,
|
|
||||||
nextTitle,
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
post: metadata,
|
post: transformPostMeta(post.metadata, params.slug),
|
||||||
Content,
|
Content,
|
||||||
seriesNeighbours,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
|
@ -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({ tag: params.slug });
|
const posts = await getPosts(params.slug);
|
||||||
return {
|
return {
|
||||||
name: params.slug,
|
name: params.slug,
|
||||||
posts,
|
posts,
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
import { expect, test } from '@playwright/test';
|
|
||||||
|
|
||||||
test('Navigate in series', async ({ page }) => {
|
|
||||||
await page.goto('/post');
|
|
||||||
await page.getByText('Placeholder 2').click();
|
|
||||||
await expect(page).toHaveURL("/post/placeholder2/");
|
|
||||||
await page.getByText('Placeholder 1').click();
|
|
||||||
await expect(page).toHaveURL("/post/placeholder1/");
|
|
||||||
});
|
|
Loading…
Reference in New Issue