From 47003d1fe72f13caa9f1ef64b1e1666a9fd1d976 Mon Sep 17 00:00:00 2001 From: Caleb Denio Date: Mon, 31 Aug 2026 22:17:39 -0600 Subject: [PATCH] fix text encoding --- go.mod | 2 ++ go.sum | 2 ++ main.go | 37 ++++++++++++++++++------------------- puz/puz.go | 32 ++++++++++++++++++++++++-------- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 3340cb9..574da03 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/cjdenio/crossword go 1.25.0 + +require golang.org/x/text v0.41.0 diff --git a/go.sum b/go.sum index e69de29..5a94f53 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= diff --git a/main.go b/main.go index fc47e66..ff26b57 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "os" "slices" "strings" + "time" "github.com/cjdenio/crossword/puz" ) @@ -100,24 +101,22 @@ func main() { fmt.Printf("TITLE: %s\n", puzzle.Title) fmt.Printf("AUTHOR: %s\n", puzzle.Author) - - fmt.Println(RenderPuzzle(puzzle.State, puzzle.Width, puzzle.Height, puzzle.Clues[0].Cells, 1)) - - // j, _ := json.Marshal(puzzle) - // fmt.Println(string(j)) - // for _, clue := range puzzle.Clues { - // if clue.Direction == puz.DirectionAcross { - // fmt.Printf(". %d-across: %s: %s\n", clue.Number, clue.Clue, clue.Solution) - // } else { - // fmt.Printf(". %d-down: %s: %s\n", clue.Number, clue.Clue, clue.Solution) - // } - // } - + fmt.Println(RenderPuzzle(puzzle.Solution, puzzle.Width, puzzle.Height, puzzle.Clues[0].Cells, 1)) fmt.Printf("%s\n", puzzle.Copyright) - // for { - // n, _ := os.Stdin.Read(make([]byte, 1)) - // if n > 0 { - // return - // } - // } + + selectedCell := 1 + + for { + time.Sleep(500 * time.Millisecond) + + fmt.Printf("\x1b[%dA", puzzle.Height+6) + fmt.Print("\x1b[J") + + fmt.Printf("TITLE: %s\n", puzzle.Title) + fmt.Printf("AUTHOR: %s\n", puzzle.Author) + fmt.Println(RenderPuzzle(puzzle.Solution, puzzle.Width, puzzle.Height, puzzle.Clues[selectedCell].Cells, 1)) + fmt.Printf("%s\n", puzzle.Copyright) + + selectedCell++ + } } diff --git a/puz/puz.go b/puz/puz.go index 348a839..3b74426 100644 --- a/puz/puz.go +++ b/puz/puz.go @@ -7,6 +7,8 @@ import ( "errors" "math" "strings" + + "golang.org/x/text/encoding/charmap" ) type Direction int @@ -65,6 +67,20 @@ func startOfAcrossClue(puzzle string, width, index int) bool { return false } +func readText(b *bufio.Reader) (string, error) { + text, err := b.ReadString(0x00) + if err != nil { + return "", err + } + + decoded, err := charmap.ISO8859_1.NewDecoder().String(text[:len(text)-1]) + if err != nil { + return "", err + } + + return decoded, nil +} + func ParsePuz(file []byte) (*Puzzle, error) { // read magic bytes magic := string(file[2:14]) @@ -92,32 +108,32 @@ func ParsePuz(file []byte) (*Puzzle, error) { // read text buf := bufio.NewReader(bytes.NewReader(file[stateEnd:])) - title, err := buf.ReadString(0x00) + title, err := readText(buf) if err != nil { return nil, err } - puzzle.Title = title[:len(title)-1] + puzzle.Title = title - author, err := buf.ReadString(0x00) + author, err := readText(buf) if err != nil { return nil, err } - puzzle.Author = author[:len(author)-1] + puzzle.Author = author - copyright, err := buf.ReadString(0x00) + copyright, err := readText(buf) if err != nil { return nil, err } - puzzle.Copyright = copyright[:len(copyright)-1] + puzzle.Copyright = copyright // read clues clues := make([]string, 0, puzzle.ClueCount) for range puzzle.ClueCount { - clue, err := buf.ReadString(0x00) + clue, err := readText(buf) if err != nil { return nil, err } - clues = append(clues, clue[:len(clue)-1]) + clues = append(clues, clue) } // assign clue numbers