132 lines
2.6 KiB
Awk
132 lines
2.6 KiB
Awk
#
|
|
# Render a zodiac page
|
|
#
|
|
|
|
BEGIN {
|
|
action = "none"
|
|
ext = "none"
|
|
main = "_main"
|
|
helpers_loaded = "no"
|
|
layout = ""
|
|
}
|
|
|
|
{
|
|
split(FILENAME, parts, ".")
|
|
ext = parts[length(parts)]
|
|
if (FILENAME == "-") {
|
|
action = "config"
|
|
} else if (ext == "meta") {
|
|
action = "meta"
|
|
} else if (ext == "layout") {
|
|
action = "layout"
|
|
} else {
|
|
action = "page"
|
|
filter_ext = ext
|
|
}
|
|
}
|
|
|
|
# Process lines from meta files
|
|
action == "meta" {
|
|
split($0, kv, ": ")
|
|
data[kv[1]] = kv[2]
|
|
next
|
|
}
|
|
|
|
# Done processing meta
|
|
# Since data is loaded now, load the helpers
|
|
action != "meta" && action != "config" && helpers_loaded == "no" && helpers == "yes" {
|
|
load_helpers()
|
|
helpers_loaded = "yes"
|
|
}
|
|
|
|
# Process lines from the page
|
|
action == "page" {
|
|
if (!contents[main]) {
|
|
contents[main] = bind_data($0)
|
|
|
|
# save the extension for this content type
|
|
# to find the appropriate filter to render it
|
|
filter_exts[main] = ext
|
|
} else {
|
|
contents[main] = contents[main] "\n" bind_data($0)
|
|
}
|
|
next
|
|
}
|
|
|
|
# Process lines from the layout
|
|
action == "layout" {
|
|
|
|
# replace yield with rendered content
|
|
if (match($0, /{{{yield}}}/)) {
|
|
sub(/{{{yield}}}/, render_content(main))
|
|
}
|
|
|
|
if (layout == "") {
|
|
layout = bind_data($0)
|
|
} else {
|
|
layout = layout "\n" bind_data($0)
|
|
}
|
|
}
|
|
|
|
END {
|
|
if (layout != "") {
|
|
print layout
|
|
} else {
|
|
print render_content(main)
|
|
}
|
|
}
|
|
|
|
function bind_data(txt, tag, key) {
|
|
if (match(txt, /{{([^}]*)}}/)) {
|
|
tag = substr(txt, RSTART, RLENGTH)
|
|
match(tag, /([[:alnum:]_]|[?]).*[^}]/)
|
|
key = substr(tag, RSTART, RLENGTH)
|
|
gsub(tag, data[key], txt)
|
|
return bind_data(txt, data)
|
|
} else {
|
|
return txt
|
|
}
|
|
}
|
|
|
|
function render_content(type, ext_key, filter_ext, filter_cmd, txt) {
|
|
ext_key = type "_ext"
|
|
|
|
# Get the extension of the content type
|
|
filter_ext = filter_exts[type]
|
|
|
|
# Get the appropriate filter command for this extension
|
|
filter_cmd = filter[filter_ext]
|
|
|
|
# Get the text of the content for the given type
|
|
txt = contents[type]
|
|
|
|
if (filter_cmd != "none") {
|
|
return run_filter(filter_cmd, txt)
|
|
} else {
|
|
return txt
|
|
}
|
|
}
|
|
|
|
function run_filter(cmd, txt, rand_date, tmpfile, rendered_txt, date_cmd, filter_cmd, line) {
|
|
date_cmd = "date +%Y%m%d%H%M%S"
|
|
date_cmd | getline rand_date
|
|
close(date_cmd)
|
|
|
|
tmpfile = "/tmp/awk_render" rand_date
|
|
filter_cmd = cmd " > " tmpfile
|
|
|
|
# pipe content to filter command
|
|
print txt | filter_cmd
|
|
close(filter_cmd)
|
|
|
|
# pull out the filtered page
|
|
while((getline line < tmpfile) > 0) {
|
|
rendered_txt = rendered_txt "\n" line
|
|
}
|
|
close(tmpfile)
|
|
|
|
system("rm " tmpfile)
|
|
|
|
return rendered_txt
|
|
}
|