Exemple #1
0
        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>");
            }
        }