├── .gitignore ├── cows ├── shrug.cow ├── tableflip.cow ├── template.cow ├── cthulhu-mini.cow ├── bunny.cow ├── owl.cow ├── shikato.cow ├── zen-noh-milk.cow ├── default.cow ├── hedgehog.cow ├── lollerskates.cow ├── hellokitty.cow ├── koala.cow ├── wood.cow ├── mailchimp.cow ├── minotaur.cow ├── bill-the-cat.cow ├── ebi_furai.cow ├── moose.cow ├── small.cow ├── roflcopter.cow ├── satanic.cow ├── mutilated.cow ├── banana.cow ├── pawn.cow ├── robot.cow ├── kilroy.cow ├── tortoise.cow ├── hiyoko.cow ├── kitten.cow ├── rook.cow ├── dolphin.cow ├── www.cow ├── tux.cow ├── world.cow ├── bishop.cow ├── cower.cow ├── goat2.cow ├── knight.cow ├── sheep.cow ├── vader-koala.cow ├── fat-cow.cow ├── luke-koala.cow ├── moofasa.cow ├── ymd_udon.cow ├── fat-banana.cow ├── yasuna_16.cow ├── robotfindskitten.cow ├── elephant2.cow ├── supermilker.cow ├── clippy.cow ├── queen.cow ├── sachiko.cow ├── squirrel.cow ├── goat.cow ├── vader.cow ├── kitty.cow ├── bong.cow ├── elephant.cow ├── ren.cow ├── fox.cow ├── bud-frogs.cow ├── elephant-in-snake.cow ├── king.cow ├── seahorse.cow ├── C3PO.cow ├── charlie.cow ├── whale.cow ├── telebears.cow ├── iwashi.cow ├── docker-whale.cow ├── lamb.cow ├── armadillo.cow ├── yasuna_12.cow ├── dalek.cow ├── stimpy.cow ├── yasuna_10.cow ├── cowfee.cow ├── ibm.cow ├── yasuna_13.cow ├── cat2.cow ├── bearface.cow ├── jellyfish.cow ├── kosh.cow ├── taxi.cow ├── happy-whale.cow ├── skeleton.cow ├── yasuna_09.cow ├── threader.cow ├── R2-D2.cow ├── ghost.cow ├── spidercow.cow ├── meow.cow ├── milk.cow ├── fence.cow ├── flaming-sheep.cow ├── lamb2.cow ├── sudowoodo.cow ├── chito.cow ├── cheese.cow ├── claw-arm.cow ├── yasuna_19.cow ├── moojira.cow ├── yasuna_11.cow ├── yasuna_20.cow ├── eyes.cow ├── cube.cow ├── mooghidjirah.cow ├── toaster.cow ├── hand.cow ├── nyan.cow ├── daemon.cow ├── yasuna_06.cow ├── beavis.zen.cow ├── yasuna_01.cow ├── lobster.cow ├── cat.cow ├── doge.cow ├── bees.cow ├── kiss.cow ├── yasuna_08.cow ├── radio.cow ├── yasuna_03.cow ├── box.cow ├── yasuna_05.cow ├── mech-and-cow.cow ├── pinball-machine.cow ├── snoopysleep.cow ├── yasuna_03a.cow ├── yasuna_07.cow ├── USA.cow ├── okazu.cow ├── snoopy.cow ├── biohazard.cow ├── wizard.cow ├── explosion.cow ├── psychiatrichelp.cow ├── atom.cow ├── yasuna_04.cow ├── cake.cow ├── yasuna_18.cow ├── fire.cow ├── hiya.cow ├── lightbulb.cow ├── stegosaurus.cow ├── yasuna_17.cow ├── yasuna_14.cow ├── personality-sphere.cow ├── octopus.cow ├── catfence.cow ├── psychiatrichelp2.cow ├── karl_marx.cow ├── surgery.cow ├── broken-heart.cow ├── aperture.cow ├── aperture-blank.cow ├── glados.cow ├── dragon.cow ├── hypno.cow ├── companion-cube.cow ├── renge.cow ├── yasuna_02.cow ├── ghostbusters.cow ├── maze-runner.cow ├── black-mesa.cow ├── turtle.cow ├── tweety-bird.cow ├── snoopyhouse.cow ├── homer.cow ├── threecubes.cow ├── tux-big.cow ├── mule.cow ├── atat.cow ├── dragon-and-cow.cow ├── turkey.cow ├── awesome-face.cow ├── seahorse-big.cow ├── squid.cow ├── chessmen.cow ├── periodic-table.cow ├── dalek-shooting.cow ├── smiling-octopus.cow ├── charizardvice.cow ├── ackbar.cow ├── cake-with-candles.cow ├── golden-eagle.cow ├── hippie.cow ├── mona-lisa.cow ├── pterodactyl.cow └── weeping-angel.cow ├── .travis.yml ├── sample.html ├── rollup.config.js ├── test ├── faces.js ├── cli.js ├── cows.js └── balloon.js ├── lib ├── faces.js ├── cows.js ├── replacer.js └── balloon.js ├── LICENSE ├── package.json ├── cli.js ├── index.js ├── README.md ├── index.d.ts └── browser.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .* 3 | !.gitignore 4 | !.travis.yml 5 | build 6 | -------------------------------------------------------------------------------- /cows/shrug.cow: -------------------------------------------------------------------------------- 1 | $the_cow = < 9 | /_/ \\_\\ 10 | EOC 11 | -------------------------------------------------------------------------------- /cows/hiyoko.cow: -------------------------------------------------------------------------------- 1 | ## 2 | ## ひよ子 3 | ## 4 | $the_cow = <.' 8 | '-:_ ) / `' '=. 9 | ) > {_/, /~) 10 | snd |/ `^ .' 11 | EOC 12 | -------------------------------------------------------------------------------- /cows/bishop.cow: -------------------------------------------------------------------------------- 1 | # Bishop (Chess piece) 2 | # 3 | # from http://www.chessvariants.org/d.pieces/ascii.html 4 | # by David Moeser 5 | # 6 | $the_cow = <_ 10 | (\\) ) 11 | \\__/ 12 | (____) 13 | | | 14 | |__| 15 | /____\\ 16 | (______) 17 | EOC 18 | -------------------------------------------------------------------------------- /cows/cower.cow: -------------------------------------------------------------------------------- 1 | ## 2 | ## A cowering cow 3 | ## 4 | $the_cow = < 11 | \\__/ 12 | (____) 13 | | | 14 | | | 15 | |__| 16 | /____\\ 17 | (______) 18 | (________) 19 | EOC 20 | -------------------------------------------------------------------------------- /cows/sachiko.cow: -------------------------------------------------------------------------------- 1 | # 2 | # プロデューサーさんは独特の変わったセンスをしてますね! 3 | # 4 | $the_cow = < $eye\\ _~ 9 | `;'\\\\__-' \\_ 10 | | ) _ \\ \\ 11 | / / `` w w 12 | w w 13 | EOC 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /cows/vader.cow: -------------------------------------------------------------------------------- 1 | ## 2 | ## Cowth Vader, from geordan@csua.berkeley.edu 3 | ## 4 | $the_cow = < 、 _ ィ 14 | /  ̄ ヽ 15 | / | iヽ 16 | |\| |/| 17 | | ||/\/\/\/ | | 18 | EOC 19 | -------------------------------------------------------------------------------- /cows/whale.cow: -------------------------------------------------------------------------------- 1 | # whale 2 | # 3 | # modified from https://www.reddit.com/r/pics/comments/25ji0n/man_face_to_face_with_whale/chi1kdy?context=3 4 | $the_cow = <> 12 | EOC 13 | -------------------------------------------------------------------------------- /cows/iwashi.cow: -------------------------------------------------------------------------------- 1 | ## 2 | ## いわし 3 | ## 4 | ## 5 | $the_cow = <=G===' '. 8 | |======| 9 | |======| 10 | )--/]IIIIII] 11 | |_______| 12 | C O O O D 13 | C O O O D 14 | C O O O D 15 | C__O__O__O__D 16 | snd [_____________] 17 | EOC 18 | -------------------------------------------------------------------------------- /cows/stimpy.cow: -------------------------------------------------------------------------------- 1 | ## 2 | ## Stimpy! 3 | ## 4 | $the_cow = <|:::::|<\/\// 18 | \ :::>TヌT<::: / 19 | Y : \W/ : Y 20 | EOC 21 | -------------------------------------------------------------------------------- /cows/cowfee.cow: -------------------------------------------------------------------------------- 1 | $the_cow = < 2 | 3 | 4 | 5 | Cowsay 6 | 7 | 8 | 9 |

10 |     
17 |   
18 | 
19 | 


--------------------------------------------------------------------------------
/cows/cat2.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | #	Cat picture by Joan Stark
 3 | #	Transformed into cowfile by Myroslav Golub
 4 | #
 5 | $the_cow = <   ____;      ;  |/\\><|   ____   _<)
13 |   {____/    \\_________________/    \\____}
14 |        \\ '' /                 \\ '' /
15 |  jgs    '--'                   '--'
16 | EOC
17 | 


--------------------------------------------------------------------------------
/cows/happy-whale.cow:
--------------------------------------------------------------------------------
 1 | # happy whale
 2 | #
 3 | # modified from http://www.chris.com/ascii/index.php?art=animals/other%20(water)
 4 | $the_cow = <-'-゚-'`゚u
22 |         ーi-i~i-i~
23 |          |.|  |.|
24 |          |-|  |-|
25 |          ヒコ  ヒコ 
26 | EOC
27 | 


--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
 1 | import commonjs from '@rollup/plugin-commonjs';
 2 | import {nodeResolve} from '@rollup/plugin-node-resolve';
 3 | import {string} from 'rollup-plugin-string';
 4 | 
 5 | export default {
 6 |   input: 'browser.js',
 7 |   plugins: [
 8 |     nodeResolve(),
 9 |     commonjs(),
10 |     string({
11 |       include: '**/*.cow',
12 |     }),
13 |   ],
14 |   output: [
15 |     { file: 'build/cowsay.umd.js', format: 'umd', name: 'cowsay' },
16 |     { file: 'build/cowsay.es.js', format: 'es' },
17 |   ],
18 | }
19 | 


--------------------------------------------------------------------------------
/cows/threader.cow:
--------------------------------------------------------------------------------
 1 | $the_cow = < {
 5 |   t.plan(2);
 6 | 
 7 |   const face = getFace({
 8 |     e: 'oo',
 9 |     T: '  ',
10 |   });
11 |   t.equal(face.eyes, 'oo');
12 |   t.equal(face.tongue, '  ');
13 | });
14 | 
15 | test('mode overrides provided values', (t) => {
16 |   t.plan(2);
17 | 
18 |   const face = getFace({
19 |     g: true,
20 |     e: 'oo',
21 |     T: 'O ',
22 |   });
23 |   t.equal(face.eyes, '$$');
24 |   t.equal(face.tongue, '  ');
25 | });
26 | 


--------------------------------------------------------------------------------
/cows/meow.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## A meowing tiger?
 3 | ##
 4 | $the_cow = <
21 | EOC
22 | 


--------------------------------------------------------------------------------
/cows/fence.cow:
--------------------------------------------------------------------------------
 1 | $the_cow = <z-一-z<:: :: :: :: :.
20 | V|\:/}ヘ/  `ー又ー' \/}ノ{/|:/
21 |   ,z' ̄ ヘ   /{ .ト、  / ̄  ヽ
22 | /      /\./x 一 ミ./       \ 
23 | EOC
24 | 


