template.sjs 710 Bytes
macro def__template {
  case { _ $name:lit $html:lit } => {
    var stx = #{$name},
        tagName = stx[0].token.value,
        protoName = makeIdent(tagName.camelize() + 'Prototype', #{$name});
    
    letstx $protoName = [protoName];

    return #{
      Object.defineProperty($protoName, 'template', {
        get: function() {
          var fragment = document.createDocumentFragment();
          var div = fragment.appendChild(document.createElement('div'));
          div.innerHTML = $html;
          while (child = div.firstChild) {
            fragment.insertBefore(child, div);
          }
          fragment.removeChild(div);
          return { content: fragment }
        }
      });
    }
  }
}