# Static site builder # # It allows for the creation a diary and a blog. # It follows pretty "unixy" way to articulate the build. # It uses Pandoc, Python3 and POSIX Commands # SRC_DIR := src DIARY_DIR := src/diary BLOG_DIR := src/blog BUILD_DIR := build # Commands Configuration BLOG_ENTRIES_LIST := .entries.csv SORT := sort -r # Utility Function ESCAPE_PATH = $(shell echo $(1) | sed 's/\//\\\//g') # Pandoc basic configuration PANDOC := pandoc -s PANDOC_FILTERS := PANDOC_METADATA = \ --section-divs \ --template=templates/default.html \ --metadata-file metadata.yaml \ --metadata=blog_entries_list:"$(BLOG_ENTRIES_LIST)" \ --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 PANDOC_DIARY_FILTER := filters/diary.py # Public Pages configuration # # All markdown files PAGES = \ build/index.html \ build/contact.html # Blog Configuration BLOG_FEEDS = build/blog/index.html build/blog/rss.xml BLOG_ENTRIES = $(shell \ find $(BLOG_DIR) -mindepth 2 -type f -name '*.md' \ | sed -e 's/\.md/.html/' \ | sed -e 's/$(call ESCAPE_PATH,$(BLOG_DIR))/$(call ESCAPE_PATH,$(BUILD_DIR))\/blog/g' \ | $(SORT) \ ) BLOG_BUILD := $(BUILD_DIR)/blog ENTRIES_TO_RSS := ./scripts/entries2rss.py # Diary Configuration DIARY_ENTRIES = $(shell \ find $(DIARY_DIR) -type f -name '*.md' \ | sed -e 's/\.md/.html/' \ | sed -e 's/$(call ESCAPE_PATH,$(DIARY_DIR))/$(call ESCAPE_PATH,$(BUILD_DIR))\/diary/g' \ | $(SORT) \ ) DIARY_BUILD := $(BUILD_DIR)/diary DIARY_COMMAND := ./scripts/diary.py $(DIARY_DIR) $(DIARY_BUILD) DIARY_INDEX := $(DIARY_BUILD)/index.html $(shell $(DIARY_COMMAND) index-files) # Build Rules # PHONY Rules .PHONY: serve clean info css info: @echo "Blog Entries" @echo $(BLOG_ENTRIES) | sed -e 's/^/\t/g;s/\ /\n\t/g' @echo "Diary Entries" @echo $(DIARY_ENTRIES) | sed -e 's/^/\t/g;s/\ /\n\t/g' all: $(PAGES) $(BLOG_FEEDS) $(DIARY_INDEX) css css: mkdir -p $(BUILD_DIR)/css cp -f $(SRC_DIR)/css/* $(BUILD_DIR)/css/ serve: python3 -m http.server --directory $(BUILD_DIR) clean: rm -rf $(BUILD_DIR) $(BLOG_ENTRIES_LIST) _diary_command: @echo "$(DIARY_COMMAND)" # File Rules # Blog related rules $(BLOG_ENTRIES_LIST): $(BLOG_ENTRIES) $(BUILD_DIR)/blog/%.html: $(BLOG_DIR)/%.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 $@ $(BLOG_BUILD)/index.html: $(BLOG_DIR)/index.md $(BLOG_ENTRIES_LIST) cat $(BLOG_ENTRIES_LIST) \ | $(SORT) \ | $(ENTRIES_TO_RSS) html \ | $(PANDOC_COMMAND) -i $< -i - -o $@ $(BLOG_BUILD)/rss.xml: $(BLOG_ENTRIES_LIST) cat $(BLOG_ENTRIES_LIST) \ | $(SORT) \ | ./scripts/entries2rss.py \ > $@ # Diary Related rules. $(DIARY_BUILD)/%.html: $(DIARY_DIR)/%.md mkdir -p $(shell dirname $@) $(PANDOC_COMMAND) \ --filter $(PANDOC_DIARY_FILTER) \ --metadata=diary_dir:$(DIARY_DIR) \ -i $< -o $@ $(DIARY_BUILD)/%.html: $(DIARY_DIR)/%-*.md mkdir -p $(shell dirname $@) $(PANDOC_COMMAND) \ --metadata=diary_dir:$(DIARY_DIR) \ -i $< -o $@ $(DIARY_BUILD)/index.html: $(DIARY_ENTRIES) mkdir -p $(shell dirname $@) $(DIARY_COMMAND) index-full \ | $(PANDOC_COMMAND) -i - -o $@ # Regular page related rules. $(BUILD_DIR)/%.html: $(SRC_DIR)/%.md mkdir -p $(shell dirname $@) $(PANDOC_COMMAND) -i $< -o $@