diff options
author | Val Neekman <val@neekware.com> | 2013-02-13 10:42:21 -0500 |
---|---|---|
committer | Val Neekman <val@neekware.com> | 2013-02-13 10:42:21 -0500 |
commit | a4c78fab0157d7da3ed77ca8b2f98cd0dbac5bf2 (patch) | |
tree | 81919d92988a7cca26fa147bbf4dd4849a186594 | |
parent | 19587b7674691f059c5058fdbb858284afea0e4b (diff) | |
download | python-slugify-a4c78fab0157d7da3ed77ca8b2f98cd0dbac5bf2.tar.gz |
added truncation0.0.3
-rw-r--r-- | README.md | 64 | ||||
-rw-r--r-- | slugify/__init__.py | 27 | ||||
-rw-r--r-- | test.py | 28 |
3 files changed, 101 insertions, 18 deletions
@@ -27,25 +27,53 @@ How to use ================= from slugify import slugify - s = "This is a test ---" - r = slugify(s) - print r # => "this-is-a-test" - - s = 'C\'est déjà l\'été.' - r = slugify(s) - print r # => "c-est-deja-lete" - - s = 'Nín hǎo. Wǒ shì zhōng guó rén' - r = slugify(s) - print r # => "nin-hao-wo-shi-zhong-guo-ren" + txt = "This is a test ---" + r = slugify(txt) + self.assertEquals(r, "this-is-a-test") + + txt = "This -- is a ## test ---" + r = slugify(txt) + self.assertEquals(r, "this-is-a-test") + + txt = 'C\'est déjà l\'été.' + r = slugify(txt) + self.assertEquals(r, "cest-deja-lete") - s = '影師嗎' - r = slugify(s) - print r # => "ying-shi-ma" + txt = 'Nín hǎo. Wǒ shì zhōng guó rén' + r = slugify(txt) + self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren") txt = 'Компьютер' r = slugify(txt) - print r # => "kompiuter" + self.assertEquals(r, "kompiuter") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt) + self.assertEquals(r, "jaja-lol-mememeoo-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=9) + self.assertEquals(r, "jaja-lol") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=15) + self.assertEquals(r, "jaja-lol-mememe") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=50) + self.assertEquals(r, "jaja-lol-mememeoo-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=15, word_boundary=True) + self.assertEquals(r, "jaja-lol-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=19, word_boundary=True) + self.assertEquals(r, "jaja-lol-mememeoo") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=20, word_boundary=True) + self.assertEquals(r, "jaja-lol-mememeoo-a") Running the tests @@ -58,6 +86,10 @@ To run the tests against the current environment: Changelog ========= +0.0.3 +----- +* Added the ability to truncate slugs + tests (viva Juan Riaza of Spain) + 0.0.2 ----- * Added more tests @@ -71,7 +103,7 @@ Changelog License ======= -Copyright © Neekware Inc. +Copyright © Val Neekman All rights reserved. diff --git a/slugify/__init__.py b/slugify/__init__.py index fe634bf..8d0295a 100644 --- a/slugify/__init__.py +++ b/slugify/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -__version__ = '0.0.2' +__version__ = '0.0.3' __all__ = ['slugify'] @@ -23,7 +23,22 @@ REPLACE1_REXP = re.compile(r'[\']+') REPLACE2_REXP = re.compile(r'[^-a-z0-9]+') REMOVE_REXP = re.compile('-{2,}') -def slugify(text, entities=True, decimal=True, hexadecimal=True): +def smart_truncate(text, max_length=0, word_boundaries=False): + if not max_length or len(text) < max_length: + return text + + if not word_boundaries: + return text[:max_length].strip('-') + + truncated = '' + for i, word in enumerate(text.split('-')): + if not word: continue + if len(truncated) + len(word) + i <= max_length: + truncated += '{0}{1}'.format('-' if i else '', word) + return truncated.strip('-') + + +def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, word_boundary=False): """ Make a slug from the given text """ # text to unicode @@ -64,4 +79,12 @@ def slugify(text, entities=True, decimal=True, hexadecimal=True): # remove redundant - text = REMOVE_REXP.sub('-', text).strip('-') + # smart truncate if requested + if max_length > 0: + text = smart_truncate(text, max_length, word_boundary) + return text + + + + @@ -27,6 +27,34 @@ class TestSequenceFunctions(unittest.TestCase): r = slugify(txt) self.assertEquals(r, "kompiuter") + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt) + self.assertEquals(r, "jaja-lol-mememeoo-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=9) + self.assertEquals(r, "jaja-lol") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=15) + self.assertEquals(r, "jaja-lol-mememe") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=50) + self.assertEquals(r, "jaja-lol-mememeoo-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=15, word_boundary=True) + self.assertEquals(r, "jaja-lol-a") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=19, word_boundary=True) + self.assertEquals(r, "jaja-lol-mememeoo") + + txt = 'jaja---lol-méméméoo--a' + r = slugify(txt, max_length=20, word_boundary=True) + self.assertEquals(r, "jaja-lol-mememeoo-a") + if __name__ == '__main__': unittest.main() |