public void OneSegPerVerse() { string pc1 = "Das buch ist rot. "; string verse1 = "9"; string pc2 = "Der Herr ist gross."; string verse2 = "10"; string pc3 = "Ich spreche nicht viel Deutsch."; ITsStrBldr bldr = m_tsf.MakeString(pc1 + verse1 + pc2 + verse2 + pc3, m_wsVern).GetBldr(); bldr.SetStrPropValue(pc1.Length, pc1.Length + verse1.Length, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); int ichV2 = pc1.Length + verse1.Length + pc2.Length; bldr.SetStrPropValue(ichV2, ichV2 + verse2.Length, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); m_para.Contents.UnderlyingTsString = bldr.GetString(); ParagraphParser pp = new ParagraphParser(m_para); List<int> eosIndexes; List<int> segments = pp.CollectSegmentAnnotations(m_para.Contents.UnderlyingTsString, out eosIndexes); Cache.VwCacheDaAccessor.CacheVecProp(m_para.Hvo, ktagParaSegments, segments.ToArray(), segments.Count); Assert.AreEqual(5, segments.Count); Assert.AreEqual("", AnnotationRefHandler.VerseSegLabel(m_para, 0, ktagParaSegments)); Assert.AreEqual("", AnnotationRefHandler.VerseSegLabel(m_para, 2, ktagParaSegments)); Assert.AreEqual("", AnnotationRefHandler.VerseSegLabel(m_para, 4, ktagParaSegments)); }
public void SegmentBreaks() { ITsStrFactory tsf = TsStrFactoryClass.Create(); ParagraphParser pp = new ParagraphParser(m_para); string test1 = "This is a simple sentence"; ITsString tss = tsf.MakeString(test1, 1); m_para.Contents.UnderlyingTsString = tss; List<int> results; List<int> segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[0], results, "no punct string"); Assert.AreEqual(1, segments.Count); VerifySegment(segments[0], 0, test1.Length, m_para.Hvo, "no punct string"); // Empty string. ITsString tssEmpty = tsf.MakeString("", 1); m_para.Contents.UnderlyingTsString = tssEmpty; segments = pp.CollectSegmentAnnotations(tssEmpty, out results); VerifyBreaks(new int[0], results, "empty string"); Assert.AreEqual(0, segments.Count); //String with multiple segments. string test2 = "This is a more complex sentence (ending with a 'quote')."; string test3 = " 2 "; string test4 = "This is the second sentence."; ITsString tssMulti = tsf.MakeString(test2 + test3 + test4, 1); m_para.Contents.UnderlyingTsString = tssMulti; segments = pp.CollectSegmentAnnotations(tssMulti, out results); VerifyBreaks(new int[] {test2.Length - 1, test2.Length + test3.Length + test4.Length - 1}, results, "multi-sentence string"); Assert.AreEqual(2, segments.Count); // The segments end and begin at the '2' in test3. VerifySegment(segments[0], 0, test2.Length + 2, m_para.Hvo, "first seg of multi-sentence"); VerifySegment(segments[1], test2.Length + 2, test2.Length + test3.Length + test4.Length, m_para.Hvo, "second seg of multi-sentence"); // String with embedded verse/chapter numbers (and implementation). ITsStrBldr bldr = tssMulti.GetBldr(); bldr.SetStrPropValue(test2.Length + 2, test2.Length + 3, (int) FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); ITsString tssMultiV = bldr.GetString(); m_para.Contents.UnderlyingTsString = tssMultiV; segments = pp.CollectSegmentAnnotations(tssMultiV, out results); VerifyBreaks(new int[] { test2.Length - 1, test2.Length + 4, test2.Length + test3.Length + test4.Length - 1 }, results, "multi-sentence string with verse"); Assert.AreEqual(3, segments.Count); // The segments end and begin at the '2' in test3. VerifySegment(segments[0], 0, test2.Length + 2, m_para.Hvo, "first seg of multi-sentence w. verse"); VerifySegment(segments[1], test2.Length + 2, test2.Length + 4, m_para.Hvo, "second seg of multi-sentence w. verse"); VerifySegment(segments[2], test2.Length + 4, test2.Length + test3.Length + test4.Length, m_para.Hvo, "third seg of multi-sentence w. verse"); string test6 = "13 1 "; string test7 = "121"; ITsString tssStartFinish = tsf.MakeString(test6 + test2 + test7, 1); bldr = tssStartFinish.GetBldr(); bldr.SetStrPropValue(0, 2, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.ChapterNumber); bldr.SetStrPropValue(3, test6.Length, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); bldr.SetStrPropValue(test6.Length + test2.Length, tssStartFinish.Length, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); tssStartFinish = bldr.GetString(); m_para.Contents.UnderlyingTsString = tssStartFinish; segments = pp.CollectSegmentAnnotations(tssStartFinish, out results); VerifyBreaks(new int[] { test6.Length, test6.Length + test2.Length - 1 }, results, "start/finish breaks"); Assert.AreEqual(3, segments.Count); // The segments end and begin at the '2' in test3. VerifySegment(segments[0], 0, test6.Length, m_para.Hvo, "first seg of start/finish"); VerifySegment(segments[1], test6.Length , test6.Length + test2.Length, m_para.Hvo, "second seg of start/finish"); VerifySegment(segments[2], test6.Length + test2.Length, tssStartFinish.Length, m_para.Hvo, "third seg of start/finish"); // However, anything non-white between two label-style runs separates them. Change the space between the // two runs to something that's neither an EOS nor a letter. bldr = tssStartFinish.GetBldr(); bldr.ReplaceTsString(2,3, tsf.MakeString(":",1)); ITsString tssSplitLabelRuns = bldr.GetString(); m_para.Contents.UnderlyingTsString = tssSplitLabelRuns; segments = pp.CollectSegmentAnnotations(tssSplitLabelRuns, out results); VerifyBreaks(new int[] { 2, 3, test6.Length, test6.Length + test2.Length - 1 }, results, "broken pair breaks"); Assert.AreEqual(5, segments.Count); // The segments end and begin at the '2' in test3. VerifySegment(segments[0], 0, 2, m_para.Hvo, "first seg of broken pair"); VerifySegment(segments[1], 2, 3, m_para.Hvo, "2nd seg of start/finish"); VerifySegment(segments[2], 3, test6.Length, m_para.Hvo, "3rd seg of start/finish"); VerifySegment(segments[3], test6.Length, test6.Length + test2.Length, m_para.Hvo, "second seg of start/finish"); VerifySegment(segments[4], test6.Length + test2.Length, tssStartFinish.Length, m_para.Hvo, "third seg of start/finish"); // Check that we get the correct breaks when the material before a label segment doesn't have an EOS. string test8 = "This text has no EOS "; ITsString tssMultiNoEos = tsf.MakeString(test8 + test3 + test4, 1); bldr = tssMultiNoEos.GetBldr(); bldr.SetStrPropValue(test8.Length + 2, test8.Length + 3, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); tssMultiNoEos = bldr.GetString(); m_para.Contents.UnderlyingTsString = tssMultiNoEos; segments = pp.CollectSegmentAnnotations(tssMultiNoEos, out results); VerifyBreaks(new int[] { test8.Length + 2, test8.Length + 4, test8.Length + test3.Length + test4.Length - 1 }, results, "no EOS before label"); Assert.AreEqual(3, segments.Count); // The segments end and begin at the '2' in test3. VerifySegment(segments[0], 0, test8.Length + 2, m_para.Hvo, "first seg ofno EOS before label"); VerifySegment(segments[1], test8.Length + 2, test8.Length + 4, m_para.Hvo, "second seg of no EOS before label"); VerifySegment(segments[2], test8.Length + 4, test8.Length + test3.Length + test4.Length, m_para.Hvo, "third seg of no EOS before label"); }
public void HardLineBreaks() { ITsStrFactory tsf = TsStrFactoryClass.Create(); ParagraphParser pp = new ParagraphParser(m_para); // String with embedded ORC. string test1 = "This is a simple sentence"; string lineBreak = "\x2028"; string test3 = "with a hard break."; ITsString tss = tsf.MakeString(test1 + lineBreak + test3, 1); m_para.Contents.UnderlyingTsString = tss; List<int> results; List<int> segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test1.Length, test1.Length + 1, tss.Length - 1 }, results, "simple string with hard break"); Assert.AreEqual(3, segments.Count); // The segments break around the ORC. VerifySegment(segments[0], 0, test1.Length, m_para.Hvo, "simple string with hard break"); VerifySegment(segments[1], test1.Length, test1.Length + 1, m_para.Hvo, "simple string with hard break"); VerifySegment(segments[2], test1.Length + 1, tss.Length, m_para.Hvo, "simple string with hard break"); // Now try with an EOS before the hard break. string test1a = "This is a proper sentence?!"; tss = tsf.MakeString(test1a + lineBreak + test3, 1); m_para.Contents.UnderlyingTsString = tss; segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test1a.Length - 2, test1a.Length + 1, tss.Length - 1 }, results, "EOS before hard break"); Assert.AreEqual(3, segments.Count); // The segments break around the ORC. VerifySegment(segments[0], 0, test1a.Length, m_para.Hvo, "EOS before hard break"); VerifySegment(segments[1], test1a.Length, test1a.Length + 1, m_para.Hvo, "EOS before hard break"); VerifySegment(segments[2], test1a.Length + 1, tss.Length, m_para.Hvo, "EOS before hard break"); }
public void OrcIsLabel() { ITsStrFactory tsf = TsStrFactoryClass.Create(); ParagraphParser pp = new ParagraphParser(m_para); // String with embedded ORC. string test1 = "This is a simple sentence"; string test2 = "\xfffc"; string test3 = " with a footnote."; ITsString tss = tsf.MakeString(test1 + test2 + test3, 1); // To be recognized an ORC must have unique properties. ITsStrBldr bldr = tss.GetBldr(); bldr.SetStrPropValue(test1.Length, test1.Length + test2.Length, (int)FwTextPropType.ktptObjData, "nonsence"); tss = bldr.GetString(); m_para.Contents.UnderlyingTsString = tss; List<int> results; List<int> segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test1.Length, test1.Length + test2.Length + 1, test1.Length + test2.Length + test3.Length - 1 }, results, "multi-sentence string with ORC"); Assert.AreEqual(3, segments.Count); // The segments break around the ORC. VerifySegment(segments[0], 0, test1.Length, m_para.Hvo, "first seg of multi-sentence w. ORC"); VerifySegment(segments[1], test1.Length, test1.Length + test2.Length + 1, m_para.Hvo, "second seg of multi-sentence w. ORC"); VerifySegment(segments[2], test1.Length + test2.Length + 1, test1.Length + test2.Length + test3.Length, m_para.Hvo, "third seg of multi-sentence w. ORC"); }
public void LeadingPunctuation() { ITsStrFactory tsf = TsStrFactoryClass.Create(); ParagraphParser pp = new ParagraphParser(m_para); string test1 = "?This is a question with special punctuation?"; ITsString tss = tsf.MakeString(test1, 1); m_para.Contents.UnderlyingTsString = tss; List<int> results; List<int> segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test1.Length - 1 }, results, "leading QM"); Assert.AreEqual(1, segments.Count); VerifySegment(segments[0], 0, test1.Length, m_para.Hvo, "leading QM"); // Now try leading punctuation following a verse number. ITsStrBldr bldr = tss.GetBldr(); string verse = "5 "; bldr.Replace(0, 0, verse, null); bldr.SetStrPropValue(0, 1, (int)FwTextPropType.ktptNamedStyle, ScrStyleNames.VerseNumber); ITsString tssMultiV = bldr.GetString(); m_para.Contents.UnderlyingTsString = tssMultiV; segments = pp.CollectSegmentAnnotations(tssMultiV, out results); VerifyBreaks(new int[] { verse.Length, tssMultiV.Length - 1 }, results, "leading verse and QM"); Assert.AreEqual(2, segments.Count); VerifySegment(segments[0], 0, verse.Length, m_para.Hvo, "first seg of leading verse and QM"); VerifySegment(segments[1], verse.Length, tssMultiV.Length, m_para.Hvo, "second seg of leading verse and QM"); }
public void EllipsesAndRefs() { ITsStrFactory tsf = TsStrFactoryClass.Create(); ParagraphParser pp = new ParagraphParser(m_para); string test1 = "This is...not ... a simple sentence; it discusses Scripture (Gen 1.2 and Rom 1.2-4.5) and has ellipses."; ITsString tss = tsf.MakeString(test1, 1); m_para.Contents.UnderlyingTsString = tss; List<int> results; List<int> segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] {test1.Length - 1}, results, "ellipses verse period string"); Assert.AreEqual(1, segments.Count); VerifySegment(segments[0], 0, test1.Length, m_para.Hvo, "ellipses verse period"); string test2a = "Here we have"; string twoDots = ".."; string test2b = "just two periods, and at the end, another two"; tss = tsf.MakeString(test2a + twoDots + test2b + twoDots, 1); m_para.Contents.UnderlyingTsString = tss; segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test2a.Length, test2a.Length + 2 + test2b.Length }, results, "string with double dots"); Assert.AreEqual(2, segments.Count); VerifySegment(segments[0], 0, test2a.Length + 2, m_para.Hvo, "string with double dots(1)"); VerifySegment(segments[1], test2a.Length + 2, tss.Length, m_para.Hvo, "string with double dots(2)"); string test3 = "This sentence ends with an ellipsis..."; tss = tsf.MakeString(test3, 1); m_para.Contents.UnderlyingTsString = tss; segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { }, results, "string with final ellipsis"); Assert.AreEqual(1, segments.Count); VerifySegment(segments[0], 0, test3.Length, m_para.Hvo, "string with final ellipsis"); string fourDots = "...."; tss = tsf.MakeString(test2a + fourDots + test2b + fourDots, 1); m_para.Contents.UnderlyingTsString = tss; segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test2a.Length, test2a.Length + 4 + test2b.Length }, results, "string with four dots"); Assert.AreEqual(2, segments.Count); VerifySegment(segments[0], 0, test2a.Length + 4, m_para.Hvo, "string with four dots(1)"); VerifySegment(segments[1], test2a.Length + 4, tss.Length, m_para.Hvo, "string with four dots(2)"); // Case 2 periods with surrounding numbers string test5a = "Here is a number and two dots: 5"; string test5b = "2 and another number, and the final dot has a number before it: 2."; tss = tsf.MakeString(test5a + twoDots + test5b, 1); m_para.Contents.UnderlyingTsString = tss; segments = pp.CollectSegmentAnnotations(tss, out results); VerifyBreaks(new int[] { test5a.Length, test5a.Length + 2 + test5b.Length - 1 }, results, "string with numbers and double dots"); Assert.AreEqual(2, segments.Count); // One plus 2 for the two dots, but the following digit and space go in the previous segment, too. VerifySegment(segments[0], 0, test5a.Length + 2 + 2, m_para.Hvo, "string with numbers and double dots(1)"); VerifySegment(segments[1], test5a.Length + 2 + 2, tss.Length, m_para.Hvo, "string with numbers and double dots(2)"); }
private List<int> GetSegments(ITsStrBldr bldr, ScrTxtPara para) { para.Contents.UnderlyingTsString = bldr.GetString(); ParagraphParser pp = new ParagraphParser(para); List<int> eosIndexes; List<int> segments = pp.CollectSegmentAnnotations(para.Contents.UnderlyingTsString, out eosIndexes); Cache.VwCacheDaAccessor.CacheVecProp(para.Hvo, ktagParaSegments, segments.ToArray(), segments.Count); return segments; }