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