From 7fc79f3415682ddda1e33d229aaac4db2f36e012 Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Mon, 8 Feb 2021 16:50:32 -0500 Subject: [PATCH] Reformat using Black --- bin/kvtml2html.py | 8 +- lightcards/deck.py | 5 +- lightcards/display.py | 166 ++++++++++++++++++++++++--------------- lightcards/lightcards.py | 61 +++++++------- lightcards/parse.py | 7 +- lightcards/progress.py | 2 +- setup.py | 4 +- 7 files changed, 155 insertions(+), 98 deletions(-) diff --git a/bin/kvtml2html.py b/bin/kvtml2html.py index 313a44b..9a28303 100755 --- a/bin/kvtml2html.py +++ b/bin/kvtml2html.py @@ -7,7 +7,8 @@ from bs4 import BeautifulSoup def parse_args(): parser = argparse.ArgumentParser( - description="Convert KWordQuiz file into Markdown for Lightcards") + description="Convert KWordQuiz file into Markdown for Lightcards" + ) parser.add_argument("inp", metavar="input file", type=str, nargs=1) parser.add_argument("outp", metavar="output file", type=str, nargs=1) return parser.parse_args() @@ -18,7 +19,9 @@ def main(): with open(args.inp[0], "r", encoding="utf-8") as input_file: soup = BeautifulSoup(input_file, "lxml") - headers = [x.get_text().split("\n")[1] for x in soup.find_all("identifier")] + headers = [ + x.get_text().split("\n")[1] for x in soup.find_all("identifier") + ] body = soup.find_all("entry") col1 = [x.find("translation", {"id": "0"}) for x in body] col2 = [x.find("translation", {"id": "1"}) for x in body] @@ -34,5 +37,6 @@ def main(): with open(args.outp[0], "w", encoding="utf-8") as output_file: output_file.write(html) + if __name__ == "__main__": main() diff --git a/lightcards/deck.py b/lightcards/deck.py index b0822a9..eac8b69 100644 --- a/lightcards/deck.py +++ b/lightcards/deck.py @@ -1,8 +1,10 @@ # Classes pertaining to the card deck # Armaan Bhojwani 2021 + class Card(list): """Card extends the list class, and adds ability to star them.""" + def __init__(self, inp): super().__init__(inp) self.starred = False @@ -29,8 +31,9 @@ class Card(list): return "Not starred" -class Status(): +class Status: """The status class keeps track of where in the deck the user is""" + def __init__(self): self.index = 0 self.side = 0 diff --git a/lightcards/display.py b/lightcards/display.py index 2aa891e..ecdc070 100644 --- a/lightcards/display.py +++ b/lightcards/display.py @@ -10,7 +10,7 @@ import textwrap from . import lightcards, progress -class Display(): +class Display: def __init__(self, stack, headers, obj): self.stack = stack self.headers = headers @@ -52,7 +52,7 @@ class Display(): def ntotal(self): """Get toal number of starred cards""" - return([card for card in self.stack if card.getStar()]) + return [card for card in self.stack if card.getStar()] def disp_bar(self): """ @@ -65,8 +65,9 @@ class Display(): if len(self.stack) <= 1: percent = "100" else: - percent = str(round(self.obj.getIdx() / - len(self.stack) * 100)).zfill(2) + percent = str( + round(self.obj.getIdx() / len(self.stack) * 100) + ).zfill(2) # Print yellow if starred if self.stack[self.obj.getIdx()].getStar(): @@ -77,18 +78,24 @@ class Display(): # Create bar component bar_start = "[" bar_middle = self.stack[self.obj.getIdx()].printStar() - bar_end = f"] [{len(self.ntotal())}/{str(len(self.stack))} starred] " + \ - f"[{percent}% (" + \ - str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack)))) + \ - f"/{str(len(self.stack))})] [" + \ - f"{self.headers[self.obj.getSide()]} (" + \ - f"{str(self.obj.getSide() + 1)})] " + bar_end = ( + f"] [{len(self.ntotal())}/{str(len(self.stack))} starred] " + + f"[{percent}% (" + + str(self.obj.getIdx() + 1).zfill(len(str(len(self.stack)))) + + f"/{str(len(self.stack))})] [" + + f"{self.headers[self.obj.getSide()]} (" + + f"{str(self.obj.getSide() + 1)})] " + ) # Put it all togethor self.win.addstr(mlines - 1, 0, bar_start, curses.color_pair(1)) self.win.addstr(mlines - 1, len(bar_start), bar_middle, star_color) - self.win.addstr(mlines - 1, len(bar_start + bar_middle), - bar_end, curses.color_pair(1)) + self.win.addstr( + mlines - 1, + len(bar_start + bar_middle), + bar_end, + curses.color_pair(1), + ) def menu_print(self, string, err=False): """Print messages on the menu screen""" @@ -98,7 +105,7 @@ class Display(): color = curses.color_pair(1) for i in range(42): - self.menu_win.addch(15, i+1, " ") + self.menu_win.addch(15, i + 1, " ") self.menu_win.addstr(15, 1, string, color) self.panel_up() @@ -131,16 +138,17 @@ class Display(): self.menu_print("All starred!") elif key == "t": self.stack.reverse() - self.menu_print( - "Stack reversed!") + self.menu_print("Stack reversed!") elif key == "z": shuffle(self.stack) self.menu_print("Stack shuffled!") elif key == "f": for x in self.stack: x[0], x[1] = x[1], x[0] - (self.headers[0], self.headers[1]) = (self.headers[1], - self.headers[0]) + (self.headers[0], self.headers[1]) = ( + self.headers[1], + self.headers[0], + ) self.menu_print("Cards flipped!") elif key == "s": # Check if there are any starred cards before proceeding, and @@ -172,17 +180,20 @@ class Display(): if quit: quit_text = "[q]: quit" - self.menu_win.addstr(1, 1, "LIGHTCARDS MENU", curses.color_pair(1) + - curses.A_BOLD) + self.menu_win.addstr( + 1, 1, "LIGHTCARDS MENU", curses.color_pair(1) + curses.A_BOLD + ) self.menu_win.hline(2, 1, curses.ACS_HLINE, 15) - text = ["[y]: reset stack to original state", - "[a]: alphabetize stack", - "[z]: shuffle stack", - "[f]: flip all cards in stack", - "[t]: reverse stack order", - "[u]: unstar all", - "[d]: star all", - "[s]: update stack to include starred only"] + text = [ + "[y]: reset stack to original state", + "[a]: alphabetize stack", + "[z]: shuffle stack", + "[f]: flip all cards in stack", + "[t]: reverse stack order", + "[u]: unstar all", + "[d]: star all", + "[s]: update stack to include starred only", + ] for t in enumerate(text): self.menu_win.addstr(t[0] + 3, 1, t[1]) @@ -198,7 +209,7 @@ class Display(): multiple options on how to continue. """ (mlines, mcols) = self.win.getmaxyx() - self.menu_win.mvwin(int(mlines/2) - 9, int(mcols/2) - 22) + self.menu_win.mvwin(int(mlines / 2) - 9, int(mcols / 2) - 22) self.menu_panel.show() self.panel_up() @@ -227,19 +238,30 @@ class Display(): self.main_win.clear() # If on the back of the card, show the content of the front side in # the header - num_done = str(self.obj.getIdx() + - 1).zfill(len(str(len(self.stack)))) + num_done = str(self.obj.getIdx() + 1).zfill( + len(str(len(self.stack))) + ) if self.obj.getSide() == 0: top = num_done + " | " + self.headers[self.obj.getSide()] else: - top = num_done + " | " + self.headers[self.obj.getSide()] + \ - " | \"" + str(self.stack[self.obj.getIdx()][0]) + "\"" + top = ( + num_done + + " | " + + self.headers[self.obj.getSide()] + + ' | "' + + str(self.stack[self.obj.getIdx()][0]) + + '"' + ) header_width = mcols if mcols > 80: header_width = 80 - self.main_win.addstr(0, 0, textwrap.shorten(top, width=header_width, - placeholder="…"), curses.A_BOLD) + self.main_win.addstr( + 0, + 0, + textwrap.shorten(top, width=header_width, placeholder="…"), + curses.A_BOLD, + ) # Add horizontal line lin_width = header_width @@ -248,9 +270,14 @@ class Display(): self.main_win.hline(1, 0, curses.ACS_HLINE, lin_width) # Show current side - self.main_win.addstr(2, 0, textwrap.fill( - self.stack[self.obj.getIdx()][self.obj.getSide()], - width=self.wrap_width())) + self.main_win.addstr( + 2, + 0, + textwrap.fill( + self.stack[self.obj.getIdx()][self.obj.getSide()], + width=self.wrap_width(), + ), + ) self.panel_up() self.disp_bar() self.disp_sidebar() @@ -262,26 +289,29 @@ class Display(): self.help_panel.top() self.help_panel.hide() self.help_win.clear() - self.help_win.addstr(1, 1, "LIGHTCARDS HELP", curses.color_pair(1) + - curses.A_BOLD) + self.help_win.addstr( + 1, 1, "LIGHTCARDS HELP", curses.color_pair(1) + curses.A_BOLD + ) self.help_win.hline(2, 1, curses.ACS_HLINE, 15) - text = ["Welcome to lightcards. Here are some keybindings", - "to get you started:", - "", - "h, left previous card", - "l, right next card", - "j, k, up, down flip card", - "i, / star card", - "0, ^, home go to the start of the deck", - "$, end go to the end of the deck", - "H, ? open this screen", - "e open the input file in $EDITOR", - "m open the control menu", - "", - "More information can be found in the man page, or", - "by running `lightcards --help`.", - "", - "Press [q], [H], or [?] to go back."] + text = [ + "Welcome to lightcards. Here are some keybindings", + "to get you started:", + "", + "h, left previous card", + "l, right next card", + "j, k, up, down flip card", + "i, / star card", + "0, ^, home go to the start of the deck", + "$, end go to the end of the deck", + "H, ? open this screen", + "e open the input file in $EDITOR", + "m open the control menu", + "", + "More information can be found in the man page, or", + "by running `lightcards --help`.", + "", + "Press [q], [H], or [?] to go back.", + ] for t in enumerate(text): self.help_win.addstr(t[0] + 3, 1, t[1]) @@ -290,7 +320,7 @@ class Display(): def disp_help(self): (mlines, mcols) = self.win.getmaxyx() - self.help_win.mvwin(int(mlines/2) - 10, int(mcols/2) - 26) + self.help_win.mvwin(int(mlines / 2) - 10, int(mcols / 2) - 26) self.panel_up() self.help_panel.show() while True: @@ -310,6 +340,10 @@ class Display(): key = self.win.getkey() if key == "q": self.leave() + elif key in ["h", "KEY_LEFT"]: + self.obj.back() + self.obj.setSide(0) + self.disp_card() elif key in ["l", "KEY_RIGHT"]: self.obj.forward(self.stack) self.obj.setSide(0) @@ -341,8 +375,12 @@ class Display(): (mlines, mcols) = self.win.getmaxyx() left = mcols - 19 - self.win.addstr(0, mcols - 16, "STARRED CARDS", - curses.color_pair(3) + curses.A_BOLD) + self.win.addstr( + 0, + mcols - 16, + "STARRED CARDS", + curses.color_pair(3) + curses.A_BOLD, + ) self.win.vline(0, mcols - 20, 0, mlines - 2) self.win.hline(1, left, 0, mlines) @@ -350,9 +388,9 @@ class Display(): # TODO: Fix this, some off by one error newntotal = self.ntotal() if mlines - 5 < len(self.ntotal()): - newntotal = self.ntotal()[:mlines - 4] + newntotal = self.ntotal()[: mlines - 4] elif mlines - 5 == len(self.ntotal()): - newntotal = self.ntotal()[:mlines - 3] + newntotal = self.ntotal()[: mlines - 3] for card in newntotal: for i in enumerate(newntotal): @@ -361,7 +399,11 @@ class Display(): term = i[1][0][:18] + "…" self.win.addstr(2 + i[0], left, term) if not newntotal == self.ntotal(): - self.win.addstr(mlines - 3, left, f"({len(self.ntotal()) - len(newntotal)} more)") + self.win.addstr( + mlines - 3, + left, + f"({len(self.ntotal()) - len(newntotal)} more)", + ) break if len(self.ntotal()) == 0: diff --git a/lightcards/lightcards.py b/lightcards/lightcards.py index 102a17a..5aec89e 100644 --- a/lightcards/lightcards.py +++ b/lightcards/lightcards.py @@ -14,33 +14,40 @@ from .deck import Status def parse_args(): parser = argparse.ArgumentParser( - description="Terminal flashcards from Markdown") - parser.add_argument("inp", - metavar="input file", - type=str, - nargs=1) - parser.add_argument("-a", "--alphabetize", - 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", - action='store_true', - help="don't check cached info before starting") + description="Terminal flashcards from Markdown" + ) + parser.add_argument("inp", metavar="input file", type=str, nargs=1) + parser.add_argument( + "-a", + "--alphabetize", + 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", + action="store_true", + help="don't check cached info before starting", + ) # TODO: don't require input file when using -P - parser.add_argument("-P", "--purge-all", - action='store_true', - help="don't check cached info before starting") - parser.add_argument("-r", "--reverse", - action='store_true', - help="reverse card order") - parser.add_argument("-s", "--shuffle", - action='store_true', - help="shuffle card order") - parser.add_argument("-v", "--version", - action='version', - version="lightcards 0.6.0") + parser.add_argument( + "-P", + "--purge-all", + action="store_true", + help="don't check cached info before starting", + ) + parser.add_argument( + "-r", "--reverse", action="store_true", help="reverse card order" + ) + parser.add_argument( + "-s", "--shuffle", action="store_true", help="shuffle card order" + ) + parser.add_argument( + "-v", "--version", action="version", version="lightcards 0.6.0" + ) return parser.parse_args() @@ -87,7 +94,7 @@ def reparse(): def get_orig(): """Return original header and stack""" - return((headers, stack)) + return (headers, stack) def main(args=sys.argv): diff --git a/lightcards/parse.py b/lightcards/parse.py index d70c4e9..0b4ecc1 100644 --- a/lightcards/parse.py +++ b/lightcards/parse.py @@ -11,18 +11,19 @@ from .deck import Card def md2html(file): """Use the markdown module to convert input to HTML""" try: - return markdown.markdown(open(file, "r").read(), extensions=['tables']) + return markdown.markdown(open(file, "r").read(), extensions=["tables"]) except FileNotFoundError: - print(f"lightcards: \"{file}\": No such file or directory") + print(f'lightcards: "{file}": No such file or directory') exit(1) def parse_html(html): """Use BeautifulSoup to parse the HTML""" + def clean_text(inp): return inp.get_text().rstrip() - soup = BeautifulSoup(html, 'html.parser') + soup = BeautifulSoup(html, "html.parser") outp = [] for x in soup.find_all("tr"): diff --git a/lightcards/progress.py b/lightcards/progress.py index 2147bff..6fd3f3c 100644 --- a/lightcards/progress.py +++ b/lightcards/progress.py @@ -13,7 +13,7 @@ dired = f"{os.path.expanduser('~')}/.cache/lightcards/" def name_gen(stra): hasher = hashlib.md5() hasher.update(str(stra).encode("utf-8")) - return(hasher.hexdigest()) + return hasher.hexdigest() def make_dirs(dired): diff --git a/setup.py b/setup.py index 66c1db9..93ca495 100644 --- a/setup.py +++ b/setup.py @@ -18,11 +18,11 @@ setup( packages=["lightcards"], install_requires=["beautifulsoup4", "markdown"], data_files=[("man/man1", ["man/lightcards.1"])], - scripts=['bin/lightcards'], + scripts=["bin/lightcards"], classifiers=[ "Intended Audience :: Education", "Environment :: Console :: Curses", "License :: OSI Approved :: MIT License", - "Topic :: Education" + "Topic :: Education", ], ) -- 2.39.2