UNPKG

catlogjs

Version:

Static site generator, translate human readable text format(such as markdown) into html, with a lot of other functions

83 lines (76 loc) 2.82 kB
fs = require 'fs-extra' path = require 'path' _ = require 'underscore' async = require 'async' engine = { ejs: require 'ejs' jade: require 'jade' } directory = require './directory' rss = require 'rss' render = {} render.render = (site, callback) -> site.plugins = @render_plugin site.plugin_path, site.plugins for post in site.posts # markdown interpolation if post.content post.content = engine.ejs.render post.content, post # render src = path.join post.theme_path, post.theme, 'post' dest = path.join post.destination, post.permalink @render_file src, dest, post # assets #dest = path.join(dest, if path.extname dest then '' else 'index.html') # use current directory if permalink don't have filename dest = if path.extname dest then path.dirname dest else dest assets = path.join path.dirname(post.src), 'assets' fs.copy "#{assets}", "#{dest}/assets" src = path.join site.theme_path, site.theme, 'index' dest = path.join site.destination, 'index.html' @render_file src, dest, site for category in site.categories src = path.join site.theme_path, site.theme, 'list' dest = path.join site.destination, category, 'index.html' context = _.defaults {}, site context.posts = (post for post in site.posts when post.category is category) @render_file src, dest, context @render_feed site callback and callback() render.render_file = (src, dest, context) -> dir = path.dirname src type = path.basename src # use index.html if permalink don't have filename dest = path.join(dest, if path.extname dest then '' else 'index.html') for file in fs.readdirSync dir if file.indexOf(type) is 0 format = path.extname(file).slice(1) filename = "#{src}.#{format}" raw = fs.readFileSync filename, 'utf8' html = engine[format].render raw, _.defaults({filename: filename}, context) if not fs.existsSync path.dirname dest directory.mkdir_parent path.dirname(dest), null fs.writeFileSync dest, html, 'utf8' render.render_feed = (site, callback) -> feed = new rss { title: site.site_title description: site.description feed_url: "#{site.site_url}/feed.xml" site_url: "#{site.site_url}" author: site.author } for post in site.posts feed.item { title: post.name description: post.content url: "#{site.site_url}#{site.base_url}#{post.permalink}" author: post.author date: post.date } fs.writeFileSync path.join(site.destination, 'feed.xml'), feed.xml(), 'utf8' callback and callback() render.render_plugin = (plugin_path, plugins) -> for plugin, config of plugins raw = fs.readFileSync path.join(plugin_path, "#{plugin}.html"), 'utf8' plugins[plugin] = engine.ejs.render raw, config return plugins module.exports = render