public IBindingsBuilder <M> Attr <F>(
     string attrName,
     Expression <Func <M, F> > expression,
     string format = null,
     params LambdaExpression[] otherExpressions)
 {
     if (expression == null)
     {
         throw (new ArgumentNullException("expression"));
     }
     if (string.IsNullOrWhiteSpace(attrName))
     {
         throw (new ArgumentNullException("attrName"));
     }
     if (writer == null)
     {
         return(this);
     }
     if (attrStringBuilder == null)
     {
         attrStringBuilder = new StringBuilder();
     }
     attrStringBuilder.Append(BindingsExtensions.standardString <M, F>(this, attrName, expression, format, otherExpressions));
     return(this);
 }
 public IBindingsBuilder <M> Event <F>(
     string eventName,
     Expression <Func <M, F> > expression,
     bool bubble   = true,
     string format = null,
     params LambdaExpression[] otherExpressions)
 {
     if (expression == null)
     {
         throw (new ArgumentNullException("expression"));
     }
     if (string.IsNullOrWhiteSpace(eventName))
     {
         throw (new ArgumentNullException("eventName"));
     }
     if (writer == null)
     {
         return(this);
     }
     if (eventStringBuilder == null)
     {
         eventStringBuilder = new StringBuilder();
     }
     eventStringBuilder.Append(BindingsExtensions.standardString <M, F>(this, eventName, expression, format, otherExpressions));
     if (!bubble)
     {
         this.Add(eventName + "Bubble: false");
     }
     return(this);
 }
        private string TagMatchEvaluator(Match match)
        {
            string result   = match.ToString();
            var    tagInfos = match.Groups["tagName"];
            string otag     = tagInfos.Value;
            string tag      = otag.ToLower();

            if (tag.StartsWith("!"))
            {
                return(result);
            }
            if (tag == "script")
            {
                Group bodyMatch = match.Groups["scriptbody"];
                if (bodyMatch.Success)
                {
                    scriptCount++;
                    return(string.Format("<{0} {1}>", namePrefix == null ? ClientTemplateHelper.scriptSymbol : "script", bodyMatch.Value));
                }
                else
                {
                    scriptCount--;
                    return(string.Format("</{0}>", namePrefix == null ? ClientTemplateHelper.scriptSymbol : "script"));
                }
            }
            if (scriptCount != 0)
            {
                return(result);
            }
            string toAdd = null;

            Group  nameGroup = match.Groups["name"];
            string name      = null;

            if (nameGroup.Success)
            {
                name = nameGroup.Captures[0].Value;
                int index = name.IndexOf(".");
                if (index >= 0)
                {
                    name = name.Substring(index + 1);
                }
                else
                {
                    return(result);
                }
            }
            else
            {
                return(result);
            }
            string oldName = null;

            if (name.Length >= 7 && name.Substring(name.Length - 7) == "_hidden")
            {
                oldName = name;
                name    = name.Substring(0, name.Length - 7);
            }
            dynamic currBindings = bindings;
            Group   indexGroup   = match.Groups["index"];

            if (indexGroup.Success)
            {
                string key = "_TemplateLevel_" + indexGroup.Value;
                if (HttpContext.Current.Items.Contains(key))
                {
                    currBindings = HttpContext.Current.Items[key];
                }
            }
            dynamic expression = currBindings.BuildExpression(name);

            if (expression == null)
            {
                if (oldName != null)
                {
                    expression = currBindings.BuildExpression(oldName);
                }
                if (expression == null)
                {
                    return(result);
                }
            }
            bool tryMultiselect = false;
            bool tryCheckBox    = false;

            if (tag == "select")
            {
                tryMultiselect = true;
            }
            else if (tag == "input")
            {
                tryCheckBox = true;
            }
            MatchCollection attributes    = suitableAttribute.Matches(result);
            bool            look          = true;
            bool            elementispart = false;
            bool            element_type  = false;
            string          dataBind      = null;
            Match           dataBindMatch = null;

            foreach (Match m in attributes)
            {
                Group g = m.Groups["attributeName"];
                Group v = m.Groups["attributeValue"];
                if (g.Success && g.Value == "data-bind")
                {
                    dataBind      = v.Value;
                    dataBindMatch = m;
                }
                if (g.Success && g.Value == "data-nobinding")
                {
                    return(result);
                }
                if (g.Success && (g.Value == "data-elementispart"))
                {
                    elementispart = true;
                }
                if (g.Success && (g.Value == "data-element-type"))
                {
                    element_type = true;
                }
                if (look && tryMultiselect)
                {
                    if (g.Success && g.Value.ToLower() == "multiple" && v.Success && v.Value.ToLower() == "multiple")
                    {
                        toAdd = BindingsExtensions.SelectedOptions(currBindings, expression).Get().ToString();
                        look  = false;
                    }
                }
                else if (look && tryCheckBox)
                {
                    if (g.Success && g.Value.ToLower() == "type" && v.Success && (v.Value.ToLower() == "checkbox" || v.Value.ToLower() == "radio"))
                    {
                        toAdd = BindingsExtensions.Checked(currBindings, expression).Get().ToString();
                        look  = false;
                    }
                }
            }
            if (tag != "input" && tag != "select" && tag != "textarea" && !element_type)
            {
                return(result);
            }
            if (toAdd == null && (element_type || !elementispart))
            {
                toAdd = BindingsExtensions.Value(currBindings, expression).Get().ToString();
            }

            int    start  = result.IndexOf(otag) + otag.Length;
            string ending = result.Substring(start);

            if (!string.IsNullOrWhiteSpace(dataBind))
            {
                string header = ending.Substring(0, dataBindMatch.Index - start);
                string footer = ending.Substring(dataBindMatch.Index + dataBindMatch.Length - start);

                result = string.Format("<{0} data-nobinding='true' data-bind=\"{1}, {2}\" {3} {4}", otag, dataBind, toAdd, header, footer);
            }
            else
            {
                result = string.Format("<{0} data-nobinding='true' data-bind=\"{1}\" {2}", otag, toAdd, ending);
            }
            return(result);
        }