Nicely truncate text
====================

Intelligent truncation of text means that truncation does not take
place inside a word but only between words. So the required length is
only an approximation. The result text might be a bit longer than the
required length:

  >>> from icemac.truncatetext import truncate
  >>> 'I was here.'[:3]
  'I w'
  >>> truncate('I was here.', 3)
  'I was ...'

What can get truncated?
-----------------------

Only instances of ``basestring`` (``str`` on Python 3) can be truncated:

  >>> truncate(3, 3)
  Traceback (most recent call last):
  ValueError: 3 is no instance of basestring or None
  >>> print(truncate(u'Lorem ipsum', 5))
  Lorem ...

``None`` is handled nicely:

  >>> truncate(None, 4)
  ''

What is returned?
-----------------

Always at least one word is returned even when it is longer than the
required length:

  >>> truncate('Lorem ipsum', 1)
  'Lorem ...'

If the text contains only of one word which is longer than the desired
length it is returned without an ellipsis:

  >>> truncate('The-really-long-word', 5)
  'The-really-long-word'

If the text is shorter than the desired length it is returned without
the ellipsis, too:

  >>> truncate('Lorem ipsum', 11)
  'Lorem ipsum'

Where gets the text truncated?
------------------------------

Truncation also takes place at tabs and linebreaks:

  >>> truncate("I was here.\nNow I'm away", 11)
  'I was here. ...'
  >>> truncate("I was here.\rNow I'm away", 12)
  'I was here.\rNow ...'
  >>> truncate("I was here.\tNow I'm away", 11)
  'I was here. ...'

I do not want `...` as ellipsis.
--------------------------------

``truncate`` takes an optional argument which defines the ellipsis string:

  >>> print(truncate(u'Lorem ipsum', 5, ellipsis=u':::'))
  Lorem :::

