/// <summary> /// Автокорректировка теста файла FilePath /// </summary> /// <param name="FilePath">Путь к обрабатываемой книге</param> public static void autoCorrector(string FilePath) { if (string.IsNullOrWhiteSpace(FilePath)) { return; } FileInfo fi = new FileInfo(FilePath); if (!fi.Exists) { return; } if (fi.Length < 4) { return; } // обработка головного тега FictionBook и пространства имен FB2Text fb2Text = null; try { fb2Text = new FB2Text(FilePath); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "AutoCorrector.FB2AutoCorrector.autoCorrector():\r\nАвтокорректировка теста файла." ); // Если структура fb2 файла сильно "битая", или же основные разделы располагаются не по стандарту throw ex; } if (fb2Text.Description.IndexOf("<FictionBook", StringComparison.CurrentCulture) == -1) { // тег FictionBook отсутствует в книге FictionBookTagCorrector fbtc = new FictionBookTagCorrector(FilePath); fb2Text.Description = fb2Text.Description.Insert( fb2Text.Description.IndexOf("<description>", StringComparison.CurrentCulture), fbtc.NewFictionBookTag ); } // обработка неверного значения кодировки файла try { Regex regex = new Regex("(?<=encoding=\")(?:(?:wutf-8)|(?:utf8))(?=\")", RegexOptions.IgnoreCase); fb2Text.Description = regex.Replace(fb2Text.Description, "utf-8"); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "AutoCorrector.FB2AutoCorrector::autoCorrector():\r\nОбработка неверного значения кодировки файла." ); } /******************************************* * Автокорректировка раздела <description> * *******************************************/ fb2Text.Description = autoCorrectDescription(FilePath, fb2Text.Bodies, fb2Text.Description); /************************************* * Автокорректировка разделов <body> * *************************************/ fb2Text.Bodies = autoCorrect(FilePath, fb2Text.Bodies); /************************************* * Автокорректировка разделов binary * *************************************/ if (fb2Text.BinariesExists) { // обработка ссылок-названий картинок в binary BinaryCorrector binaryCorrector = new BinaryCorrector(FilePath, fb2Text.Binaries); fb2Text.Binaries = binaryCorrector.correct(); } try { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(fb2Text.toXML()); xmlDoc.Save(FilePath); } catch (Exception ex) { Debug.DebugMessage( FilePath, ex, "AutoCorrector.FB2AutoCorrector::autoCorrector():\r\nпересохранение файла." ); fb2Text.saveFile(); } }
/// <summary> /// Автокорректировка теста файла FilePath /// </summary> /// <param name="FilePath">Путь к обрабатываемой книге</param> public static void autoCorrector(string FilePath) { if (string.IsNullOrWhiteSpace(FilePath)) { return; } FileInfo fi = new FileInfo(FilePath); if (!fi.Exists) { return; } if (fi.Length < 4) { return; } // Хэш таблица fb2 тегов Hashtable htTags = FB2CleanCode.getTagsHashtable(); // обработка < > в тексте, кроме fb2 тегов // обработка головного тега FictionBook и пространства имен FB2Text fb2Text = new FB2Text(FilePath); if (fb2Text.Description.IndexOf("<FictionBook", StringComparison.CurrentCulture) == -1) { // тег FictionBook отсутствует в книге FictionBookTagCorrector fbtc = new FictionBookTagCorrector(); fb2Text.Description = fb2Text.Description.Insert( fb2Text.Description.IndexOf("<description>", StringComparison.CurrentCulture), fbtc.NewFictionBookTag ); } // обработка неверного значения кодировки файла try { Regex regex = new Regex("(?<=encoding=\")(?:(?:wutf-8)|(?:utf8))(?=\")", RegexOptions.IgnoreCase); fb2Text.Description = regex.Replace(fb2Text.Description, "utf-8"); } catch (RegexMatchTimeoutException /*ex*/) {} catch (Exception ex) { if (Settings.Settings.ShowDebugMessage) { // Показывать сообщения об ошибках при падении работы алгоритмов MessageBox.Show( string.Format("Обработка раздела <description>:\r\nОбработка неверного значения кодировки файла.\r\nОшибка:\r\n{0}", ex.Message), _MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Error ); } } /****************************************** * Автокорректировка раздела <description> * *******************************************/ fb2Text.Description = autoCorrectDescription(fb2Text.Bodies, fb2Text.Description, htTags); /* Автокорректировка разделов <body> */ fb2Text.Bodies = autoCorrect(fb2Text.Bodies, htTags); /* автокорректировка разделов binary */ if (fb2Text.BinariesExists) { // обработка ссылок-названий картинок в binary BinaryCorrector binaryCorrector = new BinaryCorrector(fb2Text.Binaries); fb2Text.Binaries = binaryCorrector.correct(); } try { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(fb2Text.toXML()); xmlDoc.Save(FilePath); } catch { fb2Text.saveFile(); } }