1 module handlebars.components.scope_; 2 3 import handlebars.components.base; 4 5 import std.string; 6 7 /// Component that will handle the if blocks 8 class ScopeComponentCt(Token[] tokens, Properties properties) : HbsComponent!"" { 9 10 /// 11 this(string propertyName, string localName, string index, string indexName) { 12 } 13 14 string render(T, Components...)(T controller) { 15 return ""; 16 } 17 } 18 19 /// Component that will handle the if blocks 20 class ScopeComponent : HbsComponent!"" { 21 22 /// 23 enum ComponentName = "scope"; 24 25 private { 26 string propertyName; 27 string localName; 28 string index; 29 string indexName; 30 } 31 32 /// 33 this(string propertyName, string localName, string index, string indexName) { 34 this.propertyName = propertyName; 35 this.localName = localName; 36 this.index = index; 37 this.indexName = indexName; 38 } 39 40 /// 41 string render(Component, Components...)() { 42 Token[] localContent; 43 44 foreach(item; this.content) { 45 Token token = copy(item); 46 47 if(token.value == localName) { 48 token.value = propertyName ~ "[" ~ index ~ "]"; 49 } 50 51 if(token.value.indexOf(localName ~ ".") == 0) { 52 auto pieces = token.value.split("."); 53 token.value = propertyName ~ "[" ~ index ~ "]." ~ pieces[1..$].join("."); 54 } 55 56 if(token.value == indexName) { 57 token.value = index; 58 token.type = Token.Type.plain; 59 } 60 61 foreach(ref property; token.properties.list) { 62 if(property.isEvaluated) { 63 continue; 64 } 65 66 if(property.value == localName) { 67 property.value = propertyName ~ "[" ~ index ~ "]"; 68 } 69 70 if(property.value == indexName) { 71 property.value = index; 72 property.isEvaluated = true; 73 } 74 } 75 76 foreach(ref property; token.properties.hash) { 77 if(property.isEvaluated) { 78 continue; 79 } 80 81 if(property.value == localName) { 82 property.value = propertyName ~ "[" ~ index ~ "]"; 83 } 84 85 if(property.value == indexName) { 86 property.value = index; 87 property.isEvaluated = true; 88 } 89 } 90 91 localContent ~= token; 92 } 93 94 return lifecycle.yield(localContent); 95 } 96 } 97 98 /// 99 Token copy(Token item) { 100 Token token; 101 102 token.value = item.value; 103 token.type = item.type; 104 105 token.properties.localName = item.properties.localName; 106 token.properties.indexName = item.properties.indexName; 107 token.properties.name = item.properties.name; 108 109 foreach(property; item.properties.list) { 110 token.properties.list ~= Properties.Property(property.value, property.isEvaluated); 111 } 112 113 foreach(key, property; item.properties.hash) { 114 token.properties.hash[key] = Properties.Property(property.value, property.isEvaluated); 115 } 116 117 return token; 118 }