shatom/README.md

102 lines
3.1 KiB
Markdown
Raw Permalink Normal View History

2021-02-06 20:04:44 +00:00
# shatom
2020-11-19 02:39:46 +00:00
## an Atom feed generator in (mostly) POSIX shell
Because of [this post in the Gemini mailing list](https://lists.orbitalfox.eu/archives/gemini/2020/003407.html),
which bemoans the inability to generate Atom feeds using bare-bones computers,
2021-02-06 20:04:44 +00:00
I present `shatom`, a shell program that purports to do just that.
2020-11-19 02:39:46 +00:00
It has minimal dependencies (see DEPENDENCIES, below),
and is completely modifiable by the user with the config file
(see CONFIG, below).
And it's licensed permissively.
What more could you want!?
## DEPENDENCIES
- POSIX shell
- POSIX awk (I'm 99% sure) - optional
- GNU find - optional
- stat - optional
Technically, a shell is the only optional dependency --
if you're removing shell from the dependencies list,
you're writing another script.
## CONFIG
2021-02-06 20:04:44 +00:00
All of the functions and variables defined in `shatom`
2020-11-19 02:39:46 +00:00
can be overwritten by a config file, by default
2021-02-06 20:04:44 +00:00
`shatom.conf.sh` in the current directory.
2020-11-19 02:39:46 +00:00
As may be obvious from the file's extension, it's a shell script,
so you can redefine (and in fact, *should* redefine)
2021-02-06 20:04:44 +00:00
all the variables and functions in `shatom` to suit your needs.
2020-11-19 02:39:46 +00:00
Here's a convenient list:
### Variables
- **FEED_TITLE** - the title of your feed
- **FEED_AUTHOR** - the author of your feed (you!)
- **FEED_SUBTITLE** - the subtitle of your feed
- **FEED_URL** - the URL where your feed can be accessed
- **SITE_URL** - the base URL of your site
- **FEED_ID** - the Atom ID of the feed (default: SITE_URL)
- **FEED_COPYRIGHT** - the copyright information of your feed
- **FEED_UPDATED** - the date your feed was last updated (default: the current time)
### Functions
#### File functions
- **recent_files** - sort files recursively, in reverse
#### Entry functions
These operate on entries themselves, in the inner `for` loop of `main`.
They're all passed the path of the entry.
See the source for their default implementations.
- **skip_entry** - whether to skip an entry (default: don't). Return 0 to skip an entry.
- **entry_url** - pull the URL out of an entry
- **entry_title** - pull the title from an entry
- **entry_summary** - pull the summary from an entry
- **entry_author** - pull the author from an entry
- **entry_content** - pull the content from an entry
- **entry_updated** - pull the modification time from an entry
#### Atom functions
These generate the actual atom bits.
Should be pretty self-explanatory.
- **atom_header**
- **atom_entry**
- **atom_footer**
## POSIX compliance
This script should be 95% POSIX compliant.
The only bits that aren't strictly so are the functions
`recent_files`, which requires GNU `find` for the `-printf` option,
and possibly `entry_updated`, which uses `stat`.
I've included commentary toward POSIX-ifying these if need be,
but since this is a quick-and-dirty proof-of-concept,
I leave actually doing so as an exercise to the reader.
## Copyright
(C) 2020 Case Duckworth.
Licensed under the MIT license.
See LICENSE for details.
## Contributing
Feel free to send patches, complaints, and praise
to my [public inbox](mailto:~acdw/public-inbox@lists.sr.ht).
## See also
- [gemfeed](https://tildegit.org/solderpunk/gemfeed)
- [RFC 4287](https://tools.ietf.org/html/rfc4287)