Page MenuHomePhabricator

D14100.diff
No OneTemporary

D14100.diff

diff --git a/externals/cowsay/ChangeLog b/externals/cowsay/ChangeLog
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/ChangeLog
@@ -0,0 +1,31 @@
+3.03 28 May 1999
+ - Added cows/tux.cow, as suggested by xmanoel@i.am
+ - Compatibility with 5.6.0, due to a change in qw().
+ - Renamed devil.cow to daemon.cow, since I know better. :-)
+
+3.02 04 November 1999
+ - Fixed boneheaded code placement so that cowsay -l actually works.
+
+3.01 01 November 1999
+ - Fixed compatibility issues between the Text::Wrap module
+ that changed between 5.005_02 and 5.005_03.
+ - Fixed tab expansion issues with Text::Tabs.
+
+3.0 13 April 1999, released 14 August 1999
+ - Rewritten into Perl 5 and presented to the world.
+
+-- Not present in CVS from here on down --
+
+2.x Date?
+ - Arbitrary messages.
+ - Figlet support (-n).
+ - Line wrap length (-w).
+ - Multiple pre-set expressions.
+ - Better arg parsing loop.
+ - Message from stdin or command line.
+
+1.0 Date?
+ - SUBJECT is VERB OBJECT
+
+$Id: ChangeLog,v 1.4 2000/05/29 17:55:24 tony Exp $
+This file is part of cowsay. (c) 1999-2000 Tony Monroe.
diff --git a/externals/cowsay/INSTALL b/externals/cowsay/INSTALL
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/INSTALL
@@ -0,0 +1,15 @@
+=================
+Installing cowsay
+=================
+
+If you really want to get things installed a nice and pretty way,
+
+ sh install.sh
+
+It will ask approximately one question. If you can't answer it,
+you need serious help.
+
+If the install goes well, you can start cowing immediately! Just
+be sure to read the manual page first...
+
+$Id: INSTALL,v 1.1 1999/08/14 08:03:17 tony Exp $
diff --git a/externals/cowsay/LICENSE b/externals/cowsay/LICENSE
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/LICENSE
@@ -0,0 +1,36 @@
+==============
+cowsay License
+==============
+
+cowsay is distributed under the same licensing terms as Perl: the
+Artistic License or the GNU General Public License. If you don't
+want to track down these licenses and read them for yourself, use
+the parts that I'd prefer:
+
+(0) I wrote it and you didn't.
+
+(1) Give credit where credit is due if you borrow the code for some
+other purpose.
+
+(2) If you have any bugfixes or suggestions, please notify me so
+that I may incorporate them.
+
+(3) If you try to make money off of cowsay, you suck.
+
+===============
+cowsay Legalese
+===============
+
+(0) Copyright (c) 1999 Tony Monroe. All rights reserved. All
+lefts may or may not be reversed at my discretion.
+
+(1) This software package can be freely redistributed or modified
+under the terms described above in the "cowsay License" section
+of this file.
+
+(2) cowsay is provided "as is," with no warranties whatsoever,
+expressed or implied. If you want some implied warranty about
+merchantability and/or fitness for a particular purpose, you will
+not find it here, because there is no such thing here.
+
+(3) I hate legalese.
diff --git a/externals/cowsay/MANIFEST b/externals/cowsay/MANIFEST
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/MANIFEST
@@ -0,0 +1,11 @@
+ChangeLog Changes to recent versions.
+INSTALL Instructions for installing cowsay.
+LICENSE The license for use and redistribution of cowsay.
+MANIFEST This file.
+README Read this first. Really.
+Wrap.pm.diff Diff for Text/Wrap.pm.
+cows/* Support files used by cowsay.
+cowsay Main cowsay executable.
+cowsay.1 Main cowsay manual page.
+install.sh cowsay installation script.
+pgp_public_key.txt Verify the signature file with this key.
diff --git a/externals/cowsay/README b/externals/cowsay/README
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/README
@@ -0,0 +1,38 @@
+===========
+cowsay 3.03
+===========
+
+cowsay is a configurable talking cow, written in Perl. It operates
+much as the figlet program does, and it written in the same spirit
+of silliness.
+
+cowsay is actually a pretty old program. It has not really been
+released before, and I am releasing it in the hope that someone
+other than myself will be amused by it.
+
+The first major version of cowsay had one cow and one message
+template: $foo is $verb $bar. Not very flexible, but people managed
+to do pretty interesting things with it. The second major version
+scrapped many of the limitations of the first, by allowing arbitrary
+messages, multiple cowfiles, and even support for cows talking in
+figlet. The third version was a rewrite of the second into Perl
+5, whereupon the code got a lot smaller and more manageable. :-)
+
+If you are using Perl 5.004, you may have problems with Text::Wrap.
+(Yeesh, this module changes more than it should...) I've included
+a diff for the Text::Wrap (version 97.011701) that is shipped with
+5.004_04; the concept is simple enough that even older Perls can
+take advantage of this silly little patch; if there is a "sub fill"
+in the documentation for the module, copy it to a more useful
+section of that file. If not, just take "sub fill" wholesale from
+the patch. Oh, and consider upgrading to 5.005_03 or later.
+Please. You'll like it, I promise.
+
+To install cowsay, consult the INSTALL file in this directory.
+
+For the terms and conditions of use, consult the LICENSE file in
+this directory.
+
+-- Tony Monroe (tony@nog.net)
+
+$Id: README,v 1.3 2000/05/28 06:24:46 tony Exp $
diff --git a/externals/cowsay/Wrap.pm.diff b/externals/cowsay/Wrap.pm.diff
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/Wrap.pm.diff
@@ -0,0 +1,47 @@
+*** Wrap.pm.in Thu May 22 00:21:42 1997
+--- Wrap.pm Fri Nov 12 10:00:15 1999
+***************
+*** 3,9 ****
+ require Exporter;
+
+ @ISA = (Exporter);
+! @EXPORT = qw(wrap);
+ @EXPORT_OK = qw($columns);
+
+ $VERSION = 97.011701;
+--- 3,9 ----
+ require Exporter;
+
+ @ISA = (Exporter);
+! @EXPORT = qw(wrap fill);
+ @EXPORT_OK = qw($columns);
+
+ $VERSION = 97.011701;
+***************
+*** 66,71 ****
+--- 66,90 ----
+
+ print "-----------$r---------\n" if $debug;;
+ return $r;
++ }
++
++ ## Copied up from below.
++ sub fill
++ {
++ my ($ip, $xp, @raw) = @_;
++ my @para;
++ my $pp;
++
++ for $pp (split(/\n\s+/, join("\n",@raw))) {
++ $pp =~ s/\s+/ /g;
++ my $x = wrap($ip, $xp, $pp);
++ push(@para, $x);
++ }
++
++ # if paragraph_indent is the same as line_indent,
++ # separate paragraphs with blank lines
++
++ return join ($ip eq $xp ? "\n\n" : "\n", @para);
+ }
+
+ 1;
diff --git a/externals/cowsay/cows/bunny.cow b/externals/cowsay/cows/bunny.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/bunny.cow
@@ -0,0 +1,10 @@
+##
+## A cute little wabbit
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts \\
+ \\ /\\
+ ( )
+ .( o ).
+EOC
diff --git a/externals/cowsay/cows/cower.cow b/externals/cowsay/cows/cower.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/cower.cow
@@ -0,0 +1,14 @@
+##
+## A cowering cow
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ ,__, | |
+ (oo)\\| |___
+ (__)\\| | )\\_
+ | |_w | \\
+ | | || *
+
+ Cower....
+EOC
diff --git a/externals/cowsay/cows/daemon.cow b/externals/cowsay/cows/daemon.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/daemon.cow
@@ -0,0 +1,24 @@
+##
+## 4.4 >> 5.4
+##
+$the_cow = <<EOC;
+ $thoughts , ,
+ $thoughts /( )`
+ $thoughts \\ \\___ / |
+ /- _ `-/ '
+ (/\\/ \\ \\ /\\
+ / / | ` \\
+ O O ) / |
+ `-^--'`< '
+ (_.) _ ) /
+ `.___/` /
+ `-----' /
+<----. __ / __ \\
+<----|====O)))==) \\) /====
+<----' `--' `.__,' \\
+ | |
+ \\ /
+ ______( (_ / \\______
+ ,' ,-----' | \\
+ `--{__________) \\/
+EOC
diff --git a/externals/cowsay/cows/default.cow b/externals/cowsay/cows/default.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/default.cow
@@ -0,0 +1,7 @@
+$the_cow = <<"EOC";
+ $thoughts ^__^
+ $thoughts ($eyes)\\_______
+ (__)\\ )\\/\\
+ $tongue ||----w |
+ || ||
+EOC
diff --git a/externals/cowsay/cows/dragon-and-cow.cow b/externals/cowsay/cows/dragon-and-cow.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/dragon-and-cow.cow
@@ -0,0 +1,21 @@
+##
+## A dragon smiting a cow, possible credit to kube@csua.berkeley.edu
+##
+$the_cow = <<EOC;
+ $thoughts ^ /^
+ $thoughts / \\ // \\
+ $thoughts |\\___/| / \\// .\\
+ $thoughts /O O \\__ / // | \\ \\ *----*
+ / / \\/_/ // | \\ \\ \\ |
+ \@___\@` \\/_ // | \\ \\ \\/\\ \\
+ 0/0/| \\/_ // | \\ \\ \\ \\
+ 0/0/0/0/| \\/// | \\ \\ | |
+ 0/0/0/0/0/_|_ / ( // | \\ _\\ | /
+ 0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\\.-~ / /
+ ,-} _ *-.|.-~-. .~ ~
+ \\ \\__/ `/\\ / ~-. _ .-~ /
+ \\____($eyes) *. } { /
+ ( (--) .----~-.\\ \\-` .~
+ //__\\\\ \\__ Ack! ///.----..< \\ _ -~
+ // \\\\ ///-._ _ _ _ _ _ _{^ - - - - ~
+EOC
diff --git a/externals/cowsay/cows/dragon.cow b/externals/cowsay/cows/dragon.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/dragon.cow
@@ -0,0 +1,21 @@
+##
+## The Whitespace Dragon
+##
+$the_cow = <<EOC;
+ $thoughts / \\ //\\
+ $thoughts |\\___/| / \\// \\\\
+ /0 0 \\__ / // | \\ \\
+ / / \\/_/ // | \\ \\
+ \@_^_\@'/ \\/_ // | \\ \\
+ //_^_/ \\/_ // | \\ \\
+ ( //) | \\/// | \\ \\
+ ( / /) _|_ / ) // | \\ _\\
+ ( // /) '/,_ _ _/ ( ; -. | _ _\\.-~ .-~~~^-.
+ (( / / )) ,-{ _ `-.|.-~-. .~ `.
+ (( // / )) '/\\ / ~-. _ .-~ .-~^-. \\
+ (( /// )) `. { } / \\ \\
+ (( / )) .----~-.\\ \\-' .~ \\ `. \\^-.
+ ///.----..> \\ _ -~ `. ^-` ^-_
+ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
+ /.-~
+EOC
diff --git a/externals/cowsay/cows/elephant.cow b/externals/cowsay/cows/elephant.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/elephant.cow
@@ -0,0 +1,15 @@
+##
+## An elephant out and about
+##
+$the_cow = <<EOC;
+ $thoughts /\\ ___ /\\
+ $thoughts // \\/ \\/ \\\\
+ (( O O ))
+ \\\\ / \\ //
+ \\/ | | \\/
+ | | | |
+ | | | |
+ | o |
+ | | | |
+ |m| |m|
+EOC
diff --git a/externals/cowsay/cows/eyes.cow b/externals/cowsay/cows/eyes.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/eyes.cow
@@ -0,0 +1,16 @@
+##
+## Evil-looking eyes
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ .::!!!!!!!:.
+ .!!!!!:. .:!!!!!!!!!!!!
+ ~~~~!!!!!!. .:!!!!!!!!!UWWW\$\$\$
+ :\$\$NWX!!: .:!!!!!!XUWW\$\$\$\$\$\$\$\$\$P
+ \$\$\$\$\$##WX!: .<!!!!UW\$\$\$\$" \$\$\$\$\$\$\$\$#
+ \$\$\$\$\$ \$\$\$UX :!!UW\$\$\$\$\$\$\$\$\$ 4\$\$\$\$\$*
+ ^\$\$\$B \$\$\$\$\\ \$\$\$\$\$\$\$\$\$\$\$\$ d\$\$R"
+ "*\$bd\$\$\$\$ '*\$\$\$\$\$\$\$\$\$\$\$o+#"
+ """" """""""
+EOC
diff --git a/externals/cowsay/cows/flaming-sheep.cow b/externals/cowsay/cows/flaming-sheep.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/flaming-sheep.cow
@@ -0,0 +1,15 @@
+##
+## The flaming sheep, contributed by Geordan Rosario (geordan@csua.berkeley.edu)
+##
+$the_cow = <<EOC;
+ $thoughts . . .
+ $thoughts . . . ` ,
+ $thoughts .; . : .' : : : .
+ $thoughts i..`: i` i.i.,i i .
+ $thoughts `,--.|i |i|ii|ii|i:
+ U${eyes}U\\.'\@\@\@\@\@\@`.||'
+ \\__/(\@\@\@\@\@\@\@\@\@\@)'
+ (\@\@\@\@\@\@\@\@)
+ `YY~~~~YY'
+ || ||
+EOC
diff --git a/externals/cowsay/cows/head-in.cow b/externals/cowsay/cows/head-in.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/head-in.cow
@@ -0,0 +1,12 @@
+##
+## Go stick yer head in a cow.
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ ^__^ /
+ ($eyes)\\_______/ _________
+ (__)\\ )=( ____|_ \\_____
+ $tongue ||----w | \\ \\ \\_____ |
+ || || || ||
+EOC
diff --git a/externals/cowsay/cows/kitty.cow b/externals/cowsay/cows/kitty.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/kitty.cow
@@ -0,0 +1,12 @@
+##
+## A kitten of sorts, I think
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ ("`-' '-/") .___..--' ' "`-._
+ ` *_ * ) `-. ( ) .`-.__. `)
+ (_Y_.) ' ._ ) `._` ; `` -. .-'
+ _.. `--'_..-_/ /--' _ .' ,4
+ ( i l ),-'' ( l i),' ( ( ! .-'
+EOC
diff --git a/externals/cowsay/cows/koala.cow b/externals/cowsay/cows/koala.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/koala.cow
@@ -0,0 +1,12 @@
+##
+## From the canonical koala collection
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ ___
+ {~._.~}
+ ( Y )
+ ()~*~()
+ (_)-(_)
+EOC
diff --git a/externals/cowsay/cows/meow.cow b/externals/cowsay/cows/meow.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/meow.cow
@@ -0,0 +1,15 @@
+##
+## A meowing tiger?
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts , _ ___.--'''`--''//-,-_--_.
+ \\`"' ` || \\\\ \\ \\\\/ / // / ,-\\\\`,_
+ /'` \\ \\ || Y | \\|/ / // / - |__ `-,
+ /\@"\\ ` \\ `\\ | | ||/ // | \\/ \\ `-._`-,_.,
+ / _.-. `.-\\,___/\\ _/|_/_\\_\\/|_/ | `-._._)
+ `-'``/ / | // \\__/\\__ / \\__/ \\
+ `-' /-\\/ | -| \\__ \\ |-' |
+ __/\\ / _/ \\/ __,-' ) ,' _|'
+ (((__/(((_.' ((___..-'((__,'
+EOC
diff --git a/externals/cowsay/cows/moofasa.cow b/externals/cowsay/cows/moofasa.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/moofasa.cow
@@ -0,0 +1,14 @@
+##
+## MOOfasa.
+##
+$the_cow = <<EOC;
+ $thoughts ____
+ $thoughts / \\
+ | ^__^ |
+ | ($eyes) |______
+ | (__) | )\\/\\
+ \\____/|----w |
+ || ||
+
+ Moofasa
+EOC
diff --git a/externals/cowsay/cows/moose.cow b/externals/cowsay/cows/moose.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/moose.cow
@@ -0,0 +1,9 @@
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts \\_\\_ _/_/
+ $thoughts \\__/
+ ($eyes)\\_______
+ (__)\\ )\\/\\
+ $tongue ||----w |
+ || ||
+EOC
diff --git a/externals/cowsay/cows/mutilated.cow b/externals/cowsay/cows/mutilated.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/mutilated.cow
@@ -0,0 +1,10 @@
+##
+## A mutilated cow, from aspolito@csua.berkeley.edu
+##
+$the_cow = <<EOC;
+ $thoughts \\_______
+ v__v $thoughts \\ O )
+ ($eyes) ||----w |
+ (__) || || \\/\\
+ $tongue
+EOC
diff --git a/externals/cowsay/cows/satanic.cow b/externals/cowsay/cows/satanic.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/satanic.cow
@@ -0,0 +1,12 @@
+##
+## Satanic cow, source unknown.
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts (__)
+ (\\/)
+ /-------\\/
+ / | 666 ||
+* ||----||
+ ~~ ~~
+EOC
diff --git a/externals/cowsay/cows/sheep.cow b/externals/cowsay/cows/sheep.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/sheep.cow
@@ -0,0 +1,13 @@
+##
+## The non-flaming sheep.
+##
+$the_cow = <<EOC
+ $thoughts
+ $thoughts
+ __
+ U${eyes}U\\.'\@\@\@\@\@\@`.
+ \\__/(\@\@\@\@\@\@\@\@\@\@)
+ (\@\@\@\@\@\@\@\@)
+ `YY~~~~YY'
+ || ||
+EOC
diff --git a/externals/cowsay/cows/skeleton.cow b/externals/cowsay/cows/skeleton.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/skeleton.cow
@@ -0,0 +1,15 @@
+##
+## This 'Scowleton' brought to you by one of
+## {appel,kube,rowe}@csua.berkeley.edu
+##
+$the_cow = <<EOC;
+ $thoughts (__)
+ $thoughts /$eyes|
+ $thoughts (_"_)*+++++++++*
+ //I#\\\\\\\\\\\\\\\\I\\
+ I[I|I|||||I I `
+ I`I'///'' I I
+ I I I I
+ ~ ~ ~ ~
+ Scowleton
+EOC
diff --git a/externals/cowsay/cows/small.cow b/externals/cowsay/cows/small.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/small.cow
@@ -0,0 +1,10 @@
+##
+## A small cow, artist unknown
+##
+$eyes = ".." unless ($eyes);
+$the_cow = <<EOC;
+ $thoughts ,__,
+ $thoughts ($eyes)____
+ (__) )\\
+ $tongue||--|| *
+EOC
diff --git a/externals/cowsay/cows/squirrel.cow b/externals/cowsay/cows/squirrel.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/squirrel.cow
@@ -0,0 +1,13 @@
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ _ _
+ | \__/| .~ ~.
+ /$eyes `./ .'
+ {o__, \ {
+ / . . ) \
+ `-` '-' \ }
+ .( _( )_.'
+ '---.~_ _ _|
+
+EOC
diff --git a/externals/cowsay/cows/stegosaurus.cow b/externals/cowsay/cows/stegosaurus.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/stegosaurus.cow
@@ -0,0 +1,19 @@
+##
+## A stegosaur with a top hat?
+##
+$the_cow = <<EOC;
+$thoughts . .
+ $thoughts / `. .' "
+ $thoughts .---. < > < > .---.
+ $thoughts | \\ \\ - ~ ~ - / / |
+ _____ ..-~ ~-..-~
+ | | \\~~~\\.' `./~~~/
+ --------- \\__/ \\__/
+ .' O \\ / / \\ "
+ (_____, `._.' | } \\/~~~/
+ `----. / } | / \\__/
+ `-. | / | / `. ,~~|
+ ~-.__| /_ - ~ ^| /- _ `..-'
+ | / | / ~-. `-. _ _ _
+ |_____| |_____| ~ - . _ _ _ _ _>
+EOC
diff --git a/externals/cowsay/cows/supermilker.cow b/externals/cowsay/cows/supermilker.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/supermilker.cow
@@ -0,0 +1,10 @@
+##
+## A cow being milked, probably from Lars Smith (lars@csua.berkeley.edu)
+##
+$the_cow = <<EOC;
+ $thoughts ^__^
+ $thoughts ($eyes)\\_______ ________
+ (__)\\ )\\/\\ |Super |
+ $tongue ||----W | |Milker|
+ || UDDDDDDDDD|______|
+EOC
diff --git a/externals/cowsay/cows/surgery.cow b/externals/cowsay/cows/surgery.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/surgery.cow
@@ -0,0 +1,24 @@
+##
+## A cow operation, artist unknown
+##
+$the_cow = <<EOC;
+ $thoughts \\ /
+ $thoughts \\/
+ (__) /\\
+ ($eyes) O O
+ _\\/_ //
+ * ( ) //
+ \\ (\\\\ //
+ \\( \\\\ )
+ ( \\\\ ) /\\
+ ___[\\______/^^^^^^^\\__/) o-)__
+ |\\__[=======______//________)__\\
+ \\|_______________//____________|
+ ||| || //|| |||
+ ||| || @.|| |||
+ || \\/ .\\/ ||
+ . .
+ '.'.`
+
+ COW-OPERATION
+EOC
diff --git a/externals/cowsay/cows/turkey.cow b/externals/cowsay/cows/turkey.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/turkey.cow
@@ -0,0 +1,26 @@
+##
+## Turkey!
+##
+$the_cow = <<EOC;
+ $thoughts ,+*^^*+___+++_
+ $thoughts ,*^^^^ )
+ $thoughts _+* ^**+_
+ $thoughts +^ _ _++*+_+++_, )
+ _+^^*+_ ( ,+*^ ^ \\+_ )
+ { ) ( ,( ,_+--+--, ^) ^\\
+ { (\@) } f ,( ,+-^ __*_*_ ^^\\_ ^\\ )
+ {:;-/ (_+*-+^^^^^+*+*<_ _++_)_ ) ) /
+ ( / ( ( ,___ ^*+_+* ) < < \\
+ U _/ ) *--< ) ^\\-----++__) ) ) )
+ ( ) _(^)^^)) ) )\\^^^^^))^*+/ / /
+ ( / (_))_^)) ) ) ))^^^^^))^^^)__/ +^^
+ ( ,/ (^))^)) ) ) ))^^^^^^^))^^) _)
+ *+__+* (_))^) ) ) ))^^^^^^))^^^^^)____*^
+ \\ \\_)^)_)) ))^^^^^^^^^^))^^^^)
+ (_ ^\\__^^^^^^^^^^^^))^^^^^^^)
+ ^\\___ ^\\__^^^^^^))^^^^^^^^)\\\\
+ ^^^^^\\uuu/^^\\uuu/^^^^\\^\\^\\^\\^\\^\\^\\^\\
+ ___) >____) >___ ^\\_\\_\\_\\_\\_\\_\\)
+ ^^^//\\\\_^^//\\\\_^ ^(\\_\\_\\_\\)
+ ^^^ ^^ ^^^ ^
+EOC
diff --git a/externals/cowsay/cows/turtle.cow b/externals/cowsay/cows/turtle.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/turtle.cow
@@ -0,0 +1,20 @@
+##
+## A mysterious turtle...
+##
+$the_cow = <<EOC;
+ $thoughts ___-------___
+ $thoughts _-~~ ~~-_
+ $thoughts _-~ /~-_
+ /^\\__/^\\ /~ \\ / \\
+ /| O|| O| / \\_______________/ \\
+ | |___||__| / / \\ \\
+ | \\ / / \\ \\
+ | (_______) /______/ \\_________ \\
+ | / / \\ / \\
+ \\ \\^\\\\ \\ / \\ /
+ \\ || \\______________/ _-_ //\\__//
+ \\ ||------_-~~-_ ------------- \\ --/~ ~\\ || __/
+ ~-----||====/~ |==================| |/~~~~~
+ (_(__/ ./ / \\_\\ \\.
+ (_(___/ \\_____)_)
+EOC
diff --git a/externals/cowsay/cows/tux.cow b/externals/cowsay/cows/tux.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/tux.cow
@@ -0,0 +1,16 @@
+##
+## TuX
+## (c) pborys@p-soft.silesia.linux.org.pl
+##
+$the_cow = <<EOC;
+ $thoughts
+ $thoughts
+ .--.
+ |o_o |
+ |:_/ |
+ // \\ \\
+ (| | )
+ /'\\_ _/`\\
+ \\___)=(___/
+
+EOC
diff --git a/externals/cowsay/cows/www.cow b/externals/cowsay/cows/www.cow
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cows/www.cow
@@ -0,0 +1,10 @@
+##
+## A cow wadvertising the World Wide Web, from lim@csua.berkeley.edu
+##
+$the_cow = <<EOC;
+ $thoughts ^__^
+ $thoughts ($eyes)\\_______
+ (__)\\ )\\/\\
+ $tongue ||--WWW |
+ || ||
+EOC
diff --git a/externals/cowsay/cowsay b/externals/cowsay/cowsay
new file mode 100755
--- /dev/null
+++ b/externals/cowsay/cowsay
@@ -0,0 +1,187 @@
+#%BANGPERL%
+
+##
+## Cowsay 3.03
+##
+## This file is part of cowsay. (c) 1999-2000 Tony Monroe.
+##
+
+use Text::Tabs qw(expand);
+use Text::Wrap qw(wrap fill $columns);
+use File::Basename;
+use Getopt::Std;
+use Cwd;
+
+$version = "3.03";
+$progname = basename($0);
+$eyes = "oo";
+$tongue = " ";
+$cowpath = $ENV{'COWPATH'} || '%PREFIX%/share/cows';
+@message = ();
+$thoughts = "";
+
+## Yeah, this is rude, I know. But hopefully it gets around a nasty
+## little version dependency.
+
+$Text::Wrap::initial_tab = 8;
+$Text::Wrap::subsequent_tab = 8;
+$Text::Wrap::tabstop = 8;
+
+## One of these days, we'll get it ported to Windows. Yeah, right.
+
+if (($^O eq "MSWin32") or ($^O eq "Windows_NT")) { ## Many perls, eek!
+ $pathsep = ';';
+} else {
+ $pathsep = ':';
+}
+
+%opts = (
+ 'e' => 'oo',
+ 'f' => 'default.cow',
+ 'n' => 0,
+ 'T' => ' ',
+ 'W' => 40,
+);
+
+getopts('bde:f:ghlLnNpstT:wW:y', \%opts);
+
+&display_usage if $opts{'h'};
+&list_cowfiles if $opts{'l'};
+
+$borg = $opts{'b'};
+$dead = $opts{'d'};
+$greedy = $opts{'g'};
+$paranoid = $opts{'p'};
+$stoned = $opts{'s'};
+$tired = $opts{'t'};
+$wired = $opts{'w'};
+$young = $opts{'y'};
+$eyes = substr($opts{'e'}, 0, 2);
+$tongue = substr($opts{'T'}, 0, 2);
+$the_cow = "";
+
+&slurp_input;
+$Text::Wrap::columns = $opts{'W'};
+@message = ($opts{'n'} ? expand(@message) :
+ split("\n", fill("", "", @message)));
+&construct_balloon;
+&construct_face;
+&get_cow;
+print @balloon_lines;
+print $the_cow;
+
+sub list_cowfiles {
+ my $basedir;
+ my @dirfiles;
+ chop($basedir = cwd);
+ for my $d (split(/$pathsep/, $cowpath)) {
+ print "Cow files in $d:\n";
+ opendir(COWDIR, $d) || die "$0: Cannot open $d\n";
+ for my $file (readdir COWDIR) {
+ if ($file =~ s/\.cow$//) {
+ push(@dirfiles, $file);
+ }
+ }
+ closedir(COWDIR);
+ print wrap("", "", sort @dirfiles), "\n";
+ @dirfiles = ();
+ chdir($basedir);
+ }
+ exit(0);
+}
+
+sub slurp_input {
+ unless ($ARGV[0]) {
+ chomp(@message = <STDIN>);
+ } else {
+ &display_usage if $opts{'n'};
+ @message = join(' ', @ARGV);
+ }
+}
+
+sub maxlength {
+ my ($l, $m);
+ $m = -1;
+ for my $i (@_) {
+ $l = length $i;
+ $m = $l if ($l > $m);
+ }
+ return $m;
+}
+
+sub construct_balloon {
+ my $max = &maxlength(@message);
+ my $max2 = $max + 2; ## border space fudge.
+ my $format = "%s %-${max}s %s\n";
+ my @border; ## up-left, up-right, down-left, down-right, left, right
+ if ($0 =~ /think/i) {
+ $thoughts = 'o';
+ @border = qw[ ( ) ( ) ( ) ];
+ } elsif (@message < 2) {
+ $thoughts = '\\';
+ @border = qw[ < > ];
+ } else {
+ $thoughts = '\\';
+ if ($V and $V gt v5.6.0) { # Thanks, perldelta.
+ @border = qw[ / \\ \\ / | | ];
+ } else {
+ @border = qw[ / \ \ / | | ];
+ }
+ }
+ push(@balloon_lines,
+ " " . ("_" x $max2) . " \n" ,
+ sprintf($format, $border[0], $message[0], $border[1]),
+ (@message < 2 ? "" :
+ map { sprintf($format, $border[4], $_, $border[5]) }
+ @message[1 .. $#message - 1]),
+ (@message < 2 ? "" :
+ sprintf($format, $border[2], $message[$#message], $border[3])),
+ " " . ("-" x $max2) . " \n"
+ );
+}
+
+sub construct_face {
+ if ($borg) { $eyes = "=="; }
+ if ($dead) { $eyes = "xx"; $tongue = "U "; }
+ if ($greedy) { $eyes = "\$\$"; }
+ if ($paranoid) { $eyes = "@@"; }
+ if ($stoned) { $eyes = "**"; $tongue = "U "; }
+ if ($tired) { $eyes = "--"; }
+ if ($wired) { $eyes = "OO"; }
+ if ($young) { $eyes = ".."; }
+}
+
+sub get_cow {
+##
+## Get a cow from the specified cowfile; otherwise use the default cow
+## which was defined above in $the_cow.
+##
+ my $f = $opts{'f'};
+ my $full = "";
+ if ($opts{'f'} =~ m,/,) {
+ $full = $opts{'f'};
+ } else {
+ for my $d (split(/:/, $cowpath)) {
+ if (-f "$d/$f") {
+ $full = "$d/$f";
+ last;
+ } elsif (-f "$d/$f.cow") {
+ $full = "$d/$f.cow";
+ last;
+ }
+ }
+ if ($full eq "") {
+ die "$progname: Could not find $f cowfile!\n";
+ }
+ }
+ do $full;
+ die "$progname: $@\n" if $@;
+}
+
+sub display_usage {
+ die <<EOF;
+cow{say,think} version $version, (c) 1999 Tony Monroe
+Usage: $progname [-bdgpstwy] [-h] [-e eyes] [-f cowfile]
+ [-l] [-n] [-T tongue] [-W wrapcolumn] [message]
+EOF
+}
diff --git a/externals/cowsay/cowsay.1 b/externals/cowsay/cowsay.1
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/cowsay.1
@@ -0,0 +1,168 @@
+.\"
+.\" cowsay.1
+.\"
+.\" $Id: cowsay.1,v 1.4 1999/11/04 19:50:40 tony Exp $
+.\"
+.\" This file is part of cowsay. (c) 1999 Tony Monroe.
+.\"
+.ds Nm Cowsay
+.ds nm cowsay
+.ds Vn 3.02
+.TH \*(nm 1 "$Date: 1999/11/04 19:50:40 $"
+.SH NAME
+\*(nm/cowthink \- configurable speaking/thinking cow (and a bit more)
+.SH SYNOPSIS
+cowsay
+.RB [ \-e
+.IR eye_string ]
+.RB [ \-f
+.IR cowfile ]
+.RB [ \-h ]
+.RB [ \-l ]
+.RB [ \-n ]
+.RB [ \-T
+.IR tongue_string ]
+.RB [ \-W
+.IR column ]
+.RB [ \-bdgpstwy ]
+.SH DESCRIPTION
+.I Cowsay
+generates an ASCII picture of a cow saying something provided by the
+user. If run with no arguments, it accepts standard input, word-wraps
+the message given at about 40 columns, and prints the cow saying the
+given message on standard output.
+.PP
+To aid in the use of arbitrary messages with arbitrary whitespace,
+use the
+.B \-n
+option. If it is specified, the given message will not be
+word-wrapped. This is possibly useful if you want to make the cow
+think or speak in figlet(6). If
+.B \-n
+is specified, there must not be any command-line arguments left
+after all the switches have been processed.
+.PP
+The
+.B \-W
+specifies roughly (where the message should be wrapped. The default
+is equivalent to
+.B \-W 40
+i.e. wrap words at or before the 40th column.
+.PP
+If any command-line arguments are left over after all switches have
+been processed, they become the cow's message. The program will not
+accept standard input for a message in this case.
+.PP
+There are several provided modes which change the appearance of the
+cow depending on its particular emotional/physical state. The
+.B \-b
+option initiates Borg mode;
+.B \-d
+causes the cow to appear dead;
+.B \-g
+invokes greedy mode;
+.B \-p
+causes a state of paranoia to come over the cow;
+.B \-s
+makes the cow appear thoroughly stoned;
+.B \-t
+yields a tired cow;
+.B \-w
+is somewhat the opposite of
+.BR \-t ,
+and initiates wired mode;
+.B \-y
+brings on the cow's youthful appearance.
+.PP
+The user may specify the
+.B \-e
+option to select the appearance of the cow's eyes, in which case
+the first two characters of the argument string
+.I eye_string
+will be used. The default eyes are 'oo'. The tongue is similarly
+configurable through
+.B \-T
+and
+.IR tongue_string ;
+it must be two characters and does not appear by default. However,
+it does appear in the 'dead' and 'stoned' modes. Any configuration
+done by
+.B \-e
+and
+.B \-T
+will be lost if one of the provided modes is used.
+.PP
+The
+.B \-f
+option specifies a particular cow picture file (``cowfile'') to
+use. If the cowfile spec contains '/' then it will be interpreted
+as a path relative to the current directory. Otherwise, cowsay
+will search the path specified in the
+.B COWPATH
+environment variable.
+To list all cowfiles on the current
+.BR COWPATH ,
+invoke
+.B \*(nm
+with the
+.B \-l
+switch.
+.PP
+If the program is invoked as
+.B cowthink
+then the cow will think its message instead of saying it.
+.PP
+.SH COWFILE FORMAT
+A cowfile is made up of a simple block of
+.BR perl (1)
+code, which assigns a picture of a cow to the variable
+.BR $the_cow .
+Should you wish to customize the eyes or the tongue of the cow,
+then the variables
+.B $eyes
+and
+.B $tongue
+may be used. The trail leading up to the cow's message balloon is
+composed of the character(s) in the
+.B $thoughts
+variable. Any backslashes must be reduplicated to prevent
+interpolation. The name of a cowfile should end with
+.BR .cow ,
+otherwise it is assumed not to be a cowfile. Also, at-signs (``@'')
+must be backslashed because that is what Perl 5 expects.
+.PP
+.SH COMPATIBILITY WITH OLDER VERSIONS
+.PP
+What older versions? :-)
+.PP
+Version 3.x is fully backward-compatible with 2.x versions. If
+you're still using a 1.x version, consider upgrading. And tell me
+where you got the older versions, since I didn't exactly put them
+up for world-wide access.
+.PP
+Oh, just so you know, this manual page documents version \*(Vn of
+cowsay.
+.SH ENVIRONMENT
+The COWPATH environment variable, if present, will be used to search
+for cowfiles. It contains a colon-separated list of directories,
+much like
+.B PATH or
+.BR MANPATH .
+It should always contain the
+.B /usr/local/share/cows
+directory, or at least a directory with a file called
+.B default.cow
+in it.
+.SH FILES
+.B %PREFIX%/share/cows
+holds a sample set of cowfiles. If your
+.B COWPATH
+is not explicitly set, it automatically contains this directory.
+.SH BUGS
+If there are any, please notify the author at the address below.
+.SH AUTHOR
+Tony Monroe (tony@nog.net), with suggestions from Shannon
+Appel (appel@CSUA.Berkeley.EDU) and contributions from Anthony Polito
+(aspolito@CSUA.Berkeley.EDU).
+.SH SEE ALSO
+perl(1), wall(1), nwrite(1), figlet(6)
diff --git a/externals/cowsay/install.sh b/externals/cowsay/install.sh
new file mode 100755
--- /dev/null
+++ b/externals/cowsay/install.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+
+##
+## install.sh
+##
+## Installation script for cowsay.
+##
+## $Id: install.sh,v 1.5 1999/11/01 20:19:21 tony Exp $
+##
+## This file is part of cowsay. (c) 1999 Tony Monroe.
+##
+
+rcs_id='$Id: install.sh,v 1.5 1999/11/01 20:19:21 tony Exp $'
+
+filelist='cows'
+
+cat <<DOG
+===================
+cowsay Installation
+===================
+
+Searching for useful perl executables...
+DOG
+
+backdoor=$1
+
+pathdirs=`echo $PATH | tr : " "`
+for p in $pathdirs; do
+ set $p/perl $p/perl5*
+ while [ ! -z "$1" ]; do
+ if [ -x "$1" ]; then
+ echo Found perl in $1
+ perls="$perls $1"
+ fi
+ shift
+ done
+done
+for perl in $perls; do
+ if $perl -MText::Wrap -e0 >/dev/null 2>&1; then
+ echo Found a good perl in $perl
+ goodperls="$goodperls $perl"
+ fi
+done
+echo The following perl executables will run cowsay:
+echo $goodperls
+echo I recommend the latest stable perl you can find.
+set $goodperls
+if [ -z "$1" ]; then
+ echo Ack! You do not have Perl 5 installed correctly!
+ echo Get thee to CPAN!
+ exit 1
+fi
+usethisperl=$1
+echo I will be using $1 because I know it will work.
+
+echo Now I need an installation prefix. I will use /usr/local unless
+printf "you give me a better idea here: "
+if [ -n "$backdoor" ]; then
+ prefix=$backdoor
+ printf "%s (specified on command line)\n" $prefix
+else
+ read prefix
+fi
+
+PREFIX=${prefix:-/usr/local}
+
+echo Okay, time to install this puppy.
+
+echo s,%BANGPERL%,!$usethisperl,\; > install.pl
+echo s,%PREFIX%,$PREFIX,\; >> install.pl
+set -x
+mkdir -p $PREFIX/bin || (mkdir $PREFIX; mkdir $PREFIX/bin)
+$usethisperl -p install.pl cowsay > $PREFIX/bin/cowsay
+chmod a+x $PREFIX/bin/cowsay
+ln -s cowsay $PREFIX/bin/cowthink
+mkdir -p $PREFIX/man/man1 || ($mkdir $PREFIX; mkdir $PREFIX/man; mkdir $PREFIX/man/man1)
+$usethisperl -p install.pl cowsay.1 > $PREFIX/man/man1/cowsay.1
+chmod a+r $PREFIX/man/man1/cowsay.1
+ln -s cowsay.1 $PREFIX/man/man1/cowthink.1
+mkdir -p $PREFIX/share/cows || (mkdir $PREFIX; mkdir $PREFIX/share; mkdir $PREFIX/share/cows)
+tar -cf - $filelist | (cd $PREFIX/share && tar -xvf -)
+set +x
+
+echo Okay, let us see if the install actually worked.
+
+if [ ! -f $PREFIX/share/cows/default.cow ]; then
+ echo The default cow file did not make it across!
+ echo Ooops, it failed...sorry!
+ exit 1
+fi
+
+echo Installation complete! Enjoy the cows!
diff --git a/externals/cowsay/pgp_public_key.txt b/externals/cowsay/pgp_public_key.txt
new file mode 100644
--- /dev/null
+++ b/externals/cowsay/pgp_public_key.txt
@@ -0,0 +1,14 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: 2.6.2
+
+mQCNAzNS+H4AAAEEAMilCcxLMIqMNXhZoeHjbeJGnHoKP0JpKDejz66qBlDwP+du
+FvVBHkyNIuU3orKe7l/aXIR8TcpjrxdcmrjjzwuB1aV48V4swT7v9UXvv9YP41Pd
+1pXYXNelXHmE0eKSfcnkkFmYTJBXPaPNTJ3rpZpZOEW3SfgrrheqQm6w/6IJAAUR
+tBpUb255IE1vbnJvZSA8dG9ueUBub2cubmV0PrQdVG9ueSBNb25yb2UgPHRtb25y
+b2VAbm9nLm5ldD6JAJUDBRA2bDA5F6pCbrD/ogkBASOZA/9XtYSpcPjpi62MTEZl
+l+wV1svtlUlPvKkDE7FB9bwnMbF1FgGhTe/H4/8qDu20m5eGxMX58Ri7HPXWjjJ/
+CrUWMzGVbg1JBkgh+d9QvEywmR0j4WezaifW1nCbxk0GrW1PjJyGb3kx7vrIF1Km
+xt6VwxTgfJzjIioBJFb4EiDyaLQnVG9ueSBNb25yb2UgPHRtb25yb2VAQ1NVQS5C
+ZXJrZWxleS5FRFU+
+=WpM4
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/resources/cows/builtin/companion.cow b/resources/cows/builtin/companion.cow
new file mode 100644
--- /dev/null
+++ b/resources/cows/builtin/companion.cow
@@ -0,0 +1,9 @@
+ $thoughts
+ $thoughts
+ /---\__/---\\
+ | / .... \ ||
+ \ ..--.. //
+ |..($eyes). ||
+ / ..--.. \\
+ | \ .... / ||
+ \---/--\---//
diff --git a/resources/cows/custom/README b/resources/cows/custom/README
new file mode 100644
--- /dev/null
+++ b/resources/cows/custom/README
@@ -0,0 +1,2 @@
+You can add custom ".cow" files here to make them available to the "cowsay"
+interpreter in Remarkup.
diff --git a/src/infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php b/src/infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php
--- a/src/infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php
+++ b/src/infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php
@@ -8,45 +8,28 @@
}
public function markupContent($content, array $argv) {
- if (!Filesystem::binaryExists('cowsay')) {
- return $this->markupError(
- pht(
- 'Unable to locate the `%s` binary. Install cowsay.',
- 'cowsay'));
- }
-
- $bin = idx($argv, 'think') ? 'cowthink' : 'cowsay';
+ $action = idx($argv, 'think') ? 'think' : 'say';
$eyes = idx($argv, 'eyes', 'oo');
$tongue = idx($argv, 'tongue', ' ');
- $cow = idx($argv, 'cow', 'default');
-
- // NOTE: Strip this aggressively to prevent nonsense like
- // `cow=/etc/passwd`. We could build a whiltelist with `cowsay -l`.
- $cow = preg_replace('/[^a-z.-]+/', '', $cow);
-
- $future = new ExecFuture(
- '%s -e %s -T %s -f %s ',
- $bin,
- $eyes,
- $tongue,
- $cow);
-
- $future->setTimeout(15);
- $future->write($content);
-
- list($err, $stdout, $stderr) = $future->resolve();
-
- if ($err) {
- return $this->markupError(
- pht(
- 'Execution of `%s` failed: %s',
- 'cowsay',
- $stderr));
+
+ $map = self::getCowMap();
+
+ $cow = idx($argv, 'cow');
+ $cow = phutil_utf8_strtolower($cow);
+ if (empty($map[$cow])) {
+ $cow = 'default';
}
+ $result = id(new PhutilCowsay())
+ ->setTemplate($map[$cow])
+ ->setAction($action)
+ ->setEyes($eyes)
+ ->setTongue($tongue)
+ ->setText($content)
+ ->renderCow();
if ($this->getEngine()->isTextMode()) {
- return $stdout;
+ return $result;
}
return phutil_tag(
@@ -54,7 +37,32 @@
array(
'class' => 'PhabricatorMonospaced remarkup-cowsay',
),
- $stdout);
+ $result);
+ }
+
+ private static function getCowMap() {
+ $root = dirname(phutil_get_library_root('phabricator'));
+
+ $directories = array(
+ $root.'/externals/cowsay/cows/',
+ $root.'/resources/cows/builtin/',
+ $root.'/resources/cows/custom/',
+ );
+
+ $map = array();
+ foreach ($directories as $directory) {
+ foreach (Filesystem::listDirectory($directory, false) as $cow_file) {
+ $matches = null;
+ if (!preg_match('/^(.*)\.cow\z/', $cow_file, $matches)) {
+ continue;
+ }
+ $cow_name = $matches[1];
+ $cow_name = phutil_utf8_strtolower($cow_name);
+ $map[$cow_name] = Filesystem::readFile($directory.$cow_file);
+ }
+ }
+
+ return $map;
}
}

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 2, 8:38 PM (2 w, 1 d ago)
Storage Engine
amazon-s3
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
phabricator/secure/cj/pz/b3l6np6o24mll22x
Default Alt Text
D14100.diff (39 KB)

Event Timeline