Skip to content

Instantly share code, notes, and snippets.

@ivanjr0
Created October 11, 2012 16:56
Show Gist options
  • Save ivanjr0/3873855 to your computer and use it in GitHub Desktop.
Save ivanjr0/3873855 to your computer and use it in GitHub Desktop.
import re
import sys
import doctest
def pluft(itens, texto, limite=None, mais=None):
'''
Tipos dos parametros:
@param {iterable} itens
@param {unicode} texto
@param {int} limite
@param {unicode} mais
Exemplos de uso:
>>> pluft((u'Ivan',), u'%s coment(ou)(aram) no seu perfil.')
u'Ivan comentou no seu perfil.'
>>> pluft((u'Ivan', u'Nutela'), u'%s coment(ou)(aram) no seu perfil.')
u'Ivan e Nutela comentaram no seu perfil.'
>>> pluft((u'Ivan', u'Nutela', u'Lavarini'), \
u'%s coment(ou)(aram) no seu perfil.')
u'Ivan, Nutela e Lavarini comentaram no seu perfil.'
>>> pluft((u'Ivan', u'Nutela', u'Lavarini', u'Heitor'), \
u'%s coment(ou)(aram) no seu perfil.', 3, u'e mais %d pesso(a)(as)')
u'Ivan, Nutela, Lavarini e mais 1 pessoa comentou no seu perfil.'
>>> pluft((u'Ivan', u'Nutela', u'Lavarini', u'Heitor'), \
u'%s coment(ou)(aram) no seu perfil.', 2, 'e mais %d pesso(a)(as)')
u'Ivan, Nutela e mais 2 pessoas comentaram no seu perfil.'
'''
por_virgula = lambda L: ', '.join(L)
nao_tem_um = lambda L: not len(L) == 1 if L is not None else True
def acertar_texto(texto, plural):
expressao = re.compile('\((.+)\)\((.+)\)')
return re.sub(expressao, lambda m: m.groups()[int(plural)], texto)
restante = None
if limite is not None and limite < len(itens):
itens, restante = itens[:limite], itens[limite:]
do_restante = None
if mais is not None:
do_restante = acertar_texto(
mais % len(restante),
nao_tem_um(restante)
)
quantidade = len(itens)
if quantidade == 1 and do_restante is None:
enumeracao = itens[0]
elif do_restante is None:
enumeracao = u'%s e %s' % (
por_virgula(itens[:-1]), itens[-1]
)
else:
enumeracao = u'%s %s' % (
por_virgula(itens), do_restante
)
concordancia = nao_tem_um(restante)
resultado = acertar_texto(
texto, nao_tem_um(itens) and concordancia
) % enumeracao
return resultado
def main(args):
doctest.testmod()
if __name__ == '__main__':
main(sys.argv)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment