aboutsummaryrefslogtreecommitdiff
path: root/v2/src/bin/extract
blob: 4380be7eb1f1efff850aaa3a197ed416f7008c66 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/sh
set -eu


usage() {
	cat <<-'EOF'
		Usage:
		  extract -t TYPE FILENAME
		  extract -h
	EOF
}

help() {
	cat <<-'EOF'

		Options:
		  -t TYPE       the type of extraction to perform ("content" or "env")
		  -h, --help    show this message

		  FILENAME      the name of the input file, also to be used as
		                URL.


		Separate the content from the "frontmatter", and emit the
		selected one, given the FILENAME.


		Examples:

		  Get the content:

		    $ extract -t content src/file.md > src/file.entry-content


		  Get the "frontmatter":

		    $ extract -t env src/f.md > src/f.entry-env
	EOF
}


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

TYPE=''
while getopts 't:h' flag; do
	case "$flag" in
		t)
			TYPE="$OPTARG"
			;;
		h)
			usage
			help
			exit
			;;
		*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))


FILENAME="${1:-}"
eval "$(assert-arg "$FILENAME" 'FILENAME')"
eval "$(assert-arg "$TYPE" '-t TYPE')"


case "$TYPE" in
	content)
		awk '
			separator >= 2
			/^---$/ { separator++ }
		' "$FILENAME"
		;;
	env)
		awk '
			/^---$/ {
				if (++separator > 1) {
					exit
				} else {
					next
				}
			}

			{ print }
		' "$FILENAME"
		printf "FILENAME='%s'\n" "$FILENAME"
		;;
	*)
		printf 'Bad value for TYPE: "%s".\n\n' \
			"$TYPE" >&2
		usage >&2
		exit 2
		;;
esac