diff --git a/humanfriendly/tests.py b/humanfriendly/tests.py index 72dad99..d65eb5a 100644 --- a/humanfriendly/tests.py +++ b/humanfriendly/tests.py @@ -370,6 +370,23 @@ def test_pluralization(self): assert pluralize(1, 'box', 'boxes') == '1 box' assert pluralize(2, 'box', 'boxes') == '2 boxes' + def test_generate_slug_delimiter_preserves_content(self): + """Custom delimiters do not strip characters from real words.""" + for text, delimiter, expected in [ + ('status', 'st', 'status'), + (' android data! ', 'and', 'androidanddata'), + ('test!', 't-', 'test'), + ('test words test', 'st', 'teststwordssttest')]: + self.assertEqual(generate_slug(text, delimiter), expected) + + def test_generate_slug_literal_delimiters(self): + """Punctuation and backslash separators remain literal.""" + for delimiter in ('-', '_', '::', '\\', ''): + self.assertEqual(generate_slug(' one!! two ', delimiter), 'one' + delimiter + 'two') + self.assertEqual(generate_slug(''), '') + with self.assertRaises(ValueError): + generate_slug('!!!', 'and') + def test_generate_slug(self): """Test :func:`humanfriendly.text.generate_slug()`.""" # Test the basic functionality. diff --git a/humanfriendly/text.py b/humanfriendly/text.py index a257a6a..600e39c 100644 --- a/humanfriendly/text.py +++ b/humanfriendly/text.py @@ -255,10 +255,7 @@ def generate_slug(text, delimiter="-"): :raises: :exc:`~exceptions.ValueError` when the provided text is nonempty but results in an empty slug. """ - slug = text.lower() - escaped = delimiter.replace("\\", "\\\\") - slug = re.sub("[^a-z0-9]+", escaped, slug) - slug = slug.strip(delimiter) + slug = delimiter.join(re.findall("[a-z0-9]+", text.lower())) if text and not slug: msg = "The provided text %r results in an empty slug!" raise ValueError(format(msg, text))