diff --git a/gallery_dl/text.py b/gallery_dl/text.py index 7e9eeab1..2487210c 100644 --- a/gallery_dl/text.py +++ b/gallery_dl/text.py @@ -149,6 +149,20 @@ def extract_iter(txt, begin, end, pos=0): return +def extract_from(txt, pos=0, default=""): + """Returns a function object that extracts from 'txt'""" + def extr(begin, end, index=txt.index, txt=txt): + nonlocal pos + try: + first = index(begin, pos) + len(begin) + last = index(end, first) + pos = last + len(end) + return txt[first:last] + except (ValueError, TypeError, AttributeError): + return default + return extr + + def parse_bytes(value, default=0, suffixes="bkmgtp"): """Convert a bytes-amount ("500k", "2.5M", ...) to int""" try: diff --git a/test/test_text.py b/test/test_text.py index da85ab81..ec35c4d2 100644 --- a/test/test_text.py +++ b/test/test_text.py @@ -235,6 +235,23 @@ class TestText(unittest.TestCase): self.assertEqual( g(txt, "[", "]", 6), ["a", "d"]) + def test_extract_from(self, f=text.extract_from): + txt = "[c][b][a]: xyz! [d][e" + + e = f(txt) + self.assertEqual(e("[", "]"), "c") + self.assertEqual(e("[", "]"), "b") + self.assertEqual(e("[", "]"), "a") + self.assertEqual(e("[", "]"), "d") + self.assertEqual(e("[", "]"), "") + self.assertEqual(e("[", "]"), "") + + e = f(txt, pos=6, default="END") + self.assertEqual(e("[", "]"), "a") + self.assertEqual(e("[", "]"), "d") + self.assertEqual(e("[", "]"), "END") + self.assertEqual(e("[", "]"), "END") + def test_parse_bytes(self, f=text.parse_bytes): self.assertEqual(f("0"), 0) self.assertEqual(f("50"), 50)