summaryrefslogtreecommitdiff
path: root/src/conf
diff options
context:
space:
mode:
Diffstat (limited to 'src/conf')
-rwxr-xr-xsrc/conf217
1 files changed, 197 insertions, 20 deletions
diff --git a/src/conf b/src/conf
index 6aa6761..d132a34 100755
--- a/src/conf
+++ b/src/conf
@@ -1,30 +1,207 @@
#!/bin/sh
-set -eu
+set -euo pipefail
usage() {
- echo 'Usage: conf FILENAME'
+ echo 'Usage: conf BASECONF [GLOBALCONF FILENAME.adoc]'
}
-FILENAME="${1:-}"
+
+needs() {
+ if [ -z "${1:-}" ]; then
+ printf '%s\n' "$2" >&2
+ exit 1
+ fi
+}
+
+DATE_I='+%Y-%m-%d'
+DATE_Is="${DATE_I}T%H:%M:%S%:z"
+datex() {
+ # date(1), plus non-POSIX -d option
+ DATESTR="$1"
+ shift
+ date -d "$DATESTR" "$@"
+}
+
+dateiso() {
+ datex "$1" -u "$DATE_Is"
+}
+
+BASECONF="${1:-}"
+GLOBALCONF="${2:-}"
+FILENAME="${3:-}"
+eval "$(assert-arg -- "$BASECONF" 'BASECONF')"
+. "$(realpath -- "$BASECONF")"
+
+
+needs "${url_pre:-}" 'Missing required $url_pre (e.g. https://example.com)'
+needs "${site_name:-}" 'Missing required $site_name'
+needs "${feed_title:-}" 'Missing required $feed_title'
+needs "${feed_url:-}" 'Missing required $feed_url'
+needs "${feed_alternate_url:-}" 'Missing required $feed_alternate_url'
+
+needs "${list_addr:-}" 'Missing required $list_addr'
+needs "${discussions_url_prefix:-}" 'Missing required $discussions_url_prefix'
+
+needs "${email:-}" 'Missing required $email'
+needs "${author:-}" 'Missing required $author'
+needs "${sourcecode_url:-}" 'Missing required $sourcecode_url'
+needs "${sourcecode_url_prefix:-}" 'Missing required $sourcecode_url_prefix'
+
+
+if [ -z "$GLOBALCONF" ]; then
+ now_iso="$(dateiso "@${SOURCE_DATE_EPOCH:-$(date '+%s')}" | shesc)"
+ feed_title_html="$(printf '%s\n' "$feed_title" | htmlesc | shesc)"
+ site_name_html="$( printf '%s\n' "$site_name" | htmlesc | shesc)"
+ if [ -z "${logo_alt:-}" ]; then
+ logo_alt='The website logo'
+ fi
+ logo_alt="$(printf '%s\n' "$logo_alt" | htmlesc | shesc)"
+
+ cat <<-EOF
+ export now_iso="$now_iso"
+ export feed_title_html="$feed_title_html"
+ export site_name_html="$site_name_html"
+ export feed_url_absolute="$url_pre/$feed_url"
+ export feed_alternate_url_absolute="$url_pre/$feed_alternate_url"
+ export logo_alt="$logo_alt"
+ EOF
+ exit
+fi
+
+eval "$(assert-arg -- "$BASECONF" 'BASECONF')"
eval "$(assert-arg -- "$FILENAME" 'FILENAME')"
+. "$(realpath -- "$GLOBALCONF")"
+
+trap 'rm -f -- "$FILENAME".embedded-config' EXIT
+
+{
+ if head -n1 -- "$FILENAME" | grep -q '^////$'; then
+ awk 'sep > 1 {exit}; /^\/{4}$/ { sep++; next } { print }' \
+ "$FILENAME"
+ fi
+} > "$FILENAME".embedded-config
+. "$(realpath -- "$FILENAME".embedded-config)"
+
+is_article() {
+ printf '%s\n' "$FILENAME" | grep -qE \
+ "^${root_dir}[-a-zA-Z0-9/]*/[0-9]{4}/[0-9]{2}/[0-9]{2}/[-A-Za-z0-9]+\.adoc$"
+ #^ src /blog/d/a /1970 /01 /01/ /some-file-N4me.adoc
+}
+
+base_url() {
+ # src/sub/dirs/file.txt -> ../..
+ # src/file.txt -> .
+ printf '%s/\n' "$(dirname -- "$UNPREFIXED")" |
+ sed \
+ -e 's|[^/]*/|../|g' \
+ -e 's|/$||' \
+ -e 's|^\.\.$|.|'
+}
+
+last3dirnames() {
+ dirname -- "$UNPREFIXED" | tr '/' '\n' | tail -n3 | paste -sd-
+}
+
+datefmt() {
+ LANG=en_GB.UTF-8 datex "$1" -u '+%B %-d, %Y'
+}
+
+
+if [ -z "${root_dir:-}" ]; then
+ root_dir="$(dirname -- "$BASECONF")"
+fi
+root_dir="${root_dir%/}"
+if [ -z "${img_dir:-}" ]; then
+ img_dir=img
+fi
+img_dir="${img_dir%/}"
-date="$(dirname "${FILENAME#src/}" | tr '/' '-')"
-date_iso="$(date -ud "${date:?}" -Is)" # FIXME: non POSIX
-printf 'export date_iso="%s"\n' "$date_iso"
-
-cat <<-'EOF'
- export domain="DOMAIN"
- export email="EMAIL"
- export base_url=''
- export list_addr='~euandreh/public-inbox@lists.sr.ht'
- export mailto_uri_prefix="mailto:$list_addr?Subject=Re%3A%20"
- export discussions_url_prefix="https://lists.sr.ht/~euandreh/public-inbox?search="
- export sourcecode_url_prefix="https://$domain/git/$domain/tree/"
- export author='EuAndreh'
- export url='url1'
- export site_name='site_name1'
- export feed_article_title='Articles from papo.im'
- export lang=en
+UNPREFIXED="${FILENAME#$root_dir/}"
+
+cat "$BASECONF" "$GLOBALCONF"
+
+date_iso=
+date_formatted=
+updatedat_iso=
+updatedat_formatted=
+if is_article; then
+ date_iso="$(dateiso "$(last3dirnames)" | shesc)"
+ date_formatted="$(datefmt "$date_iso" | shesc)"
+ if [ -n "${updatedat:-}" ]; then
+ updatedat_iso="$(dateiso "$updatedat" | shesc)"
+ updatedat_formatted="$(datefmt "$updatedat_iso" | shesc)"
+ fi
+fi
+
+BASE_URL="$(base_url)"
+TITLE_RAW="$(cat -- "$FILENAME" | grep '^= .*' | head -n1 | cut -d' ' -f2-)"
+TITLEFULL_RAW="$TITLE_RAW | $site_name"
+
+if [ -z "${css_url:-}" ]; then
+ css_url="$BASE_URL/style.css"
+fi
+if [ -z "${atom_url:-}" ]; then
+ atom_url="$BASE_URL/atom.xml"
+fi
+if [ -z "${atomicon_url:-}" ]; then
+ needs "${img_dir:-}" 'Define either $atomicon_url or $img_dir'
+ atomicon_url="$BASE_URL/$img_dir/atom.svg"
+fi
+if [ -z "${favicon_url:-}" ]; then
+ needs "${img_dir:-}" 'Define either $favicon_url or $img_dir'
+ favicon_url="$BASE_URL/$img_dir/favicon.svg"
+fi
+if [ -z "${logo_url_prefix:-}" ]; then
+ needs "${img_dir:-}" 'Define either $logo_url_prefix or $img_dir'
+ logo_url_prefix="$BASE_URL/$img_dir/logo"
+fi
+if [ -z "${envelopeicon_url_prefix:-}" ]; then
+ needs "${img_dir:-}" 'Define either $envelopeicon_url_prefix or $img_dir'
+ envelopeicon_url_prefix="$BASE_URL/$img_dir/envelope"
+fi
+
+title_uri="$(printf '%s' "$TITLE_RAW" | uri)"
+comment_url="$(printf 'mailto:%s?Subject=Re%%3A%%20%s\n' "$list_addr" "$title_uri" | shesc)"
+discussions_url="$(printf '%s%s\n' "$discussions_url_prefix" "$title_uri" | shesc)"
+
+url="$(printf '%s\n' "${UNPREFIXED%.adoc}.html" | shesc)"
+
+css_url="$( printf '%s\n' "$css_url" | shesc)"
+atom_url="$( printf '%s\n' "$atom_url" | shesc)"
+atomicon_url="$( printf '%s\n' "$atomicon_url" | shesc)"
+favicon_url="$( printf '%s\n' "$favicon_url" | shesc)"
+logo_url_prefix="$( printf '%s\n' "$logo_url_prefix" | shesc)"
+envelopeicon_url_prefix="$(printf '%s\n' "$envelopeicon_url_prefix" | shesc)"
+
+source_path="$(printf '%s\n' "$FILENAME" | shesc)"
+base_url_prefix="$(printf '%s\n' "$BASE_URL" | shesc)"
+title="$( printf '%s\n' "$TITLE_RAW" | shesc)"
+title_html="$( printf '%s\n' "$TITLE_RAW" | htmlesc | shesc)"
+titlefull="$( printf '%s\n' "$TITLEFULL_RAW" | shesc)"
+titlefull_html="$(printf '%s\n' "$TITLEFULL_RAW" | htmlesc | shesc)"
+cat <<-EOF
+ export css_url="$css_url"
+ export atom_url="$atom_url"
+ export atomicon_url="$atomicon_url"
+ export favicon_url="$favicon_url"
+ export logo_url_prefix="$logo_url_prefix"
+ export envelopeicon_url_prefix="$envelopeicon_url_prefix"
+ export source_path="$source_path"
+ export url="$url"
+ export url_absolute="$url_pre/$url"
+ export base_url_prefix="$base_url_prefix"
+ export title="$title"
+ export title_html="$title_html"
+ export titlefull="$titlefull"
+ export titlefull_html="$titlefull_html"
+ export date_iso="$date_iso"
+ export date_formatted="$date_formatted"
+ export updatedat_iso="$updatedat_iso"
+ export updatedat_formatted="$updatedat_formatted"
+ export comment_url="$comment_url"
+ export discussions_url="$discussions_url"
EOF
+
+cat "$FILENAME".embedded-config