--------------------------------------------------------------------------------
/test/cli.js:
--------------------------------------------------------------------------------
 1 | const test = require('tape');
 2 | const execa = require('execa');
 3 | 
 4 | test('say something', async (t) => {
 5 |   t.plan(1);
 6 |   const { stdout } = await execa.node('cli.js', ['say']);
 7 |   t.match(stdout, /< say >/);
 8 | });
 9 | 
10 | test('think something', async (t) => {
11 |   t.plan(1);
12 |   const { stdout } = await execa.node('cli.js', ['--think', 'something']);
13 |   t.match(stdout, /( something )/);
14 | });
15 | 
16 | test('from stdin', async (t) => {
17 |   t.plan(1);
18 |   const { stdout } = await execa.node('cli.js', { input: 'echo' });
19 |   t.match(stdout, /< echo >/);
20 | });
21 | 


--------------------------------------------------------------------------------
/cows/moojira.cow:
--------------------------------------------------------------------------------
 1 | $the_cow = <  `ommmmm/
 9 |  smmmmms. -(__). .smmmmmo 
10 |  `+dmmmmd+``$tongue``+dmmmmd+  
11 |    -ymmmmmh/``+hmmmmmy-   
12 |     `/hmmmmmhhmmmmmh/`    
13 |       `/hmmmmmmmmh/`      
14 |         `/hmmmmmd/        
15 |       `oo.`/dmmmmdo`      
16 |      `ymmd+`VVmmmmmy`     
17 |      smmmmd-  /mmmmms     
18 |     -mmmmm+    ommmmm-    
19 |     -ooooo`    .ooooo.    
20 | EOC
21 | 


--------------------------------------------------------------------------------
/cows/yasuna_11.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | # きゅーっ!
 3 | #
 4 | 
 5 | $the_cow = <   く_, ̄┘/  \
15 |    /⌒ ̄ ̄ ̄| ̄ ̄>--r-rュ<|   /
16 |    L_,vー─-|    、 }  VYハ   Y
17 |               ̄ ̄V  |/∧   ヘ
18 |                   {   |//∧  ヘ
19 |                   {    \//   ヘ
20 |                   {            \
21 |                   }             >
22 | EOC
23 | 


--------------------------------------------------------------------------------
/cows/yasuna_20.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | # yasuna_20.cow - もしかしたら新種かも!
 3 | #
 4 | 
 5 | $the_cow = <ィ   |:|   }  ノ
21 |         \/  ノ    |:|   }-く \
22 |              /      V     \  \  \ 
23 | EOC
24 | 


--------------------------------------------------------------------------------
/cows/eyes.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## Evil-looking eyes
 3 | ##
 4 | $the_cow = <> 5.4
 3 | ##
 4 | $the_cow = <:ニニニ:<VVV
18 |           \ :v:〈|父 /:|:ハ┐
19 |             ヾ{:「|/:|/ <:/:ノ\
20 |               {:\|::/:/:{: :ヽ
21 |               {: : : :`: /> : :>
22 |              / : ゚ : : ゚ : Y: :/
23 |             /: : : : : : : |ヽ/
24 |            〈: :゚: ハ : :゚: ∟コ
25 |            /::---':::------く 
26 | EOC
27 | 


--------------------------------------------------------------------------------
/cows/beavis.zen.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## Beavis, with Zen philosophy removed.
 3 | ##
 4 | $the_cow = <、|  |:|/|
20 |                /   V   l
21 |              〈        〉
22 |            〈:`-:';`-´:〉
23 |             .>-:ァ─--‐r-:ィ
24 |             /  /     |  |
25 |            /  /      |  |
26 |           /-,/       |--|
27 |          に7         |二|
28 | EOC
29 | 


--------------------------------------------------------------------------------
/cows/lobster.cow:
--------------------------------------------------------------------------------
 1 | # Lobster
 2 | #   lobster jgs   10/96
 3 | #   http://ascii.co.uk/art/lobster
 4 | $the_cow = < cat.cow
 7 | #
 8 | $the_cow = <
12 |              |  .\\/|
13 |              |   .||
14 |              |    ||
15 |             / \\   ||
16 |            /,-.\\: ||
17 |           /,,  `\\ ||
18 |          /,  ', `\\||
19 |         /, *   ''/ |
20 |        /,    *,'/  |
21 |       /,     , /   |
22 |      / :    , /   .|
23 |     /\\ :   , /   /||
24 |    |\\ \\ .., /   / ||
25 |    |.\\ \\ . /   /  ||
26 |    |  \\ \\ /   /   ||
27 |    |   \\ /   /    |'
28 |    |\\o '|o  /
29 |    ||\\o |  /
30 |    || \\ | /
31 |    ||  \\|/
32 |    |'   ||
33 |         ||
34 |         ||
35 |         |'
36 | EOC
37 | 


--------------------------------------------------------------------------------
/cows/snoopysleep.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## picture from http://www.ascii-art.de/ascii/ab/beagle.txt
 3 | ## 
 4 | $the_cow = <
18 |    .SSt  .      .     .      .    .   _.()`'()`'  .
19 | EOC
20 |    


--------------------------------------------------------------------------------
/cows/atom.cow:
--------------------------------------------------------------------------------
 1 | # atom
 2 | # via http://pastebin.com/1AZwKrKp
 3 | $the_cow = <
20 |               /___ |  >、    `''\   |
21 |              /ニ}::\//  \       |  |
22 |            {ニノ:: /''\ | `|r--ッ<|_/|
23 |            /__   V    }|  》=《      |
24 |            \ \/`一ヘノ|  { 6 }     { 
25 |               ̄        「   ゞ= '      }
26 |                       ノ               〉 
27 | EOC
28 | 


--------------------------------------------------------------------------------
/cows/fire.cow:
--------------------------------------------------------------------------------
 1 | # Fire
 2 | # via http://pastebin.com/1AZwKrKp
 3 | $the_cow = < <    >  .---.
 8 |    $thoughts                 |    \\  \\ - ~ ~ - /  /    |
 9 |          _____          ..-~             ~-..-~
10 |         |     |   \\~~~\\.'                    `./~~~/
11 |        ---------   \\__/                        \\__/
12 |       .'  $eye    \\     /               /       \\  " 
13 |      (_____,    `._.'               |         }  \\/~~~/
14 |       `----.          /       }     |        /    \\__/
15 |             `-.      |       /      |       /      `. ,~~|
16 |                 ~-.__|      /_ - ~ ^|      /- _      `..-‘ / \\  /\\
17 |                      |     /        |     /     ~-.     `-/ _ \\/__\\
18 |                      |_____|        |_____|         ~ - . _ _ _ _ _>
19 | EOC
20 | 


--------------------------------------------------------------------------------
/cows/yasuna_17.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | # さっそく試してみよう 道具持ってないから作るしかないかな
 3 | #  
 4 | 
 5 | $the_cow = <: :.
10 |                /:: ::. :. ::. ::`:、
11 |                `::. ::.ィ:.i::.、::.ヽ
12 |              /'      ./|..ト.}V.. .. ハ
13 |             '.. .. ./L/|:| 一V::. ::1
14 |             i::. ::/}/` V:| V Vト::. ::i
15 |             |::. :/Y芋ミV!Y 芋ミ|::. .|
16 |             ,::. ハ {::}  V {::}}:r,:代
17 |             /::. :}  つノ    つノ|:レ:}ゝ  ヽ
18 |               V::八    r一 ┐   ィ!::.:リ      }
19 |        {r     \ハ:>- .一-'.s<:ハ}ヽ}   __ノ ノ
20 |         弋二一   ヽ:{>}_ノ  / ゝ、
21 |                 。<   〈ハ〉  {    `、
22 |               /     i       `、.    `、
23 |             /    フ^|       ',゙、   `、
24 |            く   /   |         ', ゙、y ヽ
25 |            tゝ_r     r          ',  ><一'
26 |                     /  ゞ_      '
27 |                    /      一      `
28 | EOC
29 | 


--------------------------------------------------------------------------------
/test/cows.js:
--------------------------------------------------------------------------------
 1 | const test = require('tape');
 2 | const replacer = require('../lib/replacer');
 3 | 
 4 | const cowFormat = `#Comment 
 5 | # just some other comment, it's going to be ignored anyway ...
 6 | $the_cow = < {
29 |   t.plan(1);
30 | 
31 |   const cow = replacer(cowFormat, {
32 |     thoughts: '||',
33 |     eyes: 'oo',
34 |     tongue: 'U ',
35 |   });
36 |   t.equal(cow, expected);
37 | });
38 | 
39 | test('plain text file', (t) => {
40 |   t.plan(1);
41 | 
42 |   const cow = replacer(plainText, {
43 |     thoughts: '||',
44 |     eyes: 'oo',
45 |     tongue: 'U ',
46 |   });
47 |   t.equal(cow, expected);
48 | });
49 | 


--------------------------------------------------------------------------------
/cows/yasuna_14.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | # くっ、くぅー!
 3 | #
 4 | $the_cow = <イ:|:/::ノ: :/ : {{ /ノ 
29 | EOC
30 | 


--------------------------------------------------------------------------------
/cows/personality-sphere.cow:
--------------------------------------------------------------------------------
 1 | # Personality Sphere from Portal/Portal 2
 2 | # via http://pastebin.com/1AZwKrKp
 3 | $the_cow = <        \\             _ -~             `.  ^-`  ^-_
19 |                ///-._ _ _ _ _ _ _}^ - - - - ~                     ~-- ,.-~
20 |                                                                   /.-~
21 | EOC
22 | 


--------------------------------------------------------------------------------
/cows/hypno.cow:
--------------------------------------------------------------------------------
 1 | $the_cow =<<"EOC"
 2 |   $thoughts
 3 |      ___        _--_
 4 |     /    -    /     \\
 5 |    ( $eyes   \\  (    $eyes )
 6 |    |  $eyes _;\\-/|  $eyes _|
 7 |     \\___/######\\___/\\
 8 |       /##############\\
 9 |      /  ######   ##  #|
10 |     /  ##@##@##       |
11 |    /    ######     ##  \\
12 |  <______-------___\\  . //_
13 |     |       ____  | | //# \\__~__
14 |      \\      $tongue    \\  //###  \\   \\
15 |       |             /\'  ##  ##  ##\\   __--~--_
16 |        \\_________- /\\ )    ^     ##|--########\\
17 |   /--~-_\\________/_  |          #@##|#######Y##|
18 |  | \\ `  /|       /O/ ( ###  \')    ##/######/###/
19 |  \\  \\  | |       --  |  ###        /LLLLL--###/
20 |   \\_ \\/  |            \\_   \\    ) /####_____--
21 |  ___ /    \\           /     |   _-####\\
22 | (___/     -\\_________/     / -- |#####@@@@@@\'_
23 |  (__\\_      __,) (.___     ,/    /#####      `@@
24 |       | -\\\\-          //-//      @@  @@@@@.
25 |       | | \\\\_       _// //      @\'       \'@@.
26 |       (.)   \\_)    / / //                   @@@
27 |                   (_) (_\'
28 | EOC
29 | 


--------------------------------------------------------------------------------
/cows/companion-cube.cow:
--------------------------------------------------------------------------------
 1 | # Companion Cube from Portal
 2 | # via http://pastebin.com/1AZwKrKp
 3 | $the_cow = <> r -=≦{{/ /ニ=_
22 |           \\   人 | /ィ|     /レ/__   ノニ-、
23 |            \   \\|/  Xノ    / /   入//⌒Yハ
24 |              \\  /し |`---' //  /  \\ニニニノ|
25 |               \/  / \\  --ア |  |   | _]|
26 |                | /   \\/\\/  |  |   |___|
27 |                r勺    |_| |  |   |  ||
28 |                |`7    | | |  |   |   |
29 | EOC
30 | 


--------------------------------------------------------------------------------
/cows/yasuna_02.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## やすなちゃん
 3 | ##  
 4 | ##
 5 |           $the_cow = <了、.    v 〔:/|:/  レ'
21 |                         _ . -/: ,K:::>、/: :ト._
22 |                        |: :く_.:|/:〈 /: :}: /~ヽ
23 |               r「「「h,>:|: <: |'::ソ::<¨.:n「「「!、
24 |               ゝ__ノ /: : |::ヽ |::/: /: :.ヘ__ノ}
25 |                |  ̄ |,': :/: : ヽ:' / : :.:|  ̄ |:}
26 | EOC
27 | 


--------------------------------------------------------------------------------
/cows/ghostbusters.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## Ghostbusters!
 3 | ##
 4 | $the_cow = <
16 |  ---___  XXX__/          XXXXXX      \\__         /
17 |    \\-  --__/   ___/\\  XXXXXX            /  ___--/=
18 |     \\-\\    ___/    XXXXXX              '--- XXXXXX
19 |        \\-\\/XXX\\ XXXXXX                      /XXXXX
20 |          \\XXXXXXXXX   \\                    /XXXXX/
21 |           \\XXXXXX      >                 _/XXXXX/
22 |             \\XXXXX--__/              __-- XXXX/
23 |              -XXXXXXXX---------------  XXXXXX-
24 |                 \\XXXXXXXXXXXXXXXXXXXXXXXXXX/
25 |                   ""VXXXXXXXXXXXXXXXXXXV""
26 | EOC
27 | 


--------------------------------------------------------------------------------
/cows/maze-runner.cow:
--------------------------------------------------------------------------------
 1 | # maze-runner.cow
 2 | #
 3 | #   a guy running through an ASCII maze
 4 | #   found at http://pip.readthedocs.org/en/user_builds/pip/rtd-builds/latest/installing/
 5 | #
 6 | $the_cow = <
 5 | 
 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of
 7 | this software and associated documentation files (the "Software"), to deal in
 8 | the Software without restriction, including without limitation the rights to
 9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
10 | of the Software, and to permit persons to whom the Software is furnished to do
11 | so, subject to the following conditions:
12 | 
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 | 
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 | 
24 | ====
25 | 
26 | The original idea of cowsay come from [Tony Monroe](http://www.nog.net/~tony/) - [cowsay](https://github.com/schacon/cowsay) 
27 | 


--------------------------------------------------------------------------------
/cows/dragon-and-cow.cow:
--------------------------------------------------------------------------------
 1 | ##
 2 | ## A dragon smiting a cow, possible credit to kube@csua.berkeley.edu
 3 | ##
 4 | $the_cow = <____) >___   ^\\_\\_\\_\\_\\_\\_\\)
24 |                     ^^^//\\\\_^^//\\\\_^       ^(\\_\\_\\_\\)
25 |                       ^^^ ^^ ^^^ ^
26 | EOC
27 | 


--------------------------------------------------------------------------------
/cows/awesome-face.cow:
--------------------------------------------------------------------------------
 1 | # awesome face
 2 | # via http://pastebin.com/1AZwKrKp
 3 | $the_cow = <= 4"
61 |   }
62 | }
63 | 


