Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 26 additions & 16 deletions src/SIL.LCModel/DomainServices/AnalysisGuessServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -729,18 +729,9 @@ public IAnalysis GetBestGuess(AnalysisOccurrence occurrence, bool onlyIndexZeroL
private IWfiWordform GetLowercaseWordform(AnalysisOccurrence occurrence, int ws,
bool onlyIndexZeroLowercaseMatching, IWfiWordform wordform)
{
// TODO: make it look for the first word in the sentence...may not be at Index 0!
if (occurrence == null)
return null;
if (onlyIndexZeroLowercaseMatching && occurrence.Index != 0)
return null;
if (occurrence.Segment == null || !occurrence.Segment.IsValidObject)
return null;
ITsString tssWfBaseline = occurrence.BaselineText;
var cf = new CaseFunctions(Cache.ServiceLocator.WritingSystemManager.Get(ws));
string sLower = cf.ToLower(tssWfBaseline.Text);
string sLower = GetLowercaseOfTitleCase(occurrence, ws, onlyIndexZeroLowercaseMatching);
// don't bother looking up the lowercased wordform if the instanceOf is already in lowercase form.
if (sLower != wordform.ShortName)
if (sLower != null && sLower != wordform.ShortName)
{
return GetWordformIfNeeded(sLower, ws);
}
Expand All @@ -752,18 +743,37 @@ private IWfiWordform GetLowercaseWordform(AnalysisOccurrence occurrence, int ws,
// if it lowercases to the given wordform.
// Otherwise, return null.
// </summary>
private IWfiWordform GetOriginalCaseWordform(AnalysisOccurrence occurrence, IWfiWordform wordform, int ws)
private IWfiWordform GetOriginalCaseWordform(AnalysisOccurrence occurrence, IWfiWordform wordform,
int ws, bool onlyIndexZeroLowercaseMatching)
{
ITsString tssWfBaseline = occurrence.BaselineText;
var cf = new CaseFunctions(Cache.ServiceLocator.WritingSystemManager.Get(ws));
string sLower = cf.ToLower(tssWfBaseline.Text);
string sLower = GetLowercaseOfTitleCase(occurrence, ws, onlyIndexZeroLowercaseMatching);
if (sLower == wordform.GetForm(ws).Text)
{
ITsString tssWfBaseline = occurrence.BaselineText;
return GetWordformIfNeeded(tssWfBaseline.Text, ws);
}
return null;
}

// <summary>
// Get the lowercase form of occurrence if it is Title case.
// </summary>
private string GetLowercaseOfTitleCase(AnalysisOccurrence occurrence, int ws, bool onlyIndexZeroLowercaseMatching)
{
// TODO: make it look for the first word in the sentence...may not be at Index 0!
if (occurrence == null)
return null;
if (onlyIndexZeroLowercaseMatching && occurrence.Index != 0)
return null;
if (occurrence.Segment == null || !occurrence.Segment.IsValidObject)
return null;
ITsString tssWfBaseline = occurrence.BaselineText;
var cf = new CaseFunctions(Cache.ServiceLocator.WritingSystemManager.Get(ws));
if (cf.StringCase(tssWfBaseline.Text) == StringCaseStatus.title)
return cf.ToLower(tssWfBaseline.Text);
return null;
}

/// <summary>
/// Get a wordform for word if it already exists or
/// if it has an entry in the lexicon.
Expand Down Expand Up @@ -862,7 +872,7 @@ private List<IWfiAnalysis> GetSortedAnalysisGuesses(IWfiWordform wordform, int w
{
// Sometimes the user selects a lowercase wordform for an uppercase word.
// Get the original case so that we can include uppercase analyses.
var originalCaseWf = GetOriginalCaseWordform(occurrence, wordform, ws);
var originalCaseWf = GetOriginalCaseWordform(occurrence, wordform, ws, onlyIndexZeroLowercaseMatching);
if (originalCaseWf != null)
wordform = originalCaseWf;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,17 @@ internal void DoDataSetup()
" " + Words_para0[4].Form.BestVernacularAlternative.Text +
".", wsVern));
Para0.Contents = bldr4.GetString();
/* rAs ras */
IWfiWordform rAs = wfFactory.Create(TsStringUtils.MakeString("rAs", wsVern));
Words_para0.Add(rAs);
IWfiWordform ras = wfFactory.Create(TsStringUtils.MakeString("ras", wsVern));
Words_para0.Add(ras);
var bldr5 = Para0.Contents.GetIncBldr();
bldr5.AppendTsString(TsStringUtils.MakeString(
" " + Words_para0[20].Form.BestVernacularAlternative.Text +
" " + Words_para0[21].Form.BestVernacularAlternative.Text +
".", wsVern));
Para0.Contents = bldr5.GetString();
using (ParagraphParser pp = new ParagraphParser(Cache))
{
foreach (IStTxtPara para in StText.ParagraphsOS)
Expand Down Expand Up @@ -921,6 +932,21 @@ public void ExpectedAnalysisGuess_ForSentenceInitialOnlyLowercase()
}
}

/// <summary>
/// if a wordform is mixed case, don't look for lower case.
/// </summary>
[Test]
public void ExpectedAnalysisGuess_ForSentenceInitialMixedCase()
{
using (var setup = new AnalysisGuessBaseSetup(Cache))
{
WordAnalysisOrGlossServices.CreateNewAnalysisWAG(setup.Words_para0[21]); // ras
var wagLowercaseB = new AnalysisOccurrence(setup.Para0.SegmentsOS[5], 0); // rAs
var guessActual = setup.GuessServices.GetBestGuess(wagLowercaseB);
Assert.AreEqual(new NullWAG(), guessActual);
}
}

/// <summary>
/// This class allows us to fake out the guesser by passing an analysis occurrence with the analyis we want,
/// even though it isn't the analysis recorded in the paragraph.
Expand Down
Loading