Skip to content

Instantly share code, notes, and snippets.

@joyrexus
Last active December 15, 2015 05:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joyrexus/5208218 to your computer and use it in GitHub Desktop.
Save joyrexus/5208218 to your computer and use it in GitHub Desktop.
Minimalist templating

Mint

Minimalist templating.

fs = require 'fs'
coffee = require 'coffee-script'

The render method returns a template from template text or an interpolated template if passed a data object. Ex:

    text = '<div class="#{ data.group }">#{ data.name }</div>'
    data =
      group: 'accounting'
      name: 'Dave'
    console.log render text, data
    # ... or ...
    template = render text
    console.log template data
render = (text, data) -> 
  t = text.replace(/\n/g, '\\n').replace(/"/g, '\\"')
  f = coffee.eval '(data) -> "' + t + '"'
  if data then f(data) else f

The renderFile method takes the name of a template file and returns a template or an interpolated template if passed a data object.

renderFile = (file, data) -> 
  source = fs.readFileSync(file, 'utf8').toString()
  render source, data

Export our methods.

exports[key] = value for key, value of {render, renderFile}
<!-- SAMPLE COFFEESCRIPT TEMPLATE -->
<div class="#{ data.foo }">
<div class="#{ data.bar }"></div>
<div class="#{ data.baz }"></div>
#{ {foo, baz} = data; foo + '-' + baz }
</div>
{test, eq} = require 'tester'
{render, renderFile} = require 'mint'
expected = '''
<!-- SAMPLE COFFEESCRIPT TEMPLATE -->
<div class="ALPHA">
<div class="BETA"></div>
<div class="GAMMA"></div>
ALPHA-GAMMA
</div>
'''
data =
foo: 'ALPHA'
bar: 'BETA'
baz: 'GAMMA'
test 'renderFile as template', ->
template = renderFile 'sample.cst'
eq expected, template(data)
test 'renderFile with interpolated data', ->
eq expected, renderFile('sample.cst', data)
test 'render method', ->
expected = '<div class="ALPHA">'
template = '<div class="#{ data.foo }">'
eq expected, render(template, data)
text = '<div class="#{data.group}">#{ data.name }</div>'
test.status()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment