public void VisitPlaceholderTag(IPlaceholderTag tag)
        {
            PlaceholderTags.Add((IPlaceholderTag)tag.Clone());


            if (tag.Properties.HasTextEquivalent && !IncludeTagText)
            {
                var objTag = new Tag
                {
                    AlignmentAnchor = "",
                    Anchor          = TagCounter.ToString(),
                    TagId           = tag.TagProperties.TagId.Id,
                    TextEquivalent  = tag.Properties.TextEquivalent,
                    SectionType     = Tag.Type.Standalone
                };


                TagUnits.Add(objTag);

                objTag.Revision = IsRevisionMarker ? RevisionMarker : null;
                SegmentSections.Add(objTag);

                PlainText.Append(tag.Properties.TextEquivalent);
            }
            else if (IncludeTagText)
            {
                var objTag = new Tag
                {
                    AlignmentAnchor = "",
                    Anchor          = TagCounter.ToString(),
                    TagId           = tag.TagProperties.TagId.Id,
                    TextEquivalent  = tag.Properties.TagContent,
                    SectionType     = Tag.Type.Standalone
                };

                TagUnits.Add(objTag);

                objTag.Revision = IsRevisionMarker ? RevisionMarker : null;
                SegmentSections.Add(objTag);

                PlainText.Append(tag.TagProperties.TagContent);


                var placeHolderTag = new Sdl.LanguagePlatform.Core.Tag
                {
                    Type           = TagType.TextPlaceholder,
                    TagID          = tag.TagProperties.TagId.Id,
                    TextEquivalent = tag.Properties.TextEquivalent,
                    Anchor         = TagCounter
                };
                Segment.Add(placeHolderTag);
            }
            TagCounter++;
        }
        public void VisitTagPair(ITagPair tagPair)
        {
            TagPairs.Add((ITagPair)tagPair.Clone());


            if (IncludeTagText)
            {
                var objTag = new Tag
                {
                    AlignmentAnchor = "",
                    Anchor          = TagCounter.ToString(),
                    TagId           = tagPair.TagProperties.TagId.Id,
                    TextEquivalent  = tagPair.StartTagProperties.TagContent,
                    SectionType     = Tag.Type.Start
                };

                TagUnits.Add(objTag);


                objTag.Revision = IsRevisionMarker ? RevisionMarker : null;
                SegmentSections.Add(objTag);

                PlainText.Append(tagPair.StartTagProperties.TagContent);



                var tgStart = new Sdl.LanguagePlatform.Core.Tag
                {
                    Type           = TagType.Start,
                    Anchor         = TagCounter,
                    TagID          = tagPair.StartTagProperties.TagId.Id,
                    TextEquivalent = tagPair.StartTagProperties.DisplayText
                };
                Segment.Add(tgStart);
            }

            VisitChildren(tagPair);

            if (IncludeTagText)
            {
                var objTag = new Tag
                {
                    AlignmentAnchor = "",
                    Anchor          = TagCounter.ToString(),
                    TagId           = tagPair.TagProperties.TagId.Id,
                    TextEquivalent  = tagPair.EndTagProperties.TagContent,
                    SectionType     = Tag.Type.End
                };

                TagUnits.Add(objTag);

                objTag.Revision = IsRevisionMarker ? RevisionMarker : null;
                SegmentSections.Add(objTag);

                PlainText.Append(tagPair.EndTagProperties.TagContent);


                var tgEnd = new Sdl.LanguagePlatform.Core.Tag
                {
                    Type           = TagType.End,
                    TagID          = tagPair.StartTagProperties.TagId.Id,
                    Anchor         = TagCounter,
                    TextEquivalent = tagPair.EndTagProperties.DisplayText
                };
                Segment.Add(tgEnd);
            }
            TagCounter++;
        }
        static Sdl.LanguagePlatform.Core.Segment TranslatedHtml2Segment(Sdl.LanguagePlatform.Core.Segment sourceSegment, string translatedText)
        {
            var htmlTagName       = "span"; // the only we feed for translation is span, so we expect the translation only has span tags too.
            var xmlFragment       = "<segment>" + translatedText + "</segment>";
            var xmlReader         = new System.Xml.XmlTextReader(xmlFragment, System.Xml.XmlNodeType.Element, null);
            var tagStack          = new Stack <Sdl.LanguagePlatform.Core.Tag>();
            var translatedSegment = new Sdl.LanguagePlatform.Core.Segment();

            try
            {
                while (xmlReader.Read())
                {
                    switch (xmlReader.NodeType)
                    {
                    case System.Xml.XmlNodeType.Element:
                        if (xmlReader.Name == htmlTagName)
                        {
                            var tagClass = xmlReader.GetAttribute("class");
                            var tagType  = (Sdl.LanguagePlatform.Core.TagType)
                                           Enum.Parse(typeof(Sdl.LanguagePlatform.Core.TagType), tagClass);
                            int id = Convert.ToInt32(xmlReader.GetAttribute("id"));
                            Sdl.LanguagePlatform.Core.Tag sourceTag = sourceSegment.FindTag(tagType, id);
                            if (tagType != Sdl.LanguagePlatform.Core.TagType.Standalone && !xmlReader.IsEmptyElement)
                            {
                                tagStack.Push(sourceTag);
                            }
                            translatedSegment.Add(sourceTag.Duplicate());
                            if (tagType != Sdl.LanguagePlatform.Core.TagType.Standalone && xmlReader.IsEmptyElement)
                            // the API translated <span></span> to <span/> (it does that if the tag is empty).
                            // must fetch the end tag as there is no EndElement to triger the next case block.
                            {
                                var endTag = sourceSegment.FindTag(Sdl.LanguagePlatform.Core.TagType.End, id);
                                translatedSegment.Add(endTag.Duplicate());
                            }
                        }
                        break;

                    case System.Xml.XmlNodeType.EndElement:
                    {
                        if (xmlReader.Name == htmlTagName)
                        {
                            var startTag = tagStack.Pop();
                            if (startTag.Type != Sdl.LanguagePlatform.Core.TagType.Standalone)
                            {
                                var endTag = sourceSegment.FindTag(
                                    Sdl.LanguagePlatform.Core.TagType.End, startTag.Anchor);
                                if (endTag != null)
                                {
                                    translatedSegment.Add(endTag.Duplicate());
                                }
                            }
                        }
                    }
                    break;

                    case System.Xml.XmlNodeType.Text:
                        translatedSegment.Add(xmlReader.Value);
                        break;

                    case System.Xml.XmlNodeType.Whitespace:
                        translatedSegment.Add(xmlReader.Value);
                        break;

                    default:
                        break;
                    }
                }
            }
            catch (Exception)
            {
                var    paintextSegment = new Sdl.LanguagePlatform.Core.Segment();
                string plaitext        = Regex.Replace(translatedText, "<[^>]+>", "");
                paintextSegment.Add(plaitext);
                return(paintextSegment);
            }

            return(translatedSegment);
        }