Example #1
0
        /// <summary>
        /// Метод-обработчик парных тэгов, вызывающий конкретный обработчик для конкретных тэгов (IWorker Worker)
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string Work()
        {
            TagPair    tagPair        = new TagPair();
            List <int> PairTagIndexes = new List <int>();
            int        indexOfTag     = _xmlText.IndexOf(_startTag, StringComparison.CurrentCulture);

            do
            {
                tagPair.clear();
                ++tagPair.StartTagCount;
                tagPair.StartTagPosition = indexOfTag;

                if (!PairTagIndexes.Contains(tagPair.StartTagPosition))
                {
                    PairTagIndexes.Add(tagPair.StartTagPosition);
                }
                else
                {
                    break;
                }

                tagPair.getPairTextAndTags(_xmlText, _startTag, _endTag);
                int Index = 0;
                _worker.DoWork(ref tagPair, ref _xmlText, ref Index);
                indexOfTag = (tagPair.EndTagPosition < _xmlText.Length)
                                        ? _xmlText.IndexOf(_startTag, Index, StringComparison.CurrentCulture)
                                        : -1;
            } while(indexOfTag != -1);

            return(_xmlText);
        }
Example #2
0
            /// <summary>
            /// Обработчик найденных парных тегов Заголовка
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }
                string NewTag = tagPair.PairTag;

                if (tagPair.PreviousTag.Equals("</p>") && tagPair.NextTag.Equals("<p>"))
                {
                    // вставка тегов </section><section>: <p>Text</p><title><p><strong>Text</strong></p></title><p> => <p>Text</p></section><section><title><p><strong>Text</strong></p></title><p>
                    NewTag = "</section><section>" + tagPair.PairTag;
                }
                else if (tagPair.PreviousTag.Equals("<section>") && tagPair.NextTag.Equals("</section>"))
                {
                    // Вставка <empty-line/> между </title> и <section> (Заголовок Книги игнорируется): <section><title><p><strong>Название</strong></p><p>главы</p></title></section>
                    try {
                        NewTag = Regex.Replace(
                            NewTag, @"(?'title_text_end_title'<title>\s*?(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?</title>)",
                            "${title_text_end_title}<empty-line/>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                            );
                    } catch (RegexMatchTimeoutException /*ex*/) {}
                    catch (Exception ex) {
                        if (Settings.Settings.ShowDebugMessage)
                        {
                            // Показывать сообщения об ошибках при падении работы алгоритмов
                            MessageBox.Show(
                                string.Format("TitleCorrector:\r\nВставка <empty-line/> между </title> и <section> (Заголовок Книги игнорируется): <section><title><p><strong>Название</strong></p><p>главы</p></title></section>>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                                );
                        }
                    }
                }
                else if (tagPair.PreviousTag.Equals("</cite>") && tagPair.NextTag.Equals("<p>"))
                {
                    // вставка тегов </section><section>: </cite><title><p>Текст</p><p><strong>Текст</strong></p></title><p>Текст</p> => </cite></section><section><title><p>Текст</p><p><strong>Текст</strong></p></title><p>Текст</p>
                    NewTag = "</section><section>" + tagPair.PairTag;
                }
                else if (tagPair.PreviousTag.Equals("<body>") && tagPair.NextTag.Equals("<section>"))
                {
                    // замена <v> ... </v> в Заголовке книги на <p> ... </p>
                    NewTag = NewTag.Replace("<v>", "<p>").Replace("</v>", "</p>");
                }
                else
                {
                    // замена <subtitle>Text</subtitle> внутри тегов <title на  <p>Text</p>
                    NewTag = NewTag.Replace("<subtitle>", "<p>").Replace("</subtitle>", "</p>");
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #3
0
            /// <summary>
            /// Обработчик найденных парных тегов Цитаты
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // Обрамление картинки тегами <p> ... </p>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?<!<text-author>)(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)(?!</text-author>)",
                        "<p>${img}</p>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("CiteCorrector:\r\nОбрамление картинки тегами <p> ... </p>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }

                if (tagPair.StartTagCount == 2)
                {
                    // Удаление <cite> вокруг <text-author> в Цитате: <cite><p>Текст</p><p>Текст</p><cite><text-author>Автор Цитаты</text-author></cite></cite> => <cite><p>Текст</p><p>Текст</p><text-author>Автор Цитаты</text-author></cite>
                    try {
                        NewTag = Regex.Replace(
                            NewTag, @"(?<=<cite>)\s*?(?'p'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<cite>\s*?(?'ta'<text-author>\s*?(<(?'tag1'emphasis|strong)\b>)?(?'author'[^<]+)(</\k'tag1'>)?\s*?</text-author>)\s*?</cite>\s*?(?=</cite>)",
                            "${p}${ta}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                            );
                    } catch (RegexMatchTimeoutException /*ex*/) {}
                    catch (Exception ex) {
                        if (Settings.Settings.ShowDebugMessage)
                        {
                            // Показывать сообщения об ошибках при падении работы алгоритмов
                            MessageBox.Show(
                                string.Format("CiteCorrector:\r\nУдаление <cite> вокруг <text-author> в Цитате: <cite><p>Текст</p><p>Текст</p><cite><text-author>Автор Цитаты</text-author></cite></cite> => <cite><p>Текст</p><p>Текст</p><text-author>Автор Цитаты</text-author></cite>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                                );
                        }
                    }
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #4
0
            /// <summary>
            /// Обработчик найденных парных тегов poem
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // Преобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>
                try {
                    Match m = Regex.Match(
                        NewTag, "(?:<poem>)\\s*?(?:(?:<p>\\s*?(?'text'(?:(?:[=~\"'\\`«»\\\\^\\$-\\+\\-\\—\\–.,~!?:;&#@№%\\*\\(\\)\\{\\}\\[\\]/…\\w\\d]\\s*?){1,}))</p>){1,}\\s*?){1,}\\s*?(?:</poem>)",
                        RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                    if (m.Success)
                    {
                        string sSource = m.Value;
                        string sResult = m.Value;
                        sResult = sResult.Replace("<p>", "<v>").Replace("</p>", "</v>");
                        sResult = sResult.Replace("<poem>", "<poem><stanza>").Replace("</poem>", "</stanza></poem>");
                        if (sResult != sSource)
                        {
                            NewTag = NewTag.Replace(sSource, sResult);
                        }
                    }
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("PoemCorrector:\r\nПреобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #5
0
            /// <summary>
            /// Обработчик найденных парных тегов poem
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // Преобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>
                try {
                    Match m = Regex.Match(
                        NewTag, "(?:<poem>)\\s*?(?:(?:<p>\\s*?(?'text'(?:(?:[=~\"'\\`«»\\\\^\\$-\\+\\-\\—\\–.,~!?:;&#@№%\\*\\(\\)\\{\\}\\[\\]/…\\w\\d]\\s*?){1,}))</p>){1,}\\s*?){1,}\\s*?(?:</poem>)",
                        RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                    if (m.Success)
                    {
                        string sSource = m.Value;
                        string sResult = m.Value;
                        sResult = sResult.Replace("<p>", "<v>").Replace("</p>", "</v>");
                        sResult = sResult.Replace("<poem>", "<poem><stanza>").Replace("</poem>", "</stanza></poem>");
                        if (sResult != sSource)
                        {
                            NewTag = NewTag.Replace(sSource, sResult);
                        }
                    }
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "PoemCorrector:\r\nПреобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>."
                        );
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #6
0
            /// <summary>
            /// Обработчик найденных парных тегов Таблиц
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // преобразование таблиц: <tr><image l:href="#image3.png" /><empty-line /></tr> и <tr><image l:href="#image3.png" /></tr> => <tr><td><image l:href="#image3.png" /></td></tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?:<tr>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)",
                        "<tr><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("TableCorrector:\r\nПреобразование таблиц: <tr><image l:href=\"#image3.png\" /><empty-line /></tr> и <tr><image l:href=\"#image3.png\" /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }


                // преобразование таблиц: <tr><td /><image l:href="#image3.png" /><empty-line /></tr> => <tr><td><image l:href="#image3.png" /></td></tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?:<tr>\\s*?<td ?/>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)",
                        "<tr><td/><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("TableCorrector:\r\nПреобразование таблиц: <tr><td /><image l:href=\"#image3.png\" /><empty-line /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }


                // преобразование таблиц: <table><image l:href="#image37.png" /><empty-line /><tr> => <table><tr><td><image l:href="#image37.png" /></td></tr><tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?'table'<table>)\\s*?(?'img'(?:<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>\\s*?){1,})\\s*?<empty-line ?/>\\s*?(?'tr'<tr>)",
                        "${table}<tr><td>${img}</td></tr>${tr}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("TableCorrector:\r\nПреобразование таблиц: <table><image l:href=\"#image37.png\" /><empty-line /><tr> => <table><tr><td><image l:href=\"#image37.png\" /></td></tr><tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }

                // преобразование таблиц: <table><tr><td /><image l:href="#image2.jpg" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href="#image2.jpg" /></td></tr><tr><td>Текст</td></tr></table>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?'table'<table>\\s*<tr>)\\s*<td ?/>\\s*(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)\\s*<empty-line ?/>\\s*(?'_tr_table'</tr>\\s*<tr>\\s*<td>.+</td>\\s*</tr>\\s*</table>)",
                        "${table}<td>${img}</td>${_tr_table}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    if (Settings.Settings.ShowDebugMessage)
                    {
                        // Показывать сообщения об ошибках при падении работы алгоритмов
                        MessageBox.Show(
                            string.Format("TableCorrector:\r\nПреобразование таблиц: <table><tr><td /><image l:href=\"#image2.jpg\" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href=\"#image2.jpg\" /></td></tr><tr><td>Текст</td></tr></table>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                            );
                    }
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #7
0
            /// <summary>
            /// Обработчик найденных парных тегов stanza
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // замена тегов <p>, </p> на <v>, </v> в стихах
                NewTag = NewTag.Replace("<p>", "<v>").Replace("</p>", "</v>");

                // преобразование тегов <v> в <title> обратно в <p>
                try {
                    Match m = Regex.Match(
                        NewTag, @"(?:<title>\s*?.+?\s*?</title>)",
                        RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                    if (m.Success)
                    {
                        string sSource = m.Value;
                        string sResult = m.Value;
                        sResult = sResult.Replace("<v>", "<p>").Replace("</v>", "</p>");
                        if (sResult != sSource)
                        {
                            NewTag = NewTag.Replace(sSource, sResult);
                        }
                    }
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "StanzaCorrector:\r\nПреобразование тегов <v> в <title> обратно в <p>:."
                        );
                }

                // обработка <empty-line /> между строфами:
                // <v>Строфа</v><v>Строфа</v><empty-line /><v>Строфа</v><v>Строфа</v> => <v>Строфа</v><v>Строфа</v></stanza><stanza><v>Строфа</v><v>Строфа</v>
                try {
                    NewTag = Regex.Replace(
                        NewTag, @"(?'v'<v>.+?</v>)\s*?<empty-line ?/>\s*?(?'v1'<v>.+?</v>)",
                        "${v}</stanza><stanza>${v1}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "StanzaCorrector:\r\nОбработка <empty-line /> между строфами: <v>Строфа</v><v>Строфа</v><empty-line /><v>Строфа</v><v>Строфа</v> => <v>Строфа</v><v>Строфа</v></stanza><stanza><v>Строфа</v><v>Строфа</v>."
                        );
                }

                // обработка строф с эпиграфом:
                // <poem><stanza><epigraph><v><v>Строфа</v></v></epigraph></stanza></poem> => <poem><stanza><v>Строфа</v></stanza></poem>
                try {
                    NewTag = Regex.Replace(
                        NewTag, @"<epigraph>\s*?<v>\s*?(?'v'<v>[^<]+?</v>)\s*?</v>\s*?</epigraph>",
                        "${v}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "StanzaCorrector:\r\nОбработка строф с эпиграфом: <poem><stanza><epigraph><v><v>Строфа</v></v></epigraph></stanza></poem> => <poem><stanza><v>Строфа</v></stanza></poem>."
                        );
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #8
0
            /// <summary>
            /// Обработчик найденных парных тегов Эпиграфа
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                if (tagPair.PreviousTag.Equals("</p>"))
                {
                    if (tagPair.NextTag.Equals("<p>"))
                    {
                        // Преобразование вложенных друг в друга тегов epigraph в Автора: <epigraph><epigraph><p>Иванов</p></epigraph></epigraph> => <cite><text-author><p>Иванов</p></text-author></cite>
                        try {
                            NewTag = Regex.Replace(
                                NewTag, @"(?:(?:<(?'tag'epigraph)\b>\s*?){2})(?:<p>\s*?)(?'text'(?:<(?'tag1'strong|emphasis)\b>)?\s*?(?:[^<]+)(?:</\k'tag1'>)?)(?:\s*?</p>)(?:\s*?</\k'tag'>){2}",
                                "<${tag}><text-author>${text}</text-author></${tag}>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                );
                        } catch (RegexMatchTimeoutException /*ex*/) {}
                        catch (Exception ex) {
                            Debug.DebugMessage(
                                tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование вложенных друг в друга тегов epigraph в Автора: <epigraph><epigraph><p>Иванов</p></epigraph></epigraph> => <cite><text-author><p>Иванов</p></text-author></cite>."
                                );
                        }
                    }
                    // замена epigraph на cite: <p>Text</p><epigraph><p><strong>Text</strong></p></epigraph> => <p>Text</p><cite><p><strong>Text</strong></p></cite>
                    NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>");
                }
                else
                {
                    if (tagPair.StartTagCount == 1)
                    {
                        if (tagPair.PreviousTag.Equals("</subtitle>") || tagPair.PreviousTag.Equals("</subtitle><empty-line/>") || tagPair.PreviousTag.Equals("</subtitle><empty-line />"))
                        {
                            // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Текст</emphasis></p><emphasis><p>Достоевский</p></emphasis></emphasis></epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag1'strong|emphasis)\b>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?)(?:<(?'tag2'emphasis|strong)\b>)\s*?(?'p'<p>)(?'author'[^<]+?)(?'_p'</p>\s*?)</\k'tag2'>\s*?</\k'tag1'>(?:\s*?</epigraph>)",
                                    "<cite>${texts}<text-author><${tag2}>${author}</${tag2}></text-author></cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Текст</emphasis></p><emphasis><p>Достоевский</p></emphasis></emphasis></epigraph>."
                                    );
                            }

                            // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><p>Текст</p></epigraph>
                            // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><p>Текст</p></epigraph>
                            // @"(?:<epigraph>\s*?)(?'texts'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?(?:\s*?</epigraph>)"
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?:<epigraph>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,})(?:\s*?</epigraph>)",
                                    "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><p>Текст</p></epigraph>\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><p>Текст</p></epigraph>."
                                    );
                            }

                            // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><emphasis><p>Текст</p></emphasis></epigraph>
                            // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><emphasis><p>Текст</p></emphasis></epigraph>
                            // @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?</\k'tag'>(?:\s*?</epigraph>)"
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,})\s*?</\k'tag'>(?:\s*?</epigraph>)",
                                    "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><emphasis><p>Текст</p></emphasis></epigraph>\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><emphasis><p>Текст</p></emphasis></epigraph>."
                                    );
                            }

                            // Преобразование Эпиграфа в Цитату в случае </subtitle><epigraph><p>Текст</p><text-author>Автор</text-author></epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?:<epigraph>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,}\s*?(?:<text-author>\s*?.+?\s*?</text-author>\s*?))(?:\s*?</epigraph>)",
                                    "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае </subtitle><epigraph><p>Текст</p><text-author>Автор</text-author></epigraph>."
                                    );
                            }
                        }
                        else if (tagPair.PreviousTag.Equals("</section>") && tagPair.NextTag.Equals("<section>"))
                        {
                            // обрамление Эпиграфа тегами <section> ... <empty-line /></section> в случае если до Эпиграфа стоит тег </section>, а после Эпиграфа - тег <section> : </section><epigraph><p>Текст</p><p>Текст</p></epigraph><section> => </section><section><epigraph><p>Текст</p><p>Текст</p></epigraph><empty-line/></section><section>
                            NewTag = "<section>" + NewTag + "<empty-line /></section>";
                        }
                        else if (tagPair.PreviousTag.Equals("</title>") || tagPair.PreviousTag.Equals("<section>"))
                        {
                            // Обработка Эпиграфа с Аннотацией в случае: </title><epigraph><annotation><p>Текст.</p><p>Текст.</p><empty-line /><p>Текст</p><p><emphasis>Текст</emphasis></p><p>Текст</p></annotation></epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?'epigraph'<epigraph>)(?:\s*?)(?:<annotation>\s*)(?'text'\s*?.+?\s*?)(?:</annotation>\s*?)(?'_epigraph'</epigraph>)",
                                    "${epigraph}${text}${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с Аннотацией в случае: </title><epigraph><annotation><p>Текст.</p><p>Текст.</p><empty-line /><p>Текст</p><p><emphasis>Текст</emphasis></p><p>Текст</p></annotation></epigraph>."
                                    );
                            }
                        }
                        else if (tagPair.PreviousTag.IndexOf("<empty-line />", StringComparison.CurrentCulture) != -1 || tagPair.PreviousTag.IndexOf("<empty-line/>", StringComparison.CurrentCulture) != -1)
                        {
                            // замена epigraph на cite в случае, если перед простым Эпиграфом находится </p><empty-line />
                            NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>");
                        }
                        else if (tagPair.PreviousTag.Equals("</cite>") || tagPair.PreviousTag.Equals("</poem>"))
                        {
                            // замена epigraph на cite в случае, если перед простым Эпиграфом находится </p><empty-line />
                            NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>");
                        }
                        else if (tagPair.PreviousTag.Equals("</annotation>"))
                        {
                            // обрамление Эпиграфа тегами <section> ... <empty-line /></section>
                            NewTag = "<section>" + NewTag + "<empty-line /></section>";
                        }
                    }
                    else if (tagPair.StartTagCount == 2)
                    {
                        if (tagPair.PreviousTag.Equals("</subtitle>") || tagPair.PreviousTag.Equals("</subtitle><empty-line/>") || tagPair.PreviousTag.Equals("</subtitle><empty-line />"))
                        {
                            // Преобразование Эпиграфа в Цитату в случае <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Этот стих звучит так:</emphasis></p><epigraph><p><emphasis>И счастья баловень безродный</emphasis></p><p><emphasis>Полудержавный властелин.</emphasis></p></epigraph></emphasis></epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts1'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?(<epigraph>\s*?)(?'texts2'(<p>\s*?(?:<(?'tag2'strong|emphasis)\b>)?[^<]+?(?:</\k'tag2'>)?\s*?</p>\s*?){1,})\s*?(?:</epigraph>\s*?)</\k'tag'>\s*?(?:</epigraph>)",
                                    "<cite>${texts1}${texts2}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Этот стих звучит так:</emphasis></p><epigraph><p><emphasis>И счастья баловень безродный</emphasis></p><p><emphasis>Полудержавный властелин.</emphasis></p></epigraph></emphasis></epigraph>."
                                    );
                            }
                        }
                        else if (tagPair.PreviousTag.Equals("</title>") || tagPair.PreviousTag.Equals("<section>") || tagPair.PreviousTag.Equals("</epigraph>"))
                        {
                            // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><p>Достоевский</p></emphasis></epigraph></epigraph><epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?'epigraph'<epigraph>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(?:\s*?<p>)(?'author'[^<]+?)(?:</p>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)",
                                    "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><p>Достоевский</p></emphasis></epigraph></epigraph><epigraph>."
                                    );
                            }

                            // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><emphasis>Достоевский</emphasis></emphasis></epigraph></epigraph><epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?'epigraph'<epigraph>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(\s*?<(?'tag_a'emphasis|strong)>)(?'author'[^<]+?)(?:</\k'tag_a'>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)",
                                    "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><emphasis>Достоевский</emphasis></emphasis></epigraph></epigraph><epigraph>."
                                    );
                            }

                            // обработка Эпиграфа с текстом и Эпиграфом вместо Автора эпиграфа: <epigraph><p><emphasis>Текст</emphasis></p><p>Текст</p><epigraph><p><emphasis>Достоевский</emphasis></p></epigraph></epigraph><epigraph>
                            try {
                                NewTag = Regex.Replace(
                                    NewTag, @"(?'epigraph'<epigraph>\s*)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?)<epigraph>\s*<p>\s*(?:<(?'tag1'strong|emphasis)\b>\s*?)(?'author'[^<]+?)</\k'tag1'>\s*</p>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)",
                                    "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                    );                             //
                            } catch (RegexMatchTimeoutException /*ex*/) {}
                            catch (Exception ex) {
                                Debug.DebugMessage(
                                    tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с текстом и Эпиграфом вместо Автора эпиграфа: <epigraph><p><emphasis>Текст</emphasis></p><p>Текст</p><epigraph><p><emphasis>Достоевский</emphasis></p></epigraph></epigraph><epigraph>."
                                    );
                            }
                        }

                        // Обработка Эпиграфа вида: <epigraph><empty-line/><p>Текст</p><p>Текст.</p><epigraph><empty-line/><p><emphasis>Автор</emphasis> </p></epigraph></epigraph> => <epigraph><empty-line/><p>Текст</p><p>Текст.</p><text-author><emphasis>Автор</emphasis></text-author></epigraph>
                        try {
                            NewTag = Regex.Replace(
                                NewTag, @"(?<=<epigraph>)\s*(?'p'(?:<empty-line ?/>)?\s*(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*(?:<empty-line ?/>)?\s*)(?:<epigraph>\s*(?:<empty-line ?/>)?\s*<p>)(?'author'<(?'tag1'strong|emphasis)>[^<]+</\k'tag1'>)(?: ?</p>\s*(?:<empty-line ?/>)?\s*</epigraph>\s*)(?=</epigraph>)",
                                "${p}<text-author>${author}</text-author>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                );
                        } catch (RegexMatchTimeoutException /*ex*/) {}
                        catch (Exception ex) {
                            Debug.DebugMessage(
                                tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа вида: <epigraph><empty-line/><p>Текст</p><p>Текст.</p><epigraph><empty-line/><p><emphasis>Автор</emphasis> </p></epigraph></epigraph> => <epigraph><empty-line/><p>Текст</p><p>Текст.</p><text-author><emphasis>Автор</emphasis></text-author></epigraph>."
                                );
                        }
                    }
                    else if (tagPair.StartTagCount == 3)
                    {
                        // обработка Эпиграфа с вложенным Эпиграфом и Эпиграфом вместо Автора эпиграфа: <epigraph><epigraph><p><strong>Текст</strong></p><p>Текст</p></epigraph><epigraph><emphasis><p>Автор</p></emphasis></epigraph></epigraph>
                        try {
                            NewTag = Regex.Replace(
                                NewTag, @"(?'epigraph'<epigraph>\s*?)<epigraph>\s*?(?'texts'(<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?</epigraph>\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(\s*?<p>)(?'author'[^<]+?)(</p>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)",
                                "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                                );
                        } catch (RegexMatchTimeoutException /*ex*/) {}
                        catch (Exception ex) {
                            Debug.DebugMessage(
                                tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом и Эпиграфом вместо Автора эпиграфа: <epigraph><epigraph><p><strong>Текст</strong></p><p>Текст</p></epigraph><epigraph><emphasis><p>Автор</p></emphasis></epigraph></epigraph>."
                                );
                        }
                    }
                }
                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }
