示例#1
0
    public string Get(string name)
    {
        var index = Elements.FindIndex(c => c.Name == name);

        if (index < 0)
        {
            return("");
        }
        var part = Elements[index];
        var html = part.Htm;

        for (var x = index + 1; x < Elements.Count; x++)
        {
            part = Elements[x];
            if (part.Name == "/" + name)
            {
                break;
            }

            //add inner scaffold elements
            if (part.Name.IndexOf('/') < 0)
            {
                if (data.ContainsKey(part.Name))
                {
                    if (data[part.Name, true] == true)
                    {
                        html += Get(part.Name);
                    }
                }
            }
            else
            {
                html += part.Htm;
            }
        }

        return(html);
    }
示例#2
0
    public string Render(ScaffoldData nData, bool hideElements = true)
    {
        //deserialize list of elements since we will be manipulating the list,
        //so we don't want to permanently mutate the public elements array
        var elems = DeepCopy(Elements);

        if (elems.Count > 0)
        {
            //render scaffold with paired nData data
            var scaff = new StringBuilder();

            var closing = new List <ClosingElement>();
            //remove any unwanted blocks of HTML from scaffold
            for (var x = 0; x < elems.Count; x++)
            {
                if (x < elems.Count - 1)
                {
                    for (var y = x + 1; y < elems.Count; y++)
                    {
                        //check for closing tag
                        if (elems[y].Name == "/" + elems[x].Name)
                        {
                            //add enclosed group of HTML to list for removing
                            var closed = new ClosingElement()
                            {
                                Name  = elems[x].Name,
                                Start = x,
                                End   = y
                            };

                            if (nData.ContainsKey(elems[x].Name) == true)
                            {
                                //check if user wants to include HTML
                                //that is between start & closing tag
                                if (nData[elems[x].Name, true] == true)
                                {
                                    closed.Show.Add(true);
                                }
                                else
                                {
                                    closed.Show.Add(false);
                                }
                            }
                            else
                            {
                                closed.Show.Add(false);
                            }

                            closing.Add(closed);
                            break;
                        }
                    }
                }
            }

            if (hideElements == true)
            {
                //remove all groups of HTML in list that should not be displayed
                List <int> removeIndexes = new List <int>();
                bool       isInList      = false;
                for (int x = 0; x < closing.Count; x++)
                {
                    if (closing[x].Show.FirstOrDefault() != true)
                    {
                        //add range of indexes from closing to the removeIndexes list
                        for (int y = closing[x].Start; y < closing[x].End; y++)
                        {
                            isInList = false;
                            for (int z = 0; z < removeIndexes.Count; z++)
                            {
                                if (removeIndexes[z] == y)
                                {
                                    isInList = true; break;
                                }
                            }
                            if (isInList == false)
                            {
                                removeIndexes.Add(y);
                            }
                        }
                    }
                }

                //physically remove HTML list items from scaffold
                int offset = 0;
                for (int z = 0; z < removeIndexes.Count; z++)
                {
                    elems.RemoveAt(removeIndexes[z] - offset);
                    offset += 1;
                }
            }

            //finally, replace scaffold variables with custom data
            for (var x = 0; x < elems.Count; x++)
            {
                //check if scaffold item is an enclosing tag or just a variable
                var useScaffold = true;
                if (elems[x].Name.IndexOf('/') < 0)
                {
                    for (int y = 0; y < closing.Count; y++)
                    {
                        if (elems[x].Name == closing[y].Name)
                        {
                            useScaffold = false; break;
                        }
                    }
                }
                else
                {
                    useScaffold = false;
                }

                if ((nData.ContainsKey(elems[x].Name) == true ||
                     elems[x].Name.IndexOf('/') == 0) & useScaffold == true)
                {
                    //inject string into scaffold variable
                    var s = nData[elems[x].Name.Replace("/", "")];
                    if (string.IsNullOrEmpty(s) == true)
                    {
                        s = "";
                    }
                    scaff.Append(s + elems[x].Htm);
                }
                else
                {
                    //passively add htm, ignoring scaffold variable
                    scaff.Append((hideElements == true ? "" : (elems[x].Name != "" ? "{{" + elems[x].Name + "}}" : "")) + elems[x].Htm);
                }
            }

            //render scaffolding as HTML string
            return(scaff.ToString());
        }
        return("");
    }