def loc_case(func, i): # Местный падеж r = i.result # local if _.contains(i.index, 'П2') or _.contains(i.index, 'П₂'): loc = r['dat-sg'] # local loc = _.replaced(loc, '́ ', '') loc = _.replaced(loc, 'ё', 'е') loc = _.replaced(loc, '({vowel})({consonant}*)$', '%1́ %2') loc = remove_stress_if_one_syllable(loc) # = export. r['loc-sg'] = loc loc_prep = _.extract(i.index, 'П2%((.+)%)') # local if not loc_prep: loc_prep = _.extract(i.index, 'П₂%((.+)%)') # end if not loc_prep: loc_prep = 'в, на' # end r['loc-sg'] = '(' + loc_prep + ') ' + r['loc-sg'] if _.contains(i.index, '%[П'): r['loc-sg'] = r['loc-sg'] + ' //<br />' + r['prp-sg'] # end # end if _.has_value(i.args, 'М'): r['loc-sg'] = i.args['М'] # end _.ends(module, func)
def forward_args(func, i): # export # INFO: Используется дважды -- при инициализации, и потом в самом конце # local keys, args r = i.result # local args = i.args keys = [ 'nom-sg', 'gen-sg', 'dat-sg', 'acc-sg', 'ins-sg', 'prp-sg', 'nom-sg2', 'gen-sg2', 'dat-sg2', 'acc-sg2', 'ins-sg2', 'prp-sg2', 'nom-pl', 'gen-pl', 'dat-pl', 'acc-pl', 'ins-pl', 'prp-pl', 'nom-pl2', 'gen-pl2', 'dat-pl2', 'acc-pl2', 'ins-pl2', 'prp-pl2', 'voc-sg', 'loc-sg', 'prt-sg', 'srt-sg-m', 'srt-sg-f', 'srt-sg-n', 'srt-pl', 'comparative', 'comparative2' ] # list for j, key in enumerate(keys): if _.has_value(args, key): if args[key] == '-': r[key] = args[key] else: r[key] = args[key] + '<sup>△</sup>' # end # end # end keys = [ 'П', 'Пр', 'Сч', 'hide-text', 'зачин', 'слоги', 'дореф', 'скл', 'зализняк', 'зализняк1', 'чередование', 'pt', 'st', 'затрудн', 'клитика', 'коммент', 'тип', 'степень', ] # list for j, key in enumerate(keys): if _.has_value(args, key): r[key] = args[key] # end # end if _.has_key(r, 'слоги'): if not _.contains(r['слоги'], '%<'): r['слоги'] = syllables.get_syllables(r['слоги']) # end else: r['слоги'] = i.word.unstressed # fixme: может всё-таки stressed? # end _.ends(module, func)
def process(func, i): # export _.log_info('Извлечение информации об ударении (stress_type)') stress.extract_stress_type(i) # todo: move to `parse` _.log_value(i.stress_type, 'i.stress_type') if e.has_error(i): return _.returns(module, func, i) # end if not i.stress_type: # если ударение не указано if _.contains(i.rest_index, '0'): # если несклоняемая схема i.stress_type = '' else: # INFO: Если при этом есть какой-то индекс, это явно ОШИБКА if _.has_value(i.rest_index): e.add_error(i, 'Нераспознанная часть индекса: ' + i.rest_index) return _.returns(module, func, i) # end # INFO: Если же индекса вообще нет, то и формы просто не известны: i.has_index = False return _.returns(module, func, i) # end # end _.log_info('Вычисление схемы ударения') stress.get_stress_schema(i) _.log_info('Определение типа основы (stem_type)') stem_type.get_stem_type(i) _.log_value(i.stem.type, 'i.stem.type') _.log_value(i.stem.base_type, 'i.stem.base_type') # INFO: Итак, ударение мы получили. # INFO: Добавление ударения для `stem.stressed` (если его не было) # INFO: Например, в слове только один слог, или ударение было на окончание if not _.contains(i.stem.stressed, '[́ ё]'): # and not i.absent_stress ?? if _.equals(i.stress_type, ["f", "f'"]): i.stem.stressed = _.replaced(i.stem.stressed, '^({consonant}*)({vowel})', '%1%2́ ') elif _.contains(i.rest_index, '%*'): pass # *** поставим ударение позже, после чередования else: i.stem.stressed = _.replaced(i.stem.stressed, '({vowel})({consonant}*)$', '%1́ %2') # end # end _.log_value(i.stem.stressed, 'i.stem.stressed') _.log_info('Инициализируем `i.result`') init_result.init_result(i) return _.returns(module, func, i)
def prt_case(func, i): # Разделительный падеж r = i.result # local if _.contains(i.index, 'Р2') or _.contains(i.index, 'Р₂'): r['prt-sg'] = r['dat-sg'] # end if _.has_value(i.args, 'Р'): r['prt-sg'] = i.args['Р'] # end _.ends(module, func)
def voc_case(func, i): # Звательный падеж r = i.result # local if _.has_value(i.args, 'З'): r['voc-sg'] = i.args['З'] elif _.contains(i.index, 'З'): if _.endswith(i.word.unstressed, ['а', 'я']): r['voc-sg'] = r['gen-pl'] else: r['error'] = 'Ошибка: Для автоматического звательного падежа, слово должно оканчиваться на -а/-я' # end # end _.ends(module, func)