Moved to Makefile based build system
Got rid of janky build.sh script. Now uses a bunch of janky scripts and a make file - because that is bound to be easier to maintain.
This commit is contained in:
		
							parent
							
								
									39791363fa
								
							
						
					
					
						commit
						56f95cb9aa
					
				
					 13 changed files with 289 additions and 234 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
generated-template-parts
 | 
			
		||||
public_html
 | 
			
		||||
public_gemini
 | 
			
		||||
public
 | 
			
		||||
gem-cert
 | 
			
		||||
tmp
 | 
			
		||||
assets/css/main.min.css
 | 
			
		||||
xxx-*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										98
									
								
								Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,98 @@
 | 
			
		|||
export ALLTAGS := $(shell bin/listTags)
 | 
			
		||||
ALLBLOGS := $(shell bin/listBlogs all)
 | 
			
		||||
STANDALONE := $(subst .md,,$(subst content/,,$(wildcard content/*.md)))
 | 
			
		||||
.SECONDEXPANSION:
 | 
			
		||||
 | 
			
		||||
.PHONY: blogs tags standalone push-blog push-assets all clean
 | 
			
		||||
 | 
			
		||||
####################
 | 
			
		||||
#  TEMPLATE PARTS  #
 | 
			
		||||
####################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
tmp/templates/taglist.html:
 | 
			
		||||
	mkdir -p tmp/templates/
 | 
			
		||||
	bin/htmlTagList $(ALLTAGS) > $@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
############
 | 
			
		||||
#  INTROS  #
 | 
			
		||||
############
 | 
			
		||||
 | 
			
		||||
tmp/intros/%.html: content/blog/*-%.md
 | 
			
		||||
	mkdir -p tmp/intros/
 | 
			
		||||
	bin/htmlIntro $< > $@
 | 
			
		||||
 | 
			
		||||
tmp/intros/%.rss: content/blog/*-%.md
 | 
			
		||||
	mkdir -p tmp/intros/
 | 
			
		||||
	bin/rssIntro $< > $@
 | 
			
		||||
 | 
			
		||||
tmp/intros/%.gmi: content/blog/*-%.md
 | 
			
		||||
	mkdir -p tmp/intros/
 | 
			
		||||
	bin/gmiIntro $< > $@
 | 
			
		||||
 | 
			
		||||
##############
 | 
			
		||||
#  ARCHIVES  #
 | 
			
		||||
##############
 | 
			
		||||
 | 
			
		||||
public/feed.rss: $(foreach blog, $(ALLBLOGS), tmp/intros/$(blog).rss )
 | 
			
		||||
	mkdir -p public
 | 
			
		||||
	bin/generateRSS $^ > $@
 | 
			
		||||
 | 
			
		||||
public/index.html: $(foreach blog, $(ALLBLOGS), tmp/intros/$(blog).html )
 | 
			
		||||
	mkdir -p public
 | 
			
		||||
	bin/htmlIndex index $^ > $@
 | 
			
		||||
 | 
			
		||||
public/index.gmi: $(foreach blog, $(ALLBLOGS), tmp/intros/$(blog).gmi )
 | 
			
		||||
	mkdir -p public
 | 
			
		||||
	bin/gmiIndex index $^ > $@
 | 
			
		||||
 | 
			
		||||
public/tag/%/index.html: $$(foreach blog, $$(shell bin/listBlogs % ), tmp/intros/$$(blog).html ) tmp/templates/taglist.html
 | 
			
		||||
	mkdir -p $(@D)
 | 
			
		||||
	bin/htmlIndex tag $* $^ > $@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
###########
 | 
			
		||||
#  Pages  #
 | 
			
		||||
###########
 | 
			
		||||
 | 
			
		||||
public/blog/%/index.html: content/blog/*-%.md tmp/templates/taglist.html
 | 
			
		||||
	mkdir -p $(@D)
 | 
			
		||||
	pandoc --template=templates/blog.html -f markdown -t html5 -M comments $< > $@
 | 
			
		||||
 | 
			
		||||
public/%/index.html: content/%.md tmp/templates/taglist.html
 | 
			
		||||
	mkdir -p $(@D)
 | 
			
		||||
	pandoc --template=templates/blog.html -f markdown -t html5 -M comments $< > $@
 | 
			
		||||
 | 
			
		||||
public/blog/%/index.gmi: content/blog/*-%.md
 | 
			
		||||
	mkdir -p $(@D)
 | 
			
		||||
	echo -n "# " > $@
 | 
			
		||||
	grep 'title: ' $< | cut -d ' ' -f 2- >> $@
 | 
			
		||||
	echo "" >> $@
 | 
			
		||||
	md2gemini -f -l paragraph $< >> $@
 | 
			
		||||
 | 
			
		||||
public/card:
 | 
			
		||||
	content/card.curl > $@
 | 
			
		||||
 | 
			
		||||
###########
 | 
			
		||||
#  PHONY  #
 | 
			
		||||
###########
 | 
			
		||||
 | 
			
		||||
tags: $(foreach tag, $(ALLTAGS), public/tag/$(shell echo $(tag) | tr 'A-Z' 'a-z')/index.html )
 | 
			
		||||
 | 
			
		||||
blogs: $(foreach blog, $(ALLBLOGS), public/blog/$(shell echo $(blog) | tr 'A-Z' 'a-z')/index.html ) $(foreach blog, $(ALLBLOGS), public/blog/$(shell echo $(blog) | tr 'A-Z' 'a-z')/index.gmi )
 | 
			
		||||
 | 
			
		||||
standalone: $(foreach page, $(STANDALONE), public/$(page)/index.html )
 | 
			
		||||
 | 
			
		||||
all: tags blogs standalone public/index.html public/feed.rss public/card
 | 
			
		||||
 | 
			
		||||
push-blog:
 | 
			
		||||
	rsync -azvhP ./public/ generalPurpose:docker/jonathanh/public
 | 
			
		||||
 | 
			
		||||
push-assets:
 | 
			
		||||
	rsync -azvhP ./assets/ generalPurpose:docker/jonathanh/public/assets
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -rf public/*
 | 
			
		||||
	rm -rf tmp/
 | 
			
		||||
							
								
								
									
										15
									
								
								bin/generateRSS
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								bin/generateRSS
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
lastUpdate="$(date --utc "+%a, %d %b %Y %H:%M:%S") UT"
 | 
			
		||||
echo "<?xml version='1.0' encoding='UTF-8' ?>
 | 
			
		||||
<rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:atom=\"http://www.w3.org/2005/Atom\" version=\"2.0\">
 | 
			
		||||
<channel>
 | 
			
		||||
	<title><![CDATA[Jonathan Hodgson]]></title>
 | 
			
		||||
	<description><![CDATA[Jonathan Hodgson's Blog]]></description>
 | 
			
		||||
	<link>https://jonathanh.co.uk</link>
 | 
			
		||||
	<lastBuildDate>$lastUpdate</lastBuildDate>"
 | 
			
		||||
 | 
			
		||||
for i in "$@"; do
 | 
			
		||||
	cat "$i"
 | 
			
		||||
done
 | 
			
		||||
echo "</channel></rss>"
 | 
			
		||||
							
								
								
									
										35
									
								
								bin/gmiIndex
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								bin/gmiIndex
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	tag)
 | 
			
		||||
		title="Archive: $(echo "$ALLTAGS" | tr ' _' '\n ' | grep -i "$(echo "$2" | tr '_' ' ')")"
 | 
			
		||||
		template="$(echo "" | pandoc --template=templates/blog.html \
 | 
			
		||||
			-f markdown -t html5 -M archive -M title:"$title" 2> /dev/null )"
 | 
			
		||||
		shift
 | 
			
		||||
		;;
 | 
			
		||||
	index)
 | 
			
		||||
		echo "# Jonathan Hodgson"
 | 
			
		||||
		echo ""
 | 
			
		||||
		echo "## Blogs"
 | 
			
		||||
		echo ""
 | 
			
		||||
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
for i in "$@"; do
 | 
			
		||||
	case "$i" in
 | 
			
		||||
		tmp/intros/*)
 | 
			
		||||
			cat "$i"
 | 
			
		||||
			echo ""
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
echo "## Other Links"
 | 
			
		||||
echo "=> /help-me-out/ Help Me Out"
 | 
			
		||||
echo "=> /other-stuff-you-might-like/ Other Stuff You Might Like"
 | 
			
		||||
							
								
								
									
										19
									
								
								bin/gmiIntro
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								bin/gmiIntro
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
file="$1"
 | 
			
		||||
 | 
			
		||||
getBlogSlug(){
 | 
			
		||||
	echo "$1" | sed 's/^content\//\//' | sed 's/.md$/\//' | sed -E 's/[0-9]+-//'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
info="$(sed -n '/---/,/---/p' "$file" | sed '/^$/,$d' | sed -n '1,/---/p' | sed '/^---$/d')"
 | 
			
		||||
 | 
			
		||||
slug=$(getBlogSlug "$file")
 | 
			
		||||
date="$(echo "$info" | yq -r .date)"
 | 
			
		||||
title="$(echo "$info" | yq -r .title)"
 | 
			
		||||
description="$(echo "$info" | yq -r .description)"
 | 
			
		||||
 | 
			
		||||
echo "=> $slug $title"
 | 
			
		||||
echo -e "\t$date"
 | 
			
		||||
echo "$description"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								bin/htmlIndex
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								bin/htmlIndex
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	tag)
 | 
			
		||||
		title="Archive: $(echo "$ALLTAGS" | tr ' _' '\n ' | grep -i "$(echo "$2" | tr '_' ' ')")"
 | 
			
		||||
		template="$(echo "" | pandoc --template=templates/blog.html \
 | 
			
		||||
			-f markdown -t html5 -M archive -M title:"$title" 2> /dev/null )"
 | 
			
		||||
		shift
 | 
			
		||||
		;;
 | 
			
		||||
	index)
 | 
			
		||||
		template="$(echo "" | pandoc --template=templates/blog.html \
 | 
			
		||||
			-f markdown -t html5 -M frontpage 2> /dev/null )"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
echo "$template" | sed -n '1,/#CONTENT#/p' | head -n -1
 | 
			
		||||
 | 
			
		||||
for i in "$@"; do
 | 
			
		||||
	case "$i" in
 | 
			
		||||
		tmp/intros/*) cat "$i" ;;
 | 
			
		||||
	esac
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
echo "$template" | sed -n '/#CONTENT#/,$p' | sed '1d'
 | 
			
		||||
							
								
								
									
										25
									
								
								bin/htmlIntro
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								bin/htmlIntro
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
file="$1"
 | 
			
		||||
 | 
			
		||||
getBlogSlug(){
 | 
			
		||||
	echo "$1" | sed 's/^content\//\//' | sed 's/.md$/\//' | sed -E 's/[0-9]+-//'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
info="$(sed -n '/---/,/---/p' "$file" | sed '/^$/,$d' | sed -n '1,/---/p' | sed '/^---$/d')"
 | 
			
		||||
 | 
			
		||||
slug=$(getBlogSlug "$file")
 | 
			
		||||
date="$(echo "$info" | yq -r .date)"
 | 
			
		||||
title="$(echo "$info" | yq -r .title)"
 | 
			
		||||
description="$(echo "$info" | yq -r .description)"
 | 
			
		||||
 | 
			
		||||
echo "<article>
 | 
			
		||||
	<h2><a href='$slug'>$title</a></h2>
 | 
			
		||||
	<div class="article-details">
 | 
			
		||||
		<div class="date">
 | 
			
		||||
			$date
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<p>$description</p>
 | 
			
		||||
	<p><a href='$slug'>Read More</a></p>
 | 
			
		||||
</article>"
 | 
			
		||||
							
								
								
									
										11
									
								
								bin/htmlTagList
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								bin/htmlTagList
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
echo "<ul class='taglist'>"
 | 
			
		||||
 | 
			
		||||
for line in "$@"; do
 | 
			
		||||
	link="/tag/$(echo "$line" | tr 'A-Z' 'a-z')/"
 | 
			
		||||
	name="$(echo "$line" | tr '_' ' ')"
 | 
			
		||||
	echo "<li><a href='$link'>$name</a></li>"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
echo "</ul>"
 | 
			
		||||
							
								
								
									
										23
									
								
								bin/listBlogs
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								bin/listBlogs
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
tag="$(echo "$1" | tr ' ' '_' | tr 'A-Z' 'a-z')"
 | 
			
		||||
 | 
			
		||||
if [ "$tag" == "all" ]; then
 | 
			
		||||
	find content/blog/ -type f -name '*.md' -not -name 'xxx-*' | sort -r -u |
 | 
			
		||||
		cut -d '-' -f 2- | cut -d '.' -f 1
 | 
			
		||||
else
 | 
			
		||||
	find content/blog/ -type f -name '*.md' -not -name 'xxx-*' | sort -r -u |
 | 
			
		||||
		while read file; do
 | 
			
		||||
		tags="$(sed -n '/---/,/---/p' "$file" |
 | 
			
		||||
			sed -n '1,/---/p' | sed '/^---$/d' |
 | 
			
		||||
			sed '/^$/,$d' |
 | 
			
		||||
			yq -r 'if ( .tags | type ) == "array" then .tags else [ .tags ] end | join("\n")' |
 | 
			
		||||
			tr 'A-Z' 'a-z' | tr ' ' '_'
 | 
			
		||||
		)"
 | 
			
		||||
		if echo "$tags" | grep -q "$tag"; then
 | 
			
		||||
			echo "$file" | cut -d '-' -f 2- | cut -d '.' -f 1
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										7
									
								
								bin/listTags
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								bin/listTags
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
find content/blog/ -type f -name '*.md' -not -name 'xxx-*' | while read file; do
 | 
			
		||||
	sed -n '/---/,/---/p' "$file" | sed -n '1,/---/p' | sed '/^---$/d' | sed '/^$/,$d' | yq -r 'if ( .tags | type ) == "array" then .tags else [ .tags ] end | join("\n")' | while read tag; do
 | 
			
		||||
		echo "$tag" | tr ' ' '_'
 | 
			
		||||
	done
 | 
			
		||||
done | sort -u
 | 
			
		||||
							
								
								
									
										24
									
								
								bin/rssIntro
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								bin/rssIntro
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
file="$1"
 | 
			
		||||
 | 
			
		||||
getBlogSlug(){
 | 
			
		||||
	echo "$1" | sed 's/^content\//\//' | sed 's/.md$/\//' | sed -E 's/[0-9]+-//'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
info="$(sed -n '/---/,/---/p' "$file" | sed '/^$/,$d' | sed -n '1,/---/p' | sed '/^---$/d')"
 | 
			
		||||
 | 
			
		||||
slug=$(getBlogSlug "$file")
 | 
			
		||||
date="$(echo "$info" | yq -r .date)"
 | 
			
		||||
rfc822="$(date --utc -d "$date" "+%a, %d %b %Y %H:%M:%S") UT"
 | 
			
		||||
title="$(echo "$info" | yq -r .title)"
 | 
			
		||||
description="$(echo "$info" | yq -r .description)"
 | 
			
		||||
 | 
			
		||||
echo "<item>
 | 
			
		||||
	<title>
 | 
			
		||||
	<![CDATA[$title]]></title>
 | 
			
		||||
	<link>https://jonathanh.co.uk$slug</link>
 | 
			
		||||
	<guid isPermaLink=\"true\">https://jonathanh.co.uk$slug</guid>
 | 
			
		||||
	<pubDate>$rfc822</pubDate>
 | 
			
		||||
	<description><![CDATA[$description]]></description>
 | 
			
		||||
</item>"
 | 
			
		||||
							
								
								
									
										231
									
								
								build.sh
									
										
									
									
									
								
							
							
						
						
									
										231
									
								
								build.sh
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,231 +0,0 @@
 | 
			
		|||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
getBlogSlug(){
 | 
			
		||||
	echo "$1" | sed 's/^content\//\//' | sed 's/.md$/.html/' | sed -E 's/[0-9]+-//'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
blog(){
 | 
			
		||||
	echo "Generating Blog pages"
 | 
			
		||||
	[ ! -f "tmp/templates/tagList.html" ] && echo "No taglist file" | tee "tmp/templates/tagList.html" > /dev/stderr
 | 
			
		||||
	local newer=""
 | 
			
		||||
	[ -f tmp/lastBlogUpdate ] && newer="-newer tmp/lastBlogUpdate"
 | 
			
		||||
	find content/ -type f -name '*.md' $newer | while read file; do
 | 
			
		||||
		newFileName=$(getBlogSlug "$file")
 | 
			
		||||
		mkdir -p "public_html/${newFileName%/*}"
 | 
			
		||||
		mkdir -p "public_gemini/${newFileName%/*}"
 | 
			
		||||
		pandoc --template=templates/blog.html -f markdown -t html5 -M comments "$file" > "public_html/$newFileName"
 | 
			
		||||
		local info="$(sed -n '/---/,/---/p' "$file" | sed '/^$/,$d' | sed -n '1,/---/p' | sed '/^---$/d')"
 | 
			
		||||
		local title="$(echo "$info" | yq -r .title)"
 | 
			
		||||
		echo "# $title" | cat - "$file" | sed '/^---/,/^---/d' | md2gemini --link at-end > "public_gemini/${newFileName%.*}.gmi"
 | 
			
		||||
	done
 | 
			
		||||
	touch tmp/lastBlogUpdate
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
makeIntro(){
 | 
			
		||||
	local file="$1"
 | 
			
		||||
	local output="tmp/intros/$file"
 | 
			
		||||
	local rssoutput="tmp/rss/$file"
 | 
			
		||||
	# We delete tmp each time the build script runs, so if the file exists, we have already generated one this time
 | 
			
		||||
	[ -f "$output" ] && return 1
 | 
			
		||||
	mkdir -p "${output%/*}"
 | 
			
		||||
	mkdir -p "${rssoutput%/*}"
 | 
			
		||||
	local info="$(sed -n '/---/,/---/p' "$file" | sed '/^$/,$d' | sed -n '1,/---/p' | sed '/^---$/d')"
 | 
			
		||||
	local slug=$(getBlogSlug "$file")
 | 
			
		||||
	local date="$(echo "$info" | yq -r .date)"
 | 
			
		||||
	local rfc822="$(date --utc -d "$date" "+%a, %d %b %Y %H:%M:%S") UT"
 | 
			
		||||
	local tags="$(echo "$info" | yq -r 'if ( .tags | type ) == "array" then .tags else [ .tags ] end | join("\n")' | awk '{print "<li>" $0 "</li>"}' )"
 | 
			
		||||
	local title="$(echo "$info" | yq -r .title)"
 | 
			
		||||
	local description="$(echo "$info" | yq -r .description)"
 | 
			
		||||
	echo "<article>
 | 
			
		||||
		<h2><a href='$slug'>$title</a></h2>
 | 
			
		||||
		<div class="article-details">
 | 
			
		||||
			<div class="date">
 | 
			
		||||
				$date
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<p>$description</p>
 | 
			
		||||
		<p><a href='$slug'>Read More</a></p>
 | 
			
		||||
	</article>" > "$output"
 | 
			
		||||
	echo "=> ${slug%.*}.gmi $title
 | 
			
		||||
	$date
 | 
			
		||||
$description
 | 
			
		||||
	" > "${output%.*}.gmi"
 | 
			
		||||
	echo "<item>
 | 
			
		||||
		<title>
 | 
			
		||||
		<![CDATA[$title]]></title>
 | 
			
		||||
		<link>https://jonathanh.co.uk/$slug</link>
 | 
			
		||||
		<guid isPermaLink=\"true\">https://jonathanh.co.uk/$slug</guid>
 | 
			
		||||
		<pubDate>$rfc822</pubDate>
 | 
			
		||||
		<description><![CDATA[$description]]></description>
 | 
			
		||||
	</item>" > "$rssoutput"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
getIntro(){
 | 
			
		||||
	local file="$1"
 | 
			
		||||
	local output="tmp/intros/$file"
 | 
			
		||||
 | 
			
		||||
	if [ "$2" = "rss" ]; then
 | 
			
		||||
		local output="tmp/rss/$file"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ "$2" = "gmi" ]; then
 | 
			
		||||
		local output="tmp/intros/${file%.*}.gmi"
 | 
			
		||||
	fi
 | 
			
		||||
	#makeIntro "$file"
 | 
			
		||||
	cat "$output"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
index(){
 | 
			
		||||
	echo "Generating Home Page"
 | 
			
		||||
	[ ! -f "tmp/templates/tagList.html" ] && echo "No taglist file" | tee "tmp/templates/tagList.html" > /dev/stderr
 | 
			
		||||
	local template="$(echo "" | pandoc --template=templates/blog.html -f markdown -t html5 -M frontpage 2> /dev/null )"
 | 
			
		||||
 | 
			
		||||
	# First loop makes all the intros needed and stores them in tmp/intros
 | 
			
		||||
	find content/blog/ -type f -name '*.md' | grep -v 'xxx' | sort -r | head -n 20 | while read file; do
 | 
			
		||||
		makeIntro "$file"
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	# Once they are created, we will put them in, in order
 | 
			
		||||
	(
 | 
			
		||||
		echo "$template" | sed -n '1,/#CONTENT#/p' | head -n -1
 | 
			
		||||
		find content/blog/ -type f -name '*.md' | grep -v 'xxx' | sort -r | head -n 20 | while read file; do
 | 
			
		||||
			grep -Eq '^draft: true' "$file" || getIntro "$file"
 | 
			
		||||
		done
 | 
			
		||||
		echo "$template" | sed -n '/#CONTENT#/,$p' | sed '1d'
 | 
			
		||||
	) > public_html/index.html
 | 
			
		||||
 | 
			
		||||
	# Once they are created, we will put them in, in order
 | 
			
		||||
	(
 | 
			
		||||
		echo "# Jonathan Hodgson"
 | 
			
		||||
		echo ""
 | 
			
		||||
		echo "## Blogs"
 | 
			
		||||
		echo ""
 | 
			
		||||
		find content/blog/ -type f -name '*.md' | grep -v 'xxx' | sort -r | head -n 20 | while read file; do
 | 
			
		||||
			grep -Eq '^draft: true' "$file" || getIntro "$file" gmi
 | 
			
		||||
		done
 | 
			
		||||
		echo ""
 | 
			
		||||
		echo "## Other Links"
 | 
			
		||||
		echo "=> /help-me-out.gmi Help Me Out"
 | 
			
		||||
		echo "=> /other-stuff-you-might-like.gmi Other Stuff You Might Like"
 | 
			
		||||
 | 
			
		||||
	) > public_gemini/index.gmi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tagIndex(){
 | 
			
		||||
	local tag="$1"
 | 
			
		||||
	local title="$(basename "$tag")"
 | 
			
		||||
 | 
			
		||||
	[ ! -f "tmp/templates/tagList.html" ] && echo "No taglist file" | tee "tmp/templates/tagList.html" > /dev/stderr
 | 
			
		||||
	local template="$(echo "" | pandoc --template=templates/blog.html -f markdown -t html5 -M archive -M title:"$title Archive" 2> /dev/null )"
 | 
			
		||||
 | 
			
		||||
	cat "$1" | grep -v 'xxx' | sort -r | while read file; do
 | 
			
		||||
		makeIntro "$file" &
 | 
			
		||||
	done
 | 
			
		||||
	wait
 | 
			
		||||
 | 
			
		||||
	echo "$template" | sed -n '1,/#CONTENT#/p' | head -n -1
 | 
			
		||||
	cat "$1" | sort -r | while read file; do
 | 
			
		||||
		getIntro "$file"
 | 
			
		||||
	done
 | 
			
		||||
	echo "$template" | sed -n '/#CONTENT#/,$p' | sed '1d'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
html_tag_list(){
 | 
			
		||||
	if [ -d "tmp/tag" ]; then
 | 
			
		||||
		echo "<ul class='taglist'>"
 | 
			
		||||
			wc -l tmp/tag/* | head -n -1 | sort -nr | while read line; do
 | 
			
		||||
				local link=$(echo "$line" | awk '{print $2 ".html"}' | sed 's/^tmp//' | tr '[A-Z]' '[a-z]' | tr ' ' '-')
 | 
			
		||||
				local name=$(echo "$line" | sed 's/tmp\/tag\///' | awk '{print $2 " (" $1 ")"}' | tr '_' ' ')
 | 
			
		||||
				echo "<li><a href='$link'>$name</a></li>"
 | 
			
		||||
			done
 | 
			
		||||
		echo "</ul>"
 | 
			
		||||
	else
 | 
			
		||||
		echo "Need to generate the taglist" > /dev/stderr
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tags(){
 | 
			
		||||
 | 
			
		||||
	echo "Generating Tags"
 | 
			
		||||
 | 
			
		||||
	# Loops through each blog and puts it in tag lists, although only blogs that have changed
 | 
			
		||||
	local newer=""
 | 
			
		||||
	[ -f tmp/lastTagUpdate ] && newer="-newer tmp/lastTagUpdate"
 | 
			
		||||
	find content/blog/ -type f -name '*.md' -not -name 'xxx-*' $newer | while read file; do
 | 
			
		||||
		sed -n '/---/,/---/p' "$file" | sed -n '1,/---/p' | sed '/^---$/d' | sed '/^$/,$d' | yq -r 'if ( .tags | type ) == "array" then .tags else [ .tags ] end | join("\n")' | while read tag; do
 | 
			
		||||
			tag=$(echo "$tag" | tr ' ' '_')
 | 
			
		||||
			# Adds the file to the tags list if it's not already in there
 | 
			
		||||
			grep -q "$file" tmp/tag/"$tag" 2> /dev/null || echo "$file" >> tmp/tag/"$tag"
 | 
			
		||||
		done
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	echo "Generating Taglist HTML"
 | 
			
		||||
	html_tag_list > tmp/templates/tagList.html
 | 
			
		||||
 | 
			
		||||
	# We should now have a folder with a text file for each tag containing each blog
 | 
			
		||||
	echo "Generating Tag Index Pages"
 | 
			
		||||
 | 
			
		||||
	find tmp/tag/ -type f $newer | while read tag; do
 | 
			
		||||
		filename="$(echo $tag | sed 's/^tmp//' | tr '[A-Z]' '[a-z]').html"
 | 
			
		||||
		tagIndex "$tag" > "public_html/$filename"
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	touch tmp/lastTagUpdate
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
card(){
 | 
			
		||||
	echo "Generating Card"
 | 
			
		||||
	content/card.curl > public_html/card
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rss(){
 | 
			
		||||
	echo "Generating RSS Feed"
 | 
			
		||||
	lastUpdate="$(date --utc "+%a, %d %b %Y %H:%M:%S") UT"
 | 
			
		||||
 | 
			
		||||
	# First loop makes all the intros needed and stores them in tmp/intros
 | 
			
		||||
	find content/blog/ -type f -name '*.md' | grep -v 'xxx' | sort -r | head -n 20 | while read file; do
 | 
			
		||||
		makeIntro "$file" &
 | 
			
		||||
	done
 | 
			
		||||
	wait
 | 
			
		||||
 | 
			
		||||
	(
 | 
			
		||||
	echo "<?xml version='1.0' encoding='UTF-8' ?>
 | 
			
		||||
	<rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:atom=\"http://www.w3.org/2005/Atom\" version=\"2.0\">
 | 
			
		||||
	<channel>
 | 
			
		||||
		<title><![CDATA[Jonathan Hodgson]]></title>
 | 
			
		||||
		<description><![CDATA[Jonathan Hodgson's Blog]]></description>
 | 
			
		||||
		<link>https://jonathanh.co.uk</link>
 | 
			
		||||
		<lastBuildDate>$lastUpdate</lastBuildDate>"
 | 
			
		||||
		find content/blog/ -type f -name '*.md' | grep -v 'xxx' | sort -r | head -n 20 | while read file; do
 | 
			
		||||
			grep -Eq '^draft: true' "$file" || getIntro "$file" rss
 | 
			
		||||
		done
 | 
			
		||||
	echo "</channel></rss>";
 | 
			
		||||
	) > public_html/feed.rss
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
clean(){
 | 
			
		||||
	rm -rf tmp > /dev/null 2> /dev/null
 | 
			
		||||
	# Don't remove the public_html folder or docker won't re-attach it
 | 
			
		||||
	rm -rf public_html/*
 | 
			
		||||
	rm -rf public_gemini/*
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Make sure the folders we will need exist
 | 
			
		||||
mkdir -p public_html/{blog,tag}
 | 
			
		||||
mkdir -p public_gemini/{blog,tag}
 | 
			
		||||
mkdir -p tmp/{tag,templates,intros}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	clean) clean ;;
 | 
			
		||||
	index) index ;;
 | 
			
		||||
	blog) blog ;;
 | 
			
		||||
	tags) tags ;;
 | 
			
		||||
	card) card ;;
 | 
			
		||||
	rss) rss ;;
 | 
			
		||||
	all) tags && blog && index && rss && card ;;
 | 
			
		||||
esac
 | 
			
		||||
| 
						 | 
				
			
			@ -65,13 +65,13 @@ $body$
 | 
			
		|||
				$endif$
 | 
			
		||||
				</a>
 | 
			
		||||
				<nav>
 | 
			
		||||
	${ ../tmp/templates/tagList.html() }
 | 
			
		||||
	${ ../tmp/templates/taglist.html() }
 | 
			
		||||
				</nav>
 | 
			
		||||
			</aside>
 | 
			
		||||
		</div>
 | 
			
		||||
		<footer>
 | 
			
		||||
			<a href="/help-me-out.html">Help Me Out</a>
 | 
			
		||||
			<a href="/other-stuff-you-might-like.html">Other Stuff You Might Like</a>
 | 
			
		||||
			<a href="/help-me-out/">Help Me Out</a>
 | 
			
		||||
			<a href="/other-stuff-you-might-like/">Other Stuff You Might Like</a>
 | 
			
		||||
			<a href="https://git.jonathanh.co.uk/jab2870/Website">Website Source</a>
 | 
			
		||||
		</footer>
 | 
			
		||||
	</body>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue