From 66cbb352ebc7717f9bbd816b6e76bdcc347fdcb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Andr=C3=A9e?= Date: Tue, 21 Aug 2012 17:26:21 +0200 Subject: [PATCH] balloon styles: -b and -B options are implemented --- completion/bash-completion.sh | 6 +- completion/fish-completion.fish | 9 ++- completion/zsh-completion.zsh | 8 +- configure | 2 +- manuals/ponysay.texinfo | 3 +- ponysay | 129 ++++++++++++++++++++++++-------- 6 files changed, 116 insertions(+), 41 deletions(-) diff --git a/completion/bash-completion.sh b/completion/bash-completion.sh index d790786d..72cafcbb 100644 --- a/completion/bash-completion.sh +++ b/completion/bash-completion.sh @@ -5,7 +5,7 @@ _ponysay() local cur prev words cword _init_completion -n = || return - options='--version --help --list --altlist --pony --wrap --quote' + options='--version --help --list --altlist --pony --wrap --quote --balloonlist --balloon' COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) if [ $prev = "-f" ] || [ $prev = "--pony" ]; then @@ -16,6 +16,10 @@ _ponysay() quoters=$('/usr/bin/ponysay' --quoters) COMPREPLY=( $( compgen -W "$quoters" -- "$cur" ) ) + elif [ $prev = "-b" ] || [ $prev = "--balloon" ]; then + balloons=$('/usr/bin/ponysay' --balloonlist) + COMPREPLY=( $( compgen -W "$balloons" -- "$cur" ) ) + elif [ $prev = "-W" ] || [ $prev = "--wrap" ]; then cols=$(( `stty size | cut -d ' ' -f 2` - 10 )) COMPREPLY=( $cols $(( $cols / 2 )) 100 60 ) diff --git a/completion/fish-completion.fish b/completion/fish-completion.fish index 9233c671..ead664b4 100644 --- a/completion/fish-completion.fish +++ b/completion/fish-completion.fish @@ -5,17 +5,20 @@ set -g ponies ('/usr/bin/ponysay' --onelist) set -g quoters ('/usr/bin/ponysay' --quoters) +set -g balloons ('/usr/bin/ponysay' --balloonlist) complete --command ponysay --short-option h --long-option help --description 'help of ponysay' complete --command ponysay --short-option v --long-option version --description 'version of ponysay' -complete --command ponysay --short-option l --long-option list --description 'list pony files' -complete --command ponysay --short-option L --long-option altlist --description 'list pony files with alternatives' +complete --command ponysay --short-option l --long-option list --description 'list pony names' +complete --command ponysay --short-option L --long-option altlist --description 'list pony names with alternatives' +complete --command ponysay --short-option B --long-option balloonlist --description 'list balloon style names' complete --command ponysay --short-option f --long-option pony --arguments "$ponies" --description 'pony' complete --command ponysay --short-option q --long-option quote --arguments "$quoters" --no-files --description 'pony' +complete --command ponysay --short-option b --long-option balloon --arguments "$balloons" --description 'balloon style' complete --command ponysay --short-option W --long-option wrap --arguments 'Integer' --description 'specify the column when the message should be wrapped' complete --command ponysay --arguments 'MESSAGE' set -e ponies set -e quoters - +set -e balloons diff --git a/completion/zsh-completion.zsh b/completion/zsh-completion.zsh index 21243807..c19604d2 100644 --- a/completion/zsh-completion.zsh +++ b/completion/zsh-completion.zsh @@ -2,10 +2,12 @@ _shortopts=( '-v[Show version and exit]' '-h[Show this help and exit]' - '-l[list ponyfiles]' - '-L[list ponyfiles with alternatives]' - '-f[Select a pony (either a filename or a ponyname]: :_path_files -W '/usr/share/ponysay/ponies' -g "*(\:r)"' + '-l[list pony names]' + '-L[list pony names with alternatives]' + '-B[list balloon style names]' + '-f[Select a pony (either a file name or a pony name]: :_path_files -W '/usr/share/ponysay/ponies' -g "*(\:r)"' '-q[Select ponies for MLP:FiM quotes]' + '-b[Selecy a balloon style]' '-W[The screen column where the message should be wrapped]' ) _arguments -s : \ diff --git a/configure b/configure index 06290060..6cde35b4 100755 --- a/configure +++ b/configure @@ -6,7 +6,7 @@ INFODESC=\''My Little Ponies for your terminal'\' SHELL='bash' completions='completion/bash-completion.sh completion/fish-completion.fish completion/zsh-completion.zsh' -shareDirs='ponies ttyponies quotes' +shareDirs='ponies ttyponies quotes balloons' manFiles='manuals/manpage.6 manuals/manpage.es.6' licenseFiles='COPYING' diff --git a/manuals/ponysay.texinfo b/manuals/ponysay.texinfo index f11b9048..d0a9cfb1 100644 --- a/manuals/ponysay.texinfo +++ b/manuals/ponysay.texinfo @@ -159,8 +159,7 @@ supersedes file names. Specify the balloon style that should used, this can either be a file name or a balloon name printed by @command{ponysay -B}. This option can be used multiple times to specify a set of styles from which one will be selected randomly. If no -pony is specified one will be selected randomly. Any existing balloon name -supersedes file names. +balloon style is specified a fallback style will be used. @item -q [PONY...] @itemx --quote [PONY...] diff --git a/ponysay b/ponysay index a329fd5c..fedaab6b 100755 --- a/ponysay +++ b/ponysay @@ -52,6 +52,7 @@ class Ponysay(): elif args.opts['-v'] is not None: self.version() elif args.opts['-l'] is not None: self.list() elif args.opts['-L'] is not None: self.linklist() + elif args.opts['-B'] is not None: self.balloonlist() elif args.opts['-q'] is not None: self.quote(args) else: self.print_pony(args) @@ -61,7 +62,7 @@ class Ponysay(): ## ''' - Returns one file with full path, names is filter for names, also accepts filepaths. + Returns one file with full path, names is filter for names, also accepts filepaths ''' def __getponypath(self, names = None): ponies = {} @@ -160,10 +161,13 @@ class Ponysay(): quoters = self.__quoters() for ponydir in ponydirs: # Loop ponydirs - print('\033[1mponyfiles located in ' + ponydir + '\033[21m') + print('\033[1mponies located in ' + ponydir + '\033[21m') - ponies = os.listdir(ponydir) - ponies = [item[:-5] for item in ponies] # remove .pony from file name + _ponies = os.listdir(ponydir) + ponies = [] + for pony in _ponies: + if (len(pony) > 5) and (pony[-5:] == '.pony'): + ponies.append(pony[:-5]) ponies.sort() width = len(max(ponies, key = len)) + 2 # Get the longest ponyfilename lenght + 2 spaces @@ -176,7 +180,7 @@ class Ponysay(): if x > (termsize[1] - width): # If too wide, make new line print() x = 0 - + print('\n'); @@ -188,12 +192,15 @@ class Ponysay(): quoters = self.__quoters() for ponydir in ponydirs: # Loop ponydirs - print('\033[1mponyfiles located in ' + ponydir + '\033[21m') + print('\033[1mponies located in ' + ponydir + '\033[21m') - files = os.listdir(ponydir) - files = [item[:-5] for item in files] # remove .pony from file name - files.sort() - pairs = [(item, os.readlink(ponydir + item + '.pony') if os.path.islink(ponydir + item + '.pony') else '') for item in files] + _ponies = os.listdir(ponydir) + ponies = [] + for pony in _ponies: + if (len(pony) > 5) and (pony[-5:] == '.pony'): + ponies.append(pony[:-5]) + ponies.sort() + pairs = [(pony, os.readlink(ponydir + pony + '.pony') if os.path.islink(ponydir + pony + '.pony') else '') for pony in ponies] ponymap = {} for pair in pairs: @@ -239,7 +246,7 @@ class Ponysay(): for pony in ponies: spacing = ' ' * (width - widths[index]) index += 1 - print(pony + spacing, end='') # Print ponyfilename + print(pony + spacing, end='') # Print pony file name x += width if x > (termsize[1] - width): # If too wide, make new line print() @@ -268,10 +275,13 @@ class Ponysay(): ''' def onelist(self): last = '' - ponies = [] + _ponies = [] for ponydir in ponydirs: # Loop ponydirs - ponies += os.listdir(ponydir) - ponies = [item[:-5] for item in ponies] # remove .pony from file name + _ponies += os.listdir(ponydir) + ponies = [] + for pony in _ponies: + if (len(pony) > 5) and (pony[-5:] == '.pony'): + ponies.append(pony[:-5]) ponies.sort() for pony in ponies: if not pony == last: @@ -285,7 +295,42 @@ class Ponysay(): ## ''' - Returns one file with full path, names is filter for names, also accepts filepaths + Prints a list of all balloons + ''' + def balloonlist(self): + termsize = self.__gettermsize() + balloonset = set() + + for balloondir in balloondirs: + for balloon in os.listdir(balloondir): + if isthink and (len(balloon) > 6) and (balloon[-6:] == '.think'): + balloon = balloon[:-6] + elif (not isthink) and (len(balloon) > 4) and (balloon[-4:] == '.say'): + balloon = balloon[:-4] + else: + continue + if balloon not in balloonset: + balloonset.add(balloon) + + balloons = list(balloonset) + balloons.sort() + + width = len(max(balloons, key = len)) + 2 + + x = 0 + for balloon in balloons: + spacing = ' ' * (width - len(balloon)) + print(balloon + spacing, end='') + x += width + if x > (termsize[1] - width): + print() + x = 0 + + print(); + + + ''' + Returns one file with full path, names is filter for style names, also accepts filepaths ''' def __getballoonpath(self, names): if names is None: @@ -293,8 +338,14 @@ class Ponysay(): balloons = {} for balloondir in balloondirs: - for balloonfile in os.listdir(balloondir): - balloon = balloonfile[:-5] + for balloon in os.listdir(balloondir): + balloonfile = balloon + if isthink and (len(balloon) > 6) and (balloon[-6:] == '.think'): + balloon = balloon[:-6] + elif (not isthink) and (len(balloon) > 4) and (balloon[-4:] == '.say'): + balloon = balloon[:-4] + else: + continue if balloon not in balloons: balloons[balloon] = balloondir + balloonfile @@ -390,7 +441,9 @@ class Ponysay(): widthtruncation = self.__gettermsize()[1] if env_width not in ('yes', 'y', '1') else None messagewrap = int(args.opts['-W'][0]) if args.opts['-W'] is not None else None - backend = Backend(message = msg, ponyfile = pony, wrapcolumn = messagewrap if messagewrap is not None else 40, width = widthtruncation, balloon = self.__getballoon(None)) + balloon = self.__getballoon(self.__getballoonpath(args.opts['-b'])) + + backend = Backend(message = msg, ponyfile = pony, wrapcolumn = messagewrap if messagewrap is not None else 40, width = widthtruncation, balloon = balloon) backend.parse() output = backend.output if (len(output) > 0) and (output[-1] == '\n'): @@ -1269,7 +1322,7 @@ class ColourStack(): part = self.seq[i] p = 0 if part == '' else int(part) i += 1 - if p == '': self.stack[0][1:] = [None, None, [False] * 9] + if p == 0: self.stack[0][1:] = [None, None, [False] * 9] elif (1 <= p) and (p <= 9): self.stack[0][3][p - 1] = True elif (21 <= p) and (p <= 29): self.stack[0][3][p - 21] = False elif p == 39: self.stack[0][1] = None @@ -1313,7 +1366,8 @@ linuxvt = os.environ['TERM'] == 'linux' ''' Whether the script is executed as ponythink ''' -isthink = (len(__file__) >= 8) and (__file__[-8:] == 'think.py') +isthink = (len(__file__) >= 5) and (__file__[-5:] == 'think') +isthink = ((len(__file__) >= 8) and (__file__[-8:] == 'think.py')) or isthink ''' @@ -1354,15 +1408,26 @@ for quotedir in _quotedirs: quotedirs.append(quotedir) +''' +The directories where balloon style files are stored +''' +balloondirs = [] +_balloondirs = [HOME + '/.local/share/ponysay/balloons/', INSTALLDIR + '/share/ponysay/balloons/'] +for balloondir in _balloondirs: + if os.path.isdir(balloondir): + balloondirs.append(balloondir) + + usage_saythink = '\033[34;1m(ponysay | ponythink)\033[21;39m' usage_wrap = '--wrap \033[4mCOLUMN\033[24m' -usage_listhelp = '(--list | ---altlist | --version | --help)' +usage_balloon = '--balloon \033[4mSTYLE\033[24m' +usage_listhelp = '(--list | --altlist | --balloonlist | --version | --help)' usage_file = '[--pony \033[4mPONY\033[24m]... ([--] \033[4mmessage\033[24m | <<<\033[4mmessage\033[24m)' usage_quote = '--quote [\033[4mPONY\033[24m...]' -usage = '%s %s\n%s [%s] %s\n%s [%s] %s' % (usage_saythink, usage_listhelp, - usage_saythink, usage_wrap, usage_file, - usage_saythink, usage_wrap, usage_quote) +usage = '%s %s\n%s [%s] [%s] %s\n%s [%s] [%s] %s' % (usage_saythink, usage_listhelp, + usage_saythink, usage_wrap, usage_balloon, usage_file, + usage_saythink, usage_wrap, usage_balloon, usage_quote) usage = usage.replace('\033[', '\0') for sym in ('[', ']', '(', ')', '|', '...'): @@ -1384,13 +1449,15 @@ run `man ponysay`. Ponysay has so much more to offer than described here.''') opts.add_argumentless(['--quoters']) opts.add_argumentless(['--onelist']) -opts.add_argumentless(['-h', '--help'], help = 'Print this help message.') -opts.add_argumentless(['-v', '--version'], help = 'Print the version of the program.') -opts.add_argumentless(['-l', '--list'], help = 'List pony files.') -opts.add_argumentless(['-L', '--altlist'], help = 'List pony files with alternatives.') -opts.add_argumented( ['-W', '--wrap'], arg = 'COLUMN', help = 'Specify the column when the message should be wrapped.') -opts.add_argumented( ['-f', '--pony'], arg = 'PONY', help = 'Select a pony.\nEither a file name or a pony name.') -opts.add_variadic( ['-q', '--quote'], arg = 'PONY', help = 'Select a ponies which will quote themself.') +opts.add_argumentless(['-h', '--help'], help = 'Print this help message.') +opts.add_argumentless(['-v', '--version'], help = 'Print the version of the program.') +opts.add_argumentless(['-l', '--list'], help = 'List pony names.') +opts.add_argumentless(['-L', '--altlist'], help = 'List pony names with alternatives.') +opts.add_argumentless(['-B', '--balloonlist'], help = 'list balloon styles.') +opts.add_argumented( ['-W', '--wrap'], arg = 'COLUMN', help = 'Specify the column when the message should be wrapped.') +opts.add_argumented( ['-b', '--bubble', '--balloon'], arg = 'STYLE', help = 'Select a balloon style.') +opts.add_argumented( ['-f', '--file', '--pony'], arg = 'PONY', help = 'Select a pony.\nEither a file name or a pony name.') +opts.add_variadic( ['-q', '--quote'], arg = 'PONY', help = 'Select a ponies which will quote themself.') opts.parse()