コード例 #1
0
ファイル: ParagraphAnalyzer.cs プロジェクト: Igorious/DQ
        private void AnalyzeMainPartParagraph(DqParagraph dqParagraph, DqDocument dqDocument)
        {
            if (string.IsNullOrWhiteSpace(dqParagraph.Text.Replace("{IMG}", "").Replace("{TBL}", "").Replace("{PageBreak}", "")))
            {
                return;
            }

            if (dqParagraph.Meta.FigureDeclarations.Any())
            {
                if (dqParagraph.Style.FontSize > Settings.Default.ExpectedFontSize)
                {
                    dqParagraph.Meta.Errors.Add(new DqFontSizeError($"Неверный размер шрифта ({dqParagraph.Style.FontSize} пт). Подписи риcунков должны использовать шрифт не больше основного ({Settings.Default.ExpectedFontSize} пт)."));
                }
            }
            else if (dqParagraph.Meta.TableDeclarations.Any())
            {
                if (dqParagraph.Style.FontSize > Settings.Default.ExpectedFontSize)
                {
                    dqParagraph.Meta.Errors.Add(new DqFontSizeError($"Неверный размер шрифта ({dqParagraph.Style.FontSize} пт). Заголовки таблиц должны использовать шрифт не больше основного ({Settings.Default.ExpectedFontSize} пт)."));
                }
            }
            else if (dqParagraph.Meta.IsHeader)
            {
                if (dqParagraph.Style.FontSize < Settings.Default.ExpectedFontSize)
                {
                    dqParagraph.Meta.Errors.Add(new DqFontSizeError($"Неверный размер шрифта ({dqParagraph.Style.FontSize} пт). Заголовки должны использовать шрифт не меньше основного ({Settings.Default.ExpectedFontSize} пт)."));
                }

                if (dqParagraph.GetPureText().Trim().EndsWith("."))
                {
                    dqParagraph.Meta.Errors.Add(new DqError($"В конце заголовков точка не ставится."));
                }

                var number = Regex.Match(dqParagraph.GetPureText().TrimStart(), @"^((?:\d+\.)*\d+?)");
                if (number.Success && number.Value.EndsWith("."))
                {
                    dqParagraph.Meta.Errors.Add(new DqError($"В конце номера (под)раздела точка не ставится."));
                }
            }

            if (dqParagraph.Style.FontName != Settings.Default.ExpectedFontName)
            {
                dqParagraph.Meta.Errors.Add(new DqFontError($"Неверный шрифт ({dqParagraph.Style.FontName}). Иcпользуйте {Settings.Default.ExpectedFontName}."));
            }

            if (dqParagraph.Meta.IsHeader)
            {
                if (dqParagraph.Style.Aligment == DqAligment.Center || dqParagraph.Style.Aligment == DqAligment.Right)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Заголовки главной части должны быть выровнены по левому краю."));
                }
                else if (dqParagraph.Style.Indent == 0)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Отсутвует абзацный отступ."));
                }
            }
            else if (dqParagraph.Meta.FigureDeclarations.Any())
            {
                if (dqParagraph.Style.Aligment != DqAligment.Center)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Подпись рисунка должна быть выровнена по центру."));
                }
                else if (dqParagraph.Style.Indent != 0)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"При выравнивании по центру должен отсутвовать абзацный отступ."));
                }
            }
            else if (dqParagraph.Meta.TableDeclarations.Any())
            {
                if (dqParagraph.Style.Aligment == DqAligment.Center || dqParagraph.Style.Aligment == DqAligment.Right)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Заголовок таблицы должен быть выровнен по левому краю."));
                }
                else if (dqParagraph.Style.Indent != 0)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Заголовок таблицы помещают без абзацного отступа."));
                }
            }
            else if (!dqParagraph.Meta.IsHeader)
            {
                if (dqParagraph.Style.Indent == 0)
                {
                    dqParagraph.Meta.Errors.Add(new DqAlignmentError($"Отсутствует абзацный отступ."));
                }
            }

            if (dqParagraph.Style.SpacingBetweenLines != Settings.Default.ExpectedSpacingBetweenLines && !dqParagraph.Meta.IsHeader && !dqParagraph.Meta.FigureDeclarations.Any() && !dqParagraph.Meta.TableDeclarations.Any())
            {
                dqParagraph.Meta.Errors.Add(new DqError($"Неверный междустрочный интервал ({dqParagraph.Style.SpacingBetweenLines}). Ожидается {Settings.Default.ExpectedSpacingBetweenLines}-ый интервал."));
            }
        }