--------------------------------------------------------------------------------
/cows/squid.cow:
--------------------------------------------------------------------------------
 1 | #
 2 | # これスプラトゥーン感あるね
 3 | #
 4 | 
 5 | $the_cow = <    \\      /                    
16 |                        <>_      \\__/      \\____/      <>_            
17 |            __/"""\\   (\\)  )    (____)     (____)    (\\)  )   __/"""\\ 
18 |   WWWWWW  ]___ 0  }   \\__/      |  |       |  |      \\__/   ]___ 0  }  WWWWWW
19 |    |  |       /   }  (____)     |  |       |__|     (____)      /   }   |  |
20 |    |  |     /~    }   |  |      |__|      /    \\     |  |     /~    }   |  |
21 |    |__|     \\____/    |__|     /____\\    (______)    |__|     \\____/    |__|
22 |   /____\\    /____\\   /____\\   (______)  (________)  /____\\    /____\\   /____\\
23 |  (______)  (______) (______) (________) /________\\ (______)  (______) (______)
24 | 
25 |     __        __       __        __         __        __        __       __
26 |    (  )      (  )     (  )      (  )       (  )      (  )      (  )     (  )
27 |     ||        ||       ||        ||         ||        ||        ||       ||
28 |    /__\\      /__\\     /__\\      /__\\       /__\\      /__\\      /__\\     /__\\
29 |   (____)    (____)   (____)    (____)     (____)    (____)    (____)   (____)
30 | EOC
31 | 


--------------------------------------------------------------------------------
/test/balloon.js:
--------------------------------------------------------------------------------
 1 | const test = require('tape');
 2 | const balloon = require('../lib/balloon');
 3 | 
 4 | test('single line - nowrap', (t) => {
 5 | 	t.plan(2);
 6 | 
 7 | 	t.equal(' _____\n< Hi! >\n -----', balloon.say('Hi!'));
 8 | 	t.equal(' _____\n( Hi! )\n -----', balloon.think('Hi!'));
 9 | });
10 | 
11 | test('single line - wrap', (t) => {
12 | 	t.plan(2);
13 | 
14 | 	t.equal(' _____\n< Yes >\n -----', balloon.say('Yes', 10));
15 | 	t.equal(' _____\n( Yes )\n -----', balloon.think('Yes', 10));
16 | });
17 | 
18 | test('two lines - nowrap', (t) => {
19 | 	t.plan(2);
20 | 	t.equal([
21 | 		' _____',
22 | 		'/ AB  \\',
23 | 		'\\ CDE /',
24 | 		' -----',
25 | 	].join('\n'), balloon.say('AB\nCDE'));
26 | 	t.equal([
27 | 		' _____',
28 | 		'( AB  )',
29 | 		'( CDE )',
30 | 		' -----',
31 | 	].join('\n'), balloon.think('AB\nCDE'));
32 | });
33 | 
34 | test('multiple lines - nowrap', (t) => {
35 | 	t.plan(2);
36 | 
37 | 	t.equal([
38 | 		' _________',
39 | 		'/ AB      \\',
40 | 		'| CDE     |',
41 | 		'\\ QWE RTY /',
42 | 		' ---------',
43 | 	].join('\n'), balloon.say('AB\nCDE\nQWE RTY'));
44 | 	t.equal([
45 | 		' _________',
46 | 		'( AB      )',
47 | 		'( CDE     )',
48 | 		'( QWE RTY )',
49 | 		' ---------',
50 | 	].join('\n'), balloon.think('AB\nCDE\nQWE RTY'));
51 | });
52 | 
53 | test('multiple lines - wrap to max lenght', (t) => {
54 | 	t.plan(2);
55 | 
56 | 	t.equal([
57 | 		' ______',
58 | 		'/ ONE  \\',
59 | 		'| TWO  |',
60 | 		'| THRE |',
61 | 		'\\ E    /',
62 | 		' ------',
63 | 	].join('\n'), balloon.say('ONE\nTWO THREE', 4));
64 | 	t.equal([
65 | 		' ______',
66 | 		'( ONE  )',
67 | 		'( TWO  )',
68 | 		'( THRE )',
69 | 		'( E    )',
70 | 		' ------',
71 | 	].join('\n'), balloon.think('ONE\nTWO THREE', 4));
72 | });
73 | 


--------------------------------------------------------------------------------
/cows/periodic-table.cow:
--------------------------------------------------------------------------------
 1 | $the_cow = <----''.  _  __  /
