]> git.armaanb.net Git - lightcards.git/blob - lightcards/runner.py
Fix purge option
[lightcards.git] / lightcards / runner.py
1 # Markdown flashcard utility
2 # Armaan Bhojwani 2021
3
4 import argparse
5 import curses
6 import os
7 import pkg_resources
8 from random import shuffle
9 import sys
10
11 from . import parse, progress
12 from .display import Display, CursesError
13 from .deck import Status
14
15
16 def parse_args():
17     """Parse command line arguments"""
18     parser = argparse.ArgumentParser(
19         description="Terminal flashcards from Markdown"
20     )
21     parser.add_argument(
22         "-V",
23         "--view",
24         metavar="view",
25         type=int,
26         choices=range(1, 4),
27         default=1,
28         help="specify which view to start in (default = 1)",
29     )
30     parser.add_argument("inp", metavar="input file", type=str, nargs=1)
31     parser.add_argument(
32         "-a",
33         "--alphabetize",
34         action="store_true",
35         help="alphabetize card order",
36     )
37     parser.add_argument(
38         "-p",
39         "--purge",
40         action="store_true",
41         help="don't check cached info before starting",
42     )
43     parser.add_argument(
44         "-r", "--reverse", action="store_true", help="reverse card order"
45     )
46     parser.add_argument(
47         "-s", "--shuffle", action="store_true", help="shuffle card order"
48     )
49     parser.add_argument(
50         "-v",
51         "--version",
52         action="version",
53         version=f"lightcards {pkg_resources.require('lightcards')[0].version}",
54     )
55     return parser.parse_args()
56
57
58 def show(args, stack, headers):
59     """
60     Get objects from cache, manipulate deck according to passed arguments, and
61     send it to the display functions
62     """
63     # Purge caches if asked
64     if args.purge:
65         progress.purge(get_orig()[1])
66
67     # Check for caches
68     idx = Status()
69     cache = progress.dive(get_orig()[1])
70     if cache:
71         (stack) = cache
72
73     # Manipulate deck
74     if args.shuffle:
75         shuffle(stack)
76     if args.alphabetize:
77         stack.sort(key=lambda x: x.front)
78     if args.reverse:
79         stack.reverse()
80
81     # Send to display
82     win = Display(stack, headers, idx, args.view)
83     try:
84         curses.wrapper(win.run)
85     except curses.error as e:
86         raise CursesError() from e
87
88
89 def reparse():
90     """Parse arguments and input file again"""
91     args = parse_args()
92     os.system(f"$EDITOR {args.inp[0]}"),
93     return parse.parse_html(parse.md2html(args.inp[0]))
94
95
96 def get_orig():
97     """Return original header and stack"""
98     return (headers, stack)
99
100
101 def main(args=sys.argv):
102     sys.tracebacklimit = 0
103     args = parse_args()
104     global headers, stack
105     (headers, stack) = parse.parse_html(parse.md2html(args.inp[0]))
106     show(args, stack, headers)
107
108
109 if __name__ == "__main__":
110     main()