public ISegment GetUpdatedSegment(ISegment targetSegment, IEnumerable <Token> tokens, ISegment sourceSegment) { var vector = new List <int>(); var lockedContentId = 0; //store original segment var originalSegment = (ISegment)targetSegment.Clone(); //remove old content targetSegment.Clear(); foreach (var item in tokens) { switch (item.Type) { case Token.TokenType.TagOpen: var tagPairOpen = (IAbstractMarkupDataContainer)GetElement( GetTagID(item.Content), originalSegment, sourceSegment, item.Type); tagPairOpen.Clear(); InsertItemOnLocation(vector, ref targetSegment, (IAbstractMarkupData)tagPairOpen); vector.Add(((ITagPair)tagPairOpen).IndexInParent); break; case Token.TokenType.TagClose: vector.RemoveAt(vector.Count - 1); break; case Token.TokenType.TagPlaceholder: InsertItemOnLocation(vector, ref targetSegment, GetElement(GetTagID(item.Content), originalSegment, sourceSegment, item.Type)); break; case Token.TokenType.Text: InsertItemOnLocation(vector, ref targetSegment, ItemFactory.CreateText( PropertiesFactory.CreateTextProperties(item.Content))); break; case Token.TokenType.LockedContent: InsertItemOnLocation(vector, ref targetSegment, GetElement(lockedContentId.ToString(), originalSegment, sourceSegment, item.Type)); lockedContentId++; break; case Token.TokenType.CommentStart: var commentContainer = GetComment(item); InsertItemOnLocation(vector, ref targetSegment, (IAbstractMarkupData)commentContainer); vector.Add(((ICommentMarker)commentContainer).IndexInParent); break; case Token.TokenType.CommentEnd: if (vector.Count > 0) { vector.RemoveAt(vector.Count - 1); } break; case Token.TokenType.RevisionMarker: //hasTrackedChanges = true; if (item.RevisionType == Token.RevisionMarkerType.InsertStart) { var insertContainer = GetRevisionMarker(item, RevisionType.Insert); InsertItemOnLocation(vector, ref targetSegment, (IAbstractMarkupData)insertContainer); vector.Add(((IRevisionMarker)insertContainer).IndexInParent); } else if (item.RevisionType == Token.RevisionMarkerType.DeleteStart) { var insertContainer = GetRevisionMarker(item, RevisionType.Delete); InsertItemOnLocation(vector, ref targetSegment, (IAbstractMarkupData)insertContainer); vector.Add(((IRevisionMarker)insertContainer).IndexInParent); } else { if (vector.Count > 0) { vector.RemoveAt(vector.Count - 1); } } break; } } return(targetSegment); }