private void WriteLexReference(TextWriter w, ILexReference lref, ICmObject lexItem) { var slr = new SingleLexReference(lref, lref.TargetsRS[0].Hvo); var nMappingType = slr.MappingType; var hvoOpen = lexItem.Hvo; for (var i = 0; i < lref.TargetsRS.Count; i++) { var target = lref.TargetsRS[i]; // If the LexReference vector element is the currently open object, ignore // it unless it's a sequence type relation. if (nMappingType != (int)LexRefTypeTags.MappingTypes.kmtSenseSequence && nMappingType != (int)LexRefTypeTags.MappingTypes.kmtEntrySequence && nMappingType != (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseSequence) { if (target.Hvo == hvoOpen) continue; } slr.CrossRefHvo = target.Hvo; w.Write("<relation"); WriteLiftDates(w, lref); var typeName = slr.TypeName((int)SpecialWritingSystemCodes.BestAnalysisOrVernacular, lexItem.Hvo); w.Write(" type=\"{0}\"", MakeSafeAndNormalizedAttribute(typeName)); w.Write(" ref=\"{0}\"", XmlUtils.MakeSafeXmlAttribute(slr.RefLIFTid)); var refOrder = slr.RefOrder; if (!String.IsNullOrEmpty(refOrder)) w.Write(" order=\"{0}\"", refOrder); var residue = slr.LiftResidueContent; if (String.IsNullOrEmpty(residue)) { w.WriteLine("/>"); } else { w.WriteLine(">"); w.Write(residue); w.WriteLine("</relation>"); } // If this is a tree type relation, show only the first element if the // currently open object is not the first element. if (nMappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseTree || nMappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryTree || nMappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseTree) { if (hvoOpen != lref.TargetsRS[0].Hvo) break; } } }
/// <summary> /// Process the vector of objects targeted by a LexReference object. /// </summary> /// <param name="rghvo">vector of database object ids</param> /// <param name="currentObject">current CmObject (a LexReference)</param> /// <param name="contentsStream">output stream wrapper</param> /// <param name="classNode">XML descriptor of how to output each object</param> protected void ProcessSingleLexReferences(int[] rghvo, ICmObject currentObject, TextWriter contentsStream, XmlNode classNode) { Debug.Assert(rghvo.Rank == 1); SingleLexReference slr = new SingleLexReference(currentObject, rghvo[0]); int nMappingType = slr.MappingType; int hvoOpen = m_openForRefStack.Peek(); for (int i = 0; i < rghvo.Length; ++i) { // If the LexReference vector element is the currently open object, ignore // it unless it's a sequence type relation. if (nMappingType != (int)LexRefTypeTags.MappingTypes.kmtSenseSequence && nMappingType != (int)LexRefTypeTags.MappingTypes.kmtEntrySequence && nMappingType != (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseSequence) { if (rghvo[i] == hvoOpen) continue; } slr.CrossRefHvo = rghvo[i]; DoChildren(contentsStream, slr, classNode, null); // If this is a tree type relation, show only the first element if the // currently open object is not the first element. if (nMappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseTree || nMappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryTree || nMappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseTree) { if (hvoOpen != rghvo[0]) break; } } }