def parseDateTime(str0_ : str) -> datetime.datetime: if (Utils.isNullOrEmpty(str0_)): return None try: prts = Utils.splitString(str0_, '.', False) wrapy804 = RefOutArgWrapper(0) inoutres805 = Utils.tryParseInt(prts[0], wrapy804) y = wrapy804.value if (not inoutres805): return None mon = 0 day = 0 if (len(prts) > 1): wrapmon802 = RefOutArgWrapper(0) inoutres803 = Utils.tryParseInt(prts[1], wrapmon802) mon = wrapmon802.value if (inoutres803): if (len(prts) > 2): wrapday801 = RefOutArgWrapper(0) Utils.tryParseInt(prts[2], wrapday801) day = wrapday801.value if (mon <= 0): mon = 1 if (day <= 0): day = 1 if (day > Utils.lastDayOfMonth(y, mon)): day = Utils.lastDayOfMonth(y, mon) return datetime.datetime(y, mon, day, 0, 0, 0) except Exception as ex: pass return None
def parse_date_time(str0_: str) -> datetime.datetime: if (Utils.isNullOrEmpty(str0_)): return None try: prts = Utils.splitString(str0_, '.', False) y = 0 wrapy831 = RefOutArgWrapper(0) inoutres832 = Utils.tryParseInt(prts[0], wrapy831) y = wrapy831.value if (not inoutres832): return None mon = 0 day = 0 if (len(prts) > 1): wrapmon829 = RefOutArgWrapper(0) inoutres830 = Utils.tryParseInt(prts[1], wrapmon829) mon = wrapmon829.value if (inoutres830): if (len(prts) > 2): wrapday828 = RefOutArgWrapper(0) Utils.tryParseInt(prts[2], wrapday828) day = wrapday828.value if (mon <= 0): mon = 1 if (day <= 0): day = 1 if (day > Utils.lastDayOfMonth(y, mon)): day = Utils.lastDayOfMonth(y, mon) return datetime.datetime(y, mon, day, 0, 0, 0) except Exception as ex: pass return None
def create_diap(s1 : str, s2 : str) -> typing.List[str]: n1 = 0 n2 = 0 i = 0 pref = None if (s2.startswith(s1)): i = len(s1) if (((i + 1) < len(s2)) and s2[i] == '.' and str.isdigit(s2[i + 1])): wrapn21563 = RefOutArgWrapper(0) inoutres1564 = Utils.tryParseInt(s2[i + 1:], wrapn21563) n2 = wrapn21563.value if (inoutres1564): res0 = list() res0.append(s1) i = 1 while i <= n2: res0.append("{0}.{1}".format(s1, i)) i += 1 return res0 i = s1.rfind('.') if (((i)) > 0): pref = s1[0:0+i + 1] wrapn11567 = RefOutArgWrapper(0) inoutres1568 = Utils.tryParseInt(s1[i + 1:], wrapn11567) n1 = wrapn11567.value if (not inoutres1568): return None if (not s2.startswith(pref)): return None wrapn21565 = RefOutArgWrapper(0) inoutres1566 = Utils.tryParseInt(s2[i + 1:], wrapn21565) n2 = wrapn21565.value if (not inoutres1566): return None else: wrapn11571 = RefOutArgWrapper(0) inoutres1572 = Utils.tryParseInt(s1, wrapn11571) n1 = wrapn11571.value if (not inoutres1572): return None wrapn21569 = RefOutArgWrapper(0) inoutres1570 = Utils.tryParseInt(s2, wrapn21569) n2 = wrapn21569.value if (not inoutres1570): return None if (n2 <= n1): return None res = list() i = n1 while i <= n2: if (pref is None): res.append(str(i)) else: res.append(pref + ((str(i)))) i += 1 return res
def correct_app_list(lines : typing.List['InstrToken1']) -> None: i = 0 while i < (len(lines) - 1): if ((lines[i].typ == InstrToken1.Types.LINE and len(lines[i].numbers) == 0 and lines[i].begin_token.is_value("ПРИЛОЖЕНИЯ", "ДОДАТОК")) and len(lines[i + 1].numbers) > 0 and lines[i].end_token.is_char(':')): num = 1 i += 1 first_pass3278 = True while True: if first_pass3278: first_pass3278 = False else: i += 1 if (not (i < len(lines))): break if (len(lines[i].numbers) == 0): if (((i + 1) < len(lines)) and len(lines[i + 1].numbers) == 1 and lines[i + 1].numbers[0] == str(num)): lines[i - 1].end_token = lines[i].end_token del lines[i] i -= 1 continue break else: nn = 0 wrapnn1553 = RefOutArgWrapper(0) inoutres1554 = Utils.tryParseInt(lines[i].numbers[0], wrapnn1553) nn = wrapnn1553.value if (inoutres1554): num = (nn + 1) lines[i].num_typ = NumberTypes.UNDEFINED lines[i].numbers.clear() i += 1
def year(self) -> int: wrapyear395 = RefOutArgWrapper(0) inoutres396 = Utils.tryParseInt( Utils.ifNotNull(self.getStringValue(BookLinkReferent.ATTR_YEAR), ""), wrapyear395) year_ = wrapyear395.value if (inoutres396): return year_ else: return 0
def coef(self) -> int: val = self.getStringValue(SentimentReferent.ATTR_COEF) if (val is None): return 0 wrapi2498 = RefOutArgWrapper(0) inoutres2499 = Utils.tryParseInt(val, wrapi2498) i = wrapi2498.value if (not inoutres2499): return 0 return i
def min_number(self) -> int: """ Минимальный номер, если задан диапазон """ str0_ = self.getStringValue(InstrumentBlockReferent.ATTR_MINNUMBER) if (str0_ is None): return 0 wrapi1486 = RefOutArgWrapper(0) inoutres1487 = Utils.tryParseInt(str0_, wrapi1486) i = wrapi1486.value if (inoutres1487): return i return 0
def sub_number2(self) -> int: """ Дополнительный второй номер (через точку за дополнительным) """ str0_ = self.getStringValue(InstrumentBlockReferent.ATTR_SUB2NUMBER) if (str0_ is None): return 0 wrapi1482 = RefOutArgWrapper(0) inoutres1483 = Utils.tryParseInt(str0_, wrapi1482) i = wrapi1482.value if (inoutres1483): return i return 0
def sub_number3(self) -> int: """ Дополнительный третий номер (через точку за вторым дополнительным) """ str0_ = self.getStringValue(InstrumentBlockReferent.ATTR_SUB3NUMBER) if (str0_ is None): return 0 wrapi1484 = RefOutArgWrapper(0) inoutres1485 = Utils.tryParseInt(str0_, wrapi1484) i = wrapi1484.value if (inoutres1485): return i return 0
def number(self) -> int: """ Номер (для диапазона - максимальный номер) """ str0_ = self.getStringValue(InstrumentBlockReferent.ATTR_NUMBER) if (str0_ is None): return 0 wrapi1478 = RefOutArgWrapper(0) inoutres1479 = Utils.tryParseInt(str0_, wrapi1478) i = wrapi1478.value if (inoutres1479): return i return 0
def alt_rest(self) -> int: """ Остаток (от 0 до 99) - копеек, центов и т.п. """ val = self.getStringValue(MoneyReferent.ATTR_ALTREST) if (val is None): return None wrapv1633 = RefOutArgWrapper(0) inoutres1634 = Utils.tryParseInt(val, wrapv1633) v = wrapv1633.value if (not inoutres1634): return None return v
def checkLinkBefore(t0 : 'Token', num : str) -> bool: if (num is None or t0 is None): return False if (t0.previous is not None and (isinstance(t0.previous.getReferent(), BookLinkRefReferent))): wrapnn366 = RefOutArgWrapper(0) inoutres367 = Utils.tryParseInt(Utils.ifNotNull((t0.previous.getReferent()).number, ""), wrapnn366) nn = wrapnn366.value if (inoutres367): if (str((nn + 1)) == num): return True return False
def count(self) -> int: """ Количество """ val = self.getStringValue(FundsReferent.ATTR_COUNT) if (val is None): return 0 wrapv450 = RefOutArgWrapper(0) inoutres451 = Utils.tryParseInt(val, wrapv450) v = wrapv450.value if (not inoutres451): return 0 return v
def rest(self) -> int: """ Остаток (от 0 до 99) - копеек, центов и т.п. """ val = self.getStringValue(MoneyReferent.ATTR_REST) if (val is None): return 0 wrapv1631 = RefOutArgWrapper(0) inoutres1632 = Utils.tryParseInt(val, wrapv1631) v = wrapv1631.value if (not inoutres1632): return 0 return v
def year(self) -> int: """ Год """ year_ = 0 wrapyear378 = RefOutArgWrapper(0) inoutres379 = Utils.tryParseInt( Utils.ifNotNull(self.get_string_value(BookLinkReferent.ATTR_YEAR), ""), wrapyear378) year_ = wrapyear378.value if (inoutres379): return year_ else: return 0
def getNumberDiff(r1 : 'Referent', r2 : 'Referent') -> int: """ Возвращает разницу номеров r2 - r1, иначе null, если номеров нет Args: r1(Referent): r2(Referent): """ num1 = r1.getStringValue(BookLinkRefReferent.ATTR_NUMBER) num2 = r2.getStringValue(BookLinkRefReferent.ATTR_NUMBER) if (num1 is None or num2 is None): return None wrapn1398 = RefOutArgWrapper(0) inoutres399 = Utils.tryParseInt(num1, wrapn1398) wrapn2400 = RefOutArgWrapper(0) inoutres401 = Utils.tryParseInt(num2, wrapn2400) n1 = wrapn1398.value n2 = wrapn2400.value if (not inoutres399 or not inoutres401): return None return n2 - n1
def sub_number(self) -> int: """ Дополнительный номер (через точку за основным) """ str0_ = self.get_string_value(InstrumentBlockReferent.ATTR_SUBNUMBER) if (str0_ is None): return 0 i = 0 wrapi1586 = RefOutArgWrapper(0) inoutres1587 = Utils.tryParseInt(str0_, wrapi1586) i = wrapi1586.value if (inoutres1587): return i return 0
def rest(self) -> int: """ Остаток (от 0 до 99) - копеек, центов и т.п. """ val = self.get_string_value(MoneyReferent.ATTR_REST) if (val is None): return 0 v = 0 wrapv1754 = RefOutArgWrapper(0) inoutres1755 = Utils.tryParseInt(val, wrapv1754) v = wrapv1754.value if (not inoutres1755): return 0 return v
def alt_rest(self) -> int: """ Альтернативный остаток (от 0 до 99) - копеек, центов и т.п. """ val = self.get_string_value(MoneyReferent.ATTR_ALTREST) if (val is None): return None v = 0 wrapv1756 = RefOutArgWrapper(0) inoutres1757 = Utils.tryParseInt(val, wrapv1756) v = wrapv1756.value if (not inoutres1757): return None return v
def checkLinkAfter(t1 : 'Token', num : str) -> bool: if (num is None or t1 is None): return False if (t1.is_newline_after): bbb = BookLinkToken.tryParse(t1.next0_, 0) if (bbb is not None and bbb.typ == BookLinkTyp.NUMBER): wrapnn368 = RefOutArgWrapper(0) inoutres369 = Utils.tryParseInt(Utils.ifNotNull(bbb.value, ""), wrapnn368) nn = wrapnn368.value if (inoutres369): if (str((nn - 1)) == num): return True return False
def get_number_diff(r1 : 'Referent', r2 : 'Referent') -> int: """ Возвращает разницу номеров r2 - r1, иначе null, если номеров нет Args: r1(Referent): первая ссылка r2(Referent): вторая ссылка """ num1 = r1.get_string_value(BookLinkRefReferent.ATTR_NUMBER) num2 = r2.get_string_value(BookLinkRefReferent.ATTR_NUMBER) if (num1 is None or num2 is None): return None n1 = 0 n2 = 0 wrapn1381 = RefOutArgWrapper(0) inoutres382 = Utils.tryParseInt(num1, wrapn1381) wrapn2383 = RefOutArgWrapper(0) inoutres384 = Utils.tryParseInt(num2, wrapn2383) n1 = wrapn1381.value n2 = wrapn2383.value if (not inoutres382 or not inoutres384): return None return n2 - n1
def __all_years(self) -> typing.List[int]: res = list() for s in self.slots: if (s.type_name == DecreeReferent.ATTR_DATE): str0_ = str(s.value) i = str0_.find('.') if (i == 4): str0_ = str0_[0:0 + 4] wrapi1113 = RefOutArgWrapper(0) inoutres1114 = Utils.tryParseInt(str0_, wrapi1113) i = wrapi1113.value if (inoutres1114): res.append(i) return res
def getIntValue(self, attr_name: str, def_value: int) -> int: """ Получить числовое значение (если их несколько, то вернёт первое) Args: attr_name(str): def_value(int): """ str0_ = self.getStringValue(attr_name) if (Utils.isNullOrEmpty(str0_)): return def_value wrapres2686 = RefOutArgWrapper(0) inoutres2687 = Utils.tryParseInt(str0_, wrapres2686) res = wrapres2686.value if (not inoutres2687): return def_value return res
def get_int_value(self, attr_name: str, def_value: int) -> int: """ Получить числовое значение (если их несколько, то вернёт первое) Args: attr_name(str): имя атрибута def_value(int): дефолтовое значение, если не найдено Returns: int: число """ str0_ = self.get_string_value(attr_name) if (Utils.isNullOrEmpty(str0_)): return def_value res = 0 wrapres2858 = RefOutArgWrapper(0) inoutres2859 = Utils.tryParseInt(str0_, wrapres2858) res = wrapres2858.value if (not inoutres2859): return def_value return res
def value(self, value_) -> str: from pullenti.ner.core.NumberHelper import NumberHelper self.__m_value = (Utils.ifNotNull(value_, "")) if (len(self.__m_value) > 2 and self.__m_value.endswith(".0")): self.__m_value = self.__m_value[0:0 + len(self.__m_value) - 2] while len(self.__m_value) > 1 and self.__m_value[ 0] == '0' and self.__m_value[1] != '.': self.__m_value = self.__m_value[1:] wrapn2664 = RefOutArgWrapper(0) inoutres2665 = Utils.tryParseInt(self.__m_value, wrapn2664) n = wrapn2664.value if (inoutres2665): self.__m_int_val = n else: self.__m_int_val = (None) d = NumberHelper.stringToDouble(self.__m_value) if (d is None): self.__m_real_val = math.nan else: self.__m_real_val = d return value_
def _initialize() -> None: if (NumberExHelper._m_postfixes is not None): return NumberExHelper._m_postfixes = TerminCollection() t = Termin._new481("КВАДРАТНЫЙ МЕТР", MorphLang.RU, True, "кв.м.", NumberExType.METER2) t.addAbridge("КВ.МЕТР") t.addAbridge("КВ.МЕТРА") t.addAbridge("КВ.М.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("КВАДРАТНИЙ МЕТР", MorphLang.UA, True, "КВ.М.", NumberExType.METER2) t.addAbridge("КВ.МЕТР") t.addAbridge("КВ.МЕТРА") t.addAbridge("КВ.М.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("КВАДРАТНЫЙ КИЛОМЕТР", MorphLang.RU, True, "кв.км.", NumberExType.KILOMETER2) t.addVariant("КВАДРАТНИЙ КІЛОМЕТР", True) t.addAbridge("КВ.КМ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("ГЕКТАР", MorphLang.RU, True, "га", NumberExType.GEKTAR) t.addAbridge("ГА") NumberExHelper._m_postfixes.add(t) t = Termin._new481("АР", MorphLang.RU, True, "ар", NumberExType.AR) t.addVariant("СОТКА", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("КУБИЧЕСКИЙ МЕТР", MorphLang.RU, True, "куб.м.", NumberExType.METER3) t.addVariant("КУБІЧНИЙ МЕТР", True) t.addAbridge("КУБ.МЕТР") t.addAbridge("КУБ.М.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("МЕТР", MorphLang.RU, True, "м.", NumberExType.METER) t.addAbridge("М.") t.addAbridge("M.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("МЕТРОВЫЙ", MorphLang.RU, True, "м.", NumberExType.METER) t.addVariant("МЕТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИМЕТР", MorphLang.RU, True, "мм.", NumberExType.MILLIMETER) t.addAbridge("ММ") t.addAbridge("MM") t.addVariant("МІЛІМЕТР", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИМЕТРОВЫЙ", MorphLang.RU, True, "мм.", NumberExType.MILLIMETER) t.addVariant("МІЛІМЕТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("САНТИМЕТР", MorphLang.RU, True, "см.", NumberExType.SANTIMETER) t.addAbridge("СМ") t.addAbridge("CM") NumberExHelper._m_postfixes.add(t) t = Termin._new481("САНТИМЕТРОВЫЙ", MorphLang.RU, True, "см.", NumberExType.SANTIMETER) t.addVariant("САНТИМЕТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("КВАДРАТНЫЙ САНТИМЕТР", MorphLang.RU, True, "кв.см.", NumberExType.SANTIMETER2) t.addVariant("КВАДРАТНИЙ САНТИМЕТР", True) t.addAbridge("КВ.СМ.") t.addAbridge("СМ.КВ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("КУБИЧЕСКИЙ САНТИМЕТР", MorphLang.RU, True, "куб.см.", NumberExType.SANTIMETER3) t.addVariant("КУБІЧНИЙ САНТИМЕТР", True) t.addAbridge("КУБ.САНТИМЕТР") t.addAbridge("КУБ.СМ.") t.addAbridge("СМ.КУБ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("КИЛОМЕТР", MorphLang.RU, True, "км.", NumberExType.KILOMETER) t.addAbridge("КМ") t.addAbridge("KM") t.addVariant("КІЛОМЕТР", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("КИЛОМЕТРОВЫЙ", MorphLang.RU, True, "км.", NumberExType.KILOMETER) t.addVariant("КІЛОМЕТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЯ", MorphLang.RU, True, "миль", NumberExType.KILOMETER) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ГРАММ", MorphLang.RU, True, "гр.", NumberExType.GRAMM) t.addAbridge("ГР") t.addAbridge("Г") t.addVariant("ГРАМ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ГРАММОВЫЙ", MorphLang.RU, True, "гр.", NumberExType.GRAMM) NumberExHelper._m_postfixes.add(t) t = Termin._new481("КИЛОГРАММ", MorphLang.RU, True, "кг.", NumberExType.KILOGRAM) t.addAbridge("КГ") t.addVariant("КІЛОГРАМ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("КИЛОГРАММОВЫЙ", MorphLang.RU, True, "кг.", NumberExType.KILOGRAM) t.addVariant("КІЛОГРАМОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИГРАММ", MorphLang.RU, True, "мг.", NumberExType.MILLIGRAM) t.addAbridge("МГ") t.addVariant("МІЛІГРАМ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИГРАММОВЫЙ", MorphLang.RU, True, "мг.", NumberExType.MILLIGRAM) t.addVariant("МИЛЛИГРАМОВЫЙ", True) t.addVariant("МІЛІГРАМОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ТОННА", MorphLang.RU, True, "т.", NumberExType.TONNA) t.addAbridge("Т") t.addAbridge("T") NumberExHelper._m_postfixes.add(t) t = Termin._new481("ТОННЫЙ", MorphLang.RU, True, "т.", NumberExType.TONNA) t.addVariant("ТОННИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ЛИТР", MorphLang.RU, True, "л.", NumberExType.LITR) t.addAbridge("Л") t.addVariant("ЛІТР", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ЛИТРОВЫЙ", MorphLang.RU, True, "л.", NumberExType.LITR) t.addVariant("ЛІТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИЛИТР", MorphLang.RU, True, "мл.", NumberExType.MILLILITR) t.addAbridge("МЛ") t.addVariant("МІЛІЛІТР", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИЛЛИЛИТРОВЫЙ", MorphLang.RU, True, "мл.", NumberExType.MILLILITR) t.addVariant("МІЛІЛІТРОВИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ЧАС", MorphLang.RU, True, "ч.", NumberExType.HOUR) t.addAbridge("Ч.") t.addVariant("ГОДИНА", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МИНУТА", MorphLang.RU, True, "мин.", NumberExType.MINUTE) t.addAbridge("МИН.") t.addVariant("ХВИЛИНА", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("СЕКУНДА", MorphLang.RU, True, "сек.", NumberExType.SECOND) t.addAbridge("СЕК.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("ГОД", MorphLang.RU, True, "г.", NumberExType.YEAR) t.addAbridge("Г.") t.addAbridge("ЛЕТ") t.addVariant("ЛЕТНИЙ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("МЕСЯЦ", MorphLang.RU, True, "мес.", NumberExType.MONTH) t.addAbridge("МЕС.") t.addVariant("МЕСЯЧНЫЙ", True) t.addVariant("КАЛЕНДАРНЫЙ МЕСЯЦ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ДЕНЬ", MorphLang.RU, True, "дн.", NumberExType.DAY) t.addAbridge("ДН.") t.addVariant("ДНЕВНЫЙ", True) t.addVariant("СУТКИ", True) t.addVariant("СУТОЧНЫЙ", True) t.addVariant("КАЛЕНДАРНЫЙ ДЕНЬ", True) t.addVariant("РАБОЧИЙ ДЕНЬ", True) NumberExHelper._m_postfixes.add(t) t = Termin._new481("НЕДЕЛЯ", MorphLang.RU, True, "нед.", NumberExType.WEEK) t.addVariant("НЕДЕЛЬНЫЙ", True) t.addVariant("КАЛЕНДАРНАЯ НЕДЕЛЯ", False) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ПРОЦЕНТ", MorphLang.RU, True, "%", NumberExType.PERCENT) t.addVariant("%", False) t.addVariant("ПРОЦ", True) t.addAbridge("ПРОЦ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("ШТУКА", MorphLang.RU, True, "шт.", NumberExType.SHUK) t.addVariant("ШТ", False) t.addAbridge("ШТ.") t.addAbridge("ШТ-К") NumberExHelper._m_postfixes.add(t) t = Termin._new481("УПАКОВКА", MorphLang.RU, True, "уп.", NumberExType.UPAK) t.addVariant("УПАК", True) t.addVariant("УП", True) t.addAbridge("УПАК.") t.addAbridge("УП.") t.addAbridge("УП-КА") NumberExHelper._m_postfixes.add(t) t = Termin._new481("РУЛОН", MorphLang.RU, True, "рулон", NumberExType.RULON) t.addVariant("РУЛ", True) t.addAbridge("РУЛ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("НАБОР", MorphLang.RU, True, "набор", NumberExType.NABOR) t.addVariant("НАБ", True) t.addAbridge("НАБ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("КОМПЛЕКТ", MorphLang.RU, True, "компл.", NumberExType.KOMPLEKT) t.addVariant("КОМПЛ", True) t.addAbridge("КОМПЛ.") NumberExHelper._m_postfixes.add(t) t = Termin._new481("ПАРА", MorphLang.RU, True, "пар", NumberExType.PARA) NumberExHelper._m_postfixes.add(t) t = Termin._new481("ФЛАКОН", MorphLang.RU, True, "флак.", NumberExType.FLAKON) t.addVariant("ФЛ", True) t.addAbridge("ФЛ.") t.addVariant("ФЛАК", True) t.addAbridge("ФЛАК.") NumberExHelper._m_postfixes.add(t) for te in NumberExHelper._m_postfixes.termins: ty = Utils.valToEnum(te.tag, NumberExType) if (not ty in NumberExHelper._m_normals_typs): NumberExHelper._m_normals_typs[ty] = te.canonic_text NumberExHelper.__m_small_money = TerminCollection() t = Termin._new141("УСЛОВНАЯ ЕДИНИЦА", "УЕ", NumberExType.MONEY) t.addAbridge("У.Е.") t.addAbridge("У.E.") t.addAbridge("Y.Е.") t.addAbridge("Y.E.") NumberExHelper._m_postfixes.add(t) for k in range(3): str0_ = EpNerCoreInternalResourceHelper.getString( ("Money.csv" if k == 0 else ("MoneyUA.csv" if k == 1 else "MoneyEN.csv"))) if (str0_ is None): continue lang = (MorphLang.RU if k == 0 else (MorphLang.UA if k == 1 else MorphLang.EN)) if (str0_ is None): continue for line0 in Utils.splitString(str0_, '\n', False): line = line0.strip() if (Utils.isNullOrEmpty(line)): continue parts = Utils.splitString(line.upper(), ';', False) if (parts is None or len(parts) != 5): continue if (Utils.isNullOrEmpty(parts[1]) or Utils.isNullOrEmpty(parts[2])): continue t = Termin() t.initByNormalText(parts[1], lang) t.canonic_text = parts[2] t.tag = NumberExType.MONEY for p in Utils.splitString(parts[0], ',', False): if (p != parts[1]): t0 = Termin() t0.initByNormalText(p, None) t.addVariantTerm(t0) if (parts[1] == "РУБЛЬ"): t.addAbridge("РУБ.") elif (parts[1] == "ГРИВНЯ"): t.addAbridge("ГРН.") elif (parts[1] == "ДОЛЛАР"): t.addAbridge("ДОЛ.") t.addAbridge("ДОЛЛ.") elif (parts[1] == "ДОЛАР"): t.addAbridge("ДОЛ.") NumberExHelper._m_postfixes.add(t) if (Utils.isNullOrEmpty(parts[3])): continue num = 0 i = parts[3].find(' ') if (i < 2): continue wrapnum526 = RefOutArgWrapper(0) inoutres527 = Utils.tryParseInt(parts[3][0:0 + i], wrapnum526) num = wrapnum526.value if (not inoutres527): continue vv = parts[3][i:].strip() t = Termin() t.initByNormalText(parts[4], lang) t.tag = (num) if (vv != parts[4]): t0 = Termin() t0.initByNormalText(vv, None) t.addVariantTerm(t0) if (parts[4] == "КОПЕЙКА" or parts[4] == "КОПІЙКА"): t.addAbridge("КОП.") NumberExHelper.__m_small_money.add(t)
def calc_delta(prev : 'InstrToken1', next0_ : 'InstrToken1', can_sub_numbers : bool) -> int: n1 = prev.last_number n2 = next0_.last_number if (next0_.last_min_number > 0): n2 = next0_.last_min_number if (len(prev.numbers) == len(next0_.numbers)): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == next0_.num_typ): pass else: return 0 if (len(prev.numbers) > 1): i = 0 while i < (len(prev.numbers) - 1): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 if (n1 >= n2): return 0 return n2 - n1 if (not can_sub_numbers): return 0 if ((len(prev.numbers) + 1) == len(next0_.numbers) and len(next0_.numbers) > 0): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.DIGIT and next0_.num_typ == NumberTypes.TWODIGITS): pass elif (prev.num_typ == NumberTypes.TWODIGITS and next0_.num_typ == NumberTypes.THREEDIGITS): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.FOURDIGITS): pass elif (prev.num_typ == NumberTypes.LETTER and next0_.num_typ == NumberTypes.TWODIGITS and str.isalpha(next0_.numbers[0][0])): pass else: return 0 i = 0 while i < len(prev.numbers): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 return n2 if ((len(prev.numbers) - 1) == len(next0_.numbers) and len(prev.numbers) > 1): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.TWODIGITS): if (next0_.num_typ == NumberTypes.DIGIT): pass elif (next0_.num_typ == NumberTypes.LETTER and str.isalpha(prev.numbers[0][0])): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.TWODIGITS): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.THREEDIGITS): pass else: return 0 i = 0 while i < (len(prev.numbers) - 2): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11556 = RefOutArgWrapper(0) inoutres1557 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 2], wrapn11556) n1 = wrapn11556.value if (not inoutres1557): if (len(prev.numbers) == 2): n1 = prev.first_number else: return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 if ((len(prev.numbers) - 2) == len(next0_.numbers) and len(prev.numbers) > 2): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.DIGIT): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.TWODIGITS): pass else: return 0 i = 0 while i < (len(prev.numbers) - 3): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11558 = RefOutArgWrapper(0) inoutres1559 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 3], wrapn11558) n1 = wrapn11558.value if (not inoutres1559): return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 if ((len(prev.numbers) - 3) == len(next0_.numbers) and len(prev.numbers) > 3): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.DIGIT): pass else: return 0 i = 0 while i < (len(prev.numbers) - 4): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11560 = RefOutArgWrapper(0) inoutres1561 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 4], wrapn11560) n1 = wrapn11560.value if (not inoutres1561): return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 return 0
def calcDelta(prev : 'InstrToken1', next0_ : 'InstrToken1', can_sub_numbers : bool) -> int: """ Разница между двумя номерами Args: prev(InstrToken1): next0_(InstrToken1): can_sub_numbers(bool): может быть 1. - 1.1 - 2. Returns: int: больше 0 - отличаются на это число, 0 не стыкуются """ n1 = prev.last_number n2 = next0_.last_number if (next0_.last_min_number > 0): n2 = next0_.last_min_number if (len(prev.numbers) == len(next0_.numbers)): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == next0_.num_typ): pass else: return 0 if (len(prev.numbers) > 1): i = 0 while i < (len(prev.numbers) - 1): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 if (n1 >= n2): return 0 return n2 - n1 if (not can_sub_numbers): return 0 if ((len(prev.numbers) + 1) == len(next0_.numbers) and len(next0_.numbers) > 0): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.DIGIT and next0_.num_typ == NumberTypes.TWODIGITS): pass elif (prev.num_typ == NumberTypes.TWODIGITS and next0_.num_typ == NumberTypes.THREEDIGITS): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.FOURDIGITS): pass elif (prev.num_typ == NumberTypes.LETTER and next0_.num_typ == NumberTypes.TWODIGITS and str.isalpha(next0_.numbers[0][0])): pass else: return 0 i = 0 while i < len(prev.numbers): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 return n2 if ((len(prev.numbers) - 1) == len(next0_.numbers) and len(prev.numbers) > 1): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.TWODIGITS): if (next0_.num_typ == NumberTypes.DIGIT): pass elif (next0_.num_typ == NumberTypes.LETTER and str.isalpha(prev.numbers[0][0])): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.TWODIGITS): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.THREEDIGITS): pass else: return 0 i = 0 while i < (len(prev.numbers) - 2): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11450 = RefOutArgWrapper(0) inoutres1451 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 2], wrapn11450) n1 = wrapn11450.value if (not inoutres1451): if (len(prev.numbers) == 2): n1 = prev.first_number else: return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 if ((len(prev.numbers) - 2) == len(next0_.numbers) and len(prev.numbers) > 2): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.THREEDIGITS and next0_.num_typ == NumberTypes.DIGIT): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.TWODIGITS): pass else: return 0 i = 0 while i < (len(prev.numbers) - 3): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11452 = RefOutArgWrapper(0) inoutres1453 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 3], wrapn11452) n1 = wrapn11452.value if (not inoutres1453): return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 if ((len(prev.numbers) - 3) == len(next0_.numbers) and len(prev.numbers) > 3): if (prev.typ_container_rank > 0 and prev.typ_container_rank == next0_.typ_container_rank): pass elif (prev.num_typ == NumberTypes.FOURDIGITS and next0_.num_typ == NumberTypes.DIGIT): pass else: return 0 i = 0 while i < (len(prev.numbers) - 4): if (prev.numbers[i] != next0_.numbers[i]): return 0 i += 1 wrapn11454 = RefOutArgWrapper(0) inoutres1455 = Utils.tryParseInt(prev.numbers[len(prev.numbers) - 4], wrapn11454) n1 = wrapn11454.value if (not inoutres1455): return 0 if ((n1 + 1) != n2): return 0 return n2 - n1 return 0
def _to_string(self, short_variant: bool, lang: 'MorphLang', lev: int, from_range: int) -> str: from pullenti.ner.date.internal.DateRelHelper import DateRelHelper res = io.StringIO() p = self.pointer if (lang is None): lang = MorphLang.RU if (self.is_relative): if (self.pointer == DatePointerType.TODAY): print("сейчас".format(), end="", file=res, flush=True) if (not short_variant): DateRelHelper.append_to_string(self, res) return Utils.toStringStringIO(res) word = None val = 0 back = False is_local_rel = self.get_string_value( DateReferent.ATTR_ISRELATIVE) == "true" for s in self.slots: if (s.type_name == DateReferent.ATTR_CENTURY): word = "век" wrapval784 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval784) val = wrapval784.value elif (s.type_name == DateReferent.ATTR_YEAR): word = "год" wrapval785 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval785) val = wrapval785.value elif (s.type_name == DateReferent.ATTR_MONTH): word = "месяц" wrapval786 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval786) val = wrapval786.value if (not is_local_rel and val >= 1 and val <= 12): print(DateReferent.__m_month0[val - 1], end="", file=res) elif (s.type_name == DateReferent.ATTR_DAY): word = "день" wrapval787 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval787) val = wrapval787.value if ((not is_local_rel and self.month > 0 and self.month <= 12) and self.higher is not None and self.higher.get_string_value( DateReferent.ATTR_ISRELATIVE) != "true"): print("{0} {1}".format( val, DateReferent.__m_month[self.month - 1]), end="", file=res, flush=True) elif (not is_local_rel): print("{0} число".format(val), end="", file=res, flush=True) elif (s.type_name == DateReferent.ATTR_QUARTAL): word = "квартал" wrapval788 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval788) val = wrapval788.value elif (s.type_name == DateReferent.ATTR_WEEK): word = "неделя" wrapval789 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval789) val = wrapval789.value elif (s.type_name == DateReferent.ATTR_HOUR): word = "час" wrapval790 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval790) val = wrapval790.value if (not is_local_rel): print("{0}:{1}".format("{:02d}".format(val), "{:02d}".format(self.minute)), end="", file=res, flush=True) elif (s.type_name == DateReferent.ATTR_MINUTE): word = "минута" wrapval791 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval791) val = wrapval791.value elif (s.type_name == DateReferent.ATTR_DAYOFWEEK): wrapval792 = RefOutArgWrapper(0) Utils.tryParseInt(Utils.asObjectOrNull(s.value, str), wrapval792) val = wrapval792.value if (not is_local_rel): print((DateReferent.__m_week_day_ex[val - 1] if val >= 1 and val <= 7 else "?"), end="", file=res) else: if (val < 0): val = (-val) back = True if (val >= 0 and val <= 7): print("{0} {1}".format( ((("прошлое" if back else "будущее")) if val == 7 else ((("прошлая" if back else "будущая")) if (val == 3 or val == 6) else (("прошлый" if back else "будущий")))), DateReferent.__m_week_day_ex[val - 1]), end="", file=res, flush=True) break if (word is not None and is_local_rel): if (val == 0): print("{0} {1}".format( ("текущая" if word == "неделя" or word == "минута" else "текущий"), word), end="", file=res, flush=True) elif (val > 0 and not back): print("{0} {1} вперёд".format( val, MiscHelper.get_text_morph_var_by_case_and_number_ex( word, None, MorphNumber.UNDEFINED, str(val))), end="", file=res, flush=True) else: val = (-val) print("{0} {1} назад".format( val, MiscHelper.get_text_morph_var_by_case_and_number_ex( word, None, MorphNumber.UNDEFINED, str(val))), end="", file=res, flush=True) elif (not is_local_rel and res.tell() == 0): print("{0} {1}".format( val, MiscHelper.get_text_morph_var_by_case_and_number_ex( word, None, MorphNumber.UNDEFINED, str(val))), end="", file=res, flush=True) if (not short_variant): DateRelHelper.append_to_string(self, res) if (from_range == 1): Utils.insertStringIO( res, 0, "{0} ".format(("з" if lang.is_ua else ("from" if lang.is_en else "с")))) elif (from_range == 2): Utils.insertStringIO(res, 0, ("to " if lang.is_en else "по ")) return Utils.toStringStringIO(res) if (from_range == 1): print("{0} ".format(("з" if lang.is_ua else ("from" if lang.is_en else "с"))), end="", file=res, flush=True) elif (from_range == 2): print(("to " if lang.is_en else "по ").format(), end="", file=res, flush=True) if (p != DatePointerType.NO): val = MetaDate.POINTER.convert_inner_value_to_outer_value( Utils.enumToString(p), lang) if (from_range == 0 or lang.is_en): pass elif (from_range == 1): if (p == DatePointerType.BEGIN): val = ("початку" if lang.is_ua else "начала") elif (p == DatePointerType.CENTER): val = ("середини" if lang.is_ua else "середины") elif (p == DatePointerType.END): val = ("кінця" if lang.is_ua else "конца") elif (p == DatePointerType.TODAY): val = ("цього часу" if lang.is_ua else "настоящего времени") elif (from_range == 2): if (p == DatePointerType.BEGIN): val = ("початок" if lang.is_ua else "начало") elif (p == DatePointerType.CENTER): val = ("середину" if lang.is_ua else "середину") elif (p == DatePointerType.END): val = ("кінець" if lang.is_ua else "конец") elif (p == DatePointerType.TODAY): val = ("теперішній час" if lang.is_ua else "настоящее время") print("{0} ".format(val), end="", file=res, flush=True) if (self.day_of_week > 0): if (lang.is_en): print("{0}, ".format( DateReferent.__m_week_day_en[self.day_of_week - 1]), end="", file=res, flush=True) else: print("{0}, ".format( DateReferent.__m_week_day[self.day_of_week - 1]), end="", file=res, flush=True) y = self.year m = self.month d = self.day cent = self.century if (y == 0 and cent != 0): is_bc = cent < 0 if (cent < 0): cent = (-cent) print(NumberHelper.get_number_roman(cent), end="", file=res) if (lang.is_ua): print(" century", end="", file=res) elif (m > 0 or p != DatePointerType.NO or from_range == 1): print((" віка" if lang.is_ua else " века"), end="", file=res) else: print((" вік" if lang.is_ua else " век"), end="", file=res) if (is_bc): print((" до н.е." if lang.is_ua else " до н.э."), end="", file=res) return Utils.toStringStringIO(res) if (d > 0): print(d, end="", file=res) if (m > 0 and m <= 12): if (res.tell() > 0 and Utils.getCharAtStringIO(res, res.tell() - 1) != ' '): print(' ', end="", file=res) if (lang.is_ua): print((DateReferent.__m_monthua[m - 1] if d > 0 or p != DatePointerType.NO or from_range != 0 else DateReferent.__m_month0ua[m - 1]), end="", file=res) elif (lang.is_en): print(DateReferent.__m_monthen[m - 1], end="", file=res) else: print((DateReferent.__m_month[m - 1] if d > 0 or p != DatePointerType.NO or from_range != 0 else DateReferent.__m_month0[m - 1]), end="", file=res) if (y != 0): is_bc = y < 0 if (y < 0): y = (-y) if (res.tell() > 0 and Utils.getCharAtStringIO(res, res.tell() - 1) != ' '): print(' ', end="", file=res) if (lang is not None and lang.is_en): print("{0}".format(y), end="", file=res, flush=True) elif (short_variant): print("{0}{1}".format(y, ("р" if lang.is_ua else "г")), end="", file=res, flush=True) elif (m > 0 or p != DatePointerType.NO or from_range == 1): print("{0} {1}".format(y, ("року" if lang.is_ua else "года")), end="", file=res, flush=True) else: print("{0} {1}".format(y, ("рік" if lang.is_ua else "год")), end="", file=res, flush=True) if (is_bc): print((" до н.е." if lang.is_ua else ("BC" if lang.is_en else " до н.э.")), end="", file=res) h = self.hour mi = self.minute se = self.second if (h >= 0 and mi >= 0): if (res.tell() > 0): print(' ', end="", file=res) print("{0}:{1}".format("{:02d}".format(h), "{:02d}".format(mi)), end="", file=res, flush=True) if (se >= 0): print(":{0}".format("{:02d}".format(se)), end="", file=res, flush=True) if (res.tell() == 0): if (self.quartal != 0): print("{0}-й квартал".format(self.quartal), end="", file=res, flush=True) if (res.tell() == 0): return "?" while Utils.getCharAtStringIO( res, res.tell() - 1) == ' ' or Utils.getCharAtStringIO( res, res.tell() - 1) == ',': Utils.setLengthStringIO(res, res.tell() - 1) if (not short_variant and self.is_relative): DateRelHelper.append_to_string(self, res) return Utils.toStringStringIO(res).strip()
def _process(begin : 'Token', max_char_pos : int, kit : 'AnalysisKit', end_token : 'Token') -> 'TitlePageReferent': end_token.value = begin res = TitlePageReferent() term = None lines = Line.parse(begin, 30, 1500, max_char_pos) if (len(lines) < 1): return None cou = len(lines) min_newlines_count = 10 lines_count_stat = dict() i = 0 while i < len(lines): if (TitleNameToken.can_be_start_of_text_or_content(lines[i].begin_token, lines[i].end_token)): cou = i break j = lines[i].newlines_before_count if (i > 0 and j > 0): if (not j in lines_count_stat): lines_count_stat[j] = 1 else: lines_count_stat[j] += 1 i += 1 max0_ = 0 for kp in lines_count_stat.items(): if (kp[1] > max0_): max0_ = kp[1] min_newlines_count = kp[0] end_char = (lines[cou - 1].end_char if cou > 0 else 0) if (max_char_pos > 0 and end_char > max_char_pos): end_char = max_char_pos names = list() i = 0 while i < cou: if (i == 6): pass j = i while (j < cou) and (j < (i + 5)): if (i == 6 and j == 8): pass if (j > i): if (lines[j - 1].is_pure_en and lines[j].is_pure_ru): break if (lines[j - 1].is_pure_ru and lines[j].is_pure_en): break if (lines[j].newlines_before_count >= (min_newlines_count * 2)): break ttt = TitleNameToken.try_parse(lines[i].begin_token, lines[j].end_token, min_newlines_count) if (ttt is not None): if (lines[i].is_pure_en): ttt.morph.language = MorphLang.EN elif (lines[i].is_pure_ru): ttt.morph.language = MorphLang.RU names.append(ttt) j += 1 i += 1 TitleNameToken.sort(names) name_rt = None if (len(names) > 0): i0 = 0 if (names[i0].morph.language.is_en): ii = 1 while ii < len(names): if (names[ii].morph.language.is_ru and names[ii].rank > 0): i0 = ii break ii += 1 term = res._add_name(names[i0].begin_name_token, names[i0].end_name_token) if (names[i0].type_value is not None): res._add_type(names[i0].type_value) if (names[i0].speciality is not None): res.speciality = names[i0].speciality rt = ReferentToken(res, names[i0].begin_token, names[i0].end_token) if (kit is not None): kit.embed_token(rt) else: res.add_occurence(TextAnnotation(rt.begin_token, rt.end_token)) end_token.value = rt.end_token name_rt = rt if (begin.begin_char == rt.begin_char): begin = (rt) if (term is not None and kit is not None): t = kit.first_token first_pass3397 = True while True: if first_pass3397: first_pass3397 = False else: t = t.next0_ if (not (t is not None)): break tok = term.try_parse(t, TerminParseAttr.NO) if (tok is None): continue t0 = t t1 = tok.end_token if (t1.next0_ is not None and t1.next0_.is_char('.')): t1 = t1.next0_ if (BracketHelper.can_be_start_of_sequence(t0.previous, False, False) and BracketHelper.can_be_end_of_sequence(t1.next0_, False, None, False)): t0 = t0.previous t1 = t1.next0_ rt = ReferentToken(res, t0, t1) kit.embed_token(rt) t = (rt) pr = PersonRelations() pers_typ = TitleItemToken.Types.UNDEFINED pers_types = pr.rel_types t = begin first_pass3398 = True while True: if first_pass3398: first_pass3398 = False else: t = t.next0_ if (not (t is not None)): break if (max_char_pos > 0 and t.begin_char > max_char_pos): break if (t == name_rt): continue tpt = TitleItemToken.try_attach(t) if (tpt is not None): pers_typ = TitleItemToken.Types.UNDEFINED if (tpt.typ == TitleItemToken.Types.TYP): if (len(res.types) == 0): res._add_type(tpt.value) elif (len(res.types) == 1): ty = res.types[0].upper() if (ty == "РЕФЕРАТ"): res._add_type(tpt.value) elif (ty == "АВТОРЕФЕРАТ"): if (tpt.value == "КАНДИДАТСКАЯ ДИССЕРТАЦИЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат кандидатской диссертации", True, 0) elif (tpt.value == "ДОКТОРСКАЯ ДИССЕРТАЦИЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат докторской диссертации", True, 0) elif (tpt.value == "МАГИСТЕРСКАЯ ДИССЕРТАЦИЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат магистерской диссертации", True, 0) elif (tpt.value == "КАНДИДАТСЬКА ДИСЕРТАЦІЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат кандидатської дисертації", True, 0) elif (tpt.value == "ДОКТОРСЬКА ДИСЕРТАЦІЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат докторської дисертації", True, 0) elif (tpt.value == "МАГІСТЕРСЬКА ДИСЕРТАЦІЯ"): res.add_slot(TitlePageReferent.ATTR_TYPE, "автореферат магістерської дисертації", True, 0) else: res._add_type(tpt.value) elif (tpt.value == "РЕФЕРАТ" or tpt.value == "АВТОРЕФЕРАТ"): if (not tpt.value in ty): res._add_type(tpt.value) elif (tpt.typ == TitleItemToken.Types.SPECIALITY): if (res.speciality is None): res.speciality = tpt.value elif (tpt.typ in pers_types): pers_typ = tpt.typ t = tpt.end_token if (t.end_char > end_token.value.end_char): end_token.value = t if (t.next0_ is not None and t.next0_.is_char_of(":-")): t = t.next0_ continue if (t.end_char > end_char): break rli = t.get_referents() if (rli is None): continue if (not t.is_newline_before and (isinstance(t.previous, TextToken))): s = t.previous.term if (s == "ИМЕНИ" or s == "ИМ"): continue if (s == "." and t.previous.previous is not None and t.previous.previous.is_value("ИМ", None)): continue for r in rli: if (isinstance(r, PersonReferent)): if (r != rli[0]): continue p = Utils.asObjectOrNull(r, PersonReferent) if (pers_typ != TitleItemToken.Types.UNDEFINED): if (t.previous is not None and t.previous.is_char('.')): pers_typ = TitleItemToken.Types.UNDEFINED typ = pr.calc_typ_from_attrs(p) if (typ != TitleItemToken.Types.UNDEFINED): pr.add(p, typ, 1) pers_typ = typ elif (pers_typ != TitleItemToken.Types.UNDEFINED): pr.add(p, pers_typ, 1) elif (t.previous is not None and t.previous.is_char('©')): pers_typ = TitleItemToken.Types.WORKER pr.add(p, pers_typ, 1) else: tt = t.next0_ first_pass3399 = True while True: if first_pass3399: first_pass3399 = False else: tt = tt.next0_ if (not (tt is not None)): break rr = tt.get_referent() if (rr == res): pers_typ = TitleItemToken.Types.WORKER break if (isinstance(rr, PersonReferent)): if (pr.calc_typ_from_attrs(Utils.asObjectOrNull(r, PersonReferent)) != TitleItemToken.Types.UNDEFINED): break else: continue if (rr is not None): break tpt = TitleItemToken.try_attach(tt) if (tpt is not None): if (tpt.typ != TitleItemToken.Types.TYP and tpt.typ != TitleItemToken.Types.TYPANDTHEME): break tt = tpt.end_token if (tt.end_char > end_token.value.end_char): end_token.value = tt continue if (pers_typ == TitleItemToken.Types.UNDEFINED): tt = t.previous while tt is not None: rr = tt.get_referent() if (rr == res): pers_typ = TitleItemToken.Types.WORKER break if (rr is not None): break if ((tt.is_value("СТУДЕНТ", None) or tt.is_value("СТУДЕНТКА", None) or tt.is_value("СЛУШАТЕЛЬ", None)) or tt.is_value("ДИПЛОМНИК", None) or tt.is_value("ИСПОЛНИТЕЛЬ", None)): pers_typ = TitleItemToken.Types.WORKER break tpt = TitleItemToken.try_attach(tt) if (tpt is not None and tpt.typ != TitleItemToken.Types.TYP): break tt = tt.previous if (pers_typ != TitleItemToken.Types.UNDEFINED): pr.add(p, pers_typ, 1) else: pr.add(p, pers_typ, 0.5) if (t.end_char > end_token.value.end_char): end_token.value = t continue if (r == rli[0]): pers_typ = TitleItemToken.Types.UNDEFINED if (isinstance(r, DateReferent)): if (res.date is None): res.date = Utils.asObjectOrNull(r, DateReferent) if (t.end_char > end_token.value.end_char): end_token.value = t elif (isinstance(r, GeoReferent)): if (res.city is None and r.is_city): res.city = Utils.asObjectOrNull(r, GeoReferent) if (t.end_char > end_token.value.end_char): end_token.value = t if (isinstance(r, OrganizationReferent)): org0_ = Utils.asObjectOrNull(r, OrganizationReferent) if ("курс" in org0_.types and org0_.number is not None): i = 0 wrapi2673 = RefOutArgWrapper(0) inoutres2674 = Utils.tryParseInt(org0_.number, wrapi2673) i = wrapi2673.value if (inoutres2674): if (i > 0 and (i < 8)): res.student_year = i while org0_.higher is not None: if (org0_.kind != OrganizationKind.DEPARTMENT): break org0_ = org0_.higher if (org0_.kind != OrganizationKind.DEPARTMENT): if (res.org0_ is None): res.org0_ = org0_ elif (OrganizationReferent.can_be_higher(res.org0_, org0_)): res.org0_ = org0_ if (t.end_char > end_token.value.end_char): end_token.value = t if ((isinstance(r, UriReferent)) or (isinstance(r, GeoReferent))): if (t.end_char > end_token.value.end_char): end_token.value = t for ty in pers_types: for p in pr.get_persons(ty): if (pr.get_attr_name_for_type(ty) is not None): res.add_slot(pr.get_attr_name_for_type(ty), p, False, 0) if (res.get_slot_value(TitlePageReferent.ATTR_AUTHOR) is None): for p in pr.get_persons(TitleItemToken.Types.UNDEFINED): res.add_slot(TitlePageReferent.ATTR_AUTHOR, p, False, 0) break if (res.city is None and res.org0_ is not None): s = res.org0_.find_slot(OrganizationReferent.ATTR_GEO, None, True) if (s is not None and (isinstance(s.value, GeoReferent))): if (s.value.is_city): res.city = Utils.asObjectOrNull(s.value, GeoReferent) if (res.date is None): t = begin first_pass3400 = True while True: if first_pass3400: first_pass3400 = False else: t = t.next0_ if (not (t is not None and t.end_char <= end_char)): break city = Utils.asObjectOrNull(t.get_referent(), GeoReferent) if (city is None): continue if (isinstance(t.next0_, TextToken)): if (t.next0_.is_char_of(":,") or t.next0_.is_hiphen): t = t.next0_ rt = t.kit.process_referent(DateAnalyzer.ANALYZER_NAME, t.next0_) if (rt is not None): rt.save_to_local_ontology() res.date = Utils.asObjectOrNull(rt.referent, DateReferent) if (kit is not None): kit.embed_token(rt) break if (len(res.slots) == 0): return None else: return res