/// <summary> /// Анализ конца прямой речи. /// Если найдена открывающая кавычка, то будет создана прямая речь и в заданной строке она будет убрана /// </summary> /// <param name="builder">строка</param> /// <param name="directSpeechEnd">конец прямой речи</param> private void AnalyzeDirectSpeechEnd(StringBuilder builder, Match directSpeechEnd) { Group closeQuote = directSpeechEnd.Groups["quote"]; #region [.defense.] if (closeQuote.Value.Length != 1) { throw new ArgumentException("very long quote"); } #endregion string text = builder.ToString(); int shift = _saver.GetRealPositionShift(directSpeechEnd.Index); QuoteText quoteText = QuoteText.Create(text, closeQuote.Value.First(), closeQuote.Index - shift, directSpeechEnd.Index - shift, directSpeechEnd.Length); if (quoteText != null) { string replaceValue; if (TryCreateDirectSpeech(text, quoteText, out replaceValue)) { builder.Replace(quoteText.Content, replaceValue, quoteText.StartPosition, quoteText.Content.Length); } } }
/// <summary> /// Создание прямой речи /// </summary> /// <param name="text">текст</param> /// <param name="quoteText">текст в кавычках</param> /// <param name="replaceValue">значение, которым необходимо заменить текст в кавычках</param> /// <returns>флаг удалось ли выделить прямую речь</returns> private bool CreateSimpleDirectSpeech(string text, QuoteText quoteText, out string replaceValue) { bool result = false; replaceValue = quoteText.Content; if (IsDirectSpeech(quoteText.Content)) { result = true; replaceValue = ""; if (quoteText.NextNotEmpty.IsTire() && !Char.IsLetterOrDigit(quoteText.PreviousNotEmpty)) { SaveDirectSpeech( quoteText.Content, quoteText.StartPosition, default(char), text.CharOrDefault(quoteText.EndPosition)); } else if (quoteText.PreviousNotEmpty.Equals(':') && !QuoteText.OpenQuotes.Contains(quoteText.NextNotEmpty)) { SaveDirectSpeech( quoteText.Content, quoteText.StartPosition, text.CharOrDefault(quoteText.StartPosition - 1), default(char)); } else { replaceValue = quoteText.Content; result = false; } } return(result); }
/// <summary> /// Создание прямой речи со словами автора /// </summary> /// <param name="quoteText">текст в кавычках</param> /// <param name="authorWords">границы слов автора</param> /// <returns>значение, которым необходимо заменить текст в кавычках</returns> private string CreateDirectSpeechWithAuthorWords(QuoteText quoteText, TextPart authorWords) { SaveDirectSpeech( quoteText.Content.Substring(0, authorWords.Start), quoteText.StartPosition, default(char), quoteText.Content[authorWords.Start]); SaveDirectSpeech( quoteText.Content.Substring(authorWords.End), quoteText.StartPosition + authorWords.End - authorWords.Start, quoteText.Content[authorWords.End - 1], default(char)); return(quoteText.Content.Substring(authorWords.Start, authorWords.End - authorWords.Start)); }
/// <summary> /// Создание прямой речи /// </summary> /// <param name="text">текст</param> /// <param name="quoteText">текст в кавычках</param> /// <param name="replaceValue">значение, которым необходимо заменить текст в кавычках</param> /// <returns>флаг удалось ли выделить прямую речь</returns> private bool TryCreateDirectSpeech(string text, QuoteText quoteText, out string replaceValue) { bool result = false; var dashes = GetDashes(quoteText.Content); TextPart authorWords = new TextPart(); if (dashes.Length == 2) /// необходима проверка на наличие слов автора { authorWords = GetAuthorWords(quoteText.Content, dashes); } if (authorWords.Success) { replaceValue = CreateDirectSpeechWithAuthorWords(quoteText, authorWords); result = true; } else { result = CreateSimpleDirectSpeech(text, quoteText, out replaceValue); } return(result); }