diff options
| author | Joe Carstairs <65492573+Sycamost@users.noreply.github.com> | 2024-03-30 16:32:17 +0000 |
|---|---|---|
| committer | Joe Carstairs <65492573+Sycamost@users.noreply.github.com> | 2024-03-30 16:43:22 +0000 |
| commit | 261d89ebed13691e72312f44339063fee93130ac (patch) | |
| tree | 43cb6f1a9804352f666efaaee2bf7d6189906f08 /src/components/BlogFeed.astro | |
| parent | 9cb047768f79f3d14a5c6bcf420e76d600a20f2d (diff) | |
Astro initial commit
Diffstat (limited to 'src/components/BlogFeed.astro')
| -rw-r--r-- | src/components/BlogFeed.astro | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/components/BlogFeed.astro b/src/components/BlogFeed.astro new file mode 100644 index 0000000..d785524 --- /dev/null +++ b/src/components/BlogFeed.astro @@ -0,0 +1,76 @@ +--- +import type { CollectionEntry } from 'astro:content'; +import { getCollection } from 'astro:content'; + +export interface Props { + headingLevel?: 1 | 2 | 3 | 4 | 5 | 6, + hideAuthor?: boolean, +}; + +const { headingLevel = 2, hideAuthor = false } = Astro.props; + +const posts = (await getCollection('blog')); + +const distinctYears: number[] = posts + .map(post => post.data.pubDate.year) + .reduce<number[]>((acc, curr) => acc.includes(curr) ? acc : [...acc, curr], []) + .sort((a, b) => b - a); + +function matchesYear(year: number) { + return (post: CollectionEntry<'blog'>) => post.data.pubDate.year === year; +} + +function sortByPubDateDescending(post1: CollectionEntry<'blog'>, post2: CollectionEntry<'blog'>) { + const year1 = post1.data.pubDate.year; + const year2 = post2.data.pubDate.year; + const month1 = post1.data.pubDate.month; + const month2 = post2.data.pubDate.month; + const day1 = post1.data.pubDate.day; + const day2 = post2.data.pubDate.day; + + if (year1 !== year2) { + return year2 - year1; + } else if (month1 !== month2) { + return month2 - month1; + } else { + return day2 - day1; + } +} + +const headingElem = `h${headingLevel}`; + +const canonicalUrl = new URL(Astro.url.pathname, Astro.site) +--- + +<section class="h-feed"> + <Fragment set:html={` + <${headingElem} class="p-name"> + My blog + </${headingElem}> + `} /> + + <aside> + <p class={hideAuthor ? 'hidden' : ''}> + This blog is written by <a class="p-author h-card" href="/">Joe Carstairs</a> + </p> + + <p> + <a class="u-url" href={canonicalUrl}>Permalink</a> + </p> + </aside> + + <ul> + { distinctYears.map(year => ( + <li> + {year} + <ul> + { posts.filter(matchesYear(year)).sort(sortByPubDateDescending).map(post => ( + <li class="h-entry"> + <a class="u-url p-name" href={`/blog/${post.slug}`}>{post.data.title}</a> + </li> + )) } + </ul> + </li> + )) } + </ul> +</section>
\ No newline at end of file |
