don

0.2.0 • Public • Published

#DON

'Document Object Notation' An embedded html templating DSL in Javascript

No license. Do what you want with this. Creator: Tim Farland

##Don is an embedded templating DSL for Javascript

It is inspired by the use of lisp s-expressions to compose html, and by the use of pure javascript as a templating language ala Coffeekup, but it primarily makes use of js array and objects to represent html. It supports haml-style abbreviations.

Don templates are functions that take an object and return normal js data adhering to a certain form.

These template functions are transformed into html by Don.render()

All examples given in Coffeescript unless otherwise noted.

Benefits:

  • Terse, but remains normal js
  • Use the bracket matching of your favourite editor
  • Js syntax checking can help spot malformed html
  • No complicated abstractions or syntax to learn
  • Use js data directly in templates (e.g. objects as tag attributes)
  • Fast enough without a compilation step
  • Flexible

Note: I've also included an experimental Ruby version.

###BREAKING CHANGES! Upgrading from 0.1.0 to 0.2.0

The code and api has been simplified - now Don is only a single function:

# Old
Don.render(data, template)
Don.renderIn(data, template)

# New
Don(template, data)
Don.call(data, template)

###Npm

npm install don

###Node usage

Don = require('don')

articleTemplate = (data, key) ->
    ['article', {id: data.id + key}
        ['h3', data.title]
        ['div', data.body]]
            
Don(
   articleTemplate
   {id: 123, title: 'My Article', body: 'Article text'},
)
            
# => '<article id="123"><h3>My Article</h3><div>Article text</div></article>'

Also check out don-express for easy integration into your Express app

###Partials

You can use the power of closures to implement partials (a layout is a function that takes a template and returns a template):

partial = (d) ->
    ['article', {id: d.id}
        ['h3', d.title]
        ['div'
            d.body
            ['a', {href: d.link}, d.anchor]]]     
 
layout = (partial) -> (d) ->
      [['!doctype html']
       ['html'
           ['head'
               ['meta', charset: 'utf-8']
               ['title', d.title]]
           ['body'
               ['section'
                   ['h1', d.title]
                   ['div', {class: 'articles'}, (partial a for a in d.articles)]]]]]    

###Haml-style abbreviations

You can place short ids and css classes in the tag position, and omit the tag if it is a div:

user = (d) ->
     ['#profile'
            ['img', {src: '/thumb/' + d.id, alt: d.name}]
            ['.btn .settings', 'Settings']]

# => <div id="profile"><img src="/thumb/123" alt="John"><div class="btn settings">Settings</div></div>

###Acceptable forms

The arrays must adhere to Don's definition of an 'htmlArray'

An htmlArray is an array with either:

[elementType]
[elementType, contents...]
[elementType, attributes]
[elementType, attributes, contents...]
[]
[htmlArray...]

where:

  • elementType is a string, e.g: 'div'
  • contents is an arbitrary number of:
  • string, or
  • htmlArray
  • attributes is a js object, e.g: {id: 'mydiv'}

examples:

htmlArray1 = ['br']
htmlArray2 = ['h1', 'page title']
htmlArray3 = ['h1' 
                'page title'
                ['span', 'subtitle']]
                
htmlArray4 = ['meta', {name: 'description', content: 'some webpage'}]
htmlArray5 = ['article', {id: 123}, 'the article content']
htmlArray6 = ['article', {id: 123} 
                'the article content'
                ['a', {href: '#'}, 'some link']]
                
htmlArray7 = []
htmlArray8 = [['br'], ['br']]

##Authors

don.js was created by Tim Farland, a web product designer based in Berlin.

##Disclaimer

This is experimental code! I can't guarantee that it won't change or break something in your app. Don't sue me.

Readme

Keywords

none

Package Sidebar

Install

npm i don

Weekly Downloads

2

Version

0.2.0

License

none

Last publish

Collaborators

  • twfarland