31 |                 .'        /"'          |  "'   '_
32 |                /_|.-'\\ ,".             '.'`__'-( \\
33 |                  / ,"'"\\,'               `/  `-.|" m
34 | EOC
35 | 


--------------------------------------------------------------------------------
/cows/ackbar.cow:
--------------------------------------------------------------------------------
 1 | # Admiral Ackbar
 2 | #
 3 | # based on 'ack --bar' from http://beyondgrep.com/
 4 | $the_cow = <-,------,,--------,----------\'
38 |                 `  `,;\' ~~~ ,\'\\######_/\'#######  .  \'
39 |                     \'\'~`\'\'\'\'    -  .\'/;  -    \'       -Catalyst
40 | EOC
41 | 


--------------------------------------------------------------------------------
/cli.js:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env node
 2 | const yargs = require('yargs')
 3 | 	.usage(`
 4 | Usage: $0 [-e eye_string] [-f cowfile] [-h] [-l] [-n] [-T tongue_string] [-W column] [-bdgpstwy] text
 5 | 		
 6 | If any command-line arguments are left over after all switches have been processed, they become the cow's message.
 7 | 		
 8 | If the program is invoked as cowthink then the cow will think its message instead of saying it.
 9 | `)
10 |   .options({
11 |     e: {
12 |       default: 'oo',
13 |     },
14 |     T: {
15 |       default: '  ',
16 |     },
17 |     W: {
18 |       default: 40,
19 |       type: 'number',
20 |     },
21 |     f: {
22 |       default: 'default',
23 |     },
24 |     think: {
25 |       type: 'boolean',
26 |     },
27 |   })
28 |   .describe({
29 |     b: 'Mode: Borg',
30 |     d: 'Mode: Dead',
31 |     g: 'Mode: Greedy',
32 |     p: 'Mode: Paranoia',
33 |     s: 'Mode: Stoned',
34 |     t: 'Mode: Tired',
35 |     w: 'Mode: Wired',
36 |     y: 'Mode: Youthful',
37 |     e: "Select the appearance of the cow's eyes.",
38 |     T:
39 |       'The tongue is configurable similarly to the eyes through -T and tongue_string.',
40 |     h: 'Display this help message',
41 |     n: 'If it is specified, the given message will not be word-wrapped.',
42 |     W:
43 |       'Specifies roughly where the message should be wrapped. The default is equivalent to -W 40 i.e. wrap words at or before the 40th column.',
44 |     f:
45 |       "Specifies a cow picture file (''cowfile'') to use. It can be either a path to a cow file or the name of one of cows included in the package.",
46 |     r: 'Select a random cow',
47 |     l: 'List all cowfiles included in this package.',
48 |     think: 'Think the message instead of saying it aloud.',
49 |   })
50 |   .boolean(['b', 'd', 'g', 'p', 's', 't', 'w', 'y', 'n', 'h', 'r', 'l'])
51 |   .help()
52 |   .alias('h', 'help');
53 | 
54 | const argv = yargs.argv;
55 | 
56 | if (argv.l) {
57 |   listCows();
58 | } else if (argv._.length) {
59 |   say();
60 | } else {
61 |   require('get-stdin')().then((data) => {
62 |     if (data) {
63 |       argv._ = [require('strip-final-newline')(data)];
64 |       say();
65 |     } else {
66 |       yargs.showHelp();
67 |     }
68 |   });
69 | }
70 | 
71 | function say() {
72 |   const module = require('./index');
73 |   const think = /think$/.test(argv['$0']) || argv.think;
74 | 
75 |   console.log(think ? module.think(argv) : module.say(argv));
76 | }
77 | 
78 | function listCows() {
79 |   require('./index').list((err, list) => {
80 |     if (err) throw new Error(err);
81 |     console.log(list.join('  '));
82 |   });
83 | }
84 | 


--------------------------------------------------------------------------------
/lib/balloon.js:
--------------------------------------------------------------------------------
  1 | var stringWidth = require("string-width");
  2 | 
  3 | exports.say = function (text, wrap) {
  4 | 	var delimiters = {
  5 | 		first : ["/", "\\"],
  6 | 		middle : ["|", "|"],
  7 | 		last : ["\\", "/"],
  8 | 		only : ["<", ">"]
  9 | 	};
 10 | 
 11 | 	return format(text, wrap, delimiters);
 12 | }
 13 | 
 14 | exports.think = function (text, wrap) {
 15 | 	var delimiters = {
 16 | 		first : ["(", ")"],
 17 | 		middle : ["(", ")"],
 18 | 		last : ["(", ")"],
 19 | 		only : ["(", ")"]
 20 | 	};
 21 | 
 22 | 	return format(text, wrap, delimiters);
 23 | }
 24 | 
 25 | function format (text, wrap, delimiters) {
 26 | 	var lines = split(text, wrap);
 27 | 	var maxLength = max(lines);
 28 | 
 29 | 	var balloon;
 30 | 	if (lines.length === 1) {
 31 | 		balloon = [
 32 | 			" " + top(maxLength),
 33 | 			delimiters.only[0] + " " + lines[0] + " " + delimiters.only[1],
 34 | 			" " + bottom(maxLength)
 35 | 		];
 36 | 	} else {
 37 | 		balloon = [" " + top(maxLength)];
 38 | 
 39 | 		for (var i = 0, len = lines.length; i < len; i += 1) {
 40 | 			var delimiter;
 41 | 
 42 | 			if (i === 0) {
 43 | 				delimiter = delimiters.first;
 44 | 			} else if (i === len - 1) {
 45 | 				delimiter = delimiters.last;
 46 | 			} else {
 47 | 				delimiter = delimiters.middle;
 48 | 			}
 49 | 
 50 | 			balloon.push(delimiter[0] + " " + pad(lines[i], maxLength) + " " + delimiter[1]);
 51 | 		}
 52 | 
 53 | 		balloon.push(" " + bottom(maxLength));
 54 | 	}
 55 | 
 56 | 	return balloon.join("\n");
 57 | }
 58 | 
 59 | function split (text, wrap) {
 60 | 	text = text.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '').replace(/\t/g, '        ');
 61 | 
 62 | 	var lines = [];
 63 | 	if (!wrap) {
 64 | 		lines = text.split("\n");
 65 | 	} else {
 66 | 		var start = 0;
 67 | 		while (start < text.length) {
 68 | 			var nextNewLine = text.indexOf("\n", start);
 69 | 
 70 | 			var wrapAt = Math.min(start + wrap, nextNewLine === -1 ? text.length : nextNewLine);
 71 | 
 72 | 			lines.push(text.substring(start, wrapAt));
 73 | 			start = wrapAt;
 74 | 
 75 | 			// Ignore next new line
 76 | 			if (text.charAt(start) === "\n") {
 77 | 				start += 1;
 78 | 			}
 79 | 		}
 80 | 	}
 81 | 
 82 | 	return lines;
 83 | }
 84 | 
 85 | function max (lines) {
 86 | 	var max = 0;
 87 | 	for (var i = 0, len = lines.length; i < len; i += 1) {
 88 | 		if (stringWidth(lines[i]) > max) {
 89 | 			max = stringWidth(lines[i]);
 90 | 		}
 91 | 	}
 92 | 
 93 | 	return max;
 94 | }
 95 | 
 96 | function pad (text, length) {
 97 | 	return text + (new Array(length - stringWidth(text) + 1)).join(" ");
 98 | }
 99 | 
100 | function top (length) {
101 | 	return new Array(length + 3).join("_");
102 | }
103 | 
104 | function bottom (length) {
105 | 	return new Array(length + 3).join("-");
106 | }
107 | 


--------------------------------------------------------------------------------
/cows/golden-eagle.cow:
--------------------------------------------------------------------------------
 1 | # Golden Eagle (Marquette University mascot)
 2 | # 
 3 | $the_cow = <---'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\  | | / )
15 |         _              ////////////// |__| )\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\  | |/ /
16 |        / `.       _    ////////.-'  >\\    <-._.--.\\\\\\\\\\\\\\\\\\  _|__ /_
17 |       (    \\  . .' )    /////// ( .- (    )() ( )_)\\\\\\\\\\\\\\  / __)-' )
18 |        `-   | |/          //// ( ) ( )|--'() ( ) \\\\\\\\\\\\\\\\   \\  `(.-')
19 |           .---/ _()        /// ( ) () |  /() ( )  \\\\\\\\\\\\     > ._>-'
20 |         ()+8 8 |            |  ( )( ) | /( ) ( )   \\        / \\/
21 |         ()+8 8/-()__        /  ( )( ) \\/ ( ) ( )\\   \\      /\\ /
22 |           |8 8|     `.     |   () ( ).--.( ) ( )-\\   \\    /   |
23 |         ()+||||-() (_/    _/   /| ()/ || \\ )  ()()\\   \\__/   /
24 |         .-`||||          /\\\\  / / ()|/  \\ ()     \\ `.  /|   |
25 |        (_  ||||        .'   _/-/  ()\\/||\\/()     \\-. \\     /
26 |            ||( \\_    .'    ( )/  ( ) `--' ( )     > ) `.  /
27 |         .--|_|\\_ \\ .'    .'( )_  ( )-.___.-( )  (  )    ""
28 |         `.__)-.( /.'\\  .'   (  )'_)-.______( ).-')'
29 |           (___)|  \\ .-'      `--'`-._.---._.(_))-'
30 |           (__)|| +-)'           |   /_.--.\\    |
31 |           (__)||-'              `._|`-'  ) )  _|
32 |             |||||                |  `.`-'.'--' /
33 |             |||||               .'    | |   .\\|
34 |             |||||             .'   _.-|_|     \\
35 |             |||||            /   .'.-'  \\\\     |
36 |             ||||||         .'     /      \\     \\
37 |              |||||        /     .'        \\     \\
38 |              |||||      .'     /           |    |
39 |             _|||||----./     .'            \\     \\
40 |          .-' |||||   `/     /               \\    |
41 |        .'     |||||   (    /                |    |
42 |       /       |||||   |    |\\                \\   |
43 |       |     .'|||||.  |    ||                |    )
44 |        \\    | |||||\\  |    |/                |    \\
45 |         \\   | ||||||  |    |                 /    |
46 |         |    `.||||' /     |                |     \\
47 |         |      ||||  |     \\                |      |
48 |         /      ||||| |      |\\             /       |
49 |        /       |||||_/      | \\            |        \\
50 |       /      ------'|       |  |           |        |
51 |      |      |___.---|        \\ |           /        |
52 |      |             /         | |          |         \\
53 |      |             |         \\/           |          |
54 |      |             /          |           |          |
55 |       \\           |           |           |          |
56 |        `.        /             \\          |           \\
57 |          `--.___`-_            |_         |           |
58 |            .-.__.-''-,_         -         |           \\_'
59 |           <`.         '.-//|-/``        (_)          _.-'
60 |            `._-.____.-'.|   /            '//, ,\\.-'`` |--.
61 |               `-.____.' |__/               '''\\      -'/ |
62 |                                                `.   _.// |
63 |                                                  `-.__.-'
64 | 
65 | VK
66 | EOC
67 | 


--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
  1 | var balloon = require("./lib/balloon");
  2 | var cows = require("./lib/cows");
  3 | var faces = require("./lib/faces");
  4 | 
  5 | /**
  6 |  * @param options
  7 |  * ## Face :
  8 |  * Either choose a mode (set the value as true) **_or_**
  9 |  * set your own defined eyes and tongue to `e` and `T`.
 10 |  * - ### `e` : eyes
 11 |  * - ### `T` : tongue
 12 |  * 
 13 |  * ## Cow :
 14 |  * Either specify a cow name (e.g. "fox") **_or_**
 15 |  * set the value of `r` to true which selects a random cow.
 16 |  * - ### `r` : random selection
 17 |  * - ### `f` : cow name - from `cows` folder
 18 |  * 
 19 |  * ## Modes :
 20 |  * Modes are just ready-to-use faces, here's their list:
 21 |  * - #### `b` : borg
 22 |  * - #### `d` : dead      
 23 |  * - #### `g` : greedy
 24 |  * - #### `p` : paranoia
 25 |  * - #### `s` : stoned
 26 |  * - #### `t` : tired
 27 |  * - #### `w` : wired
 28 |  * - #### `y` : youthful
 29 |  * 
 30 |  * @example
 31 |  * ```
 32 |  * // custom cow and face
 33 |  * cowsay.say({
 34 |  *     text: 'Hello world!',
 35 |  *     e: '^^', // eyes
 36 |  *     T: 'U ', // tongue
 37 |  *     f: 'USA' // name of the cow from `cows` folder
 38 |  * })
 39 |  * 
 40 |  * // using a random cow
 41 |  * cowsay.say({
 42 |  *     text: 'Hello world!',
 43 |  *     e: 'xx', // eyes
 44 |  *     r: true, // random mode - use a random cow.
 45 |  * })
 46 |  * 
 47 |  * // using a mode
 48 |  * cowsay.say({
 49 |  *     text: 'Hello world!',
 50 |  *     y: true, // using y mode - youthful mode
 51 |  * })
 52 |  * ```
 53 |  * 
 54 |  * @returns {string} compiled cow
 55 |  */
 56 | exports.say = function (options) {
 57 | 	return doIt(options, true);
 58 | };
 59 | 
 60 | /**
 61 |  * @param options
 62 |  * ## Face :
 63 |  * Either choose a mode (set the value as true) **_or_**
 64 |  * set your own defined eyes and tongue to `e` and `T`.
 65 |  * - ### `e` : eyes
 66 |  * - ### `T` : tongue
 67 |  * 
 68 |  * ## Cow :
 69 |  * Either specify a cow name (e.g. "fox") **_or_**
 70 |  * set the value of `r` to true which selects a random cow.
 71 |  * - ### `r` : random selection
 72 |  * - ### `f` : cow name - from `cows` folder
 73 |  * 
 74 |  * ## Modes :
 75 |  * Modes are just ready-to-use faces, here's their list:
 76 |  * - #### `b` : borg
 77 |  * - #### `d` : dead      
 78 |  * - #### `g` : greedy
 79 |  * - #### `p` : paranoia
 80 |  * - #### `s` : stoned
 81 |  * - #### `t` : tired
 82 |  * - #### `w` : wired
 83 |  * - #### `y` : youthful
 84 |  * 
 85 |  * @example
 86 |  * ```
 87 |  * // custom cow and face
 88 |  * cowsay.think({
 89 |  *     text: 'Hello world!',
 90 |  *     e: '^^', // eyes
 91 |  *     T: 'U ', // tongue
 92 |  *     f: 'USA' // name of the cow from `cows` folder
 93 |  * })
 94 |  * 
 95 |  * // using a random cow
 96 |  * cowsay.think({
 97 |  *     text: 'Hello world!',
 98 |  *     e: 'xx', // eyes
 99 |  *     r: true, // random mode - use a random cow.
100 |  * })
101 |  * 
102 |  * // using a mode
103 |  * cowsay.think({
104 |  *     text: 'Hello world!',
105 |  *     y: true, // using y mode - youthful mode
106 |  * })
107 |  * ```
108 |  * 
109 |  * @returns {string} compiled cow
110 |  */
111 | exports.think = function (options) {
112 | 	return doIt(options, false);
113 | };
114 | 
115 | /**
116 |  * @example
117 |  * ```
118 |  * function get_cows(error, cow_names) {
119 |  *    if (error) {
120 |  *        console.log(error);
121 |  *    }
122 |  *    else if (cow_names) {
123 |  *        console.log(`Number of cows available: ${cow_names.length}`);
124 |  *    }
125 |  *  }
126 |  * 
127 |  * cowsay.list(get_cows);
128 |  * ```
129 |  * @param callback
130 |  * @returns {Promise} promise
131 |  */
132 | exports.list = cows.list;
133 | 
134 | function doIt (options, sayAloud) {
135 | 	var cowFile;
136 | 
137 | 	if (options.r) {
138 | 		var cowsList = cows.listSync();
139 | 		cowFile = cowsList[Math.floor(Math.random() * cowsList.length)];
140 | 	} else {
141 | 		cowFile = options.f || "default";
142 | 	}
143 | 
144 | 	var cow = cows.get(cowFile);
145 | 	var face = faces(options);
146 | 	face.thoughts = sayAloud ? "\\" : "o";
147 | 
148 | 	var action = sayAloud ? "say" : "think";
149 | 	return balloon[action](options.text || options._.join(" "), options.n ? null : options.W) + "\n" + cow(face);
150 | }
151 | 


--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
  1 | # cowsay
  2 | 
  3 | ````
  4 |  __________________
  5 | < srsly dude, why? >
  6 |  ------------------
  7 |         \   ^__^
  8 |          \  (oo)\_______
  9 |             (__)\       )\/\
 10 |                 ||----w |
 11 |                 ||     ||
 12 | ````
 13 | 
 14 | cowsay is a configurable talking cow, originally written in Perl by [Tony Monroe](https://github.com/tnalpgge/rank-amateur-cowsay)
 15 | 
 16 | This project is a translation in JavaScript of the original program and an attempt to bring the same silliness to node.js.
 17 | 
 18 | ## Install
 19 | 
 20 |     npm install -g cowsay
 21 | 
 22 | ## Usage
 23 | 
 24 |     cowsay JavaScript FTW!
 25 | 
 26 | or
 27 | 
 28 |     cowthink node.js is cool
 29 | 
 30 | It acts in the same way as the original cowsay, so consult `cowsay(1)` or run `cowsay -h`
 31 | 
 32 | ````
 33 |  ________
 34 | < indeed >
 35 |  --------
 36 |     \
 37 |      \
 38 |                                    .::!!!!!!!:.
 39 |   .!!!!!:.                        .:!!!!!!!!!!!!
 40 |   ~~~~!!!!!!.                 .:!!!!!!!!!UWWW$$$
 41 |       :$$NWX!!:           .:!!!!!!XUWW$$$$$$$$$P
 42 |       $$$$$##WX!:      .): void {
100 |     if (error) {
101 |         console.log(`Error getting cow names: ${error.message}`)
102 |     }
103 |     else if (cow_names) {
104 |         console.log(`Number of cows available: ${cow_names.length}`);
105 |     }
106 | }
107 | 
108 | cowsay.list(get_cows);
109 | ```
110 | 
111 | importing the `IOptions` interface directly:
112 | ```ts
113 | import { IOptions } from "cowsay" // optional
114 | 
115 | let opts: IOptions = {
116 |     text: "Hello from TypeScript!",
117 |     e: '^^',
118 |     r: true,
119 | };
120 | 
121 | console.log(cowsay.say(opts));
122 | ```
123 | 
124 | 
125 | ## Pipe from standard input
126 | 
127 |     echo please repeat | cowsay
128 | 
129 | ## Usage in the browser
130 | 
131 | cowsay works in your browser too with rollup / webpack / browserify / you name it.
132 | 
133 | ```js
134 | import { say } from 'cowsay';
135 | 
136 | console.log(say({ text: 'grazing in the browser' }));
137 | ```
138 | 
139 | You can customize the cow by importing the relevant one
140 | 
141 | ```js
142 | import { think, SQUIRREL } from 'cowsay';
143 | 
144 | console.log(think({
145 |   text: 'grazing in the browser',
146 |   cow: SQUIRREL,
147 |   eyes: 'pp',
148 |   tongue: ';;',
149 | }));
150 | ```
151 | 
152 | All cows are included in the bundle, but you can use rollup / webpack tree-shake feature to reduce the final bundle size.
153 | 
154 | ### Browser options
155 | 
156 | ```js
157 | say({
158 |   text: 'hello',
159 |   cow: '', // Template for a cow, get inspiration from `./cows`
160 |   eyes: 'oo', // Select the appearance of the cow's eyes, equivalent to cowsay -e
161 |   tongue: 'L|', // The tongue is configurable similarly to the eyes through -T and tongue_string, equivalent to cowsay -T
162 |   wrap: false, // If it is specified, the given message will not be word-wrapped. equivalent to cowsay -n
163 |   wrapLength: 40, // Specifies roughly where the message should be wrapped. equivalent to cowsay -W
164 |   mode: 'b', // One of 	"b", "d", "g", "p", "s", "t", "w", "y"
165 | });
166 | ```
167 | 


