Munge
Munge is a static site generator aiming to simplify complex build rules.
It's built partially to emulate unix pipes and scripts; small transformations can be joined, composed, and applied to create almost any site you can think up.
SemVer will be followed once 1.0.0 is released. Until then, the API should be considered experimental.
Features
- No DSL
- No metaprogramming
- LiveReload
- Optional frontmatter
- Suitable for large, complex sites (e.g., multiple blogs with different templates, a single blog with multiple data sources)
- Very configurable
- Concise rule definition
- Rules defined by iterating through arrays and modifying matching objects
Caveats
- Not yet optimized (Pull requests welcome, gradual optimizations preferred)
- User facing API has mostly stabilized, but plugins have yet to be fully worked out
Installation
Add this line to your application's Gemfile:
gem "munge"
And then execute:
$ bundle
Or install it yourself as:
$ gem install munge
Usage
After installing your gem, you can start a project using the command line client.
munge init path/to/project # create a barebones project
cd path/to/project
munge server # starts auto-compiling dev server http://localhost:7000/
munge build # compiles your project for production
munge view # preview production build on http://localhost:7000/
The three main files of your application are config.yml
, data.yml
, and rules.rb
.
Here's an example rules.rb
for a blog.
# home page
app.unrouted
.select { |item| item.id == "home" } # looks for items where path is "src/home.*"
.each { |item| item.route = "" } # sets output file to "/index.html"
.each { |item| item.layout = "default"} # sets layout to "layouts/default.*"
.each { |item| item[:title] = "home" } # sets additional frontmatter variables
.each { |item| item.transform(:tilt) } # have Tilt compile this file
# blog posts
app.unrouted
.select { |item| item.relpath?("posts") } # looks for items in "src/posts/**/*"
.each { |item| item.route = "blog/#{item.basename}" } # sets output file to "/blog/#{basename}/index.html"
.each { |item| item.layout = "post" }
.each { |item| item.transform } # sets transform to Tilt (default)
# blog index
posts_for_index =
app.routed
.select { |item| item.route?("blog") }
.sort_by { |item| item.route }
.reverse
app.create("blog/index.html.erb", "", posts: posts_for_index)
.each { |item| item.route = "blog" }
.each { |item| item.layout = "list" }
.each { |item| item.transform }
Guides
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/zachahn/munge.
Please open an issue before creating a pull request to discuss whether any new feature should be included as part of the core library or as an external plugin.
License
The gem is available as open source under the terms of the MIT License.