]> git.armaanb.net Git - lightcards.git/commitdiff
Change Card() from extending list to independent
authorArmaan Bhojwani <me@armaanb.net>
Tue, 9 Feb 2021 03:28:27 +0000 (22:28 -0500)
committerArmaan Bhojwani <me@armaanb.net>
Tue, 9 Feb 2021 03:28:27 +0000 (22:28 -0500)
lightcards/deck.py
lightcards/display.py
lightcards/parse.py

index 2a612027ad00d5d7c61fc3b02d9c7d22e14e4b6d..06ed135b21b24ade39f78bd3c1d830d507fb585f 100644 (file)
@@ -2,13 +2,18 @@
 # Armaan Bhojwani 2021
 
 
-class Card(list):
+class Card:
     """Card extends the list class, and adds ability to star them."""
 
     def __init__(self, inp):
-        super().__init__(inp)
         self.starred = False
         self.side = 0
+        self.front = ""
+        self.back = ""
+        if len(inp) >= 1:
+            self.front = inp[0]
+        if len(inp) >= 2:
+            self.back = inp[1]
 
     def unStar(self):
         self.starred = False
@@ -37,6 +42,15 @@ class Card(list):
     def getSide(self):
         return self.side
 
+    def get(self):
+        if self.side == 0:
+            return self.front
+        else:
+            return self.back
+
+    def getFront(self):
+        return self.front
+
     def flip(self):
         if self.side == 0:
             self.side = 1
@@ -51,7 +65,7 @@ class Status:
         self.index = 0
 
     def forward(self, stack):
-        if not self.index == len(stack):
+        if self.index != len(stack):
             self.index += 1
 
     def back(self):
index 76e312d9a3e3585fb8cfc3f76657746e1c6957ba..35cd149482a64e4c0bd2f7c8f8b6384faa22a925 100644 (file)
@@ -44,7 +44,7 @@ class Display:
 
     def leave(self):
         """Pickle stack before quitting"""
-        if self.obj.getIdx() == len(self.stack):
+        if self.obj.getIdx() + 1 == len(self.stack):
             self.obj.setIdx(0)
 
         progress.dump(self.stack, lightcards.get_orig())
@@ -70,21 +70,21 @@ class Display:
             ).zfill(2)
 
         # Print yellow if starred
-        if self.stack[self.obj.getIdx()].getStar():
+        if self.current_card().getStar():
             star_color = curses.color_pair(3)
         else:
             star_color = curses.color_pair(1)
 
         # Create bar component
         bar_start = "["
-        bar_middle = self.stack[self.obj.getIdx()].printStar()
+        bar_middle = self.current_card().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.stack[self.obj.getIdx()].getSide()]} ("
-            + f"{str(self.stack[self.obj.getIdx()].getSide()) + str(1)})] "
+            + f"{self.headers[self.current_card().getSide()]} ("
+            + f"{str(self.current_card().getSide()) + str(1)})] "
         )
 
         # Put it all togethor
@@ -119,9 +119,9 @@ class Display:
                 self.menu_panel.hide()
                 self.panel_up()
             if key in ["q", "m"]:
-                if len(self.stack) == self.obj.getIdx():
+                if len(self.stack) == self.obj.getIdx() + 1:
                     self.leave()
-                elif len(self.stack) < self.obj.getIdx():
+                elif len(self.stack) < self.obj.getIdx() + 1:
                     self.obj.setIdx(0)
                 self.get_key()
             elif key == "y":