Example #9
0
            /// <summary>
            /// Обработчик найденных парных тегов Таблиц
            /// </summary>
            /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param>
            /// <param name="XmlText">Текст строки для корректировки в xml представлении</param>
            /// <param name="Index">Индекс начала поиска открывающего тэга</param>
            public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index)
            {
                if (string.IsNullOrWhiteSpace(tagPair.PairTag))
                {
                    return;
                }

                string NewTag = tagPair.PairTag;

                // преобразование таблиц: <tr><image l:href="#image3.png" /><empty-line /></tr> и <tr><image l:href="#image3.png" /></tr> => <tr><td><image l:href="#image3.png" /></td></tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?:<tr>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)",
                        "<tr><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <tr><image l:href=\"#image3.png\" /><empty-line /></tr> и <tr><image l:href=\"#image3.png\" /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>."
                        );
                }


                // преобразование таблиц: <tr><td /><image l:href="#image3.png" /><empty-line /></tr> => <tr><td><image l:href="#image3.png" /></td></tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?:<tr>\\s*?<td ?/>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)",
                        "<tr><td/><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <tr><td /><image l:href=\"#image3.png\" /><empty-line /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>."
                        );
                }


                // преобразование таблиц: <table><image l:href="#image37.png" /><empty-line /><tr> => <table><tr><td><image l:href="#image37.png" /></td></tr><tr>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?'table'<table>)\\s*?(?'img'(?:<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>\\s*?){1,})\\s*?<empty-line ?/>\\s*?(?'tr'<tr>)",
                        "${table}<tr><td>${img}</td></tr>${tr}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <table><image l:href=\"#image37.png\" /><empty-line /><tr> => <table><tr><td><image l:href=\"#image37.png\" /></td></tr><tr>."
                        );
                }

                // преобразование таблиц: <table><tr><td /><image l:href="#image2.jpg" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href="#image2.jpg" /></td></tr><tr><td>Текст</td></tr></table>
                try {
                    NewTag = Regex.Replace(
                        NewTag, "(?'table'<table>\\s*<tr>)\\s*<td ?/>\\s*(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)\\s*<empty-line ?/>\\s*(?'_tr_table'</tr>\\s*<tr>\\s*<td>.+</td>\\s*</tr>\\s*</table>)",
                        "${table}<td>${img}</td>${_tr_table}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException /*ex*/) {}
                catch (Exception ex) {
                    Debug.DebugMessage(
                        tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <table><tr><td /><image l:href=\"#image2.jpg\" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href=\"#image2.jpg\" /></td></tr><tr><td>Текст</td></tr></table>."
                        );
                }

                Index   = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length;
                XmlText = XmlText.Substring(0, tagPair.StartTagPosition)               /* ДО обрабатываемого текста */
                          + NewTag
                          + XmlText.Substring(tagPair.EndTagPosition);                 /* ПОСЛЕ обрабатываемого текста */
            }