From 5955177386c670145853da08c907a1bcc53c0037 Mon Sep 17 00:00:00 2001 From: Taras Bunyk Date: Mon, 8 Mar 2021 21:44:02 +0100 Subject: [PATCH] Add position from which file is loaded to progress computation --- app/app.go | 7 +++++-- cmd/text.go | 3 ++- phrase/phrase.go | 14 ++++++++------ view/render.go | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/app.go b/app/app.go index e3e8233..c2a8f01 100644 --- a/app/app.go +++ b/app/app.go @@ -20,8 +20,10 @@ type App struct { InputPosition int ErrorInput []rune StartedAt time.Time - Zen bool - Mute bool + Offset int + + Zen bool + Mute bool scr tcell.Screen } @@ -95,6 +97,7 @@ func (a App) ToDisplay() view.DisplayableData { TODOText: a.Text[a.InputPosition:], StartedAt: a.StartedAt, Zen: a.Zen, + Offset: a.Offset, } } diff --git a/cmd/text.go b/cmd/text.go index 8d5a411..9c5796a 100644 --- a/cmd/text.go +++ b/cmd/text.go @@ -13,13 +13,14 @@ var textCmd = &cobra.Command{ Short: "train to type contents of some file", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { - text, err := phrase.FromFile(args[0], offset, limit) + text, skipped, err := phrase.FromFile(args[0], offset, limit) fatal(err) a, err := app.New(text) fatal(err) a.Zen = zen a.Mute = mute + a.Offset = skipped a.Run() fatal(err) diff --git a/phrase/phrase.go b/phrase/phrase.go index 2886749..0b5c36f 100644 --- a/phrase/phrase.go +++ b/phrase/phrase.go @@ -11,21 +11,22 @@ import ( "path/filepath" "strings" "time" + "unicode/utf8" "github.com/bunyk/gokeybr/fs" ) -func FromFile(filename string, offset, minLength int) (string, error) { - items, err := readFileLines(filename, offset) +func FromFile(filename string, offset, minLength int) (string, int, error) { + items, skipped, err := readFileLines(filename, offset) if err != nil { - return "", err + return "", skipped, err } items = slice(items, minLength) - return strings.Join(items, "\n"), nil + return strings.Join(items, "\n"), skipped, nil } func Words(filename string, n int) (string, error) { - words, err := readFileLines(filename, 0) + words, _, err := readFileLines(filename, 0) if err != nil { return "", err } @@ -38,7 +39,7 @@ func Words(filename string, n int) (string, error) { return strings.Join(phrase, " "), nil } -func readFileLines(filename string, offset int) (lines []string, err error) { +func readFileLines(filename string, offset int) (lines []string, skipped int, err error) { var data []byte if filename == "-" { data, err = ioutil.ReadAll(os.Stdin) @@ -69,6 +70,7 @@ func readFileLines(filename string, offset int) (lines []string, err error) { } if skip > 0 { skip-- + skipped += utf8.RuneCountInString(line) + 1 } else { lines = append(lines, line[:len(line)-1]) } diff --git a/view/render.go b/view/render.go index 7bdd15e..9e05754 100644 --- a/view/render.go +++ b/view/render.go @@ -25,6 +25,7 @@ type DisplayableData struct { TODOText []rune StartedAt time.Time Zen bool + Offset int } func Render(s tcell.Screen, dd DisplayableData) { @@ -39,7 +40,7 @@ func Render(s tcell.Screen, dd DisplayableData) { // Stats: seconds := 0.0 wpm := 0.0 - done := float64(len(dd.DoneText)) + done := float64(len(dd.DoneText) + dd.Offset) if !dd.StartedAt.IsZero() { seconds = time.Since(dd.StartedAt).Seconds() wpm = wordsPerChar * done / seconds * 60.0