lb

Script that generates my blog system and RSS feed
Log | Files | Refs | README | LICENSE

commit 7a638fbc5921cb700c5f7f6392f525ba73928817
parent c29080a25e4baa28155315441187d25fb46bb916
Author: Luke Smith <luke@lukesmith.xyz>
Date:   Wed,  2 Sep 2020 13:04:42 -0400

added `sup` for classical site updating

Diffstat:
MREADME.md | 36+++++++++++++++++++++++++++++++++---
Mrss.xml | 12------------
Asup | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 102 insertions(+), 15 deletions(-)

diff --git a/README.md b/README.md @@ -1,10 +1,15 @@ -# lb -- Luke's Blog Script +# lb and sup -- Luke's Blog Script and Site Updater -Blogs and RSS feeds in less than 100 lines of shell script, actually, right now, less than 80. `lb` stands for whatever. Maybe "Luke's blog", maybe "lightweight blog", maybe "less bloat", doesn't matter that much. +Blogs and RSS feeds in less than 100 SLOC. `lb` stands for whatever. Maybe "Luke's blog", maybe "lightweight blog", maybe "less bloat", doesn't matter that much. [Video Showcase](https://www.youtube.com/watch?v=S1WQlr42xDM) -## Features +I've also added `sup`, which is even more minimal and focused on old-school static websites with no blog, but a need for a site updater! See it at the bottom of this README. + +Both `lb` and `sup` are mutually compatible and you can use them both on the same site and even feed into the same RSS feed. +`lb` makes new blog posts which go to make standalone pages, a rolling blog file and an RSS entry. `sup`, on the other hand, is if you manually add a new page to your website and want to make people know about that change. It can be run multiple times on a page for each time it is updated. + +## `lb` Features `lb` is an extremely small shell script that lets you write blog posts and will format them in all the ways you could ever want. Here's what it will produce: @@ -56,3 +61,28 @@ When you `finalize` a blog post, it will be added directly below that line in th - `blog/.htaccess` acts as a "database" file. `lb` stores filenames with their corresponding proper names and publishing dates there. - The other files in this repo just illustrate how you can use `lb`. Only the `lb` script itself is necessary. - Your `$EDITOR` variable should be set to your preferred text editor, vim will be assumed if you don't have one set. + +# `sup` -- Site updater or "What'**s up**?" + +If having a "blog" is too cringe for you and you just want an RSS feed where you can post updates about recently changed pages, use `sup`. + +Let's say you make a page called `favorite-programs.html`. + +Just run `sup favorite-programs.html` and that new page's content will be added to the RSS feed. + +Specifically, `sup` will get only the `<body>` tag, but also exclude the `<nav>` and `<footer>` tags. All the rest of the content will be directly viewable via RSS. + +If you update that page in the future, run `sup` on it again and it will prompt you for an update message + +## Installation of `sup` + +Just add the + +``` +<!-- LB --> +``` + +line in your RSS feed like for `lb` above and be sure to change the variables (rss file name and website) in the `sup` script. + + +**`sup` and `lb` are fully compatible and can be run on the same website for different purposes.** diff --git a/rss.xml b/rss.xml @@ -11,18 +11,6 @@ <!-- LB --> -<item> -<title>This is what a post looks like</title> -<guid>https://lukesmith.xyz/2018.html#this-is-what-a-post-looks-like</guid> -<pubDate>Wed, 16 May 2018 14:38:38 -0700</pubDate> -<description><![CDATA[ -<h2 id='this-is-what-a-post-looks-like'>This is what a post looks like</h2><small>[<a aria-hidden="true" href="2018.html#this-is-what-a-post-looks-like">link</a>&mdash;<a href="blog/this-is-what-a-post-looks-like.html">standalone</a>]</small> - -<p>This is autogenerated by the blog. As you can see, an equivalent RSS feed entry and standalone blog post is generated after you finalize the post.</p> -]]></description> -</item> - - </channel> </rss> diff --git a/sup b/sup @@ -0,0 +1,69 @@ +#!/bin/sh + +[ ! -f "$1" ] && + echo "Give \`sup\` a page which has been added/updated." && + exit 1 + +# You will want to change these variables to your needs. +website="https://lukesmith.xyz" +rssfile="rss.xml" + +# In order to cleanly use sed on a multi-line file, we have to use `tr` to +# convert newlines to a set character, then run sed, then reconvert the +# character. Unfortunately, due to a current issue in GNU's tr, characters of +# more than one byte are not functioning properly. It would be more ideal to +# use a rarer character (some random Tamil character, for example), but ^ is +# one byte. +replchar='^' +# So if you have a page with ^ in it, you'll have to change this to another +# single byte character that isn't in the page like ~ or something. + +link="$website/$1" +title="$(sed -n 's/<title>\(.*\)<\/title>/\1/Ip' "$1")" + +# Check and see if this page has already been added to the RSS feed. +if grep -q "<guid.*>$link</guid>" "$rssfile"; then + # Do this if it has been adding and we are updating it. + + # If updating a file, we append the time/date to the GUID, as all GUIDs + # must be unique to validate an RSS feed. Even feed readers that follow + # GUIDs will still be lead to the same page with this. + guid="$link#$(date '+%y%m%d%H%M%S')" + title="$title (Updated)" + echo "Explain the nature of the update:" + read -r content + [ -z "$content" ] && content="New updates to $link" +else + # Do this if it is a new page. + + guid=$link + # Get the page body content, excluding the nav and footer. + content="$(tr '\n' $replchar < "$1" | sed " + s/.*<body>// + s/<footer>.*<\/footer>// + s/<nav>.*<\/nav>// + s/<\/body>.*// + " | tr -s $replchar '\n')" +fi + +rssdate="$(LC_TIME=en_US date '+%a, %d %b %Y %H:%M:%S %z')" + +# Eh, I'm a brainlet and I'm not sure how to elegantly add in the content to +# the RSS feed without first writing it out to a file. This is because if we +# tried run, say, a sed substitute command, we'd have to escape with \ +# basically every other character. If you know how to do it without creating a +# temporary file, tell me. I do the same in lb, actually. +temp="$(mktemp)"; +trap 'rm -f "$temp"' 0 1 2 3 15 # Delete temp file after script termination. +echo " +<item> +<title>$title</title> +<guid>$guid</guid> +<link>$link</link> +<pubDate>$rssdate</pubDate> +<description><![CDATA[$content +]]></description> +</item> +" > "$temp" + +sed -i "/<!-- LB -->/r $temp" "$rssfile"