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); }
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(""); }