1 module handlebars.components.base; 2 3 public import handlebars.tokens; 4 public import handlebars.lifecycle; 5 public import handlebars.properties; 6 7 /// 8 class RenderComponentException : Exception { 9 pure nothrow @nogc @safe this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable nextInChain = null) { 10 super(msg, file, line, nextInChain); 11 } 12 } 13 14 alias OnYield = string delegate(Token[]); 15 alias OnEvaluateBoolean = bool delegate(string); 16 alias OnEvaluateLong = long delegate(string); 17 18 /// 19 interface IHbsComponent { 20 void content(Token[]); 21 void lifecycle(Lifecycle); 22 23 Token[] content(); 24 Lifecycle lifecycle(); 25 26 string yield(); 27 } 28 29 /// 30 abstract class HbsComponent(string tpl = "{{yield}}") : IHbsComponent { 31 /// 32 private { 33 Token[] _content; 34 Lifecycle _lifecycle; 35 } 36 37 void content(Token[] value) { 38 this._content = value; 39 } 40 41 void lifecycle(Lifecycle value) { 42 this._lifecycle = value; 43 } 44 45 Token[] content() { 46 return this._content; 47 } 48 49 Lifecycle lifecycle() { 50 return this._lifecycle; 51 } 52 53 /// 54 string yield() { 55 if(this.content.length == 0) { 56 return ""; 57 } 58 59 return this.lifecycle.yield(this.content); 60 } 61 62 string render(Component, Components...)() { 63 import handlebars.tpl; 64 return handlebars.tpl.render!(tpl, Component, Components)(cast(Component) this); 65 } 66 }