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