public Element ConvertToElement(ExporterConfig config, Dictionary <int, Entity> entityMap, Element wrapper, int prevDepth) { if (InlineStyleRanges.Count == 0 && EntityRanges.Count == 0) { return(config.BlockMap.GenerateBlockElement(Type, Depth, prevDepth, Text, wrapper)); } var element = config.BlockMap.GenerateBlockElement(Type, Depth, prevDepth, null, wrapper); var indexesSet = new SortedSet <int> { 0, Text.Length }; var ranges = InlineStyleRanges.Cast <IHasOffsetLength>().Concat(EntityRanges); foreach (var range in ranges) { indexesSet.Add(range.Offset); indexesSet.Add(range.Offset + range.Length); } var indexes = indexesSet.ToList(); Element openedEntity = null; int? openedEntityStopIndex = null; for (var i = 0; i < indexes.Count - 1; i++) { var index = indexes[i]; var nextIndex = indexes[i + 1]; var text = Text.Substring(index, nextIndex - index); Element child = null; foreach (var styleRange in InlineStyleRanges) { if (index >= styleRange.Offset && nextIndex <= styleRange.Offset + styleRange.Length) { if (child == null) { child = new Element(config.StyleMap[styleRange.Style], null, text, true); } else { child.Text = null; child.AppendChild(new Element(config.StyleMap[styleRange.Style], null, text, true)); } } } if (child == null) { child = new Element(null, null, text, true); } if (openedEntity == null) { foreach (var entityRange in EntityRanges) { if (index == entityRange.Offset) { var entity = entityMap[entityRange.Key]; openedEntity = config.EntityDecorators[entity.Type](entity.Data); openedEntityStopIndex = entityRange.Offset + entityRange.Length; } } if (openedEntity == null) { element.AppendChild(child); } } if (openedEntity != null && openedEntityStopIndex != null) { if (nextIndex < openedEntityStopIndex) { openedEntity.AppendChild(child); } if (nextIndex == openedEntityStopIndex) { openedEntity.AppendChild(child); element.AppendChild(openedEntity); openedEntity = null; } } } return(element); }
public Exporter(ExporterConfig config) { _config = config; }