Adding local search to Hugo with Pagefind

At this point, I have very nearly 2500 posts going back almost 20 years (… whoa). In a lot of ways, it’s a second brain for me. I actually find myself (from time to time) going back and looking up my various old posts.

Sometimes, I wanted to know how I solved a particular programming problem, sometimes I wanted to know when I went somewhere (by pictures!), and sometimes I wanted to know what a particular book or movie was about.

So for the longest time, I’ve had (up in the corner there) a nice search box. Powered by Google: Don’t Be Evil. Well, today, let’s see if we can do better!

read more...


Crosslinks by Title in Hugo--But Better!

Once upon a time, I solved Crosslinks by Title in Hugo. Back then, I added a shortcode so that I could link to any post by title like this:

{{< crosslink "Title goes here" >}}

It worked pretty well, but … it never really felt ‘Markdown’y. Which I suppose was the point.

But more recently, I came across Markdown render hooks.

What’s that you say? I can write code that will take the parameters to any Markdown link (or image/heading/codeblock) and generate the HTML with a custom template?

Interesting!

read more...


Local JS/CSS with Hugo Pipe

I recently stumbled across a post that reminded me that Hugo has pipes. You can use them to automatically download files and include them as local. This seems like a pretty good idea for JS/CSS (you can argue caching versus security/locality all you want), but I’m going to give it a try.

read more...


Go is faster than Python? (an example parsing huge JSON logs)

Recently at work I came across a problem where I had to go through a year’s worth of logs and corelate two different fields across all of our requests. On the good side, we have the logs stored as JSON objects (archived from Datadog which collects them). On the down side… it’s kind of a huge amount of data. Not as much as I’ve dealt with at previous jobs/in some academic problems, but we’re still talking on the order of terabytes.

On one hand, write up a quick Python script, fire and forget. It takes maybe ten minutes to write the code and (for this specific example) half an hour to run it on the specific cloud instance the logs lived on. So we’ll start with that. But then I got thinking… Python is supposed to be super slow right? Can I do better?

(Note: This problem is mostly disk bound. So Python actually for the most part does just fine.)

read more...


Crosslinks by Title in Hugo

Another quick Hugo post. One thing I miss about my previous blogging platform(s) was the ability to generate quick links between posts just by using the title of the post. So rather than this:

a cool post

This is [a cool post]({{< ref "2021-07-15-crosslinks-by-title-in-hugo" >}}), go read it.

You could do this:

This is {{< crosslink title="Crosslinks by Title in Hugo" text="a cool post" >}}.

Or shorter: {{< crosslink "Crosslinks by Title in Hugo" >}}.

And it should just work.

read more...


Generating a Book Bingo Chart in Hugo

Another r/Fantasy 2021 Book Bingo post! How in the world am I generating this (updating) chart in Hugo?

2021 Book Bingo

Attack on Titan, Vol. 1

by Hajime Isayama

Hard Mode ✓


Five SFF Short Stories

Any short story as long as there are five of them.

Hard Mode: Read an entire SFF anthology or collection.

The Poppy War

by R.F. Kuang

Hard Mode ✓


Set in Asia

Any book set in Asia or an analogous fantasy setting that is based on a real-world Asian setting.

Hard Mode: Written by an Asian author.

The Changeling

by Victor LaValle

Hard Mode ✓


A Selection from the r/Fantasy A to Z Genre Guide

Any book listed in our A to Z Genre Guide.

Hard Mode: A book by a BIPOC author.

The House in the Cerulean Sea

by T.J. Klune

Hard Mode ✓


Found Family

Or as TV Tropes calls it - Family of Choice. Often not biologically related, these relationships in a group typically form through bonds of shared experiences and become as important (in some cases more) as family members.

Hard Mode: Featuring an LGBTQ+ character as a member of the found family.

The Scorpio Races

by Maggie Stiefvater

Hard Mode ✓


First Person POV

Defined as: a literary style in which the narrative is told from the perspective of a narrator speaking directly about themselves. Link for examples.

Hard Mode: There is more than one perspective, but each perspective is written in First Person.

