/// ------------------------------------------------------------------------------------ /// <summary> /// Create an allomorph. /// </summary> /// <param name="entry">The entry.</param> /// <param name="msa">The msa.</param> /// <param name="tssform">The tssform.</param> /// <param name="morphType">Type of the morph.</param> /// <param name="fLexemeForm">set to <c>true</c> to create a lexeme form.</param> /// <returns></returns> /// ------------------------------------------------------------------------------------ internal static IMoForm CreateAllomorph(ILexEntry entry, IMoMorphSynAnalysis msa, ITsString tssform, IMoMorphType morphType, bool fLexemeForm) { MoForm allomorph = null; switch (morphType.Guid.ToString()) { case MoMorphTypeTags.kMorphProclitic: // Fall through. case MoMorphTypeTags.kMorphClitic: // Fall through. case MoMorphTypeTags.kMorphEnclitic: Debug.Assert(msa is MoStemMsa, "Wrong MSA for a clitic."); #pragma warning disable 168 var stemMsa = (IMoStemMsa)msa; #pragma warning restore 168 goto case MoMorphTypeTags.kMorphBoundStem; case MoMorphTypeTags.kMorphRoot: // Fall through. case MoMorphTypeTags.kMorphBoundRoot: // Fall through. case MoMorphTypeTags.kMorphStem: // Fall through. case MoMorphTypeTags.kMorphParticle: // Fall through. case MoMorphTypeTags.kMorphPhrase: // Fall through. case MoMorphTypeTags.kMorphDiscontiguousPhrase: // Fall through. // AndyB_Yahoo: On particles, (and LT-485), these are always to be // roots that never take any affixes // AndyB_Yahoo: Therefore, they need to have StemMsas and Stem // allomorphs case MoMorphTypeTags.kMorphBoundStem: allomorph = new MoStemAllomorph(); break; default: // All others, which should get an non-stem MSA and an affix allo. Debug.Assert(!(msa is IMoStemMsa), "Wrong MSA for a affix."); allomorph = new MoAffixAllomorph(); break; } if (fLexemeForm) entry.LexemeFormOA = allomorph; else entry.AlternateFormsOS.Add(allomorph); allomorph.MorphTypeRA = morphType; // Has to be done before the next call. ITsString tssAllomorphForm = tssform; allomorph.FormMinusReservedMarkers = tssAllomorphForm; if ((morphType.Guid == MoMorphTypeTags.kguidMorphInfix) || (morphType.Guid == MoMorphTypeTags.kguidMorphInfixingInterfix)) { HandleInfix(entry, allomorph); } return allomorph; }
/// <summary> /// Create a new circumfix allomorph and add it to the given entry. /// </summary> /// <param name="entry"></param> /// <param name="sense"></param> /// <param name="lexemeForm"></param> /// <param name="morphType"></param> /// <returns></returns> public IMoAffixAllomorph CreateCircumfix(ILexEntry entry, ILexSense sense, ITsString lexemeForm, IMoMorphType morphType) { var lexemeAllo = new MoAffixAllomorph(); entry.LexemeFormOA = lexemeAllo; lexemeAllo.Form.set_String(TsStringUtils.GetWsAtOffset(lexemeForm, 0), lexemeForm); lexemeAllo.MorphTypeRA = morphType; lexemeAllo.IsAbstract = true; // split citation form into left and right parts var aSpacePeriod = new[] { ' ', '.' }; var lexemeFormAsString = lexemeForm.Text; var wsVern = TsStringUtils.GetWsAtOffset(lexemeForm, 0); var iLeftEnd = lexemeFormAsString.IndexOfAny(aSpacePeriod); var sLeftMember = iLeftEnd < 0 ? lexemeFormAsString : lexemeFormAsString.Substring(0, iLeftEnd); var iRightBegin = lexemeFormAsString.LastIndexOfAny(aSpacePeriod); var sRightMember = iRightBegin < 0 ? lexemeFormAsString : lexemeFormAsString.Substring(iRightBegin + 1); // Create left and right allomorphs IMoMorphType mmtPrefix; IMoMorphType mmtSuffix; IMoMorphType mmtInfix; MorphServices.GetMajorAffixMorphTypes(m_cache, out mmtPrefix, out mmtSuffix, out mmtInfix); int clsidForm; var mmt = MorphServices.FindMorphType(m_cache, ref sLeftMember, out clsidForm); if ((mmt.Hvo != mmtPrefix.Hvo) && (mmt.Hvo != mmtInfix.Hvo)) mmt = mmtPrefix; // force a prefix if it's neither a prefix nor an infix #pragma warning disable 168 var allomorph = MoForm.CreateAllomorph(entry, sense.MorphoSyntaxAnalysisRA, TsStringUtils.MakeTss(sLeftMember, wsVern), mmt, false); #pragma warning disable 168 mmt = MorphServices.FindMorphType(m_cache, ref sRightMember, out clsidForm); if ((mmt.Hvo != mmtInfix.Hvo) && (mmt.Hvo != mmtSuffix.Hvo)) mmt = mmtSuffix; // force a suffix if it's neither a suffix nor an infix allomorph = MoForm.CreateAllomorph(entry, sense.MorphoSyntaxAnalysisRA, TsStringUtils.MakeTss(sRightMember, wsVern), mmt, false); return lexemeAllo; }