public void Add(HexBufferLineFormatter bufferLines, HexClassifier classifier, NormalizedHexBufferSpanCollection spans, CancellationToken cancellationToken) {
if (bufferLines == null)
throw new ArgumentNullException(nameof(bufferLines));
if (classifier == null)
throw new ArgumentNullException(nameof(classifier));
if (spans == null)
throw new ArgumentNullException(nameof(spans));
if (spans.Count != 0 && spans[0].Buffer != bufferLines.Buffer)
throw new ArgumentException();
var classificationSpans = new List<HexClassificationSpan>();
foreach (var span in spans) {
if (spansCount > 0)
htmlWriter.WriteRaw(delimiter);
spansCount++;
var pos = span.Start;
for (;;) {
classificationSpans.Clear();
var line = bufferLines.GetLineFromPosition(pos);
var text = line.GetText(span);
var context = new HexClassificationContext(line, line.TextSpan);
classifier.GetClassificationSpans(classificationSpans, context, cancellationToken);
int textPos = 0;
foreach (var tagSpan in classificationSpans) {
if (textPos < tagSpan.Span.Start) {
WriteCss(classificationFormatMap.DefaultTextProperties);
htmlWriter.WriteSpan(cssWriter.ToString(), text, textPos, tagSpan.Span.Start - textPos);
}
WriteCss(classificationFormatMap.GetTextProperties(tagSpan.ClassificationType));
htmlWriter.WriteSpan(cssWriter.ToString(), text, tagSpan.Span.Start, tagSpan.Span.Length);
textPos = tagSpan.Span.End;
}
if (textPos < text.Length) {
WriteCss(classificationFormatMap.DefaultTextProperties);
htmlWriter.WriteSpan(cssWriter.ToString(), text, textPos, text.Length - textPos);
}
htmlWriter.WriteRaw("<br/>");
pos = line.BufferEnd;
if (pos >= span.End)
break;
}
}
}