nutools/lib/pyulib/src/uapps/urandomize.py

112 lines
2.9 KiB
Python
Raw Normal View History

2013-08-27 15:14:44 +04:00
#!/usr/bin/env python
# -*- coding: utf-8 -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
import os, sys, string
from os import path
from sys import stdin, stdout, exit, argv
from string import join, strip, atoi
try: from random import choice
except: from whrandom import choice
from ulib.all import uprint
def quote_maybe(str, quote=True):
if quote: str = "'%s'" % str.replace("'", "'\\''")
return str
def run_urandomize():
global argv
if len(argv) == 2 and argv[1] in ('--help', ):
progname = path.split(argv[0])[1]
uprint(u"""%(progname)s -- Mélanger des lignes de façon aléatoire
USAGE
%(progname)s [-j | -J size]
OPTIONS
-j, -J size
Fusionner les lignes pour en faire des lignes de taille maximum $size
octets (920 par défaut. Utiliser -1 pour pas de limite.)
-q Mettre les valeurs entre quotes
""" % vars())
exit(0)
DEFAULT_SIZE = 920
size = None
quote = False
argv = argv[1:]
while argv:
if argv[0][:1] == '-':
opt = argv[0][:2]
if opt == '-j':
size = DEFAULT_SIZE
elif opt == '-J':
if not argv[0][2:]:
if not argv[1:2]:
raise ValueError, "-J attend un argument"
else:
arg = argv[1]
argv = argv[1:]
else:
arg = argv[0][2:]
size = atoi(arg)
elif opt == '-q':
quote = True
elif opt == '--':
break
else:
raise ValueError, "Option invalide"
else:
break
argv = argv[1:]
if argv:
# 'lignes' données en ligne de commande
input = argv
else:
input = []
while 1:
line = stdin.readline()
if not line: break
while line[ - 1:] in ('\n', '\r'):
line = line[: - 1]
input.append(line)
if size:
# Il faut fusionner les lignes
# On en profite pour les striper
output = []
line = ''
while input:
item = choice(input)
input.remove(item)
if line: line = line + ' '
line = line + strip(quote_maybe(item, quote))
if size != - 1 and len(line) >= size:
output.append(line)
line = ''
if line:
output.append(line)
else:
# On se contente de randomiser les lignes
output = []
while input:
item = choice(input)
input.remove(item)
output.append(quote_maybe(item, quote))
for item in output:
stdout.write(item + '\n')
if __name__ == '__main__':
run_urandomize()