コード例 #2
0
        private void Analyze(DqParagraph dqParagraph)
        {
            var text = dqParagraph.GetPureText().Trim();

            var isSite = text.Contains("http:") || text.Contains("https:");

            var parts = Regex.Split(text, @"(\[Электронный ресурс\]|\[Electronic resource\])", RegexOptions.IgnoreCase);

            if (parts.Length == 1)
            {
                if (isSite)
                {
                    dqParagraph.Meta.Errors.Add(new DqError($"Электронный ресурс имеет неверный формат."));
                }
                return;
            }
            else
            {
                if (!isSite)
                {
                    dqParagraph.Meta.Errors.Add(new DqError($"Не найдена ссылка на ресурс!"));
                    return;
                }
            }

            var separator = parts[1];

            if (separator != "[Электронный ресурс]" && separator != "[Electronic resource]")
            {
                dqParagraph.Meta.Errors.Add(new DqError($"Часть «{separator}» имеет неверный регистр."));
            }

            var hasCyrillic = Regex.IsMatch(parts[0], @"\p{IsCyrillic}");
            var hasLatin    = Regex.IsMatch(parts[0], @"[a-zA-Z]");
            var isRu        = hasCyrillic;
            var isEn        = hasLatin && !hasCyrillic;

            if (isRu)
            {
                if (string.Equals(separator, "[Electronic resource]", StringComparison.OrdinalIgnoreCase))
                {
                    dqParagraph.Meta.Errors.Add(new DqWarning($"Название электронного ресурса содержит кириллицу. Возможно, следует использовать «[Электронный ресурс]» вместо «{separator}»."));
                }
            }

            if (isEn)
            {
                if (string.Equals(separator, "[Электронный ресурс]", StringComparison.OrdinalIgnoreCase))
                {
                    dqParagraph.Meta.Errors.Add(new DqWarning($"Название электронного ресурса содержит только латиницу. Возможно, следует использовать «[Electronic resource]» вместо «{separator}»."));
                }
            }

            var yearMatch = Regex.Match(parts[2], @"\d{4}\s*(г\.?|год)");

            if (yearMatch.Success)
            {
                dqParagraph.Meta.Errors.Add(new DqError($"При указании года слово «{yearMatch.Groups[1].Value}» не пишется."));
            }

            var modeOfAccess = Regex.Match(parts[2], @"(Режим доступа\s*:\s*|Mode of access\s*:\s*)");

            if (!modeOfAccess.Success)
            {
                dqParagraph.Meta.Errors.Add(new DqError($"Режим доступа не найден."));
                return;
            }

            var dateOfAccess = Regex.Match(parts[2], @"(Дата доступа\s*:\s*|Date of access\s*:\s*)(\d{2}\.\d{2}\.\d{4})");

            if (!dateOfAccess.Success)
            {
                dqParagraph.Meta.Errors.Add(new DqError($"Дата доступа не найдена."));
                return;
            }

            if (!modeOfAccess.Groups[1].Value.Contains(" : ") || !dateOfAccess.Groups[1].Value.Contains(" : "))
            {
                dqParagraph.Meta.Errors.Add(new DqError($"Перед и после двоеточия-разделителя ставится пробел («Режим доступа : », «Дата доступа : »)"));
            }
        }