public static Sentence ParseSentenceString(string source, PunctuationMark endMark) { var sentence = new Sentence(); // Get split parts of the sentence var splitParts = source.Split(new char[] { ' ' }); foreach (var part in splitParts) { var sPart = part; // Get inner punctuation marks in the split part var innerPunctuationMarks = sPart.GetPunctuationMarks(DefaultPunctuationMarks.InternalPunctuationMarks); if (innerPunctuationMarks.Any()) { var sentenceParts = new List<ISingleTextElement>(); var compositeWord = new CompositeWord(); // If split part contains punctuation marks, split this part to single text elements foreach (var mark in innerPunctuationMarks) { var markLenght = mark.StringValue.Length; var index = sPart.IndexOfPunctuationMark(mark); var leftPart = sPart.Substring(0, index); if (!string.IsNullOrEmpty(leftPart)) { var word = new Word() { StringValue = leftPart }; compositeWord.Add(word); if (!sentenceParts.Contains(compositeWord)) sentenceParts.Add(compositeWord); } if(index == 0) { sentenceParts.Add(mark); } else if(index + markLenght < sPart.Length) { compositeWord.Add(mark); if (!sentenceParts.Contains(compositeWord)) sentenceParts.Add(compositeWord); } else { sentenceParts.Add(mark); } sPart = sPart.Substring(index + markLenght); } if (!string.IsNullOrEmpty(sPart)) { var word = new Word() { StringValue = sPart }; compositeWord.Add(word); if (!sentenceParts.Contains(compositeWord)) sentenceParts.Add(compositeWord); } // Add single text elements to sentence foreach(var sentencePart in sentenceParts) { if (sentencePart == sentenceParts.Last()) sentencePart.InnerOption = SingleTextElementInnerOption.RightSpace; sentence.Add(sentencePart); } } else { var word = new Word() { StringValue = sPart, InnerOption = SingleTextElementInnerOption.RightSpace }; sentence.Add(word); } } if (endMark.HasValue) { if(sentence.Last().InnerOption == SingleTextElementInnerOption.RightSpace) { sentence.Last().InnerOption = SingleTextElementInnerOption.None; } sentence.Add(endMark); } return sentence; }
public CompileState(CompositeWord compositeWord, SemicolonProc semicolonProc) { this.compositeWord = compositeWord; this.semicolonProc = semicolonProc; }