Module:User:Ssvb/ru-autoaccent

From Wiktionary, the free dictionary
Jump to navigation Jump to search

7 of 64 tests failed. (refresh)

TextExpectedActual
test__xfail:
FailedПо страсти? Какія у васъ антидилювіальныя мысли! Кто нынче говоритъ про страсти? —Лев Толсто́йWon't work correctly until the "антидилювиа́льный" entry is added to the dictionaryПо стра́сти? Каки́е у вас антидилювиальныя мы́сли! Кто ны́нче говори́т про стра́сти? —Лев Толсто́й
FailedОна подошла къ Алексѣю Александровичу и съ фамильярностью близости смерти, взявъ его за руку, повлекла въ спальню. —Лев Толсто́йWon't work correctly until the "за́ руку" entry is added to the dictionaryОна подошла́ к Алексе́ю Александровичу и с фамилья́рностью бли́зости сме́рти, взяв его́ за ру́ку, повлекла́ в спа́льню. —Лев Толсто́й
FailedОни заселились в четырехзвездный отель. Две буквы ё в слове могут не быть корректно идентифицированы Lua-модулем.Они́ засели́лись в четырёхзвё́здный оте́ль. Две бу́квы ё в сло́ве мо́гут не быть корре́ктно идентифици́рованы Lua-мо́дулем.Они́ засели́лись в четырехзвездный оте́ль. Две бу́квы ё в сло́ве мо́гут не быть корре́ктно идентифици́рованы Lua-мо́дулем.
FailedСодержимое ссылок игнорируется Lua-модулем. Примеры: "не Один" vs. "не Один" (имя бога). Но большого вреда от этого нет.Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "не О́дин" vs. "не О́дин" (и́мя бо́га). Но большо́го вреда́ от э́того нет.Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "не О́дин" vs. "не Один" (и́мя бо́га). Но большо́го вреда́ от э́того нет.
FailedСодержимое ссылок игнорируется Lua-модулем. Примеры: "до смерти" vs. "до смерти". Пожалуйста пользуйтесь ссылками на предложно-именные сочетания целиком: "до смерти"Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "до смерти" vs. "до смерти". Пожа́луйста по́льзуйтесь ссы́лками на предложно-именны́е сочета́ния целико́м: "до смерти"Содержи́мое ссы́лок игнори́руется Lua-мо́дулем. Приме́ры: "до смерти" vs. "до сме́рти". Пожа́луйста по́льзуйтесь ссы́лками на предложно-именны́е сочета́ния целико́м: "до смерти"
FailedКак будто должны быть без ударения, но словарь не всегда согласен: либо, нибудь, надо, обо, ото, перед, передо, подо, предо, через (см. либо)Как бу́дто должны́ быть без ударе́ния, но слова́рь не всегда́ согла́сен: либо, нибудь, надо, обо, ото, перед, передо, подо, предо, через (см. либо)Как бу́дто должны́ быть без ударе́ния, но слова́рь не всегда́ согла́сен: ли́бо, нибудь, на́до, обо, ото, перед, пе́редо, подо, пре́до, че́рез (см. либо)
TextExpectedActual
test_clitics:
Failedбез соли, за город, по воду, по лесу, на уши, под зиму, по цепи, на берег, на спину, на стену, на ногу, за ногу, за руку, на словобез соли, за город, по воду, по лесу, на уши, под зиму, по цепи, на берег, на спину, на стену, на ногу, за ногу, за руку, на словобез соли, за го́род, по во́ду, по лесу, на у́ши, под зи́му, по цепи, на берег, на спи́ну, на сте́ну, на но́гу, за но́гу, за ру́ку, на сло́во
TextExpectedActual
test_custom_ridiculous_nonsense:
Passed(антилопа), (зонтик)(собачья будка), галер(е́я), галер(ея), галер((ея)). Подо мной, перед входом. Галер, галер, галер((антило́па), (зо́нтик)(соба́чья бу́дка), галер(е́я), галер(ея), гале́р((её)). Подо мной, перед вхо́дом. Гале́р, гале́р, галер((антило́па), (зо́нтик)(соба́чья бу́дка), галер(е́я), галер(ея), гале́р((её)). Подо мной, перед вхо́дом. Гале́р, гале́р, галер(
Passedлучезарный, лу̀чезарный, лу̀чезарны́й, лу̀чеза́рный, катарсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́случеза́рный, лу̀чеза́рный, лу̀чезарны́й, лу̀чеза́рный, ка́та́рсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́случеза́рный, лу̀чеза́рный, лу̀чезарны́й, лу̀чеза́рный, ка́та́рсис, ка́та́рсис, ка́та́рси́с, ка́тарсис, ката́рсис, катарси́с
Passedдо самой смерти, до́ смерти, до смертидо самой сме́рти, до́ смерти, до смертидо самой сме́рти, до́ смерти, до смерти
Passedбезтолочь, бе́зтолочь, бѐзтолочьбе́столочь, бе́столочь, бѐстолочьбе́столочь, бе́столочь, бѐстолочь
TextExpectedActual
test_modern_quotations:
PassedВ кухне злится повариха,
Плачет у станка ткачиха,
И завидуют оне
Государевой жене.
Александр Пушкин
В ку́хне зли́тся повари́ха,
Пла́чет у станка́ ткачи́ха,
И зави́дуют оне́
Госуда́ревой жене́.
Алекса́ндр Пу́шкин
В ку́хне зли́тся повари́ха,
Пла́чет у станка́ ткачи́ха,
И зави́дуют оне́
Госуда́ревой жене́.
Алекса́ндр Пу́шкин
PassedПорядок, аккуратность, правильность во всем — были его качествами, и он не выносил ни малейшего промаха в писании. До смерти он был мил и любезен в обращении с дамами. —Николай КостомаровПоря́док, аккура́тность, пра́вильность во всем — бы́ли его́ ка́чествами, и он не выносил ни мале́йшего про́маха в писа́нии. До смерти он был мил и любе́зен в обраще́нии с да́мами. —Никола́й КостомаровПоря́док, аккура́тность, пра́вильность во всем — бы́ли его́ ка́чествами, и он не выносил ни мале́йшего про́маха в писа́нии. До смерти он был мил и любе́зен в обраще́нии с да́мами. —Никола́й Костомаров
PassedКум, отошедши в сторону, бродил в длинных сапогах взад и вперед и наконец набрел прямо на шинок. —Николай ГогольКум, отоше́дши в сто́рону, броди́л в дли́нных сапога́х взад и вперёд и наконе́ц набрёл пря́мо на шинок. —Никола́й Го́гольКум, отоше́дши в сто́рону, броди́л в дли́нных сапога́х взад и вперёд и наконе́ц набрёл пря́мо на шинок. —Никола́й Го́голь
PassedА ведьма, между тем, поднялась так высоко, что одним только черным пятнышком мелькала вверху. —Николай ГогольА ве́дьма, ме́жду тем, подняла́сь так высоко, что одни́м то́лько чёрным пя́тнышком мелька́ла вверху́. —Никола́й Го́гольА ве́дьма, ме́жду тем, подняла́сь так высоко, что одни́м то́лько чёрным пя́тнышком мелька́ла вверху́. —Никола́й Го́голь
PassedЯ слыхал о тамошних метелях и знал, что целые обозы бывали ими занесены. —Александр ПушкинЯ слыха́л о та́мошних мете́лях и знал, что це́лые обо́зы быва́ли ими занесены́. —Алекса́ндр Пу́шкинЯ слыха́л о та́мошних мете́лях и знал, что це́лые обо́зы быва́ли ими занесены́. —Алекса́ндр Пу́шкин
PassedБелогорская крепость находилась в сорока верстах от Оренбурга. —Александр ПушкинБелогорская кре́пость находи́лась в сорока вёрстах от Оренбу́рга. —Алекса́ндр Пу́шкинБелогорская кре́пость находи́лась в сорока вёрстах от Оренбу́рга. —Алекса́ндр Пу́шкин
PassedВходя в харчевню, он выпил рюмку водки и съел с какою-то начинкой пирог. —Фёдор ДостоевскийВходя́ в харче́вню, он вы́пил рю́мку во́дки и съел с какою-то начи́нкой пиро́г. —Фёдор Достое́вскийВходя́ в харче́вню, он вы́пил рю́мку во́дки и съел с какою-то начи́нкой пиро́г. —Фёдор Достое́вский
PassedСтояли крошеные огурцы, черные сухари и резанная кусочками рыба; все это очень дурно пахло. —Фёдор ДостоевскийСтоя́ли крошеные огурцы́, чёрные сухари́ и ре́занная кусо́чками ры́ба; все э́то о́чень ду́рно па́хло. —Фёдор Достое́вскийСтоя́ли крошеные огурцы́, чёрные сухари́ и ре́занная кусо́чками ры́ба; все э́то о́чень ду́рно па́хло. —Фёдор Достое́вский
TextExpectedActual
test_prereform_quotations:
PassedВъ кухнѣ злится повариха,
Плачетъ у станка ткачиха —
И завидуютъ онѣ
Государевой женѣ.
Александр Пушкин
В ку́хне зли́тся повари́ха,
Пла́чет у станка́ ткачи́ха —
И зави́дуют они́
Госуда́ревой жене́.
Алекса́ндр Пу́шкин
В ку́хне зли́тся повари́ха,
Пла́чет у станка́ ткачи́ха —
И зави́дуют они́
Госуда́ревой жене́.
Алекса́ндр Пу́шкин
PassedНо Кити и не ожидала большаго отъ кадрили. —Лев ТолстойНо Кити и не ожида́ла бо́льшего от кадри́ли. —Лев Толсто́йНо Кити и не ожида́ла бо́льшего от кадри́ли. —Лев Толсто́й
PassedСверхъ того, заботы большого семейства безпрестанно мучили ее: то кормленіе грудного ребенка не шло, то нянька ушла, то, какъ теперь, заболѣлъ одинъ изъ дѣтей. —Лев ТолстойСверх того́, забо́ты большо́го семе́йства беспреста́нно му́чили её: то кормле́ние грудно́го ребёнка не шло, то ня́нька ушла́, то, как тепе́рь, заболе́л оди́н из дете́й. —Лев Толсто́йСверх того́, забо́ты большо́го семе́йства беспреста́нно му́чили её: то кормле́ние грудно́го ребёнка не шло, то ня́нька ушла́, то, как тепе́рь, заболе́л оди́н из дете́й. —Лев Толсто́й
PassedБезсмѣ́нный, несмѣняемый, не замѣняемый другимъ; всегдашній, постоянный. Безсмѣнная рать, первое русское постоянное войско, при Грозномъ. Безсмѣ́нность ж. состояніе безсмѣннаго. —Владиміръ ДальБессме́нный, несменяемый, не заменя́емый други́м; всегда́шний, постоя́нный. Бессме́нная рать, первое ру́сское постоя́нное во́йско, при Гро́зном. Бессме́нность ж. состоя́ние бессме́нного. —Влади́мир ДальБессме́нный, несменяемый, не заменя́емый други́м; всегда́шний, постоя́нный. Бессме́нная рать, первое ру́сское постоя́нное во́йско, при Гро́зном. Бессме́нность ж. состоя́ние бессме́нного. —Влади́мир Даль
PassedСапъ м. или сопъ (сопѣть), конская (и др. животн.) болѣзнь, съ сильными признаками насморка, который изнуряетъ лошадь до́ смерти; весьма заразительна и неизлечима. —Владиміръ ДальСап м. и́ли соп (сопе́ть), ко́нская (и др. животн.) боле́знь, с си́льными при́знаками на́сморка, кото́рый изнуря́ет ло́шадь до́ смерти; весьма́ зарази́тельна и неизлечи́ма. —Влади́мир ДальСап м. и́ли соп (сопе́ть), ко́нская (и др. животн.) боле́знь, с си́льными при́знаками на́сморка, кото́рый изнуря́ет ло́шадь до́ смерти; весьма́ зарази́тельна и неизлечи́ма. —Влади́мир Даль
PassedМастера́ немцы корзины плѣсти. Балахонки до́слѣпу кружева плетут. Плѣсти́ по́дъ руку, перекидывая прядь не сверху, а подъ низ. —Влади́мир ДальМастера́ не́мцы корзи́ны плести́. Балахонки до́слепу кружева плету́т. Плести́ по́д руку, переки́дывая прядь не све́рху, а под низ. —Влади́мир ДальМастера́ не́мцы корзи́ны плести́. Балахонки до́слепу кружева плету́т. Плести́ по́д руку, переки́дывая прядь не све́рху, а под низ. —Влади́мир Даль
PassedИ тутъ только въ первый разъ все дѣло представилось ей совсѣмъ съ другой, новой стороны. —Лев ТолстойИ тут то́лько в пе́рвый раз все де́ло предста́вилось ей совсе́м с друго́й, но́вой стороны. —Лев Толсто́йИ тут то́лько в пе́рвый раз все де́ло предста́вилось ей совсе́м с друго́й, но́вой стороны. —Лев Толсто́й
PassedКогда они вышли, карета Вронскихъ уже отъѣхала. Входившіе люди все еще переговаривались о томъ, что случилось. —Лев ТолстойКогда́ они́ вы́шли, каре́та Вронских уже отъе́хала. Входи́вшие лю́ди все ещё перегова́ривались о том, что случи́лось. —Лев Толсто́йКогда́ они́ вы́шли, каре́та Вронских уже отъе́хала. Входи́вшие лю́ди все ещё перегова́ривались о том, что случи́лось. —Лев Толсто́й
PassedОсмотрѣвъ дѣтей, онѣ сѣли, уже однѣ, въ гостиной предъ кофеемъ. —Лев ТолстойОсмотре́в дете́й, они́ сели, уже одни́, в гости́ной пред кофеем. —Лев Толсто́йОсмотре́в дете́й, они́ сели, уже одни́, в гости́ной пред кофеем. —Лев Толсто́й
PassedИзъ-за густыхъ рѣсницъ ея блестящихъ глазъ вдругъ показались слезы. —Лев ТолстойИз-за густы́х ресни́ц её блестя́щих глаз вдруг показа́лись слезы. —Лев Толсто́йИз-за густы́х ресни́ц её блестя́щих глаз вдруг показа́лись слезы. —Лев Толсто́й
PassedМы-таки добились свѣдѣнія изъ пензенскаго губернскаго правленія. —Лев ТолстойМы-таки доби́лись сведения из пе́нзенского губе́рнского правле́ния. —Лев Толсто́йМы-таки доби́лись сведения из пе́нзенского губе́рнского правле́ния. —Лев Толсто́й
PassedКуда дѣлась его всегда спокойная, твердая манера и безпечно спокойное выраженіе лица? —Лев ТолстойКуда́ де́лась его́ всегда́ споко́йная, твёрдая мане́ра и беспе́чно споко́йное выраже́ние лица? —Лев Толсто́йКуда́ де́лась его́ всегда́ споко́йная, твёрдая мане́ра и беспе́чно споко́йное выраже́ние лица? —Лев Толсто́й
PassedЧувство безпричиннаго стыда, которое она испытывала дорогой, и волненіе совершенно исчезли. —Лев ТолстойЧу́вство беспричи́нного стыда́, кото́рое она испы́тывала дорогой, и волне́ние соверше́нно исче́зли. —Лев Толсто́йЧу́вство беспричи́нного стыда́, кото́рое она испы́тывала дорогой, и волне́ние соверше́нно исче́зли. —Лев Толсто́й
PassedСамыя трансцендентныя понятія становятся мнѣ доступны, когда онъ говоритъ. —Лев ТолстойСа́мые трансценде́нтные поня́тия стано́вятся мне досту́пны, когда́ он говори́т. —Лев Толсто́йСа́мые трансценде́нтные поня́тия стано́вятся мне досту́пны, когда́ он говори́т. —Лев Толсто́й
PassedВронскій, невольно подчиняясь ей, тоже ожидалъ чего-то независимаго отъ него, долженствовавшаго разъяснить всѣ затрудненія. —Лев ТолстойВронский, нево́льно подчиня́ясь ей, то́же ожида́л чего́-то незави́симого от него́, долженствова́вшего разъяснить все затрудне́ния. —Лев Толсто́йВронский, нево́льно подчиня́ясь ей, то́же ожида́л чего́-то незави́симого от него́, долженствова́вшего разъяснить все затрудне́ния. —Лев Толсто́й
PassedОбдумывая, что онъ скажетъ, онъ пожалѣлъ о томъ, что для домашняго употребленія, такъ незамѣтно, онъ долженъ употребить свое время и силы ума; —Лев Толсто́йОбду́мывая, что он ска́жет, он пожале́л о том, что для дома́шнего употребле́ния, так незаме́тно, он до́лжен употреби́ть своё вре́мя и си́лы ума́; —Лев Толсто́йОбду́мывая, что он ска́жет, он пожале́л о том, что для дома́шнего употребле́ния, так незаме́тно, он до́лжен употреби́ть своё вре́мя и си́лы ума́; —Лев Толсто́й
PassedИзвѣстіе о смерти Парѳена Денисыча непріятно подѣйствовало на него. —Лев ТолстойИзве́стие о сме́рти Парфена Денисыча неприя́тно поде́йствовало на него́. —Лев Толсто́йИзве́стие о сме́рти Парфена Денисыча неприя́тно поде́йствовало на него́. —Лев Толсто́й
PassedПрохоръ Бога забылъ, и на тѣ деньги, что ему подарилъ Левинъ, чтобы лошадь купить, пьетъ безъ просыпу и жену избилъ до смерти; —Лев ТолстойПрохор Бо́га забы́л, и на те деньги, что ему́ подари́л Левин, что́бы ло́шадь купи́ть, пьёт без просыпу и жену́ изби́л до смерти; —Лев Толсто́йПрохор Бо́га забы́л, и на те деньги, что ему́ подари́л Левин, что́бы ло́шадь купи́ть, пьёт без просыпу и жену́ изби́л до смерти; —Лев Толсто́й
PassedВъ 1374 г. заключено было перемиріе на годъ, но оно продолжалось до смерти Эдуарда III (1377 г.); —Иван СытинВ 1374 г. заключено́ бы́ло переми́рие на год, но оно продолжа́лось до смерти Эдуа́рда III (1377 г.); —Ива́н СытинВ 1374 г. заключено́ бы́ло переми́рие на год, но оно продолжа́лось до смерти Эдуа́рда III (1377 г.); —Ива́н Сытин
PassedДо двѣнадцати лѣтъ онъ прожилъ въ избѣ своего дѣда, добраго старика, любившаго читать священныя книги и увлекательно разсказывавшаго прочитанное и пережитое. —К. А. ХрѣновъДо двена́дцати лет он прожил в избе́ своего́ де́да, до́брого старика́, люби́вшего чита́ть свяще́нные кни́ги и увлека́тельно расска́зывавшего прочи́танное и пережитое. —К. А. ХреновДо двена́дцати лет он прожил в избе́ своего́ де́да, до́брого старика́, люби́вшего чита́ть свяще́нные кни́ги и увлека́тельно расска́зывавшего прочи́танное и пережитое. —К. А. Хренов
PassedПоздравительное письмо ея представляетъ самый пылкій диѳирамбъ великодушному Монарху, возстановившему истину. —Аѳанасій ФетъПоздрави́тельное письмо́ её представля́ет са́мый пы́лкий дифира́мб великоду́шному Мона́рху, восстанови́вшему и́стину. —Афана́сий ФетПоздрави́тельное письмо́ её представля́ет са́мый пы́лкий дифира́мб великоду́шному Мона́рху, восстанови́вшему и́стину. —Афана́сий Фет
PassedТа же женственная ѵпостась Божества проявляетъ себя въ исторіи человѣчества, какъ церковь. —Сергей СоловьевТа же же́нственная ипоста́сь Божества́ проявля́ет себя́ в исто́рии челове́чества, как це́рковь. —Серге́й СоловьёвТа же же́нственная ипоста́сь Божества́ проявля́ет себя́ в исто́рии челове́чества, как це́рковь. —Серге́й Соловьёв
PassedВпрочемъ, этимъ дѣломъ постоянно занимался фельдъфебель, не знаю, самъ ли отъ себя или по приказанію. —Андрей БекетовВпро́чем, э́тим де́лом постоя́нно занима́лся фельдфе́бель, не зна́ю, сам ли от себя́ и́ли по приказа́нию. —Андре́й Беке́товВпро́чем, э́тим де́лом постоя́нно занима́лся фельдфе́бель, не зна́ю, сам ли от себя́ и́ли по приказа́нию. —Андре́й Беке́тов
PassedНаконецъ, сколько Комитету извѣстно всѣ бѣлорусскія сочиненія печатаны были доселѣ польскими буквами. —Павел КукольникНаконе́ц, ско́лько Комите́ту изве́стно все белору́сские сочине́ния печа́таны бы́ли досе́ле по́льскими бу́квами. —Па́вел КукольникНаконе́ц, ско́лько Комите́ту изве́стно все белору́сские сочине́ния печа́таны бы́ли досе́ле по́льскими бу́квами. —Па́вел Кукольник
TextExpectedActual
test_usex:
PassedВ философской литерату́ре понятие ката́рсиса имеет более полутора тысяч различных толкований.В филосо́фской литерату́ре поня́тие ката́рсиса име́ет бо́лее полу́тора ты́сяч разли́чных толкова́ний.В филосо́фской литерату́ре поня́тие ката́рсиса име́ет бо́лее полу́тора ты́сяч разли́чных толкова́ний.
PassedВ 1247 году бристольская гавань была обустро́ена путем отведения русла Фро́ма несколько на запад.В 1247 году бри́сто́льская га́вань была́ обустро́ена путём отведения ру́сла Фро́ма не́сколько на за́пад.В 1247 году бри́сто́льская га́вань была́ обустро́ена путём отведения ру́сла Фро́ма не́сколько на за́пад.
PassedСпасибо этому году! Ждем еще более интересных сюрпризов и потрясений в следующем.Спаси́бо э́тому году! Ждём ещё бо́лее интере́сных сюрпри́зов и потрясе́ний в сле́дующем.Спаси́бо э́тому году! Ждём ещё бо́лее интере́сных сюрпри́зов и потрясе́ний в сле́дующем.
PassedЖуков и бабочек отлавливает юный натуралист Жуков. Он уже много таких жуков поймал.Жуков и ба́бочек отла́вливает ю́ный натурали́ст Жу́ков. Он уже мно́го таки́х жуко́в пойма́л.Жуков и ба́бочек отла́вливает ю́ный натурали́ст Жу́ков. Он уже мно́го таки́х жуко́в пойма́л.
PassedСкандинавские боги Тор, Один и остальные известны всем. Жил у моря один человек. Один день ничего не решает.Скандина́вские бо́ги Тор, О́дин и остальны́е изве́стны всем. Жил у моря оди́н челове́к. Один день ничего́ не реша́ет.Скандина́вские бо́ги Тор, О́дин и остальны́е изве́стны всем. Жил у моря оди́н челове́к. Один день ничего́ не реша́ет.
PassedКубы грунта разбрасывает вокруг экскаватор. Экономика Венесуэлы, Кубы и прочих стран оставляет желать лучшего.Кубы гру́нта разбра́сывает вокру́г экскава́тор. Эконо́мика Венесуэ́лы, Ку́бы и про́чих стран оставля́ет жела́ть лу́чшего.Кубы гру́нта разбра́сывает вокру́г экскава́тор. Эконо́мика Венесуэ́лы, Ку́бы и про́чих стран оставля́ет жела́ть лу́чшего.
PassedТемнофиолетовое трехмерное изображение трехко́мнатной квартиры из Кенигсберга выглядит замечательно.Тёмнофиоле́товое трёхме́рное изображе́ние трёхко́мнатной кварти́ры из Кёнигсберга вы́глядит замеча́тельно.Тёмнофиоле́товое трёхме́рное изображе́ние трёхко́мнатной кварти́ры из Кёнигсберга вы́глядит замеча́тельно.
PassedМама мыла раму. Благоустраивающаяся дамочка увидела посерьезневшее лицо таксиста.Ма́ма мыла ра́му. Благоустра́ивающаяся да́мочка уви́дела посерьёзневшее лицо́ такси́ста.Ма́ма мыла ра́му. Благоустра́ивающаяся да́мочка уви́дела посерьёзневшее лицо́ такси́ста.
PassedВ ассортименте представлены разнообразные мыла, кремы для тела, ног, рук, шампуни.В ассортиме́нте предста́влены разнообра́зные мыла, кре́мы для тела, ног, рук, шампу́ни.В ассортиме́нте предста́влены разнообра́зные мыла, кре́мы для тела, ног, рук, шампу́ни.
PassedСтоят на полке ненужные бутылки. Они ничего не стоят.Стоят на полке нену́жные буты́лки. Они́ ничего́ не стоят.Стоят на полке нену́жные буты́лки. Они́ ничего́ не стоят.
PassedОб этом полке сняты фильмы.Об э́том полке сняты фи́льмы.Об э́том полке сняты фи́льмы.
PassedЕго зовут Лука, он любит писать стихи о Елкине. Котяра повадился писать в тапки.Его́ зову́т Лука́, он лю́бит писать стихи о Ёлкине. Котя́ра пова́дился писать в та́пки.Его́ зову́т Лука́, он лю́бит писать стихи о Ёлкине. Котя́ра пова́дился писать в та́пки.
PassedЛука и чеснока нам очень не хватает, особенно лука.Лука и чеснока́ нам о́чень не хвата́ет, осо́бенно лука.Лука и чеснока́ нам о́чень не хвата́ет, осо́бенно лука.
PassedПеред ними простиралась километровая лука реки.Перед ни́ми простира́лась километро́вая лука реки.Перед ни́ми простира́лась километро́вая лука реки.
PassedНикто не скроется от бдительного ока. Лука всё еще не спит и все его боятся.Никто́ не скро́ется от бди́тельного о́ка. Лука всё ещё не спит и все его́ боя́тся.Никто́ не скро́ется от бди́тельного о́ка. Лука всё ещё не спит и все его́ боя́тся.
PassedВ конце своего течения Ока доходит до Нижнего Новгорода, где впадает в Волгу.В конце́ своего́ тече́ния Ока́ дохо́дит до Ни́жнего Но́вгорода, где впада́ет в Во́лгу.В конце́ своего́ тече́ния Ока́ дохо́дит до Ни́жнего Но́вгорода, где впада́ет в Во́лгу.
PassedОка течет по территориям Орловской, Тульской, Калужской, Московской, Рязанской, Владимирской, Нижегородской областей.Ока течёт по террито́риям Орло́вской, Ту́льской, Калу́жской, Моско́вской, Ряза́нской, Влади́мирской, Нижегоро́дской областе́й.Ока течёт по террито́риям Орло́вской, Ту́льской, Калу́жской, Моско́вской, Ряза́нской, Влади́мирской, Нижегоро́дской областе́й.
PassedЕж спрятался под елкой и посмотрел на небо. Что-то застряло у него в нёбе.Ёж спря́тался под ёлкой и посмотре́л на небо. Что-то застря́ло у него́ в нёбе.Ёж спря́тался под ёлкой и посмотре́л на небо. Что-то застря́ло у него́ в нёбе.
PassedОрел присел на клен возле замка.Орёл присе́л на клён во́зле замка.Орёл присе́л на клён во́зле замка.
PassedМы хорошо узнаём математические символы и скоро узнаем, как решать это уравнение.Мы хорошо́ узнаём математи́ческие си́мволы и ско́ро узнаем, как реша́ть э́то уравне́ние.Мы хорошо́ узнаём математи́ческие си́мволы и ско́ро узнаем, как реша́ть э́то уравне́ние.
PassedДореформенная орфография ставит под угрозу благо Чикаго и Сантьяго.Дореформенная орфогра́фия ста́вит под угро́зу бла́го Чика́го и Сантья́го.Дореформенная орфогра́фия ста́вит под угро́зу бла́го Чика́го и Сантья́го.

local export = {}

-- TODO: Implement more special cases from Benwing2's
--       https://github.com/benwing2/RuNounChanges/blob/master/auto_accent_auto_bracket_ru.py
--       All of these need to get proper test coverage.
-- TODO: Maybe handle words with more than one letter "ё". The whole dictionary only contains
--       just a few of them and for now we may just ignore them. See the "words_with_double_jo"
--       table returned from query_extra_info(). But ignoring these words is also safe.
-- TODO: Maybe have configuration knobs for enabling/disabling certain features? For example,
--       the pre-1918 orthography conversion could be turned off, forceful correction of the
--       incorrect accents in the original text could be done, maybe the words could be turned
--       into links, etc.

local decompose = require("Module:ru-common").decompose
local m_dict = require("Module:User:Ssvb/ru-accentdict")
local lookup_word = m_dict.lookup_word
local max_stress_search_steps = m_dict.query_extra_info()["max_stress_search_steps"]
local max_jo_search_steps = m_dict.query_extra_info()["max_jo_search_steps"]

local vowels = "аеёєэиіїоуюяыѣѵАЕЁЄЭИІЇОУЮЯЫѢѴ"
local vowel = "[" .. vowels .. "]"
local nonvowel = "[^" .. vowels .. "]"
local GR = require("Module:string/char")(0x0300) -- grave
local AC = require("Module:string/char")(0x0301) -- acute

local rsubn = mw.ustring.gsub
local rfind = mw.ustring.find

local function rsub(term, foo, bar)
	local retval = rsubn(term, foo, bar)
	return retval
end

-- Try to add stress accent annotation to a word. Implemented via doing dictionary lookups
-- for all possible stress positions (taking into account the 'max_stress_search_steps'
-- statistical parameter as a useful performance optimization and an anti-DoS safeguard).
--
-- Returns:
--   unaccented word  - the word is ambiguous and can't be safely accented
--   accented word    - the suggested accent position
--   nil              - abstain from making any accent placement decisions
local function try_to_recover_ac(word)
	-- If the word with an already annotated accent is found in the dictionary, then it
	-- is perfectly fine and gets our stamp of approval. If the word without an annotated
	-- accent is found, then this is also perfectly fine because there are certain
	-- multi-syllable words without accent (such as [[подо]] or [[обо]]), not to mention
	-- many single-syllable words too. The author of the input text is likely to have
	-- added explicit accent specifically to resolve ambiguity, so now we don't need
	-- to do any further analysis to confirm this whether this was or wasn't the case.
	if lookup_word(word) then
		return word
	end
	-- If the word did have an accent, but wasn't found in the dictionary, then it's
	-- possible that this happened because of a missing "ё". So abstain from making
	-- any decision and return nil. Alternatively, the author of the text may have
	-- just made a mistake with accenting, but it's not our call to judge him here.
	if rfind(word, AC) then
		return
	end
	-- There's no accents of any kind in the 'word' variable. So try to probe adding
	-- accent in different positions, starting from the last vowel and going backwards.
	local step, cnt, result = 0, 0, word
	local tmp = rsub(word, "(" .. vowel .. ")(" .. nonvowel .. "*)$", "%1" .. AC .. "%2")
	while word ~= tmp and step < max_stress_search_steps do
		step = step + 1
		word = tmp
		if lookup_word(word) then
			cnt = cnt + 1
			-- Combine multiple accents in the 'result' variable, as this is needed for "ка́та́рсис"
			-- and other similar words with multiple valid accent positions.
			local accent_pos = word:find(AC)
			result = result:sub(1, accent_pos - 1) .. AC .. result:sub(accent_pos)
		end
		tmp = rsub(word, "(" .. vowel .. ")(" .. nonvowel .. "*" .. vowel .. ")" .. AC, "%1" .. AC .. "%2")
	end
	if cnt > 1 then
		-- If more than one accent position was found, then it's either something with multiple
		-- valid accent positions like "ка́та́рсис" or an ambiguity between "замо́к" and "за́мок".
		-- Doing a dictionary lookup for the word with the combined accents clarifies everything.
		return (lookup_word(result) and result) or rsub(result, AC, "")
	elseif cnt == 1 then
		-- If only one possible accent position was found, then we have our answer
		return result
	end
end

-- Try to recover one missing "ё" letter in the word and also accent position.
-- Multiple "ё" letters in a single word are extremely uncommon, so this edge
-- case is not supported right now.
--
-- Returns:
--   unmodified word  - the word is ambiguous and can't be modified safely
--   modified word    - the suggested adjustment of the word
--   nil              - abstain from making any word adjustment decisions
local flip_jejo = {
	["е"] = "ё", ["ё"] = "е", ["Е"] = "Ё", ["Ё"] = "Е"
}
local function try_to_recover_jo(word)
	local step = 0
	local tmp = rsub(word, "([еЕ])([^еЕ]*)$", function (je, suffix)
		return flip_jejo[je] .. suffix end)
	while word ~= tmp and step < max_jo_search_steps do
		step = step + 1
		word = tmp
		local result = try_to_recover_ac(word)
		if result then
			return result
		end
		tmp = rsub(word, "([еЕ])([^еЕёЁ]*)([ёЁ])", function (je, midpart, jo)
			return flip_jejo[je] .. midpart .. flip_jejo[jo] end)
	end
end

-- Strip accents, but save them in a table and return as a second return value
local function strip_accents(word)
	local pos_gr, pos_ac = {}, {}
	local cnt = 1
	word = rsub(word, "(" .. vowel .. ")([" .. GR .. AC .. "]?)", function (letter, stress)
		if stress == AC then
			pos_ac[cnt] = true
		elseif stress == GR then
			pos_gr[cnt] = true
		end
		cnt = cnt + 1
		return letter
	end)
	return word, { pos_ac, pos_gr }
end

-- Restore the previously saved acute and grave accents, replacing any other accents
local function restore_accents(word, accents_backup_tbl)
	local cnt = 1
	return rsub(word, "(" .. vowel .. ")([" .. GR .. AC .. "]*)", function (letter, stress)
		if accents_backup_tbl[1][cnt] then
			stress = AC
		elseif accents_backup_tbl[2][cnt] then
			stress = GR
		else
			stress = ""
		end
		cnt = cnt + 1
		return letter .. stress
	end)
end

-- Restore only the grave accent, keeping all other accents intact
local function restore_gr(word, accents_backup_tbl)
	local cnt = 1
	return rsub(word, "(" .. vowel .. ")([" .. GR .. AC .. "]*)", function (letter, stress)
		if accents_backup_tbl[2][cnt] then
			stress = GR
		end
		cnt = cnt + 1
		return letter .. stress
	end)
end

-- Restore the previously saved accents in a word and make somewhat smart
-- decisions about how to do it. If there were no accents saved, then just
-- keep accents in the word. If acute was saved, then override all accents.
-- Or just restore grave if it was present, while keeping the possibly
-- automatically assigned acute.
local function smart_restore_accents(word, accents_backup_tbl)
	if next(accents_backup_tbl[1]) ~= nil then
		return restore_accents(word, accents_backup_tbl)
	elseif next(accents_backup_tbl[2]) ~= nil then
		return restore_gr(word, accents_backup_tbl)
	else
		return word
	end
end

-- Convert from the pre-1918 to modern Russian orthography. Check the following
-- links as reference materials for the conversion rules:
--   https://ru.wikisource.org/wiki/Декрет_о_введении_нового_правописания
--   https://ru.wikisource.org/wiki/Декрет_о_введении_новой_орфографии
--   https://arzamas.academy/materials/1164 and https://историк.рф/journal/post/6042
--
-- The idea is to apply changes to the pre-reform word until a match is found in
-- the modern dictionary. For example:
--  * the word "самыя" is not a correct modern spelling. So it's transformed
--    into "са́мые" and confirmed by a dictionary lookup.
--  * the word "любившаго" is not a correct modern spelling either and there are two
--    candidates for it: "любившого" and "любившего". The word "люби́вшего" is confirmed.
--  * the word "губернскаго" is not a correct modern spelling and there are two
--    candidates for it: "губернского" and "губернскего". The word "губе́рнского"
--    is confirmed.
--  * the word "большаго" is not a correct modern spelling and there are two candidates
--    for it: "большо́го" and "бо́льшего". Ironically, both of these candidates are
--    different correct words in modern spelling, albeit with different stress positions.
--    It's not totally clear, which variant to pick, but we prioritize "бо́льшего",
--    because "большого" is also a valid word in pre-reform spelling.
--
-- Technically, the underlying dictionary can have a separate section specifically
-- for identifying genitive singular adverbs, participles and pronouns for "-аго/-яго"
-- and nominative/accusative feminine/neuter plural adverbs, participles and
-- pronouns for "-ыя/-ія". But we'll cross that bridge when we get to it.
--
-- Additionally, it goes without saying that for doing correct conversion to modern
-- spelling, the dictionary MUST not be contaminated with pre-reform spelling forms.
-- So it's important to have all pre-reform Russian words correctly annotated in
-- English Wiktionary and this information should be machine readable.

local prereform_subst_words = {
	["онѣ"] = "они", ["однѣ"] = "одни", ["однѣхъ"] = "одних", ["однѣми"] = "одними", ["ея"] = "её",
	["Онѣ"] = "Они", ["Однѣ"] = "Одни", ["Однѣхъ"] = "Одних", ["Однѣми"] = "Одними", ["Ея"] = "Её",
}
local prereform_subst_letters = {
	["ѣ"] = "е", ["Ѣ"] = "Е",	["і"] = "и", ["І"] = "И", ["ѳ"] = "ф", ["Ѳ"] = "Ф", ["ѵ"] = "и", ["Ѵ"] = "И"
}
local prereform_subst_prefix = {
	["из"] = "ис", ["воз"] = "вос", ["вз"] = "вс", ["раз"] = "рас", ["роз"] = "рос",
	["низ"] = "нис", ["без"] = "бес", ["чрез"] = "чрес", ["через"] = "черес",
	["Из"] = "Ис", ["Воз"] = "Вос", ["Вз"] = "Вс", ["Раз"] = "Рас", ["Роз"] = "Рос",
	["Низ"] = "Нис", ["Без"] = "Бес", ["Чрез"] = "Чрес", ["Через"] = "Черес",
}
local function with_different_orthography(callback_function, word)
	-- Temporarily strip acute and grave accents
	local word, accents_backup = strip_accents(word)
	local have_ija = rfind(word, "ія$")
	-- These transformations can be safely applied and hopefully don't cause any
	-- ambiguity. But if a counter-example is presented, then some solution can
	-- be found.
	word = prereform_subst_words[word] or word
	word = rsub(word, ".", prereform_subst_letters)
	word = rsub(word, "ъ$", "")
	word = rsub(word, "ъ(" .. nonvowel .. ")", "%1")
	word = rsub(word, "^([^з]+з)([пфѳтсшкчщцх])", function (pref, letter)
		return (prereform_subst_prefix[pref] or pref) .. letter
	end)
	local tmp = callback_function(word)
	if tmp then
		return smart_restore_accents(tmp, accents_backup)
	end
	-- There's a possible ambiguity in "бѣлорусскія сочиненія", because the
	-- former needs to be converted to "белору́сские" and the latter needs to
	-- be converted to "сочине́ния" despite both having the "-ія" suffix. This
	-- ambiguity is resolved by doing dictionary lookups.
	tmp = rsub(word, "аго$", "его")
	tmp = rsub(tmp, "яго$", "его")
	tmp = rsub(tmp, "ыя$", "ые")
	if have_ija then
		tmp = rsub(tmp, "ия$", "ие")
	end
	if tmp ~= word then
		local result = callback_function(tmp)
		if result then
			return smart_restore_accents(result, accents_backup)
		end
	end
	-- There's another ambiguity in "независимаго отъ него, долженствовавшаго". One
	-- word needs to be converted to "незави́симого" and another to "долженствовавшего"
	-- despite both having the "-аго" suffix. This is again resolved by doing one
	-- more dictionary lookup.
	tmp = rsub(word, "аго$", "ого")
	if tmp ~= word then
		local result = callback_function(tmp)
		if result then
			return smart_restore_accents(result, accents_backup)
		end
	end
	return restore_accents(word, accents_backup)
end

-- Combine two alternative 'subst1' and 'subst2' word alternation variants, such
-- as an accent or "ё" recovery. They may possibly agree with each other, conflict
-- each other or simply abstain (nil means 'no real opinion'). This function merges
-- them into a single one. The 'word' argument is a fallback variant.
local function evaluate_alternatives(subst1, subst2, word)
	if not subst1 then
		return subst2
	end
	if not subst2 then
		return subst1
	end
	if subst1 ~= subst2 then
		return word
	else
		return subst1
	end
end

-- Try to do something using a callback function with both the original and the
-- de-capitalized variants of the same word to see if we end up getting different
-- results (such as, for example, "Ока́" vs. "о́ка" accent positions)
local function with_different_capitalization(callback_function, word)
	local decap_word = rsub(word, "^.", function (letter) return mw.ustring.lower(letter) end)
	-- If the word wasn't actually capitalized, then there's only one way to do it
	if decap_word == word then
		return callback_function(word)
	end
	-- Process both the original and de-capitalized variants
	local subst1 = callback_function(word)
	local subst2 = callback_function(decap_word)
	-- Restore the capitalization of the de-capitalized variant
	if subst2 ~= nil then
		subst2 = rsub(subst2, "^.", function (letter) return mw.ustring.upper(letter) end)
	end
	-- Compare the results of the two routes with different capitalization
	return evaluate_alternatives(subst1, subst2, word)
end

-- Process a chunk of text and opportunistically add letters "ё" and accents to Russian
-- words where it is possible to do so in an unambiguous way. While doing this, the
-- pre-1918 spelling is also converted to modern Russian spelling.
function export.normalize(text)
	text = decompose(text)
	local nested_square_brackets = 0
	local prev_word, cur_word
	local prev_sep = "", next_sep
	local result = rsub(text, "([" .. AC .. GR .. "Ѐ-џҊ-ԧꚀ-ꚗѣѢѳѲѵѴ]*)([^" .. AC .. GR .. "Ѐ-џҊ-ԧꚀ-ꚗѣѢѳѲѵѴ]*)", function (word, sep)
		-- Don't do anything with the text enclosed in double square brackets (possible wikilinks or other markup)
		local cur_nested_square_brackets = nested_square_brackets
		rsub(sep, "%[%[", function (match) nested_square_brackets = nested_square_brackets + 1 end)
		rsub(sep, "%]%]", function (match) nested_square_brackets = nested_square_brackets - 1 end)
		if cur_nested_square_brackets ~= 0 then
			return
		end
		-- First a basic check for obviously problematic words or word combinations
		prev_sep = next_sep
		next_sep = sep
		prev_word = cur_word
		cur_word = word
		local lowercase_cur_word = mw.ustring.lower(cur_word)
		local capitalized_cur_word = rsub(cur_word, "^.", function (letter) return mw.ustring.upper(letter) end)
		-- Avoid mixed case, such as "шИзОФреНия" or other similarly weird formatting style
		if cur_word ~= lowercase_cur_word and cur_word ~= capitalized_cur_word then
			return
		end
		-- Ignore two words separated by "(", such as "галер(е́я)"
		if (prev_sep == "(" and prev_word and prev_word ~= "") or next_sep == "(" then
			return
		end
		-- Do conversion to modern orthography, accent and "ё" recovery
		if prev_word and prev_word ~= "" and rfind(prev_sep, "^[%s,]+$") then
			-- *Definitely* the middle of a sentence here. Only spaces or commas separate us from the
			-- previous word. Maybe hyphens or semicolons could be added too, but they are less reliable.
			word = with_different_orthography(function (word)
				-- Need to explore two routes (with and without "ё" recovery) to reliably resolve the
				-- "слёзы" vs. "слезы́" or "узна́ем" vs. "узнаём" ambiguity. And since it's the middle of
				-- a sentence here, the actual capitalization of the word does matter for proper nouns.
				local subst1 = try_to_recover_ac(word) or with_different_capitalization(try_to_recover_ac, word)
				local subst2 = try_to_recover_jo(word) or with_different_capitalization(try_to_recover_jo, word)
				return evaluate_alternatives(subst1, subst2, word)
			end, word)
		else
			-- *Likely* the first word of a sentence. Making a wrong guess is safe, because this only
			-- adds ambiguity and prevents us from accenting certain words. Such as "О́ка" vs. "Ока́".
			prev_word = nil
			word = with_different_orthography(function (word)
				-- Need to explore two routes (with and without "ё" recovery) to reliably resolve the
				-- "слёзы" vs. "слезы́" or "узна́ем" vs. "узнаём" ambiguity. And since it's the start of
				-- a sentence here, the actual capitalization of the word is completely irrelevant.
				local subst1 = with_different_capitalization(try_to_recover_ac, word)
				local subst2 = with_different_capitalization(try_to_recover_jo, word)
				return evaluate_alternatives(subst1, subst2, word)
			end, word)
		end
		-- Strip stress accent, but keep modern orthography
		local modernized_without_ac = rsub(word, AC, "")
		-- The current word is preceded by a single syllable preposition, which was already
		-- accented in the original text
		if prev_word and rfind(prev_word, AC) and mw.ustring.len(rsub(prev_word, nonvowel, "")) == 1 then
			if not rfind(cur_word, AC) then
				word = modernized_without_ac
			end
		end
		-- Handle "предложно-именное сочетание" constructs (suppress accent in the second part of
		-- "до́ смерти" if it's found in the dictionary even without having the explicit accent markup)
		if prev_word then
			local combined = prev_word .. " " .. modernized_without_ac
			if lookup_word(combined) then
				word = modernized_without_ac
			end
			local decap_combined = rsub(combined, "^.", function (letter) return mw.ustring.lower(letter) end)
			if decap_combined ~= combined and lookup_word(decap_combined) then
				word = modernized_without_ac
			end
		end
		return word .. sep
	end)
	return mw.ustring.toNFC(result)
end

return export