The Wyrmling Horde

by David Farland


Book Club OR Readalong Book

Any past or active r/Fantasy book clubs count as well as past or active r/Fantasy readalongs. See our full list of book clubs here.

Hard Mode: Must read a current selection of either a book club or readalong and participate in the discussion.

The Borrowers Afield

by Mary Norton

Hard Mode ✓


New to You Author

This would be an author whose work you’ve yet to read, meaning no novel, no novella, no short fiction, etc.

Hard Mode: Not only have you never read their work before but you’ve not heard much about this author or their work before deciding to try a book by them.

Mexican Gothic

by Silvia Moreno-Garcia

Hard Mode ✓


Gothic Fantasy

Gothic Fantasy is similar to Gothic Fiction but it includes fantasy elements or settings. Gothic Fiction is “a style of writing that is characterized by elements of fear, horror, death, and gloom, as well as romantic elements, such as nature, individuality, and very high emotion. These emotions can include fear and suspense.” (Source) Here is a good ‘introductory post’ on Gothic Fantasy for further reading from Book Riot.

Hard Mode: NOT one of the ten titles listed in the Book Riot article.

Transmetropolitan, Vol. 1: Back on the Street

by Warren Ellis

Hard Mode ✓


Backlist Book

For our purposes we’re considering ‘backlist’ an author’s older titles that are not their latest published book or part of a currently running series (no further sequels announced when you read it). The author must also be a currently publishing author.

Hard Mode: Published before the year 2000.

Red Sister

by Mark Lawrence

Hard Mode ✓


Revenge-Seeking Character

Book has a character whose main motivation in the story is revenge.

Hard Mode: Revenge is central to the plot of the entire book.

Six Wakes

by Mur Lafferty

Hard Mode ✓


Mystery Plot

The main plot of the book centers around solving a mystery.

Hard Mode: Not a primary world Urban Fantasy (secondary world urban fantasy is okay!)

Wild Sign

by Patricia Briggs

Hard Mode ✓


Comfort Read

This is one of those ‘personal to you’ squares. Any book that brings you comfort while reading it. You can use a reread on this square and it WON’T count for your ‘1 reread’.

Hard Mode: Don’t use a reread, find a brand new comfort read!

Tales of Nezura: Book 1: The Zevolra

by Randall Cooper

Hard Mode ✓


Published in 2021

A book published for the first time in 2021 (no reprints or new editions).

Hard Mode: It’s also a debut novel–as in it’s the author’s first published novel.

Hellblazer, Vol. 1: Original Sins

by Jamie Delano

Hard Mode ✓


Cat Squasher: 500+ Pages

Time to go tome hunting–find a book that is over 500 pages in length.

Hard Mode: Lion Squasher - a book that is over 800 pages.

Daemon Voices

by Philip Pullman

Hard Mode ✓


SFF-Related Nonfiction

Back by popular demand! Any nonfiction book that is related to SFF. Could be a book about the history of something in SFF, writing SFF, essays from a SFF writer, etc.

Hard Mode: Published within the last five years.

Cece Rios and the Desert of Souls

by Kaela Rivera

Hard Mode ✓


Latinx or Latin American Author

Author is from Latin America or of Latinx/Hispanic heritage.

Hard Mode: Book has fewer than 1000 Goodreads ratings.

Black Rain and Paper Cranes

by R.S. Craig

Hard Mode ✓


Self-Published

Only self-published novels will count for this square. If the novel has been picked up by a publisher as long as you read it when it was self-pubbed it will still count.

Hard Mode: Self-pubbed and has fewer than 50 ratings on Goodreads.

Annihilation

by Jeff VanderMeer

Hard Mode ✓


Forest Setting

This setting must be used be for a good portion of the book.

Hard Mode: The entire book takes place in this setting.

Gideon the Ninth

by Tamsyn Muir

Hard Mode ✓


Genre Mashup

A book that utilizes major elements from two or more genres. Examples: a romance set in a fantasy world, a book that combines science fiction and fantasy, etc.

Hard Mode: Three or more genres are combined.

The Midnight Library

by Matt Haig

