Work version
This commit is contained in:
parent
76bc011525
commit
e8d28c8037
3 changed files with 87 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
txt2json
|
||||
*.exe
|
||||
3
go.mod
Normal file
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module txt2json
|
||||
|
||||
go 1.26.5
|
||||
82
txt2json_main.go
Normal file
82
txt2json_main.go
Normal file
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue