docs: def wrap_text_in_a_box(body='', title='', style='double_star', **args):
      r"""Return a nicely formatted text box.
  
          e.g.
         ******************
         **  title       **
         **--------------**
         **  body        **
         ******************
  
      Indentation and newline are respected.
  
      :param body: the main text
      :param title: an optional title
      :param style: the name of one of the style in CFG_WRAP_STYLES. By default
          the double_star style is used.
  
      You can further tune the desired style by setting various optional
      parameters:
  
          :param horiz_sep: a string that is repeated in order to produce a
              separator row between the title and the body (if needed)
              or a tuple of three characters in the form (l, c, r)
          :param max_col: the maximum number of coulmns used by the box
              (including indentation)
          :param min_col: the symmetrical minimum number of columns
          :param tab_str: a string to represent indentation
          :param tab_num: the number of leveles of indentations
          :param border: a tuple of 8 element in the form
              (tl, t, tr, l, r, bl, b, br) of strings that represent the
              different corners and sides of the box
          :param prefix: a prefix string added before the box
          :param suffix: a suffix string added after the box
          :param break_long: wethever to break long words in order to respect
              max_col
          :param force_horiz: True in order to print the horizontal line even when
              there is no title
  
      e.g.:
      print wrap_text_in_a_box(title='prova',
          body='  123 prova.\n    Vediamo come si indenta',
          horiz_sep='-', style='no_border', max_col=20, tab_num=1)
  
          prova
          ----------------
          123 prova.
              Vediamo come
              si indenta
  
      """
      def _wrap_row(row, max_col, break_long):
          """Wrap a single row."""
          spaces = _RE_BEGINNING_SPACES.match(row).group()
          row = row[len(spaces):]
          spaces = spaces.expandtabs()
          return textwrap.wrap(row, initial_indent=spaces,
                               subsequent_indent=spaces, width=max_col,
                               break_long_words=break_long)
  
      def _clean_newlines(text):
          text = _RE_LONELY_NEWLINES.sub(' \n', text)
          return _RE_NEWLINES_CLEANER.sub(lambda x: x.group()[:-1], text)
  
      body = unicode(body, 'utf-8')
      title = unicode(title, 'utf-8')
  
      astyle = dict(CFG_WRAP_TEXT_IN_A_BOX_STYLES['__DEFAULT'])
      if style in CFG_WRAP_TEXT_IN_A_BOX_STYLES:
          astyle.update(CFG_WRAP_TEXT_IN_A_BOX_STYLES[style])
      astyle.update(args)
  
      horiz_sep = astyle['horiz_sep']
      border = astyle['border']
      tab_str = astyle['tab_str'] * astyle['tab_num']
      max_col = max(astyle['max_col'] -
                    len(border[3]) - len(border[4]) - len(tab_str), 1)
      min_col = astyle['min_col']
      prefix = astyle['prefix']
      suffix = astyle['suffix']
      force_horiz = astyle['force_horiz']
      break_long = astyle['break_long']
  
      body = _clean_newlines(body)
      tmp_rows = [_wrap_row(row, max_col, break_long)
                  for row in body.split('\n')]
      body_rows = []
      for rows in tmp_rows:
          if rows:
              body_rows += rows
          else:
              body_rows.append('')
      if not ''.join(body_rows).strip():
          # Concrete empty body
          body_rows = []
  
      title = _clean_newlines(title)
      tmp_rows = [_wrap_row(row, max_col, break_long)
                  for row in title.split('\n')]
      title_rows = []
      for rows in tmp_rows:
          if rows:
              title_rows += rows
          else:
              title_rows.append('')
      if not ''.join(title_rows).strip():
          # Concrete empty title
          title_rows = []
  
      max_col = max([len(row) for row in body_rows + title_rows] + [min_col])
  
      mid_top_border_len = max_col + \
          len(border[3]) + len(border[4]) - len(border[0]) - len(border[2])
      mid_bottom_border_len = max_col + \
          len(border[3]) + len(border[4]) - len(border[5]) - len(border[7])
      top_border = border[0] + \
          (border[1] * mid_top_border_len)[:mid_top_border_len] + border[2]
      bottom_border = border[5] + \
          (border[6] * mid_bottom_border_len)[:mid_bottom_border_len] + \
          border[7]
      if isinstance(horiz_sep, tuple) and len(horiz_sep) == 3:
          horiz_line = horiz_sep[0] + \
              (horiz_sep[1] * (max_col + 2))[:(max_col + 2)] + horiz_sep[2]
      else:
          horiz_line = border[3] + (horiz_sep * max_col)[:max_col] + border[4]
  
      title_rows = [tab_str + border[3] + row +
                    ' ' * (max_col - len(row)) +
                    border[4] for row in title_rows]
      body_rows = [tab_str + border[3] + row +
                   ' ' * (max_col - len(row)) + border[4] for row in body_rows]
  
      ret = []
      if top_border:
          ret += [tab_str + top_border]
      ret += title_rows
      if title_rows or force_horiz:
          ret += [tab_str + horiz_line]
      ret += body_rows
      if bottom_border:
          ret += [tab_str + bottom_border]
      return (prefix + '\n'.join(ret) + suffix).encode('utf-8')