private static int TagCost(HTMLBalancerCostFilter costFilter, ArrayList openTags, Tag tag) { try { checked { int baseTagCost = costFilter.ElementCost(tag); if (tag is BeginTag) { return baseTagCost + ((TagRequiresClose(tag.Name)) ? costFilter.ElementCost(MakeEndTag(tag.Name)) : 0); } else if (tag is EndTag) { if (LastIndexOf(openTags, tag) != -1) return baseTagCost - costFilter.ElementCost(MakeEndTag(tag.Name)); else return baseTagCost; } else { Trace.Fail("Unknown tag type"); return baseTagCost; } } } catch (OverflowException) { return int.MaxValue; } }
private static void RegisterTag(ArrayList openTags, Tag tag) { if (tag is BeginTag && TagRequiresClose(tag.Name)) { openTags.Add(tag.Name); } else if (tag is EndTag) { int idx = LastIndexOf(openTags, tag); if (idx != -1) openTags.RemoveAt(idx); } }
private static int LastIndexOf(ArrayList openTags, Tag tag) { for (int i = openTags.Count - 1; i >= 0; i--) { if (tag.NameEquals((string)openTags[i])) { return i; } } return -1; }
private void EmitTagAndAttributes(string tagName, Tag tag) { BeginTag beginTag = tag as BeginTag; if (beginTag != null) { Emit(string.Format(CultureInfo.InvariantCulture, "<{0}", tagName)); foreach (Attr attr in beginTag.Attributes) if (PreserveAttributes.Contains(attr.Name.ToUpper(CultureInfo.InvariantCulture))) Emit(" " + attr.ToString()); if (beginTag.Complete) Emit("/"); Emit(">"); } else { if (tagName.ToUpper(CultureInfo.InvariantCulture) != HTMLTokens.Br && tagName.ToUpper(CultureInfo.InvariantCulture) != HTMLTokens.Img) Emit(string.Format(CultureInfo.InvariantCulture, "</{0}>", tagName)); } }