private void GenerateSpan(TextWriter tw, ClassificationSpan span, string spanText, ref int referenceIndex, ref ReferenceSpan currentReference, IReadOnlyList <ReferenceSpan> referenceSpans) { while ((currentReference == null || currentReference.Start < span.Start) && referenceIndex < referenceSpans.Count) { referenceIndex++; if (referenceIndex < referenceSpans.Count) { currentReference = referenceSpans[referenceIndex]; } else { currentReference = null; } } if (currentReference != null) { GetBestReference(ref referenceIndex, ref currentReference, referenceSpans); } string cssClass = MapClassificationToCssClass(span.Classification); string referenceClass = string.Empty; if (span.LocalGroupId > 0) { referenceClass = $"r{span.LocalGroupId} r"; cssClass = string.IsNullOrEmpty(cssClass) ? referenceClass : $"{referenceClass} {cssClass}"; } HtmlElementInfo htmlElementInfo = null; if (currentReference?.SpanEquals(span) == true) { htmlElementInfo = GenerateHyperlinkForReference(currentReference.Reference); } if (htmlElementInfo == null && !span.Contains(currentReference)) { if (cssClass == null) { tw.Write(HttpUtility.HtmlEncode(spanText)); return; } } string elementName = "span"; bool classAttributeSpecified = false; if (htmlElementInfo != null) { elementName = htmlElementInfo.Name; if (htmlElementInfo.RequiresWrappingSpan) { tw.Write("<span"); AddAttribute(tw, "class", cssClass); tw.Write(">"); classAttributeSpecified = true; } } tw.Write("<" + elementName); if (htmlElementInfo != null) { foreach (var attribute in htmlElementInfo.Attributes) { if (AddAttribute(tw, attribute.Key, attribute.Value)) { if (attribute.Key == "class") { classAttributeSpecified = true; } } } } if (!classAttributeSpecified) { AddAttribute(tw, "class", cssClass); } if (span.LocalGroupId > 0 && (htmlElementInfo?.Attributes?.ContainsKey("onclick") != true)) { AddAttribute(tw, "onclick", "t(this);"); } tw.Write(">"); if (htmlElementInfo != null || !span.Contains(currentReference)) { tw.Write(HttpUtility.HtmlEncode(spanText)); } else { WriteReferenceText(tw, span, spanText, ref referenceIndex, ref currentReference, referenceSpans); } tw.Write("</" + elementName + ">"); if (htmlElementInfo?.RequiresWrappingSpan == true) { tw.Write("</span>"); } }