Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/azzzak/sentence

Текстовые шаблоны с вариативностью
https://github.com/azzzak/sentence

go golang templates

Last synced: 1 day ago
JSON representation

Текстовые шаблоны с вариативностью

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 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)`. Метод принимают текст шаблона, который служит ключом для поиска бинарной версии шаблона в мапе. Этот подход также поззволяет выявить некорректно составленные шаблоны на раннем этапе.