예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 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
예제 #5
0
 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
예제 #6
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
예제 #7
0
 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
예제 #8
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
예제 #9
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
예제 #10
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
예제 #11
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
예제 #12
0
 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
예제 #13
0
 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
예제 #14
0
 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
예제 #15
0
 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
예제 #16
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
예제 #17
0
 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
예제 #18
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
예제 #19
0
 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
예제 #20
0
 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
예제 #21
0
 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
예제 #22
0
 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
예제 #23
0
 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
예제 #24
0
 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
예제 #25
0
 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_
예제 #26
0
 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)
예제 #27
0
 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
예제 #28
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
예제 #29
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()
예제 #30
0
 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