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