sentence

Библиотека для добавления вариативности текстовым сообщениям. Также содержит функции для согласования слов с числительными. Основана на text/template
, все возможности этого пакета доступны в шаблонах.
Функции
plural
приниает число для согласования и строку либо слайс с возможными формами слова
pluraln
аналогична plural
, в вывод добавляется число с которым происходит согласование
any
выбирает случайный элемент из строки или слайса
anyf
выбирает случайный элемент из нескольких переданных значений (например, полей структуры)
Пример
package main
import (
"fmt"
"github.com/azzzak/sentence"
)
var dec = func(n int) int {
return n - 1
}
var templ = "{{pluraln .Bottles `бутылка|бутылки|бутылок`}} пива {{plural .Bottles .Forms}} на столе, одна из них {{any `упала|разбилась|грохнулась`}} и их осталось {{decrease .Bottles}}"
func main() {
s, err := sentence.New(sentence.WithFunc("decrease", dec))
if err != nil {
panic(err)
}
for i := 99; i > 90; i-- {
msg := s.MustRender(templ, struct {
Bottles int
Forms []string
}{
Bottles: i,
Forms: []string{"стояла", "стояли", "стояло"},
})
fmt.Println(msg)
}
}
Вариант вывода:
99 бутылок пива стояло на столе, одна из них упала и их осталось 98
98 бутылок пива стояло на столе, одна из них грохнулась и их осталось 97
97 бутылок пива стояло на столе, одна из них разбилась и их осталось 96
96 бутылок пива стояло на столе, одна из них грохнулась и их осталось 95
95 бутылок пива стояло на столе, одна из них упала и их осталось 94
94 бутылки пива стояли на столе, одна из них разбилась и их осталось 93
93 бутылки пива стояли на столе, одна из них грохнулась и их осталось 92
92 бутылки пива стояли на столе, одна из них разбилась и их осталось 91
91 бутылка пива стояла на столе, одна из них упала и их осталось 90
Опции
Передаются при создании нового объекта.
WithLang(string)
язык согласования с числом, возможные значение "en" и "ru", по умолчанию "ru"
WithDelim(string)
разделитель слов в строке, по умолчанию "|"
WithFunc(string, interface{})
возможность определить собственную функцию для использования в шаблонах
WithMapSize(int)
исходный размер мапы для хранения шаблонов после парсинга, по умолчанию 10
Работа с шаблонами
При первом вызове шаблона, происходит его парсинг. Результат помещается в мапу для ускорения последующих операций с этим шаблоном. Для ускорения первого вызова шаблона можно заполнить мапу заранее с помощью метода Prepare(...string)
. Метод принимают текст шаблона, который служит ключом для поиска бинарной версии шаблона в мапе. Этот подход также поззволяет выявить некорректно составленные шаблоны на раннем этапе.