示例#1
0
        /// <summary>
        /// Корректировка парных тегов Таблиц
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /***********************************
            * Предварительная обработка table *
            ***********************************/
            // ...

            // обработка найденных парных тэгов
            IWorker   worker    = new TableCorrectorWorker();
            TagWorker tagWorker = new TagWorker(ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#2
0
        /// <summary>
        /// Корректировка парных тегов Стихов
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /************************************
            * Предварительная обработка stanza *
            ************************************/
            // вставка <v /> после </subtitle> внутри <stanza></stanza>:
            // <stanza><subtitle>Текст</subtitle></stanza> => <stanza><subtitle>Текст</subtitle><v/></stanza>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<stanza>)\s*?(?'subtitle'<subtitle>.+?</subtitle>)\s*?(?=</stanza>)",
                    "${subtitle}<v/>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("StanzaCorrector:\r\nВставка <v /> после </subtitle> внутри <stanza></stanza>:.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new StanzaCorrectorWorker();
            TagWorker tagWorker = new TagWorker(ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#3
0
        /// <summary>
        /// Корректировка парных тегов Стихов
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /************************************
            * Предварительная обработка stanza *
            ************************************/
            // вставка <v /> после </subtitle> внутри <stanza></stanza>:
            // <stanza><subtitle>Текст</subtitle></stanza> => <stanza><subtitle>Текст</subtitle><v/></stanza>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<stanza>)\s*?(?'subtitle'<subtitle>.+?</subtitle>)\s*?(?=</stanza>)",
                    "${subtitle}<v/>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "StanzaCorrector:\r\nВставка <v /> после </subtitle> внутри <stanza></stanza>:."
                    );
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new StanzaCorrectorWorker();
            TagWorker tagWorker = new TagWorker(_FilePath, ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#4
0
        /// <summary>
        /// Автокорректировка текста строки InputString
        /// </summary>
        /// <param name="FilePath">Путь к обрабатываемому файлу</param>
        /// <param name="InputString">Строка для корректировки</param>
        /// <returns>Откорректированную строку типа string</returns>
        private static string autoCorrect(string FilePath, string InputString)
        {
            /* предварительная обработка текста */
            InputString = FB2CleanCode.preProcessing(
                /* чистка кода */
                FB2CleanCode.cleanFb2Code(
                    /* удаление недопустимых символов */
                    FB2CleanCode.deleteIllegalCharacters(InputString)
                    )
                );

            /* пост обработка текста: разбиение на теги */
            return(FB2CleanCode.postProcessing(
                       /* автокорректировка файла */
                       _autoCorrect(
                           /* обработка < и > */
                           FilePath, FB2CleanCode.processingCharactersMoreAndLessAndAmp(InputString)
                           )
                       ));
        }
示例#5
0
        /// <summary>
        /// Корректировка тегов Картинок
        /// </summary>
        /// <returns>Откорректированная строка типа string</returns>
        public string correct()
        {
            if (_xmlText.IndexOf("<image", StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

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

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

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

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

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

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

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

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

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

            // замена пробелов и тильды в ссылках на _
            try {
                Match m = Regex.Match(
                    _xmlText, "(?:=\"#[^\"]*\\.\\w\\w\\w\")",
                    RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
                while (m.Success)
                {
                    string sSource = m.Value;
                    string sResult = m.Value;
                    sResult = sResult.Replace(' ', '_').Replace('~', '_');
                    if (sResult != sSource)
                    {
                        _xmlText = _xmlText.Replace(sSource, sResult);
                    }
                    m = m.NextMatch();
                }
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("ImageCorrector:\r\nЗамена пробелов и тильды в ссылках на _.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }

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

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

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#6
0
        /// <summary>
        /// Корректировка парных тегов Заголовка
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /***********************************
            * Предварительная обработка title *
            ***********************************/
            // Удаление "пустышек": <title><empty-line /><empty-line /></title>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "(<title>)\\s*?(<empty-line />\\s*?){1,}\\s*?(</title>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nУдаление \"пустышек\": <title><empty-line /><empty-line /></title>."
                    );
            }


//			// Обработка </section> между </title> и <section> (Заголовок Книги игнорируется):
//			// </section><section><title><p><strong>Название</strong></p><p>главы</p></title></section><section>
//			try {
//				_xmlText = Regex.Replace(
//					_xmlText, @"(?'sect_before_text'</section>\s*?<section>\s*?<title>\s*?)(?'text_end_title'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?</title>\s*?)(?'end_sect'</section>\s*?)(?=<section>)",
//					"${sect_before_text}${text_end_title}<empty-line/>\n${end_sect}", RegexOptions.IgnoreCase | RegexOptions.Multiline
//				);
//			} catch ( RegexMatchTimeoutException /*ex*/ ) {}

            // удаление обрамления <section> ... </section> у Названия книги: <body><section><title><p>Автор книги</p><empty-line /><p>Название</p><empty-line /><p>(рассказы)</p></title></section><section> => <body><title><p>Автор книги</p><empty-line /><p>Название</p><empty-line /><p>(рассказы)</p></title><section>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<body>)(?:\s*?<section>\s*?)(?'title'<title>\s*?)(?'texts'(?:(?:<empty-line ?/>\s*?)?(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?)(?:<empty-line ?/>\s*?)?){1,})(?'_title'\s*?</title>\s*?)(?:</section>\s*?)(?=<section>)",
                    "${title}${texts}${_title}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nУдаление обрамления <section> ... </section> у Названия книги: <body><section><title><p>Автор книги</p><empty-line /><p>Название</p><empty-line /><p>(рассказы)</p></title></section><section> => <body><title><p>Автор книги</p><empty-line /><p>Название</p><empty-line /><p>(рассказы)</p></title><section>."
                    );
            }

            // Обработка Заголовка и ее </section> в конце книги перед </body>: <section><title><p><strong>Конец</strong></p><p>романа</p></title></section></body>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'base_struct'<section>\s*?<title>\s*?(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,}</title>\s*?)(?'end_sect'</section>\s*?)(?=</body>)",
                    "${base_struct}\n<empty-line/>${end_sect}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nОбработка Заголовка и ее </section> в конце книги перед </body>: <section><title><p><strong>Конец</strong></p><p>романа</p></title></section></body>."
                    );
            }

            // внесение текста Подзаголовка в Заголовок в начале книги: <body><title><p>Заголовок</p></title><subtitle>Подзаголовок</subtitle> => <body><title><p>Заголовок</p><p>Подзаголовок</p></title>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<body>)\s*?(?'text_title'<title>\s*?(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?)(?'_title'</title>\s*?)<subtitle>\s*?(?'text_subtitle'(?:<(?'tag_s'strong|emphasis)>)?\s*?(?:[^<]+)?(?:</\k'tag_s'>)?\s*?)</subtitle>",
                    "${text_title}<p>${text_subtitle}</p>${_title}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nВнесение текста Подзаголовка в Заголовок в начале книги: <body><title><p>Заголовок</p></title><subtitle>Подзаголовок</subtitle> => <body><title><p>Заголовок</p><p>Подзаголовок</p></title>."
                    );
            }

            // Обрамление текста Заголовка тегами <p> ... </p>: <title>Текст</title> => <title><p>Текст</p></title>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<title>)\s*?(?'text_title'(?:<(?'tag_s'strong|emphasis)>)?\s*?(?:[^<]+)?(?:</\k'tag_s'>)?\s*?)\s*?(?=</title>)",
                    "<p>${text_title}</p>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nОбрамление текста Заголовка тегами <p> ... </p>: <title>Текст</title> => <title><p>Текст</p></title>."
                    );
            }

            // Удаление <empty-line/> между </title> и <section>: </title><empty-line /><section>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</title>)?\s*?<empty-line ?/>\s*?(?=<section>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nУдаление <empty-line/> между </title> и <section>: </title><empty-line /><section>."
                    );
            }

            // Обрамление тегами <section> ... </section> текста в тегах <p>, находящегося между </title> и <section>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</title>)\s*?(?'pp'(?'p'<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?(?=<section>)",
                    "<section>${p}</section>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "TitleCorrector:\r\nОбрамление тегами <section> ... </section> текста в тегах <p>, находящегося между </title> и <section>."
                    );
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new TitleCorrectorWorker();
            TagWorker tagWorker = new TagWorker(_FilePath, ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#7
0
        /// <summary>
        /// Корректировка парных тегов Эпиграфа
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            // преобразование тега вида <p id="$890^^@@"> в тег <p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "<p +?id=\"\\$\\d\\d\\d\\^\\^@@\">",
                    "<p>", RegexOptions.Multiline                     // регистр не игнорировать!!!
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nПреобразование тега вида <p id=\"$890^^@@\"> в тег <p>."
                    );
            }

            // незавершенный тег <p>: <p текст => <p> текст
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?:\s*?)(?'p'<p)(?=\s+?[^i/>])",
                    "${p}>", RegexOptions.Multiline                     // регистр не игнорировать!!!
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nНезавершенный тег <p>: <p текст => <p> текст."
                    );
            }

            // обработка тегов <p>: <p><strong></strong><p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<p>)\s*<(?'tag'strong|emphasis)>\s*</\k'tag'>\s*<p>",
                    "", RegexOptions.Multiline                     // регистр не игнорировать!!!
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nОбработка тегов <p>: <p><strong></strong><p>."
                    );
            }

            // TODO ? (?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)
            // восстановление пропущенных </p>: <p><image xlink:href="#cover.jpg"/><p>Текст</p> => <p><image xlink:href="#cover.jpg"/></p>\n<p>Текст</p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'inline_img'<p>\s*?<image [^<]+?/>)(?=\s*?<p>)",
                    "${inline_img}</p>", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных </p>: <p><image xlink:href=\"#cover.jpg\"/><p>Текст</p> => <p><image xlink:href=\"#cover.jpg\"/></p>\n<p>Текст</p>"
                    );
            }

            // TODO ? (?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)
            // восстановление пропущенных <p>: </p><image xlink:href="#cover.jpg"/></p> => </p>\n<p><image xlink:href="#cover.jpg"/></p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_p'</p>)(?:\s*?)(?'img'<image [^<]+?/>)(?=\s*?</p>).",
                    "${_p}<p>${img}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных <p>: </p><image xlink:href=\"#cover.jpg\"/></p> => </p>\n<p><image xlink:href=\"#cover.jpg\"/></p>."
                    );
            }

            // восстановление пропущенных <p>: </p>Любой текст с тегами</p> => </p><p>Любой текст с тегами</p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</p>)(?: *?)(?'text'(?:(?!(?:(?:<p>)|(?:</[^p])|(?:<empty-line ?/>))).?){1,} *?)(?=</p>)",
                    "<p>${text}", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных <p>: </p>Любой текст с тегами</p> => </p><p>Любой текст с тегами</p>."
                    );
            }

            // удаление неверного id из тега <p>: <p id="__"> => <p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "(?:<p\\s+?id=\"_+\">)",
                    "<p>", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nУдаление неверного id из тега <p>: <p id=\"__\"> => <p>."
                    );
            }
            // TODO Продумать, нужно ли переделать ниже алгоритм: может это на конце слов не <p>, а должен быть </p>
            // восстановление пропущенных </p>: <p>Любой текст с тегами<p> => <p>Любой текст с тегами</p><p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<p>)(?: *?)(?'text'(?:(?!(?:</p>)).?){1,} *?)(?=<p>)",
                    "${text}</p>", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных </p>: <p>Любой текст с тегами<p> => <p>Любой текст с тегами</p><p>."
                    );
            }

            // ********************************************************************************************************
            // восстановление пропущенных <p>: </p> Текст => </p>\n<p> Текст
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "(?'_p'</p>)\\s*?(?'text'[\\−\\—\\–\\-\\*\\+\\d\\w`'\"«»„“”‘’\\:;…\\.,!_=\\?\\(\\)\\{\\}\\[\\]@#$%№\\^~])",
                    "${_p}\n<p>${text}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных <p>: </p> Текст => </p>\n<p> Текст."
                    );
            }

            // восстановление пропущенных <p>: </p><strong>Текст</strong> => </p><p><strong>Текст</strong>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_p'</p>)(?:\s*?)(?'tag_s'<(?'tag'strong|emphasis|strikethrough|sub|sup|code)\b>\s*?)(?'text'.+?\s*?)(?=</\k'tag'>)",
                    "${_p}\n<p>${tag_s}${text}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных <p>: </p><strong>Текст</strong> => </p><p><strong>Текст</strong>."
                    );
            }

            // восстановление пропущенных </p>: Текст <p> => Текст </p>\n<p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "(?'text'[\\−\\—\\–\\-\\*\\+\\d\\w`'\"«»„“”‘’\\:;…\\.,!_=\\?\\(\\)\\{\\}\\[\\]@#$%№\\^~])\\s*?(?'p'<p>)(?!\\s*?</[^<]+?>)",
                    "${text}</p>\n${p}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных </p>: Текст <p> => Текст </p>\n<p>."
                    );
            }

            // восстановление пропущенных </p>: <p><strong>Текст</strong><p> => <p><strong>Текст</strong></p><p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'p'<p>)(?:\s*?)(?'tag_s'<(?'tag'strong|emphasis|strikethrough|sub|sup|code)\b>\s*?)(?'text'.+?\s*?)(?'_tag'</\k'tag'>)(?=\s*?<p>)",
                    "${p}${tag_s}${text}${_tag}</p>\n", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nВосстановление пропущенных </p>: <p><strong>Текст</strong><p> => <p><strong>Текст</strong></p><p>."
                    );
            }
            // ********************************************************************************************************

            // удаление лишнего открывающего тега <p> в случаях: <p><p id="AutBody_0fb_0">Текст</p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, "<p>\\s*(?=<p +?id=\"[^\"]+\">)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nУдаление лишнего открывающего тега <p> в случаях: <p><p id=\"AutBody_0fb_0\">Текст</p>."
                    );
            }

            // удаление лишнего открывающего тега <p> в случаях: <p><p>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"<p>\s*?(?=<p>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "ParaCorrector:\r\nУдаление лишнего открывающего тега <p> в случаях: <p><p>."
                    );
            }

            //TODO
            // удаление "одиночных" тегов <strong> (</strong>) и т.д. из абзаца <p> ... </p>

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#8
0
        /// <summary>
        /// Корректировка парных тегов Эпиграфа
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /**********************************
            * Предварительная обработка cite *
            **********************************/
            // Преобразование вложенных друг в друга тегов cite в Автора: <cite><cite><p>Иванов</p></cite></cite> => <cite><text-author><p>Иванов</p></text-author></cite>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?:(?:<(?'tag'cite)\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(
                    _FilePath, ex, "CiteCorrector:\r\nПреобразование вложенных друг в друга тегов cite в Автора: <cite><cite><p>Иванов</p></cite></cite> => <cite><text-author><p>Иванов</p></text-author></cite>."
                    );
            }

            // перестановка местами Текста Цитаты и ее автора: <cite><text-author>Автор</text-author><p>Цитата</p></cite> => <cite><p>Цитата</p><text-author>Автор</text-author></cite>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=<cite>)\s*?(?'author'<text-author>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</text-author>)\s*?(?'texts'(?:<p>\s*?(?:<(?'tagp'strong|emphasis)\b>)?[^<]+?(?:</\k'tagp'>)?\s*?</p>\s*?){1,})\s*?(?=</cite>)",
                    "${texts}${author}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "CiteCorrector:\r\nПерестановка местами Текста Цитаты и ее автора: <cite><text-author>Автор</text-author><p>Цитата</p></cite> => <cite><p>Цитата</p><text-author>Автор</text-author></cite>."
                    );
            }

            // Удаление <empty-line /> между </text-author> и </cite>: </text-author><empty-line /></cite> => </text-author></cite>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</text-author>)\s*<empty-line */>\s*(?=</cite>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "CiteCorrector:\r\nУдаление <empty-line /> между </text-author> и </cite>: </text-author><empty-line /></cite> => </text-author></cite>."
                    );
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new CiteCorrectorWorker();
            TagWorker tagWorker = new TagWorker(_FilePath, ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#9
0
        /// <summary>
        /// Корректировка парных тегов Стихов
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /**********************************
            * Предварительная обработка poem *
            **********************************/
            // Удаление структур <poem><stanza /></poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"<poem>\s*?<stanza ?/>\s*?</poem>",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "PoemCorrector:\r\nУдаление структур <poem><stanza /></poem>."
                    );
            }

            // Удаление структур <poem><stanza><empty-line /></stanza></poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"<poem>\s*?<stanza>\s*?<empty-line ?/>\s*?</stanza>\s*?</poem>",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "PoemCorrector:\r\nУдаление структур <poem><stanza><empty-line /></stanza></poem>."
                    );
            }

            // вставка <text-author> внутрь <poem> </poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_poem'</poem>)(?'ws'\s*)(?'textauthor'<text-author>\s*.+?\s*</text-author>)",
                    "${textauthor}${ws}${_poem}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "PoemCorrector:\r\nВставка <text-author> внутрь <poem> </poem>."
                    );
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new PoemCorrectorWorker();
            TagWorker tagWorker = new TagWorker(_FilePath, ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#10
0
        /// <summary>
        /// Корректировка тегов date
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf("<date", StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /******************
            * Обработка date *
            ******************/
            // обработка атрибута в датах типа <date value="16.01.2006"></date> => <date value="2006-01-16"></date>
            // или <date value="16.01.2006">Текст</date> => <date value="2006-01-16">Текст</date>
            _xmlText = Regex.Replace(
                _xmlText, "(?'start'<date +?value=\")(?'d'\\d\\d)\\.(?'m'\\d\\d)\\.(?'y'\\d\\d\\d\\d)(?'end'\">(?:\\s*?</date>))",
                "${start}${y}-${m}-${d}${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // обработка атрибута в датах типа <date value="16.01.2006">16.01.2006</date> => <date value="2006-01-16">16.01.2006</date>
            _xmlText = Regex.Replace(
                _xmlText, "(?'start'<date +?value=\")(?'d'\\d\\d)\\.(?'m'\\d\\d)\\.(?'y'\\d\\d\\d\\d)(?'end'\">(?:\\d\\d\\.\\d\\d\\.\\d\\d\\d\\d</date>))",
                "${start}${y}-${m}-${d}${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // обработка атрибута в датах типа <date value="2008.04.30">2008.04.30</date> => <date value="2008-04-30">2008.04.30</date>
            _xmlText = Regex.Replace(
                _xmlText, "(?'start'<date +?value=\")(?'y'\\d\\d\\d\\d)\\.(?'m'\\d\\d)\\.(?'d'\\d\\d)(?'end'\">(?:[^<]+?)?(?:\\s*?</date>))",
                "${start}${y}-${m}-${d}${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // обработка атрибута в датах типа <date value="2015-08-24 15:22:32">24 авг 2015</date> - удаление времени
            _xmlText = Regex.Replace(
                _xmlText, "(?<=<date value=\"\\d\\d\\d\\d-\\d\\d-\\d\\d)(?: [^<]+?)(?=(?:\">[^<]+?)</date>)",
                "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // обработка атрибута в датах типа <date value="2015-08-24 15:22:32"></date> - удаление времени
            _xmlText = Regex.Replace(
                _xmlText, "(?<=<date value=\"\\d\\d\\d\\d-\\d\\d-\\d\\d)(?: [^<]+?)(?=(?:\">)</date>)",
                "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // удаление атрибута в датах типа <date value="05-06-21">21.06.05</date>
            _xmlText = Regex.Replace(
                _xmlText, "(?<=<date) value=\"\\d\\d[-.]\\d\\d[-.]\\d\\d\">\\s*?(?=(?:[^<]+?)?\\s*?</date>)",
                ">", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );
            // удаление атрибута в датах типа <date value="2006">2006</date>
            _xmlText = Regex.Replace(
                _xmlText, "(?<=<date) value=\"\\d\\d\\d\\d\">\\s*?(?=(?:[^<]+?)?\\s*?</date>)",
                ">", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );

            // обработка атрибута в датах типа <date value="20.09.2017" /> => <date value="2017-09-20" />
            _xmlText = Regex.Replace(
                _xmlText, "(?'start'<date +?value=\")(?'d'\\d\\d)\\.(?'m'\\d\\d)\\.(?'y'\\d\\d\\d\\d)(?'end'\" ?/>)",
                "${start}${y}-${m}-${d}${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                );

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#11
0
        /// <summary>
        /// Корректировка парных тегов Эпиграфа
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /******************************************************
            * Предварительная обработка epigraph и <empty-line/> *
            ******************************************************/
            // Вставка между </epigraph> и </section> недостающего тега <empty-line/>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'tag'(?:</epigraph>))(?:\s*)(?'_sect'</section>)",
                    "${tag}<empty-line/>${_sect}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "EpigraphCorrector:\r\nВставка между </epigraph> и </section> недостающего тега <empty-line/>."
                    );
            }

            // удаление <empty-line /> между </title> и <epigraph> </title><empty-line/><epigraph><p>Эпиграф</p></epigraph> => </title><epigraph><p>Эпиграф</p></epigraph>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_title'</title>)(?:\s*?)(?:<empty-line ?/>)(?:\s*?)(?'epigraph'<epigraph>)",
                    "${_title}${epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "EpigraphCorrector:\r\nУдаление <empty-line /> между </title> и <epigraph> </title><empty-line/><epigraph><p>Эпиграф</p></epigraph> => </title><epigraph><p>Эпиграф</p></epigraph>."
                    );
            }

            // удаление <empty-line /> между </epigraph> и <epigraph>: </epigraph><empty-line /><epigraph> => </epigraph>\n<epigraph>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</epigraph>)(?:\s*<empty-line ?/>\s*)(?=<epigraph>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "EpigraphCorrector:\r\nУдаление <empty-line /> между </epigraph> и <epigraph>: </epigraph><empty-line /><epigraph> => </epigraph><epigraph>."
                    );
            }

            // удаление <empty-line /> между </epigraph> и <section>: </epigraph><empty-line /><section> => </epigraph>\n<section>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?<=</epigraph>)(?:\s*<empty-line ?/>\s*)(?=<section>)",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "EpigraphCorrector:\r\nУдаление <empty-line /> между </epigraph> и <section>: </epigraph><empty-line /><section> => </epigraph><section>."
                    );
            }

            // Перестановка местами </epigraph> и тег <text-author> с его данными
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_epigraph'</epigraph>)\s*?(?'text_a'(?:<text-author>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</text-author>\s*?){1,})",
                    "${text_a}${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    _FilePath, ex, "EpigraphCorrector:\r\nПерестановка местами </epigraph> и тег <text-author> с его данными."
                    );
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new EpigraphCorrectorWorker();
            TagWorker tagWorker = new TagWorker(_FilePath, ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#12
0
        /// <summary>
        /// Корректировка парных тегов Стихов
        /// </summary>
        /// <returns>Откорректированную строку типа string </returns>
        public string correct()
        {
            if (_xmlText.IndexOf(_startTag, StringComparison.CurrentCulture) == -1)
            {
                return(_xmlText);
            }

            // преобработка (удаление стартовых пробелов ДО тегов и удаление завершающих пробелов ПОСЛЕ тегов и символов переноса строк)
            if (_preProcess)
            {
                _xmlText = FB2CleanCode.preProcessing(_xmlText);
            }

            /**********************************
            * Предварительная обработка poem *
            **********************************/
            // Удаление структур <poem><stanza /></poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"<poem>\s*?<stanza ?/>\s*?</poem>",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("PoemCorrector:\r\nУдаление структур <poem><stanza /></poem>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }

            // Удаление структур <poem><stanza><empty-line /></stanza></poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"<poem>\s*?<stanza>\s*?<empty-line ?/>\s*?</stanza>\s*?</poem>",
                    "", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("PoemCorrector:\r\nУдаление структур <poem><stanza><empty-line /></stanza></poem>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }

            // вставка <text-author> внутрь <poem> </poem>
            try {
                _xmlText = Regex.Replace(
                    _xmlText, @"(?'_poem'</poem>)(?'ws'\s*)(?'textauthor'<text-author>\s*.+?\s*</text-author>)",
                    "${textauthor}${ws}${_poem}", RegexOptions.IgnoreCase | RegexOptions.Multiline
                    );
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("PoemCorrector:\r\nВставка <text-author> внутрь <poem> </poem>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }

            // обработка найденных парных тэгов
            IWorker   worker    = new PoemCorrectorWorker();
            TagWorker tagWorker = new TagWorker(ref _xmlText, _startTag, _endTag, ref worker);

            _xmlText = tagWorker.Work();

            // постобработка (разбиение на теги (смежные теги) )
            if (_postProcess)
            {
                _xmlText = FB2CleanCode.postProcessing(_xmlText);
            }

            return(_xmlText);
        }
示例#13
0
        /// <summary>
        /// Автокорректировка теста файла FilePath
        /// </summary>
        /// <param name="FilePath">Путь к обрабатываемой книге</param>
        public static void autoCorrector(string FilePath)
        {
            if (string.IsNullOrWhiteSpace(FilePath))
            {
                return;
            }
            FileInfo fi = new FileInfo(FilePath);

            if (!fi.Exists)
            {
                return;
            }
            if (fi.Length < 4)
            {
                return;
            }

            // Хэш таблица fb2 тегов
            Hashtable htTags = FB2CleanCode.getTagsHashtable();             // обработка < > в тексте, кроме fb2 тегов

            // обработка головного тега FictionBook и пространства имен
            FB2Text fb2Text = new FB2Text(FilePath);

            if (fb2Text.Description.IndexOf("<FictionBook", StringComparison.CurrentCulture) == -1)
            {
                // тег FictionBook отсутствует в книге
                FictionBookTagCorrector fbtc = new FictionBookTagCorrector();
                fb2Text.Description = fb2Text.Description.Insert(
                    fb2Text.Description.IndexOf("<description>", StringComparison.CurrentCulture),
                    fbtc.NewFictionBookTag
                    );
            }

            // обработка неверного значения кодировки файла
            try {
                Regex regex = new Regex("(?<=encoding=\")(?:(?:wutf-8)|(?:utf8))(?=\")", RegexOptions.IgnoreCase);
                fb2Text.Description = regex.Replace(fb2Text.Description, "utf-8");
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                if (Settings.Settings.ShowDebugMessage)
                {
                    // Показывать сообщения об ошибках при падении работы алгоритмов
                    MessageBox.Show(
                        string.Format("Обработка раздела <description>:\r\nОбработка неверного значения кодировки файла.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error
                        );
                }
            }


            /******************************************
             * Автокорректировка раздела <description> *
             *******************************************/
            fb2Text.Description = autoCorrectDescription(fb2Text.Bodies, fb2Text.Description, htTags);

            /* Автокорректировка разделов <body> */
            fb2Text.Bodies = autoCorrect(fb2Text.Bodies, htTags);

            /* автокорректировка разделов binary */
            if (fb2Text.BinariesExists)
            {
                // обработка ссылок-названий картинок в binary
                BinaryCorrector binaryCorrector = new BinaryCorrector(fb2Text.Binaries);
                fb2Text.Binaries = binaryCorrector.correct();
            }

            try {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(fb2Text.toXML());
                xmlDoc.Save(FilePath);
            } catch {
                fb2Text.saveFile();
            }
        }
示例#14
0
        /// <summary>
        /// Автокорректировка теста файла FilePath
        /// </summary>
        /// <param name="FilePath">Путь к обрабатываемой книге</param>
        public static void autoCorrector(string FilePath)
        {
            if (string.IsNullOrWhiteSpace(FilePath))
            {
                return;
            }
            FileInfo fi = new FileInfo(FilePath);

            if (!fi.Exists)
            {
                return;
            }
            if (fi.Length < 4)
            {
                return;
            }

            // Хэш таблица fb2 тегов
            Hashtable htTags = FB2CleanCode.getTagsHashtable();             // обработка < > в тексте, кроме fb2 тегов

            // обработка головного тега FictionBook и пространства имен
            FB2Text fb2Text = null;

            try {
                fb2Text = new FB2Text(FilePath);
            } catch (Exception ex) {
                Debug.DebugMessage(
                    FilePath, ex, "AutoCorrector.FB2AutoCorrector.autoCorrector():\r\nАвтокорректировка теста файла."
                    );
                // Если структура fb2 файла сильно "битая", или же основные разделы располагаются не по стандарту
                throw ex;
            }

            if (fb2Text.Description.IndexOf("<FictionBook", StringComparison.CurrentCulture) == -1)
            {
                // тег FictionBook отсутствует в книге
                FictionBookTagCorrector fbtc = new FictionBookTagCorrector(FilePath);
                fb2Text.Description = fb2Text.Description.Insert(
                    fb2Text.Description.IndexOf("<description>", StringComparison.CurrentCulture),
                    fbtc.NewFictionBookTag
                    );
            }

            // обработка неверного значения кодировки файла
            try {
                Regex regex = new Regex("(?<=encoding=\")(?:(?:wutf-8)|(?:utf8))(?=\")", RegexOptions.IgnoreCase);
                fb2Text.Description = regex.Replace(fb2Text.Description, "utf-8");
            } catch (RegexMatchTimeoutException /*ex*/) {}
            catch (Exception ex) {
                Debug.DebugMessage(
                    FilePath, ex, "AutoCorrector.FB2AutoCorrector::autoCorrector():\r\nОбработка неверного значения кодировки файла."
                    );
            }


            /******************************************
             * Автокорректировка раздела <description> *
             *******************************************/
            fb2Text.Description = autoCorrectDescription(FilePath, fb2Text.Bodies, fb2Text.Description, htTags);

            /* Автокорректировка разделов <body> */
            fb2Text.Bodies = autoCorrect(FilePath, fb2Text.Bodies, htTags);

            /* автокорректировка разделов binary */
            if (fb2Text.BinariesExists)
            {
                // обработка ссылок-названий картинок в binary
                BinaryCorrector binaryCorrector = new BinaryCorrector(FilePath, fb2Text.Binaries);
                fb2Text.Binaries = binaryCorrector.correct();
            }

            try {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(fb2Text.toXML());
                xmlDoc.Save(FilePath);
            } catch (Exception ex) {
                Debug.DebugMessage(
                    FilePath, ex, "AutoCorrector.FB2AutoCorrector::autoCorrector():\r\nпересохранение файла."
                    );
                fb2Text.saveFile();
            }
        }