aboutsummaryrefslogtreecommitdiff
#!/bin/sh
set -eu

cd -- "$(dirname -- "$(readlink -f -- "$0")")"/../../


usage() {
	cat <<-'EOF'
		Usage:
		  pb -t TITLE [-l LANGUAGE] [-s SLUG]
		  pb -h
	EOF
}

help() {
	cat <<-'EOF'

		Options:
		  -t TITLE       the title of the snippet
		  -l LANGUAGE    the programming language of the snippet
		  -s SLUG        the URL slug of the snippet

		Examples:

		  FIXME:

		    $ FIXME
	EOF
}


slugify() {
	iconv -ct ASCII//TRANSLIT |
		tr '[:upper:]' '[:lower:]' |
		sed -e 's/[^a-z0-9]/-/g' \
		    -e 's/--*/-/g'       \
		    -e 's/^-//'         \
		    -e 's/-$//'
}

prompt() {
	printf '%s [Y/n]: ' "$1"
	read -r yesno
	if [ "$yesno" = 'n' ] || [ "$yesno" = 'N' ]; then
		return 1
	else
		return 0
	fi
}

outname() {
	DATE=$1
	SLUG=$2
	N="${3:-0}"
	if [ "$N" = 0 ]; then
		SUFFIX=''
	else
		SUFFIX="-$N"
	fi
	F="_pastebins/$DATE-$SLUG$SUFFIX.md"
	if [ -e "$F" ]; then
		outname "$DATE" "$SLUG" $((N + 1))
	else
		# FIXME
		eval "SLUG=$SLUG$SUFFIX"
		printf '%s' "$F"
	fi
}

url() {
	DATE="$1"
	SLUG="$2"
	printf 'https://%s/pastebin/%s/%s.html' \
		"$(make -s fqdn)" \
		"$(echo "$DATE" | tr '-' '/')" \
		"$SLUG"
}


for flag in "$@"; do
	case "$flag" in
		--)
			break
			;;
		--help)
			usage
			help
			exit
			;;
		*)
			;;
	esac
done

while getopts 't:l:s:h' flag; do
	case "$flag" in
		t)
			TITLE="$OPTARG"
			;;
		l)
			LANGUAGE="$OPTARG"
			;;
		s)
			SLUG="$OPTARG"
			;;
		h)
			usage
			help
			exit
			;;
		*)
			usage >&2
			exit 2
			;;
	esac
done

assert_arg() {
	if [ -z "$1" ]; then
		{
			printf 'Missing %s.\n' "$2"
			printf '\n'
			usage
		} >&2
		exit 2
	fi
}


assert_arg "${TITLE:-}" '-t TITLE'
LANGUAGE="${LANGUAGE:-}"
DATE="$(date '+%Y-%m-%d')"
SLUG="${SLUG:-$(echo "$TITLE" | slugify)}"
OUT="$(outname "$DATE" "$SLUG")"
URL="$(url "$DATE" "$SLUG")"

trap 'rm -f "$OUT-tmp"' EXIT
# shellcheck disable=2016
cat <<-EOF | e > "$OUT-tmp"
	---

	title: $TITLE

	date: $DATE

	layout: post

	lang: en

	ref: $SLUG

	---

	\`\`\`$LANGUAGE
	$(cat | sed 's|^```$|\\`\\`\\`|')
	\`\`\`
EOF

exec 0</dev/tty
if ! prompt 'Proceed with publishing the snippet?'; then
	printf 'Aborted.\n' >&2
	exit
fi

mv "$OUT-tmp" "$OUT"
git reset .
git add "$OUT"
git commit -m "pastebin: Auto-add $OUT"
make deploy

open "$URL"
printf '%s' "$URL" | copy
printf 'Opened on the browser and copied URL to clipboard.\n' >&2