@@ -231,59 +231,50 @@ class Display:
         side.
         """
         (mlines, mcols) = self.win.getmaxyx()
-        if self.obj.getIdx() == len(self.stack):
-            self.disp_menu()
-        else:
-            self.main_panel.bottom()
-            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)))
+        self.main_panel.bottom()
+        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))))
+        if self.current_card().getSide() == 0:
+            top = (
+                num_done + " | " + self.headers[self.current_card().getSide()]
             )
-            if self.stack[self.obj.getIdx()].getSide() == 0:
-                top = (
-                    num_done
-                    + " | "
-                    + self.headers[self.stack[self.obj.getIdx()].getSide()]
-                )
-            else:
-                top = (
-                    num_done
-                    + " | "
-                    + self.headers[self.stack[self.obj.getIdx()].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,
+        else:
+            top = (
+                num_done
+                + " | "
+                + self.headers[self.current_card().getSide()]
+                + ' | "'
+                + str(self.current_card().getFront())
+                + '"'
             )
+        header_width = mcols
+        if mcols > 80:
+            header_width = 80
 
-            # Add horizontal line
-            lin_width = header_width
-            if len(top) < header_width:
-                lin_width = len(top)
-            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.stack[self.obj.getIdx()].getSide()
-                    ],
-                    width=self.wrap_width(),
-                ),
-            )
+        self.main_win.addstr(
+            0,
+            0,
+            textwrap.shorten(top, width=header_width, placeholder="…"),
+            curses.A_BOLD,
+        )
+
+        # Add horizontal line
+        lin_width = header_width
+        if len(top) < header_width:
+            lin_width = len(top)
+        self.main_win.hline(1, 0, curses.ACS_HLINE, lin_width)
+
+        # Show current side
+        self.main_win.addstr(
+            2,
+            0,
+            textwrap.fill(
+                self.current_card().get(),
+                width=self.wrap_width(),
+            ),
+        )
         self.panel_up()
         self.disp_bar()
         self.disp_sidebar()
@@ -335,6 +326,9 @@ class Display:
                 self.help_panel.hide()
                 self.get_key()
 
+    def current_card(self):
+        return self.stack[self.obj.getIdx()]
+
     def get_key(self):
         """
         Display a card and wait for the input.
@@ -348,25 +342,28 @@ class Display:
                 self.leave()
             elif key in ["h", "KEY_LEFT"]:
                 self.obj.back()
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["l", "KEY_RIGHT"]:
-                self.obj.forward(self.stack)
-                self.stack[self.obj.getIdx()].setSide(0)
-                self.disp_card()
+                if self.obj.getIdx() + 1 == len(self.stack):
+                    self.disp_menu()
+                else:
+                    self.obj.forward(self.stack)
+                    self.current_card().setSide(0)
+                    self.disp_card()
             elif key in ["j", "k", "KEY_UP", "KEY_DOWN"]:
-                self.stack[self.obj.getIdx()].flip()
+                self.current_card().flip()
                 self.disp_card()
             elif key in ["i", "/"]:
-                self.stack[self.obj.getIdx()].toggleStar()
+                self.current_card().toggleStar()
                 self.disp_card()
             elif key in ["0", "^", "KEY_HOME"]:
                 self.obj.setIdx(0)
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["$", "KEY_END"]:
                 self.obj.setIdx(len(self.stack) - 1)
-                self.stack[self.obj.getIdx()].setSide(0)
+                self.current_card().setSide(0)
                 self.disp_card()
             elif key in ["H", "?"]:
                 self.disp_help()
@@ -398,12 +395,12 @@ class Display:
         elif mlines - 5 == len(self.ntotal()):
             newntotal = self.ntotal()[: mlines - 3]
 
-        for card in newntotal:
-            for i in enumerate(newntotal):
-                term = i[1][0]
-                if len(i[1][0]) > 18:
-                    term = i[1][0][:18] + "…"
-                self.win.addstr(2 + i[0], left, term)
+        for _ in newntotal:
+            for i, card in enumerate(newntotal):
+                term = card.getFront()
+                if len(term) > 18:
+                    term = term + "…"
+                self.win.addstr(2 + i, left, term)
             if not newntotal == self.ntotal():
                 self.win.addstr(
                     mlines - 3,
index a447485e4b046f4ab16bc67b251c8b140a41cba5..ea3468d66bfdca5f898431ce3a8d6743712b405f 100644 (file)
@@ -25,11 +25,18 @@ def parse_html(html):
     soup = BeautifulSoup(html, "html.parser").find("table")
     outp = []
 
-    for x in soup.find_all("tr"):
-        outp.append(Card([clean_text(y) for y in x.find_all("td")[:2]]))
+    try:
+        for x in soup.find_all("tr"):
+            outp.append(Card(tuple([clean_text(y) for y in x.find_all("td")])))
+    except AttributeError:
+        sys.exit("lightcards: No table found")
+
+    ths = soup.find_all("th")
+    if not len(ths) in [1, 2]:
+        sys.exit("lightcards: Headings malformed")
 
     # Return a tuple of nested lists
-    return ([clean_text(x) for x in soup.find_all("th")][:2], outp[1:])
+    return ([clean_text(x) for x in ths], outp[1:])
 
 
 def main(file):