192 lines
6.4 KiB
Bash
Executable File
192 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# noter 1.3.0 - "nice configs" - @k@layer8.space - mit
|
|
|
|
# a pretty nifty little logging utility!
|
|
nlog() {
|
|
local ORANGE='\033[0;33m'
|
|
local NO_COLOR='\033[0m'
|
|
local calling_function=${FUNCNAME[1]}
|
|
|
|
echo -e "${ORANGE}[noter] ${calling_function} | ${1} ${NO_COLOR}"
|
|
}
|
|
|
|
nlog "sourcing config.sh"
|
|
source ./config.sh
|
|
|
|
# Override publish dir if passed as cli arg
|
|
[[ ! -z "$1" ]] && nlog "overriding publish_dir to $1" && publish_dir="$1"
|
|
|
|
if [ ! -d "notes" ]; then
|
|
nlog "Error: 'notes' folder not found!"
|
|
exit 1
|
|
fi
|
|
|
|
checksetting() {
|
|
# Use this function to check for a setting without repetition
|
|
# Eg:
|
|
# checksetting "yourmom" "$isyourmom"
|
|
if [ "$2" = true ]; then
|
|
nlog "$1 set to $2"
|
|
echo "$1" >>"$output_file"
|
|
fi
|
|
}
|
|
|
|
givefavicon() {
|
|
local file_path="$1"
|
|
|
|
if [ -f "$file_path" ]; then
|
|
local base64_data="$(base64 -w 0 "$file_path")"
|
|
echo "data:image/png;base64,$base64_data"
|
|
fi
|
|
}
|
|
|
|
generate_note_html() {
|
|
# NOTE TO SELF: Figure out parsing html blocks (ie: <code>) so that we can apply styles for whole
|
|
# elements instead of doing what we're doing right now...
|
|
local note_date="$(date -d "$(basename "$1" .txt)" +"%B %d, %Y")"
|
|
for img in $(grep -oP '(?<=<img src=").*?(?=")' "$1"); do
|
|
# Check if the loading attribute already exists
|
|
if ! grep -q "src=\"$img\" loading=\"lazy\"" "$1"; then
|
|
# Add the loading attribute if it doesn't exist
|
|
sed -i "s|<img src=\"$img\"|<img src=\"$img\" loading=\"lazy\"|g" "$1"
|
|
fi
|
|
done
|
|
|
|
echo "<a name='$(basename "$1" .txt)'></a>"
|
|
echo "<div class='note'>"
|
|
if [ "$2" = true ]; then
|
|
echo "<h3><a href='#$(date -d "$(basename "$1" .txt)" +"%Y")'>$(date -d "$(basename "$1" .txt)" +"%Y")</a></h3>"
|
|
fi
|
|
echo "<h4><a href='#$(basename "$1" .txt)'>$note_date</a></h4>"
|
|
echo "$(cat "$1")</br>"
|
|
echo "</div>"
|
|
}
|
|
|
|
generate_top_year_bar() {
|
|
local years=$(find notes -name "*.txt" ! -empty | cut -d'/' -f2 | cut -d'-' -f1 | sort -u | tac)
|
|
local top_bar="<center><div class='top-bar'>"
|
|
local first_year=true
|
|
for year in $years; do
|
|
if [ "$first_year" = false ]; then
|
|
top_bar+=" | "
|
|
else
|
|
first_year=false
|
|
fi
|
|
top_bar+="<a href='#$(find notes -name "$year-*.txt" ! -empty | sort -n | head -n1 | cut -d'/' -f2 | cut -d'.' -f1)'>$year</a>"
|
|
done
|
|
top_bar+="</div></center><br>"
|
|
echo "$top_bar"
|
|
}
|
|
|
|
|
|
# this took way too long but fuck it
|
|
# im faster than Google at getting a
|
|
# feed going goddamit!
|
|
generate_rss_feed() {
|
|
nlog "generating rss feed"
|
|
local rss_file="feed.xml"
|
|
local rss_pubdate=$(date -u +"%a, %d %b %Y %H:%M:%S GMT")
|
|
|
|
xml_escape() {
|
|
local content="$1"
|
|
sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g' <<< "$content"
|
|
}
|
|
|
|
# im sorry for these crimes against humanity
|
|
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
|
|
<rss version=\"2.0\">
|
|
<channel>
|
|
<title>$(xml_escape "$site_title")</title>
|
|
<link>$site_link</link>
|
|
<description>$(xml_escape "$site_description")</description>
|
|
<pubDate>$rss_pubdate</pubDate>
|
|
<lastBuildDate>$rss_pubdate</lastBuildDate>
|
|
<docs>https://cyber.harvard.edu/rss/rss.html</docs>
|
|
<generator>noter</generator>" >"$rss_file"
|
|
|
|
# this works, don't touch.
|
|
for file in $(find notes -name '*.txt' -type f -print0 | sort -zr | xargs -0); do
|
|
if [ -f "$file" ] && [ -s "$file" ]; then
|
|
nlog "$file"
|
|
local note_date=$(date -d "$(basename "$file" .txt)" +"%a, %d %b %Y %H:%M:%S GMT")
|
|
local note_link="$rss_link#$(basename "$file" .txt)"
|
|
local note_title=$(basename "$file" .txt)
|
|
local note_description=$(head -n 1 "$file")
|
|
# Currently we use the first line of the note as the description
|
|
# This could be improved uppon by using a selector or something to grab
|
|
# the title for example from a h1 or something as (at least I) tend to
|
|
# use those when i type posts.
|
|
|
|
echo " <item>
|
|
<title>$(xml_escape "$note_title")</title>
|
|
<link>$note_link</link>
|
|
<description>$(xml_escape "$note_description")</description>
|
|
<pubDate>$note_date</pubDate>
|
|
</item>" >>"$rss_file"
|
|
fi
|
|
done
|
|
|
|
echo "</channel>
|
|
</rss>" >>"$rss_file"
|
|
|
|
nlog "rss feed generated, please remember to move it too with the site: $rss_file"
|
|
}
|
|
|
|
# why is this stray here, im too afraid to move it
|
|
# godspeed notecount...
|
|
notecount=$(find notes -name "*.txt" ! -empty | wc -l)
|
|
|
|
if [ ! -d "${publish_dir}" ]; then
|
|
nlog "Creating ${publish_dir}"
|
|
mkdir -p "${publish_dir}"
|
|
fi
|
|
# Create HTML file
|
|
output_file="${publish_dir}/index.html"
|
|
echo "<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset='utf-8'>
|
|
<title>$notecount notes | noter</title>
|
|
<meta property='og:title' content='$site_title' />
|
|
<meta property='og:description' content='$site_description' />
|
|
<meta property='og:type' content='blog' />
|
|
<meta property='og:generator' content='noter' />
|
|
<!-- those who seek, shall see - but thy shall be prepared... -->
|
|
<link rel='icon' type='image/png' href='$(givefavicon "$favicon")'>
|
|
<link rel='alternate' type='application/atom+xml' title="rss" href='/feed.xml' />
|
|
<meta name='last-generated' content='$(date +"%Y-%m-%d %H:%M:%S")' />
|
|
<style>
|
|
$site_css
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class='container'>
|
|
<h1>$site_title</h1><br>
|
|
<center> <a rel='me' href='https://layer8.space/@k'>fedi</a> | <a href="feed.xml">rss</a> | <a href="https://the-sauna.icu/">sauna</a> </center>" >"$output_file"
|
|
generate_top_year_bar >>"$output_file"
|
|
|
|
# loop for every note in notes
|
|
nlog "generating page..."
|
|
for file in $(ls -r notes/*.txt); do
|
|
nlog "processing: $file"
|
|
if [ -f "$file" ] && [ -s "$file" ]; then
|
|
generate_note_html "$file" >>"$output_file"
|
|
fi
|
|
done
|
|
|
|
# generate page's rss feed
|
|
[[ $rssfeed == true ]] && generate_rss_feed
|
|
|
|
# bottom navigation
|
|
nlog "applying settings"
|
|
checksetting "<div class='generated-with'>generated with <a href='https://git.sr.ht/~koutsie/noter'>noter</a></div>" "$showgenerator"
|
|
checksetting "<div class='back-to-top'><a href='#'>Back to Top</a></div>" "$backtotop"
|
|
checksetting "<div class='last-updated'>last Updated: $(date +"%Y-%m-%d %H:%M:%S")</div>" "$lastupdated"
|
|
|
|
|
|
echo "</div>
|
|
</body>
|
|
</html>" >>"$output_file"
|
|
|
|
nlog "Done, please see: $output_file."
|