Ejemplo n.º 1
0
        /// <summary>
        /// Корректировка атрибутов тегов binary
        /// </summary>
        /// <returns>Откорректированная строка типа string</returns>
        public string correct()
        {
            /* ********************************
            *    Предварительная обработка   *
            * ********************************/
            // Поиск одноименных обложек и их переименовывание
            BinaryCopiesWorker();

            /* *************************
            *    Основная обработка   *
            * *************************/
            // обработка binary, в которых отсутствует аттрибут content-type
            try {
                Match m = Regex.Match(
                    _xmlBinaries, "(?'binary'<binary +?)(?'id'id=\"(?:(?:\\w+?\\W?\\w+?)+)+\\.\\w{3,4}\">)",
                    RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
                while (m.Success)
                {
                    string BinaryText = m.Value;
                    Match  mExt       = Regex.Match(
                        _xmlBinaries, "(?<=\\.)(\\w{3,4})",
                        RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                    string ContentType = string.Empty;
                    if (mExt.Success)
                    {
                        switch (mExt.Value)
                        {
                        case "png":
                            ContentType = "content-type=\"image/png\"";
                            break;

                        default:
                            ContentType = "content-type=\"image/jpeg\"";
                            break;
                        }
                    }
                    if (!string.IsNullOrWhiteSpace(ContentType))
                    {
                        string resultBinaryTag = string.Format(
                            "{0}{1} {2}",
                            m.Groups[1].Captures[0].Value, ContentType, m.Groups[2].Captures[0].Value
                            );
                        if (resultBinaryTag != BinaryText)
                        {
                            _xmlBinaries = _xmlBinaries.Replace(BinaryText, resultBinaryTag);
                        }
                    }
                    m = m.NextMatch();
                }
            } catch (RegexMatchTimeoutException /*exp*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "BinaryCorrector:\r\nОбработка <binary>, в которых отсутствует аттрибут content-type."
                    );
            }

            // обработка ссылок в данных тега binary
            try {
                Match m = Regex.Match(
                    _xmlBinaries, _regStringForBinaryTag,
                    RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
                while (m.Success)
                {
                    string sourceRinaryTag = m.Value;
                    // обработка ссылок
                    LinksCorrector linksCorrector  = new LinksCorrector(_FilePath, sourceRinaryTag);
                    string         resultBinaryTag = linksCorrector.correct();
                    if (resultBinaryTag != sourceRinaryTag)
                    {
                        _xmlBinaries = _xmlBinaries.Replace(sourceRinaryTag, resultBinaryTag);
                    }
                    m = m.NextMatch();
                }
            } catch (RegexMatchTimeoutException /*exp*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "BinaryCorrector:\r\nОбработка ссылок в данных тега <binary>."
                    );
            }

            return(_xmlBinaries);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Автокорректировка текста строки InputString
        /// </summary>
        /// <param name="FilePath">Путь к обрабатываемому файлу</param>
        /// <param name="InputString">Строка для корректировки</param>
        /// <returns>Откорректированную строку типа string</returns>
        private static string _autoCorrect(string FilePath, string InputString)
        {
            if (string.IsNullOrWhiteSpace(InputString) || InputString.Length == 0)
            {
                return(InputString);
            }

            try {
                // Удаление пустышек типа <body name="notes"><title><p>Примечания</p></title></body>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?:<body +?name=\"notes\">\\s*<title>\\s*(?:(?:<p>(?:(?:\\w+?\\W?\\w+?)+)</p>){1,}\\s*){1,}</title>\\s*</body>)",
                        "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\"><title><p>Примечания</p></title></body>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\"><title><p>Примечания</p></title></body>. Исключение RegexMatchTimeoutException."
                        );
                }

                // Удаление пустышек типа <body name="notes" />
                try {
                    InputString = Regex.Replace(
                        InputString, "<body name=\"notes\" ?/>",
                        "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\" />. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\" />. Исключение Exception."
                        );
                }

                // Обработка блоков типа <p></section> => </section>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?:<p>\\s*?)(?'tag'</section>)",
                        "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <p></section> => </section>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <p></section> => </section>. Исключение Exception."
                        );
                }

                // Обработка блоков типа <title></p> => <title>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?'tag'<title>\\s*?)(?:</p>)",
                        "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <title></p> => <title>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <title></p> => <title>. Исключение Exception."
                        );
                }

                // Обработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?'title'</title>)(?:\\s*?<empty-line />\\s*?</section>\\s*?)(?'_p'(?:<p>)|(?:<subtitle>))",
                        "${title}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle>. Исключение Exception."
                        );
                }

                /********************
                 * Обработка ссылок *
                 *******************/
                // обработка ссылок
                if (InputString.IndexOf("<a ", StringComparison.CurrentCulture) != -1)
                {
                    LinksCorrector linksCorrector = new LinksCorrector(FilePath, InputString);
                    InputString = linksCorrector.correct();
                }

                /****************************
                 * Обработка <empty-line /> *
                 ***************************/
                if (InputString.IndexOf("<empty-line/>", StringComparison.CurrentCulture) != -1 || InputString.IndexOf("<empty-line />", StringComparison.CurrentCulture) != -1)
                {
                    EmptyLineCorrector emCorrector = new EmptyLineCorrector(FilePath, InputString);
                    InputString = emCorrector.correct();
                }

                /********************************************************************
                * удаление пустых атрибутов xmlns="" в тегах body, title и section *
                ********************************************************************/
                // удаление пустого атрибута xmlns="" в тегах body и section
                try {
                    InputString = Regex.Replace(
                        InputString, "(?<=<)(?'tag'body|section|title)(?:\\s+?xmlns=\"\"\\s*?)(?=>)",
                        "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустого атрибута xmlns=\"\" в тегах body и section. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустого атрибута xmlns=\"\" в тегах body и section. Исключение Exception."
                        );
                }

                // удаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:xlink="http://www.w3.org/1999/xlink">
                try {
                    InputString = Regex.Replace(
                        InputString, "(?<=<body) \\b(xmlns|l)\\b:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" \\b(xmlns|l)\\b:xlink=\"http://www.w3.org/1999/xlink\"(?=>)",
                        "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\". Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\". Исключение Exception."
                        );
                }

                /***********************
                * Обработка <section> *
                ***********************/
                // Удаление "пустышек": <section><empty-line /><empty-line /></section>
                try {
                    InputString = Regex.Replace(
                        InputString, "(<section>)\\s*?(<empty-line />\\s*?){1,}\\s*?(</section>)",
                        "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <section>.\r\nУдаление \"пустышек\": <section><empty-line /><empty-line /></section>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <section>.\r\nУдаление \"пустышек\": <section><empty-line /><empty-line /></section>. Исключение Exception."
                        );
                }

                /****************************
                * Обработка болоков сносок *
                ****************************/
                // Обработка блоков сносок типа <section id="id20150519063123_1"><title><p>1</p></title></section> =>
                // <section id="id20150519063123_1"><title><p>1</p></title><empty-line /></section>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?'start'<section id=\"(:?(:?\\w+?\\W?\\w+?)+?)+\">\\s*?<title>\\s*?<p>\\d{1,5}</p>\\s*?</title>\\s*?)(?'end'</section>)",
                        "${start}<empty-line />${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков сносок типа <section id=\"id20150519063123_1'\"><title><p>1</p></title></section> => <section id=\"id20150519063123_1\"><title><p>1</p></title><empty-line /></section>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков сносок типа <section id=\"id20150519063123_1'\"><title><p>1</p></title></section> => <section id=\"id20150519063123_1\"><title><p>1</p></title><empty-line /></section>. Исключение Exception."
                        );
                }

                /*********************
                 * Обработка графики *
                 ********************/
                if (InputString.IndexOf("<image", StringComparison.CurrentCulture) != -1)
                {
                    ImageCorrector imageCorrector = new ImageCorrector(FilePath, ref InputString, false, false);
                    InputString = imageCorrector.correct();
                }

                /**************************
                * Обработка цитат <cite> *
                **************************/
                if (InputString.IndexOf("<cite", StringComparison.CurrentCulture) != -1)
                {
                    CiteCorrector citeCorrector = new CiteCorrector(FilePath, ref InputString, false, false);
                    InputString = citeCorrector.correct();
                }

                // Создание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p>
                try {
                    InputString = Regex.Replace(
                        InputString, @"(?'left'(?:<empty-line ?/>|</p>|<section>|</title>))\s*?(?'text_a'(?:<text-author>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</text-author>\s*?){1,})\s*?(?'right'(?:<p>|</section>|<empty-line ?/>))",
                        "${left}<cite>${text_a}</cite>${right}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nСоздание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nСоздание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p>. Исключение Exception."
                        );
                }

                /**************************************
                * Обработка подзаголовков <subtitle> *
                **************************************/
                // обработка подзаголовков <subtitle> (<subtitle>\n<p>\nТекст\n</p>\n</subtitle>)
                try {
                    InputString = Regex.Replace(
                        InputString, @"(?'tag_start'<subtitle>)\s*<p>\s*(?'text'.+?)\s*</p>\s*(?'tag_end'</subtitle>)",
                        "${tag_start}${text}${tag_end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle>. Исключение Exception."
                        );
                }

                // обработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph>
                try {
                    InputString = Regex.Replace(
                        InputString, @"</section>\s*?<section>\s*?<subtitle>\s*?(?'sub'[^<]+?)\s*?</subtitle>\s*?<epigraph>",
                        "</section><section><title><p>${sub}</p></title><epigraph>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph>. Исключение Exception."
                        );
                }

                /************************
                * Обработка <epigraph> *
                ************************/
                if (InputString.IndexOf("<epigraph", StringComparison.CurrentCulture) != -1)
                {
                    EpigraphCorrector epigraphCorrector = new EpigraphCorrector(FilePath, ref InputString, true, false);
                    InputString = epigraphCorrector.correct();
                }

                /*********************
                 * Обработка <title> *
                 ********************/
                if (InputString.IndexOf("<title", StringComparison.CurrentCulture) != -1)
                {
                    TitleCorrector titleCorrector = new TitleCorrector(FilePath, ref InputString, true, false);
                    InputString = titleCorrector.correct();
                }

                /**************************
                 * Обработка <annotation> *
                 *************************/
                // Обработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation>
                try {
                    InputString = Regex.Replace(
                        InputString, @"<(?'tag'annotation|cite)\b>\s*?<(?'format'i|b|emphasis|strong)\b>\s*?(?'text'[^<]+?\s*)</\k'format'>\s*?</\k'tag'>",
                        "<${tag}><p>${text}</p></${tag}>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation>. Исключение Exception."
                        );
                }

                // Удаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation>
                try {
                    InputString = Regex.Replace(
                        InputString, @"(?<=<section>)\s*(?:<empty-line */>\s*){1,}\s*(?=<annotation>)",
                        "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation>. Исключение Exception."
                        );
                }

                // Вставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section>
                try {
                    InputString = Regex.Replace(
                        InputString, @"(?'ann'</annotation>)(\s*)(?'end_sect'</section>)",
                        "${ann}<empty-line />${end_sect}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section>.  Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section>.  Исключение Exception."
                        );
                }

                /********************
                * Обработка Стихов *
                ********************/
                if (InputString.IndexOf("<poem", StringComparison.CurrentCulture) != -1)
                {
                    StanzaCorrector stanzaCorrector = new StanzaCorrector(FilePath, ref InputString, false, false);
                    InputString = stanzaCorrector.correct();

                    PoemCorrector poemCorrector = new PoemCorrector(FilePath, ref InputString, false, false);
                    InputString = poemCorrector.correct();
                }

                /****************************
                 * Обработка форматирования *
                 ***************************/
                // Обработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?:(?'format'<(?'tag'strong|emphasis)>)\\s*?){2}(?'p'(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>))\\s*?(?'text'(?:[^<]+))?(?'_p'(?:</p>))\\s*?(?'_format'</\\k'tag'>)\\s*?\\k'_format'",
                        "${p}${format}${text}${_format}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p>. Исключение Exception."
                        );
                }

                // внесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?'format'<(?'tag'strong|emphasis)>)\\s*?(?'p'(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>))\\s*?(?'text'(?:[^<]+))?(?'_p'(?:</p>))\\s*?(?'_format'</\\k'tag'>)\\s*?",
                        "${p}${format}${text}${_format}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВнесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВнесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p>. Исключение Exception."
                        );
                }

                // замена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite>
                try {
                    InputString = Regex.Replace(
                        InputString, "(?:<(?'tag'strong|emphasis)>)\\s*?(?'text'(?:(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>)\\s*?(?:[^<]+)?(?:</p>)\\s*?){2,})(?:</\\k'tag'>)",
                        "<cite>${text}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                        );
                } catch (RegexMatchTimeoutException ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nЗамена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite>. Исключение RegexMatchTimeoutException."
                        );
                }
                catch (Exception ex) {
                    Debug.DebugMessage(
                        FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nЗамена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite>. Исключение Exception."
                        );
                }

                /********************
                 * Обработка Таблиц *
                 *******************/
                if (InputString.IndexOf("<table", StringComparison.CurrentCulture) != -1)
                {
                    TableCorrector tableCorrector = new TableCorrector(FilePath, ref InputString, false, false);
                    InputString = tableCorrector.correct();
                }

                /**********************
                 * Обработка тега <p> *
                 *********************/
                ParaCorrector paraCorrector = new ParaCorrector(FilePath, ref InputString, false, false);
                InputString = paraCorrector.correct();
            } catch (Exception ex) {
                Debug.DebugMessage(
                    FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nАвтокорректировка текста. Метод _autoCorrect( string InputString ). Ошибка уровня всего метода (главный catch (Exception ex))."
                    );
            }

            return(InputString);
        }