diff --git a/tests/test_naming.py b/tests/test_naming.py index 00f9266..1ede37a 100644 --- a/tests/test_naming.py +++ b/tests/test_naming.py @@ -46,3 +46,16 @@ def test_series_level_kept_when_set(): r.narrator = "Rufus Beck" assert render_template("{Author}/{Series}/{Title} ({Narrator})", r) == \ "J.K. Rowling/Harry Potter/Harry Potter und der Feuerkelch (Rufus Beck)" + + +def test_missing_values_do_not_leave_dangling_separators(): + """A "{Series}/{Volume} - {Title}" library still has standalone titles.""" + req = SimpleNamespace(title="Ein Einzeltitel", authors="Jemand", series="", + volume=None, year=None, narrator="") + assert render_template("{Series}/{Volume} - {Title}", req) == "Ein Einzeltitel" + assert render_template("{Volume} - {Title} ({Year})", req) == "Ein Einzeltitel" + + numbered = SimpleNamespace(title="Die Höllenbrut", authors="A. F. Morland", + series="Tony Ballard", volume=1, year=2020, narrator="") + assert render_template("{Series}/{Volume} - {Title}", numbered) == \ + "Tony Ballard/01 - Die Höllenbrut" diff --git a/wordarr/naming.py b/wordarr/naming.py index 805f6d1..50bc3b0 100644 --- a/wordarr/naming.py +++ b/wordarr/naming.py @@ -29,7 +29,8 @@ def render_template(template: str, request) -> str: seg = seg.replace("{" + key + "}", val) # drop empty parenthesized/dangling bits from missing values, e.g. "Title ()" seg = re.sub(r"\(\s*\)", "", seg) - seg = re.sub(r"(-|–)\s*$", "", seg).strip() + seg = re.sub(r"(-|–)\s*$", "", seg) + seg = re.sub(r"^\s*(-|–|·)\s*", "", seg).strip() if not seg: continue # drop path levels that are empty (e.g. {Series} without a series) segments.append(sanitize(seg))