--------------------------------------------------------------------------------
/index.d.ts:
--------------------------------------------------------------------------------
  1 | /**
  2 |  * @property text : text
  3 |  * 
  4 |  * @Cow
  5 |  * @property f : cow name
  6 |  * @property r : random selection
  7 |  * 
  8 |  * @Face
  9 |  * @property T : Tongue
 10 |  * @property e : eyes
 11 |  * 
 12 |  * @Modes
 13 |  * @property b : borg 
 14 |  * @property d : dead
 15 |  * @property g : greedy
 16 |  * @property p : paranoia
 17 |  * @property s : stoned
 18 |  * @property t : tired
 19 |  * @property w : wired
 20 |  * @property y : youthful
 21 |  */
 22 | export interface IOptions {
 23 |     text: string,
 24 |     // cow
 25 |     f?: string, // cow name
 26 |     r?: boolean, // random mode
 27 |     // face
 28 |     e?: string, // eyes
 29 |     T?: string, // tongue
 30 |     // modes
 31 |     b?: boolean, // borg 
 32 |     d?: boolean, // dead
 33 |     g?: boolean, // greedy
 34 |     p?: boolean, // paranoia
 35 |     s?: boolean, // stoned
 36 |     t?: boolean, // tired
 37 |     w?: boolean, // wired
 38 |     y?: boolean, // youthful
 39 | }
 40 | 
 41 | type callback_type = (error: NodeJS.ErrnoException, cow_names: string[]) => void;
 42 | 
 43 | /**
 44 |  * @param callback
 45 |  * @returns a list of cow names from the cows folder without the .cow extension.
 46 |  * @example
 47 |  * ```
 48 |  * function get_cows(error: NodeJS.ErrnoException, cow_names: Array): void {
 49 |  *    if (error) {
 50 |  *        console.log(`Error getting cow names: ${error.message}`);
 51 |  *    }
 52 |  *    else if (cow_names) {
 53 |  *        console.log(`Number of cows available: ${cow_names.length}`);
 54 |  *    }
 55 |  *  }
 56 |  * 
 57 |  * cowsay.list(get_cows);
 58 |  * ```
 59 |  */
 60 | export function list(callback: callback_type): Promise;
 61 | 
 62 | /**
 63 |  * @param options
 64 |  * ## Face :
 65 |  * Either choose a mode (set the value as true) **_or_**
 66 |  * set your own defined eyes and tongue to `e` and `T`.
 67 |  * - ### `e` : eyes
 68 |  * - ### `T` : tongue
 69 |  * 
 70 |  * ## Cow :
 71 |  * Either specify a cow name (e.g. "fox") **_or_**
 72 |  * set the value of `r` to true which selects a random cow.
 73 |  * - ### `r` : random selection
 74 |  * - ### `f` : cow name - from `cows` folder
 75 |  * 
 76 |  * ## Modes :
 77 |  * Modes are just ready-to-use faces, here's their list:
 78 |  * - #### `b` : borg
 79 |  * - #### `d` : dead      
 80 |  * - #### `g` : greedy
 81 |  * - #### `p` : paranoia
 82 |  * - #### `s` : stoned
 83 |  * - #### `t` : tired
 84 |  * - #### `w` : wired
 85 |  * - #### `y` : youthful
 86 |  * 
 87 |  * @example
 88 |  * ```
 89 |  * // custom cow and face
 90 |  * cowsay.say({
 91 |  *     text: 'Hello world!',
 92 |  *     e: '^^', // eyes
 93 |  *     T: 'U ', // tongue
 94 |  *     f: 'USA' // name of the cow from `cows` folder
 95 |  * })
 96 |  * 
 97 |  * // using a random cow
 98 |  * cowsay.say({
 99 |  *     text: 'Hello world!',
100 |  *     e: 'xx', // eyes
101 |  *     r: true, // random mode - use a random cow.
102 |  * })
103 |  * 
104 |  * // using a mode
105 |  * cowsay.say({
106 |  *     text: 'Hello world!',
107 |  *     y: true, // using y mode - youthful mode
108 |  * })
109 |  * ```
110 |  */
111 | export function say(options: IOptions): string;
112 | 
113 | /**
114 |  * @param options
115 |  * ## Face :
116 |  * Either choose a mode (set the value as true) **_or_**
117 |  * set your own defined eyes and tongue to `e` and `T`.
118 |  * - ### `e` : eyes
119 |  * - ### `T` : tongue
120 |  * 
121 |  * ## Cow :
122 |  * Either specify a cow name (e.g. "fox") **_or_**
123 |  * set the value of `r` to true which selects a random cow.
124 |  * - ### `r` : random selection
125 |  * - ### `f` : cow name - from `cows` folder
126 |  * 
127 |  * ## Modes :
128 |  * Modes are just ready-to-use faces, here's their list:
129 |  * - #### `b` : borg
130 |  * - #### `d` : dead      
131 |  * - #### `g` : greedy
132 |  * - #### `p` : paranoia
133 |  * - #### `s` : stoned
134 |  * - #### `t` : tired
135 |  * - #### `w` : youthful
136 |  * - #### `y` : wired
137 |  * 
138 |  * @example
139 |  * ```
140 |  * // custom cow and face
141 |  * cowsay.think({
142 |  *     text: 'Hello world!',
143 |  *     e: '^^', // eyes
144 |  *     T: 'U ', // tongue
145 |  *     f: 'USA' // name of the cow from `cows` folder
146 |  * })
147 |  * 
148 |  * // using a random cow
149 |  * cowsay.think({
150 |  *     text: 'Hello world!',
151 |  *     e: 'xx', // eyes
152 |  *     r: true, // random mode - use a random cow.
153 |  * })
154 |  * 
155 |  * // using a mode
156 |  * cowsay.think({
157 |  *     text: 'Hello world!',
158 |  *     y: true, // using y mode - youthful mode
159 |  * })
160 |  * ```
161 |  */
162 | export function think(options: IOptions): string;
163 | 


