From 05903eea532bfd18cfb4a289c9d3c57f62e9d20e Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sat, 31 Aug 2024 21:01:44 -0300 Subject: Import code from website repository --- .gitignore | 1 + Makefile | 100 ++++++++++++++++++++++++++++++++++ deps.mk | 8 +++ mkdeps.sh | 4 ++ src/conf | 30 +++++++++++ src/feed | 52 ++++++++++++++++++ src/html | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/htmlbody | 4 ++ src/mkwb.in | 12 +++++ src/sortdata | 14 +++++ src/xmlentry | 48 +++++++++++++++++ 11 files changed, 447 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 deps.mk create mode 100755 mkdeps.sh create mode 100755 src/conf create mode 100755 src/feed create mode 100755 src/html create mode 100755 src/htmlbody create mode 100755 src/mkwb.in create mode 100755 src/sortdata create mode 100755 src/xmlentry diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbe1900 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/src/mkwb diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..306519f --- /dev/null +++ b/Makefile @@ -0,0 +1,100 @@ +.POSIX: +DATE = 1970-01-01 +VERSION = 0.1.0 +NAME = mkwb +NAME_UC = $(NAME) +LANGUAGES = en +## Installation prefix. Defaults to "/usr". +PREFIX = /usr +BINDIR = $(PREFIX)/bin +LIBDIR = $(PREFIX)/lib +LIBEXECDIR = $(PREFIX)/libexec/$(NAME) +SYSCONFDIR = $(PREFIX)/etc +INCLUDEDIR = $(PREFIX)/include +SRCDIR = $(PREFIX)/src/$(NAME) +SHAREDIR = $(PREFIX)/share +LOCALEDIR = $(SHAREDIR)/locale +MANDIR = $(SHAREDIR)/man +EXEC = ./ +## Where to store the installation. Empty by default. +DESTDIR = +LDLIBS = + + + +.SUFFIXES: +.SUFFIXES: .in + +.in: + sed \ + 's:@LIBEXECDIR@:$(LIBEXECDIR):g' \ + < $< > $@ + if [ -x $< ]; then chmod +x $@; fi + + + +all: +include deps.mk + +sources = \ + $(libexec.sh) \ + src/$(NAME).in \ + + +derived-assets = \ + src/$(NAME) \ + +side-assets = \ + + + +## Default target. Builds all artifacts required for testing +## and installation. +all: $(derived-assets) + + + +check-unit: + + +check-integration: + + +## Run all tests. Each test suite is isolated, so that a parallel +## build can run tests at the same time. The required artifacts +## are created if missing. +check: check-unit check-integration + + + +## Remove *all* derived artifacts produced during the build. +## A dedicated test asserts that this is always true. +clean: + rm -rf $(derived-assets) $(side-assets) + + +## Installs into $(DESTDIR)$(PREFIX). Its dependency target +## ensures that all installable artifacts are crafted beforehand. +install: all + mkdir -p \ + '$(DESTDIR)$(BINDIR)' \ + '$(DESTDIR)$(LIBEXECDIR)' \ + '$(DESTDIR)$(SRCDIR)' \ + + cp src/$(NAME) '$(DESTDIR)$(BINDIR)' + cp $(libexec.sh) '$(DESTDIR)$(LIBEXECDIR)' + cp $(sources) '$(DESTDIR)$(SRCDIR)' + + +## Uninstalls from $(DESTDIR)$(PREFIX). This is a perfect mirror +## of the "install" target, and removes *all* that was installed. +## A dedicated test asserts that this is always true. +uninstall: + rm -rf \ + '$(DESTDIR)$(BINDIR)'/$(NAME) \ + '$(DESTDIR)$(LIBEXECDIR)' \ + '$(DESTDIR)$(SRCDIR)' \ + + + +ALWAYS: diff --git a/deps.mk b/deps.mk new file mode 100644 index 0000000..8913e8c --- /dev/null +++ b/deps.mk @@ -0,0 +1,8 @@ +libexec.sh = \ + src/conf \ + src/feed \ + src/html \ + src/htmlbody \ + src/sortdata \ + src/xmlentry \ + diff --git a/mkdeps.sh b/mkdeps.sh new file mode 100755 index 0000000..9ae9a7f --- /dev/null +++ b/mkdeps.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu + +find src/* -not -name 'mkwb*' | varlist 'libexec.sh' diff --git a/src/conf b/src/conf new file mode 100755 index 0000000..6aa6761 --- /dev/null +++ b/src/conf @@ -0,0 +1,30 @@ +#!/bin/sh +set -eu + + +usage() { + echo 'Usage: conf FILENAME' +} + +FILENAME="${1:-}" +eval "$(assert-arg -- "$FILENAME" 'FILENAME')" + + +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 +EOF diff --git a/src/feed b/src/feed new file mode 100755 index 0000000..f202ba6 --- /dev/null +++ b/src/feed @@ -0,0 +1,52 @@ +#!/bin/sh +set -eu + +usage() { + echo 'Usage: feed FILENAME' +} + +FILENAME="${1:-}" +eval "$(assert-arg -- "$FILENAME" 'FILENAME')" + + +absolute() { + printf 'https://domain-here.com/%s' "$(cat -)" +} + +feed_article_title='' +site_name=' ' +lang=en +now="$(date -uIs)" +url_absolute="$(printf '%s' "${FILENAME#src/}" | absolute)" +site_name_html="$(htmlesc "${site_name:?}")" +collection=article +collection_url_absolute="$(printf '%s' ${lang:?}/ | absolute)" +feed_title_html="$(eval "echo \"\$feed_${collection}_title\"" | htmlesc)" +export now url_absolute site_name_html collection_url_absolute feed_title_html + +DIR="$(dirname "$FILENAME")" + +author= +email= +cat < + + + $site_name_html + $feed_title_html + $url_absolute + $now + + + $author + $email + +EOF +find "$@" | + xargs cat | + sort -nr | + xargs cat +printf '\n' diff --git a/src/html b/src/html new file mode 100755 index 0000000..007fcc2 --- /dev/null +++ b/src/html @@ -0,0 +1,174 @@ +#!/bin/sh +set -eu + +usage() { + echo 'Usage: html FILENAME' +} + +FILENAME="${1:-}" +eval "$(assert-arg -- "$FILENAME" 'FILENAME')" + +. "${FILENAME%.*}.conf" + +# +# Utility functions +# + +INDENT=' ' +markdown_to_html() { + md2html | awk -vINDENT="$INDENT" ' + BEGIN { + in_block = 0 + } + + { + if (in_block == 0) { + printf "%s", INDENT + } + print + } + + /^<\/code><\/pre>$/ { + in_block = 0 + } + + /^
 "$SNIPPETS"