Hard Mode ✓


Has Chapter Titles

A book where each chapter has a title (other than numbers or just a character’s name).

Hard Mode: Chapter title is more than a single word FOR EVERY SINGLE CHAPTER

An Alchemy of Masques and Mirrors

by Curtis Craddock

Hard Mode ✓


Title: _____ of _____

The title of the book must feature the format X of Y. Example: The Harp of Kings by Juliet Marillier.

Hard Mode: _____ of ______ and ________. Format of title must be X of Y and Z.

Project Hail Mary

by Andy Weir

Hard Mode ✓


First Contact

From Wikipedia: Science Fiction about the first meeting between humans and extraterrestrial life, or of any sentient species’ first encounter with another one, given they are from different planets or natural satellites.

Hard Mode: War does not break out as a result of contact.

Black Sun

by Rebecca Roanhorse


Trans or Nonbinary Character

A book featuring a trans or nonbinary character that isn’t an alien or a robot.

Hard Mode: This character is a main protagonist.

The Long Way to a Small, Angry Planet

by Becky Chambers

Hard Mode ✓


Debut Author

An author’s debut novel or novella.

Hard Mode: The author has participated in an AMA. AMA List linked here.

A Great and Terrible Beauty

by Libba Bray

Hard Mode ✓


Witches

A book featuring witches. Note - characters practicing what is traditionally in their culture referred to as witchcraft would also count. For example brujos or brujas would count for this square.

Hard Mode: A witch is a main protagonist.

Full categories

    Five SFF Short Stories

    Any short story as long as there are five of them.

    Hard Mode: Read an entire SFF anthology or collection.

    Set in Asia

    Any book set in Asia or an analogous fantasy setting that is based on a real-world Asian setting.

    Hard Mode: Written by an Asian author.

    A Selection from the r/Fantasy A to Z Genre Guide

    Any book listed in our A to Z Genre Guide.

    Hard Mode: A book by a BIPOC author.

    Found Family

    Or as TV Tropes calls it - Family of Choice. Often not biologically related, these relationships in a group typically form through bonds of shared experiences and become as important (in some cases more) as family members.

    Hard Mode: Featuring an LGBTQ+ character as a member of the found family.

    First Person POV

    Defined as: a literary style in which the narrative is told from the perspective of a narrator speaking directly about themselves. Link for examples.

    Hard Mode: There is more than one perspective, but each perspective is written in First Person.

    Book Club OR Readalong Book

    Any past or active r/Fantasy book clubs count as well as past or active r/Fantasy readalongs. See our full list of book clubs here.

    Hard Mode: Must read a current selection of either a book club or readalong and participate in the discussion.

    New to You Author

    This would be an author whose work you’ve yet to read, meaning no novel, no novella, no short fiction, etc.

    Hard Mode: Not only have you never read their work before but you’ve not heard much about this author or their work before deciding to try a book by them.

    Gothic Fantasy

    Gothic Fantasy is similar to Gothic Fiction but it includes fantasy elements or settings. Gothic Fiction is “a style of writing that is characterized by elements of fear, horror, death, and gloom, as well as romantic elements, such as nature, individuality, and very high emotion. These emotions can include fear and suspense.” (Source) Here is a good ‘introductory post’ on Gothic Fantasy for further reading from Book Riot.

    Hard Mode: NOT one of the ten titles listed in the Book Riot article.

    Backlist Book

    For our purposes we’re considering ‘backlist’ an author’s older titles that are not their latest published book or part of a currently running series (no further sequels announced when you read it). The author must also be a currently publishing author.

    Hard Mode: Published before the year 2000.

    Revenge-Seeking Character

    Book has a character whose main motivation in the story is revenge.

    Hard Mode: Revenge is central to the plot of the entire book.

    Mystery Plot

    The main plot of the book centers around solving a mystery.

    Hard Mode: Not a primary world Urban Fantasy (secondary world urban fantasy is okay!)

    Comfort Read

    This is one of those ‘personal to you’ squares. Any book that brings you comfort while reading it. You can use a reread on this square and it WON’T count for your ‘1 reread’.

    Hard Mode: Don’t use a reread, find a brand new comfort read!

    Published in 2021

    A book published for the first time in 2021 (no reprints or new editions).

    Hard Mode: It’s also a debut novel–as in it’s the author’s first published novel.

    Cat Squasher: 500+ Pages

    Time to go tome hunting–find a book that is over 500 pages in length.

    Hard Mode: Lion Squasher - a book that is over 800 pages.

    SFF-Related Nonfiction

    Back by popular demand! Any nonfiction book that is related to SFF. Could be a book about the history of something in SFF, writing SFF, essays from a SFF writer, etc.

    Hard Mode: Published within the last five years.

    Latinx or Latin American Author

    Author is from Latin America or of Latinx/Hispanic heritage.

    Hard Mode: Book has fewer than 1000 Goodreads ratings.

    Self-Published

    Only self-published novels will count for this square. If the novel has been picked up by a publisher as long as you read it when it was self-pubbed it will still count.

    Hard Mode: Self-pubbed and has fewer than 50 ratings on Goodreads.

    Forest Setting

    This setting must be used be for a good portion of the book.

    Hard Mode: The entire book takes place in this setting.

    Genre Mashup

    A book that utilizes major elements from two or more genres. Examples: a romance set in a fantasy world, a book that combines science fiction and fantasy, etc.

    Hard Mode: Three or more genres are combined.

    Has Chapter Titles

    A book where each chapter has a title (other than numbers or just a character’s name).

    Hard Mode: Chapter title is more than a single word FOR EVERY SINGLE CHAPTER

    Title: _____ of _____

    The title of the book must feature the format X of Y. Example: The Harp of Kings by Juliet Marillier.

    Hard Mode: _____ of ______ and ________. Format of title must be X of Y and Z.

    First Contact

    From Wikipedia: Science Fiction about the first meeting between humans and extraterrestrial life, or of any sentient species’ first encounter with another one, given they are from different planets or natural satellites.

    Hard Mode: War does not break out as a result of contact.

    Trans or Nonbinary Character

    A book featuring a trans or nonbinary character that isn’t an alien or a robot.

    Hard Mode: This character is a main protagonist.

    Debut Author

    An author’s debut novel or novella.

    Hard Mode: The author has participated in an AMA. AMA List linked here.

    Witches

    A book featuring witches. Note - characters practicing what is traditionally in their culture referred to as witchcraft would also count. For example brujos or brujas would count for this square.

    Hard Mode: A witch is a main protagonist.