--------------------------------------------------------------------------------
/cows/mona-lisa.cow:
--------------------------------------------------------------------------------
 1 | # Mona Lisa
 2 | #
 3 | # from http://www.heartnsoul.com/ascii_art/mona_lisa_ascii.htm
 4 | $the_cow = <''''''                     !!!!!
33 | !!!!!           ?\$\$\$\$\$\$\$\$\$\$\$\$??\$c`\$\$\$\$\$\$\$\$\$\$\$?>'                     `!!!!
34 | !!!!!           `?\$\$\$\$\$\$I7?""    ,\$\$\$\$\$\$\$\$\$?>>'                       !!!!
35 | !!!!!.           <>''                       `!!!
36 | !!!!!!            ''                       `!!!
37 | !!!!!!             \$\$\$hccccccccc= cc\$\$\$\$\$\$\$>>'                         !!!
38 | !!!!!              `?\$\$\$\$\$\$F""""  `"\$\$\$\$\$>>>''                         `!!
39 | !!!!!                "?\$\$\$\$\$cccccc\$\$\$\$??>>>>'                           !!
40 | !!!!>                  "\$\$\$\$\$\$\$\$\$\$\$\$\$F>>>>''                            `!
41 | !!!!!                    "\$\$\$\$\$\$\$\$???>'''                                !
42 | !!!!!>                     `"""""                                        `
43 | !!!!!!;                       .                                          `
44 | !!!!!!!                       ?h.
45 | !!!!!!!!                       \$\$c,
46 | !!!!!!!!>                      ?\$\$\$h.              .,c
47 | !!!!!!!!!                       \$\$\$\$\$\$\$\$\$hc,.,,cc\$\$\$\$\$
48 | !!!!!!!!!                  .,zcc\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
49 | !!!!!!!!!               .z\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$
50 | !!!!!!!!!             ,d\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$          .
51 | !!!!!!!!!           ,d\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$         !!
52 | !!!!!!!!!         ,d\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$        ,!'
53 | !!!!!!!!>        c\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$.       !'
54 | !!!!!!''       ,d\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$>       '
55 | !!!''         z\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$>
56 | !'           ,\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$>             ..
57 |             z\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$'           ;!!!!''`
58 |             \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$F       ,;;!'`'  .''
59 |            <\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$>    ,;'`'  ,;
60 |            `\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$F   -'   ,;!!'
61 |             "?\$\$\$\$\$\$\$\$\$\$?\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$F     .    ""??\$\$\$?C3\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$""     ;!'''          !!!
63 |        ;!!!!;,      `"''""????\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$""   ,;-''               ',!
64 |       ;!!!!;,;, ..                  ' .                   '  '
66 |      !!' ,;!!! ;'`!!!!!!!!;!!!!!;  .        >' .''                 ;
67 |     !!' ;!!'!';! !! !!!!!!!!!!!!!  '         -'
68 |      ;! ;>
75 |              !'       ; !! '
76 |           ' ;!        > ! '
77 | 
78 | EOC
79 | 


--------------------------------------------------------------------------------
/cows/pterodactyl.cow:
--------------------------------------------------------------------------------
 1 | # pterodactyl.cow
 2 | #
 3 | #   a pterodactyl with its mouth open
 4 | #
 5 | $the_cow = <            /              
26 |                                                          (==>            /              
27 |                                                           (=>            /              
28 |              -_                                           //.           /               
29 |              \\\\-_                                        //   .         /               
30 |               \\ \\_-_                                     //     .       /               
31 |                \\_ \\_--_                                 //        . . . /               
32 |                  \\_ \\_ -_                              //              /                
33 |                    \\_ \\_ (O)-___                      //               /                
34 |                      \\ _\\   __  --__                  /                /                
35 |                      _/    \\  ----__--____          //                 /                
36 |                    _/  _/   \\       -------       //                  /                 
37 |                  _/ __/ \\\\   \\\\                  /                   /                  
38 |                _/ _/      \\\\   \\\\              //                   /                   
39 |               -__/          \\\\   \\\\\\          //                   /                    
40 |                               \\\\    \\\\\\\\\\\\\\\\\\//   -                /                    
41 |                                 \\\\         _/         -            /                    
42 |                                   \\\\                      -        \\                    
43 |                                     \\\\\\                       -     \\                   
44 |                                         \\\\                       -   \\                  
45 |                                           \\\\\\                         \\--__             
46 |                                            | \\\\                            \\__________  
47 |                                             |  \\\\\\\\                ___      _________-\\\\
48 |                                             |    \\\\\\\\\\                \\--__/____        
49 |                                             |        \\\\\\\\________---\\-    ______-----   
50 |                                              |                   /    \\--  \\_______     
51 |                                              |                   /       \\-_________\\   
52 |                                              \\                   /                  \\\\  
53 |                                              \\                 ./                       
54 |                                              \\            .     /                       
55 |                                               \\        .       /                        
56 |                                               \\    .           //                       
57 |                                               \\                /                        
58 |                                               |__              /                        
59 |                                               \\==              /                        
60 |                                                \\\\              \\                        
61 |                                                 \\\\  .          \\                        
62 |                                                   \\\\    .  .   \\                        
63 |                                                    \\           .\\                       
64 |                                                    \\\\            \\                      
65 |                                                      \\           \\                      
66 |                                                       \\\\          \\                     
67 |                                                         \\\\         \\                    
68 |                                                           \\         \\--                 
69 |                                                            \\\\          \\                
70 |                                                              \\\\         \\\\\\\\            
71 |                                                                \\\\\\\\_________\\\\\\         
72 | EOC
73 | 
74 | 


--------------------------------------------------------------------------------
/cows/weeping-angel.cow:
--------------------------------------------------------------------------------
  1 | #
  2 | # Weeping Angel
  3 | #
  4 | # Don't blink!
  5 | #
  6 | # based on design found at http://shirt.woot.com/derby/entry/73182/dont-blink
  7 | #   and http://infinitywave.deviantart.com/art/Don-t-Blink-tee-391963389
  8 | #
  9 | $the_cow = <I?+,-X:X.
 32 |    :,7..       , ...8X:XX.  XX                  .X ...  . .. .8XX:,-ZXX.              .7IXXX .  .+ODC8:\$II7:ZXX:
 33 |   .,=.      ..?.  ,8X\$XX=   .XX..               ..+..  .-..%77.XXX.\$XX .            . *IXXXX    :78DX8D08DN7-XXX.
 34 |   .:..       *-...-XXXXX.   .,XX..                8,...O..VVVVV XX:XX               . ZOX:XI  . =ID0X0XODOX:+\$XX..
 35 |   .:        .? . ,IX:X:X,    .:X=.                .\$ .N VV ....VVM+XX.              .=ZOXXX.  . IDO0X0X0D0X:0?XX?.
 36 |   ,         ...  :IXXXXXX- .....O.                 7- O...,I.Z.X.X:X,               .7\$:\$\$..   .OCO0X\$%DCOXXD\$7X>.
 37 |   -  ...    ?..  =+X:X:XXDX:XX+ .. . .            ., .I. .VVVVV  XX\$..              :.\$XXX     +DCXXX\$+%\$D8ZXXDXO+
 38 |   , .*...   .%7...,,,%%0%XXXXXXXXXXO-D\$7J0\$: ..-:.. ...W,XXXXX,-IXX                .:7XXXX    .CD88DCW..\$DX:X:XX?%
 39 |  .,.-%,-.   . ?7.  .. ..+%8XX:X:XX:X:X:NO\$DX..,XXX.. . ..XXDXXI\$XX .               .-O:XX     -CDOI8XX*.*DX:X:X7=%
 40 | .--.:\$.+ .     .I%       .:7XXXXXXXXXX    . . ....      ..*.-XDXX..               .-:XXX .   .=78CD8XX+  +IXXX>..Z
 41 |  ?=:=?.+.        .XX..      ...?8:XXXX-.           .    .:-Z+XX- ....... .       .+,DXX.    .7.,\$88DXX:  .:OD%..%O.
 42 |  ?+IO--+           -XX.  .        .-7O.    .              .\$\$.. .7.M.\$XXX:...   .++DZM.   ..I\$  .\$8DX7.,..  .. IXX..
 43 |  +??D,\$\$              .X8.       .        .*      .   . ..  ...*XX X,X:X-: ON?...,XIO     .-O\$.   .-. =O,. .  OXXX-.
 44 | .:?ID,Z7              .. ....:I-..        .      ...  .+..   :7 XXD. XX,:...+XXX-.,*..    .=\$?..  . .:O8.\$D7 .IXXX?
 45 |  ,+78:Z7 . ,*. ..*.           .....  .....D . ?+.     .:+.  -X+.XX7.8XZ.*.  ..+7XX,     ..*+:.  ... ,8:+.-D0..7XXX7.
 46 | .,=\$8I88   ,7  :XD-.  ....             +.:,...--|.. ..      7% CXZ..XX,.*.  ....+XX+.   ..:.    .\$O..DO,  8D+.-XXXX,
 47 |  :-\$X0XX ..,*. -DX,... 7... .           .X...::::::-O...    .  .. .7XX...  .,XX. 78-+:..        .OZ.-87   CD\$.7XXXX.
 48 | .--7O0XI.. :-O:ZM8...-*O.  -.           :% .::-,,::..:,::::--*+I88XXXD....X:X:XX.7XXXXX:        .8%7DO....-8O77DXXX,
 49 |  -=78XX.   .**%XX .   %7:..Z .          8. .:X7.::*,* :,,,::-:-*7\$DXX+.,.XXX?I+.7X:X:X.-X:      .-%%8O .  .8ODIDXXX,
 50 |  -=7IX8.    .*87.   ..\$O7-I\$..    -.    .... .. ....:,:O:,::-: .7IDXX ..XX..  .:X:... XXXXX.    ..=7+.    .=0D7CXXX:
 51 | .-+7IN..          . :..O\$7X,      =.  ..,.  ..   ...   O..7.::. ?.XXX,.  .      ..  .X:XZ08. . .          ..\$D8%XXX:
 52 | .-7II.            .+%. :77:.    .:..  . XD  .-  :...  .:. .   ..... ..          .-  ,X7...,X%.:            . DO8XXX,
 53 |  ,I* ,       -?:..8XX. . .....   ...   :XX...X .\$  , .?%: ,? ==7X7., .           D..? . .XXXXX:%...         ..%8DXX
 54 |  ..      ..  DOX .8XX..-..:==.:  . .   .X%  .X .% .%. XXO DX.D?\$X?               XX.  . 7XI.XX.. :.   ....    ..-?,.
 55 |         ... .DXX..8XX .?8-Z\$?..*.* .    X-  .X..7 7\$..XXX.DX+XXXX,   .        . .XX.  .  .  .XX...     .*.  ..  ..
 56 |   ....  :,:. IXX-.8XX .-XDXX- .++\$..  . X,  .X.%,.+% .XXX.\$XIDDDD. .=.  .. ...,8XO..        -XXXX ..    *...., .....
 57 |    ,,\$. -:*. -DXO+8X\$ .,ZXD7,  .:...  .,X.  .?.X- +-..XXX 7XOXXXXO. ..  .NXXXXXXXXX         87%:XX..    -..I7\$:.,-.
 58 |  . .DX,.-I% ..\$XX8DXI   *OI-..  ..    .XX   ..7X8.?,  XXX.\$DX:XXID     .XXXXXXX8.. ..       .+XXXXX+  ..,  \$XX..:?..
 59 |  . .8X-.-%8...*DO\$XX7   ......         XX   . XX .I.. XXD 7XX:XX?,     ,..              .8D\$X:XXXXXX   ... \$8X. ,I7.
 60 |     I8\$.-OXX..,\$D8XX... .  -,,....     XX.  ..X  .?:. ZXO -XX:X\$,:...                 .... :XX:IXXXX   ... %8X  .\$X.
 61 | ..  -8D.-O8X...-\$CX+ ..D,  -X7,-,.     XX   . 7. .I7 .7X\$ :X\$XX-.XXI .                .:: ..X:XXXXXX.. ,. .%XX  .CX:
 62 | ..  .CD.+OCX  . .,. .-.XO. ?8I,IX.  . :X7.  ...   78..8X-.+X+XX, XXD.     .     .:    ..*N= -XXXXXXD  .:. .OXN  .8XI
 63 |  .   78*COyX,       .8*XX  =8....   ..\$X..... .   XXI XX .XX.XX..?XX..7.  ?,    ..      ..?XXXXXXXX.  ,:. ,OX*  ,DX\$
 64 |  .  .%D7CO7X\$ . .... X7XX   ..        XX . ..   ..XX\$ X8  XX.XX...XXX%8   %-              .. .=\$XX..  ,:. :ZX   :DX%
 65 | .... +XO8O7XD ...+.  X8XX.          .:X.  .7-    ,XX\$.D= .XX 8X   DXX\$X:  XD.                         .-,.*OX.  =DX%
 66 |  .,. .XD8O\$XX  ,,\$:. OXXX-          .XX.  .D?.  .XXX:-8. +XX DX:   XX7X\$  XX                          .=-IZXD   +DX8 .
 67 |  ::.  XXXXZX\$  .,\$D  7XDXI          OX... O8?   .XXX.%8  IXX ZXI   ZX7XD. DX.             ..   .      .=+Z\$X=   7DX%
 68 | .-:.  IXXN7X. ..:IX. 7DNK\$        ..XZ  .\$XX- ..OXX8 %Z  7XX.-XX ..+XDXX+.7X-.           :+   .D      .-*\$+X... %DX%
 69 | .*,,. .XXDIX, ..??X. IDXXI        .XX   .XX8,  :XXX  %% .=DX..XX.. .XX:X8 .XX.           .=.  .X      ..+??X  ..%DX?
 70 | .+*-  .OX7?%. .:%77\$.7DXX         -X7.  XXX+...XXX:. ZO...DX\$.OXX  .+X\$XX,.XX,          ....  ,X       .-8\$.  .-OXX+
 71 |  *I*,. .8+ZI  .=D+XX ,8XX.        XX. .8XX%...7XX7...%X   8XX .XXX  .X\$XX\$.XXX..              -X      . -X. ..?+DXX:.
 72 |  =O7%:. :-I  ..*O+XX  I8,.       .XI. .XX%.. -XXD   .:X:  .XX* ZXXZ..\$X7XD.:XX7.              ?8        .-...I8\$XXX..
 73 |  -X\$O%:    .,..=7-XX. .,..      .*X   .OD.  .:+%..   *XD  .8X- .7XX..XX..II +CO               -.     ..   .,%XODXXX...
 74 |  :XOOX-.  ..?..:I:XX..                 .\$,  .:.     ..,:  .I?,. +8?..\$%.  . ..,.            . ,.    .?..   =XX:XXXX
 75 |  .XXXD=    ,O. .I.\$M=                    .     .     ...  ......-....,..     ..             ..X=     X .   -DXX8XXX
 76 |  .XXX8*.  ,,\$:. .?+XX                                               .                        =N?..   D     :OXD8XXX
 77 |   %XXXI.  ,,7\$. +I78N.            ...                                                        ID?.   .I    ..%X8CXX+
 78 |   +ICOI   .,:Z- .-XXD.            .,..                                    ..                 7D*..  ..      \$D\$ZDD..
 79 |   ,IOO+.  ,::Z7..7\$\$D              ,.. .                                  .@.                -O\$.:  7.     .78OZ8D..
 80 |   .888..  ,-:7O+.7778.            .,.  I .     ..      ....     ...:..  . OO..               .--*:. 7.. .   :%XZ8.
 81 | .,.:%I..  ,+:?O?.=I7\$.             .   .      ....... . ::    , .*7%..  :.OO=.               ..-+..,?.. .   .I?OI.
 82 |     .     ,7:=\$7,,II7.            ..  ..   .. .-    ..  +7.   :  77\$.-..? %%+                 .7\$. +=:,..   .,..
 83 |           .+::7Z7.:I+.            ..  :.    .. -* .. \$  I\$ .  -,.I\$7 =  7.XXI                 .*...*,,.... .    .
 84 |         . .-*:I\$?..*.              .  *.    .  -7.. .7. I\$.,  :-.7\$7.=  7-\$\$7                ..    .,- .  ..  ...
 85 |     . ...  :7:777. .                  -.    +- +7.   7..7\$+ ..?.?77  =  7+777                 .. ..7?I....-   .. .
 86 |     = .....,7:-7I-.                   -.    II =I:   :?.?I7   ?.?II. = .I?7::                   ..+--?.. -*,  .=?
 87 |     ,,..,. ,**,I?I..              .   ,.   .II :*?.   ?.??I.. ?.:?I. - .I?II?                   . ,:*?-. ==I..=I?.
 88 |     .=...+ .*+,-??.*              .   .:.   +7:.-7.  .+,+??:..*:.+7. :. 7777+                   .,7+++7. -+,.-=7*.
 89 |     .=...*. :=:,++:.  .           .   .:. .. =+=.-*: .=*=**= .:-.**, ,..*****.                  .,:=*=*.,:*..***=.
 90 |     .....-. ,*-,===.              .   .:  .  ,== :-*. .,*,*+*. .-.** :  -****.                   ,:**:*.,:+..*+*:
 91 |     .. .... .:-:=== .             .   .:     .*: ,:*.  .*,--*,  -.-***  :****,                   .:---: ,:-..-**,
 92 | .   ..    .. ,--:-- .             .    ,     .-: .,-,.  -::--,..:,---:, .----:                   .:=:=. .::.,===.
 93 |        :-::. .::::- .             ..   .     .::  ,:-   .::--:, ,,,;:.  .---::                   .,:.: ..:,.::-:.
 94 |      ,..,,,.  ,::::                .   .     .,,  ,,:.  .:,:::,..,.:::. .:::::                   .,,,, ..,.,::::
 95 |         ,,,,  .,,,,                .   ..     .,  .,:,   ,,:,,,. ,.,,,.  .:,,,                    ..,.. ...,,:,,
 96 |     ,,...,,,   ,,,.                    .      .,. .,,,   .,,,,,. ,.,,,.. .,,,,                    .    .,,.,,,,.
 97 |      .,......  ...                     .      ...  ,,,   .,,,,,. ...,,,. .,,,,                          ...,.,,.
 98 |       ,......  ...                  .  ...     ..  .....  .................,.,.                           ...,.
 99 |       .......   .                        .     ... ....   ....... ....... .....                      ...........
100 |       ... ....                          ..     ...  ...   ....... .............                        ........
101 |        .......                          ...     ..  ...    ...... .............                       ........
102 |         ......                          ...     ...  ...   ... ..  ............                         ......
103 |         .....                           ....      .   .      ....  ............                        .... .
104 |         .. ...                       .. . ..           ..       .   . .... .. ..                       ....
105 |            . .                          . .       ..   ...   ...      ... ....                          .  .
106 |            .                              .       ..          .       .  .   ..
107 |              .                           .                    . .    ..    . .                             .
108 | EOC
109 | 


--------------------------------------------------------------------------------
/browser.js:
--------------------------------------------------------------------------------
  1 | import balloon from "./lib/balloon";
  2 | import replacer from "./lib/replacer";
  3 | import faces from "./lib/faces";
  4 | 
  5 | import DEFAULT_COW from './cows/default.cow';
  6 | 
  7 | export { default as ACKBAR } from './cows/ackbar.cow';
  8 | export { default as APERTURE_BLANK } from './cows/aperture-blank.cow';
  9 | export { default as APERTURE } from './cows/aperture.cow';
 10 | export { default as ARMADILLO } from './cows/armadillo.cow';
 11 | export { default as ATAT } from './cows/atat.cow';
 12 | export { default as ATOM } from './cows/atom.cow';
 13 | export { default as AWESOME_FACE } from './cows/awesome-face.cow';
 14 | export { default as BANANA } from './cows/banana.cow';
 15 | export { default as BEARFACE } from './cows/bearface.cow';
 16 | export { default as BEAVIS_ZEN } from './cows/beavis.zen.cow';
 17 | export { default as BEES } from './cows/bees.cow';
 18 | export { default as BILL_THE_CAT } from './cows/bill-the-cat.cow';
 19 | export { default as BIOHAZARD } from './cows/biohazard.cow';
 20 | export { default as BISHOP } from './cows/bishop.cow';
 21 | export { default as BLACK_MESA } from './cows/black-mesa.cow';
 22 | export { default as BONG } from './cows/bong.cow';
 23 | export { default as BOX } from './cows/box.cow';
 24 | export { default as BROKEN_HEART } from './cows/broken-heart.cow';
 25 | export { default as BUD_FROGS } from './cows/bud-frogs.cow';
 26 | export { default as BUNNY } from './cows/bunny.cow';
 27 | export { default as C3PO } from './cows/C3PO.cow';
 28 | export { default as CAKE } from './cows/cake.cow';
 29 | export { default as CAKE_WITH_CANDLES } from './cows/cake-with-candles.cow';
 30 | export { default as CAT2 } from './cows/cat2.cow';
 31 | export { default as CAT } from './cows/cat.cow';
 32 | export { default as CATFENCE } from './cows/catfence.cow';
 33 | export { default as CHARIZARDVICE } from './cows/charizardvice.cow';
 34 | export { default as CHARLIE } from './cows/charlie.cow';
 35 | export { default as CHEESE } from './cows/cheese.cow';
 36 | export { default as CHESSMEN } from './cows/chessmen.cow';
 37 | export { default as CHITO } from './cows/chito.cow';
 38 | export { default as CLAW_ARM } from './cows/claw-arm.cow';
 39 | export { default as CLIPPY } from './cows/clippy.cow';
 40 | export { default as COMPANION_CUBE } from './cows/companion-cube.cow';
 41 | export { default as COWER } from './cows/cower.cow';
 42 | export { default as COWFEE } from './cows/cowfee.cow';
 43 | export { default as CTHULHU_MINI } from './cows/cthulhu-mini.cow';
 44 | export { default as CUBE } from './cows/cube.cow';
 45 | export { default as DAEMON } from './cows/daemon.cow';
 46 | export { default as DALEK } from './cows/dalek.cow';
 47 | export { default as DALEK_SHOOTING } from './cows/dalek-shooting.cow';
 48 | export { default as DEFAULT } from './cows/default.cow';
 49 | export { default as DOCKER_WHALE } from './cows/docker-whale.cow';
 50 | export { default as DOGE } from './cows/doge.cow';
 51 | export { default as DOLPHIN } from './cows/dolphin.cow';
 52 | export { default as DRAGON_AND_COW } from './cows/dragon-and-cow.cow';
 53 | export { default as DRAGON } from './cows/dragon.cow';
 54 | export { default as EBI_FURAI } from './cows/ebi_furai.cow';
 55 | export { default as ELEPHANT2 } from './cows/elephant2.cow';
 56 | export { default as ELEPHANT } from './cows/elephant.cow';
 57 | export { default as ELEPHANT_IN_SNAKE } from './cows/elephant-in-snake.cow';
 58 | export { default as EXPLOSION } from './cows/explosion.cow';
 59 | export { default as EYES } from './cows/eyes.cow';
 60 | export { default as FAT_BANANA } from './cows/fat-banana.cow';
 61 | export { default as FAT_COW } from './cows/fat-cow.cow';
 62 | export { default as FENCE } from './cows/fence.cow';
 63 | export { default as FIRE } from './cows/fire.cow';
 64 | export { default as FLAMING_SHEEP } from './cows/flaming-sheep.cow';
 65 | export { default as FOX } from './cows/fox.cow';
 66 | export { default as GHOSTBUSTERS } from './cows/ghostbusters.cow';
 67 | export { default as GHOST } from './cows/ghost.cow';
 68 | export { default as GLADOS } from './cows/glados.cow';
 69 | export { default as GOAT2 } from './cows/goat2.cow';
 70 | export { default as GOAT } from './cows/goat.cow';
 71 | export { default as GOLDEN_EAGLE } from './cows/golden-eagle.cow';
 72 | export { default as HAND } from './cows/hand.cow';
 73 | export { default as HAPPY_WHALE } from './cows/happy-whale.cow';
 74 | export { default as HEDGEHOG } from './cows/hedgehog.cow';
 75 | export { default as HELLOKITTY } from './cows/hellokitty.cow';
 76 | export { default as HIPPIE } from './cows/hippie.cow';
 77 | export { default as HIYA } from './cows/hiya.cow';
 78 | export { default as HIYOKO } from './cows/hiyoko.cow';
 79 | export { default as HOMER } from './cows/homer.cow';
 80 | export { default as HYPNO } from './cows/hypno.cow';
 81 | export { default as IBM } from './cows/ibm.cow';
 82 | export { default as IWASHI } from './cows/iwashi.cow';
 83 | export { default as JELLYFISH } from './cows/jellyfish.cow';
 84 | export { default as KARL_MARX } from './cows/karl_marx.cow';
 85 | export { default as KILROY } from './cows/kilroy.cow';
 86 | export { default as KING } from './cows/king.cow';
 87 | export { default as KISS } from './cows/kiss.cow';
 88 | export { default as KITTEN } from './cows/kitten.cow';
 89 | export { default as KITTY } from './cows/kitty.cow';
 90 | export { default as KNIGHT } from './cows/knight.cow';
 91 | export { default as KOALA } from './cows/koala.cow';
 92 | export { default as KOSH } from './cows/kosh.cow';
 93 | export { default as LAMB2 } from './cows/lamb2.cow';
 94 | export { default as LAMB } from './cows/lamb.cow';
 95 | export { default as LIGHTBULB } from './cows/lightbulb.cow';
 96 | export { default as LOBSTER } from './cows/lobster.cow';
 97 | export { default as LOLLERSKATES } from './cows/lollerskates.cow';
 98 | export { default as LUKE_KOALA } from './cows/luke-koala.cow';
 99 | export { default as MAILCHIMP } from './cows/mailchimp.cow';
100 | export { default as MAZE_RUNNER } from './cows/maze-runner.cow';
101 | export { default as MECH_AND_COW } from './cows/mech-and-cow.cow';
102 | export { default as MEOW } from './cows/meow.cow';
103 | export { default as MILK } from './cows/milk.cow';
104 | export { default as MINOTAUR } from './cows/minotaur.cow';
105 | export { default as MONA_LISA } from './cows/mona-lisa.cow';
106 | export { default as MOOFASA } from './cows/moofasa.cow';
107 | export { default as MOOGHIDJIRAH } from './cows/mooghidjirah.cow';
108 | export { default as MOOJIRA } from './cows/moojira.cow';
109 | export { default as MOOSE } from './cows/moose.cow';
110 | export { default as MULE } from './cows/mule.cow';
111 | export { default as MUTILATED } from './cows/mutilated.cow';
112 | export { default as NYAN } from './cows/nyan.cow';
113 | export { default as OCTOPUS } from './cows/octopus.cow';
114 | export { default as OKAZU } from './cows/okazu.cow';
115 | export { default as OWL } from './cows/owl.cow';
116 | export { default as PAWN } from './cows/pawn.cow';
117 | export { default as PERIODIC_TABLE } from './cows/periodic-table.cow';
118 | export { default as PERSONALITY_SPHERE } from './cows/personality-sphere.cow';
119 | export { default as PINBALL_MACHINE } from './cows/pinball-machine.cow';
120 | export { default as PSYCHIATRICHELP2 } from './cows/psychiatrichelp2.cow';
121 | export { default as PSYCHIATRICHELP } from './cows/psychiatrichelp.cow';
122 | export { default as PTERODACTYL } from './cows/pterodactyl.cow';
123 | export { default as QUEEN } from './cows/queen.cow';
124 | export { default as R2_D2 } from './cows/R2-D2.cow';
125 | export { default as RADIO } from './cows/radio.cow';
126 | export { default as REN } from './cows/ren.cow';
127 | export { default as RENGE } from './cows/renge.cow';
128 | export { default as ROBOT } from './cows/robot.cow';
129 | export { default as ROBOTFINDSKITTEN } from './cows/robotfindskitten.cow';
130 | export { default as ROFLCOPTER } from './cows/roflcopter.cow';
131 | export { default as ROOK } from './cows/rook.cow';
132 | export { default as SACHIKO } from './cows/sachiko.cow';
133 | export { default as SATANIC } from './cows/satanic.cow';
134 | export { default as SEAHORSE_BIG } from './cows/seahorse-big.cow';
135 | export { default as SEAHORSE } from './cows/seahorse.cow';
136 | export { default as SHEEP } from './cows/sheep.cow';
137 | export { default as SHIKATO } from './cows/shikato.cow';
138 | export { default as SHRUG } from './cows/shrug.cow';
139 | export { default as SKELETON } from './cows/skeleton.cow';
140 | export { default as SMALL } from './cows/small.cow';
141 | export { default as SMILING_OCTOPUS } from './cows/smiling-octopus.cow';
142 | export { default as SNOOPY } from './cows/snoopy.cow';
143 | export { default as SNOOPYHOUSE } from './cows/snoopyhouse.cow';
144 | export { default as SNOOPYSLEEP } from './cows/snoopysleep.cow';
145 | export { default as SPIDERCOW } from './cows/spidercow.cow';
146 | export { default as SQUID } from './cows/squid.cow';
147 | export { default as SQUIRREL } from './cows/squirrel.cow';
148 | export { default as STEGOSAURUS } from './cows/stegosaurus.cow';
149 | export { default as STIMPY } from './cows/stimpy.cow';
150 | export { default as SUDOWOODO } from './cows/sudowoodo.cow';
151 | export { default as SUPERMILKER } from './cows/supermilker.cow';
152 | export { default as SURGERY } from './cows/surgery.cow';
153 | export { default as TABLEFLIP } from './cows/tableflip.cow';
154 | export { default as TAXI } from './cows/taxi.cow';
155 | export { default as TELEBEARS } from './cows/telebears.cow';
156 | export { default as TEMPLATE } from './cows/template.cow';
157 | export { default as THREADER } from './cows/threader.cow';
158 | export { default as THREECUBES } from './cows/threecubes.cow';
159 | export { default as TOASTER } from './cows/toaster.cow';
160 | export { default as TORTOISE } from './cows/tortoise.cow';
161 | export { default as TURKEY } from './cows/turkey.cow';
162 | export { default as TURTLE } from './cows/turtle.cow';
163 | export { default as TUX_BIG } from './cows/tux-big.cow';
164 | export { default as TUX } from './cows/tux.cow';
165 | export { default as TWEETY_BIRD } from './cows/tweety-bird.cow';
166 | export { default as USA } from './cows/USA.cow';
167 | export { default as VADER } from './cows/vader.cow';
168 | export { default as VADER_KOALA } from './cows/vader-koala.cow';
169 | export { default as WEEPING_ANGEL } from './cows/weeping-angel.cow';
170 | export { default as WHALE } from './cows/whale.cow';
171 | export { default as WIZARD } from './cows/wizard.cow';
172 | export { default as WOOD } from './cows/wood.cow';
173 | export { default as WORLD } from './cows/world.cow';
174 | export { default as WWW } from './cows/www.cow';
175 | export { default as YASUNA_01 } from './cows/yasuna_01.cow';
176 | export { default as YASUNA_02 } from './cows/yasuna_02.cow';
177 | export { default as YASUNA_03A } from './cows/yasuna_03a.cow';
178 | export { default as YASUNA_03 } from './cows/yasuna_03.cow';
179 | export { default as YASUNA_04 } from './cows/yasuna_04.cow';
180 | export { default as YASUNA_05 } from './cows/yasuna_05.cow';
181 | export { default as YASUNA_06 } from './cows/yasuna_06.cow';
182 | export { default as YASUNA_07 } from './cows/yasuna_07.cow';
183 | export { default as YASUNA_08 } from './cows/yasuna_08.cow';
184 | export { default as YASUNA_09 } from './cows/yasuna_09.cow';
185 | export { default as YASUNA_10 } from './cows/yasuna_10.cow';
186 | export { default as YASUNA_11 } from './cows/yasuna_11.cow';
187 | export { default as YASUNA_12 } from './cows/yasuna_12.cow';
188 | export { default as YASUNA_13 } from './cows/yasuna_13.cow';
189 | export { default as YASUNA_14 } from './cows/yasuna_14.cow';
190 | export { default as YASUNA_16 } from './cows/yasuna_16.cow';
191 | export { default as YASUNA_17 } from './cows/yasuna_17.cow';
192 | export { default as YASUNA_18 } from './cows/yasuna_18.cow';
193 | export { default as YASUNA_19 } from './cows/yasuna_19.cow';
194 | export { default as YASUNA_20 } from './cows/yasuna_20.cow';
195 | export { default as YMD_UDON } from './cows/ymd_udon.cow';
196 | export { default as ZEN_NOH_MILK } from './cows/zen-noh-milk.cow';
197 | 
198 | function convertToCliOptions(browserOptions) {
199 |   const cliOptions = {
200 |     e: browserOptions.eyes || 'oo',
201 |     T: browserOptions.tongue || '  ',
202 |     n: browserOptions.wrap,
203 |     W: browserOptions.wrapLength || 40,
204 |     text: browserOptions.text || '',
205 |     _: browserOptions.text || [],
206 |     f: browserOptions.cow,
207 |   };
208 |   if (browserOptions.mode) {
209 |     // converts mode: 'b' to b: true
210 |     cliOptions[browserOptions.mode] = true;
211 |   }
212 |   return cliOptions;
213 | }
214 | 
215 | function doIt (options, sayAloud) {
216 |   const cow = options.f || DEFAULT_COW;
217 | 	const face = faces(options);
218 | 	face.thoughts = sayAloud ? "\\" : "o";
219 | 
220 | 	const action = sayAloud ? "say" : "think";
221 | 	return balloon[action](options.text || options._.join(" "), options.n ? null : options.W) + "\n" + replacer(cow, face);
222 | }
223 | 
224 | export function say(browserOptions) {
225 |   return doIt(convertToCliOptions(browserOptions), true);
226 | }
227 | 
228 | export function think(browserOptions) {
229 |   return doIt(convertToCliOptions(browserOptions), false);
230 | }
231 | 


--------------------------------------------------------------------------------