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