diff --git a/internal/modules/cleaner/interface.go b/internal/modules/cleaner/interface.go new file mode 100644 index 0000000..43e2c64 --- /dev/null +++ b/internal/modules/cleaner/interface.go @@ -0,0 +1,6 @@ +package cleaner + +type ICleaner interface { + ClearCode(code string) string + ClearText(text string) string +} diff --git a/internal/modules/cleaner/service.go b/internal/modules/cleaner/service.go new file mode 100644 index 0000000..3c670ff --- /dev/null +++ b/internal/modules/cleaner/service.go @@ -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, "")) +} diff --git a/internal/modules/cleaner/service_test.go b/internal/modules/cleaner/service_test.go new file mode 100644 index 0000000..50d5de8 --- /dev/null +++ b/internal/modules/cleaner/service_test.go @@ -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) + } + }) + } +} diff --git a/internal/modules/formatter/interface.go b/internal/modules/formatter/interface.go new file mode 100644 index 0000000..3fd0ec0 --- /dev/null +++ b/internal/modules/formatter/interface.go @@ -0,0 +1,6 @@ +package formatter + +type IFormatter interface { + FormatText(text string) string + FormatString(text string) string +} diff --git a/internal/modules/formatter/service.go b/internal/modules/formatter/service.go new file mode 100644 index 0000000..2639a77 --- /dev/null +++ b/internal/modules/formatter/service.go @@ -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 +} diff --git a/internal/modules/formatter/service_test.go b/internal/modules/formatter/service_test.go new file mode 100644 index 0000000..c474684 --- /dev/null +++ b/internal/modules/formatter/service_test.go @@ -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) + } + }) + } +}