public List <Pullenti.Ner.ReferentToken> CreateRefenetsTokensWithRegister(Pullenti.Ner.Core.AnalyzerData ad, bool register = true) { if (Internals.Count == 0 && !Reliable) { if (Nums.Units.Count == 1 && Nums.Units[0].IsDoubt) { if (Nums.Units[0].UnknownName != null) { } else if (Nums.IsNewlineBefore) { } else if (Nums.Units[0].BeginToken.LengthChar > 1 && Nums.Units[0].BeginToken.GetMorphClassInDictionary().IsUndefined) { } else if (Nums.FromVal == null || Nums.ToVal == null) { return(null); } } } List <Pullenti.Ner.ReferentToken> res = new List <Pullenti.Ner.ReferentToken>(); if (((Nums == null || Nums.PlusMinusPercent)) && Internals.Count > 0) { List <Pullenti.Ner.ReferentToken> liEx = null; if (InternalEx != null) { liEx = InternalEx.CreateRefenetsTokensWithRegister(ad, true); if (liEx != null) { res.AddRange(liEx); } } Pullenti.Ner.Measure.MeasureReferent mr = new Pullenti.Ner.Measure.MeasureReferent(); string templ0 = "1"; string templ = null; if (Name != null) { mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_NAME, Name, false, 0); } List <Pullenti.Ner.Measure.MeasureReferent> ints = new List <Pullenti.Ner.Measure.MeasureReferent>(); for (int k = 0; k < Internals.Count; k++) { MeasureToken ii = Internals[k]; ii.Reliable = true; List <Pullenti.Ner.ReferentToken> li = ii.CreateRefenetsTokensWithRegister(ad, false); if (li == null) { continue; } res.AddRange(li); Pullenti.Ner.Measure.MeasureReferent mr0 = res[res.Count - 1].Referent as Pullenti.Ner.Measure.MeasureReferent; if (liEx != null) { mr0.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_REF, liEx[liEx.Count - 1], false, 0); } if (k == 0 && !IsEmpty) { templ0 = mr0.Template; mr0.Template = "1"; } if (ad != null) { mr0 = ad.RegisterReferent(mr0) as Pullenti.Ner.Measure.MeasureReferent; } mr.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_VALUE, mr0, false, 0); ints.Add(mr0); if (templ == null) { templ = "1"; } else { int nu = mr.GetStringValues(Pullenti.Ner.Measure.MeasureReferent.ATTR_VALUE).Count; templ = string.Format("{0}{1}{2}", templ, (IsSet ? ", " : " × "), nu); } } if (IsSet) { templ = "{" + templ + "}"; } if (templ0 != "1") { templ = templ0.Replace("1", templ); } if (Nums != null && Nums.PlusMinusPercent && Nums.SingleVal != null) { templ = string.Format("[{0} ±{1}%]", templ, Internals.Count + 1); mr.AddValue(Nums.SingleVal.Value); } mr.Template = templ; int i; bool hasLength = false; Pullenti.Ner.Measure.UnitReferent uref = null; for (i = 0; i < ints.Count; i++) { if (ints[i].Kind == Pullenti.Ner.Measure.MeasureKind.Length) { hasLength = true; uref = ints[i].GetSlotValue(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT) as Pullenti.Ner.Measure.UnitReferent; } else if (ints[i].Units.Count > 0) { break; } } if (ints.Count > 1 && hasLength && uref != null) { foreach (Pullenti.Ner.Measure.MeasureReferent ii in ints) { if (ii.FindSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT, null, true) == null) { ii.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_UNIT, uref, false, 0); ii.Kind = Pullenti.Ner.Measure.MeasureKind.Length; } } } if (ints.Count == 3) { if (ints[0].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[1].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[2].Kind == Pullenti.Ner.Measure.MeasureKind.Length) { mr.Kind = Pullenti.Ner.Measure.MeasureKind.Volume; } else if (ints[0].Units.Count == 0 && ints[1].Units.Count == 0 && ints[2].Units.Count == 0) { string nam = mr.GetStringValue(Pullenti.Ner.Measure.MeasureReferent.ATTR_NAME); if (nam != null) { if (nam.Contains("РАЗМЕР") || nam.Contains("ГАБАРИТ")) { mr.Kind = Pullenti.Ner.Measure.MeasureKind.Volume; } } } } if (ints.Count == 2) { if (ints[0].Kind == Pullenti.Ner.Measure.MeasureKind.Length && ints[1].Kind == Pullenti.Ner.Measure.MeasureKind.Length) { mr.Kind = Pullenti.Ner.Measure.MeasureKind.Area; } } if (!IsEmpty) { if (ad != null) { mr = ad.RegisterReferent(mr) as Pullenti.Ner.Measure.MeasureReferent; } res.Add(new Pullenti.Ner.ReferentToken(mr, BeginToken, EndToken)); } return(res); } List <Pullenti.Ner.ReferentToken> re2 = Nums.CreateRefenetsTokensWithRegister(ad, Name, register); foreach (MeasureToken ii in Internals) { List <Pullenti.Ner.ReferentToken> li = ii.CreateRefenetsTokensWithRegister(ad, true); if (li == null) { continue; } res.AddRange(li); re2[re2.Count - 1].Referent.AddSlot(Pullenti.Ner.Measure.MeasureReferent.ATTR_REF, res[res.Count - 1].Referent, false, 0); } re2[re2.Count - 1].BeginToken = BeginToken; re2[re2.Count - 1].EndToken = EndToken; res.AddRange(re2); return(res); }