add modules

This commit is contained in:
2026-07-13 23:52:04 +07:00
parent db746f2123
commit 2b11c49b3c
6 changed files with 224 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
package cleaner
type ICleaner interface {
ClearCode(code string) string
ClearText(text string) string
}
+49
View File
@@ -0,0 +1,49 @@
package cleaner
import (
"regexp"
"strings"
)
var (
replaceMap = map[string]string{
"a": "а",
"e": "е",
"o": "о",
"c": "с",
"p": "р",
"x": "х",
"y": "у",
"k": "к",
"m": "м",
"t": "т",
"h": "н",
"b": "в",
"u": "и",
}
re = regexp.MustCompile(`\(\[[a-zA-Zа-яА-Я\d-]+\]\)`)
)
type service struct{}
func NewCleaner() ICleaner {
return &service{}
}
func (s *service) ClearCode(code string) string {
code = strings.TrimPrefix(code, "(")
code = strings.TrimPrefix(code, "[")
code = strings.TrimSuffix(code, ")")
code = strings.TrimSuffix(code, "]")
code = strings.ToLower(code)
code = strings.TrimSpace(code)
code = strings.ReplaceAll(code, "-", "")
for latin, cyrillic := range replaceMap {
code = strings.ReplaceAll(code, latin, cyrillic)
}
return code
}
func (s *service) ClearText(text string) string {
return strings.TrimSpace(re.ReplaceAllString(text, ""))
}
+72
View File
@@ -0,0 +1,72 @@
package cleaner
import (
"fmt"
"testing"
)
func Test_service_ClearCode(t *testing.T) {
tests := []struct {
code string
want string
}{
{
code: "ы",
want: "ы",
},
{
code: "Ы",
want: "ы",
},
{
code: "Ы-1",
want: "ы1",
},
{
code: "[Ы]",
want: "ы",
},
{
code: "([Ы])",
want: "ы",
},
}
for _, tt := range tests {
t.Run(fmt.Sprintf("%s->%s", tt.code, tt.want), func(t *testing.T) {
var s service
got := s.ClearCode(tt.code)
if got != tt.want {
t.Errorf("ClearCode() = %v, want %v", got, tt.want)
}
})
}
}
func Test_service_ClearText(t *testing.T) {
tests := []struct {
text string
want string
}{
{
text: "text",
want: "text",
},
{
text: "text ([Ы])",
want: "text",
},
{
text: "text ([Ы-3])",
want: "text",
},
}
for _, tt := range tests {
t.Run(tt.text, func(t *testing.T) {
var s service
got := s.ClearText(tt.text)
if got != tt.want {
t.Errorf("ClearText() = %v, want %v", got, tt.want)
}
})
}
}
+6
View File
@@ -0,0 +1,6 @@
package formatter
type IFormatter interface {
FormatText(text string) string
FormatString(text string) string
}
+50
View File
@@ -0,0 +1,50 @@
package formatter
import (
"bufio"
"strings"
)
type service struct{}
func NewFormatter() IFormatter {
return &service{}
}
func (s *service) FormatText(text string) string {
scanner := bufio.NewScanner(strings.NewReader(text))
scanner.Split(bufio.ScanLines)
lines := []string{}
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
var res strings.Builder
for i, line := range lines {
l := strings.TrimSpace(line)
if strings.HasPrefix(l, "--") {
l = strings.Replace(l, "--", "—", 1)
}
if i == 0 && strings.HasPrefix(l, "—") {
res.WriteString(" ")
}
if i > 0 {
res.WriteString("\n")
if len(l) > 0 {
res.WriteString(" ")
}
}
res.WriteString(l)
}
return res.String()
}
func (s *service) FormatString(text string) string {
l := strings.TrimSpace(text)
if strings.HasPrefix(l, "--") {
l = strings.Replace(l, "--", "—", 1)
}
return l
}
@@ -0,0 +1,41 @@
package formatter
import "testing"
func Test_service_FormatText(t *testing.T) {
tests := []struct {
name string
text string
want string
}{
{
name: "Простой текст",
text: "Привет",
want: "Привет",
},
{
name: "Текст с двумя абзацами",
text: "Привет\nМир",
want: "Привет\n Мир",
},
{
name: "Прямая речь",
text: "— Привет",
want: " — Привет",
},
{
name: "Прямая речь через 2 минуса",
text: "-- Привет",
want: " — Привет",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var s service
got := s.FormatText(tt.text)
if got != tt.want {
t.Errorf("FormatText() = %v, want %v", got, tt.want)
}
})
}
}