add markdown rendering, copy in old posts
parent
6cddfdf8fe
commit
d89d92d393
@ -0,0 +1,28 @@
|
|||||||
|
import { notFound } from 'next/navigation'
|
||||||
|
import Markdown from 'markdown-to-jsx'
|
||||||
|
|
||||||
|
import InfoBar from '~/components/InfoBar'
|
||||||
|
import { getPostSlugs, loadSinglePage } from '~/utils/post'
|
||||||
|
|
||||||
|
export async function generateStaticParams() {
|
||||||
|
const slugs = await getPostSlugs()
|
||||||
|
return slugs.map((slug: string) => ({ slug }))
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function Post({ params: { slug } }) {
|
||||||
|
const post = await loadSinglePage(slug)
|
||||||
|
if (!post) notFound()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h1 className="pageTitle">
|
||||||
|
{post.title}
|
||||||
|
</h1>
|
||||||
|
<main className="mainColumn">
|
||||||
|
<InfoBar authorName={post.author} publishedDate={post.date} />
|
||||||
|
<Markdown>{post.body}</Markdown>
|
||||||
|
</main>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: Thoughts on Neovim
|
||||||
|
subtitle: Who even needs an IDE anyways?
|
||||||
|
author: rose
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why I'm using Neovim
|
||||||
|
|
||||||
|
When I first started coding in high school and then later in early
|
||||||
|
college I used to jump around between editors a lot more than I do today.
|
||||||
|
I used Notepad++, then Visual Studio, briefly Netbeans, then Atom.
|
||||||
|
|
||||||
|
But since settling into frontend web development I've stayed with VSCode
|
||||||
|
for a very long time. I liked it because it was straightforward to get
|
||||||
|
started with, but versatile enough to extend for other languages.
|
||||||
|
Between various jobs and projects I used it for Javascript, Java, C#,
|
||||||
|
Rust, and C - and it did admirably at pretty much all of these.
|
||||||
|
|
||||||
|
But about a year ago I saw that VSCode had a Neovim plugin, and I was
|
||||||
|
intrigued. I'd wanted to get more familiar with Vim beyond the basic
|
||||||
|
hjkl navigation, and this seemed like a great way to do that!
|
||||||
|
|
||||||
|
So for the last year and change I've had the
|
||||||
|
<a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=asvetliakov.vscode-neovim">vscode-neovim</a> plugin
|
||||||
|
plugin installed, and I've been really enjoying it!
|
||||||
|
|
||||||
|
I quickly fell in love with visual block mode, or the "delete N words"
|
||||||
|
commands. They're just so handy I suddenly felt like they were missing
|
||||||
|
if I needed to edit code any other way!
|
||||||
|
|
||||||
|
But over the weekend I made the jump from using Neovim inside VSCode to
|
||||||
|
using it more or less on its own. I saw a video that mentioned the
|
||||||
|
AstroNvim configuration framework and Neovide, and decided "yeah, I think
|
||||||
|
I want to try that", and a few days later . . . here we are.
|
||||||
|
|
||||||
|
## How is it going?
|
||||||
|
|
||||||
|
Overall, surprisingly well.
|
||||||
|
|
||||||
|
The AstroNvim config I'm using already had NeoTree set up which is
|
||||||
|
very nice. I've figured out how to get ESLint and Prettier configured
|
||||||
|
for work, rust-analyzer installed for my own projects, I've been poking
|
||||||
|
at themes over and over again, and honestly . . . I'm really liking this.
|
||||||
|
|
||||||
|
Getting Neovide to connect to a VM over the network was relatively
|
||||||
|
straightforward, I love how easy it is to drop my config into git and
|
||||||
|
keep it synced between computers, and finally having proper mouse support
|
||||||
|
(which I never could get sorted out with my terminal) is a pretty big
|
||||||
|
game changer for when I'm just reading code.
|
||||||
|
|
||||||
|
Also, I'd be lying if I said that I didn't love the smooth scrolling and
|
||||||
|
cursor animation. I am a simple girl after all.
|
||||||
|
|
||||||
|
## Should you try replacing your IDE?
|
||||||
|
|
||||||
|
That is a tricky question to answer.
|
||||||
|
|
||||||
|
I was comfortable spending some time experimenting with this because I
|
||||||
|
already had decent familiarity with Vim and had been using Neovim
|
||||||
|
specifically for a while. If you don't have any similar experience,
|
||||||
|
the learning curve is going to be pretty steep.
|
||||||
|
|
||||||
|
But hey - if you're looking for a challenge, you'll definitely learn
|
||||||
|
a lot.
|
||||||
|
|
@ -0,0 +1,75 @@
|
|||||||
|
---
|
||||||
|
title: Advent of Wasm
|
||||||
|
subtitle: Now with 87% more pain
|
||||||
|
author: rose
|
||||||
|
---
|
||||||
|
|
||||||
|
So the last few years I have done Advent of Code off and on. Sometimes
|
||||||
|
I have tried to learn a new language, other times I was just trying to
|
||||||
|
beat my dad each evening. This year though, this year I don't know what
|
||||||
|
I was thinking.
|
||||||
|
|
||||||
|
It was several weeks after everyone else had started, I had largely written
|
||||||
|
it off for the year - I was not up for it. Until a terrible idea crossed
|
||||||
|
my mind.
|
||||||
|
|
||||||
|
Like an intrusive thought, my mind asked: "Well you've been wanting to do
|
||||||
|
something in web assembly for a while right? How bad could it be?"
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
Turns out I was definitely not ready for this.
|
||||||
|
|
||||||
|
## So what was so hard about it?
|
||||||
|
|
||||||
|
More than anything else, I forgot how much you need to do by hand to do
|
||||||
|
any sort of assembly. The first day saw me spending several hours just
|
||||||
|
on some loader code to pass the puzzle input in from JS, call a wasm
|
||||||
|
function, and then read back the result.
|
||||||
|
|
||||||
|
Next was a few functions for reading numbers out of the wasm memory buffer,
|
||||||
|
parsing them from ascii, etc. The core read loop was not too tricky, but
|
||||||
|
the bit that took far longer than it had any reason to was converting my
|
||||||
|
answer back to ascii and shoving it into an output area.
|
||||||
|
|
||||||
|
Really none of it was surprising, and none of it <em><strong>*should*</strong></em> have
|
||||||
|
been that hard ... it's just been a while since this Javascript girl
|
||||||
|
has written truly low-level code.
|
||||||
|
|
||||||
|
To make matters worse I got hard-core distracted by the non-wasm part of
|
||||||
|
my wasm project. After the first day I returned to my stub JS loader and
|
||||||
|
expanded it into a little wasm explorer.
|
||||||
|
|
||||||
|
I added a code view, syntax highlighting, auto-loaded my puzzle inputs,
|
||||||
|
even made a janky little dynamic list that would automatically pick up
|
||||||
|
new days' solutions as I added them to the repo without needing me to
|
||||||
|
touch the loader page each day.
|
||||||
|
|
||||||
|
In the end I'm really quite proud of it, I will absolutely be reusing
|
||||||
|
this setup for future years, and you should
|
||||||
|
<a href="https://aoc2022.tempest.dev/" target="_blank">check it out</a>
|
||||||
|
if you haven't already ... but for wanting to challenge myself with
|
||||||
|
something new I was doing a lot of the same-old.
|
||||||
|
|
||||||
|
Ultimately I got through 3 days before giving up jusst because every
|
||||||
|
step along the way involved <em><strong>*so much*</strong></em> extra
|
||||||
|
code. I may come back to some of the puzzles later, but for now I'm
|
||||||
|
kind of happy with what I did, and I don't feel like I need to prove
|
||||||
|
myself by doing more. I was doing it for fun, and so I stopped when
|
||||||
|
it stopped being fun.
|
||||||
|
|
||||||
|
## Tips if you want to get into writing wasm by hand?
|
||||||
|
|
||||||
|
Uhh ... maybe consider don't?
|
||||||
|
|
||||||
|
Jokes aside: do a throwaway project or two so you get used to passing
|
||||||
|
data into and out of wasm, whatever parsing you're going to do, etc.
|
||||||
|
|
||||||
|
Do everything in your power to make sure you can focus on the actual
|
||||||
|
wasm part of your project, because (at least if you're anything like
|
||||||
|
me) it's easy to get sidetracked with all that.
|
||||||
|
|
||||||
|
With that said: I had fun. Doing new things is always a treat, so if
|
||||||
|
you're looking for something new to try definitely consider giving
|
||||||
|
webassembly a look.
|
||||||
|
|
@ -0,0 +1,56 @@
|
|||||||
|
import { promises as fs } from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
import frontmatter from 'front-matter'
|
||||||
|
|
||||||
|
export interface Post {
|
||||||
|
slug: string,
|
||||||
|
date: Date,
|
||||||
|
title: string,
|
||||||
|
subtitle?: string,
|
||||||
|
author: string,
|
||||||
|
body: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const POST_FILE_PATTERN = /^(?<date>[0-9]{4}-[0-9]{2}-[0-9]{2}(-[0-9]{1,2})?)_(?<slug>[^\.]+)\.md$/
|
||||||
|
|
||||||
|
export async function getPostSlugs(): Promise<string[]> {
|
||||||
|
const postsDir = path.join(process.cwd(), 'posts')
|
||||||
|
const postPaths = await fs.readdir(postsDir)
|
||||||
|
return postPaths.map(getSlugFromFilePath).filter(slug => slug !== null)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSlugFromFilePath(postPath: string): string | null {
|
||||||
|
const regexResult = POST_FILE_PATTERN.exec(postPath)
|
||||||
|
if (!regexResult) return null
|
||||||
|
return regexResult.groups.slug
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function loadSinglePage(slug: string): Promise<Post | null> {
|
||||||
|
const postsDir = path.join(process.cwd(), 'posts')
|
||||||
|
const postPaths = await fs.readdir(postsDir)
|
||||||
|
const postMatch: RegExpExecArray | null = postPaths
|
||||||
|
.map((postFile: string) => POST_FILE_PATTERN.exec(postFile))
|
||||||
|
.filter((regexResult: RegExpExecArray | null) => regexResult !== null)
|
||||||
|
.find((regexResult: RegExpExecArray) => regexResult.groups.slug === slug)
|
||||||
|
|
||||||
|
if (!postMatch) return null;
|
||||||
|
|
||||||
|
const fileName = `${postMatch.groups.date}_${postMatch.groups.slug}.md`
|
||||||
|
const fileContents = (await fs.readFile(path.join(process.cwd(), 'posts', fileName))).toString('utf8')
|
||||||
|
const { attributes, body } = frontmatter(fileContents)
|
||||||
|
|
||||||
|
type Attributes = { [key: string]: string }
|
||||||
|
const data: Attributes = attributes as Attributes
|
||||||
|
|
||||||
|
if (!data.title) return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
slug: postMatch.groups.slug,
|
||||||
|
date: new Date(postMatch.groups.date),
|
||||||
|
title: data.title,
|
||||||
|
subtitle: data.subtitle,
|
||||||
|
author: data.author,
|
||||||
|
body
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue