/// <summary> /// Метод-обработчик парных тэгов, вызывающий конкретный обработчик для конкретных тэгов (IWorker Worker) /// </summary> /// <returns>Откорректированную строку типа string </returns> public string Work() { TagPair tagPair = new TagPair(); List <int> PairTagIndexes = new List <int>(); int indexOfTag = _xmlText.IndexOf(_startTag, StringComparison.CurrentCulture); do { tagPair.clear(); ++tagPair.StartTagCount; tagPair.StartTagPosition = indexOfTag; if (!PairTagIndexes.Contains(tagPair.StartTagPosition)) { PairTagIndexes.Add(tagPair.StartTagPosition); } else { break; } tagPair.getPairTextAndTags(_xmlText, _startTag, _endTag); int Index = 0; _worker.DoWork(ref tagPair, ref _xmlText, ref Index); indexOfTag = (tagPair.EndTagPosition < _xmlText.Length) ? _xmlText.IndexOf(_startTag, Index, StringComparison.CurrentCulture) : -1; } while(indexOfTag != -1); return(_xmlText); }
/// <summary> /// Обработчик найденных парных тегов Заголовка /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; if (tagPair.PreviousTag.Equals("</p>") && tagPair.NextTag.Equals("<p>")) { // вставка тегов </section><section>: <p>Text</p><title><p><strong>Text</strong></p></title><p> => <p>Text</p></section><section><title><p><strong>Text</strong></p></title><p> NewTag = "</section><section>" + tagPair.PairTag; } else if (tagPair.PreviousTag.Equals("<section>") && tagPair.NextTag.Equals("</section>")) { // Вставка <empty-line/> между </title> и <section> (Заголовок Книги игнорируется): <section><title><p><strong>Название</strong></p><p>главы</p></title></section> try { NewTag = Regex.Replace( NewTag, @"(?'title_text_end_title'<title>\s*?(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?\s*?(?:[^<]+)?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?</title>)", "${title_text_end_title}<empty-line/>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("TitleCorrector:\r\nВставка <empty-line/> между </title> и <section> (Заголовок Книги игнорируется): <section><title><p><strong>Название</strong></p><p>главы</p></title></section>>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } } else if (tagPair.PreviousTag.Equals("</cite>") && tagPair.NextTag.Equals("<p>")) { // вставка тегов </section><section>: </cite><title><p>Текст</p><p><strong>Текст</strong></p></title><p>Текст</p> => </cite></section><section><title><p>Текст</p><p><strong>Текст</strong></p></title><p>Текст</p> NewTag = "</section><section>" + tagPair.PairTag; } else if (tagPair.PreviousTag.Equals("<body>") && tagPair.NextTag.Equals("<section>")) { // замена <v> ... </v> в Заголовке книги на <p> ... </p> NewTag = NewTag.Replace("<v>", "<p>").Replace("</v>", "</p>"); } else { // замена <subtitle>Text</subtitle> внутри тегов <title на <p>Text</p> NewTag = NewTag.Replace("<subtitle>", "<p>").Replace("</subtitle>", "</p>"); } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов Цитаты /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // Обрамление картинки тегами <p> ... </p> try { NewTag = Regex.Replace( NewTag, "(?<!<text-author>)(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)(?!</text-author>)", "<p>${img}</p>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("CiteCorrector:\r\nОбрамление картинки тегами <p> ... </p>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } if (tagPair.StartTagCount == 2) { // Удаление <cite> вокруг <text-author> в Цитате: <cite><p>Текст</p><p>Текст</p><cite><text-author>Автор Цитаты</text-author></cite></cite> => <cite><p>Текст</p><p>Текст</p><text-author>Автор Цитаты</text-author></cite> try { NewTag = Regex.Replace( NewTag, @"(?<=<cite>)\s*?(?'p'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<cite>\s*?(?'ta'<text-author>\s*?(<(?'tag1'emphasis|strong)\b>)?(?'author'[^<]+)(</\k'tag1'>)?\s*?</text-author>)\s*?</cite>\s*?(?=</cite>)", "${p}${ta}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("CiteCorrector:\r\nУдаление <cite> вокруг <text-author> в Цитате: <cite><p>Текст</p><p>Текст</p><cite><text-author>Автор Цитаты</text-author></cite></cite> => <cite><p>Текст</p><p>Текст</p><text-author>Автор Цитаты</text-author></cite>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов poem /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // Преобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem> try { Match m = Regex.Match( NewTag, "(?:<poem>)\\s*?(?:(?:<p>\\s*?(?'text'(?:(?:[=~\"'\\`«»\\\\^\\$-\\+\\-\\—\\–.,~!?:;&#@№%\\*\\(\\)\\{\\}\\[\\]/…\\w\\d]\\s*?){1,}))</p>){1,}\\s*?){1,}\\s*?(?:</poem>)", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if (m.Success) { string sSource = m.Value; string sResult = m.Value; sResult = sResult.Replace("<p>", "<v>").Replace("</p>", "</v>"); sResult = sResult.Replace("<poem>", "<poem><stanza>").Replace("</poem>", "</stanza></poem>"); if (sResult != sSource) { NewTag = NewTag.Replace(sSource, sResult); } } } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("PoemCorrector:\r\nПреобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов poem /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // Преобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem> try { Match m = Regex.Match( NewTag, "(?:<poem>)\\s*?(?:(?:<p>\\s*?(?'text'(?:(?:[=~\"'\\`«»\\\\^\\$-\\+\\-\\—\\–.,~!?:;&#@№%\\*\\(\\)\\{\\}\\[\\]/…\\w\\d]\\s*?){1,}))</p>){1,}\\s*?){1,}\\s*?(?:</poem>)", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if (m.Success) { string sSource = m.Value; string sResult = m.Value; sResult = sResult.Replace("<p>", "<v>").Replace("</p>", "</v>"); sResult = sResult.Replace("<poem>", "<poem><stanza>").Replace("</poem>", "</stanza></poem>"); if (sResult != sSource) { NewTag = NewTag.Replace(sSource, sResult); } } } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "PoemCorrector:\r\nПреобразование <poem><p>...</p><p>...</p></poem> в <poem><stanza><v>...</v><v>...</v></stanza></poem>." ); } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов Таблиц /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // преобразование таблиц: <tr><image l:href="#image3.png" /><empty-line /></tr> и <tr><image l:href="#image3.png" /></tr> => <tr><td><image l:href="#image3.png" /></td></tr> try { NewTag = Regex.Replace( NewTag, "(?:<tr>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)", "<tr><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("TableCorrector:\r\nПреобразование таблиц: <tr><image l:href=\"#image3.png\" /><empty-line /></tr> и <tr><image l:href=\"#image3.png\" /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } // преобразование таблиц: <tr><td /><image l:href="#image3.png" /><empty-line /></tr> => <tr><td><image l:href="#image3.png" /></td></tr> try { NewTag = Regex.Replace( NewTag, "(?:<tr>\\s*?<td ?/>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)", "<tr><td/><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("TableCorrector:\r\nПреобразование таблиц: <tr><td /><image l:href=\"#image3.png\" /><empty-line /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } // преобразование таблиц: <table><image l:href="#image37.png" /><empty-line /><tr> => <table><tr><td><image l:href="#image37.png" /></td></tr><tr> try { NewTag = Regex.Replace( NewTag, "(?'table'<table>)\\s*?(?'img'(?:<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>\\s*?){1,})\\s*?<empty-line ?/>\\s*?(?'tr'<tr>)", "${table}<tr><td>${img}</td></tr>${tr}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("TableCorrector:\r\nПреобразование таблиц: <table><image l:href=\"#image37.png\" /><empty-line /><tr> => <table><tr><td><image l:href=\"#image37.png\" /></td></tr><tr>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } // преобразование таблиц: <table><tr><td /><image l:href="#image2.jpg" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href="#image2.jpg" /></td></tr><tr><td>Текст</td></tr></table> try { NewTag = Regex.Replace( NewTag, "(?'table'<table>\\s*<tr>)\\s*<td ?/>\\s*(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)\\s*<empty-line ?/>\\s*(?'_tr_table'</tr>\\s*<tr>\\s*<td>.+</td>\\s*</tr>\\s*</table>)", "${table}<td>${img}</td>${_tr_table}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("TableCorrector:\r\nПреобразование таблиц: <table><tr><td /><image l:href=\"#image2.jpg\" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href=\"#image2.jpg\" /></td></tr><tr><td>Текст</td></tr></table>.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов stanza /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // замена тегов <p>, </p> на <v>, </v> в стихах NewTag = NewTag.Replace("<p>", "<v>").Replace("</p>", "</v>"); // преобразование тегов <v> в <title> обратно в <p> try { Match m = Regex.Match( NewTag, @"(?:<title>\s*?.+?\s*?</title>)", RegexOptions.IgnoreCase | RegexOptions.Multiline ); if (m.Success) { string sSource = m.Value; string sResult = m.Value; sResult = sResult.Replace("<v>", "<p>").Replace("</v>", "</p>"); if (sResult != sSource) { NewTag = NewTag.Replace(sSource, sResult); } } } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "StanzaCorrector:\r\nПреобразование тегов <v> в <title> обратно в <p>:." ); } // обработка <empty-line /> между строфами: // <v>Строфа</v><v>Строфа</v><empty-line /><v>Строфа</v><v>Строфа</v> => <v>Строфа</v><v>Строфа</v></stanza><stanza><v>Строфа</v><v>Строфа</v> try { NewTag = Regex.Replace( NewTag, @"(?'v'<v>.+?</v>)\s*?<empty-line ?/>\s*?(?'v1'<v>.+?</v>)", "${v}</stanza><stanza>${v1}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "StanzaCorrector:\r\nОбработка <empty-line /> между строфами: <v>Строфа</v><v>Строфа</v><empty-line /><v>Строфа</v><v>Строфа</v> => <v>Строфа</v><v>Строфа</v></stanza><stanza><v>Строфа</v><v>Строфа</v>." ); } // обработка строф с эпиграфом: // <poem><stanza><epigraph><v><v>Строфа</v></v></epigraph></stanza></poem> => <poem><stanza><v>Строфа</v></stanza></poem> try { NewTag = Regex.Replace( NewTag, @"<epigraph>\s*?<v>\s*?(?'v'<v>[^<]+?</v>)\s*?</v>\s*?</epigraph>", "${v}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "StanzaCorrector:\r\nОбработка строф с эпиграфом: <poem><stanza><epigraph><v><v>Строфа</v></v></epigraph></stanza></poem> => <poem><stanza><v>Строфа</v></stanza></poem>." ); } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов Эпиграфа /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; if (tagPair.PreviousTag.Equals("</p>")) { if (tagPair.NextTag.Equals("<p>")) { // Преобразование вложенных друг в друга тегов epigraph в Автора: <epigraph><epigraph><p>Иванов</p></epigraph></epigraph> => <cite><text-author><p>Иванов</p></text-author></cite> try { NewTag = Regex.Replace( NewTag, @"(?:(?:<(?'tag'epigraph)\b>\s*?){2})(?:<p>\s*?)(?'text'(?:<(?'tag1'strong|emphasis)\b>)?\s*?(?:[^<]+)(?:</\k'tag1'>)?)(?:\s*?</p>)(?:\s*?</\k'tag'>){2}", "<${tag}><text-author>${text}</text-author></${tag}>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование вложенных друг в друга тегов epigraph в Автора: <epigraph><epigraph><p>Иванов</p></epigraph></epigraph> => <cite><text-author><p>Иванов</p></text-author></cite>." ); } } // замена epigraph на cite: <p>Text</p><epigraph><p><strong>Text</strong></p></epigraph> => <p>Text</p><cite><p><strong>Text</strong></p></cite> NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>"); } else { if (tagPair.StartTagCount == 1) { if (tagPair.PreviousTag.Equals("</subtitle>") || tagPair.PreviousTag.Equals("</subtitle><empty-line/>") || tagPair.PreviousTag.Equals("</subtitle><empty-line />")) { // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Текст</emphasis></p><emphasis><p>Достоевский</p></emphasis></emphasis></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag1'strong|emphasis)\b>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?)(?:<(?'tag2'emphasis|strong)\b>)\s*?(?'p'<p>)(?'author'[^<]+?)(?'_p'</p>\s*?)</\k'tag2'>\s*?</\k'tag1'>(?:\s*?</epigraph>)", "<cite>${texts}<text-author><${tag2}>${author}</${tag2}></text-author></cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Текст</emphasis></p><emphasis><p>Достоевский</p></emphasis></emphasis></epigraph>." ); } // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><p>Текст</p></epigraph> // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><p>Текст</p></epigraph> // @"(?:<epigraph>\s*?)(?'texts'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?(?:\s*?</epigraph>)" try { NewTag = Regex.Replace( NewTag, @"(?:<epigraph>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,})(?:\s*?</epigraph>)", "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><p>Текст</p></epigraph>\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><p>Текст</p></epigraph>." ); } // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><emphasis><p>Текст</p></emphasis></epigraph> // Преобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><emphasis><p>Текст</p></emphasis></epigraph> // @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?</\k'tag'>(?:\s*?</epigraph>)" try { NewTag = Regex.Replace( NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,})\s*?</\k'tag'>(?:\s*?</epigraph>)", "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><empty-line/><epigraph><emphasis><p>Текст</p></emphasis></epigraph>\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>Текст</subtitle><epigraph><emphasis><p>Текст</p></emphasis></epigraph>." ); } // Преобразование Эпиграфа в Цитату в случае </subtitle><epigraph><p>Текст</p><text-author>Автор</text-author></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?:<epigraph>\s*?)(?'texts'(?:<p>\s*?.+?\s*?</p>\s*?){1,}\s*?(?:<text-author>\s*?.+?\s*?</text-author>\s*?))(?:\s*?</epigraph>)", "<cite>${texts}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае </subtitle><epigraph><p>Текст</p><text-author>Автор</text-author></epigraph>." ); } } else if (tagPair.PreviousTag.Equals("</section>") && tagPair.NextTag.Equals("<section>")) { // обрамление Эпиграфа тегами <section> ... <empty-line /></section> в случае если до Эпиграфа стоит тег </section>, а после Эпиграфа - тег <section> : </section><epigraph><p>Текст</p><p>Текст</p></epigraph><section> => </section><section><epigraph><p>Текст</p><p>Текст</p></epigraph><empty-line/></section><section> NewTag = "<section>" + NewTag + "<empty-line /></section>"; } else if (tagPair.PreviousTag.Equals("</title>") || tagPair.PreviousTag.Equals("<section>")) { // Обработка Эпиграфа с Аннотацией в случае: </title><epigraph><annotation><p>Текст.</p><p>Текст.</p><empty-line /><p>Текст</p><p><emphasis>Текст</emphasis></p><p>Текст</p></annotation></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?'epigraph'<epigraph>)(?:\s*?)(?:<annotation>\s*)(?'text'\s*?.+?\s*?)(?:</annotation>\s*?)(?'_epigraph'</epigraph>)", "${epigraph}${text}${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с Аннотацией в случае: </title><epigraph><annotation><p>Текст.</p><p>Текст.</p><empty-line /><p>Текст</p><p><emphasis>Текст</emphasis></p><p>Текст</p></annotation></epigraph>." ); } } else if (tagPair.PreviousTag.IndexOf("<empty-line />", StringComparison.CurrentCulture) != -1 || tagPair.PreviousTag.IndexOf("<empty-line/>", StringComparison.CurrentCulture) != -1) { // замена epigraph на cite в случае, если перед простым Эпиграфом находится </p><empty-line /> NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>"); } else if (tagPair.PreviousTag.Equals("</cite>") || tagPair.PreviousTag.Equals("</poem>")) { // замена epigraph на cite в случае, если перед простым Эпиграфом находится </p><empty-line /> NewTag = NewTag.Replace("<epigraph>", "<cite>").Replace("</epigraph>", "</cite>"); } else if (tagPair.PreviousTag.Equals("</annotation>")) { // обрамление Эпиграфа тегами <section> ... <empty-line /></section> NewTag = "<section>" + NewTag + "<empty-line /></section>"; } } else if (tagPair.StartTagCount == 2) { if (tagPair.PreviousTag.Equals("</subtitle>") || tagPair.PreviousTag.Equals("</subtitle><empty-line/>") || tagPair.PreviousTag.Equals("</subtitle><empty-line />")) { // Преобразование Эпиграфа в Цитату в случае <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Этот стих звучит так:</emphasis></p><epigraph><p><emphasis>И счастья баловень безродный</emphasis></p><p><emphasis>Полудержавный властелин.</emphasis></p></epigraph></emphasis></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?:<epigraph>\s*?)(?:<(?'tag'strong|emphasis)\b>\s*?)(?'texts1'(<p>\s*?(?:<(?'tag1'strong|emphasis)\b>)?[^<]+?(?:</\k'tag1'>)?\s*?</p>\s*?){1,})\s*?(<epigraph>\s*?)(?'texts2'(<p>\s*?(?:<(?'tag2'strong|emphasis)\b>)?[^<]+?(?:</\k'tag2'>)?\s*?</p>\s*?){1,})\s*?(?:</epigraph>\s*?)</\k'tag'>\s*?(?:</epigraph>)", "<cite>${texts1}${texts2}</cite>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nПреобразование Эпиграфа в Цитату в случае <subtitle>...</subtitle><epigraph><emphasis><p><emphasis>Этот стих звучит так:</emphasis></p><epigraph><p><emphasis>И счастья баловень безродный</emphasis></p><p><emphasis>Полудержавный властелин.</emphasis></p></epigraph></emphasis></epigraph>." ); } } else if (tagPair.PreviousTag.Equals("</title>") || tagPair.PreviousTag.Equals("<section>") || tagPair.PreviousTag.Equals("</epigraph>")) { // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><p>Достоевский</p></emphasis></epigraph></epigraph><epigraph> try { NewTag = Regex.Replace( NewTag, @"(?'epigraph'<epigraph>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(?:\s*?<p>)(?'author'[^<]+?)(?:</p>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)", "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><p>Достоевский</p></emphasis></epigraph></epigraph><epigraph>." ); } // обработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><emphasis>Достоевский</emphasis></emphasis></epigraph></epigraph><epigraph> try { NewTag = Regex.Replace( NewTag, @"(?'epigraph'<epigraph>\s*?)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(\s*?<(?'tag_a'emphasis|strong)>)(?'author'[^<]+?)(?:</\k'tag_a'>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)", "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом вместо Автора эпиграфа: <epigraph><p>Текст</p><p>Текст</p><epigraph><emphasis><emphasis>Достоевский</emphasis></emphasis></epigraph></epigraph><epigraph>." ); } // обработка Эпиграфа с текстом и Эпиграфом вместо Автора эпиграфа: <epigraph><p><emphasis>Текст</emphasis></p><p>Текст</p><epigraph><p><emphasis>Достоевский</emphasis></p></epigraph></epigraph><epigraph> try { NewTag = Regex.Replace( NewTag, @"(?'epigraph'<epigraph>\s*)(?'texts'(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*?)<epigraph>\s*<p>\s*(?:<(?'tag1'strong|emphasis)\b>\s*?)(?'author'[^<]+?)</\k'tag1'>\s*</p>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)", "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); // } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с текстом и Эпиграфом вместо Автора эпиграфа: <epigraph><p><emphasis>Текст</emphasis></p><p>Текст</p><epigraph><p><emphasis>Достоевский</emphasis></p></epigraph></epigraph><epigraph>." ); } } // Обработка Эпиграфа вида: <epigraph><empty-line/><p>Текст</p><p>Текст.</p><epigraph><empty-line/><p><emphasis>Автор</emphasis> </p></epigraph></epigraph> => <epigraph><empty-line/><p>Текст</p><p>Текст.</p><text-author><emphasis>Автор</emphasis></text-author></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?<=<epigraph>)\s*(?'p'(?:<empty-line ?/>)?\s*(?:<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,}\s*(?:<empty-line ?/>)?\s*)(?:<epigraph>\s*(?:<empty-line ?/>)?\s*<p>)(?'author'<(?'tag1'strong|emphasis)>[^<]+</\k'tag1'>)(?: ?</p>\s*(?:<empty-line ?/>)?\s*</epigraph>\s*)(?=</epigraph>)", "${p}<text-author>${author}</text-author>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа вида: <epigraph><empty-line/><p>Текст</p><p>Текст.</p><epigraph><empty-line/><p><emphasis>Автор</emphasis> </p></epigraph></epigraph> => <epigraph><empty-line/><p>Текст</p><p>Текст.</p><text-author><emphasis>Автор</emphasis></text-author></epigraph>." ); } } else if (tagPair.StartTagCount == 3) { // обработка Эпиграфа с вложенным Эпиграфом и Эпиграфом вместо Автора эпиграфа: <epigraph><epigraph><p><strong>Текст</strong></p><p>Текст</p></epigraph><epigraph><emphasis><p>Автор</p></emphasis></epigraph></epigraph> try { NewTag = Regex.Replace( NewTag, @"(?'epigraph'<epigraph>\s*?)<epigraph>\s*?(?'texts'(<p>\s*?(?:<(?'tag'strong|emphasis)\b>)?[^<]+?(?:</\k'tag'>)?\s*?</p>\s*?){1,})\s*?</epigraph>\s*?<epigraph>\s*?<(?'tag1'emphasis|strong)\b>(\s*?<p>)(?'author'[^<]+?)(</p>\s*?)</\k'tag1'>\s*?</epigraph>\s*?(?'_epigraph'</epigraph>)", "${epigraph}${texts}<text-author><${tag1}>${author}</${tag1}></text-author>\n${_epigraph}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "EpigraphCorrector:\r\nОбработка Эпиграфа с вложенным Эпиграфом и Эпиграфом вместо Автора эпиграфа: <epigraph><epigraph><p><strong>Текст</strong></p><p>Текст</p></epigraph><epigraph><emphasis><p>Автор</p></emphasis></epigraph></epigraph>." ); } } } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }
/// <summary> /// Обработчик найденных парных тегов Таблиц /// </summary> /// <param name="tagPair">Экземпляр класса поиска парных тегов с вложенными тегами любой сложности вложения</param> /// <param name="XmlText">Текст строки для корректировки в xml представлении</param> /// <param name="Index">Индекс начала поиска открывающего тэга</param> public void DoWork(ref TagPair tagPair, ref string XmlText, ref int Index) { if (string.IsNullOrWhiteSpace(tagPair.PairTag)) { return; } string NewTag = tagPair.PairTag; // преобразование таблиц: <tr><image l:href="#image3.png" /><empty-line /></tr> и <tr><image l:href="#image3.png" /></tr> => <tr><td><image l:href="#image3.png" /></td></tr> try { NewTag = Regex.Replace( NewTag, "(?:<tr>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)", "<tr><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <tr><image l:href=\"#image3.png\" /><empty-line /></tr> и <tr><image l:href=\"#image3.png\" /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>." ); } // преобразование таблиц: <tr><td /><image l:href="#image3.png" /><empty-line /></tr> => <tr><td><image l:href="#image3.png" /></td></tr> try { NewTag = Regex.Replace( NewTag, "(?:<tr>\\s*?<td ?/>\\s*?)(?'img'<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>)\\s*?(?:<empty-line ?/>)?(?:\\s*?</tr>)", "<tr><td/><td>${img}</td></tr>", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <tr><td /><image l:href=\"#image3.png\" /><empty-line /></tr> => <tr><td><image l:href=\"#image3.png\" /></td></tr>." ); } // преобразование таблиц: <table><image l:href="#image37.png" /><empty-line /><tr> => <table><tr><td><image l:href="#image37.png" /></td></tr><tr> try { NewTag = Regex.Replace( NewTag, "(?'table'<table>)\\s*?(?'img'(?:<image [^<]+?(?:\"[^\"]*\"|'[^']*')?>\\s*?){1,})\\s*?<empty-line ?/>\\s*?(?'tr'<tr>)", "${table}<tr><td>${img}</td></tr>${tr}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <table><image l:href=\"#image37.png\" /><empty-line /><tr> => <table><tr><td><image l:href=\"#image37.png\" /></td></tr><tr>." ); } // преобразование таблиц: <table><tr><td /><image l:href="#image2.jpg" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href="#image2.jpg" /></td></tr><tr><td>Текст</td></tr></table> try { NewTag = Regex.Replace( NewTag, "(?'table'<table>\\s*<tr>)\\s*<td ?/>\\s*(?'img'<image[^/]+?(?:\"[^\"]*\"|'[^']*')?/>)\\s*<empty-line ?/>\\s*(?'_tr_table'</tr>\\s*<tr>\\s*<td>.+</td>\\s*</tr>\\s*</table>)", "${table}<td>${img}</td>${_tr_table}", RegexOptions.IgnoreCase | RegexOptions.Multiline ); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( tagPair.FilePath, ex, "TableCorrector:\r\nПреобразование таблиц: <table><tr><td /><image l:href=\"#image2.jpg\" /><empty-line /></tr><tr><td>Текст</emphasis></td></tr></table> => <table><tr><td><image l:href=\"#image2.jpg\" /></td></tr><tr><td>Текст</td></tr></table>." ); } Index = XmlText.IndexOf(tagPair.PairTag, tagPair.StartTagPosition, StringComparison.CurrentCulture) + NewTag.Length; XmlText = XmlText.Substring(0, tagPair.StartTagPosition) /* ДО обрабатываемого текста */ + NewTag + XmlText.Substring(tagPair.EndTagPosition); /* ПОСЛЕ обрабатываемого текста */ }