From fa12164c390436a0f0c966592e3e60f6c4e2e28f Mon Sep 17 00:00:00 2001 From: Sergey Kiselev Date: Sat, 2 Nov 2024 12:47:08 +0500 Subject: [PATCH] say: added two scripts for correct declension of numerals by gender and case --- README.md | 3 ++- date2word | 43 +++++++++++++++++++++++++++++++++++++++++++ say | 10 ++-------- time2word | 30 ++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 9 deletions(-) create mode 100755 date2word create mode 100755 time2word diff --git a/README.md b/README.md index d2bc0e5..ef476bd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ __say__ - cURL (`ftp/curl`); - jq (`textproc/jq`); - опционально утилита notify-send (из `devel/libnotify`); -- скрипт date2word.lua. +- два скрипта на Python: date2word и time2word. Для их работы требуется + библиотека num2words (`devel/py-num2words`). --- diff --git a/date2word b/date2word new file mode 100755 index 0000000..90f0071 --- /dev/null +++ b/date2word @@ -0,0 +1,43 @@ +#!/usr/local/bin/python3 + +import time +from num2words import num2words + +month_names = [ + ' января ', ' февраля ', ' марта ', + ' апреля ', ' мая ', ' июня ', + ' июля ', ' августа ', ' сентября ', + ' октября ', ' ноября ', ' декабря ', + ] +wdays = [ + ' понедельник, ', ' вторник, ', ' среда, ', + ' четверг, ', ' пятница, ', ' суббота, ', ' воскресенье, ' + ] + +def pluralize(n, forms): + """ + Returns appropriate form of item that should be after its quantity + :param n: number of items + :param forms: array of 3 forms for 1, 2 and 5 counts + ('яблоко', 'яблока', 'яблок') + :returns + """ + if n % 100 in (11, 12, 13, 14): + return forms[2] + if n % 10 == 1: + return forms[0] + if n % 10 in (2, 3, 4): + return forms[1] + return forms[2] + +WD = wdays[time.localtime(time.time()).tm_wday] +D = time.localtime(time.time()).tm_mday +M = month_names[time.localtime(time.time()).tm_mon] +Y = time.localtime(time.time()).tm_year + +W = WD + num2words(D, lang = 'ru', gender = 'n', to = 'ordinal') + M +W = W + num2words(Y, lang = 'ru', gender = 'm', case = 'g', to = 'ordinal') +W = W + ' года' + +print(W) + diff --git a/say b/say index 03ac552..28063b7 100755 --- a/say +++ b/say @@ -40,17 +40,11 @@ _pluralform(){ } _date() { - echo "Сегодня - $( date '+%A' ), $( date2word.lua )." + echo "Сегодня - $( date2word )." } _time() { - H=$(( $( date '+%H' ) + 0 )) - M=$(( $( date '+%M' ) + 0 )) - - H="${H} $( _pluralform ${H} час часа часов )" - M="${M} $( _pluralform ${M} минута минуты минут )" - - echo "${H}. ${M}" + echo "Текущее время - $( time2word )" } _godville() { diff --git a/time2word b/time2word new file mode 100755 index 0000000..6edd000 --- /dev/null +++ b/time2word @@ -0,0 +1,30 @@ +#!/usr/local/bin/python3 + +import time +from num2words import num2words + +def pluralize(n, forms): + """ + Returns appropriate form of item that should be after its quantity + :param n: number of items + :param forms: array of 3 forms for 1, 2 and 5 counts + ('яблоко', 'яблока', 'яблок') + :returns + """ + if n % 100 in (11, 12, 13, 14): + return forms[2] + if n % 10 == 1: + return forms[0] + if n % 10 in (2, 3, 4): + return forms[1] + return forms[2] + +H = time.localtime(time.time()).tm_hour +M = time.localtime(time.time()).tm_min + +W = num2words(H, lang = 'ru', gender = 'm') + pluralize(H, [' час, ', ' часа, ', ' часов, ']) + +W = W + num2words(M, lang = 'ru', gender = 'f') + pluralize(M, [' минута', ' минуты', ' минут']) + +print(W) +