summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Neekman <val@neekware.com>2013-02-13 10:42:21 -0500
committerVal Neekman <val@neekware.com>2013-02-13 10:42:21 -0500
commita4c78fab0157d7da3ed77ca8b2f98cd0dbac5bf2 (patch)
tree81919d92988a7cca26fa147bbf4dd4849a186594
parent19587b7674691f059c5058fdbb858284afea0e4b (diff)
downloadpython-slugify-a4c78fab0157d7da3ed77ca8b2f98cd0dbac5bf2.tar.gz
added truncation0.0.3
-rw-r--r--README.md64
-rw-r--r--slugify/__init__.py27
-rw-r--r--test.py28
3 files changed, 101 insertions, 18 deletions
diff --git a/README.md b/README.md
index eb1f5a4..51c2f32 100644
--- a/README.md
+++ b/README.md
@@ -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
+
+
+
+
diff --git a/test.py b/test.py
index e0697b5..c279a33 100644
--- a/test.py
+++ b/test.py
@@ -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()