diff --git a/CHANGELOG b/CHANGELOG index 3a747ec7..cc46a686 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,9 @@ Version 2.2 Support for colours in the message. + Support custom balloon styles using the option '-b', '-B' will list all + available. This list depends on whether you are invoking `ponysay` or `ponythink` + Version 2.1.1 diff --git a/balloons/cowsay.say b/balloons/cowsay.say index 827183e5..bb486dbd 100644 --- a/balloons/cowsay.say +++ b/balloons/cowsay.say @@ -7,7 +7,7 @@ w:| e: | ww:< -ee:> +ee: > nw: _ ne:_ @@ -19,7 +19,7 @@ nne:_ ssw:- sse:- -nww:/ -nee:\ -sww:\ -see:/ +nww:/ +nee: \ +sww:\ +see: / diff --git a/balloons/unicode.think b/balloons/unicode.think index fba4c51b..005e545b 100644 --- a/balloons/unicode.think +++ b/balloons/unicode.think @@ -9,10 +9,10 @@ e: ) ww:( ee: ) -nw:) -ne:( -sw:) -se:( +nw:( +ne:) +sw:( +se:) nnw:⁀ nne:⁀ 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 17ba6150..766c73ec 100644 --- a/manuals/ponysay.texinfo +++ b/manuals/ponysay.texinfo @@ -132,8 +132,10 @@ Show summary of options. Show version of program. @item -f PONY +@itemx --file PONY @itemx --pony PONY @cindex @command{-f} +@cindex @command{--file} @cindex @command{--pony} Specify the pony that should printed, this can either be a file name or a pony name printed by @command{ponysay -l}. This option can be used multiple times to @@ -145,8 +147,19 @@ If you have @command{util-say} installed, you can use .png-files as the arguments for this options. In versions earlier than version 2.0, the if the pony were a file name it had -to include a `@code{/}'. This is not longer required and any existing file -supersedes pony names. +to include a `@code{/}'. This is not longer required and any existing pony name +supersedes file names. + +@item -b STYLE +@itemx --bubble STYLE +@itemx --balloon STYLE +@cindex @command{-b} +@cindex @command{--bubble} +@cindex @command{--balloon} +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 +balloon style is specified a fallback style will be used. @item -q [PONY...] @itemx --quote [PONY...] @@ -185,6 +198,12 @@ is installed the ponies which have quotes, i.e. can be used with the (depending on the terminal.) This options differs from @command{-l} by printing alternative names (symbolic links) inside brackets after their target ponies. + +@item -B +@itemx --balloonlist +@cindex @command{-B} +@cindex @command{--balloonlist} +Prints a list of all balloon styles. @end table If neither @command{-q} is used nor any @var{message} is specified, @command{ponysay} @@ -800,6 +819,7 @@ but is still available at @url{https://github.com/maandree/kmsponies4ponysay}. @menu * Pony anatomy:: Anatomy of pony files. * Pony quote infrastructure:: Pony quote infrastructure. +* Balloon style files:: Balloon style files. * Printing in TTY with KMS:: Printing in TTY with KMS. * Truncation:: Output truncation. * Languages:: Selection of languages. @@ -861,6 +881,77 @@ when compiled to @code{quotes}. The source quote files are indentical to the com quote files, except that there name contains just the first pony. +@node Balloon style files +@section Balloon style files +@cindex balloon style files +@cindex bubble style files +@cindex @command{ponythink} + +Balloon style files are located in the directory @code{balloons}, the ones ending with +@code{.say} applies to @command{ponysay} and the ones ending with @code{.think} applies +to @command{ponythink}. + +Balloon style consists of 20 strings. Each string is definied on separate lines, by their +name and their value seperated with a colon (@code{name:value}), if the name is empty it +continues the last one new line in the value. Only 10 of the strings may be multilined: +@code{nw}, @code{nnw}, @code{n}, @code{nne}, @code{ne}, @code{sw}, @code{ssw}, @code{s} +@code{sse} and @code{se}. + +The following strings are used, and must be definied in the files: +@table @option +@item \ +The character for the link to the balloon directed as @code{\}. +@item / +The character for the link to the balloon directed as @code{/}. +@item ww +The beginning of the balloon's line where the message is located if and only if the +message contains only one line. +@item ee +The end of the balloon's line where the message is located if and only if the message +contains only one line. +@item nw +The top left corner of the balloon. +@item nnw +If both this string and the @code{'nne'} string fits between the top corners, this +is printed directly to the right of the top left corner. +@item n +The top edge of the balloon. +@item nne +If both this string and the @code{'nnw'} string fits between the top corners, this +is printed directly to the right of the top top corner. +@item ne +The top right corner of the balloon. +@item nee +The end of the balloon's line where the message's first line is located if and only +if the message contains more than one line. +@item e +The right edge of the balloon. +@item see +The end of the balloon's line where the message's last line is located if and only +if the message contains more than one line. +@item se +The bottom right corner of the balloon. +@item sse +If both this string and the @code{'ssw'} string fits between the bottom corners, this +is printed directly to the left of the bottom right corner. +@item s +The bottom edge of the balloon. +@item ssw +If both this string and the @code{'sse'} string fits between the bottom corners, this +is printed directly to the right of the bottom left corner. +@item sw +The bottom left corner of the balloon. +@item sww +The beginning of the balloon's line where the message's last line is located if and +only if the message contains more than one line. +@item w +The left edge of the balloon. +@item nww +The beginning of the balloon's line where the message's first line is located if and +only if the message contains more than one line. +@end table + + @node Printing in TTY with KMS @section Printing in TTY with KMS @cindex tty @@ -1043,6 +1134,10 @@ ANSI colour sequences in pony files are applied only to the pony image, not the balloon link or the balloon itself. @item Support for colours in the message. +@item +Support custom balloon styles using the option @code{-b}, @code{-B} will list +all available. This list depends on whether you are invoking @command{ponysay} +or @command{ponythink} @end itemize @heading Version 2.1.1 diff --git a/manuals/ponysay_front.xcf b/manuals/ponysay_front.xcf index 9ba8d0d0..c7855029 100644 Binary files a/manuals/ponysay_front.xcf and b/manuals/ponysay_front.xcf differ diff --git a/ponysay b/ponysay index b1fbd27a..fedaab6b 100755 --- a/ponysay +++ b/ponysay @@ -46,16 +46,13 @@ class Ponysay(): args.help() return - if (args.opts['-l'] is not None) and pipelineout: - args.opts['--onelist'] = args.opts['-l'] - args.opts['-l'] = None - if args.opts['-h'] is not None: args.help() elif args.opts['--quoters'] is not None: self.quoters() elif args.opts['--onelist'] is not None: self.onelist() 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) @@ -65,22 +62,22 @@ 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 = {} - if not names == None: - for name in names: - if os.path.isfile(name): - ponies[name] = name - for ponydir in ponydirs: for ponyfile in os.listdir(ponydir): pony = ponyfile[:-5] if pony not in ponies: ponies[pony] = ponydir + ponyfile + if not names == None: + for name in names: + if os.path.isfile(name): + ponies[name] = name + if names == None: names = list(ponies.keys()) @@ -164,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 @@ -180,7 +180,7 @@ class Ponysay(): if x > (termsize[1] - width): # If too wide, make new line print() x = 0 - + print('\n'); @@ -192,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: @@ -243,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() @@ -272,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: @@ -283,6 +289,118 @@ class Ponysay(): print(pony) + + ## + ## Balloon methods + ## + + ''' + 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: + return None + balloons = {} + + for balloondir in balloondirs: + 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 + + for name in names: + if os.path.isfile(name): + balloons[name] = name + + if names == None: + names = list(balloons.keys()) + + balloon = names[random.randrange(0, len(names))] + if balloon not in balloons: + sys.stderr.write('That balloon style %s does not exist\n' % (balloon)); + exit(1) + else: + return balloons[balloon] + + + ''' + Creates the balloon style object + ''' + def __getballoon(self, balloonfile): + if balloonfile is None: + if isthink: + return Balloon('o', 'o', '( ', ' )', [' _'], ['_'], ['_'], ['_'], ['_ '], ' )', ' )', ' )', ['- '], ['-'], ['-'], ['-'], [' -'], '( ', '( ', '( ') + return Balloon('\\', '/', '< ', ' >', [' _'], ['_'], ['_'], ['_'], ['_ '], ' \\', ' |', ' /', ['- '], ['-'], ['-'], ['-'], [' -'], '\\ ', '| ', '/ ') + + map = {} + for elem in ('\\', '/', 'ww', 'ee', 'nw', 'nnw', 'n', 'nne', 'ne', 'nee', 'e', 'see', 'se', 'sse', 's', 'ssw', 'sw', 'sww', 'w', 'nww'): + map[elem] = [] + + balloonstream = None + try: + balloonstream = open(balloonfile, 'r') + data = [line.replace('\n', '') for line in balloonstream.readlines()] + finally: + if balloonstream is not None: + balloonstream.close() + + last = None + for line in data: + if len(line) > 0: + if line[0] == ':': + map[last].append(line[1:]) + else: + last = line[:line.index(':')] + value = line[len(last) + 1:] + map[last].append(value) + + return Balloon(map['\\'][0], map['/'][0], map['ww'][0], map['ee'][0], map['nw'], map['nnw'], map['n'], + map['nne'], map['ne'], map['nee'][0], map['e'][0], map['see'][0], map['se'], map['sse'], + map['s'], map['ssw'], map['sw'], map['sww'][0], map['w'][0], map['nww'][0]) + + + ## ## Displaying methods ## @@ -323,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(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'): @@ -649,7 +769,7 @@ class ArgParser(): if first: first = False else: - print(' or', end="") + print(' or', end='') print('\t%s' % (line)) print() @@ -722,11 +842,6 @@ class Balloon(): if w < minw: w = minw if h < minh: h = minh - rc = [] - - for j in range(0, len(self.n)): - rc.append(self.nw[j] + self.n[j] * (w - len(self.nw[j]) - len(self.ne[j])) + self.ne[j]) - if len(lines) > 1: (ws, es) = ({0 : self.nww, len(lines) - 1 : self.sww}, {0 : self.nee, len(lines) - 1 : self.see}) for j in range(1, len(lines) - 1): @@ -735,11 +850,26 @@ class Balloon(): else: (ws, es) = ({0 : self.ww}, {0 : self.ee}) + rc = [] + + for j in range(0, len(self.n)): + outer = len(self.nw[j]) + len(self.ne[j]) + inner = len(self.nnw[j]) + len(self.nne[j]) + if outer + inner >= w: + rc.append(self.nw[j] + self.nnw[j] + self.n[j] * (w - outer - inner) + self.nne[j] + self.ne[j]) + else: + rc.append(self.nw[j] + self.n[j] * (w - outer) + self.ne[j]) + for j in range(0, len(lines)): rc.append(ws[j] + lines[j] + ' ' * (w - lencalc(lines[j]) - len(self.w) - len(self.e)) + es[j]) for j in range(0, len(self.s)): - rc.append(self.sw[j] + self.s[j] * (w - len(self.sw[j]) - len(self.se[j])) + self.se[j]) + outer = len(self.sw[j]) + len(self.se[j]) + inner = len(self.ssw[j]) + len(self.sse[j]) + if outer + inner >= w: + rc.append(self.sw[j] + self.ssw[j] + self.s[j] * (w - outer - inner) + self.sse[j] + self.se[j]) + else: + rc.append(self.sw[j] + self.s[j] * (w - outer) + self.se[j]) return '\n'.join(rc) @@ -751,18 +881,14 @@ Replacement for cowsay class Backend(): ''' Constructor - Takes message [string], ponyfile [filename string], wrapcolumn [None or an int] and width [None or an int] + Takes message [string], ponyfile [filename string], wrapcolumn [None or an int], width [None or an int] and balloon [Balloon object] ''' - def __init__(self, message, ponyfile, wrapcolumn, width): + def __init__(self, message, ponyfile, wrapcolumn, width, balloon): self.message = message self.ponyfile = ponyfile self.wrapcolumn = wrapcolumn self.width = width - - if isthink: - self.balloon = Balloon('o', 'o', '( ', ' )', [' _'], ['_'], ['_'], ['_'], ['_ '], ' )', ' )', ' )', ['- '], ['-'], ['-'], ['-'], [' -'], '( ', '( ', '( ') - else: - self.balloon = Balloon('\\', '/', '< ', ' >', [' _'], ['_'], ['_'], ['_'], ['_ '], ' \\', ' |', ' /', ['- '], ['-'], ['-'], ['-'], [' -'], '\\ ', '| ', '/ ') + self.balloon = balloon self.link = {'\\' : self.balloon.link, '/' : self.balloon.linkmirror} @@ -945,7 +1071,7 @@ class Backend(): datalen = self.__len(data) skip += datalen nonskip += datalen - data = data.replace("$", '$$') + data = data.replace('$', '$$') n += len(data) self.pony = self.pony[:i] + data + self.pony[i:] balloonLines[balloonLine] = None @@ -1196,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 @@ -1240,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 ''' @@ -1251,7 +1378,7 @@ pipelinein = not sys.stdin.isatty() ''' Whether stdout is piped ''' -pipelineout = False #not sys.stdout.isatty() # currently impossible, we need to get rid of the little shell script first +pipelineout = not sys.stdout.isatty() ''' Whether stderr is piped @@ -1281,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 ('[', ']', '(', ')', '|', '...'): @@ -1311,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() diff --git a/ponysay.pdf b/ponysay.pdf index d96a57f2..701e535d 100644 Binary files a/ponysay.pdf and b/ponysay.pdf differ