public string XmlToHtml(string documentHtml)
        {
            var html = string.Copy(documentHtml);
            var mlp = new MlParser();
            string searchString;
            string value;
            string tag;

            #region Парсинг закладки

            searchString = "<anchor";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("id");
                value = value.ToLower();
                mlp.ShiftLastIndex(ref html);

                // Заменяет id закладки типа #a1 на Guid.
                if (!value.Length.Equals(36))
                {
                    value = ((Guid)BookmarksIds[value]).ToString();
                }

                tag = string.Concat("<A id=", value, " class=bookmark></A>");

                html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                html = html.Insert(mlp.StartIndex, tag);

                var b = new Bookmark
                {
                    Id = new Guid(value),
                    ModuleId = trainingModule.Id,
                    Text = mlp.GetValue("name_anchor")
                };
                Warehouse.Warehouse.Instance.Bookmarks.Add(b);
            }

            #endregion

            #region Парсинг компетенции

            searchString = "<glossary_definition";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                if (html[mlp.StartIndex] == '<' && html[mlp.StartIndex + 1] != '/')
                {
                    value = mlp.GetValue("concept_id");
                    value = value.Substring(6, 36);
                    value = value.ToLower();
                    mlp.ShiftLastIndex(ref html);

                    tag = string.Concat("<A id=", value, " class=concept>", mlp.GetInnerHtml(), "</A>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);
                }
            }

            #endregion

            #region Парсинг ссылки на закладку

            searchString = "type=\"reference\"";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("linkitem_id");
                value = value.ToLower();
                // Заменяет id закладки типа #a1 на Guid.
                if (!value.Length.Equals(36))
                {
                    value = ((Guid)BookmarksIds[value]).ToString();
                }

                mlp.ShiftLastIndex(ref html);

                tag = string.Concat("<A href=", value, " class=linktobookmark>", mlp.GetInnerHtml(), "</A>");

                html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                html = html.Insert(mlp.StartIndex, tag);

                var lto = new LinkToObject();
                lto.TrainingModule = trainingModule;
                lto.ObjectId = new Guid(value);
                Warehouse.Warehouse.Instance.LinksToObjects.Add(lto);
            }

            #endregion

            #region Парсинг ссылки на внутреннюю компетенцию

            searchString = "type=\"concept\"";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("linkitem_id");
                value = value.Substring(6, 36);
                value = value.ToLower();
                mlp.ShiftLastIndex(ref html);

                tag = string.Concat("<A href=", value, " class=linktointernalconcept>", mlp.GetInnerHtml(), "</A>");

                html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                html = html.Insert(mlp.StartIndex, tag);

                LinkToObject lto = new LinkToObject();
                lto.TrainingModule = trainingModule;
                lto.ObjectId = new Guid(value);
                Warehouse.Warehouse.Instance.LinksToObjects.Add(lto);
            }

            #endregion

            #region Парсинг ссылки на модуль

            searchString = "type=\"module\"";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("linkitem_id");
                value = value.Substring(8, 36);
                value = value.ToLower();
                mlp.ShiftLastIndex(ref html);

                tag = string.Concat("<A href=", value, " class=linktotrainingmodule>", mlp.GetInnerHtml(), "</A>");

                html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                html = html.Insert(mlp.StartIndex, tag);

                LinkToObject lto = new LinkToObject();
                lto.TrainingModule = trainingModule;
                lto.ObjectId = new Guid(value);
                Warehouse.Warehouse.Instance.LinksToObjects.Add(lto);
            }

            #endregion

            #region Парсинг рисунка, ссылки на рисунок, формулы

            searchString = "<image";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("view");

                if (value.Equals("0"))
                {
                    #region Рисунок

                    var src = mlp.GetValue("src");
                    var width = mlp.GetValue("width");
                    var height = mlp.GetValue("height");

                    if (width == string.Empty || height == string.Empty)
                    {
                        var src_ = Path.Combine(Warehouse.Warehouse.ProjectEditorLocation, src);
                        var imageDimension = System.Drawing.Image.FromFile(src_).PhysicalDimension;
                        width = imageDimension.Width.ToString();
                        height = imageDimension.Height.ToString();
                    }

                    tag = string.Concat("<IMG src=\"", src,
                                        "\" width=\"", width,
                                        "\" height=\"", height);

                    var attribute = mlp.GetValue("style");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" style=\"", attribute);
                    }

                    attribute = mlp.GetValue("title");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" title=\"", attribute);
                    }

                    attribute = mlp.GetValue("align");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" align=\"", attribute);
                    }

                    attribute = mlp.GetValue("border");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" border=\"", attribute);
                    }

                    attribute = mlp.GetValue("hspace");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" hspace=\"", attribute);
                    }

                    attribute = mlp.GetValue("vspace");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" vspace=\"", attribute);
                    }

                    tag += string.Concat("\" sdocument=0>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
                else if (value.Equals("1"))
                {
                    #region Ссылка на рисунок

                    var src = mlp.GetValue("src");
                    var width = mlp.GetValue("width");
                    var height = mlp.GetValue("height");

                    if (width == string.Empty || height == string.Empty)
                    {
                        var src_ = Path.Combine(Warehouse.Warehouse.ProjectEditorLocation, src);
                        var imageDimension = System.Drawing.Image.FromFile(src_).PhysicalDimension;
                        width = imageDimension.Width.ToString();
                        height = imageDimension.Height.ToString();
                    }

                    tag = string.Concat("<IMG src=\"Images\\Pic.png\"",
                                        " src_=\"", mlp.GetValue("src"),
                                        "\" alt=\"", mlp.GetValue("title"),
                                        "\" width_=\"", mlp.GetValue("width"),
                                        "\" height_=\"", mlp.GetValue("height"));

                    var attribute = mlp.GetValue("align");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" align_=\"", attribute);
                    }

                    attribute = mlp.GetValue("border");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" border_=\"", attribute);
                    }

                    attribute = mlp.GetValue("hspace");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" hspace_=\"", attribute);
                    }

                    attribute = mlp.GetValue("vspace");
                    if (!attribute.Equals(string.Empty))
                    {
                        tag += string.Concat("\" vspace_=\"", attribute);
                    }

                    tag += string.Concat("\" sdocument=1>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
                else if (value.Equals(string.Empty))
                {
                    #region Формула

                    tag = string.Concat("<IMG src=\"", mlp.GetValue("src"),"\" align=\"",
                                            mlp.GetValue("align"), "\" longDesc=\"",
                                mlp.GetValue("longDesc"), "\" />");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
            }

            #endregion

            #region Парсинг анимации, ссылки на анимацию

            searchString = "<flash";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("view");

                if (value.Equals("0"))
                {
                    #region Анимация

                    tag = string.Concat("<IMG src=\"Images\\Anim.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" sdocument=0>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
                else if (value.Equals("1"))
                {
                    #region Ссылка на анимацию

                    tag = string.Concat("<IMG src=\"Images\\Anim.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" alt=\"", mlp.GetValue("title"),
                                        "\" sdocument=1>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
            }

            #endregion

            #region Парсинг аудио, ссылки на аудио

            searchString = "<audio";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("view");

                if (value.Equals("0"))
                {
                    #region Аудио

                    tag = string.Concat("<IMG src=\"Images\\Aud.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" sdocument=0>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
                else if (value.Equals("1"))
                {
                    #region Ссылка на аудио

                    tag = string.Concat("<IMG src=\"Images\\Aud.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" alt=\"", mlp.GetValue("title"),
                                        "\" sdocument=1>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
            }

            #endregion

            #region Парсинг видело, ссылки на видео

            searchString = "<video";
            while (html.Contains(searchString))
            {
                Application.DoEvents();

                mlp.GetTagBounds(html, searchString);
                value = mlp.GetValue("view");

                if (value.Equals("0"))
                {
                    #region Видео

                    tag = string.Concat("<IMG src=\"Images\\Vid.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" sdocument=0>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
                else if (value.Equals("1"))
                {
                    #region Ссылка на видео

                    tag = string.Concat("<IMG src=\"Images\\Vid.png",
                                        "\" src_=\"", mlp.GetValue("src"),
                                        "\" alt=\"", mlp.GetValue("title"),
                                        "\" sdocument=1>");

                    html = html.Remove(mlp.StartIndex, mlp.LastIndex - mlp.StartIndex + 1);
                    html = html.Insert(mlp.StartIndex, tag);

                    #endregion
                }
            }

            #endregion

            return html;
        }
        public override void Execute(object @object)
        {
            if (!Enabled)
            {
                return;
            }

            if (EditorObserver.ActiveEditor == null)
            {
                return;
            }

            if (!EditorObserver.ActiveEditor.IsSelection)
            {
                return;
            }

            using (var ld = new LinkDialog())
            {
                var dtu = ld.DataTransferUnit;
                dtu.SetNodeValue("LinkText", EditorObserver.ActiveEditor.GetSelection());
                ld.InitializeData();

                if (ld.ShowDialog(EditorObserver.DialogOwner) == DialogResult.OK)
                {
                    var lt = ld.DataTransferUnit.GetNodeValue("LinkTarget");

                    if (!lt.Equals("Hyperlink"))
                    {
                        #region Ссылка на объект

                        var loi = ld.DataTransferUnit.GetNodeValue("LinkObjectId");
                        var d = new Dictionary<string, string>
                                {
                                    {"href", loi}
                                };

                        if (lt.Equals("Bookmark"))
                        {
                            d.Add("class", "linktobookmark");
                        }

                        if (lt.Equals("InternalConcept"))
                        {
                            d.Add("class", "linktointernalconcept");
                        }

                        if (lt.Equals("ExternalConcept"))
                        {
                            d.Add("class", "linktoexternalconcept");
                        }

                        if (lt.Equals("TrainingModule"))
                        {
                            d.Add("class", "linktotrainingmodule");
                        }

                        var ltxt = ld.DataTransferUnit.GetNodeValue("LinkText");

                        try
                        {
                            HtmlEditingToolHelper.SurroundWithHtml(EditorObserver.ActiveEditor, TagNames.AnchorTagName, d, ltxt);
                        }
                        catch (Exception exception)
                        {
                            ExceptionManager.Instance.LogException(exception);
                            UIHelper.ShowMessage(operationCantBePerformedMessage, MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                            return;
                        }

                        var lto = new LinkToObject
                                      {
                                          TrainingModule =
                                              (Controls.HtmlEditing.HtmlEditingToolHelper.GetParentDocument(
                                                   EditorObserver.ActiveEditor) as TrainingModuleDocument).
                                              TrainingModule,
                                          ObjectId = new Guid(loi)
                                      };
                        Warehouse.Warehouse.Instance.LinksToObjects.Add(lto);

                        #endregion
                    }
                    else
                    {
                        #region Ссылка на файл, веб-страницу

                        var url = ld.DataTransferUnit.GetNodeValue("Url");

                        var d = new Dictionary<string, string>
                                {
                                    {"href", url}
                                };

                        var ltxt = ld.DataTransferUnit.GetNodeValue("LinkText");

                        try
                        {
                            HtmlEditingToolHelper.SurroundWithHtml(EditorObserver.ActiveEditor, TagNames.AnchorTagName, d, ltxt);
                        }
                        catch (Exception exception)
                        {
                            ExceptionManager.Instance.LogException(exception);
                            UIHelper.ShowMessage(operationCantBePerformedMessage, MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                            return;
                        }

                        #endregion
                    }
                }
            }
        }