Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/azzzak/sentence
Текстовые шаблоны с вариативностью
https://github.com/azzzak/sentence
go golang templates
Last synced: 1 day ago
JSON representation
Текстовые шаблоны с вариативностью
- Host: GitHub
- URL: https://github.com/azzzak/sentence
- Owner: azzzak
- License: mit
- Created: 2023-10-14T20:02:29.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2023-10-14T21:40:22.000Z (about 1 year ago)
- Last Synced: 2024-11-11T09:08:45.232Z (2 months ago)
- Topics: go, golang, templates
- Language: Go
- Homepage:
- Size: 8.79 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# sentence [![Go Reference](https://pkg.go.dev/badge/github.com/azzzak/sentence.svg)](https://pkg.go.dev/github.com/azzzak/sentence) [![Go Report Card](https://goreportcard.com/badge/github.com/azzzak/sentence)](https://goreportcard.com/report/github.com/azzzak/sentence)
Библиотека для добавления вариативности текстовым сообщениям. Также содержит функции для согласования слов с числительными. Основана на `text/template`, все возможности этого пакета доступны в шаблонах.
### Функции
`plural` приниает число для согласования и строку либо слайс с возможными формами слова`pluraln` аналогична `plural`, в вывод добавляется число с которым происходит согласование
`any` выбирает случайный элемент из строки или слайса
`anyf` выбирает случайный элемент из нескольких переданных значений (например, полей структуры)
### Пример
```Go
package mainimport (
"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)`. Метод принимают текст шаблона, который служит ключом для поиска бинарной версии шаблона в мапе. Этот подход также поззволяет выявить некорректно составленные шаблоны на раннем этапе.