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.master
parent
39791363fa
commit
56f95cb9aa
13 changed files with 289 additions and 234 deletions
@ -1,6 +1,8 @@ |
||||
generated-template-parts |
||||
public_html |
||||
public_gemini |
||||
public |
||||
gem-cert |
||||
tmp |
||||
assets/css/main.min.css |
||||
xxx-* |
||||
|
@ -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/
|
@ -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>" |
@ -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" |
@ -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" |
||||
|
@ -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' |
@ -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>" |
@ -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>" |
@ -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 |
||||
|
@ -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 |
@ -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>" |
@ -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 |
Loading…
Reference in new issue