Skip to content

Instantly share code, notes, and snippets.

View patrickfav's full-sized avatar
🐿️
Nam nam nam

Patrick Favre patrickfav

🐿️
Nam nam nam
View GitHub Profile
@patrickfav
patrickfav / gsap-404-typed-message-using-splittext.markdown
Created October 23, 2020 20:44
GSAP 404 typed message using SplitText
@patrickfav
patrickfav / head.html
Last active March 18, 2023 15:29
A hugo shortcode that obfuscates email addresses; makes it more difficult for bots to crawl it from your website. Add the html file to your "layouts/shortcodes/" folder then you can use it in your content.
{{/* If you are using a CSP header this is how you can whitelist the inline-script */}}
{{/* its not optimal since it only changes every day and only if you regenerate the site */}}
{{ $currentDayNonce := now | time.Format "2006-01-02" | md5 }}
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'nonce-{{ $currentDayNonce }}';
img-src 'self';"
/>
@patrickfav
patrickfav / plugin-so-turndown.ts
Last active May 27, 2023 16:07
A Turndown Plugin parsing Stack Overflow HTML answers; converts it to GitHub-Flavored-Markdown (GFM) with correct language. Turndown is a JS Markdown Parser
import TurndownService from "turndown";
export const stackOverflowHighlightedCodeBlock = function (service: TurndownService): void {
const highlightRegExp = /lang-([a-z0-9]+)/
service.addRule('stackOverflowHighlightedCodeBlock', {
filter: function (node: HTMLElement, options: Options): boolean | null {
const firstChild = node.firstChild
return (
node.nodeName === 'PRE' &&
@patrickfav
patrickfav / plugin-so-turndown.ts
Last active March 30, 2023 16:58
A Turndown Plugin parsing figures with captions; creates the format '![imgText](https://example.com/img.png "caption")' Turndown is a JS Markdown Parser see https://www.npmjs.com/package/turndown
export const figureCaption = function (service: TurndownService): void {
service.addRule('stackOverflowHighlightedCodeBlock', {
filter: function (node: HTMLElement, options: Options): boolean | null {
const firstChild = node.firstChild
const lastChild = node.lastChild
return (
node.nodeName === 'FIGURE' &&
firstChild && firstChild.nodeName === 'IMG' &&
lastChild && lastChild.nodeName === 'FIGCAPTION'
)