From a6872fb4157741f4eeaf09bb52b28f03bbf51892 Mon Sep 17 00:00:00 2001 From: Miguel Alejandro Salgado Zapien Date: Wed, 22 Jun 2022 16:04:59 -0700 Subject: [PATCH] Boiler plate for blog. --- Makefile | 69 +++++++++++++++++++++++++++++++ filters/blog_feed.py | 34 +++++++++++++++ metadata.yaml | 11 +++++ scripts/entries2rss.py | 59 ++++++++++++++++++++++++++ src/blog/index.md | 6 +++ src/index.md | 39 ++++++++++++++++++ templates/comment-section.html | 3 ++ templates/default.html | 75 ++++++++++++++++++++++++++++++++++ 8 files changed, 296 insertions(+) create mode 100644 Makefile create mode 100755 filters/blog_feed.py create mode 100644 metadata.yaml create mode 100755 scripts/entries2rss.py create mode 100644 src/blog/index.md create mode 100644 src/index.md create mode 100644 templates/comment-section.html create mode 100644 templates/default.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..59a603c --- /dev/null +++ b/Makefile @@ -0,0 +1,69 @@ +.PHONY: serve clean info + +SRC_DIR := src +BUILD_DIR := build +ENTRIES_LIST := .entries.csv + +# Pandoc basic configuration +PANDOC := pandoc -s +PANDOC_FILTERS := + +PANDOC_METADATA = \ + --template=templates/default.html \ + --metadata-file metadata.yaml \ + --metadata=path="$(shell echo $@ | sed -e 's/build//g' )" \ + --metadata=git_initial_date="$(shell git log --reverse -n 1 --pretty=format:%aI -- $< || echo 'draft')" \ + --metadata=git_date="$(shell git log -n 1 --pretty=format:%aI -- $< || echo 'draft')" \ + +PANDOC_COMMAND = $(PANDOC) $(PANDOC_FILTERS) $(PANDOC_METADATA) + +# Blog Configuration +COMMENT_SECTION := templates/comment-section.html +PANDOC_BLOG_FILTER := filters/blog_feed.py + +# Public Pages configuration +# +# All markdown files +PAGES = \ + build/index.html \ + build/contact.html +FEEDS = build/blog/index.html build/blog/rss.xml +ENTRIES = $(shell find src/blog -mindepth 2 -type f -name '*.md' | sed -e 's/\.md/.html/;s/src/build/g') +# PAGES = # Define here which pages to publish. +# PAGES = build/index.html + +info: + @echo $(ENTRIES) + + +all: $(PAGES) $(FEEDS) + +$(ENTRIES_LIST): $(ENTRIES) + + +$(BUILD_DIR)/blog/%.html: $(SRC_DIR)/blog/%.md $(COMMENT_SECTION) + mkdir -p $(shell dirname $@) + [[ -d "$(shell dirname $<)/assets" ]] \ + && cp -r $(shell dirname $<)/assets/. $(shell dirname $@)/assets \ + || echo "Entry with no assets" + $(PANDOC_COMMAND) \ + --filter $(PANDOC_BLOG_FILTER) \ + --include-after-body=$(COMMENT_SECTION) \ + -i $< -o $@ + +$(BUILD_DIR)/blog/index.html: $(SRC_DIR)/blog/index.md $(ENTRIES_LIST) + cat $(ENTRIES_LIST) | sort | ./scripts/entries2rss.py html | \ + $(PANDOC_COMMAND) -i $< -i - -o $@ + +$(BUILD_DIR)/blog/rss.xml: $(ENTRIES_LIST) + cat $(ENTRIES_LIST) | sort | ./scripts/entries2rss.py > $@ + +$(BUILD_DIR)/%.html: $(SRC_DIR)/%.md + mkdir -p $(shell dirname $@) + $(PANDOC_COMMAND) -i $< -o $@ + +serve: + python3 -m http.server --directory $(BUILD_DIR) + +clean: + rm -rf $(BUILD_DIR) $(ENTRIES_LIST) diff --git a/filters/blog_feed.py b/filters/blog_feed.py new file mode 100755 index 0000000..cde3a1a --- /dev/null +++ b/filters/blog_feed.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +import csv +import panflute as pf + +def action(elem, doc): + pass + +def finalize(doc): + keys = [ + "git_date", + "git_initial_date", + "title", + "subject", + "path", + "base_url", + "feed_list_path", + ] + rss_data = {} + for k in keys: + rss_data[k] = doc.get_metadata(k, "") + feed_list_path = rss_data["feed_list_path"] + path = rss_data["base_url"] + rss_data["path"] + rss_data["path"] = path + del rss_data["feed_list_path"] + del rss_data["base_url"] + with open(feed_list_path, "a") as file: + writer = csv.DictWriter(file, fieldnames=keys[:-2]) + writer.writerow(rss_data) + +def main(doc=None): + return pf.run_filter(action, finalize=finalize, doc=doc) + +if __name__ == "__main__": + main() diff --git a/metadata.yaml b/metadata.yaml new file mode 100644 index 0000000..d3f5400 --- /dev/null +++ b/metadata.yaml @@ -0,0 +1,11 @@ +title: Personal Site +subtitle: Foo Bar +global_links: + - name: Index + uri: / + - name: Contact + uri: /contact.html + - name: Blog + uri: /blog +feed_list_path: .entries.csv +base_url: http://localhost:8000 diff --git a/scripts/entries2rss.py b/scripts/entries2rss.py new file mode 100755 index 0000000..e3abfa5 --- /dev/null +++ b/scripts/entries2rss.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +from sys import stdin, argv +from csv import DictReader +import panflute as pf +import yaml +from yaml.loader import SafeLoader + +fieldnames = [ + "git_date", + "git_initial_date", + "title", + "subject", + "path", +] + +def entry_to_rss(entry): + return ( + f'\n' + f'{entry["title"]}\n' + f'{entry.get("subtitle", "")}\n' + f'{entry["path"]}\n' + f'{entry["git_date"]}\n' + f'{entry["git_initial_date"]}\n' + '\n' + ) + +def entry_to_html(entry): + date = entry["git_date"] + link = entry["path"] + title = entry["title"] + return ( + f'
  • \n' + f'{date[:10]} - {title}\n' + '
  • \n' + ) + + +if __name__ == '__main__': + reader = DictReader(stdin, fieldnames) + entries = [row for row in reader] + with open('metadata.yaml') as f: + metadata = yaml.load(f, Loader=SafeLoader) + if "html" in argv: + converter = entry_to_html + print("") + else: + print("") + diff --git a/src/blog/index.md b/src/blog/index.md new file mode 100644 index 0000000..44afe1e --- /dev/null +++ b/src/blog/index.md @@ -0,0 +1,6 @@ +# Blog index + +Welcome! + +--- + diff --git a/src/index.md b/src/index.md new file mode 100644 index 0000000..6b2cf41 --- /dev/null +++ b/src/index.md @@ -0,0 +1,39 @@ +# Summos certamina vultibus carere + +## Flagrans respiramen + +Lorem markdownum aeris utinam! Paelex voce turbamque numen: corripe Bootes +*illa* iacere Caenis deceant prima Aeneia invitusque geminas? Sub rear cuspide, +regno populumque epops. Vox ullo Trachinia **tempora**, in sine fata in ultima +*precatur adspice* undas clamore, nos colle, tumulo; Cumarum. + +1. Promittere hasta concutiuntque asper evehor +2. Non sanguine unam turba sit propositumque Turni +3. Da Meleagre subitam tutus incidit mutantur fratresque + +## Densum si promissa responsa stamina patriumque fabrilis + +Acrisioneas currus et rescierit aequor conlapsamque color quaeque ingeniosus +Erysicthone quidque et [crescit utque](#). Primordia et +inania, non *et*, densus quoque pater, est. + +Praemia Patareaque etiamnum posset. Pes Delphis loquendo omnes. + +## Auroram debilitaturum arcus animos urar amplexa mergeret + +Quantaque non quos hinc Perseus cura similis damnosa pietasque quaeque pugnat, +et per quibus aconiton vertice spatium. Praebebat dat praesignis verba +exiguumque, ubi caput cecini propiore si in. Super pignora quoscumque sunt. Aevo +certum: Stygii nuntia, ille dolori invenit equosque gutture, vitae, et dignior, +et. Illa dictis erat, est enim contorta [adeste ipse](#), vos munus tum est e paterque +deprensa nomen celebrabant ac? + +> Inplumes notavit micantes **hunc**, nec sanguine, cessant, an. Ubi mollia +> maerent et Syrtis vertice condebat faveant sit fugatas comites *lilia cum +> quam* nepotes, semper, barbarus. + +Vota breve videbor: in dammas matrona lacus, nec vides saucius, nullamque. +Dubium pulsat fraxinus et, ter Philomela tectam maxima vertuntur saturae, iam ad +dignissime. Amens sine ista turbinis equorum Epaphus Iunonis +[supplex](#) duobus, tuta facit pendet medius. Paternum scorpius +aquarum per iter candentem parva et ramos urbs ubi. diff --git a/templates/comment-section.html b/templates/comment-section.html new file mode 100644 index 0000000..a9fbdbb --- /dev/null +++ b/templates/comment-section.html @@ -0,0 +1,3 @@ +
    + +
    diff --git a/templates/default.html b/templates/default.html new file mode 100644 index 0000000..2929cfe --- /dev/null +++ b/templates/default.html @@ -0,0 +1,75 @@ + + + + + + +$for(author-meta)$ + +$endfor$ +$if(date-meta)$ + +$endif$ +$if(keywords)$ + +$endif$ +$if(description-meta)$ + +$endif$ + $if(title-prefix)$$title-prefix$ – $endif$$pagetitle$ + +$for(css)$ + +$endfor$ +$for(header-includes)$ + $header-includes$ +$endfor$ +$if(math)$ + $math$ +$endif$ + + + +$for(include-before)$ +$include-before$ +$endfor$ +$if(title)$ +
    +

    $title$

    +$if(subtitle)$ +

    $subtitle$

    +$endif$ +$for(author)$ +

    $author$

    +$endfor$ +$if(date)$ +

    $date$

    +$endif$ +$if(abstract)$ +
    +
    $abstract-title$
    +$abstract$ +
    +$endif$ +
    +$endif$ +$if(toc)$ + +$endif$ +
    +$body$ +
    +$for(include-after)$ +$include-after$ +$endfor$ + +