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);
        }
示例#4
0
        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();
        }
示例#5
0
        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);
        }
示例#6
0
 public LoveBlock Evaluate <T>(LoveMarkupExpression expression, T model)
 {
     return(Evaluate(expression, model, false));
 }