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