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

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

            // обработка головного тега 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();
            }
        }
コード例 #2
0
        /// <summary>
        /// Автокорректировка теста файла FilePath
        /// </summary>
        /// <param name="FilePath">Путь к обрабатываемой книге</param>
        public static void autoCorrector(string FilePath)
        {
            if (string.IsNullOrWhiteSpace(FilePath))
            {
                return;
            }
            FileInfo fi = new FileInfo(FilePath);

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

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

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

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

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


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

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

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

            try {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(fb2Text.toXML());
                xmlDoc.Save(FilePath);
            } catch {
                fb2Text.saveFile();
            }
        }