read more...


A Tabbed View for Hugo

One thing I’ve been using for a lot of my recent posts (such as Backtracking Worms) is a tabbed view of code that can show arbitrarily tabs full of code or other content and render them wonderfully! For example, we can turn: {{</*tabs*/>}} {{</*sourcetab ruby "examples/art-station.rune"*/>}} {{</*tab "art-station.svg"*/>}} {{</*include "output/art-station.svg"*/>}} {{</*/tab*/>}} {{</*sourcetab ruby "examples/astrology-and-moons.rune"*/>}} {{</*tab "astrology-and-moons.svg"*/>}} {{</*include "output/astrology-and-moons.svg"*/>}} {{</*/tab*/>}} {{</*sourcetab ruby "examples/text-circle.rune"*/>}} {{</*tab "text-circle.svg"*/>}} {{</*include "output/text-circle.svg"*/>}} {{</*/tab*/>}} {{</*/tabs*/>}} Into the tabbed example view at the end of yesterday’s post!

read more...


Prevent JavaScript links by parsing URLs

If you have a website that allows users to submit URLs, one of the (many many) things people will try to do to break your site is to submit URLs that use the javascript: protocol (rather than the more expected http: or https:). This is almost never something that you want, since it allows users to submit essentially arbitrary code that other users will run on click in the context of your domain (same origin policy).

So how do you fix it?

First thought would be to try to check the protocol:

> safe_url = (url) => !url.match(/^javascript:/)
[Function: safe_url]

> safe_url('http://www.example.com')
true

> safe_url('javascript:alert(1)')
false

read more...