11import { Input } from "@cliffy/prompt" ;
2- import { parseArgs } from "@std/cli/parse-args" ;
3- import { green , red , yellow } from "@std/fmt/colors" ;
4- import { loadDeck } from "./deck.ts" ;
2+ import { cleanupReviews } from "./cleanup.ts" ;
3+ import { parseAppArgs } from "./cmd/cli/args.ts" ;
54import { shuffle } from "./collections.ts" ;
5+ import { loadDeck } from "./deck.ts" ;
66import { ratio } from "./levenshtein.ts" ;
7+ import { deriveReviewfile } from "./pathutil.ts" ;
78import {
89 loadReviews ,
9- newReviewItem ,
1010 practice ,
1111 ReviewItem ,
1212 saveReviews ,
1313 score2grade ,
1414} from "./review.ts" ;
15- import { deriveReviewfile } from "./pathutil.ts" ;
1615
17- const args = parseArgs ( Deno . args ) as {
18- deck : string ;
19- } ;
16+ const {
17+ debug,
18+ deck : deckfile ,
19+ } = parseAppArgs ( Deno . args ) ;
2020
21- const deckfile = args . deck ;
2221const reviewfile = deriveReviewfile ( deckfile ) ;
2322
24- console . log ( { deckfile, reviewfile } ) ;
23+ if ( debug ) {
24+ console . log ( { deckfile, reviewfile } ) ;
25+ }
2526
2627const deck = await loadDeck ( deckfile ) ;
2728
@@ -32,54 +33,12 @@ try {
3233 reviewMap = new Map ( ) ;
3334}
3435
35- // update old items
36- const backCardSet = new Set < string > ( ) ;
37- for ( const card of deck ) {
38- backCardSet . add ( card . back ) ;
39- }
40- // remove those review items from reviewMap that are not in backCardSet
41- for ( const { front, back } of reviewMap . values ( ) ) {
42- if ( backCardSet . has ( back ) ) {
43- continue ;
44- }
45-
46- reviewMap . delete ( front ) ;
47- console . log ( yellow ( "! " + front ) ) ;
48- }
49-
50- // add new items
51- for ( const card of deck ) {
52- if ( reviewMap . has ( card . front ) ) {
53- continue ;
54- }
55-
56- reviewMap . set ( card . front , newReviewItem ( card ) ) ;
57-
58- console . log ( green ( "+ " + card . front ) ) ;
59- }
60-
61- // delete old items
62- //
63- // build a set of current cards
64- const frontCardSet = new Set < string > ( ) ;
65- for ( const card of deck ) {
66- frontCardSet . add ( card . front ) ;
67- }
68- // remove those review items from reviewMap that are not in frontCardSet
69- for ( const reviewItemKey of reviewMap . keys ( ) ) {
70- if ( ! frontCardSet . has ( reviewItemKey ) ) {
71- reviewMap . delete ( reviewItemKey ) ;
72- console . log ( "- " + red ( reviewItemKey ) ) ;
73- }
74- }
75-
76- // save cleanups
77- await saveReviews ( reviewfile , reviewMap ) ;
36+ reviewMap = await cleanupReviews ( reviewfile , deck , reviewMap ) ;
7837
7938// get items for review
8039const dueDateItems : ReviewItem [ ] = [ ] ;
8140for ( const review of reviewMap . values ( ) ) {
82- if ( new Date ( review . dueDate ) < new Date ( ) ) {
41+ if ( new Date ( review . dueDate ) <= new Date ( ) ) {
8342 dueDateItems . push ( review ) ;
8443 }
8544}
@@ -91,29 +50,39 @@ console.log("To review:", dueDateItems.length);
9150for ( const review of dueDateItems ) {
9251 console . log ( review . front ) ;
9352
94- let answer : string = await Input . prompt ( "" ) ;
53+ const answer = await Input . prompt ( "" ) . then ( ( s ) => (
54+ // trim input and replace all multi-space characters with just one
55+ s . trim ( ) . replaceAll ( " +" , " " )
56+ ) ) ;
9557
96- // trip and replace all multi-space characters with just one
97- answer = answer . replaceAll ( " +" , " " ) . trim ( ) ;
58+ console . clear ( ) ;
9859
99- if ( answer === ":skip" ) {
100- if ( ! review . skipped ) {
101- review . skipped = 0 ;
102- }
103- review . skipped += 1 ;
60+ switch ( answer ) {
61+ case ":skip" : {
62+ if ( ! review . skipped ) {
63+ review . skipped = 0 ;
64+ }
65+ review . skipped += 1 ;
66+
67+ reviewMap . set ( review . front , review ) ;
68+ await saveReviews ( reviewfile , reviewMap ) ;
10469
105- reviewMap . set ( review . front , review ) ;
106- await saveReviews ( reviewfile , reviewMap ) ;
70+ console . log ( "skipped" ) ;
71+ console . log ( "correct:" , review . back ) ;
72+ console . log ( ) ;
10773
108- continue ;
74+ continue ;
75+ }
76+ case "" :
77+ continue ;
10978 }
11079
11180 const score = ratio ( review . back , answer ) ;
11281
11382 if ( score === 1 ) {
11483 console . log ( "✅ Correct!" ) ;
11584 } else {
116- console . log ( "☑️ Wrong! Score:" , score ) ;
85+ console . log ( "☑️ Wrong! Score:" , formatPercentange ( score ) ) ;
11786
11887 const want = review . back ;
11988
@@ -126,3 +95,7 @@ for (const review of dueDateItems) {
12695 reviewMap . set ( review . front , practice ( review , score2grade ( score ) ) ) ;
12796 await saveReviews ( reviewfile , reviewMap ) ;
12897}
98+
99+ function formatPercentange ( f : number ) : string {
100+ return `${ Math . round ( f * 100 ) } %` ;
101+ }
0 commit comments