]> git.armaanb.net Git - lightcards.git/blobdiff - lightcards/runner.py
Add menu keybindings to config
[lightcards.git] / lightcards / runner.py
index 83a71b009b25413e51f112f2e200251b4b705a76..73e275875138b93ec7f9edcd05c767b8312dfe45 100644 (file)
@@ -2,13 +2,13 @@
 # Armaan Bhojwani 2021
 
 import argparse
-from curses import wrapper
-import os
+import curses
+import pkg_resources
 from random import shuffle
 import sys
 
-from . import parse, progress
-from .display import Display
+from . import parse, progress, config
+from .display import Display, CursesError
 from .deck import Status
 
 
@@ -17,6 +17,20 @@ def parse_args():
     parser = argparse.ArgumentParser(
         description="Terminal flashcards from Markdown"
     )
+    parser.add_argument(
+        "-c",
+        "--config",
+        type=str,
+        help="specify custom config file",
+    )
+    parser.add_argument(
+        "-V",
+        "--view",
+        metavar="view",
+        type=int,
+        choices=range(1, 4),
+        help="specify which view to start in (default = 1)",
+    )
     parser.add_argument("inp", metavar="input file", type=str, nargs=1)
     parser.add_argument(
         "-a",
@@ -24,9 +38,6 @@ def parse_args():
         action="store_true",
         help="alphabetize card order",
     )
-    parser.add_argument(
-        "-f", "--flip", action="store_true", help="show second column first"
-    )
     parser.add_argument(
         "-p",
         "--purge",
@@ -40,48 +51,49 @@ def parse_args():
         "-s", "--shuffle", action="store_true", help="shuffle card order"
     )
     parser.add_argument(
-        "-v", "--version", action="version", version="lightcards 0.6.0"
+        "-v",
+        "--version",
+        action="version",
+        version=f"lightcards {pkg_resources.require('lightcards')[0].version}",
     )
     return parser.parse_args()
 
 
-def show(args, stack, headers):
+def show(args, stack, headers, conf):
     """
     Get objects from cache, manipulate deck according to passed arguments, and
     send it to the display functions
     """
     # Purge caches if asked
     if args.purge:
-        progress.purge(stack)
+        progress.purge(get_orig()[1])
 
     # Check for caches
     idx = Status()
-    cache = progress.dive(get_orig())
+    cache = progress.dive(get_orig()[1])
     if cache:
         (stack) = cache
 
     # Manipulate deck
-    if args.shuffle:
+    if args.shuffle or conf["shuffle"]:
         shuffle(stack)
-    if args.alphabetize:
-        stack.sort()
-    if args.reverse:
+    if args.alphabetize or conf["alphabetize"]:
+        stack.sort(key=lambda x: x.front)
+    if args.reverse or conf["reverse"]:
         stack.reverse()
-    if args.flip:
-        for x in stack:
-            x[0], x[1] = x[1], x[0]
-        headers[0], headers[1] = headers[1], headers[0]
 
-    # Send to display
-    win = Display(stack, headers, idx)
-    wrapper(win.run)
+    # Set view
+    if args.view:
+        view = args.view
+    else:
+        view = conf["default_view"]
 
-
-def reparse():
-    """Parse arguments and input file again"""
-    args = parse_args()
-    os.system(f"$EDITOR {args.inp[0]}"),
-    return parse.parse_html(parse.md2html(args.inp[0]))
+    # Send to display
+    win = Display(stack, headers, idx, view, args, conf)
+    try:
+        curses.wrapper(win.run)
+    except curses.error as e:
+        raise CursesError() from e
 
 
 def get_orig():
@@ -91,9 +103,15 @@ def get_orig():
 
 def main(args=sys.argv):
     args = parse_args()
+    conf = config.read_file(args.config)
+
     global headers, stack
     (headers, stack) = parse.parse_html(parse.md2html(args.inp[0]))
-    show(args, stack, headers)
+
+    if not conf["debug"]:
+        sys.tracebacklimit = 0
+
+    show(args, stack, headers, conf)
 
 
 if __name__ == "__main__":