+	F="$(mkstemp)"
+	cat > "$F"
+	IFS=''
+	BLOCK_NUMBER=0
+	IN_BLOCK=
+	while read -r line; do
+		if [ "$line" = '
' ]; then + IN_BLOCK= + fi + + if [ -n "$IN_BLOCK" ]; then + printf '%s\n' "$line" | htmlesc -d >> "$OUT" + fi + + if printf '%s' "$line" | grep -q "^$INDENT
\)\(.*\)$|\2|" |
+				htmlesc -d > "$OUT"
+			printf '%s\n' "$OUT" >> "$SNIPPETS"
+		fi
+	done < "$F"
+
+	BLOCK_NUMBER=0
+	while read -r line; do
+		printf '%s\n' "$line"
+
+		if [ "$line" = '
' ]; then + printf '%s\n' \ + "$INDENT" \ + "$(basename "${url_part:?}").$BLOCK_NUMBER.txt" + BLOCK_NUMBER=$((BLOCK_NUMBER + 1)) + fi + done < "$F" +) + +add_line_numbers() { + awk ' + /^<\/code><\/pre>$/ { + in_block = 0 + printf "%s\n", $0 + next + } + + match($0, /^( +
)(.*)$/, a) {
+			printf "%s", a[1]
+
+			n = 1
+			block_count++
+			printf "\n", block_count, n, block_count, n, n, a[2]
+			in_block = 1
+			next
+		}
+
+		in_block == 1 {
+			n++
+			printf "\n", block_count, n, block_count, n, n, $0
+			next
+		}
+
+		{ print }
+	'
+}
+
+add_headings_anchors() (
+	IFS=''
+	while read -r line; do
+		if ! printf '%s' "$line" | grep -q "^$INDENT"; then
+			printf '%s\n' "$line"
+			continue
+		fi
+		LVL="$(printf '%s' "$line" | sed "s|^$INDENT.*|\1|")"
+		HEADING="$(printf '%s' "$line" | sed "s|^$INDENT\(.*\)$|\1|")"
+		SLUG="$(slugify "$HEADING")"
+		printf '%s%s\n' \
+			"$INDENT"  \
+			"$LVL"     \
+			"$SLUG"    \
+			"$HEADING" \
+			"$SLUG"    \
+			"${icon_link_url:?}" \
+			"$LVL"
+	done
+)
+
+
+warn_duplicate_ids() {
+	F="$(mkstemp)"
+	tee "$F"
+	{
+		grep "^$INDENT.*&2 < "$F"
+	rm "$F"
+}
+
+emit_body() {
+	< "${FILENAME%.*}.content" \
+		markdown_to_html           |
+		extract_plaintext_snippets |
+		add_line_numbers           |
+		add_headings_anchors       |
+		warn_duplicate_ids
+}
+
+if [ -r "$FILENAME".prev ]; then
+	collection_head_prev_html="$(
+		printf '    ' \
+			"$(url-for < "$FILENAME".prev)"
+	)"
+	export collection_head_prev_html
+fi
+
+if [ -r "$FILENAME".next ]; then
+	collection_head_next_html="$(
+		printf '    ' \
+			"$(url-for < "$FILENAME".next)"
+	)"
+	export collection_head_next_html
+fi
+
+envsubst < lib/preamble.html  | sed '/^$/d'
+emit_body | tee "${FILENAME%.*}.htmlbody"
+envsubst < lib/postamble.html | sed '/^$/d'
diff --git a/src/htmlbody b/src/htmlbody
new file mode 100755
index 0000000..53a4485
--- /dev/null
+++ b/src/htmlbody
@@ -0,0 +1,4 @@
+#!/bin/sh
+set -eu
+
+cat "${1:--}" | asciidoctor -s -
diff --git a/src/mkwb.in b/src/mkwb.in
new file mode 100755
index 0000000..2c698e1
--- /dev/null
+++ b/src/mkwb.in
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -eu
+
+usage() {
+	echo 'Usage: mkwb ACTION [OPTION...]'
+}
+
+ACTION="${1:-}"
+eval "$(assert-arg -- "$ACTION" 'ACTION')"
+shift
+
+exec '@LIBEXECDIR@'/"$ACTION" "$@"
diff --git a/src/sortdata b/src/sortdata
new file mode 100755
index 0000000..5b0b238
--- /dev/null
+++ b/src/sortdata
@@ -0,0 +1,14 @@
+#!/bin/sh
+set -eu
+
+usage() {
+	echo 'Usage: sortdata ENTRYPATH'
+}
+
+ENTRYPATH="${1:-}"
+eval "$(assert-arg -- "$ENTRYPATH" 'ENTRYPATH')"
+. "${ENTRYPATH%.*}.conf"
+
+f=src/"$date_iso".sortdata
+ln -frs "${ENTRYPATH%.*}.xmlentry" "$f" # FIXME: -r is no POSIX
+printf '%s\n' "$f"
diff --git a/src/xmlentry b/src/xmlentry
new file mode 100755
index 0000000..c2458d1
--- /dev/null
+++ b/src/xmlentry
@@ -0,0 +1,48 @@
+#!/bin/sh
+set -eu
+
+
+usage() {
+	echo 'Usage: xmlentry FILENAME'
+}
+
+FILENAME="${1:-}"
+eval "$(assert-arg -- "$FILENAME" 'FILENAME')"
+. "${FILENAME%.*}.conf"
+
+
+title_html=
+url_absolute=
+update_xml=
+cat <
+    
+      $title_html
+    
+    
+    
+      $date_iso
+    
+$update_xml
+    
+      $url_absolute
+    
+    
+      
+        $author
+      
+      
+        $email
+      
+    
+
+    
+EOF
+
+head -n1 < "${FILENAME%.*}.htmlbody" | htmlesc
+printf '    \n'
+printf '    \n' "${url:?}"
+
+htmlesc < "${FILENAME%.*}.htmlbody"
+printf '    \n'
+printf '  \n'
-- 
cgit v1.2.3

%s%s
%s%s