docs: def make_name(text, delim=u'-', maxlength=50, checkused=None, counter=2):
      u"""
      Generate an ASCII name slug. If a checkused filter is provided, it will
      be called with the candidate. If it returns True, make_name will add
      counter numbers starting from 2 until a suitable candidate is found.
  
      :param string delim: Delimiter between words, default '-'
      :param int maxlength: Maximum length of name, default 50
      :param checkused: Function to check if a generated name is available for use
      :param int counter: Starting position for name counter
  
      >>> make_name('This is a title')
      'this-is-a-title'
      >>> make_name('Invalid URL/slug here')
      'invalid-url-slug-here'
      >>> make_name('this.that')
      'this-that'
      >>> make_name('this:that')
      'this-that'
      >>> make_name("How 'bout this?")
      'how-bout-this'
      >>> make_name(u"How’s that?")
      'hows-that'
      >>> make_name(u'K & D')
      'k-d'
      >>> make_name('billion+ pageviews')
      'billion-pageviews'
      >>> make_name(u'हिन्दी slug!')
      'hindii-slug'
      >>> make_name(u'Your webapps should talk not just in English, but in español, Kiswahili, 廣州話 and অসমীয়া too.', maxlength=250)
      u'your-webapps-should-talk-not-just-in-english-but-in-espanol-kiswahili-guang-zhou-hua-and-asmiiyaa-too'
      >>> make_name(u'__name__', delim=u'_')
      'name'
      >>> make_name(u'how_about_this', delim=u'_')
      'how_about_this'
      >>> make_name(u'and-that', delim=u'_')
      'and_that'
      >>> make_name(u'Umlauts in Mötörhead')
      'umlauts-in-motorhead'
      >>> make_name('Candidate', checkused=lambda c: c in ['candidate'])
      'candidate2'
      >>> make_name('Candidate', checkused=lambda c: c in ['candidate'], counter=1)
      'candidate1'
      >>> make_name('Candidate', checkused=lambda c: c in ['candidate', 'candidate1', 'candidate2'], counter=1)
      'candidate3'
      >>> make_name('Long title, but snipped', maxlength=20)
      'long-title-but-snipp'
      >>> len(make_name('Long title, but snipped', maxlength=20))
      20
      >>> make_name('Long candidate', maxlength=10, checkused=lambda c: c in ['long-candi', 'long-cand1'])
      'long-cand2'
      >>> make_name(u'Lǝnkǝran')
      'lankaran'
      >>> make_name(u'example@example.com')
      'example-example-com'
      >>> make_name('trailing-delimiter', maxlength=10)
      'trailing-d'
      >>> make_name('trailing-delimiter', maxlength=9)
      'trailing'
      >>> make_name('''test this
      ... newline''')
      'test-this-newline'
      >>> make_name(u"testing an emoji😁")
      u'testing-an-emoji'
      >>> make_name('''testing\\t\\nmore\\r\\nslashes''')
      'testing-more-slashes'
      >>> make_name('What if a HTML <tag/>')
      'what-if-a-html-tag'
      >>> make_name('These are equivalent to \\x01 through \\x1A')
      'these-are-equivalent-to-through'
      """
      name = text.replace('@', delim)
      name = unidecode(name).replace('@', 'a')  # We don't know why unidecode uses '@' for 'a'-like chars
      name = six.text_type(delim.join([_strip_re.sub('', x) for x in _punctuation_re.split(name.lower()) if x != '']))
      if isinstance(text, six.text_type):
          # Unidecode returns str. Restore to a unicode string if original was unicode
          name = six.text_type(name)
      candidate = name[:maxlength]
      if candidate.endswith(delim):
          candidate = candidate[:-1]
      if checkused is None:
          return candidate
      existing = checkused(candidate)
      while existing:
          candidate = name[:maxlength - len(str(counter))] + str(counter)
          counter += 1
          existing = checkused(candidate)
      return candidate