Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14012889
D14100.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
39 KB
Referenced Files
None
Subscribers
None
D14100.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D14100: Use PHP implementation of Cowsay for cowsay rule
Attached
Detach File
Event Timeline
Log In to Comment