From 4c05d63b559044e0a0b0bcb2bfe5e59e07f65293 Mon Sep 17 00:00:00 2001 From: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:48:40 +0300 Subject: [PATCH] expand vocab: more RU cases for currencies/units, Tab-only autocomplete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - EUR: add "Euros"; CHF: add "franc,francs"; INR: add "rupee,rupees"; USD: add "buck,bucks"; CNY: add "renminbi" - RU USD: full declension + slang бакс/баксов/...; JPY: all 8 cases for иена/йена; UAH: all гривна cases; TRY: bare лира declension; CNY: жэньминьби + full cases; CHF: all франк cases; BRL/KRW/PLN: extended declension - RU units: fill missing dative/instrumental/prepositional/accusative for час/минута/секунда/день/неделя/месяц/год/метр/грамм/литр/тонна/унция/фут/дюйм/миля/ярд - RU scales: тысяча/миллион/миллиард full declension - RU conversion: добавить "перевести в / конвертировать в" - editor: autocompletion defaultKeymap:false so Enter only newlines, Tab accepts suggestion --- src/engine/vocab-data.ts | 68 ++++++++++++++++++++-------------------- src/ui/editor.ts | 7 +++-- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/engine/vocab-data.ts b/src/engine/vocab-data.ts index 27890c5..5583562 100644 --- a/src/engine/vocab-data.ts +++ b/src/engine/vocab-data.ts @@ -87,11 +87,11 @@ export const EN: VocabLocale = { "CDF.format": "%@ FC", "CDF.variants": "Congolese Francs,Congolese Franc,FC", "CHF.format": "%@ SFr.", - "CHF.variants": "Swiss Francs,Swiss Franc,SFr.", + "CHF.variants": "Swiss Francs,Swiss Franc,franc,francs,SFr.", "CLP.format": "%@ CLP", "CLP.variants": "Chilean Pesos,Chilean Peso", "CNY.format": "%@ ¥", - "CNY.variants": "Chinese Yuans,Chinese Yuan,yuan,yuans,元,RMB", + "CNY.variants": "Chinese Yuans,Chinese Yuan,yuan,yuans,renminbi,元,RMB", "COP.format": "$%@ COP", "COP.variants": "Colombian Pesos,Colombian Peso", "CRC.format": "%@ ₡", @@ -117,7 +117,7 @@ export const EN: VocabLocale = { "ETB.format": "%@ Br", "ETB.variants": "Ethiopian Birr,Birr", "EUR.format": "€ %@", - "EUR.variants": "Euro,€", + "EUR.variants": "Euro,Euros,€", "FJD.format": "FJ$ %@", "FJD.variants": "Fiji Dollars,Fiji Dollar,Fijian Dollars,Fijian Dollar,FJ$", "FKP.format": "£ %@", @@ -153,7 +153,7 @@ export const EN: VocabLocale = { "ILS.format": "%@ NIS", "ILS.variants": "Israeli new shekel,new shekalim,new sheqalim,₪,NIS", "INR.format": "INR %@", - "INR.variants": "Indian Rupee", + "INR.variants": "Indian Rupee,Indian Rupees,rupee,rupees", "IQD.format": "%@ IQD", "IQD.variants": "Iraqi Dinars,Iraqi Dinar,ع.د", "IRR.format": "%@ IR", @@ -319,7 +319,7 @@ export const EN: VocabLocale = { "UGX.format": "%@ USh", "UGX.variants": "Ugandan Shilling,Ugandan Shillings,USh", "USD.format": "$%@", - "USD.variants": "dollar USA,dollars USA,dollar,USD,dollars,U.S. Dollars,U.S. Dollar,USA Dollars,USA Dollar,$", + "USD.variants": "dollar USA,dollars USA,dollar,USD,dollars,U.S. Dollars,U.S. Dollar,USA Dollars,USA Dollar,buck,bucks,$", "UYU.format": "$U %@", "UYU.variants": "Uruguayan Peso,Uruguayan Pesos,$U", "UZS.format": "%@ som", @@ -604,7 +604,7 @@ export const RU: VocabLocale = { "BOB.format": "%@ Bs", "BOB.variants": "Боливиано", "BRL.format": "%@ R$", - "BRL.variants": "Бразильский реал,Бразильских реалов,Бразильских реалах,Бразильские реалы,Реал,Реалов,Реалах", + "BRL.variants": "Бразильский реал,Бразильских реалов,Бразильских реалах,Бразильские реалы,Реал,Реала,Реалу,Реалом,Реале,Реалы,Реалов,Реалам,Реалами,Реалах", "BSD.format": "%@ B$", "BSD.variants": "Багамский доллар,Багамских долларов,Багамских долларах,Багамские доллары", "BTC.variants": "Bitcoins,Bitcoin,Биткоин,Биткойн,Биткоинов,Биткойнов,Биткоинах,Биткойнах,Биткоины,Биткойны", @@ -619,9 +619,9 @@ export const RU: VocabLocale = { "CAD.variants": "Канадский доллар,Канадских долларов,Канадских долларах,Канадские доллары", "CDF.variants": "Конголезский франк,Конголезских франков,Конголезских франках,Конголезские франки", "CHF.format": "%@ SFr", - "CHF.variants": "Швейцарский франк,Швейцарских франков,Швейцарских франках,Швейцарские франки,Франк,Франков,Франках", + "CHF.variants": "Швейцарский франк,Швейцарских франков,Швейцарских франках,Швейцарские франки,Франк,Франка,Франку,Франком,Франке,Франки,Франков,Франкам,Франками,Франках", "CLP.variants": "Чилийское песо,Чилийских песо", - "CNY.variants": "Юань,Юаней,Юаня,Юанях", + "CNY.variants": "Юань,Юаню,Юанем,Юане,Юаней,Юаня,Юанях,Юани,Юаням,Юанями,Жэньминьби,женьминьби", "COP.variants": "Колумбийское песо,Колумбийские песо,Колумбийских песо", "CRC.format": "%@ C", "CRC.variants": "Костариканский колон,Костариканских колонах,Костариканских колон,Колон,Колонах", @@ -677,7 +677,7 @@ export const RU: VocabLocale = { "JMD.variants": "Ямайские доллары,Ямайский доллар,Ямайских долларов,Ямайских долларах", "JOD.variants": "Иорданские динары,Иорданский динар,Иорданских динаров,Иорданских динарах", "JPY.format": "%@ ¥", - "JPY.variants": "японская иена,иена,иен,иены,йен,йены,йена,японская йена", + "JPY.variants": "японская иена,иена,иену,иене,иеной,иенам,иенами,иенах,иен,иены,йена,йену,йене,йеной,йенам,йенами,йенах,йен,йены,японская йена", "KES.variants": "Кенийские шиллинги,Кенийский шиллинг,Кенийских шиллингов,Кенийских шиллингах", "KGS.format": "%@ сом", "KGS.variants": "Кыргызский сом,Сом,Сомов,Сомах,Сома", @@ -686,7 +686,7 @@ export const RU: VocabLocale = { "KPW.format": "%@ ₩", "KPW.variants": "Северокорейская вона,Вона КНДР,Северокорейских вон,Северокорейских вонах", "KRW.format": "%@ ₩", - "KRW.variants": "Южнокорейская вона,Вона,вон,вонах,Южнокорейских вонах", + "KRW.variants": "Южнокорейская вона,Вона,Воны,Вону,Воне,Воной,Вонам,Вонами,Вонах,вон,вонах,Южнокорейских вонах", "KWD.variants": "Кувейтский динар,Кувейтских динарах,Кувейтских динаров", "KYD.format": "%@ $", "KYD.variants": "Доллар Островов Кайман,Доллар Каймановых островов,Долларах Каймановых островов", @@ -742,7 +742,7 @@ export const RU: VocabLocale = { "PHP.variants": "Филиппинское песо,Филиппинских песо", "PKR.format": "%@ Rs", "PKR.variants": "Пакистанских рупий,Пакистанских рупиях,Пакистанская рупия", - "PLN.variants": "Польский злотый,Злотый,Злотых,Злотые", + "PLN.variants": "Польский злотый,Злотый,Злотого,Злотому,Злотым,Злотых,Злотые,Злотыми,Злотых", "PYG.format": "%@ G", "PYG.variants": "Парагвайский гуарани,Гуарани", "QAR.variants": "Катарские риалы,Катарский риал,Катарских риалах", @@ -782,17 +782,17 @@ export const RU: VocabLocale = { "TND.variants": "Тунисские Динары,Тунисский Динар,Тунисских Динаров,Тунисских Динарах", "TOP.format": "%@ T$", "TOP.variants": "Тонганская паанга,Паанга,Паангах", - "TRY.variants": "Турецкая лира,Турецких лир,Турецких лирах,Турецкие лиры", + "TRY.variants": "Турецкая лира,Турецких лир,Турецких лирах,Турецкие лиры,лира,лиры,лиру,лире,лирой,лирам,лирами,лирах,лир", "TTD.format": "%@ TT$", "TTD.variants": "Доллар Тринидада и Тобаго,Доллар,Долларов Тринидада и Тобаго,Долларах Тринидада и Тобаго", "TWD.format": "%@ NT$", "TWD.variants": "Новые тайваньские доллары,Новый тайваньский доллар,Новых тайваньских долларах,Новых тайваньских долларов", "TZS.variants": "Танзанийские шиллинги,Танзанийский шиллинг,Танзанийских шиллингов,Танзанийских шиллингах", "UAH.format": "%@ грн.", - "UAH.variants": "Украинские гривны,Украинская гривна,Гривна,Гривнах,Гривен,грн.", + "UAH.variants": "Украинские гривны,Украинская гривна,Гривна,Гривны,Гривну,Гривне,Гривной,Гривнам,Гривнями,Гривнях,Гривнах,Гривен,грн.", "UGX.variants": "Угандийские шиллинги,Угандийский шиллинг,Угандийских шиллингов,Угандийских шиллингах", "USD.format": "%@ $", - "USD.variants": "Доллары США,Доллар США,Доллар Соединенных Штатов Америки,USD,ам. доллар,амер. доллар,долларов сша,долларах сша,доллары сша,доллар,доллара,долларом,доллары,долларов,долларами,долларах,$", + "USD.variants": "Доллары США,Доллар США,Доллар Соединенных Штатов Америки,USD,ам. доллар,амер. доллар,долларов сша,долларах сша,доллары сша,доллар,доллара,доллару,долларом,долларе,доллары,долларов,долларам,долларами,долларах,бакс,бакса,баксу,баксом,баксе,баксы,баксов,баксам,баксами,баксах,$", "UYU.format": "%@ $U", "UYU.variants": "Уругвайское песо,Уругвайских песо", "UZS.format": "%@ so’m", @@ -858,30 +858,30 @@ export const RU: VocabLocale = { "chain.format": "чейн", "chain.variants": "чейн,чейнов,чейнах,чейна", "foot.format": "фут", - "foot.variants": "фут,футов,футах,фута", + "foot.variants": "фут,фута,футу,футом,футе,футы,футов,футам,футами,футах", "furlong.format": "фарлонг", "furlong.variants": "фарлонг,фарлонгов,фарлонгах,фарлонга", "inch.format": "дюйм", - "inch.variants": "дюйм,дюймов,дюймах,дюйма", + "inch.variants": "дюйм,дюйма,дюйму,дюймом,дюйме,дюймы,дюймов,дюймам,дюймами,дюймах", "league.format": "лига", "league.variants": "лига,лиги,лигах", "meter.format": "м", "meter.symbol": "м", - "meter.variants": "метров,метрах,метр,метра,м", + "meter.variants": "метр,метра,метру,метром,метре,метры,метров,метрам,метрами,метрах,м", "mile.format": "миля", - "mile.variants": "миля,миль,милях,мили", + "mile.variants": "миля,мили,милю,миле,милей,милям,милями,милях,миль", "nautical_mile.format": "морская миля", "nautical_mile.variants": "морская миля,морских миль,морских милях,морских мили", "point.format": "точка", "point.variants": "точка,точек,точках,точки", "yard.format": "ярд", - "yard.variants": "ярд,ярдов,ярдах,ярда" + "yard.variants": "ярд,ярда,ярду,ярдом,ярде,ярды,ярдов,ярдам,ярдами,ярдах" }, "Operations": { "assignment.variants": "равно,соответствует", "avg.variants": "среднее,средн.,средн", "cbrt.variants": "кубический корень,куб корень,куб. корень", - "conversion.variants": "в,как", + "conversion.variants": "в,как,перевести в,перевод в,конвертировать в", "divide.variants": "разделить,разделить на,делим,делим на", "minus.variants": "минус,без", "multiply.variants": "раз по,раз,умножить,по", @@ -948,9 +948,9 @@ export const RU: VocabLocale = { "sample.welcome": "# Summarum\n8 / (45 - 20%)\n5 дюймов в см\n$9 в евро\n100 км/ч в милях" }, "Scales": { - "billion.variants": "миллиард,миллиардов,миллиарда,млрд,млрд.", - "million.variants": "миллион,мил.,мил,милл.,милл,миллиона,миллионов,М,млн,млн.", - "thousand.variants": "тысяч,тысячь,тысячи,тысяча,тыс.,тыс,т,т." + "billion.variants": "миллиард,миллиарда,миллиарду,миллиардом,миллиарде,миллиарды,миллиардов,миллиардам,миллиардами,миллиардах,млрд,млрд.", + "million.variants": "миллион,миллиона,миллиону,миллионом,миллионе,миллионы,миллионов,миллионам,миллионами,миллионах,мил.,мил,милл.,милл,М,млн,млн.", + "thousand.variants": "тысяча,тысячи,тысяче,тысячу,тысячей,тысячам,тысячами,тысячах,тысяч,тыс.,тыс,т,т." }, "Temperature": { "celsius.variants": "цельсий,цельсия,цельсиев,цельсиях,цельсиями,градусов цельсия", @@ -959,20 +959,20 @@ export const RU: VocabLocale = { }, "Time": { "day.format": "д", - "day.variants": "день,дня,дней,днях,д", + "day.variants": "день,дня,дню,днем,дне,дни,дней,дням,днями,днях,д", "hour.format": "ч", - "hour.variants": "час,часа,часов,часах", + "hour.variants": "час,часа,часу,часом,часе,часы,часов,часам,часами,часах", "minute.format": "мин", - "minute.variants": "мин,мин.,минута,минуты,минут,минутах", + "minute.variants": "мин,мин.,минута,минуты,минуту,минуте,минутой,минутам,минутами,минутах,минут", "month.format": "мес.", - "month.variants": "месяц,месяца,месяцев,месяцах,мес,мес.", + "month.variants": "месяц,месяца,месяцу,месяцем,месяце,месяцы,месяцев,месяцам,месяцами,месяцах,мес,мес.", "second.format": "с", "second.symbol": "с", - "second.variants": "сек,секунда,секунды,секунд,секундах,сек.", + "second.variants": "сек,сек.,секунда,секунды,секунду,секунде,секундой,секундам,секундами,секундах,секунд", "week.format": "нед.", - "week.variants": "неделя,недели,недель,неделях,нед.,нед", + "week.variants": "неделя,недели,неделю,неделе,неделей,неделям,неделями,неделях,недель,нед.,нед", "year.format": "г", - "year.variants": "год,года,лет,годах" + "year.variants": "год,года,году,годом,годе,годы,годов,годам,годами,годах,лет" }, "Volume": { "cbcm.variants": "см³", @@ -983,7 +983,7 @@ export const RU: VocabLocale = { "gallon.variants": "галлон,гал.,гал,галлона,галлонов,галлонах,галлоне", "litre.format": "л", "litre.symbol": "л", - "litre.variants": "литр,литров,литрах,литра,л", + "litre.variants": "литр,литра,литру,литром,литре,литры,литров,литрам,литрами,литрах,л", "pint.format": "пинт.", "pint.variants": "пинт,пинта,пинтах", "quart.format": "кварт.", @@ -1001,15 +1001,15 @@ export const RU: VocabLocale = { "centner.variants": "центнер,центнеров,центнерах,центнера", "gram.format": "г", "gram.symbol": "г", - "gram.variants": "грамм,граммов,грамма,граммах", + "gram.variants": "грамм,грамма,граммам,граммами,граммах,грамму,граммом,грамме,граммы,граммов", "ounce.format": "унция", - "ounce.variants": "унция,унциях,унции", + "ounce.variants": "унция,унции,унцию,унцией,унций,унциям,унциями,унциях", "pound.format": "фунт", "pound.variants": "фунт,фунтов,фунтах,фунта", "stone.format": "стоун", "stone.variants": "стоун,стоунах,стоуна,стоунов", "tonne.format": "т", "tonne.symbol": "т", - "tonne.variants": "тонны,тонна,тонн,тоннах" + "tonne.variants": "тонна,тонны,тонну,тонне,тонной,тоннам,тоннами,тоннах,тонн" } }; diff --git a/src/ui/editor.ts b/src/ui/editor.ts index 8092e60..9d21961 100644 --- a/src/ui/editor.ts +++ b/src/ui/editor.ts @@ -3,7 +3,7 @@ import { EditorView, ViewUpdate, Decoration, DecorationSet, keymap, drawSelection } from "@codemirror/view"; import { EditorState, StateEffect, StateField, RangeSetBuilder } from "@codemirror/state"; import { defaultKeymap, history, historyKeymap } from "@codemirror/commands"; -import { autocompletion, CompletionContext, CompletionResult, completionKeymap } from "@codemirror/autocomplete"; +import { autocompletion, CompletionContext, CompletionResult, acceptCompletion } from "@codemirror/autocomplete"; import { SumEngine, LineResult } from "../engine"; export interface EditorCallbacks { @@ -144,8 +144,9 @@ export class SumEditor { doc: initialText, extensions: [ history(), - keymap.of([...defaultKeymap, ...historyKeymap, ...completionKeymap]), - autocompletion({ override: [completionSource], activateOnTyping: true }), + keymap.of([...defaultKeymap, ...historyKeymap]), + autocompletion({ override: [completionSource], activateOnTyping: true, defaultKeymap: false }), + keymap.of([{ key: "Tab", run: acceptCompletion }]), resultsField, highlightField, varHighlightField,