]> git.armaanb.net Git - lightcards.git/blob - lightcards/runner.py
Add preliminary config file support
[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         "-c",
23         "--config",
24         type=str,
25         help="specify custom config file",
26     )
27     parser.add_argument(
28         "-V",
29         "--view",
30         metavar="view",
31         type=int,
32         choices=range(1, 4),
33         default=1,
34         help="specify which view to start in (default = 1)",
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, input_file):
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:
77         (stack) = cache
78
79     # Manipulate deck
80     if args.shuffle:
81         shuffle(stack)
82     if args.alphabetize:
83         stack.sort(key=lambda x: x.front)
84     if args.reverse:
85         stack.reverse()
86
87     # Send to display
88     win = Display(stack, headers, idx, args.view, input_file)
89     try:
90         curses.wrapper(win.run)
91     except curses.error as e:
92         raise CursesError() from e
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     sys.tracebacklimit = 0
102     args = parse_args()
103     global headers, stack
104     (headers, stack) = parse.parse_html(parse.md2html(args.inp[0]))
105     show(args, stack, headers, args)
106
107
108 if __name__ == "__main__":
109     main()