/// <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); }
/// <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); }
/// <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); }
/// <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) ) )); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }