A reason why I like static site generators

Static site generators like Sculpin don't have a database like Drupal.

The files are the database.

In [my website repository][3], the source/_presentations directory contains the files for my presentation pages, so these could be considered the presentations table and rows.

But, because my content is in plain text files, they're very easy and quick to search in a text editor or on the command line using tools like grep.

It's very easy and fast for me to find an old daily email, blog post or article I've written when I need to.

This is also why I use rst2pdf for my presentation slides and write them in reStructured text. It's very fast to find and re-use content.

Counting my presentations

Another example is being able to quickly count the number of presentations I've given.

Here's an example of the front matter section from one of my presentations:

events:
- name: PHP South West
date: 2024-02-14
location: Bristol, UK
urls:
video: https://www.youtube.com/watch?v=axy6ltc9meA
demo: https://phpsw-sculpin-demo.oliverdavies.uk
- name: BrumPHP
date: 2024-05-23
location: Birmingham, UK
url: https://www.eventbrite.com/e/brumphp-23rd-may-2024-tickets-803037766577
- name: PHP Berkshire
date: 2024-08-28
location: Reading, UK
urls:
slides: /files/presentations/sculpin/php-berkshire.pdf
website: https://www.meetup.com/php-berkshire/events/301850284
- name: PHP Thames Valley
date: 2026-03-20
location: Oxford, UK
urls:
slides: /files/presentations/sculpin/php-thames-valley.pdf
code: https://code.oliverdavies.uk/opdavies/sculpin-demo/src/branch/php-thames-valley
website: https://www.meetup.com/php-thames-valley/events/305915971

Each presentation has a list of events, as most presentations I've given multiple times.

Each event has a date that I can extract with grep:

grep -r "date:" source/_presentations/*.md

source/_presentations/tdd-test-driven-drupal.md: date: 2020-12-08
source/_presentations/tdd-test-driven-drupal.md: date: 2023-10-17
source/_presentations/tdd-test-driven-drupal.md: date: 2024-05-10
source/_presentations/tdd-test-driven-drupal.md: date: 2024-11-20
source/_presentations/test-drive-twig-with-sculpin.md: date: 2015-07-25
source/_presentations/things-you-should-know-about-php.md: date: 2019-01-28
source/_presentations/things-you-should-know-about-php.md: date: 2022-03-09
source/_presentations/things-you-should-know-about-php.md: date: 2023-01-12
source/_presentations/upgrading-your-site-drupal-9.md: date: 2020-09-02
source/_presentations/upgrading-your-site-drupal-9.md: date: 2020-09-23
source/_presentations/upgrading-your-site-drupal-9.md: date: 2021-04-22
source/_presentations/using-illuminate-collections-outside-laravel.md: date: 2017-12-21
source/_presentations/using-illuminate-collections-outside-laravel.md: date: 2018-08-28
source/_presentations/working-without-workspace.md: date: 2023-04-06
source/_presentations/working-with-workspace.md: date: 2020-08-11
source/_presentations/working-with-workspace.md: date: 2020-09-09
source/_presentations/working-with-workspace.md: date: 2021-02-02

To count them, I can add | wc -l to count the number of lines.

But what if I have presentations in the future I don't want to count?

To show just the dates, I can pipe the output to awk and only print the last item:

grep -r "date:" source/_presentations/*.md | awk '{ print $NF }'

2020-12-08
2023-10-17
2024-05-10
2024-11-20
2015-07-25
2019-01-28
2022-03-09
2023-01-12
2020-09-02
2020-09-23
2021-04-22
2017-12-21
2018-08-28
2023-04-06
2020-08-11
2020-09-09
2021-02-02

I can sort them by adding | sort, but that doesn't matter in this case.

To remove any future presentations, I can pass the current date to awk, filter based on the date and count the number of lines in the result:

grep -r "date:" source/_presentations/*.md | awk -v today="$(date +%Y-%m-%d)" '{ if ($NF < today) print $NF }' | wc -l

104

This isn't how I'm calculating this on my website (I'm using a custom Twig extension in Sculpin for that), but this is an example of how multiple command line utilities can work together to perform a task - made possible using the static files from my website.