61 lines
1.3 KiB
Crystal
61 lines
1.3 KiB
Crystal
# Nicoletta, a minimal static site generator.
|
|
|
|
require "yaml"
|
|
require "markd"
|
|
require "crustache"
|
|
|
|
VERSION = "0.1.0"
|
|
|
|
# Load config file
|
|
tpl_data = File.open("conf") do |file|
|
|
YAML.parse(file).as_h
|
|
end
|
|
|
|
class Template
|
|
@text : String
|
|
@compiled : Crustache::Syntax::Template
|
|
|
|
def initialize(path)
|
|
@text = File.read(path)
|
|
@compiled = Crustache.parse(@text)
|
|
end
|
|
end
|
|
|
|
# Load templates
|
|
templates = {} of String => Template
|
|
|
|
Dir.glob("templates/*.tmpl").each do |path|
|
|
templates[path] = Template.new(path)
|
|
end
|
|
|
|
class Post
|
|
@metadata = {} of YAML::Any => YAML::Any
|
|
@text : String
|
|
@link : String
|
|
@html : String
|
|
|
|
def initialize(path)
|
|
contents = File.read(path)
|
|
metadata, @text = contents.split("\n\n", 2)
|
|
@metadata = YAML.parse(metadata).as_h
|
|
@link = path.split("/")[-1][0..-4] + ".html"
|
|
@html = Markd.to_html(@text)
|
|
end
|
|
|
|
def render(template)
|
|
Crustache.render template.@compiled, @metadata.merge({"link" => @link, "text" => @html})
|
|
end
|
|
end
|
|
|
|
Dir.glob("posts/*.md").each do |path|
|
|
post = Post.new(path)
|
|
rendered_post = post.render templates["templates/post.tmpl"]
|
|
rendered_page = Crustache.render(templates["templates/page.tmpl"].@compiled,
|
|
tpl_data.merge({
|
|
"content" => rendered_post,
|
|
}))
|
|
File.open("output/#{post.@link}", "w") do |io|
|
|
io.puts rendered_page
|
|
end
|
|
end
|