diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7b383c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +txt2json +*.exe \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..49a7f58 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module txt2json + +go 1.26.5 diff --git a/txt2json_main.go b/txt2json_main.go new file mode 100644 index 0000000..f615e34 --- /dev/null +++ b/txt2json_main.go @@ -0,0 +1,82 @@ +package main + +import ( + "encoding/json" + "flag" + "fmt" + "os" + "strings" +) + +func main() { + field := flag.String("field", "", "имя поля для JSON, например body или biography (необязательно)") + flag.Parse() + args := flag.Args() + + if len(args) == 0 { + fmt.Println("Использование:") + fmt.Println(" txt2json файл.txt") + fmt.Println(" txt2json -field=biography файл.txt") + fmt.Println() + fmt.Println("Разложи текст в обычном .txt файле по абзацам (пустая строка") + fmt.Println("между абзацами), и утилита сама превратит его в готовую строку") + fmt.Println("для JSON, сохранив разбивку на абзацы.") + os.Exit(1) + } + + hadErrors := false + for _, path := range args { + if err := convert(path, *field); err != nil { + fmt.Fprintf(os.Stderr, "Ошибка с файлом %q: %v\n", path, err) + hadErrors = true + } + } + + if hadErrors { + os.Exit(1) + } +} + +func convert(path, field string) error { + data, err := os.ReadFile(path) + if err != nil { + return err + } + + text := strings.ReplaceAll(string(data), "\r\n", "\n") + + // Абзацы разделены пустой строкой. Внутри абзаца одиночные переносы + // (например, из-за переноса по ширине окна в текстовом редакторе) + // склеиваются в один текст без разрывов. + rawParagraphs := strings.Split(text, "\n\n") + var paragraphs []string + for _, p := range rawParagraphs { + collapsed := strings.Join(strings.Fields(p), " ") + collapsed = strings.TrimSpace(collapsed) + if collapsed != "" { + paragraphs = append(paragraphs, collapsed) + } + } + + joined := strings.Join(paragraphs, "\n\n") + + jsonValue, err := json.Marshal(joined) + if err != nil { + return err + } + + var output string + if field != "" { + output = fmt.Sprintf("\"%s\": %s", field, string(jsonValue)) + } else { + output = string(jsonValue) + } + + outPath := path + ".snippet.json" + if err := os.WriteFile(outPath, []byte(output+"\n"), 0o644); err != nil { + return err + } + + fmt.Printf("Готово: %s → %s\n\n%s\n\n", path, outPath, output) + return nil +}