Skip to content

Commit a4c78fa

Browse files
committed
added truncation
1 parent 19587b7 commit a4c78fa

3 files changed

Lines changed: 101 additions & 18 deletions

File tree

‎README.md‎

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,53 @@ How to use
2727
=================
2828
from slugify import slugify
2929

30-
s = "This is a test ---"
31-
r = slugify(s)
32-
print r # => "this-is-a-test"
33-
34-
s = 'C\'est déjà l\'été.'
35-
r = slugify(s)
36-
print r # => "c-est-deja-lete"
37-
38-
s = 'Nín hǎo. Wǒ shì zhōng guó rén'
39-
r = slugify(s)
40-
print r # => "nin-hao-wo-shi-zhong-guo-ren"
30+
txt = "This is a test ---"
31+
r = slugify(txt)
32+
self.assertEquals(r, "this-is-a-test")
33+
34+
txt = "This -- is a ## test ---"
35+
r = slugify(txt)
36+
self.assertEquals(r, "this-is-a-test")
37+
38+
txt = 'C\'est déjà l\'été.'
39+
r = slugify(txt)
40+
self.assertEquals(r, "cest-deja-lete")
4141

42-
s = '影師嗎'
43-
r = slugify(s)
44-
print r # => "ying-shi-ma"
42+
txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
43+
r = slugify(txt)
44+
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")
4545

4646
txt = 'Компьютер'
4747
r = slugify(txt)
48-
print r # => "kompiuter"
48+
self.assertEquals(r, "kompiuter")
49+
50+
txt = 'jaja---lol-méméméoo--a'
51+
r = slugify(txt)
52+
self.assertEquals(r, "jaja-lol-mememeoo-a")
53+
54+
txt = 'jaja---lol-méméméoo--a'
55+
r = slugify(txt, max_length=9)
56+
self.assertEquals(r, "jaja-lol")
57+
58+
txt = 'jaja---lol-méméméoo--a'
59+
r = slugify(txt, max_length=15)
60+
self.assertEquals(r, "jaja-lol-mememe")
61+
62+
txt = 'jaja---lol-méméméoo--a'
63+
r = slugify(txt, max_length=50)
64+
self.assertEquals(r, "jaja-lol-mememeoo-a")
65+
66+
txt = 'jaja---lol-méméméoo--a'
67+
r = slugify(txt, max_length=15, word_boundary=True)
68+
self.assertEquals(r, "jaja-lol-a")
69+
70+
txt = 'jaja---lol-méméméoo--a'
71+
r = slugify(txt, max_length=19, word_boundary=True)
72+
self.assertEquals(r, "jaja-lol-mememeoo")
73+
74+
txt = 'jaja---lol-méméméoo--a'
75+
r = slugify(txt, max_length=20, word_boundary=True)
76+
self.assertEquals(r, "jaja-lol-mememeoo-a")
4977

5078

5179
Running the tests
@@ -58,6 +86,10 @@ To run the tests against the current environment:
5886
Changelog
5987
=========
6088

89+
0.0.3
90+
-----
91+
* Added the ability to truncate slugs + tests (viva Juan Riaza of Spain)
92+
6193
0.0.2
6294
-----
6395
* Added more tests
@@ -71,7 +103,7 @@ Changelog
71103
License
72104
=======
73105

74-
Copyright © Neekware Inc.
106+
Copyright © Val Neekman
75107

76108
All rights reserved.
77109

‎slugify/__init__.py‎

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3-
__version__ = '0.0.2'
3+
__version__ = '0.0.3'
44

55
__all__ = ['slugify']
66

@@ -23,7 +23,22 @@
2323
REPLACE2_REXP = re.compile(r'[^-a-z0-9]+')
2424
REMOVE_REXP = re.compile('-{2,}')
2525

26-
def slugify(text, entities=True, decimal=True, hexadecimal=True):
26+
def smart_truncate(text, max_length=0, word_boundaries=False):
27+
if not max_length or len(text) < max_length:
28+
return text
29+
30+
if not word_boundaries:
31+
return text[:max_length].strip('-')
32+
33+
truncated = ''
34+
for i, word in enumerate(text.split('-')):
35+
if not word: continue
36+
if len(truncated) + len(word) + i <= max_length:
37+
truncated += '{0}{1}'.format('-' if i else '', word)
38+
return truncated.strip('-')
39+
40+
41+
def slugify(text, entities=True, decimal=True, hexadecimal=True, max_length=0, word_boundary=False):
2742
""" Make a slug from the given text """
2843

2944
# text to unicode
@@ -64,4 +79,12 @@ def slugify(text, entities=True, decimal=True, hexadecimal=True):
6479
# remove redundant -
6580
text = REMOVE_REXP.sub('-', text).strip('-')
6681

82+
# smart truncate if requested
83+
if max_length > 0:
84+
text = smart_truncate(text, max_length, word_boundary)
85+
6786
return text
87+
88+
89+
90+

‎test.py‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,34 @@ def test_manager(self):
2727
r = slugify(txt)
2828
self.assertEquals(r, "kompiuter")
2929

30+
txt = 'jaja---lol-méméméoo--a'
31+
r = slugify(txt)
32+
self.assertEquals(r, "jaja-lol-mememeoo-a")
33+
34+
txt = 'jaja---lol-méméméoo--a'
35+
r = slugify(txt, max_length=9)
36+
self.assertEquals(r, "jaja-lol")
37+
38+
txt = 'jaja---lol-méméméoo--a'
39+
r = slugify(txt, max_length=15)
40+
self.assertEquals(r, "jaja-lol-mememe")
41+
42+
txt = 'jaja---lol-méméméoo--a'
43+
r = slugify(txt, max_length=50)
44+
self.assertEquals(r, "jaja-lol-mememeoo-a")
45+
46+
txt = 'jaja---lol-méméméoo--a'
47+
r = slugify(txt, max_length=15, word_boundary=True)
48+
self.assertEquals(r, "jaja-lol-a")
49+
50+
txt = 'jaja---lol-méméméoo--a'
51+
r = slugify(txt, max_length=19, word_boundary=True)
52+
self.assertEquals(r, "jaja-lol-mememeoo")
53+
54+
txt = 'jaja---lol-méméméoo--a'
55+
r = slugify(txt, max_length=20, word_boundary=True)
56+
self.assertEquals(r, "jaja-lol-mememeoo-a")
57+
3058
if __name__ == '__main__':
3159
unittest.main()
3260

0 commit comments

Comments
 (0)