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