]> git.armaanb.net Git - lightcards.git/blob - lightcards/runner.py
Add option to start in a specific view
[lightcards.git] / lightcards / runner.py
1 # Markdown flashcard utility
2 # Armaan Bhojwani 2021
3
4 import argparse
5 from curses import wrapper
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
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):
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(stack)
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)
83     wrapper(win.run)
84
85
86 def reparse():
87     """Parse arguments and input file again"""
88     args = parse_args()
89     os.system(f"$EDITOR {args.inp[0]}"),
90     return parse.parse_html(parse.md2html(args.inp[0]))
91
92
93 def get_orig():
94     """Return original header and stack"""
95     return (headers, stack)
96
97
98 def main(args=sys.argv):
99     args = parse_args()
100     global headers, stack
101     (headers, stack) = parse.parse_html(parse.md2html(args.inp[0]))
102     show(args, stack, headers)
103
104
105 if __name__ == "__main__":
106     main()