public static LoveBlock MapBinding(LoveMarkupExpression htmlHelperExpression, string normalHtml, string simpleHtml, string simpleExpression) { var indices = normalHtml.Find(simpleHtml).ToList(); if (indices.Count == 0) { // Apparently Static var b = new LoveBlock(0, 0); b.Children.Add(new LoveMarkup(0, 0, normalHtml)); return(b); } else { // Create a block with bindings var b = new LoveBlock(0, 0); // Add before binding b.Children.Add(new LoveMarkup(0, 0, normalHtml.Substring(0, indices[0]))); for (int i = 0; i < indices.Count; i++) { var index = indices[i]; var nextIndex = i < indices.Count - 1 ? indices[i + 1] : (int?)null; // Add binding var bindingContent = simpleExpression; b.Children.Add(new LoveBinding(0, 0, bindingContent)); // Add after binding var afterIndex = index + simpleHtml.Length; if (nextIndex.HasValue) { b.Children.Add(new LoveMarkup(0, 0, normalHtml.Substring(afterIndex, nextIndex.Value - afterIndex))); } else { b.Children.Add(new LoveMarkup(0, 0, normalHtml.Substring(afterIndex))); } } return(b); } }
public static string GetSimpleRazorExpression(LoveMarkupExpression htmlHelperExpression) { var simpleRazorValue = ""; var exp = GetHtmlHelperLambdaExpression(htmlHelperExpression); if (exp != null) { if (exp.Expression == exp.VariableName || exp.Expression.StartsWith(exp.VariableName + ".")) { return(exp.Expression.ReplaceStart(exp.VariableName, "Model")); } else { return(exp.Expression); } } // TODO: Handle non-lamda expression throw new NotImplementedException(); }
private static SimpleLamdaExpression GetHtmlHelperLambdaExpression(LoveMarkupExpression htmlHelperExpression) { var regexName = @"(?:\s*[A-Za-z0-9_]+\s*)"; var regexNamePath = @"{name}(?:\.{name})*"; var regexHtmlHelper = @"^\s*[Hh]tml\s*.{name}\(({name})=>({path})[,)]"; regexNamePath = regexNamePath.Replace("{name}", regexName); regexHtmlHelper = regexHtmlHelper.Replace("{name}", regexName); regexHtmlHelper = regexHtmlHelper.Replace("{path}", regexNamePath); var m = Regex.Match(htmlHelperExpression.Content, regexHtmlHelper); if (m.Success) { var varName = m.Groups[1].Value.Trim(); var bindingExpression = m.Groups[2].Value.Trim(); return(new SimpleLamdaExpression(varName, bindingExpression)); } return(null); }
public LoveBlock Evaluate <T>(LoveMarkupExpression expression, T model, bool isSecondTry) { if (expression.Content.Trim().StartsWith("Html.")) { var simpleExpression = HtmlHelperBindingMapper.GetSimpleRazorExpression(expression); var scopes = expression.GetScopes(); var results = LoveVirtualViewProvider.Instance.GetExpressionEvaluation(model, expression.Content, simpleExpression, scopes); var normal = results.NormalResults; var simple = results.SimpleResults; //// WARNING: This is buggy! //// Ensure model has data at relevant property //// TODO: Create own object and decorate with DataAnotations using provider: //// http://stackoverflow.com/questions/11964956/how-can-i-register-a-custom-modelmetadataprovider-with-simple-injector-in-mvc3 //// http://haacked.com/archive/2011/07/14/model-metadata-and-validation-localization-using-conventions.aspx/ //if (!isSecondTry && string.IsNullOrWhiteSpace(simple)) //{ // try // { // var nModel = CreateModelWithSpecificValue<T>(model, simpleExpression.ReplaceStart("Model", "this")); // return Evaluate(expression, nModel, true); // } // catch // { // // Hey at least we tried // var breakdance = false; // } //} // Parse the markup var mappedBlock = HtmlHelperBindingMapper.MapBinding(expression, normal, simple, simpleExpression); return(mappedBlock); } throw new InvalidOperationException(); }
private LoveBlock VisitBlock(Block block) { // Handle regular block var lBlock = new LoveBlock(block.Start.AbsoluteIndex, block.Length); foreach (var c in block.Children) { var node = VisitNode(c); if (node != null) { lBlock.Children.Add(node); } } // Merge blocks of same type var newChildren = new List <LoveNode>(); LoveNode newChild = null; foreach (var c in lBlock.Children) { if (newChild != null && newChild.GetType() == c.GetType() && c is LoveSpan) { var cSpan = c as LoveSpan; var newSpan = newChild as LoveSpan; if (cSpan is LoveBinding) { newChild = new LoveBinding(newSpan.Start, newSpan.Length + cSpan.Length, newSpan.Content + cSpan.Content); } else if (cSpan is LoveMarkup) { newChild = new LoveMarkup(newSpan.Start, newSpan.Length + cSpan.Length, newSpan.Content + cSpan.Content); } else if (cSpan is LoveMarkupExpression) { newChild = new LoveMarkupExpression(newSpan.Start, newSpan.Length + cSpan.Length, newSpan.Content + cSpan.Content); } } else { if (newChild != null) { newChildren.Add(newChild); newChild = null; } newChild = c; } } if (newChild != null) { newChildren.Add(newChild); newChild = null; } lBlock.Children.Clear(); lBlock.Children.AddRange(newChildren); if (lBlock.Children.Count == 0) { return(null); } // Simplify children for (int i = 0; i < lBlock.Children.Count; i++) { var child = lBlock.Children[i]; // Convert bindings to specific bindings if possible if (child is LoveBinding) { lBlock.Children[i] = ConvertBinding(child as LoveBinding); } } ConvertChildrenToControlBlocks(lBlock); //// Convert to control blocks if Possible //var cBlock = ConvertToControlBlock(lBlock); //if (cBlock != null) { return cBlock; } return(lBlock); }
public LoveBlock Evaluate <T>(LoveMarkupExpression expression, T model) { return(Evaluate(expression, model, false)); }