/// <summary> /// Корректировка атрибутов тегов binary /// </summary> /// <returns>Откорректированная строка типа string</returns> public string correct() { /* ******************************** * Предварительная обработка * * ********************************/ // Поиск одноименных обложек и их переименовывание BinaryCopiesWorker(); /* ************************* * Основная обработка * * *************************/ // обработка binary, в которых отсутствует аттрибут content-type try { Match m = Regex.Match( _xmlBinaries, "(?'binary'<binary +?)(?'id'id=\"(?:(?:\\w+?\\W?\\w+?)+)+\\.\\w{3,4}\">)", RegexOptions.IgnoreCase | RegexOptions.Multiline ); while (m.Success) { string BinaryText = m.Value; Match mExt = Regex.Match( _xmlBinaries, "(?<=\\.)(\\w{3,4})", RegexOptions.IgnoreCase | RegexOptions.Multiline ); string ContentType = string.Empty; if (mExt.Success) { switch (mExt.Value) { case "png": ContentType = "content-type=\"image/png\""; break; default: ContentType = "content-type=\"image/jpeg\""; break; } } if (!string.IsNullOrWhiteSpace(ContentType)) { string resultBinaryTag = string.Format( "{0}{1} {2}", m.Groups[1].Captures[0].Value, ContentType, m.Groups[2].Captures[0].Value ); if (resultBinaryTag != BinaryText) { _xmlBinaries = _xmlBinaries.Replace(BinaryText, resultBinaryTag); } } m = m.NextMatch(); } } catch (RegexMatchTimeoutException /*exp*/) {} catch (Exception ex) { Debug.DebugMessage( _FilePath, ex, "BinaryCorrector:\r\nОбработка <binary>, в которых отсутствует аттрибут content-type." ); } // обработка ссылок в данных тега binary try { Match m = Regex.Match( _xmlBinaries, _regStringForBinaryTag, RegexOptions.IgnoreCase | RegexOptions.Multiline ); while (m.Success) { string sourceRinaryTag = m.Value; // обработка ссылок LinksCorrector linksCorrector = new LinksCorrector(_FilePath, sourceRinaryTag); string resultBinaryTag = linksCorrector.correct(); if (resultBinaryTag != sourceRinaryTag) { _xmlBinaries = _xmlBinaries.Replace(sourceRinaryTag, resultBinaryTag); } m = m.NextMatch(); } } catch (RegexMatchTimeoutException /*exp*/) {} catch (Exception ex) { Debug.DebugMessage( _FilePath, ex, "BinaryCorrector:\r\nОбработка ссылок в данных тега <binary>." ); } return(_xmlBinaries); }
/// <summary> /// Автокорректировка текста строки InputString /// </summary> /// <param name="FilePath">Путь к обрабатываемому файлу</param> /// <param name="InputString">Строка для корректировки</param> /// <returns>Откорректированную строку типа string</returns> private static string _autoCorrect(string FilePath, string InputString) { if (string.IsNullOrWhiteSpace(InputString) || InputString.Length == 0) { return(InputString); } try { // Удаление пустышек типа <body name="notes"><title><p>Примечания</p></title></body> try { InputString = Regex.Replace( InputString, "(?:<body +?name=\"notes\">\\s*<title>\\s*(?:(?:<p>(?:(?:\\w+?\\W?\\w+?)+)</p>){1,}\\s*){1,}</title>\\s*</body>)", "", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\"><title><p>Примечания</p></title></body>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\"><title><p>Примечания</p></title></body>. Исключение RegexMatchTimeoutException." ); } // Удаление пустышек типа <body name="notes" /> try { InputString = Regex.Replace( InputString, "<body name=\"notes\" ?/>", "", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\" />. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустышек типа <body name=\"notes\" />. Исключение Exception." ); } // Обработка блоков типа <p></section> => </section> try { InputString = Regex.Replace( InputString, "(?:<p>\\s*?)(?'tag'</section>)", "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <p></section> => </section>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <p></section> => </section>. Исключение Exception." ); } // Обработка блоков типа <title></p> => <title> try { InputString = Regex.Replace( InputString, "(?'tag'<title>\\s*?)(?:</p>)", "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <title></p> => <title>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа <title></p> => <title>. Исключение Exception." ); } // Обработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle> try { InputString = Regex.Replace( InputString, "(?'title'</title>)(?:\\s*?<empty-line />\\s*?</section>\\s*?)(?'_p'(?:<p>)|(?:<subtitle>))", "${title}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков типа </title><empty-line /></section><p> => </title><p> или </title><empty-line /></section><subtitle> => </title><subtitle>. Исключение Exception." ); } /******************** * Обработка ссылок * *******************/ // обработка ссылок if (InputString.IndexOf("<a ", StringComparison.CurrentCulture) != -1) { LinksCorrector linksCorrector = new LinksCorrector(FilePath, InputString); InputString = linksCorrector.correct(); } /**************************** * Обработка <empty-line /> * ***************************/ if (InputString.IndexOf("<empty-line/>", StringComparison.CurrentCulture) != -1 || InputString.IndexOf("<empty-line />", StringComparison.CurrentCulture) != -1) { EmptyLineCorrector emCorrector = new EmptyLineCorrector(FilePath, InputString); InputString = emCorrector.correct(); } /******************************************************************** * удаление пустых атрибутов xmlns="" в тегах body, title и section * ********************************************************************/ // удаление пустого атрибута xmlns="" в тегах body и section try { InputString = Regex.Replace( InputString, "(?<=<)(?'tag'body|section|title)(?:\\s+?xmlns=\"\"\\s*?)(?=>)", "${tag}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустого атрибута xmlns=\"\" в тегах body и section. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление пустого атрибута xmlns=\"\" в тегах body и section. Исключение Exception." ); } // удаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:xlink="http://www.w3.org/1999/xlink"> try { InputString = Regex.Replace( InputString, "(?<=<body) \\b(xmlns|l)\\b:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" \\b(xmlns|l)\\b:xlink=\"http://www.w3.org/1999/xlink\"(?=>)", "", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\". Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление ненужных атрибутов в теге <body> в ситуации: xmlns:fb=\"http://www.gribuser.ru/xml/fictionbook/2.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\". Исключение Exception." ); } /*********************** * Обработка <section> * ***********************/ // Удаление "пустышек": <section><empty-line /><empty-line /></section> try { InputString = Regex.Replace( InputString, "(<section>)\\s*?(<empty-line />\\s*?){1,}\\s*?(</section>)", "", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <section>.\r\nУдаление \"пустышек\": <section><empty-line /><empty-line /></section>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <section>.\r\nУдаление \"пустышек\": <section><empty-line /><empty-line /></section>. Исключение Exception." ); } /**************************** * Обработка болоков сносок * ****************************/ // Обработка блоков сносок типа <section id="id20150519063123_1"><title><p>1</p></title></section> => // <section id="id20150519063123_1"><title><p>1</p></title><empty-line /></section> try { InputString = Regex.Replace( InputString, "(?'start'<section id=\"(:?(:?\\w+?\\W?\\w+?)+?)+\">\\s*?<title>\\s*?<p>\\d{1,5}</p>\\s*?</title>\\s*?)(?'end'</section>)", "${start}<empty-line />${end}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков сносок типа <section id=\"id20150519063123_1'\"><title><p>1</p></title></section> => <section id=\"id20150519063123_1\"><title><p>1</p></title><empty-line /></section>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка блоков сносок типа <section id=\"id20150519063123_1'\"><title><p>1</p></title></section> => <section id=\"id20150519063123_1\"><title><p>1</p></title><empty-line /></section>. Исключение Exception." ); } /********************* * Обработка графики * ********************/ if (InputString.IndexOf("<image", StringComparison.CurrentCulture) != -1) { ImageCorrector imageCorrector = new ImageCorrector(FilePath, ref InputString, false, false); InputString = imageCorrector.correct(); } /************************** * Обработка цитат <cite> * **************************/ if (InputString.IndexOf("<cite", StringComparison.CurrentCulture) != -1) { CiteCorrector citeCorrector = new CiteCorrector(FilePath, ref InputString, false, false); InputString = citeCorrector.correct(); } // Создание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p> try { InputString = Regex.Replace( InputString, @"(?'left'(?:<empty-line ?/>|</p>|<section>|</title>))\s*?(?'text_a'(?:<text-author>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</text-author>\s*?){1,})\s*?(?'right'(?:<p>|</section>|<empty-line ?/>))", "${left}<cite>${text_a}</cite>${right}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nСоздание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nСоздание цитаты для текста автора, идущего после тега </p> или <empty-line />: </p><text-author>Автор</text-author><p>Текст</p> => </p><cite><text-author>Автор</text-author></cite><p>Текст</p>. Исключение Exception." ); } /************************************** * Обработка подзаголовков <subtitle> * **************************************/ // обработка подзаголовков <subtitle> (<subtitle>\n<p>\nТекст\n</p>\n</subtitle>) try { InputString = Regex.Replace( InputString, @"(?'tag_start'<subtitle>)\s*<p>\s*(?'text'.+?)\s*</p>\s*(?'tag_end'</subtitle>)", "${tag_start}${text}${tag_end}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle>. Исключение Exception." ); } // обработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph> try { InputString = Regex.Replace( InputString, @"</section>\s*?<section>\s*?<subtitle>\s*?(?'sub'[^<]+?)\s*?</subtitle>\s*?<epigraph>", "</section><section><title><p>${sub}</p></title><epigraph>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка подзаголовков <subtitle> </section><section><subtitle>Текст</subtitle><epigraph> => </section><section><title><p>Текст</p></title><epigraph>. Исключение Exception." ); } /************************ * Обработка <epigraph> * ************************/ if (InputString.IndexOf("<epigraph", StringComparison.CurrentCulture) != -1) { EpigraphCorrector epigraphCorrector = new EpigraphCorrector(FilePath, ref InputString, true, false); InputString = epigraphCorrector.correct(); } /********************* * Обработка <title> * ********************/ if (InputString.IndexOf("<title", StringComparison.CurrentCulture) != -1) { TitleCorrector titleCorrector = new TitleCorrector(FilePath, ref InputString, true, false); InputString = titleCorrector.correct(); } /************************** * Обработка <annotation> * *************************/ // Обработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation> try { InputString = Regex.Replace( InputString, @"<(?'tag'annotation|cite)\b>\s*?<(?'format'i|b|emphasis|strong)\b>\s*?(?'text'[^<]+?\s*)</\k'format'>\s*?</\k'tag'>", "<${tag}><p>${text}</p></${tag}>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка <annotation><i>text</i></annotation> => <annotation><p>text</p></annotation>. Исключение Exception." ); } // Удаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation> try { InputString = Regex.Replace( InputString, @"(?<=<section>)\s*(?:<empty-line */>\s*){1,}\s*(?=<annotation>)", "", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nУдаление <empty-line /> между <section> и <annotation>: <section><empty-line /><annotation> => <section><annotation>. Исключение Exception." ); } // Вставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section> try { InputString = Regex.Replace( InputString, @"(?'ann'</annotation>)(\s*)(?'end_sect'</section>)", "${ann}<empty-line />${end_sect}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВставка <empty-line /> между </annotation> и </section>: </annotation></section> => </annotation><empty-line /></section>. Исключение Exception." ); } /******************** * Обработка Стихов * ********************/ if (InputString.IndexOf("<poem", StringComparison.CurrentCulture) != -1) { StanzaCorrector stanzaCorrector = new StanzaCorrector(FilePath, ref InputString, false, false); InputString = stanzaCorrector.correct(); PoemCorrector poemCorrector = new PoemCorrector(FilePath, ref InputString, false, false); InputString = poemCorrector.correct(); } /**************************** * Обработка форматирования * ***************************/ // Обработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p> try { InputString = Regex.Replace( InputString, "(?:(?'format'<(?'tag'strong|emphasis)>)\\s*?){2}(?'p'(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>))\\s*?(?'text'(?:[^<]+))?(?'_p'(?:</p>))\\s*?(?'_format'</\\k'tag'>)\\s*?\\k'_format'", "${p}${format}${text}${_format}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nОбработка вложенных друг в друга тегов strong или emphasis: <emphasis><emphasis><p>text</p></emphasis></emphasis> => <p><emphasis>text</emphasis></p>. Исключение Exception." ); } // внесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p> try { InputString = Regex.Replace( InputString, "(?'format'<(?'tag'strong|emphasis)>)\\s*?(?'p'(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>))\\s*?(?'text'(?:[^<]+))?(?'_p'(?:</p>))\\s*?(?'_format'</\\k'tag'>)\\s*?", "${p}${format}${text}${_format}${_p}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВнесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nВнесение тегов strong или emphasis в теги <p> </p>: <emphasis><p>text</p></emphasis> => <p><emphasis>text</emphasis></p>. Исключение Exception." ); } // замена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite> try { InputString = Regex.Replace( InputString, "(?:<(?'tag'strong|emphasis)>)\\s*?(?'text'(?:(?:<p(?:(?:[^>\"']|\"[^\"]*\"|'[^']*')*)>)\\s*?(?:[^<]+)?(?:</p>)\\s*?){2,})(?:</\\k'tag'>)", "<cite>${text}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nЗамена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite>. Исключение RegexMatchTimeoutException." ); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nЗамена тегов <strong> или <emphasis>, обрамляющих множественный текст на Цитату: <emphasis><p>Текст</p><p>Текст</p></emphasis> => <cite><p>Текст</p><p>Текст</p></cite>. Исключение Exception." ); } /******************** * Обработка Таблиц * *******************/ if (InputString.IndexOf("<table", StringComparison.CurrentCulture) != -1) { TableCorrector tableCorrector = new TableCorrector(FilePath, ref InputString, false, false); InputString = tableCorrector.correct(); } /********************** * Обработка тега <p> * *********************/ ParaCorrector paraCorrector = new ParaCorrector(FilePath, ref InputString, false, false); InputString = paraCorrector.correct(); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "FB2AutoCorrector._autoCorrect()\r\nАвтокорректировка текста. Метод _autoCorrect( string InputString ). Ошибка уровня всего метода (главный catch (Exception ex))." ); } return(InputString); }