Skip to content

Instantly share code, notes, and snippets.

@solace
solace / GistTransformer.ts
Last active December 24, 2023 05:06
Replace gist links in markdown with an embed using remark in Next.js
const GistTransformer = {
name: 'Gist',
shouldTransform(url) {
const {host} = new URL(url);
return ['gist.github.com'].includes(host);
},
getHTML(link) {
const url = new URL(link);
const id = url.pathname.split('/').pop();
// Import this
const modifyToken = require('markdown-it-modify-token');
module.exports = function (config) {
...
// Pass a custom instance of markdownIt into eleventy.
config.setLibrary("md", markdownIt({
// html, breaks, and linkify are default options from eleventy.
html: true,
breaks: true,
@solace
solace / ShowNotes.tsx
Last active December 27, 2023 17:05
Interactive transcripts with YouTube and Descript. See https://askmeaboutmypodcast.substack.com/p/interactive-transcripts-with-youtube
export default function ShowNotes({ transcript, seekTo }) {
const headings = transcript.filter((entry) => 'heading' in entry && entry.heading);
return (
<ul>
{headings.map((heading, ix) =>
<li
key={`timeline-${ix}`}
role="button"
data-start={heading.start}
@solace
solace / daily_stoic.js
Created December 18, 2023 16:38
Obsidian templater user scripts for QOTD
// https://github.com/benhoneywill/stoic-quotes
async function daily_stoic() {
const res = await fetch(`https://stoic-quotes.com/api/quote`);
const body = await res.json();
return `> [!quote] Daily Stoic\n> ${body.text}\n> — ${body.author}`;
}
module.exports = daily_stoic;
@solace
solace / middleware.ts
Created November 12, 2023 08:58
NextJS middleware to fix "Invalid Refresh Token: Already Used" from supabase
// Requested fix for https://github.com/supabase/gotrue/issues/1290
export async function middleware(req: NextRequest) {
const res = NextResponse.next();
const supabase = createMiddlewareClient({req, res});
const {error} = await supabase.auth.getSession();
// Trying to fix "Invalid Refresh Token: Already Used"
@solace
solace / categories.js
Last active September 23, 2023 08:23
Support categories and tags migrated from WordPress in Eleventy. See https://micheleong.com/2023/09/23/migrate-wordpress-eleventy-colocated-images
// File: lib/collections/categories.js
const slugify = require("slugify");
const getAllKeyValues = require("../utils/getAllKeyValues");
module.exports = (collection) => {
let allCategories = getAllKeyValues(
collection.getFilteredByGlob("src/posts/**/*.md"),
"categories"
@solace
solace / middleware.ts
Created September 10, 2023 13:08
Access pathname in NextJS generateMetadata
import type {NextRequest, NextResponse} from 'next/server'
export async function middleware(req: NextRequest) {
const requestHeaders = new Headers(req.headers)
requestHeaders.set('x-request-url', req.url);
const res = NextResponse.next({
request: {
headers: requestHeaders
}
@solace
solace / deepgram2descript.sh
Last active January 1, 2023 01:56
DeepGram JSON to Descript transcript
# Warning: This is not a complete script.
# You may also need to edit the transcript text to fix speaker names
# and make minor corrections before importing into Descript.
cat deepgram.json | jq -r '
.results.channels[0].alternatives[0].paragraphs.paragraphs[]
| ("SPEAKER_" + (.speaker|tostring)) + ": "
+ ([.sentences[].text] | join(" "))' > transcript.txt
@solace
solace / deepgram2autoedit.sh
Created November 3, 2022 15:32
Convert deepgram JSON to autoEdit transcript JSON
# WARNING: This is not a complete script.
# You could update the hardcoded values, but practically, it will need to
# be modified to programmatically process your source files and append the
# result to the autoEdit transcripts.json array.
# This is the internal autoEdit project ID.
# Once you've created the project in autoEdit you can get the ID from
# /path/to/digital-paper-edit-electron/db/projects.json
# on macOS this is /Users/username/Library/Application Support/digital-paper-edit-electron
project_id="1234567890"
@solace
solace / Component.stories.tsx
Created June 14, 2022 15:33
StorybookJS: Include line entry in Interactions tab that appears in Actions
// Don't do this. This is awful.
// Documenting it because it works, but stinks to hell.
Blah.play = async () => {
const actionListener = jest.fn();
// Listen for events that log to the Actions tab.
const channel = addons.getChannel();
channel.addListener("storybook/actions/action-event", actionListener);