diff --git a/gallery_dl/formatter.py b/gallery_dl/formatter.py index b83cf21c..0b212d5e 100644 --- a/gallery_dl/formatter.py +++ b/gallery_dl/formatter.py @@ -243,13 +243,12 @@ class TemplateFStringFormatter(FStringFormatter): def parse_field_name(field_name): + if field_name[0] == "'": + return "_lit", (operator.itemgetter(field_name[1:-1]),) + first, rest = _string.formatter_field_name_split(field_name) funcs = [] - if first[0] == "'": - funcs.append(operator.itemgetter(first[1:-1])) - first = "_lit" - for is_attr, key in rest: if is_attr: func = operator.attrgetter diff --git a/test/test_formatter.py b/test/test_formatter.py index 89cb1aad..73e958cc 100644 --- a/test/test_formatter.py +++ b/test/test_formatter.py @@ -336,14 +336,14 @@ class TestFormatter(unittest.TestCase): def test_literals(self): value = "foo" - self._run_test("{'foo'}" , value) - self._run_test("{'foo'!u}" , value.upper()) - self._run_test("{'f00':R0/o/}" , value) - self._run_test("{'foobar'[:3]}", value) - self._run_test("{z|'foo'}" , value) - self._run_test("{z|''|'foo'}" , value) - self._run_test("{z|''}" , "") - self._run_test("{''|''}" , "") + self._run_test("{'foo'}" , value) + self._run_test("{'foo'!u}" , value.upper()) + self._run_test("{'f00':R0/o/}", value) + + self._run_test("{z|'foo'}" , value) + self._run_test("{z|''|'foo'}" , value) + self._run_test("{z|'foo'!u}" , value.upper()) + self._run_test("{z|'f00':R0/o/}", value) self._run_test("{_lit[foo]}" , value) self._run_test("{_lit[foo]!u}" , value.upper()) @@ -351,6 +351,17 @@ class TestFormatter(unittest.TestCase): self._run_test("{_lit[foobar][:3]}", value) self._run_test("{z|_lit[foo]}" , value) + # empty (#4492) + self._run_test("{z|''}" , "") + self._run_test("{''|''}", "") + + # special characters (dots, brackets, singlee quotes) (#5539) + self._run_test("{'f.o.o'}" , "f.o.o") + self._run_test("{_lit[f.o.o]}", "f.o.o") + self._run_test("{_lit[f'o'o]}", "f'o'o") + self._run_test("{'f.[].[]'}" , "f.[].[]") + self._run_test("{z|'f.[].[]'}", "f.[].[]") + def test_template(self): with tempfile.TemporaryDirectory() as tmpdirname: path1 = os.path.join(tmpdirname, "tpl1")