| Title: RSS feed for OpenBSD stable packages repository (made with XSLT) | |
| Author: Solène | |
| Date: 05 June 2019 | |
| Tags: openbsd automation | |
| Description: | |
| I am happy to announce there is now a RSS feed for getting news in case | |
| of new | |
| packages available on my repository | |
| [https://stable.perso.pw/](https://stable.perso.pw/) | |
| The file is available at | |
| [https://stable.perso.pw/rss.xml](https://stable.perso.pw/rss.xml). | |
| I take the occasion of this blog post to explain how the file is | |
| generated as I | |
| did not find easy tool for this task, so I ended up doing it myself. | |
| I choosed to use **XSLT**, which is not quite common. Briefly, **XSLT** | |
| allows | |
| to use some kind of XML template on a XML data file, this allow loops, | |
| filtering etc... It requires only two parts: the template and the data. | |
| **Simple RSS template** | |
| The following file is a template for my RSS file, we can see a few tags | |
| starting by `xsl` like `xsl:for-each` or `xsl:value-of`. | |
| It's interesting to note that the `xsl-for-each` can use a condition | |
| like | |
| `position < 10` in order to limit the loop to the 10 first items. | |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <xsl:stylesheet version="1.0" | |
| xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> | |
| <channel> | |
| <description></description> | |
| <title>OpenBSD unofficial stable packages | |
| repository</title> | |
| <link>https://stable.perso.pw/</link> | |
| <atom:link href="https://stable.perso.pw/rss.xml" | |
| rel="self" type="application/rss+xml" /> | |
| <!-- END CONFIGURATION --> | |
| <xsl:for-each select="feed/news[position()<10]"> | |
| <item> | |
| <title> | |
| <xsl:value-of select="title"/> | |
| </title> | |
| <description> | |
| <xsl:value-of select="description"/> | |
| </description> | |
| <pubDate> | |
| <xsl:value-of select="date"/> | |
| </pubDate> | |
| </item> | |
| </xsl:for-each> | |
| </rss> | |
| </xsl:template> | |
| </xsl:stylesheet> | |
| **Simple data file** | |
| Now, we need some data to use with the template. | |
| I've added a comment block so I can copy / paste it to add a new entry | |
| into the | |
| RSS easily. As the date is in a painful format to write for a human, I | |
| added to | |
| my Makefile starting the commands a call to a script replacing the | |
| string DATE | |
| by the current date with the correct format. | |
| <feed> | |
| <news> | |
| <title>www/mozilla-firefox</title> | |
| <description>Firefox 67.0.1</description> | |
| <date>Wed, 05 Jun 2019 06:00:00 GMT</date> | |
| </news> | |
| <news> | |
| <title></title> | |
| <description></description> | |
| <date></date> | |
| </news> | |
| --> | |
| </feed> | |
| **Makefile** | |
| I love makefiles, so I share it even if this one is really short. | |
| all: | |
| sh replace_date.sh | |
| xsltproc template.xml news.xml | xmllint -format - | tee | |
| rss.xml | |
| scp rss.xml perso.pw:/home/stable/ | |
| rm rss.xml | |
| When I want to add an entry, I copy / paste the comment block in | |
| news.xml, add | |
| DATE, run `make` and it's uploaded :) | |
| The command **xsltproc** is available from the package **libxslt** on | |
| OpenBSD. | |
| And then, after writing this, I realise that manually editing the | |
| result file | |
| rss.xml is as much work as editing the news.xml file and then process | |
| it with | |
| xslt... But I keep that blog post as this can be useful for more | |
| complicated | |
| cases. :) |