combining markdown

This commit is contained in:
vitrinekast 2024-11-12 14:11:02 +01:00
commit c5a5272ffa
9 changed files with 215 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
events
mo

18
README.md Normal file
View File

@ -0,0 +1,18 @@
# Klank docs
## installation
Run the install.sh to install [Mustache](https://github.com/tests-always-included/mo)
Also, pandoc is needed. Additionally researching this thing https://github.com/pandoc-ext/include-files/tree/main
More info to come ;)
## Scripts & folders
- `newsletters` write your new newsletter here
- `templates` contains a markdown template for events, that are being grabbed via
- `get_events.sh` run as `sh get_events.sh` to grab all events from the klankschool calendar and store them as markdwon files
- `install.sh` the installation script for Mustache
- `make_newsletter.sh` run as `sh make_newsletter` to translate all created newsletters in the `newsletters` directory into HTML. Created newsletters are stored in the `dist` directory

6
dist/newsletters/december.md.html vendored Normal file
View File

@ -0,0 +1,6 @@
<h1 id="december">December</h1>
<p>What a great month it was</p>
<h2 id="event">Event</h2>
<h1 id="lets-unrepair-things-together">Lets (un)repair things
together!</h1>
<p>This event starts at 1731603600</p>

30
get_events.sh Normal file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
DIRECTORY=events
if [ ! -d "$DIRECTORY" ]; then
mkdir $DIRECTORY
fi
echo $(curl -s "https://calendar.klank.school/api/events") | jq -c '.[]' | while read -r item; do
slug=$(echo "$item" | jq -r '.slug')
echo $item
export TITLE=$(echo "$item" | jq -r '.title')
export START_DATETIME=$(echo "$item" | jq -r '.start_datetime')
export END_DATETIME=$(echo "$item" | jq -r '.end_datetime')
filename="events/${slug}.md"
if test -f "$filename"; then
rm -f -- $filename
fi
mo templates/event.md >> $filename
echo "Created a new event markdown file for " $filename
done

127
include-files.lua Normal file
View File

@ -0,0 +1,127 @@
--- include-files.lua filter to include Markdown files
---
--- Copyright: © 20192021 Albert Krewinkel
--- License: MIT see LICENSE file for details
-- Module pandoc.path is required and was added in version 2.12
PANDOC_VERSION:must_be_at_least '2.12'
local List = require 'pandoc.List'
local path = require 'pandoc.path'
local system = require 'pandoc.system'
--- Get include auto mode
local include_auto = false
function get_vars (meta)
if meta['include-auto'] then
include_auto = true
end
end
--- Keep last heading level found
local last_heading_level = 0
function update_last_level(header)
last_heading_level = header.level
end
--- Update contents of included file
local function update_contents(blocks, shift_by, include_path)
local update_contents_filter = {
-- Shift headings in block list by given number
Header = function (header)
if shift_by then
header.level = header.level + shift_by
end
return header
end,
-- If link paths are relative then prepend include file path
Link = function (link)
if path.is_relative(link.target) then
link.target = path.normalize(path.join({include_path, link.target}))
end
return link
end,
-- If image paths are relative then prepend include file path
Image = function (image)
if path.is_relative(image.src) then
image.src = path.normalize(path.join({include_path, image.src}))
end
return image
end,
-- Update path for include-code-files.lua filter style CodeBlocks
CodeBlock = function (cb)
if cb.attributes.include and path.is_relative(cb.attributes.include) then
cb.attributes.include =
path.normalize(path.join({include_path, cb.attributes.include}))
end
return cb
end
}
return pandoc.walk_block(pandoc.Div(blocks), update_contents_filter).content
end
--- Filter function for code blocks
local transclude
function transclude (cb)
-- ignore code blocks which are not of class "include".
if not cb.classes:includes 'include' then
return
end
-- Markdown is used if this is nil.
local format = cb.attributes['format']
-- Attributes shift headings
local shift_heading_level_by = 0
local shift_input = cb.attributes['shift-heading-level-by']
if shift_input then
shift_heading_level_by = tonumber(shift_input)
else
if include_auto then
-- Auto shift headings
shift_heading_level_by = last_heading_level
end
end
--- keep track of level before recusion
local buffer_last_heading_level = last_heading_level
local blocks = List:new()
for line in cb.text:gmatch('[^\n]+') do
if line:sub(1,2) ~= '//' then
local fh = io.open(line)
if not fh then
io.stderr:write("Cannot open file " .. line .. " | Skipping includes\n")
else
-- read file as the given format with global reader options
local contents = pandoc.read(
fh:read '*a',
format,
PANDOC_READER_OPTIONS
).blocks
last_heading_level = 0
-- recursive transclusion
contents = system.with_working_directory(
path.directory(line),
function ()
return pandoc.walk_block(
pandoc.Div(contents),
{ Header = update_last_level, CodeBlock = transclude }
)
end).content
--- reset to level before recursion
last_heading_level = buffer_last_heading_level
blocks:extend(update_contents(contents, shift_heading_level_by,
path.directory(line)))
fh:close()
end
end
end
return blocks
end
return {
{ Meta = get_vars },
{ Header = update_last_level, CodeBlock = transclude }
}

11
install.sh Normal file
View File

@ -0,0 +1,11 @@
# Download
curl -sSL https://raw.githubusercontent.com/tests-always-included/mo/master/mo -o mo
# Make executable
chmod +x mo
# Move to the right folder
sudo mv mo /usr/local/bin/
# Test
echo "works" | mo

10
make_newsletter.sh Normal file
View File

@ -0,0 +1,10 @@
mkdir dist
mkdir dist/newsletters
cd newsletters
for file in *.md; do
echo $file
pandoc --lua-filter=../include-files.lua $file --output ../dist/newsletters/$file.html
done

9
newsletters/december.md Normal file
View File

@ -0,0 +1,9 @@
# December
What a great month it was
## Event
``` {.include}
../events/lets-unrepair-things-together-2.md
```

2
templates/event.md Normal file
View File

@ -0,0 +1,2 @@
# {{TITLE}}
This event starts at {{START_DATETIME}}