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);
        }