Acme-EyeDrops-1.61/xBuild.PL100644 52 52 2233 11753373723 15203 0ustar00arthurdent 0 0 # The .eye files under lib/Acme are treated essentially the same # as .pm files. use strict; use Module::Build; print <<'CAMEL_GREETING'; ###### ##### ######### ########## ########### ########## ############# ####### ################ ######## ################### ####### ##################### ############################# ############################# ############################## ############################# ######################### ## ## ############### #### ## #### ######## ### # ### #### ### ### ### ##### ## ## ### #### ## ## ## # ## ## ## # # # ## # # # # ### # # ## ## # ## #### # ## #### #### CAMEL_GREETING my $m = Module::Build->new( module_name => 'Acme::EyeDrops', license => 'perl', requires => { 'perl' => '5.006' }, build_requires => { 'Module::Build' => 0.26 } ); $m->add_build_element('eye'); $m->add_build_element('eyp'); $m->create_build_script; Acme-EyeDrops-1.61/Changes100644 52 52 42135 12146374364 15036 0ustar00arthurdent 0 0 Revision history for Perl extension EyeDrops 0.01 Sun Sep 23 11:35:12 2001 - original version 0.02 Tue Sep 25 18:05:02 2001 - updated version number :-) - improved documentation - new functions: get_builtin_shapes, get_eye_shapes - extra tests added 0.03 Sun Sep 30 14:07:03 2001 - fixed die within eval with new TrapEvalDie attribute - new test t/nasty.t added to test TrapEvalDie - fixed SIG warnings with new TrapWarn attribute - improved filler: added $_ to $: - changed encoding from octal (%o) to hex (%x) for chars in range 128..255; this reduces binary encoding size - minor performance improvements - minor shape improvements 0.04 Sun Oct 7 11:31:42 2001 - minor improvements to documentation - new tests t/recur.t and t/limit.t - crude test for END block added 0.05 Sun Oct 14 17:19:42 2001 - minor fixes to demo/sightly.pl - new shape: spoon - minor improvements to documentation 1.00 Sat Nov 10 15:12:11 2001 - new shapes: larry, damian, cricket, mongers - new functions: border_shape, invert_shape, rotate_shape - new attributes: Rotate, Invert, BorderGap, BorderWidth - documentation improvements 1.01 Sun Nov 11 11:10:09 2001 - new shape from Ryan King: larry2 - minor improvements to documentation 1.02 Sun Dec 9 17:11:42 2001 - minor improvements to documentation - minor enhancements to demo/sightly.pl - left-justified spoon.eye - changed parameters to border_shape function - new attributes: BorderGapLeft, BorderGapRight etc. - BorderWidthLeft, BorderWidthRight etc. - new attribute: Indent - new attribute: Reflect - new attribute: FillerVar - new shape: merlyn - fixed module bug raised by Mark Puttnam - added new test program module.t to test Mark's bug 1.03 Sat Dec 15 18:42:09 2001 - minor improvements to documentation - new shapes: golfer, santa and buffy2 1.04 Sat Jan 5 14:15:15 2002 - minor improvements to documentation - minor fixes to shape: buffy2 - new shape: camel2 (use.perl.org camel) - new shape: camel3 (London.pm bactrian camel at London zoo) - new shape: dipsy (London.pm infobot is called dipsy) - new shape: buffy3 (buffy riding a pony) 1.05 Sun Jan 6 17:09:35 2002 - minor improvements to documentation - minor fixes to shape: buffy3 - new shape: buffy4 (horizontal banner of "Buffy") - new shape: riding (banner of "riding") - new shape: a (banner of "a") - new shape: pony (banner of "Pony") 1.06 Sun Feb 24 23:09:35 2002 - minor improvements to documentation - minor code improvements - minor fixes to shape: pony, buffy2 - new shape: london - new shape: pony2 - new shape: eugene - new shape: tpr 1.07 Sun Mar 31 15:12:17 2002 - improved documentation, added Buffy looking in the mirror - fixed EyeDrops.pm to work with Perl 5.7.3 only needed to change: $src =~ tr#\\[]{}<>^_|~'`#/()()()H-!T""#; to: $src =~ tr#_\\[]{}<>^|~'`#-/()()()H!T""#; due to 'invalid range' H-! error - minor change to shapes: damian, camel - new shape: kermit (thanks Jason) - new shape: pgolf (thanks `/anick) - fixed bug where EyeDrops sometimes generated an invalid program or more shapes than it needed to - new test: limit2.t to verify above bug fixed - new test: sightly2.t - made sure test programs clean up all .tmp files - added -Mstrict to all test programs to ensure they work with -w and 'use strict' too - localised file globals appropriately in all test programs - tested under Win98 and adjusted nasty.t accordingly 1.08 Sun Apr 21 16:13:18 2002 - documentation: added sub-sections to Examples section - documentation: added 'Dueling Dingos' sub-section - minor change to shape: pgolf - new shape: eye - new shape: mosquito - new shape: coffee - new shape: yanick - new shape: yanick2 - new shape: yanick3 1.09 Sun May 19 17:09:12 2002 - new attributes: Reduce and Expand - new attributes: RotateType and RotateFlip - new functions: reduce_shape and expand_shape - new rtype/flip parameters added to rotate_shape function - rotate 90 and 270 now work, no longer squashed - added support for new attributes to demo/sightly.pl - new test: reshape.t (tests Reduce, Expand, Rotate) - new test: camel.t - documentation: added 'Thirty Two Camels' sub-section - minor change to shape yanick (identical dimensions to camel now) 1.10 Wed May 29 19:08:11 2002 - new attribute: Compact - function pour_sightly: added new compact parameter - added support for Compact attribute to demo/sightly.pl - test camel.t: enhanced with Compact tests - documentation: increased from 'Thirty Two Camels' to 'Twelve Thousand and Thirty Two Camels' - documentation: improved 'Buffy Looking in the Mirror' 1.11 Sun Jun 30 11:02:09 2002 - new shape: alien - documentation: minor improvements - documentation: added 'Somersaulting Camels' section 1.12 Sun Aug 4 14:17:01 2002 - new shape: llama - new shape: parrot - new shape: simon - new shape: jon - new shape: yanick4 - new shape: tonick - documentation: minor changes - documentation: added 'Abbreviated History of Perl 6' section 1.13 Sun Sep 15 17:05:09 2002 - new shape: siertri - new shape: undies - minor change to shape: simon - documentation: minor changes - documentation: added 'Sierpinski Triangles' section 1.14 Sun Sep 22 18:42:14 2002 - converted siertri shape to a built-in (removed siertri.eye) - documentation: retracted claim that Mtv's Sierpinski program is the shortest (thankyou Adam and Eugene) - documentation: minor changes 1.15 Sun Oct 6 19:31:14 2002 - new shape: acme - code: minor changes - documentation: minor changes 1.16 Sun Nov 3 19:31:14 2002 - new shape: schwern - new shape: naw - new shape: gelly - minor change to shape: acme - documentation: minor changes - documentation: added 'Naked Arm Wrestling' section 1.17 Sun Dec 8 12:21:04 2002 - new shape from cam.pm: snow - new program to generate table: demo/gentable.pl - fixed bug where EyeDrops sometimes generated an invalid program - extended limit2.t (test 9) to verify above bug fixed - minor code improvements 1.18 Sun Dec 22 13:25:12 2002 - new shape from Takanori KAWAI: kansai_pm - new shape from Takanori KAWAI: writing_perl - new shape derived from Yanni's Ascii Art collection: candle - new shape derived from Yanni's Ascii Art collection: china1 - new shape derived from Yanni's Ascii Art collection: panda - new shape derived from Yanni's Ascii Art collection: santa2 - minor code improvements 1.19 Sun Jan 5 15:09:04 2003 - new shape from cam.pm: beer - new shape: campm - minor change to shape: candle - minor change to shape: china1 - documentation: minor changes - minor code improvements 1.20 Sun Jan 12 12:21:55 2003 - documentation: added 'EyeDropping EyeDrops.pm' section - minor code improvements 1.21 Sun Jan 19 14:01:12 2003 - documentation: minor changes - minor code improvements 1.30 Sun Feb 23 17:19:04 2003 - new function: pour_text - new attributes: Text, TextFiller - added support for new attributes to demo/sightly.pl - new test: text.t - documentation: added 'Snowflakes' section - minor code improvements 1.31 Sun Mar 30 18:16:14 2003 - FillerVar attribute: allow a simple string as an alternative to a reference to filler variables - limit.t, sightly.t: new test cases added - added file: demo/hellotest.pl - minor code improvements 1.32 Sun Apr 13 15:09:17 2003 - added Build.PL and adjusted Makefile.PL (thanks Ken) - added META.yml - new function: get_eye_string - documentation: make_triangle, make_siertri, make_banner - convert.t, sightly.t: new test cases added 1.33 Sat May 3 11:19:27 2003 - new shape: baghdad - documentation: added 'Baghdad Bob' section 1.34 Sun June 8 23:42:05 2003 - documentation: added '99 Bottles of Beer' section - new shapes: bottle, bottle2 - new function: hjoin_shapes - new attributes: TrailingSpaces, RemoveNewlines - added support for new attributes to demo/sightly.pl - function make_banner: strip leading spaces if any - new test: vshape.t - reshape.t, sightly2.t: new test cases added 1.35 Sun June 15 09:09:59 2003 - new shape: heart (thanks `/anick) - new shape: rose - test vshape.t: fixed Linux-only banner test - Build.PL: fixed for Module::Build v0.19 1.40 Sun June 29 11:19:33 2003 - There were getting to be too many .eye files cluttering the vitally important Acme root directory, so I moved them from Acme directory to Acme/EyeDrops directory (if you have installed a previous version of Acme::EyeDrops, suggest you delete old .eye files in the Acme root directory) - new shape: flag_canada (to mark Canada day, thanks `/anick) - new shape: map_australia - new shape: hipowls - new built-in shape: all - minor change to shape: rose - removed demo/helloworld.pl from distribution - removed demo/hellotest.pl from distribution - removed demo/examples.pl from distribution - updated test programs to not rely on demo directory 1.41 Sun July 27 18:22:04 2003 - new shapes: smiley, smiley2, smiley3 - built-in shape 'all': now supports Width parameter - documentation: shortened some examples - new functions: get_eye_dir, set_eye_dir - new functions: add_builtin_shape, del_builtin_shape - new attribute: InformHandler - function pour_sightly: added new inform_handler parameter - new tests: border.t, gen.t, yharn.t, zgen.t (generated) - sightly2.t removed (put into sightly.t) - test vshape.t: added tests for new functions - tests: now skipped correctly - tests: text.t now run in taint mode (-Tw) - Fixed some minor border-related bugs exposed by border.t - added camel shape to Makefile.PL/Build.PL - Support PERL_SMOKE environment variable for long-running tests (see http://archive.develooper.com/perl-qa@perl.org/msg01927.html, thanks merlyn) 1.42 Sun Aug 3 12:02:08 2003 - Bug fix release for Perl 5.8.1 (see Perl bug #23143). - For the first time, the EyeDrops test suite uncovered a Perl bug (dance a little jig): recur.t, test 4 failed on Perl 5.8.1-RC2 with the error: panic: pad_free curpad. Thanks merlyn for reporting. Since this bug won't be fixed for 5.8.1, we workaround it by never using $_ as a filler variable - sightly.t: run generated test programs in taint mode - tests: renamed to more appropriate names - tests: new long running test 13_to.t - documentation: added "Getting Started" section - documentation: fixed program in "Naked Arm Wrestling" section - documentation: updated 'Abbreviated History of Perl 6' section 1.43 Sun Aug 31 17:12:55 2003 - new shapes: alpaca, bighorn, map_italy - removed functions set_eye_dir, add_builtin_shape, del_builtin_shape which were mistakenly added to version 1.41 (these are not really necessary and change module state, which is a Bad Thing) - documentation: added 'twang bra-strap' to acme shape description - tests: merged old 13_to.t, old 12_Beer.t to new 19_surrounds.t new Test::Pod test, 18_sky.t 11_bold.t now tested in taint mode (no banner test) 12_Beer.t now banner test only (not taint safe) 1.44 Sun Apr 25 19:07:41 2004 - Bug fix release for Perl 5.8.4: some of the tests broke because they were naughtily exploiting a Perl bug re use strict inside (?{...}) constructions in regexps (see 01_mug.t/05_Parrot.t) - new shapes: map_world1, map_world2, map_world3, map_japan, map_uk - new shapes: music, dan, bottle3 - Build.PL: fixed for Module::Build v0.24 (_find_file_by_type changed) - new attribute: SourceHandle - new test: 14_gulp.t tests SourceHandle (and other invalid attributes) - minor code improvements (removed $this_dir, check for invalid attrs in sightly(), allow SourceFile/SourceString of '0') - documentation: updated stale URL links 1.45 Mon Dec 27 17:15:04 2004 - new shape: halloween (thanks TheEnigma) - new shape: koaladile (thanks Schwern) - new shape: saturn - renamed function slurp_tfile() to _slurp_tfile() - regenerated zgen.t (gen.t changed due to slurp_tfile() change) (regenerated it with: perl -w -I lib t/gen.t generate) - pod coverage: documented slurp_yerself() - tests: improved the ugly test suite a little new test: 16_astride.t simple threads test new test: 17_Orange.t tests pod coverage split 00_Coffee.t into two (last bit is now 15_Buffy.t) added slurp_yerself() tests to 13_to.t added Regex => 0 tests to 05_Parrot.t exercise regex_binmode_print_sightly() in 05_Parrot.t new tests added to 05_Parrot.t/06_not.t/10_Ponie.t et al in response to gaping holes detected by Devel::Cover removed exit 0 from end of tests - documentation: added new Error Handling section - Devel::Cover results: stmt branch cond sub pod total 95.2 91.3 90.8 100.0 100.0 93.5 1.46 Sat May 14 23:21:04 2005 - new shape: pugs - new shape: pugs2 - minor code improvements (limited scope of %builtin_shapes) - tests: fixed Test::More dependency in 17_Orange.t simplified 18_sky.t (Test::Pod) added invalid shape test to 14_gulp.t 1.47 Sat May 21 19:15:33 2005 - new shape: autrijus - documentation: updated 'Abbreviated History of Perl 6' section - tests: added new test to 05_Parrot.t - Build.PL: simplified for Module::Build 0.26 and above - Temporarily renamed Build.PL to xBuild.PL to stop CPAN tester robots from using Build.PL (got a lot of unexplained failures with v1.46, yet they worked fine when installed manually) 1.50 Sat August 6 23:08:42 2005 - First attempt at "shape properties" -- note that these are experimental and subject to change in future releases - Added new .eyp (properties) files for all .eye shapes - new functions: get_eye_properties find_eye_shapes get_eye_keywords - new internal functions: _get_properties _get_eye_shapes _get_eye_string _get_eye_properties _find_eye_shapes _get_eye_keywords - new attribute: EyeDir - documentation: added 'Shape Properties' section - new program: demo/findshapes.pl - tests: added property tests to 13_to.t - tests: adjusted 19_surrounds.t for .eyp files - new shape: schwern2 (shape schwern without the banner) 1.51 Sun September 11 23:17:33 2005 - new shape: adrianh - minor enhancements to demo/findshapes.pl - tests: improved property tests in 13_to.t - tests: added InformHandler throw test to 07_a.t - minor code improvements 1.52 Sun February 3 20:12:42 2008 - Bug fix release for Perl 5.10.0 - Yay, the EyeDrops test suite uncovers another perl bug. :-) 02_shatters.t (tests 2-4) and 09_Gallop.t (tests 3-6) both failed on Perl 5.10.0 with "Out of memory!". Workaround for now by commenting out these tests. Need to investigate further and perlbug to P5P. - new shape: jon_oxer (thanks pjf) - fixed META.yml to comply with its latest spec (1.3) at http://module-build.sourceforge.net/META-spec-current.html 1.53 Wed July 16 18:17:16 2008 - new shape: debian (thanks Richard Hartmann) - new shape property keyword: debian - CPAN testers report occasional failures in test 01_mug on Perl 5.10.0 with "Out of memory!". Don't know why. Requires further investigation. Meanwhile, I'll try commenting out parts of this test and see if the failures disappear. 1.54 Sun August 31 21:19:04 2008 - new shape: opera (thanks Cosimo) - new shape: kangaroo - new shape: moose - new shape: moosecamel (modelled after http://irclog.perlgeek.de) - new shape property keywords: logo, opera - logo keyword shapes are: debian, opera, pgolf, mongers 1.55 Mon December 1 21:42:07 2008 - fixed rt #39035 "The Acme-EyeDrops Archive Contains World-Writable files" - documentation: updated "99 Bottles of Beer" section with one stroke golf improvement to mtve/thospel original shortest solution 1.60 Sat May 12 23:59:42 2012 - Bug fix release for upcoming Perl 5.16.0 - Dropped support for Perl 5.005; A::E now requires Perl 5.6 or higher - Clarified Acme::EyeDrops license (thanks Jotam Jr. Trejo) LICENSE and README were inconsistent with META.yml all should be consistent now - minor code improvements for perl 5.6+ requirement: added "use warnings" to EyeDrops.pm use lexical file handles now can use readline() function now - documentation: removed "A Slow Day" section - documentation: added new "Victoria Bra, Secret Tango" section - new shape: bra - new shape: spider - 01_mug.t: fixed rt #72163: perl -Mstrict -e 'open$[' 'Can't use string ("0") as a symbol ref while "strict refs" in use' This seems to be a long-standing perl bug fixed in 5.16 Fixed test simply by removing -Mstrict in 01_mug.t - 16_astride.t: threads test, adjusted to avoid annoying "Tests out of sequence" failure reports from CPAN testers 1.61 Mon May 20 21:59:42 2013 - Bug fix release for Perl 5.18.0 - Tragically, perl 5.18 requires a leading "use re 'eval'" if you embed the program in a regex. To appease this change in behavior, the Regex attribute now supports three different "true" values: 1: add a leading "use re 'eval';" for Perl 5.18+ only 2: do not add a leading "use re 'eval';" 3: add a leading "use re 'eval';" - Updated test suite to work with new Regex attribute - Updated sightly.pl to work with new Regex attribute Acme-EyeDrops-1.61/MANIFEST100644 52 52 13501 11753400233 14653 0ustar00arthurdent 0 0 xBuild.PL Changes MANIFEST META.yml Makefile.PL README LICENSE lib/Acme/EyeDrops.pm lib/Acme/EyeDrops/a.eye lib/Acme/EyeDrops/a.eyp lib/Acme/EyeDrops/acme.eye lib/Acme/EyeDrops/acme.eyp lib/Acme/EyeDrops/adrianh.eye lib/Acme/EyeDrops/adrianh.eyp lib/Acme/EyeDrops/alien.eye lib/Acme/EyeDrops/alien.eyp lib/Acme/EyeDrops/alpaca.eye lib/Acme/EyeDrops/alpaca.eyp lib/Acme/EyeDrops/autrijus.eye lib/Acme/EyeDrops/autrijus.eyp lib/Acme/EyeDrops/baghdad.eye lib/Acme/EyeDrops/baghdad.eyp lib/Acme/EyeDrops/beer.eye lib/Acme/EyeDrops/beer.eyp lib/Acme/EyeDrops/bighorn.eye lib/Acme/EyeDrops/bighorn.eyp lib/Acme/EyeDrops/bleach.eye lib/Acme/EyeDrops/bleach.eyp lib/Acme/EyeDrops/bottle.eye lib/Acme/EyeDrops/bottle.eyp lib/Acme/EyeDrops/bottle2.eye lib/Acme/EyeDrops/bottle2.eyp lib/Acme/EyeDrops/bottle3.eye lib/Acme/EyeDrops/bottle3.eyp lib/Acme/EyeDrops/bra.eye lib/Acme/EyeDrops/bra.eyp lib/Acme/EyeDrops/buffy.eye lib/Acme/EyeDrops/buffy.eyp lib/Acme/EyeDrops/buffy2.eye lib/Acme/EyeDrops/buffy2.eyp lib/Acme/EyeDrops/buffy3.eye lib/Acme/EyeDrops/buffy3.eyp lib/Acme/EyeDrops/buffy4.eye lib/Acme/EyeDrops/buffy4.eyp lib/Acme/EyeDrops/camel.eye lib/Acme/EyeDrops/camel.eyp lib/Acme/EyeDrops/camel2.eye lib/Acme/EyeDrops/camel2.eyp lib/Acme/EyeDrops/camel3.eye lib/Acme/EyeDrops/camel3.eyp lib/Acme/EyeDrops/campm.eye lib/Acme/EyeDrops/campm.eyp lib/Acme/EyeDrops/candle.eye lib/Acme/EyeDrops/candle.eyp lib/Acme/EyeDrops/china1.eye lib/Acme/EyeDrops/china1.eyp lib/Acme/EyeDrops/coffee.eye lib/Acme/EyeDrops/coffee.eyp lib/Acme/EyeDrops/cricket.eye lib/Acme/EyeDrops/cricket.eyp lib/Acme/EyeDrops/damian.eye lib/Acme/EyeDrops/damian.eyp lib/Acme/EyeDrops/dan.eye lib/Acme/EyeDrops/dan.eyp lib/Acme/EyeDrops/debian.eye lib/Acme/EyeDrops/debian.eyp lib/Acme/EyeDrops/dipsy.eye lib/Acme/EyeDrops/dipsy.eyp lib/Acme/EyeDrops/eugene.eye lib/Acme/EyeDrops/eugene.eyp lib/Acme/EyeDrops/eye.eye lib/Acme/EyeDrops/eye.eyp lib/Acme/EyeDrops/flag_canada.eye lib/Acme/EyeDrops/flag_canada.eyp lib/Acme/EyeDrops/gelly.eye lib/Acme/EyeDrops/gelly.eyp lib/Acme/EyeDrops/golfer.eye lib/Acme/EyeDrops/golfer.eyp lib/Acme/EyeDrops/halloween.eye lib/Acme/EyeDrops/halloween.eyp lib/Acme/EyeDrops/heart.eye lib/Acme/EyeDrops/heart.eyp lib/Acme/EyeDrops/hipowls.eye lib/Acme/EyeDrops/hipowls.eyp lib/Acme/EyeDrops/japh.eye lib/Acme/EyeDrops/japh.eyp lib/Acme/EyeDrops/jon.eye lib/Acme/EyeDrops/jon.eyp lib/Acme/EyeDrops/jon_oxer.eye lib/Acme/EyeDrops/jon_oxer.eyp lib/Acme/EyeDrops/kangaroo.eye lib/Acme/EyeDrops/kangaroo.eyp lib/Acme/EyeDrops/kansai_pm.eye lib/Acme/EyeDrops/kansai_pm.eyp lib/Acme/EyeDrops/kermit.eye lib/Acme/EyeDrops/kermit.eyp lib/Acme/EyeDrops/koaladile.eye lib/Acme/EyeDrops/koaladile.eyp lib/Acme/EyeDrops/larry.eye lib/Acme/EyeDrops/larry.eyp lib/Acme/EyeDrops/larry2.eye lib/Acme/EyeDrops/larry2.eyp lib/Acme/EyeDrops/llama.eye lib/Acme/EyeDrops/llama.eyp lib/Acme/EyeDrops/london.eye lib/Acme/EyeDrops/london.eyp lib/Acme/EyeDrops/map_australia.eye lib/Acme/EyeDrops/map_australia.eyp lib/Acme/EyeDrops/map_italy.eye lib/Acme/EyeDrops/map_italy.eyp lib/Acme/EyeDrops/map_japan.eye lib/Acme/EyeDrops/map_japan.eyp lib/Acme/EyeDrops/map_uk.eye lib/Acme/EyeDrops/map_uk.eyp lib/Acme/EyeDrops/map_world1.eye lib/Acme/EyeDrops/map_world1.eyp lib/Acme/EyeDrops/map_world2.eye lib/Acme/EyeDrops/map_world2.eyp lib/Acme/EyeDrops/map_world3.eye lib/Acme/EyeDrops/map_world3.eyp lib/Acme/EyeDrops/merlyn.eye lib/Acme/EyeDrops/merlyn.eyp lib/Acme/EyeDrops/mongers.eye lib/Acme/EyeDrops/mongers.eyp lib/Acme/EyeDrops/moose.eye lib/Acme/EyeDrops/moose.eyp lib/Acme/EyeDrops/moosecamel.eye lib/Acme/EyeDrops/moosecamel.eyp lib/Acme/EyeDrops/mosquito.eye lib/Acme/EyeDrops/mosquito.eyp lib/Acme/EyeDrops/music.eye lib/Acme/EyeDrops/music.eyp lib/Acme/EyeDrops/naw.eye lib/Acme/EyeDrops/naw.eyp lib/Acme/EyeDrops/opera.eye lib/Acme/EyeDrops/opera.eyp lib/Acme/EyeDrops/panda.eye lib/Acme/EyeDrops/panda.eyp lib/Acme/EyeDrops/parrot.eye lib/Acme/EyeDrops/parrot.eyp lib/Acme/EyeDrops/pgolf.eye lib/Acme/EyeDrops/pgolf.eyp lib/Acme/EyeDrops/pony.eye lib/Acme/EyeDrops/pony.eyp lib/Acme/EyeDrops/pony2.eye lib/Acme/EyeDrops/pony2.eyp lib/Acme/EyeDrops/pugs.eye lib/Acme/EyeDrops/pugs.eyp lib/Acme/EyeDrops/pugs2.eye lib/Acme/EyeDrops/pugs2.eyp lib/Acme/EyeDrops/riding.eye lib/Acme/EyeDrops/riding.eyp lib/Acme/EyeDrops/rose.eye lib/Acme/EyeDrops/rose.eyp lib/Acme/EyeDrops/santa.eye lib/Acme/EyeDrops/santa.eyp lib/Acme/EyeDrops/santa2.eye lib/Acme/EyeDrops/santa2.eyp lib/Acme/EyeDrops/saturn.eye lib/Acme/EyeDrops/saturn.eyp lib/Acme/EyeDrops/schwern.eye lib/Acme/EyeDrops/schwern.eyp lib/Acme/EyeDrops/schwern2.eye lib/Acme/EyeDrops/schwern2.eyp lib/Acme/EyeDrops/simon.eye lib/Acme/EyeDrops/simon.eyp lib/Acme/EyeDrops/smiley.eye lib/Acme/EyeDrops/smiley.eyp lib/Acme/EyeDrops/smiley2.eye lib/Acme/EyeDrops/smiley2.eyp lib/Acme/EyeDrops/smiley3.eye lib/Acme/EyeDrops/smiley3.eyp lib/Acme/EyeDrops/snow.eye lib/Acme/EyeDrops/snow.eyp lib/Acme/EyeDrops/spider.eye lib/Acme/EyeDrops/spider.eyp lib/Acme/EyeDrops/spoon.eye lib/Acme/EyeDrops/spoon.eyp lib/Acme/EyeDrops/tonick.eye lib/Acme/EyeDrops/tonick.eyp lib/Acme/EyeDrops/tpr.eye lib/Acme/EyeDrops/tpr.eyp lib/Acme/EyeDrops/uml.eye lib/Acme/EyeDrops/uml.eyp lib/Acme/EyeDrops/undies.eye lib/Acme/EyeDrops/undies.eyp lib/Acme/EyeDrops/window.eye lib/Acme/EyeDrops/window.eyp lib/Acme/EyeDrops/writing_perl.eye lib/Acme/EyeDrops/writing_perl.eyp lib/Acme/EyeDrops/yanick.eye lib/Acme/EyeDrops/yanick.eyp lib/Acme/EyeDrops/yanick2.eye lib/Acme/EyeDrops/yanick2.eyp lib/Acme/EyeDrops/yanick3.eye lib/Acme/EyeDrops/yanick3.eyp lib/Acme/EyeDrops/yanick4.eye lib/Acme/EyeDrops/yanick4.eyp t/00_Coffee.t t/01_mug.t t/02_shatters.t t/03_Larry.t t/04_Apocalyptic.t t/05_Parrot.t t/06_not.t t/07_a.t t/08_hoax.t t/09_Gallop.t t/10_Ponie.t t/11_bold.t t/12_Beer.t t/13_to.t t/14_gulp.t t/15_Buffy.t t/16_astride.t t/17_Orange.t t/18_sky.t t/19_surrounds.t t/gen.t t/zgen.t demo/findshapes.pl demo/sightly.pl demo/gentable.pl Acme-EyeDrops-1.61/META.yml100644 52 52 1107 12146374437 14767 0ustar00arthurdent 0 0 --- #YAML:1.0 name: Acme-EyeDrops version: 1.61 abstract: Visual Programming in Perl license: perl author: - 'Andrew Savige ' generated_by: ExtUtils::MakeMaker version 6.42 distribution_type: module dynamic_config: 0 requires: Exporter: 0 perl: 5.006 build_requires: Config: 0 Test::Pod: 1.12 Test::Pod::Coverage: 0.08 provides: Acme::EyeDrops: file: lib/Acme/EyeDrops.pm version: 1.61 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.3.html version: 1.3 Acme-EyeDrops-1.61/Makefile.PL100644 52 52 1604 12146374420 15462 0ustar00arthurdent 0 0 use ExtUtils::MakeMaker; print <<'CAMEL_GREETING'; ###### ##### ######### ########## ########### ########## ############# ####### ################ ######## ################### ####### ##################### ############################# ############################# ############################## ############################# ######################### ## ## ############### #### ## #### ######## ### # ### #### ### ### ### ##### ## ## ### #### ## ## ## # ## ## ## # # # ## # # # # ### # # ## ## # ## #### # ## #### #### CAMEL_GREETING WriteMakefile( NAME => 'Acme::EyeDrops', VERSION => '1.61', PL_FILES => {} ); Acme-EyeDrops-1.61/README100644 52 52 3714 12146374403 14375 0ustar00arthurdent 0 0 =========================================================================== Release of version 1.61 of Acme::EyeDrops =========================================================================== NAME Acme::EyeDrops - Visual Programming in Perl SYNOPSIS use Acme::EyeDrops qw(sightly); print sightly( { Shape => 'camel', SourceFile => 'eyesore.pl' } ); DESCRIPTION Acme::EyeDrops converts a Perl program into an equivalent one, but without all those unsightly letters and numbers. In a Visual Programming breakthrough, EyeDrops allows you to pour the generated program into various shapes, such as UML diagrams, enabling you to instantly understand how the program works just by glancing at its new and improved visual representation. INSTALLATION Most of you already know the drill: perl Makefile.PL make make test make install Alternatively, if you have Module::Build installed, you can: perl Build.PL perl Build perl Build test perl Build install It's all pure Perl, so you can also install by putting the .pm file and *.eye files in the appropriate local sub-directory. This module should work on all Windows and Unix variants for Perl 5.6 and above, but is untested on other platforms. AUTHOR Andrew Savige COPYRIGHT Copyright (c) 2001-2012 Andrew Savige. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =========================================================================== AVAILABILITY Acme::EyeDrops has been uploaded to the CPAN. =========================================================================== Acme-EyeDrops-1.61/LICENSE100644 52 52 572 11753373650 14507 0ustar00arthurdent 0 0 LICENSE FOR Acme-EyeDrops Copyright (c) 2001-2012 Andrew Savige. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Acme-EyeDrops-1.61/lib/Acme/EyeDrops.pm100644 52 52 405510 12146375115 17261 0ustar00arthurdent 0 0 package Acme::EyeDrops; require 5.006; use strict; use warnings; use vars qw($VERSION @ISA @EXPORT_OK); require Exporter; @ISA = qw(Exporter); @EXPORT_OK = qw(ascii_to_sightly sightly_to_ascii regex_print_sightly regex_eval_sightly clean_print_sightly clean_eval_sightly regex_binmode_print_sightly clean_binmode_print_sightly get_eye_dir get_eye_shapes get_eye_string get_builtin_shapes get_eye_properties get_eye_keywords find_eye_shapes make_triangle make_siertri make_banner border_shape invert_shape reflect_shape rotate_shape reduce_shape expand_shape hjoin_shapes pour_text pour_sightly sightly); $VERSION = '1.61'; { # This table was generated by demo/gentable.pl. my @C = ( q Z('!'^'!')Z,q Z('('^')')Z,q Z('<'^'>')Z,q Z('>'^'=')Z, q Z('>'^':')Z,q Z('>'^';')Z,q Z('+'^'-')Z,q Z('*'^'-')Z, q Z('+'^'#')Z,q Z('*'^'#')Z,q Z('!'^'+')Z,q Z('!'^'*')Z, q Z('!'^'-')Z,q Z('!'^',')Z,q Z('!'^'/')Z,q Z('!'^'.')Z, q Z('?'^'/')Z,q Z('<'^'-')Z,q Z('-'^'?')Z,q Z('.'^'=')Z, q Z('+'^'?')Z,q Z('*'^'?')Z,q Z('?'^')')Z,q Z('<'^'+')Z, q Z('%'^'=')Z,q Z('&'^'?')Z,q Z('?'^'%')Z,q Z('>'^'%')Z, q Z('&'^':')Z,q Z('<'^'!')Z,q Z('?'^'!')Z,q Z('%'^':')Z, q Z('{'^'[')Z,q Z'!'Z,q Z'\\\\'.'"'Z,q Z'#'Z, q Z'\\\\'.'$'Z,q Z'%'Z,q Z'&'Z,q Z"'"Z,q Z'('Z,q Z')'Z, q Z'*'Z,q Z'+'Z,q Z','Z,q Z'-'Z,q Z'.'Z,q Z'/'Z, q Z('^'^('`'|'.'))Z,q Z('^'^('`'|'/'))Z,q Z('^'^('`'|','))Z, q Z('^'^('`'|'-'))Z,q Z('^'^('`'|'*'))Z,q Z('^'^('`'|'+'))Z, q Z('^'^('`'|'('))Z,q Z('^'^('`'|')'))Z,q Z(':'&'=')Z, q Z(';'&'=')Z,q Z':'Z,q Z';'Z,q Z'<'Z,q Z'='Z,q Z'>'Z,q Z'?'Z, q Z'\\\\'.'@'Z,q Z('`'^'!')Z,q Z('`'^'"')Z,q Z('`'^'#')Z, q Z('`'^'$')Z,q Z('`'^'%')Z,q Z('`'^'&')Z,q Z('`'^"'")Z, q Z('`'^'(')Z,q Z('`'^')')Z,q Z('`'^'*')Z,q Z('`'^'+')Z, q Z('`'^',')Z,q Z('`'^'-')Z,q Z('`'^'.')Z,q Z('`'^'/')Z, q Z('{'^'+')Z,q Z('{'^'*')Z,q Z('{'^')')Z,q Z('{'^'(')Z, q Z('{'^'/')Z,q Z('{'^'.')Z,q Z('{'^'-')Z,q Z('{'^',')Z, q Z('{'^'#')Z,q Z('{'^'"')Z,q Z('{'^'!')Z,q Z'['Z, q Z'\\\\'.'\\\\'Z,q Z']'Z,q Z'^'Z,q Z'_'Z, q Z'`'Z,q Z('`'|'!')Z,q Z('`'|'"')Z,q Z('`'|'#')Z, q Z('`'|'$')Z,q Z('`'|'%')Z,q Z('`'|'&')Z,q Z('`'|"'")Z, q Z('`'|'(')Z,q Z('`'|')')Z,q Z('`'|'*')Z,q Z('`'|'+')Z, q Z('`'|',')Z,q Z('`'|'-')Z,q Z('`'|'.')Z,q Z('`'|'/')Z, q Z('['^'+')Z,q Z('['^'*')Z,q Z('['^')')Z,q Z('['^'(')Z, q Z('['^'/')Z,q Z('['^'.')Z,q Z('['^'-')Z,q Z('['^',')Z, q Z('['^'#')Z,q Z('['^'"')Z,q Z('['^'!')Z,q Z'\\\\'.'{'Z, q Z'|'Z,q Z'\\\\'.'}'Z,q Z'~'Z,q Z('!'^'^')Z ); push @C, map(join('.', q#'\\\\'#, $C[120], map($C[$_], unpack('C*', sprintf('%x', $_)))), 128..255); sub ascii_to_sightly { join '.', map($C[$_], unpack('C*', $_[0])) } } sub sightly_to_ascii { eval eval q#'"'.# . $_[0] . q#.'"'# } sub regex_print_sightly { q#''=~('('.'?'.'{'.# . ascii_to_sightly('print') . q#.'"'.# . &ascii_to_sightly . q#.'"'.'}'.')')#; } sub regex_binmode_print_sightly { q#''=~('('.'?'.'{'.# . ascii_to_sightly('binmode(STDOUT);print') . q#.'"'.# . &ascii_to_sightly . q#.'"'.'}'.')')#; } sub regex_eval_sightly { q#''=~('('.'?'.'{'.# . ascii_to_sightly('eval') . q#.'"'.# . &ascii_to_sightly . q#.'"'.'}'.')')#; } sub clean_print_sightly { qq#print eval '"'.\n\n\n# . &ascii_to_sightly . q#.'"'#; } sub clean_binmode_print_sightly { qq#binmode(STDOUT);print eval '"'.\n\n\n# . &ascii_to_sightly . q#.'"'#; } sub clean_eval_sightly { qq#eval eval '"'.\n\n\n# . &ascii_to_sightly . q#.'"'#; } # ----------------------------------------------------------------- sub _slurp_tfile { my $f = shift; my $b = shift; open my $fh, '<', $f or die "open '$f': $!"; $b and binmode($fh); local $/; my $s = <$fh>; close($fh); $s; } # Poor man's properties (see also YAML, java.util.Properties). # Return ref to property hash. sub _get_properties { my $f = shift; open my $fh, '<', $f or die "open '$f': $!"; my $l; my %h; while (defined($l = <$fh>)) { chomp($l); if ($l =~ s/\\$//) { my $n = <$fh>; $n =~ s/^\s+//; $l .= $n; redo unless eof($fh); } $l =~ s/^\s+//; $l =~ s/\s+$//; next unless length($l); next if $l =~ /^#/; my ($k, $v) = split(/\s*:\s*/, $l, 2); $h{$k} = $v; } close($fh); return \%h; } sub _def_ihandler { print STDERR $_[0] } # Return largest no. of tokens with total length less than $slen ($slen > 0). sub _guess_ntok { my ($rtok, $sidx, $slen, $rexact) = @_; my $tlen = 0; for my $i ($sidx .. $sidx + $slen) { ($tlen += length($rtok->[$i])) < $slen or return $i - $sidx + (${$rexact} = $tlen == $slen); } # should never get here } sub _guess_compact_ntok { my ($rtok, $sidx, $slen, $rexact, $fcompact) = @_; my $tlen = 0; for my $i ($sidx .. $sidx + $slen + $slen) { ($tlen += length($rtok->[$i]) - ($i > $sidx+1 && $rtok->[$i-1] eq '.' && substr($rtok->[$i], 0, 1) eq "'" && substr($rtok->[$i-2], 0, 1) eq "'" ? (${$fcompact} = 3) : 0)) < $slen or return $i - $sidx + ($tlen > $slen ? 0 : (${$rexact} = 1) + ($i > $sidx && $rtok->[$i] eq '.' && substr($rtok->[$i-1], 0, 1) eq "'" && $rtok->[$i+1] =~ /^'..$/ ? (${$fcompact} = 1) : 0)); } # should never get here } sub _compact_join { my ($rtok, $sidx, $n) = @_; my $s = ""; for my $i ($sidx .. $sidx + $n - 1) { if ($i > $sidx+1 && $rtok->[$i-1] eq '.' && substr($rtok->[$i], 0, 1) eq "'" && substr($rtok->[$i-2], 0, 1) eq "'") { substr($s, -2) = substr($rtok->[$i], 1); # 'a'.'b' to 'ab' } else { $s .= $rtok->[$i]; } } $s; } # Pour $n tokens from @{$rtok} (starting at index $sidx) into string # of length $slen. Return string or undef if unsuccessful. sub _pour_chunk { my ($rtok, $sidx, $n, $slen) = @_; my $eidx = $sidx + $n - 1; my $tlen = 0; my $idot = my $iquote = my $i3quote = my $iparen = my $idollar = -1; for my $i ($sidx .. $eidx) { $tlen += length($rtok->[$i]); if ($rtok->[$i] eq '.') { $idot = $i } elsif ($rtok->[$i] eq '(') { $iparen = $i } elsif (substr($rtok->[$i], 0, 1) eq '$') { $idollar = $i } elsif ($rtok->[$i] =~ /^['"]/) { $iquote = $i; $i3quote = $i if length($rtok->[$i]) == 3; } } die "oops" if $tlen >= $slen; my $i2 = (my $d = $slen - $tlen) >> 1; $idot >= 0 && !($d%3) and return join("", @{$rtok}[$sidx .. $idot-1], ".''" x int($d/3), @{$rtok}[$idot .. $eidx]); if (!($d&1) and $iquote >= 0 || $idollar >= 0) { $iquote = $idollar if $iquote < 0; return join("", @{$rtok}[$sidx .. $iquote-1], '(' x $i2 . $rtok->[$iquote] . ')' x $i2, @{$rtok}[$iquote+1 .. $eidx]); } $i3quote >= 0 and return join("", @{$rtok}[$sidx .. $i3quote-1], $d == 1 ? '"\\' . substr($rtok->[$i3quote], 1, 1) . '"' : '(' x $i2 . '"\\' . substr($rtok->[$i3quote], 1, 1) . '"' . ')' x $i2, @{$rtok}[$i3quote+1 .. $eidx]); return unless $d == 1; $iparen >= 0 and return join("", @{$rtok}[$sidx .. $iparen-1], '+' . $rtok->[$iparen], @{$rtok}[$iparen+1 .. $eidx]); # ouch, can't test for eq '(' in case next chunk also adds '+' $rtok->[$eidx] ne '=' && $rtok->[$sidx+$n] =~ /^['"]/ ? join("", @{$rtok}[$sidx .. $eidx], '+') : undef; } sub _pour_compact_chunk { my ($rtok, $sidx, $n, $slen) = @_; my @mytok; for my $i ($sidx .. $sidx + $n - 1) { if ($i > $sidx+1 && $rtok->[$i-1] eq '.' && substr($rtok->[$i], 0, 1) eq "'" && substr($rtok->[$i-2], 0, 1) eq "'") { pop(@mytok); my $qtok = pop(@mytok); # 'a'.'b' to 'ab' push(@mytok, substr($qtok, 0, -1) . substr($rtok->[$i], 1)); } else { push(@mytok, $rtok->[$i]); } } push(@mytok, $rtok->[$sidx+$n]); # _pour_chunk checks next token _pour_chunk(\@mytok, 0, $#mytok, $slen); } # Pour unsightly text $txt into shape defined by string $tlines. sub pour_text { my ($tlines, $txt, $gap, $tfill) = @_; $txt =~ s/\s+//g; my $ttlen = 0; my $txtend = length($txt); my @tnlines = map(length() ? [map length, split/([^ ]+)/] : undef, split(/\n/, $tlines)); for my $r (grep($_, @tnlines)) { for my $i (0 .. $#{$r}) { $i & 1 and $ttlen += $r->[$i] } } my $nshape = int($txtend/$ttlen); my $rem = $txtend % $ttlen; if ($rem || !$nshape) { ++$nshape; $txt .= $tfill x (int(($ttlen-$rem)/length($tfill))+1) if length($tfill); } my $s = ""; my $p = 0; for (my $n = 1; 1; ++$n, $s .= "\n" x $gap) { for my $r (@tnlines) { if ($r) { for my $i (0 .. $#{$r}) { if ($i & 1) { $s .= substr($txt, $p, $r->[$i]); $p += $r->[$i]; return "$s\n" if !length($tfill) && $p >= $txtend; } else { $s .= ' ' x $r->[$i]; } } } $s .= "\n"; } last if $n >= $nshape; } $s; } # Make filler code to stuff on end of program to fill last shape. sub _make_filler { my $fv = shift; # list reference of filler variables my $nfv = @{$fv}; # Beware with these filler values. # Avoid $; $" ';' (to avoid clash with " and ; in later parsing). # END block is trouble because it is executed after this filler. # Setting $^ or $~ (but not $:) to weird values resets $@. # For example: $~='?'&'!'; (this looks like a Perl bug to me). # For now, just stick with letters and numbers. my @filleqto = ( [ q#'.'#, '^', q^'~'^ ], [ q#'@'#, '|', q^'('^ ], [ q#')'#, '^', q^'['^ ], [ q#'`'#, '|', q^'.'^ ], [ q#'('#, '^', q^'}'^ ], [ q#'`'#, '|', q^'!'^ ], [ q#')'#, '^', q^'}'^ ], [ q#'*'#, '|', q^'`'^ ], [ q#'+'#, '^', q^'_'^ ], [ q#'&'#, '|', q^'@'^ ], [ q#'['#, '&', q^'~'^ ], [ q#','#, '^', q^'|'^ ] ); $nfv > @filleqto and die "too many fv"; my $rem = @filleqto % $nfv; $rem and splice(@filleqto, -$rem); my $v = -1; map(($fv->[++$v % $nfv], '=', @{$_}, ';'), @filleqto); } # Pour sightly program $prog into shape defined by string $tlines. sub pour_sightly { my ($tlines, $prog, $gap, $fillv, $compact, $ihandler) = @_; $ihandler ||= \&_def_ihandler; my $ttlen = 0; my @tnlines = map(length() ? [map length, split/([^ ]+)/] : undef, split(/\n/, $tlines)); for my $r (grep($_, @tnlines)) { for my $i (0 .. $#{$r}) { $i & 1 and $ttlen += $r->[$i] } } my $outstr = ""; my @ptok; if ($prog) { if ($prog =~ /^''=~/g) { push(@ptok, ($tlines =~ /(\S+)/ ? length($1) : 0) == 3 ? "'?'" : "''", '=~'); } elsif ($prog =~ /(.*eval.*\n\n\n)/g) { $outstr .= $1; } push(@ptok, $prog =~ /[().&|^]|'\\\\'|.../g); # ... is "'"|'.' } my $iendprog = @ptok; my @filler = _make_filler(ref($fillv) ? $fillv : [ '$:', '$~', '$^' ]); # Note: 11 is the length of a filler item, for example, $:='.'^'~'; # And there are 6 tokens in each filler item: $: = '.' ^ '~' ; push(@ptok, 'Z', (@filler) x (int($ttlen/(11 * int(@filler / 6))) + 1)); my $sidx = 0; for (my $nshape = 1; 1; ++$nshape, $outstr .= "\n" x $gap) { for my $rline (@tnlines) { unless ($rline) { $outstr .= "\n"; next } for my $it (0 .. $#{$rline}) { unless ($it & 1) {$outstr .= ' ' x $rline->[$it]; next } (my $tlen = $rline->[$it]) == (my $plen = length($ptok[$sidx])) and $outstr .= $ptok[$sidx++], next; if ($plen > $tlen) { $outstr .= '(' x $tlen; splice(@ptok, $sidx+1, 0, (')') x $tlen); $iendprog += $tlen if $sidx < $iendprog; next; } my $fcompact = my $fexact = 0; my $n = $compact ? _guess_compact_ntok(\@ptok, $sidx, $tlen, \$fexact, \$fcompact) : _guess_ntok(\@ptok, $sidx, $tlen, \$fexact); if ($fexact) { $outstr .= $fcompact ? _compact_join(\@ptok, $sidx, $n) : join("", @ptok[$sidx .. $sidx+$n-1]); $sidx += $n; next; } my $str; --$n while $n > 0 && !defined($str = $fcompact ? _pour_compact_chunk(\@ptok, $sidx, $n, $tlen) : _pour_chunk(\@ptok, $sidx, $n, $tlen)); if ($n) { $outstr .= $str; $sidx += $n; next } ++$n while $n < $tlen && length($ptok[$sidx+$n]) < 2; die "oops ($n >= $tlen)" if $n >= $tlen; $outstr .= join("", @ptok[$sidx .. $sidx+$n-1]); $sidx += $n; $outstr .= '(' x (my $nleft = $tlen - $n); splice(@ptok, $sidx+1, 0, (')') x $nleft); $iendprog += $nleft if $sidx < $iendprog; } $outstr .= "\n"; } $ihandler->("$nshape shapes completed.\n"); last if $sidx >= $iendprog; } my $eidx = rindex($outstr, 'Z'); substr($outstr, $eidx, 1) = ';' if $eidx >= 0; return $outstr if $sidx == $iendprog || $sidx == $iendprog+1; die "oops" if $eidx < 0; ref($fillv) or return substr($outstr, 0, $eidx) . (length($fillv) ? pour_text(substr($outstr, $eidx), "", 0, $fillv) : "\n"); (my $idx = rindex($outstr, ';')) >= 0 or return $outstr; my @t = substr($outstr, $idx+1) =~ /[()&|^=;]|\$.|'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"/g or return $outstr; my $nl = my $nr = my $ne = 0; for my $c (@t) { if ($c eq '(') {++$nl} elsif ($c eq ')') {++$nr} elsif ($c eq '=') {++$ne} } if ($ne == 0 || $nl != $nr || $t[-1] eq '=') { my $f = ';'; # Trouble: wipe out last bit with filler for my $i ($idx+1 .. length($outstr)-2) { substr($outstr, $i, 1) =~ tr/ \n// or substr($outstr, $i, 1) = $f = $f eq '#' ? ';' : '#'; } } elsif ($t[-1] eq '|' or $t[-1] eq '^' or $t[-1] eq '&') { $outstr =~ s/\S(\s*)$/;$1/; } $outstr; } # ----------------------------------------------------------------- sub _border { my ($a, $w, $c, $l, $r, $t, $b) = @_; my $z = $c x ($w+$l+$r); my $f = $c x $l; my $g = $c x $r; for (@{$a}) { $_ = $f . $_ . $g } unshift(@{$a}, ($z) x $t); push(@{$a}, ($z) x $b); } sub border_shape { my ($tlines, $gl, $gr, $gt, $gb, $wl, $wr, $wt, $wb) = @_; my @a = split(/^/, $tlines, -1); chop(@a); my $m = 0; for my $l (@a) { $m = length($l) if length($l) > $m } for my $l (@a) { $l .= ' ' x ($m - length($l)) } $gl || $gr || $gt || $gb and _border(\@a, $m, ' ', $gl, $gr, $gt, $gb); $wl || $wr || $wt || $wb and _border(\@a, $m+$gl+$gr,'#',$wl,$wr,$wt,$wb); join("\n", @a, ""); } sub invert_shape { my $tlines = shift; my @a = split(/^/, $tlines, -1); chop(@a); my $m = 0; for my $l (@a) { $m = length($l) if length($l) > $m } for my $l (@a) { $l .= ' ' x ($m - length($l)) } my $s = join("\n", @a, ""); $s =~ tr/ #/# /; $s =~ s/ +$//mg; $s; } sub reflect_shape { my $tlines = shift; my @a = split(/^/, $tlines, -1); chop(@a); my $m = 0; for my $l (@a) { $m = length($l) if length($l) > $m } my $s = join("\n", map(scalar reverse($_ . ' ' x ($m - length)), @a), ""); $s =~ s/ +$//mg; $s; } sub hjoin_shapes { my ($g, @shapes) = @_; my $ml = 0; my @lines; for my $s (@shapes) { my $n = $s =~ tr/\n//; $ml = $n if $n > $ml } for my $tlines (@shapes) { my @a = split(/^/, $tlines, -1); chop(@a); my $m = 0; for my $l (@a) { $m = length($l) if length($l) > $m } for my $l (@a) { $l .= ' ' x ($m - length($l) + $g) } push(@a, (' ' x ($m + $g)) x ($ml - @a)); for my $i (0..$#a) { $lines[$i] .= $a[$i] } } my $s = join("\n", @lines, ""); $s =~ s/ +$//mg; $s; } sub reduce_shape { my ($tlines, $f) = @_; my $i = $f++; my $s = ""; for my $l (grep(!(++$i%$f), split(/\n/, $tlines))) { for ($i = 0; $i < length($l); $i += $f) { $s .= substr($l, $i, 1) } $s .= "\n"; } $s =~ s/ +$//mg; $s; } sub expand_shape { my ($s, $f) = @_; my $i = ' ' x ++$f; my $j = '#' x $f; $s =~ s/ /$i/g; $s =~ s/#/$j/g; my $t = ""; for my $l (split(/^/, $s, -1)) { $t .= $l x $f } $t; } # Rotate shape clockwise: 90, 180 or 270 degrees # (other angles are left as an exercise for the reader:-) sub rotate_shape { my ($tlines, $degrees, $rtype, $flip) = @_; $degrees == 180 and return join("\n", reverse(split(/\n/, $tlines)), ""); my $t = $rtype==0 ? 2 : 1; my $inc = $rtype==1 ? 2 : 1; my @a = split(/^/, $tlines, -1); chop(@a); my $m = 0; my $s = ""; for my $l (@a) { $m = length($l) if length($l) > $m } for my $l (@a) { $l .= ' ' x ($m - length($l)) } if ($degrees == 90) { @a = reverse(@a) unless $flip; for (my $i = 0; $i < $m; $i += $inc) { for (@a) {$s .= substr($_, $i, 1) x $t} $s .= "\n" } } elsif ($degrees == 270) { @a = reverse(@a) if $flip; for (my $i = $m-1; $i >= 0; $i -= $inc) { for (@a) {$s .= substr($_, $i, 1) x $t} $s .= "\n" } } $s =~ s/ +$//mg; $s; } sub make_triangle { my $w = shift; $w & 1 or ++$w; $w < 9 and $w = 9; my $n = $w >> 1; my $s; for (my $i=1;$i<=$w;$i+=2) { $s .= ' ' x $n-- . '#' x $i . "\n" } $s; } sub make_siertri { my $w = shift; $w < 3 and $w = 5; my $n = 2 ** $w; my $s; for my $i (0 .. $n-1) { --$n; $s .= ' ' x $n . join('', map($n & $_ ? ' ' : '##', 0 .. $i)) . "\n"; } $s; } sub make_banner { my ($w, $src) = @_; # Linux /usr/games/banner can be used. # CPAN Text::Banner will hopefully be enhanced so it can be used too. my $b_exe = '/usr/games/banner'; -x $b_exe or die "'$b_exe' not available on this platform."; my $f = $w ? "-w $w" : ""; $src =~ s/\s+/ /g; $src =~ s/ $//; # Following characters not in /usr/games/banner character set: # \ [ ] { } < > ^ _ | ~ # Also must escape ' from the shell. $src =~ tr#_\\[]{}<>^|~'`#-/()()()H!T""#; my $s = ""; my $len = length($src); for (my $i = 0; $i < $len; $i += 512) { my $cmd = "$b_exe $f '" . substr($src, $i, 512) . "'"; $s .= `$cmd`; my $rc = $? >> 8; $rc and die "<$cmd>: rc=$rc"; } $s =~ s/\s+$/\n/; $s =~ s/ +$//mg; # Remove as many leading spaces as possible. my $m = 32000; # regex /^ {$m}/ blows up if $m > 32766 while ($s =~ /^( *)\S/mg) { $m = length($1) if length($1) < $m } $s =~ s/^ {$m}//mg if $m; $s; } # ------------------------------------------------------------------------- sub _bi_all { join "\n" x $_[0]->{Width}, map(_get_eye_string($_[0]->{EyeDir}, $_), _get_eye_shapes($_[0]->{EyeDir})) } sub _bi_triangle { make_triangle($_[0]->{Width}) } sub _bi_siertri { make_siertri($_[0]->{Width}) } sub _bi_banner { make_banner($_[0]->{Width}, $_[0]->{BannerString}) } sub _bi_srcbanner { make_banner($_[0]->{Width}, $_[0]->{SourceString}) } { my %builtin_shapes = ( 'all' => \&_bi_all, 'triangle' => \&_bi_triangle, 'siertri' => \&_bi_siertri, 'banner' => \&_bi_banner, 'srcbanner' => \&_bi_srcbanner ); sub get_builtin_shapes { sort keys %builtin_shapes } # Return built-in shape string or undef if invalid shape. sub _get_builtin_string { my $shape = shift; return unless exists($builtin_shapes{$shape}); $builtin_shapes{$shape}->(shift); } } sub sightly { my $ruarg = shift; my %arg = ( Shape => "", ShapeString => "", SourceFile => "", SourceString => "", SourceHandle => undef, InformHandler => undef, Width => 0, BannerString => "", Text => 0, TextFiller => "", Regex => 0, Compact => 0, Print => 0, Binary => 0, Gap => 0, Rotate => 0, RotateType => 0, RotateFlip => 0, Reflect => 0, Reduce => 0, Expand => 0, Invert => 0, TrailingSpaces => 0, RemoveNewlines => 0, Indent => 0, BorderGap => 0, BorderGapLeft => 0, BorderGapRight => 0, BorderGapTop => 0, BorderGapBottom => 0, BorderWidth => 0, BorderWidthLeft => 0, BorderWidthRight => 0, BorderWidthTop => 0, BorderWidthBottom => 0, TrapEvalDie => 0, TrapWarn => 0, FillerVar => [], EyeDir => get_eye_dir() ); for my $k (keys %{$ruarg}) { exists($arg{$k}) or die "invalid parameter '$k'"; $arg{$k} = $ruarg->{$k}; } length($arg{SourceFile}) && $arg{SourceHandle} and die "cannot specify both SourceFile and SourceHandle"; length($arg{SourceFile}) && length($arg{SourceString}) and die "cannot specify both SourceFile and SourceString"; length($arg{SourceString}) && $arg{SourceHandle} and die "cannot specify both SourceString and SourceHandle"; $arg{Shape} && $arg{ShapeString} and die "cannot specify both Shape and ShapeString"; if (length($arg{SourceFile})) { $arg{SourceString} = _slurp_tfile($arg{SourceFile}, $arg{Binary}); } elsif ($arg{SourceHandle}) { local $/; $arg{SourceString} = readline($arg{SourceHandle}); } my $fill = $arg{FillerVar}; if (ref($fill) && !$arg{Text}) { # Non-rigourous check for module (package) or END block. @{$fill} or $fill = ($arg{SourceString} =~ /^\s*END\b/m or $arg{SourceString} =~ /^\s*package\b/m) ? [ '$:', '$~', '$^' ] : [ '$:', '$~', '$^', '$/', '$,', '$\\' ]; } $arg{RemoveNewlines} and $arg{SourceString} =~ tr/\n//d; my $shape = my $sightly = ""; length($arg{SourceString}) && !$arg{Text} and $sightly = $arg{Print} ? ( $arg{Regex} ? ( $arg{Binary} ? regex_binmode_print_sightly($arg{SourceString}) : regex_print_sightly($arg{SourceString}) ) : ( $arg{Binary} ? clean_binmode_print_sightly($arg{SourceString}) : clean_print_sightly($arg{SourceString}) ) ) : ( $arg{Regex} ? regex_eval_sightly($arg{SourceString}) : clean_eval_sightly($arg{SourceString}) ); if ($arg{ShapeString}) { $shape = $arg{ShapeString}; } elsif ($arg{Shape}) { $shape = join("\n" x $arg{Gap}, map(_get_builtin_string($_, \%arg) || (m#[./]# ? _slurp_tfile($_) : _get_eye_string($arg{EyeDir}, $_)), split(/,/, $arg{Shape}))); } elsif ($arg{Width}) { die "invalid width $arg{Width} (must be > 3)" if !$arg{Text} && $arg{Width} < 4; $shape = '#' x $arg{Width}; } $shape or return "use re 'eval';\n" x ($arg{Regex} == 3 || ($arg{Regex} == 1 && $] >= 5.017)) . $sightly; $arg{Rotate} and $shape = rotate_shape($shape, $arg{Rotate}, $arg{RotateType}, $arg{RotateFlip}); $arg{Reflect} and $shape = reflect_shape($shape); $arg{Reduce} and $shape = reduce_shape($shape, $arg{Reduce}); $arg{Expand} and $shape = expand_shape($shape, $arg{Expand}); $arg{Invert} and $shape = invert_shape($shape); $arg{TrailingSpaces} || $arg{BorderGap} || $arg{BorderWidth} || $arg{BorderGapLeft} || $arg{BorderWidthLeft} || $arg{BorderGapRight} || $arg{BorderWidthRight} || $arg{BorderGapTop} || $arg{BorderWidthTop} || $arg{BorderGapBottom} || $arg{BorderWidthBottom} and $shape = border_shape($shape, $arg{BorderGapLeft} || $arg{BorderGap}, $arg{BorderGapRight} || $arg{BorderGap}, $arg{BorderGapTop} || $arg{BorderGap}, $arg{BorderGapBottom} || $arg{BorderGap}, $arg{BorderWidthLeft} || $arg{BorderWidth}, $arg{BorderWidthRight} || $arg{BorderWidth}, $arg{BorderWidthTop} || $arg{BorderWidth}, $arg{BorderWidthBottom} || $arg{BorderWidth}); if ($arg{Indent}) { my $s = ' ' x $arg{Indent}; $shape =~ s/^/$s/mg } $arg{Text} and return pour_text($shape, $arg{SourceString}, $arg{Gap}, $arg{TextFiller}); "use re 'eval';\n" x ($arg{Regex} == 3 || ($arg{Regex} == 1 && $] >= 5.017)) . 'local $SIG{__WARN__}=sub{};' x $arg{TrapWarn} . pour_sightly($shape, $sightly, $arg{Gap}, $fill, $arg{Compact}, $arg{InformHandler}) . "\n\n\n;die \$\@ if \$\@\n" x $arg{TrapEvalDie}; } # ------------------------------------------------------------------------- sub _get_eye_shapes { my $d = shift; opendir my $dh, $d or die "opendir '$d': $!"; my @e = sort map(/(.+)\.eye$/, readdir($dh)); closedir($dh); @e; } sub _get_eye_string { _slurp_tfile($_[0] . '/' . $_[1] . '.eye') } sub _get_eye_properties { my $f = $_[0] . '/' . $_[1] . '.eyp'; -f $f or return; _get_properties($f); } sub _get_eye_keywords { my $d = shift; my %h; SHAPE: for my $s (_get_eye_shapes($d)) { my $p = _get_eye_properties($d, $s) or next SHAPE; # no properties exists($p->{keywords}) or next SHAPE; # no keywords property my @k = split(" ", $p->{keywords}) or next SHAPE; # no keywords for my $k (@k) { push(@{$h{$k}}, $s) } } return \%h; } sub _find_eye_shapes { my $d = shift; @_ or die "oops, no keywords given"; my @skey = map([split/\s+OR\s+/], @_); my @ret; SHAPE: for my $s (_get_eye_shapes($d)) { my $p = _get_eye_properties($d, $s) or next SHAPE; # no properties exists($p->{keywords}) or next SHAPE; # no keywords property my @k = split(" ", $p->{keywords}) or next SHAPE; # no keywords my %h; @h{@k} = (); for my $k (@skey) { # XXX: short-circuiting List::Util::first() better than grep here. grep(exists($h{$_}), @{$k}) or next SHAPE; # AND, all must be true } push(@ret, $s); } return @ret; } sub get_eye_shapes { _get_eye_shapes(get_eye_dir()) } sub get_eye_string { _get_eye_string(get_eye_dir(), shift) } sub get_eye_properties { _get_eye_properties(get_eye_dir(), shift) } sub get_eye_keywords { _get_eye_keywords(get_eye_dir()) } sub find_eye_shapes { _find_eye_shapes(get_eye_dir(), @_) } # $eye_dir is the directory containing the .eye file shapes. # Note: $eye_dir is only eval-hostile line in EyeDrops.pm; do not change it # for t/19_surrounds.t and "EyeDropping EyeDrops.pm" section of doco relies # on it. Remove ".pm" from "...Acme/EyeDrops.pm" giving directory name. my $eye_dir = __FILE__; chop($eye_dir);chop($eye_dir);chop($eye_dir); sub slurp_yerself { _slurp_tfile($eye_dir . '.pm') } sub get_eye_dir { $eye_dir } 1; __END__ =head1 NAME Acme::EyeDrops - Visual Programming in Perl =head1 SYNOPSIS use Acme::EyeDrops qw(sightly); print sightly( { Shape => 'camel', SourceFile => 'eyesore.pl' } ); =head1 DESCRIPTION C converts a Perl program into an equivalent one, but without all those unsightly letters and numbers. In a Visual Programming breakthrough, EyeDrops allows you to pour the generated program into various shapes, such as UML diagrams, enabling you to instantly understand how the program works just by glancing at its new and improved visual representation. Unlike C and C, the generated program runs without requiring that C be installed on the target system. =head1 EXAMPLES =head2 Getting Started Suppose you have a program, F, consisting of: print "hello world\n"; To convert this little program into an equivalent camel-shaped one, create F as follows: # cvt.pl. Convert helloworld.pl into a camel shape. use Acme::EyeDrops qw(sightly); print sightly( { Shape => 'camel', SourceFile => 'helloworld.pl', Regex => 1 } ); Then run it like this: perl cvt.pl >new.pl After inspecting the newly created program, F, to verify that it does indeed resemble a camel, run it: perl new.pl to confirm it behaves identically to the original F. Instead of using the API, as shown above, you may find it more convenient to use the F command in the F directory: sightly.pl -h (for help) sightly.pl -s camel -f helloworld.pl -r 1 >new.pl cat new.pl (should look like a camel) perl new.pl (should print "hello world" as before) Notice that the shape C<'camel'> is just the file F in the F sub-directory underneath where F is located, so you are free to add your own new shapes as required. For the meaning of Regex => 1 above, see the I section below. =head2 Making Your Programs Easier to Understand If your boss demands a UML diagram describing your program, you can give him this: print sightly( { Shape => 'uml', SourceFile => 'helloworld.pl', Regex => 1 } ); If it is a Windows program, you can indicate that too, by combining shapes: print sightly( { Shape => 'uml,window', Gap => 1, SourceFile => 'helloworld.pl', Regex => 1 } ); producing this improved visual representation: ''=~('('.'?'.'{'.('`'|'%').('['^'-').( ( ( ( ( ( ( ( ( ( ( '`'))))))))))|'!').('`'|',').'"'.('['^ ( ( ( ( ( '+')))) ) ) .('['^')').('`'|')').('`'|'.').(('[')^ ( ( ( ( '/'))))).('{'^'[').'\\'.('"').( '`'|'(').('`'|'%').('`'|"\,").( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '`'))))))))))))))))))))|"\,").( '`'|'/').('{'^'[').('['^"\,").( '`'|'/').('['^')').('`'|',').('`'|'$').'\\'.'\\' .('`'|'.').'\\'.'"'.';'.('!'^'+').'"'.'}'."\)"); $:='.'^'~';$~='@'|'(';$^=')'^'[';$/='`'|"\.";$,= "\("^ (( '}')) ;($\) =( '`')| "\!"; $: =')'^ "\}"; $~ ='*'| "\`"; $^ ='+'^ "\_"; $/ ='&'| "\@"; $, ='['& "\~"; $\ =','^ "\|"; $: ='.'^ "\~"; $~ ='@'| "\("; $^ =')'^ '[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}'; ($~)= (( '*')) |'`'; $^ ='+'^ "\_"; $/ ='&'| "\@"; $, ='['& "\~"; $\ =','^ "\|"; $: ='.'^ "\~"; $~ ='@'| "\("; $^ =')'^ "\["; $/ ='`'| "\."; $, ='('^ "\}"; $\ ='`'| '!';$:=')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@'; $,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|"\(";$^= ')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:=')'; This is a Visual Programming breakthrough in that you can tell it is a Windows program and see its UML structure too, just by glancing at the code. For Linux only, you can apply its F command to the program's source text: print sightly( { Shape => 'srcbanner', Width => 70, SourceFile => 'helloworld.pl', Regex => 1 } ); The generated program is easier to understand than the original because its characters are bigger and easier to read. =head2 An Abbreviated History of Perl 6 Here is a summary of the Perl 6 development effort so far: print sightly( { Shape => 'jon,larry,damian,simon,parrot,' . 'buffy3,autrijus', Gap => 3, Regex => 1, Print => 1, Indent => 1, SourceString => <<'END_HAIKU' } ); Coffee mug shatters Larry Apocalyptic Parrot not a hoax Design, debate, sift Prankster Piers pawky precis Weekly light relief Gallop Ponie bold! Beer to gulp, Buffy astride Orange sky surrounds Lambda hugs camel Precocious pup productive Sixth pearl glorious END_HAIKU producing: ''=~( '('."\?". '{'.('['^'+' ).('['^"\)").( '`'|')').('`'| '.').('['^'/'). '"'.('`'^'#').( '`'|'/').(('`')| '&').('`'|'&').( '`'|'%').("\`"| '%').('{'^'['). ('`'|('-')).( '['^"\.").( '`'|"'").( '{'^'[').('['^'(') .('`'|'(').('`'|'!') .('['^'/').('['^"\/").( '`'|'%').('['^')').('['^"\(").( '!'^'+').('`'^',').('`'|'!').('['^')').( '['^')').('['^'"').('{'^'[').('`'^'!').('['^'+') .('`'|'/').('`'|'#').('`'|'!').('`'|',').('['^'"'). ('['^'+').('['^'/').('`'|')').("\`"| "\#").( '!'^'+').('{'^'+').('`'|('!')).( '[' ^')').('['^')').('`'|"\/").( '['^'/').('{'^'[').('`'|'.') .('`'|'/').('['^'/').(('{')^ '[').('`'|'!').('{'^'[').('`' |'(').('`'|'/').('`'|('!')).( '['^'#').('!'^'+').('!'^'+').( '`'^'$').('`'|'%').('['^'(').( '`'|')').('`'|"'").('`'|"\."). ','.('{'^'[').('`'|'$').("\`"| '%').('`'|'"').('`'|'!').("\["^ '/').('`'|'%').','.('{'^('[')).( '[' ^'(').('`'|')').('`'|'&').("\["^ '/').('!'^ '+').('{'^'+').('['^')').(('`')| '!').('`'|'.' ).('`'|'+').('['^'(').('['^'/'). +( '`'|'%').('['^')').('{'^'[').('{'^'+').(('`')| ( ( ')'))).('`'|'%').('['^')').('['^'(').('{'^'[').( ( ( '['))^'+').('`'|'!').('['^',').('`'|'+').('['^'"'). (('{')^ '[').('['^'+').('['^')').('`'|'%').('`'|'#').(('`')| ')').('['^ '(').('!'^'+').('{'^',').('`'|'%').('`'|'%').('`'|'+').('`'|',' ).('['^'"').('{'^'[').('`'|',').('`'|')').('`'|"'").('`'|'(').( '['^'/').('{'^'[').('['^')').('`'|'%').('`'|',').('`'|')').('`'| "\%").( "\`"| '&').('!'^'+').('!'^'+').('`'^"'").('`'|'!').( (( '`'))|',').('`'|',').('`'|'/').('['^'+').('{' ^'[').('{'^'+').('`'|'/').('`'|'.').('`'|')' ).('`'|'%').('{'^'[').('`'|('"')).( "\`"| '/').('`'|',').('`'|'$').'!'.('!'^'+' ).('`'^'"').('`'|'%').('`'|'%').("\["^ ')').('{'^'[').('['^'/').('`'|'/').('{' ^'[').('`'|"'").('['^'.').('`'|',').('['^ '+').','.('{'^'[').('`'^'"').('['^"\.").( '`'|'&').('`'|"\&").( '['^'"').('{'^'[').( '`'|'!').('['^"\(").( '['^'/').('['^')'). ('`'|')').('`'|'$').( '`'|'%').('!'^'+') .('`'^'/').('['^ ')').('`'|'!').('`'|'.' ).('`'|"'").('`'|'%').('{'^'[' ).''. ('[' ^'(' ).( '`'| '+' ).+( ( '[' )^(( ( '"' )))) .( ( '{' )^(( ( ( '[' ))) )) .( '[' ^(( (( ( '(' ))) ))). ( '[' ^(( '.') ) ).( '[' ^')' ) .+( '[' ^(')')).( ( '`' )|+ (( ( (( '/' )) ) )) ).( ( ( (( '[' ) )))^+ '.' ) .( '`' | '.').('`'|'$').('['^'(').('!'^('+')).( '!' ^'+').("\`"^ "\,").( ( ( "\`"))| ( '!' ) ) .+( '`' |+ ( ( (( '-' ))) ) ).( ( ( '`'))|'"').( ( ( '`'))|'$').( ( '`' ) | ( ( ( (( '!' ) ) ) )) ) .( ( '{')^ ( ( (( ( (( ( ( ( ( ( ( (( ( '[' ))))))))))))))) ) ).('`'|'('). +( ( ( ( ( ( ( ( ( ( ( ( ( '[' ) ) ) ))) )) ) ) ) )^'.').('`'|"'").('[' ^ ( ( '('))).('{'^'[').(('`')| ( ( ( '#')))).('`'|'!').('`'|'-' ) . ( "\`"| '%').('`'|',') .''. ( ( ( '!') ) ^ '+' ) .( '{' ^'+').('['^')'). ((( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '`' )) ) ) ))))))))))) ) )))))))))))))|+ '%').('`'|'#').('`'| '/').('`'|'#').('`'|')'). ('`' |'/' ).+( '['^ '.') .''. ('[' ^'(' ).+( '{'^ '[') .''. ('[' ^'+' ).+( '[' ^'.' ).+( '['^ '+').( '{'^ '[') .''. ( '[' ^(( '+' ))).('[' ^ ')' ).( ( '`') |(( ( '/' ))) ) .('`'|'$'). ( '[' ^(( ( ( '.' ))) ) ) .+( '`' | ( '#' )). ( ( '[' )^+ ( ( '/' )) ) . ((( ( (( ( ( (( ( (( ( ( (( ( '`') ))))))))) )))))) )|+ ( ')' )). ((( '[' ))^ '-' ) .( (( ('`')))| "\%").( (( ( ( (( (( '!') )) ) )) ))^+ (( ( ( ( '+' )))))).''. ( '{'^"\(").( ( ( ( (( ( ( ( (( ( (( ( '`' ) )) ) ))) ) ))) )))|')' ) .+( "\["^ ( ( ( '#' )))). ( ( ( '[' ))^'/' ).('`'|'('). ('{' ^'['). ('[' ^'+').( '`'|'%').('`'|'!'). ('[' ^"\)").( '`'|',').('{'^'[').('`'| "'") .(('`')| (( ','))). ('`'|"\/").( '['^')').('`'|')') .('`'| '/').('['^ '.').('['^'(' ).''. ('!'^'+'). ('"'). '}'."\)");$:= '.'^"\~"; $~='@'|'(';$^=')'^'[';$/='`'|'.' ;$,='('^'}';$\='`'|'!';$:=(')')^ '}';$~='*'|'`';$^='+'^('_');$/= '&'|'@';$,='['&'~';$\=','^'|'; $:='.'^'~';$~='@'|'(';$^=')' ^'[';$/='`'|'.';$,=('(')^ '}';$\='`'|'!';$:="\)"^ '}';$~='*'|('`');$^= '+'^'_';$/=('&')| '@';$,='['& '~';$\=','^"\|"; $:='.'^'~'; $~=('@')| '(';$^=')'^'[' ;$/='`'|'.' ;$,='('^"\}";$\= '`'|"\!";$:= ')'^'}';$~='*'|'`' ;$^='+'^"\_"; $/='&'|'@';$,='['&'~' ;$\=','^"\|"; $:='.'^'~';$~='@'|"\("; $^=')'^'[';$/ ='`'|'.';$,='('^"\}";$\= '`'|'!';$:=')' ^'}';$~='*'|'`';$^='+'^'_' ;$/='&'|'@';$, ='['&'~';$\=','^'|';$:='.'^ '~';$~='@'|'('; $^=')'^'[';$/=('`')| '.' ;$, ='('^'}' ;$\='`'|'!';$:=')' ^'}';$~ ='*'|'`';$^=('+')^ '_';$/= '&'|'@';$,='['&'~' ;($\)= ','^'|';$:='.'^'~'; $~='@' |'(';$^=')'^'[';$/= "\`"| '.';$,='('^"\}";$\= ( '`') |'!';$:=')'^'}';$~ = '*' |'`';$^='+'^'_';$/ = (( '&'))|'@';$,="\["& ( (( '~')));$\=','^'|'; ( ( ( ( ( ( ( $:)))))))='.'^"\~"; ( ( ( ( ( $~)))))='@'|'(';$^ =')'^ '[' ; ( ( $/))='`'|'.';$, ='('^'}' ;($\) = ( ( '`'))|'!';$: = ( ')')^"\}"; ( $~) = '*' | ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '`')))))) ) ) ) ))))))))))))) ) ) )))))))) ; ( ( $^))='+'^'_'; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( $/))))))) )))))))))))))) ))))))))))='&'|"\@"; $,='['&'~';$\=','^'|';$:= '.'^'~';$~=('@')| '(';$^= ')'^'[';$/='`'|'.';$, ='('^'}' ;$\='`'|'!';$:=')'^'}';$~='*'|'`';$^ ='+'^'_';$/='&'|'@';$,='['&'~';$\="\,"^ '|';$:='.'^'~';$~='@'|'(';$^=')'^('[');$/= '`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~= '*'|'`';$^='+'^'_';$/='&'|'@';$,='['&"\~";$\= ','^'|';$:='.'^'~';$~='@'|'(';$^=')'^ '[' ;$/='`'|'.';$,='('^'}';$\='`'|'!';$:= ')' ^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@' ;$,='['&'~';$\=','^'|';$:='.'^'~';$~= '@'|'(';$^=')'^'[';$/='`'|'.';$,="\("^ '}';$\='`'|'!';$:=')'^'}';$~='*'|"\`"; $^='+'^'_';$/='&'|'@';$,='['&('~');$\= ','^'|';$:='.'^'~';$~='@'|'(';$^="\)"^ '[';$/='`'|'.';$,='('^'}';$\='`'|'!'; $:=')'^'}';$~='*'|'`';$^='+'^"\_";$/= '&'|'@';$,='['&'~';$\=','^('|');$:= '.'^'~';$~='@'|'(';$^=')'^"\[";$/= '`'|'.';$,='('^'}';$\='`'|"\!";$:= ')'^'}';$~='*'|'`';$^='+'^('_');$/= '&'|'@';$,='['&'~';$\=','^"\|";$:= '.'^'~';$~='@'|'(';$^=')'^('[');$/= '`'|'.';$,='('^'}';$\='`'|"\!";$:= ')'^'}';$~='*'|'`';$^='+'^"\_";$/= '&' |'@';$,='['&'~';$\=','^'|';$:='.'^ ( '~');$~='@'|'(';$^=')'^('[');$/= '`'| '.';$,='('^'}';$\='`'|('!');$:= ')'^'}' ;$~='*'|'`';$^='+'^'_';$/='&'| '@';$,='['& '~';$\=','^'|';$:='.'^'~';$~= '@'|'(';$^=')' ^'[';$/='`'|"\.";$,= (( '('))^'}';$\='`'| '!';$:=')'^('}');$~= ( '*')|'`';$^='+'^'_' ;$/='&'|'@';$,="\["& ( ( '~'));$\=','^'|'; $:='.'^'~';$~='@'|'(' ; $^=')'^'[';$/= '`'|'.';$,='('^'}';$\ ='`'|"\!"; ($:) =')'^'}';$~='*' |'`';$^ =(( '+'))^('_');$/= '&' |+ '@';$,='['&"\~"; ( $\)=','^"\|";$:= '.'^'~';$~="\@"| '(';$^=')'^"\["; $/ ='`'|'.' ;$,=('(')^ '}';$\="\`"| '!' ;$: = ( ( ( ')' )) )^(( '}' ));$~ ='*' |'`'; ( $^)= "\+"^ '_'; $/="\&"| '@' ;($,) = '[' & ( ( ( ( ( ( ( ( ( ( ( ( ( '~')))))))))) ) ) );$\=','^'|';$: = '.'^ '~'; ( $~)='@'|'(';$^= ( ( ')'))^'[';$/= (( ( '`')))|"\.";$,= ( ( '('))^'}'; ( ( $\))='`'|'!'; ( $:)=')'^'}'; $~ = '*'|('`');$^= ( ( ('+')))^ '_'; $/ = '&'|('@');$,= ( '[')&'~' ; ( $\ ) =','^"\|";$:= '.' ^+ '~'; $~= (( ( '@')))|"\(";$^= ')' ^+ (( ( (( '[' ) ))));$/='`'|('.');$,= (( (( '(')) )) ^ '}';$\='`'|'!';$:=')'^ (( '}'));$~ =( '*' )|'`';$^='+'^'_';$/='&'| '@' ;$,='['& (( '~'));$\=','^'|';$:='.'^'~'; $~ ='@' |('(');$^= (')')^ '[';$/='`'|'.';$,='(' ^(( (( '}')))) ;($\)= '`' |'!';$:=')'^"\}";$~= '*'|('`');$^= (( ( '+' )) )^"\_";$/= (( '&') )|'@';$, ='[' &'~' ;$\=',' ^'|';$: =( '.')^"\~"; ($~)= '@'|'(' ;$^ =')' ^(( (( '[' ))) );( $/ )=( (( '`' )) )|'.';$,= (( (( (( '(')) )) ))^'}' ;( ( $\) )='`' |+ '!' ;( $: )= "\)"^ '}' ;( $~ )= (( '*'))|'`'; $^= '+'^ '_' ;( $/ )=(( '&'))| (( '@') );( $, )= '['& '~';$\ ="\,"^ '|' ;( $: )= (( '.'))^'~';$~ =( (( '@' )) )| (( "\("));$^= (( ')' ) )^ (( '[')); $/ ='`' |+ '.' ;$,= ( (( (( (( (( (( '(') ) )) )) ) )) ))^(( ( ( (( '}'))) )) ); $\ ='`' |+ (( '!')) ;( $: )=')'^'}' ;( ($~)) ='*' |+ (( '`'));$^ ='+'^'_';$/= "\&"| '@'; $,= (( '['))&"\~";$\= ','^ '|';$: ="\."^ '~';$~='@'|'(';$^=')'^'[';$/= ('`')| '.';$,='('^"\}";$\= '`'|'!';$:= ')'^'}' ;$~='*'|'`' ;$^='+'^ '_';$/='&' |'@';$,= '['&'~'; $\=','^ '|';$:='.' ^'~';$~= '@'|'(' ;($^) =')'^'[' ;$/='`' |"\."; ($,)= '('^'}' ;($\)= '`'| '!';$: =(')')^ "\}"; ($~)= ('*')| '`';$^='+' ^'_' ;$/=('&')| '@';$,="\["& '~'; $\=','^'|'; $:='.'^"\~"; ($~) ='@'|'(';$^ =')' ^'[' ;($/) ='`'|'.';$, ='(' ^+ '}';$\ ='`'|'!';$:= ')'^'}'; $~='*'| '`';$^='+' ^'_';$/= ('&')| '@';$,= '['&'~' ;$\=',' ^('|');$:= '.'^'~' ;$~='@'|'(';$^ =')'^'['; $/='`'|'.';$,='(' ^'}';$\='`' |'!';$:=')'^'}';$~= '*'|"\`";$^= '+'^'_';$/='&'|"\@"; $,='['&'~';$\ =','^'|';$:='.'^"\~"; $~='@'|'('; $^=')'^'[';$/="\`"| ('.');$,= '('^'}';$\='`'|'!' ;$:="\)"^ '}';$~='*'|'`';$^ ='+'^'_' ;$/='&'|'@';$,="\["& "\~";$\= ','^'|';$:='.'^"\~";$~= '@'|'('; $^=')'^'[';$/='`'|'.';$,= '('^'}'; $\='`'|'!';$:=')'^'}' ;$~='*'|'`' ;($^)= '+'^'_';$/='&'|'@' ;$,='['&"\~"; ($\)= ','^'|';$:="\."^ '~';$~='@'|"\("; $^=')' ^'[';$/='`'|'.' ;$,='('^('}');$\= ('`')| '!';$:=')'^'}' ;$~="\*"| "\`";$^= ('+')^ ( '_');$/=('&')| "\@"; $,='[' &"\~"; ( ( $\)) =',' ^+ "\|"; $:='.' ^(( '~') );($~) ="\@"| '(';$^ =( ')') ^'['; $/='`' |"\."; $,="\("^ (( '}') );$\='`'|('!');$:= (')')^ '}' ;$~= '*'|'`';$^='+'^'_';$/ ="\&"| '@'; ($,) ='['&'~';$\=','^'|';$: ="\."^ '~';$~='@'|'(' ;$^=')'^ "\[";$/= ('`')| '.';$,='('^'}' ;($\) ='`'|'!'; $:=')' ^(( '}'));$~='*'|'`' ;($^) =( '+')^'_';$/=('&')| '@';$, = ( '[')& '~';$\=','^ '|';$: = ( ( ( '.' )))^'~';$~ ="\@"| (( (( '('))));$^ =(')')^ (( ( "\[")));$/= '`'|'.'; $, =( ( (( '('))))^'}' ;$\='`'| '!';$:=')' ^+ '}';$~=('*')| "\`";$^= ( "\+")^ ( '_') ;$/='&'|('@');$,= '['&"\~"; ($\) =','^'|';$:="\."^ '~';$~='@' | ( '('); $^=')'^('[');$/= '`'|'.';$, = ('(')^ '}';$\='`'|'!'; $:=')'^'}'; ( ( ( ( $~))))= '*'|'`';$^='+'^ '_';$/='&' |'@';$, ='['&'~';$\=',' ^"\|";$:= '.'^'~' ;$~='@'|'(';$^= ')'^'['; $/='`'| '.';$,='('^'}'; $\='`'| '!';$:= ')'^'}';$~='*'| '`';$^ ="\+"^ '_';$/='&'|'@'; ($,) ='[' &'~';$\=','^'|' =head2 Just another Perl hacker Let's get more ambitious and create a big self-printing I. my $src = <<'FLAMING_OSTRICHES'; open 0; $/ = undef; $x = <0>; close 0; $x =~ tr/!-~/#/; print $x; FLAMING_OSTRICHES print sightly( { Shape => 'japh', SourceString => $src, Regex => 1 } ); This works. However, if we change: $x =~ tr/!-~/#/; to: $x =~ s/\S/#/g; the generated program malfunctions in strange ways because it is running inside a regular expression and Perl's regex engine is not reentrant. In this case, we must resort to: print sightly( { Shape => 'japh', SourceString => $src, Regex => 0 } ); which runs the generated sightly program via C instead. If you want to use Regex => 1 (to eliminate I alphanumerics), ensure the program to be converted is careful with its use of regular expressions and C<$_>. To produce a I that resembles the original I aka I, try this: print sightly( { Shape => 'merlyn', SourceString => 'Just another Perl hacker,', Regex => 1, Print => 1 } ); producing: ''=~('('.'?'.'{'.('[' ^'+').('['^')').('`'|')').( '`'|'.').('['^'/').'"'.('`'^'*') .('[' ^'.') .('[' ^'(') .('[' ^'/') .('{'^ '[').( "\`"| '!').( '`'| '.').( '`'| ( ( '/'))). ('[' ^ ( ( '/'))).( '`'| ( ( ( ( '('))))). ('`'| ( ( ( ( '%'))))). ('['^ ( ( ( ( ')'))))). ('{'^ '[') .( ( (( ('{'))))^ '+'). ( '`'|'%' ).("\["^ ')').('`' |',').('{'^ '[').('`' |'(').('`' |"\!").( '`'|'#').( ('`')| '+').( '`'|'%') .('['^')') .(( ',' )). '"' .('}'). "\)");$:= ('.')^ ( "\~"); $~='@'| ('(');$^= (( ')' )) ^ (( '[' )) ;($/)= '`'|'.'; $,='('^'}' ; $\='`'|'!' ;($:) =(')')^ ( '}' );($~) = '*' |'`'; ( ( ( $^) ) )= ( ( ( '+' ) ) ) ^ ( ( ( '_' ) ) ) ; ( ( ( $/ ) ) ) = ( ( ( ( ( ( ( ( ( '&')))))))))|'@' ; ( ( ( ( ( ( ( $, ) ) ) ) ) )) = ( (( (( ( ( ( ( ( (( ( ( ( ( '[')) ) ) ) ) ) ) ) ) ) ) ) ) ) ) & ( ( ( ( ( ( ( ( ( ( ( '~' )) ))))))))) =head2 Buffy Looking in the Mirror Because the I encoding is not very compact, you sometimes find yourself playing a surreal form of I, where the winner is the one with the smallest F in: sightly.pl -r 1 -f program_to_be_converted >f.tmp Apart from reducing the (key-)stroke count, you must avoid regexes and strive to replace alphanumeric characters with sightly ones, which do not require sightly encoding. To illustrate, consider the intriguing problem of creating I. Let's start with F: open$[;chop,($==y===c)>$-&&($-=$=)for@:=<0>; print$"x-(y---c-$-).reverse.$/for@: Notice that EyeDrops-generated programs, by default, contain no trailing spaces, which complicates the above program. Buffy looking in the mirror can now be created with: sightly.pl -r 1 -f k.pl -s buffy2 >b.pl cat b.pl (should show Buffy's face) perl b.pl (should show Buffy looking in the mirror) Drat. This requires two I shapes. What to do? Well, you could use the C attribute (C<-T> switch to F) to append the required number of trailing spaces to each line, allowing you to write a briefer F: open$%;chop,print+reverse.$/for<0> and finally produce I with: sightly.pl -T -r 1 -f kk.pl -s buffy2 >bb.pl Alternatively, the C attribute (C<-m> switch to F) could be used to produce a solution free of any trailing spaces: sightly.pl -m -r 1 -f k.pl -s buffy2 >buffy.pl cat buffy.pl (should show Buffy's face) perl buffy.pl (should show Buffy looking in the mirror) producing F: ''=~('(?{'.( '`'|'%').('['^'-' ).('`'|'!').('`'|',' ).+ ( '"' ).( ( '`' )|+ ( '/' )). ( '[' ^(( ( '+' ))) ).('`' |(( '%' ))). ( '`' |(( '.') ) ).+ ((( (( ( ((( ((( ( ( ((( ((( ( '\\'))) ))) ) ) ) ) ) )))) )))))) .'$[;' . ( ( ( (( ( ( ( ( ( (( ( ( (( ( ( ( ( ( '`') )))) ) ) ) ) ))) ) ) ))) ) ) )| ( ( ( ( (( '#' ) ) ) ))) ).(('`')| ('(')).( '`'|'/'). ('['^'+') .',(\\$' .'=='.('[' ^'"') . '==='.+( '`'|'#').')' . '>\\$-' .'&&(\\$-=\\' . '$=)'.( '`'|'&').('`' | ( '/')).( '['^')').'\\' . '@:=<' . ('^'^(('`')| "\.")). ( '>').(';').( '!'^'+' ) .('['^'+'). ('['^')' ).('`'| ')').("\`"| "\.").( ( ('['))^ "\/").'\\$\\"'.( ( "\[")^ ( ( ( ( "\#"))))). ( ( '-')) . ( ( ( ('(')))).( ( ( '[')) ^ ( ( '"'))).'--' . '-'. ( ( ( '`'))|'#'). ( ( ( ( '-')))). ( ( ( ( ( '\\' ) ) ) ) ) . ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '$'))))))))))))))))))))))))).'-).'.('['^ ( ( ( ')')))).('`'|'%').('['^'-').('`'|'%').(('[')^ ( ( ')'))).('['^'(').('`'|'%').'.\\$/'.('`'|'&').( ( ( '`'))|'/').('['^')').'\\@:'.('!'^'+').'"})');$:= ( ( '.'))^'~';$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='(' ; This is perhaps a cleaner solution, though some people find the plain sightly encoding more pleasing to the eye. Showing the face upside down, rather than reflected, is more easily solved with: open$%;print+reverse<0> and easier still for a self-printing shape: open$%;print<0> # self printing open$%;print+map{y;!-~;#;;$_}<0> # replace sightly with '#' =head2 A Somersaulting Camel Let's extend the Buffy example of the previous section to produce a camel-shaped program capable of somersaulting across the screen when run. We start with a generator program, F: print sightly( { Regex => 1, Compact => 1, RemoveNewlines => 1, Indent => 1, BorderGapRight => 1, Shape => 'camel', SourceString => <<'END_SRC_STR' } ); $~=pop||'';open$%; y,!-~,#,,s,(.).,$+,gs,$~&&($_=reverse)for@~=grep$|--,('')x18,<0>; @;=map~~reverse,reverse@~; map{system$^O=~Win?CLS:'clear'; ($-=$_%3)||(--$|,map$_=reverse,@~,@;); print$"x($=/3*abs$|*2-$-),$_,$/for$-&1?@;:@~; sleep!$%}$%..11 END_SRC_STR Note the use of the Compact and RemoveNewlines attributes, necessary here to squeeze the above program into a single camel shape. Running this program: perl gencamel.pl >camel.pl produces F: ''=~('(?{'.( ('`')| '%').('['^'-'). ('`'|'!'). ('`'|',').'"\\$~=' .('['^'+') .('`'| '/').('['^'+').'||'. "'"."'".';'.('`'|'/' ).('['^'+').('`'|'%'). ('`'|'.').('\\$%;').( '['^'"').(',!-~,#,,').( '['^'(').',(.).,\\' .'$+,'.('`'|"'").('['^'(') .',\\$~&&(\\$' .'_='.('['^')').('`'|('%')).( '['^'-').('`'| '%').('['^')').('['^'(').(('`')| '%').')'.("\`"| '&').('`'|'/').('['^"\)").'\\@~='.( '`'|"'").("\["^ ')').('`'|'%').('['^'+').('\\$|--,('). "'"."'".(')').( '['^'#').('^'^('`'|'/')).(':'&'=').',<'. ('^'^('`'|'.') ).'>;\\@;='.('`'|'-').('`'|'!').('['^'+') .'~~'.('['^')' ).('`'|'%').('['^'-').('`'|'%').('['^')'). ('['^'(').('`'|'%').','.('['^')').('`'|'%').('['^'-').('`' |'%').('['^')').('['^'(').('`'|'%').'\\@~;'.('`'|'-').('`'| '!').('['^'+').'\\{'.('['^'(').('['^'"').('['^'(').(('[')^ '/').('`'|'%').('`'|'-').'\\$^'.('`'^'/').'=~'.('{'^"\,").( '`'|')').('`'|'.').'?'.('`'^'#').('`'^',').('{'^'(').(':'). "'".('`'|'#').('`'|',').('`'|'%').('`'|'!').('['^')')."'". ';(\\$-=\\$_%'.('^'^('`'|'-')).')||(--\\$|,'.('`'|'-' ).( '`'|'!').('['^'+').'\\$_='.('['^')').('`'|'%').('[' ^(( '-'))).('`'|'%').('['^')').('['^'(').('`' |('%')). ',' .'\\@~,\\@;);'.('['^'+').('['^(')')).( '`'|')' ).( "\`"| '.').('['^'/').'\\$\\"'.("\["^ ('#')). '(' .'\\$=/'.('^'^('`'|'-')).'*'. (('`')| '!' ).("\`"| '"').('['^ "\("). '\\$|' .+ ('*').( '^'^('`' |',')) .'-\\' .+ '$-),'. '\\$_,'. '\\$' .'/'. ( ('`')| ('&')).( '`'| '/') .('['^ ')').'\\' .'$' .'-' .'&'. (('^')^( '`'| '/') ).'?' .'\\@;' .':' .''. '\\' .'@~;' .''. ('[' ^'(' ).( '`'| ',') .''. ((( '`' ))| '%' ).( '`' |(( '%' ))) .+( '[' ^(( '+' ))) .+ (( '!')). (( (( '\\') )) ). '$%\\}'. (( ((( '\\' ))))) .+ '$' .'%..' .''. ((( '^') )^("\`"| '/' )).( "\^"^( ('`')| ('/'))). '"})'); I. You can run F like this: perl camel.pl normal forward somersaulting camel perl camel.pl b camel somersaults backwards perl camel.pl please do a backward somersault same thing You are free to add a leading C<#!/usr/bin/perl -w> line to F, so long as you also add a blank line after this header line. =head2 Twelve Thousand and Thirty Two Camels In a similar way to the somersaulting camel described above, we create a camel-shaped program capable of emitting twelve thousand and thirty two different camels when run. As usual, we start with a generator program, F: print sightly( { Regex => 1, Compact => 1, RemoveNewlines => 1, BorderGap => 1, Shape => 'camel', SourceString => <<'END_SRC_STR' } ); $~=uc shift;$:=pop||'#';open$%;chop(@~=<0>);$~=~R&& (@~=map{$-=$_+$_;join'',map/.{$-}(.)/,@~}$%..33); $|--&$~=~H&&next,$~!~Q&&eval"y, ,\Q$:\E,c",$~=~I&& eval"y, \Q$:\E,\Q$:\E ,",$~=~M&&($_=reverse), print$~=~V?/(.).?/g:$_,$/for$~=~U?reverse@~:@~ END_SRC_STR Running this program: perl gencamel.pl >camel.pl produces F, which you can run like this: perl camel.pl normal camel perl camel.pl q quine (program prints itself) perl camel.pl m mirror (camel looking in the mirror) perl camel.pl i inverted camel perl camel.pl u upside-down camel perl camel.pl r rotated camel perl camel.pl h horizontally-squashed camel perl camel.pl v vertically-squashed camel And can further combine the above options, each combination producing a different camel, for example: perl camel.pl uri produces a large, bearded camel with a pony-tail, glasses, and a tie-dyed T-shirt. :) F also accepts an optional second argument, specifying the character to fill the camel with (default C<#>). For example: perl camel.pl hv small camel filled with # perl camel.pl hv "$" small camel filled with $ Why 12,032 camels? Combining the main options q, m, i, u, r, h, v can produce 128 different camels. And there are 94 printable characters available for the second argument, making a total of 128 * 94 = 12,032 camels. =head2 Naked Arm Wrestling The final auction at Y::E 2002 in Munich featured an epic athletic contest which you can remember with: use Acme::EyeDrops qw(sightly); my $s = sightly( { Regex => 1, Shape => 'naw', Indent => 1, SourceString => <<'NAKED_ARM_WRESTLING' } ); $/='';open$%;$x=<0>;$y=<0>; substr($y,428,$%)=' AAAAARRRGGGHHH!!!'; map{system$^O=~Win?CLS:'clear'; print$_&1?$y:$x;sleep!$%+($_&1)}$%..9 NAKED_ARM_WRESTLING $s =~ s/ +$//m; print $s; =head2 Baghdad Bob Running this program: print sightly( { Shape => 'baghdad', Regex => 1, Compact => 1, RemoveNewlines => 1, BorderGap => 1, BorderWidthLeft => 3, BorderWidthRight => 3, BorderWidthTop => 2, BorderWidthBottom => 8, SourceString => <<'FAMOUS_COMICAL_ALI_QUOTES' } ); warn+( "Britain is not worth an old shoe!", "There are no American infidels in Baghdad!", "We have them surrounded in their tanks!", "I speak better English than this villain Bush!")[rand(4)],$/ FAMOUS_COMICAL_ALI_QUOTES produces: ''=~('(?{'.('`'|'%').('['^'-').('`'|'!').('`'|',').'"'.('['^',').('`'| '!').('['^')').('`'|'.').'+(\\"'.('`'^'"').('['^')').('`'|')').(('[')^ '/' ).( '`' |'!').('`'|')' ).( '`' |'.').('{'^'[').('`'| ')' ).( '['^'(').('{'^'[').('`'|'.' ).( '`' |'/').('['^'/').('{'^'[').("\["^ ',' ).( '`'|'/').('['^')').('['^'/').("\`"| '(' ).( '{'^'[').('`'|'!').('`'|'.').('{'^'['). ((( '`' ))|'/').('`'|',').('`'|'$').("\{"^ '[' ).( '[' ^'(').('`'|'(').('`'|'/').('`'|'%') .(( '!' )). '\\",\\"'.('{'^'/').('`'|'(').("\`"| '%' ).( '[' ^')').('`'|'%').('{'^'[').('`'|"\!").( '['^ ')' ).( '`'|'%').('{'^'[').('`'|'.').('`'|'/').( "\{"^ '[' ).( '`'^'!').('`'|'-').('`'|'%').('['^"\)").( ('`')| ')' ).( '`'|'#').('`'|'!').('`'|'.').('{'^'[').('`'| ')').('`' |(( '.' ))).('`'|'&').('`'| ')').('`'|'$').('`'| '%' ).( '`'|',').(('[')^ '(').('{'^'['). ((( '`' ))|')').("\`"| '.').(('{')^ '[' ).( '`'^('"')).( '`'|'!'). ((( '`' ))|("'")).( ('`')| '(' ).( '`'|"\$").( "\`"| '!' ).( '`'|"\$"). ('!\\",\\"').( '{'^',').("\`"| '%') .+( '{' ^('[')).( ( '`')|'(' ) .('`' |(( '!' ))).('['^'-' ) . ( ( '`')|'%').('{'^ '[' ).( '['^'/') . ( ( ( '`'))| '(' ).( '`'|'%') . +( ( ( ( '`'))) |(( '-' ))).('{' ^ ( ( ( '['))) ).( '[' ^'(').( '['^'.').('[' ^')').('['^')'). +( (( '`' ))| '/'). ( ( ( '[' ))^ ( ( ( ( ( '.' ))) ) ) ) . ((( '`' ) ) | ( '.' )). ( ( ( ( ( '`' ))) ) |+ '$'). +( ( '`' )|+ ( ( ( '%' ))) ) . ((( '`' ) ) | '$' ).( ( ( ( '{' ))) ^'[').('`' | ( ( ')' ))) . ('`'|'.').('{' ^ '[' ).( ( '[') ^'/' ) . ( '`' |(( ( ( (( ( ( '(' ))) ) )) ))) .+( ( (( '`' ) ))| '%' ).('`'|')').( ( '[' )^+ ( ')')).('{'^ ( '[' )). ( '[' ^(( ( ( '/' ))) ) ).( '`' | '!' ).( ( ( '`' ))| ( ( '.' ))) . ( '`' |(( ( ( '+' ))) )).('['^'(' ).+ '!' .(( '\\')).'",\\"'.('`'^')').('{'^'[').('['^'(').('['^'+').('`'|'%').('`'| '!').('`'|'+').('{'^'[').('`'|'"').('`'|'%').('['^'/').('['^'/').('`'| '%').('['^')').('{'^'[').('`'^'%').('`'|'.').('`'|"'").('`'|',').('`'| ')').('['^'(').('`'|'(').('{'^'[').('['^'/').('`'|'(').('`'|'!').('`'| '.').('{'^'[').('['^'/').('`'|'(').('`'|')').('['^'(').('{'^'[').('['^ '-').('`'|')').('`'|',').('`'|',').('`'|'!').('`'|')').('`'|'.').('{'^ '[').('`'^'"').('['^'.').('['^'(').('`'|'(').'!\\")['.('['^')').("\`"| '!').('`'|'.').('`'|'$').'('.('^'^('`'|'*')).')],\\$/"})');$:='.'^'~'; =head2 99 Bottles of Beer The web site F features programs to display the lyrics of the famous I<99 bottles of beer> song in over 700 different computer languages. Over the years, many different Perl solutions have been proposed. On December 25 1998, for instance, Damian Conway suggested using his Lingua::EN::Inflect module: use Lingua::EN::Inflect 'inflect'; $n=shift||99; print inflect< to C<'s'> and embedding the C inside the first C<@{}> block like so: @{sub b{[@b=(abs||No,bottle.'s'x!!++$_,of,beer),on,the,wall]}b} This saves a stroke because the first C<+b> in the original is replaced by a bald C. Elegant though this solution is, they may have felt a little gobsmacked when the world's leading I golfer, Casey West, uncorked a one stroke solution (C<9>) in that surreal programming language. To produce a solution shaped like a row of beer bottles, run this: use Acme::EyeDrops qw(sightly get_eye_string hjoin_shapes); my $ninety_nine = <<'BURP'; $==pop||99;--$=;sub _{($;=($=||No)." bottle"."s"x!!--$=." of beer")." on the wall"} print+_,", $;! Take one down, pass it around, ",_,"! "while++$= BURP chop($ninety_nine); $ninety_nine =~ s/\nprint/print/; print sightly( { Regex => 1, Compact => 1, ShapeString => hjoin_shapes(2, (get_eye_string('bottle2'))x6), SourceString => $ninety_nine } ); producing: ''=~( '(?{' .('`' |'%') .('[' ^'-') .('`' |'!') .('`' |',') .'"'. '\\$' .'==' .('[' ^'+') .('`' |'/') .('[' ^'+') .'||' .(';' &'=') .(';' &'=') .';-' .'-'. '\\$' .'=;' .('[' ^'(') .('[' ^'.') .('`' |'"') .('!' ^'+') .'_\\{' .'(\\$' .';=('. '\\$=|' ."\|".( '`'^'.' ).(('`')| '/').').' .'\\"'.+( '{'^'['). ('`'|'"') .('`'|'/' ).('['^'/') .('['^'/'). ('`'|',').( '`'|('%')). '\\".\\"'.( '['^('(')). '\\"'.('['^ '#').'!!--' .'\\$=.\\"' .('{'^'['). ('`'|'/').( '`'|"\&").( '{'^"\[").( '`'|"\"").( '`'|"\%").( '`'|"\%").( '['^(')')). '\\").\\"'. ('{'^'[').( '`'|"\/").( '`'|"\.").( '{'^"\[").( '['^"\/").( '`'|"\(").( '`'|"\%").( '{'^"\[").( '['^"\,").( '`'|"\!").( '`'|"\,").( '`'|(',')). '\\"\\}'.+( '['^"\+").( '['^"\)").( '`'|"\)").( '`'|"\.").( '['^('/')). '+_,\\",'.( '{'^('[')). ('\\$;!').( '!'^"\+").( '{'^"\/").( '`'|"\!").( '`'|"\+").( '`'|"\%").( '{'^"\[").( '`'|"\/").( '`'|"\.").( '`'|"\%").( '{'^"\[").( '`'|"\$").( '`'|"\/").( '['^"\,").( '`'|('.')). ','.(('{')^ '[').("\["^ '+').("\`"| '!').("\["^ '(').("\["^ '(').("\{"^ '[').("\`"| ')').("\["^ '/').("\{"^ '[').("\`"| '!').("\["^ ')').("\`"| '/').("\["^ '.').("\`"| '.').("\`"| '$')."\,".( '!'^('+')). '\\",_,\\"' .'!'.("\!"^ '+').("\!"^ '+').'\\"'. ('['^',').( '`'|"\(").( '`'|"\)").( '`'|"\,").( '`'|('%')). '++\\$="})' );$:=('.')^ '~';$~='@'| '(';$^=')'^ '[';$/='`'; A larger single beer bottle shape can be produced with: print sightly( { Regex => 1, Compact => 1, Shape => 'bottle', SourceString => $ninety_nine } ); while the canonical solution, shaped like 99 bottles of beer, can be generated with: print sightly( { Regex => 1, ShapeString => join("\n", (hjoin_shapes(3, (get_eye_string('bottle2'))x3))x33), SourceString => $ninety_nine } ); =head2 Sierpinski Triangles A simple and concise Sierpinski triangle generator, F, is: #!perl -l $x=2**pop;print$"x--$x,map$x&$_?$"x2:"/\\",0..$y++while$x which was posted by Mtv Europe to golf@perl.org on 14-sep-2002 as a one stroke improvement on Adam Antonik's original program. Running: perl siertri.pl 4 displays a Sierpinski triangle with 2**4 lines. Proclaiming Mtv's program as the shortest (in Acme::EyeDrops 1.13) only served to provoke Adam Antonik and Eugene van der Pijll into shortening it by exploiting a hard C<$^F>, as shown in some of the examples below: -l print$"x--$x,map$x&$_?$"x2:"/\\",0..$_-1for 1..($x=2**pop) -l $x=2**pop;print$"x--$x,map$x&$_?$"x2:"/\\",0..$y++while$x -l $^F**=pop;print$"x--$^F,map$^F&$_?$"x2:"/\\",0..$y++while$^F -lX061 print$"x--$/,map$/&$_?$"x2:"/\\",0..$y++while$/<<=pop -l print$"x--$^F,map$^F&$_?$"x2:"/\\",0..$y++while$^F*=2**pop -l $_=$"x2**pop;$_="$'/\\",print,s/(?<=\\)../$&^KI^D5/egwhile/^ / An interesting obfuscated Sierpinski triangle generator is: #!/usr/bin/perl -l s--@{[(gE^Ge)=~/[^g^e]/g]}[g^e]x((!!+~~g^e^g^e)< 1, Compact => 1, RemoveNewlines => 1, Indent => 1, BorderGap => 1, BorderWidth => 2, # For 'siertri' built-in shape, Width=>5 means: # height is 2**5 lines # width is 2 * 2**5 characters Width => 5, Shape => 'siertri', SourceString => <<'END_SRC_STR' } ); $-=!$%<<(pop||4);print$"x$-,map($-&$_?' ':'/\\',$%..$.++),$/while$--- END_SRC_STR producing: ''=~('(?{'.('`'|'%').('['^'-').('`'|'!').('`'|"\,").'"\\$-=!\\$%<<('.( '['^'+').('`'|'/').('['^'+').'||'.('^'^('`'|'*')).');'.('['^'+').('['^ (( (( (( (( (( (( ')') )) )) )) )) )) )) .(('`')| (( (( (( (( (( (( ')') )))) )) )) )) )) .( (( (( (( '`'))))))|'.').( (( (( (( (( (( (( '[') )))) )) )) )) )^ (( (( (( (( '/'))))) )))).''. (( (( (( (( (( (( (( (( '\\' )))) )))) )))) )) )) .+ (( (( (( (( (( (( (( (( (( '$')))))))))))))))))).'\\"'.('[' ^+ (( (( (( (( (( '#') )))) )) )) )) .+ (( (( (( (( '\\')))) )))).'$' .+ (( (( (( (( (( (( (( '-') )))) )))) )))) ). (( (( (( (( (( (( (( (( (( (( (( ','))))))))))))) ))))))))).("\`"| (( (( (( (( (( (( (( (( '-') )))) )))) )))) )) )) .( (( (( (( (( (( (( (( (( (( '`'))))) )))))))) )))))|(( '!'))).( (( (( (( (( (( (( (( (( (( (( (( (( '[') )))) )))) )))) )))) )))) )))^ '+') .+ (( (( (( (( (( (( (( (( (( (( (( (( (( (( (( (( (( (( (( '(')))))))))))))))))))))))))))))))))))))).'\\$-&\\$_?'."'".('{'^ (( (( (( '['))))))).('{'^'[')."'".':'."'".'/\\\\\\\\'."'".',\\$%..\\$.++),\\$/' .('['^',').('`'|'(').('`'|')').('`'|',').('`'|'%').'\\$---"})');$:='.' =head2 Dueling Dingos During the TPR02 Perl Golf tournament, I<`/anick> composed a poem describing his experience, entitled I. You can produce a program that emits his moving poem like this: print sightly( { Shape => 'yanick3', Regex => 1, Print => 1, SourceString => <<'END_DINGO' } ); #!/usr/bin/perl # Dueling Dingos v1.1, by Yanick Champoux (9/4/2002) # # Inspired by the TPR(0,2) Perl Golf contest. # Name haven't been changed, since the involved # parties could hardly be labelled as 'innocent', # and are way far too gone to protect anyway. wait until localtime > @April[0]; # wait until the first of April BEGIN{} study and seek FOR, $some, $inspiration; write $stuff; $score = 145; # no good; delete $stuff { I_can_do_without } and do $more_stuff; delete $even{more_stuff}; reverse $engineer; study; eval $strategy and redo; write, write, write; delete $_{'!'}, delete $"{"@!"}, delete $@{'*'}; # must stop cursing use less 'characters', $durnit; read THE, $current, $solution; not 2, $bad; delete $white_spaces{''} until $program == glob; for( $all, my @troubles ) { unlink 1, $character; } ARGH: $must, not $despair; $I->can(do{ $it }); study new Idea; m/mmmm/m... do{able}; kill $chickens; 'ask', $Nanabozo, 2, bless $me, 'with more inspiration'; $so, close; warn $mailing_list and alarm $Andrew; $toil until my $solution < /-\ndrew's /; GOT_IT: send $solution, $to, ref; $brain, shutdown I,'m dead'; goto sleep; wait; $till, $the, $day, $after; readline last $scoreboard; grep $all, stat; read THE, $stats, $again until $it_sinks_in; $Andrew,'s score' lt $mine; $eyeball, pop @o ; END_DINGO The generated program, being 2577 lines long, is not reproduced here. To generate a shorter program summarising I<`/anick>'s TPR02 anguish: print sightly( { Shape => 'yanick,eye,mosquito,coffee', Gap => 3, Regex => 1, Print => 1, SourceString => <<'END_SUFFERING' } ); My head is hurting, my right eye feels like it's going to pop like a mosquito drinking from an expresso addict with high blood pressure, I want to crawl somewhere damp and dark and quiet and I consider never to touch a keyboard again. END_SUFFERING producing: ''=~('('.'?'.'{'.( '['^'+').('['^')').('`'| ')').('`'|'.').('['^'/').'"' .('`'^'-').('['^'"').('{'^'[').( '`'|'(').('`'|'%').('`'|'!').("\`"| '$').('{'^'[').('`'|')').('['^('(')).( '{'^'[').('`'|'(').('['^'.').('['^"\)").( '['^'/').('`'|')').('`'|'.').('`'|"'").','. ('{'^'[').('`'|'-').('['^'"').('{'^'[').('['^ ')').('`'|')').('`'|"'").('`'|'(').('['^'/').( '{'^'[').('`'|'%').('['^'"').('`'|'%').('{'^'[' ).('`'|'&').('`'|'%').('`'|'%').('`'|',').(('[')^ '(').('{'^'[').('`'|',').('`'|')').('`'|'+').("\`"| '%').('{'^'[').('`'|')'). ('['^ ('/')). "'".('['^'(').('{'^'['). ("\`"| "'").('`'|'/').('`'|')' ).''. ('`'|'.').('`'|"'").('{' ^'[') .('[' ^'/').('`'|'/').(('{')^ '['). ('['^'+' ).('`'|'/').('['^'+'). ('!'^ '+').('`'| ','). ('`'|')').('`' |'+') .('`'|'%') .''. ('{'^"\[").( "\`"| '!').('{'^ ( "\[")).( "\`"| '-').('`'| ( '/')).( "\["^ '(').('['^ ( '*' )). ('['^'.' ) .+( ( ( ( ( ( ( '`')))) ) )| ( ( ( ')'))) ) . ( ( "\[")^ ( ( '/'))) . ("\`"| '/'). ( ('{')^ '[' ).('`' |'$') . ("\["^ ( ( ( ')'))) ) . ( ('`')| ( ')')) . ( ('`')| ( '.')) . ( ('`')| ( ( ( '+')))) . +( ( ( ('`')))| ( (( ( ( ')')))))). ( (( ( ( '`'))))|'.'). ( (( ( ( '`'))))|"'").('{'^('[')).( (( ( '`')))|'&').('['^')').("\`"| (( ( '/')))).('`'|'-').('{'^'[').( '`'| '!').('`'|'.').('{'^'[').("\`"| ( '%')).('['^'#').('['^'+').("\["^ ( ')')).('`'|'%').('['^'(').('[' ^'(').( '`'|'/').('{'^'[').('`'|'!'). ('`'|'$').('`'|'$').('`'|')' ).('`'|'#').('[' ^ '/').('{'^'[').(('[')^ ( ( ','))).('`'|')').('['^'/') . ( '`'|'(').('{'^'[').('`'|'(').( ( ( '`'))|')').('`'|"'").('`'|'(').( ( ( '!'))^'+').('`'|'"').('`'|(',')).( ( ( '`'))|'/').('`'|'/').('`'|('$')).( ( ( '{'))^'[').('['^'+').('['^')').('`'| ( ( '%'))).('['^'(').('['^'(').('['^'.') . ( '['^')').('`'|'%').','.('{'^('[')).( ( ( '`'))^')').('{'^'[').('['^',').('`'| ( ( '!'))).('`'|'.').('['^'/').('{'^'[') . ( '['^'/').('`'|'/').('{'^'[').('`'| ( ( '#'))).('['^')').('`'|'!').(('[')^ ( ( ','))).('`'|',').('{'^'[').('['^ ( ( '('))).('`'|'/').('`'|('-')).( ( ( '`'))|'%').('['^',').('`'| ( ( '('))).('`'|'%').('['^ ( ')')).('`'|'%'). +( (( '{')) ^ ( "\[")).( ( ( '`'))|'$' ) . ( ( '`')|'!').( ( ( ( ( '`'))))|'-') . ( ( ( '['))^'+').( ( ( ( ( '{'))))^'[') . ( ( ( '`'))|'!').( ( ( ( ( '`'))))|'.' ) . ( ( '`')|'$' ).('{'^'[' ) . ( ( '`')|'$').('`'| ('!')).( '['^ ')' ) . ('`'|'+').('{'^'[') .('`'|'!').('`'| ( '.')).('`'|'$').('!'^'+').('['^"\*").( ( '[')^'.').('`'|')').('`'|'%').('['^'/' ).('{'^'[').('`'|'!') .('`'|'.'). ('`'|('$')).( '{'^('[')).( '`'^')' ).( '{' ^+ ( ( ( (( ( ( ( (( ( ( ( (( ( ( ( (( ( ( ( '[') ) ) ) )) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) . ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '`')))) )))))) ))))) )|'#' ).''. ('`'| '/').('`'|'.').('['^'(').('`'|')').(('`')| '$').( '`'|'%').('['^')').('{'^'[').('`'|('.')).( '`'|'%'). ('['^'-').('`'|'%').('['^')').('{'^'[').('['^ '/' ).('`'|'/').('{'^'[').('['^'/').('`'|'/').( '[' ^'.').('`'|'#').('`'|'(').('{'^'[').("\`"| '!' ).('{'^'[').('`'|'+').('`'|'%').('['^'"' ).( '`'|'"').('`'|'/').('`'|'!').('['^')').( '`'| '$').('{'^'[').('`'|'!').('`'|("'")).( '`'| '!').('`'|')').('`'|'.').'.'.(('!')^ '+') .'"'.'}'.')');$:='.'^'~';$~='@'|'(';$^= ')'^'[';$/='`'|'.';$,='('^'}';$\='`' |'!';$:=')'^'}';$~='*'|'`';$^= '+'^'_';$/='&'|('@');$,= '['&'~';$\=','^'|' =head2 Error Handling The C function returns a properly shaped program string; there is no error return. If something is badly wrong, C is called. So if you are calling C in an environment where it's unacceptable to die, be sure to wrap the C call in an C block. For example: eval { $prog = sightly( { Shape => 'invalid-shape', SourceFile => 'eyesore.pl', InformHandler => sub {} } ); }; if ($@) { warn "sightly died: $@\n" } =head2 EyeDropping EyeDrops.pm To illustrate EyeDropping a non-trivial module, we convert F itself into a I, via the following generator program, F: use Acme::EyeDrops qw(sightly); # Slurp EyeDrops.pm into $orig string. my $orig = Acme::EyeDrops::slurp_yerself(); # Split $orig into the source ($src) and the pod ($doc). my ($src, $doc) = split(/\n1;\n/, $orig, 2); # Remove the line containing $eye_dir = __FILE__ ... # because this line confuses eval. $src =~ s/^(my \$eye_dir\b.*)$//m; # Generate the new sightly version of EyeDrops.pm. print $1, sightly( { Regex => 0, Compact => 1, TrapEvalDie => 1, FillerVar => ';#', Shape => 'camel', Gap => 1, SourceString => $src } ), ";\n1;\n", $doc; Running this program: perl mkeye.pl >m.tmp produces F, which can be copied over the top of the original F in the Acme directory. Though the new I version passes the regression test suite, it's about 4 times slower than the original. Notice that we used Regex => 0 (since EyeDrops.pm uses many regular expressions), TrapEvalDie => 1 (since EyeDrops.pm calls the C function) and FillerVar => ';#' (to avoid possible warnings due to unused variables). Notice too that the only known I line in EyeDrops.pm: my $eye_dir = __FILE__; ... was extracted and inserted at the top of the new file. =head2 Encoding Binary Files But wait, there's more. You can encode binary files too. print sightly( { Shape => 'camel,mongers', SourceFile => 'some_binary_file', Binary => 1, Print => 1, Gap => 3 } ); This is prettier than I. To encode: sightly.pl -g3 -bps camel,mongers -f some_binary_file >eyesore To decode: perl eyesore >f.tmp To verify it worked: cmp f.tmp some_binary_file =head2 Victoria Bra, Secret Tango ''=~('(?{'.('['^'+'). ('['^')').('`'|')').('`'|'.' ).('['^'/').'"'.('`'^'!').("\`"| '.').('{'^'[').('`'|'/').('['^')').( '`'|'!').('`'|'.').('`'|"'").('`'|'%'). '-'.('`'|',').('`'|'/').('['^'-').('`'|')' ).('`'|'.').('`'|"'").('{'^'[').('{'^'+') .( '`'|'%').('['^')').('`'|',').('{'^'['). ("\`"^ '%').('['^'.').('['^')').('`'|"\/"). '-'.(('`')| '(').('`'|'!').('`'|"\#").( '`'|"\+").( '`'|'%').('['^')').('{'^'[' ).('`'|'!' ).('`'|'.').('`'|('$')).( '{'^'['). ('`'|'-').('`'|('/')).( '`'|'$').( '`'|'%').('['^')').( '`'|'.'). ('{'^'[' ).(('`')| "\!").( '['^')'). ("\["^ '/').('`' |')'). ('['^'(') .( ('[')^ ( ('/'))).( (( '!')) ^ ('+')). '"}' .')') ;$: = '.'^ (( '~' ));( ( ( $~ )))=( ( (( (( ( '@' ) ) ) ) ) ))| ( (( '(') ) ) ; ( ( ( ( ( ( ( $^) ) ) ) ) ))= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (( ( ( ( ( ')' ))) ) ) )))) ) ))))))) )) ) ))))))))))))^+ ( ('['));#;# ; # ;#;# ; # ; # ; # ; # ; # ; #;#;#;#;# On 15 August 2003, Perl/Parrot Euro-hacker and modern artist Leon Brocard (pictured above) marched into a secluded aranciate-blessed, orange-walled room at MoMA and tossed a black Victoria's Secret bra (pictured below) into the air, thereby creating a brilliant contemporary site-specific art exhibit. ''=~('(?' .'{'.('[' ^+ (( (( (( (( (( (( (( (( (( ( (( (( (( (( (( (( (( (( (( (( (( (( ( (( (( (( (( (( (( ( ( (( ( (( (( ( (( (( (( ( (( (( (( ( ( (( (( ( (( (( (( (( ( (( ( (( (( ( (( (( (( (( '+' )))) ) )) )))) ))))) )) )) )))))) ))))))) )) )) ))))))) ))))))))) )) )) ))))))))) ))))))))))))) ))))))))))))) ))))))))))))) ))))))).("\["^ ')').('`'|')'). ('`'|'.').("\["^ '/').'"'.('`'^'"'). ('`'|',').('`'|'!' ).('`'|'#').('`'|'+') .('{'^'[').('{'^'-').( '`'|')').('`'|'#').("\["^ '/').('`'|'/').('['^')').( '`'|')').('`'|'!')."'".('[' ^'(').('{'^'[').('['^('(')).( '`'|'%').('`'|'#').('['^')').('`'|'%').('['^'/').('{'^'['). ('`'|'"').('['^')').('`'|'!').('{'^'[').('`'|'$').(('`')| '/').('`'|'.').('`'|'!').('['^'/').('`'|'%').('`'|'$'). ('{'^'[').('`'|"\"").( '['^'"').('{'^"\[").( '`'^'(').(('`')^ '&').('`'^'"'). ('!'^'+') .('"})')) The bra, donated by Elaine -HFB- Ashton, was bought by the artist expressly for this artwork at the YAPC::Europe 2003 auction. An interpretation of Brocard's modern masterpiece is given below: Victoria Bra, Secret Tango (2003) L. Brocard 1976- This, the third work in Brocard's acclaimed "Naranja" sequence, explodes the theme of semantic [a]chromatic aspects of aranciata visual perception, first explored in his celebrated "Buffy" series, and fully explores the concept of supporting relationships, which were touched on in his earlier works. The site's central artifact is a stark reminder of the lack of support in contemporary relationships, with the jumbled juxtaposition of its two cups, indicative of being discarded in a hurry, symbolizing the excessive rapidity and tautness of modern life. As always with Brocard, it is vital to consider the intertextuality of the title of the work, in order to deconstruct the surface meaning of the work itself and penetrate, as it were, to the kernel of the work's "meaning", if such a concept is still relevant in the present context. Consider, for example, the word "Victoria": does it express the moniker of the bra's former occupant or merely the state or district in which she was born? And what of "Secret Tango"? Is it, in the context of the universe that is the present work, merely indicative of the site's location and visual perception, or does it suggest the bra's former resident once furtively enjoyed a rhythmic dance of long gliding steps and sudden pauses with the artist? The viewer will no doubt at this point recall that the word "tango" rhymes with "mango" and thereby grasp the semantic thrust of the work's title. However, the installation itself has even more to reveal when the particularly observant viewer speculates on the site's central device being strapped to its current owner's chiseled torso. This work is extremely fragile. Please do not touch. =head2 Buffy Goes to the Cricket Buffy fans might like to rotate her letters: print sightly( { Shape => 'buffy', Rotate => 0, # try 270, 90 and 180 RotateType => 1, # try 0, 1, 2 SourceFile => 'helloworld.pl', Regex => 1 } ); or have her ride a pony: print sightly( { Shape => 'buffy3,buffy4,riding,a,pony', SourceString => "This is how Catherine the ". "Great died.\n", Gap => 2, Regex => 1, Print => 1 } ); while cricket fans might create a reduced, inverted shape with: print sightly( { Shape => 'cricket', Reduce => 1, Invert => 1, BorderWidth => 1, SourceFile => 'helloworld.pl', Regex => 1 } ); producing: ''=~('('.'?'.'{'.('`'|('%')).( '['^"\-").( '`'|'!').('`'|',' ).'"'.('[' ^'+').('['^')').( '`'|')'). ('`'|'.').('['^'/' ).("\{"^ '[').'\\'.'"'.('`'| "\(").( (( '`'))|'%').('`'| ',') .( '`'|',').("\`"| '/' ).( '{'^'[').("\["^ (( ',') )).('`'|"\/").( ( (( '[')))^')').( (( ( '`')))|',').( '`' | '$').'\\'.''. '\\' .('`'|"\."). '\\'. (( '"'))."\;".( '!'^"\+"). '"'.'}'.')') ;$:=('.')^ '~';$~="\@"| '(';$^=')' ^'[';$/='`'| ('.');$,= '('^'}';$\= '`'|'!'; $:=')'^'}' ;$~='*' |"\`";$^= '+' ^+ ( '_');$/= '&'| '@'; $,='['& '~'; $\=',' ^"\|"; ($:)= ('.')^ "\~"; $~='@'| "\("; ($^) =')'^'[';$/ =('`')| '.' ;$,='('^'}' ;$\=('`')| ( '!');$:=')' ^'}';$~='*'| (( '`'));$^='+'^'_';$/='&'|'@';#; =head2 Snowflakes The C and C attributes (C<-t>/C<-u> switches to F) are handy when you simply want to pour some I text into a shape. To illustrate, consider an entry in the I 2002 Christmas programming contest, F: $_=q~vZvZ&%('$&"'"&(&"&$&"'"&$Z$#$$$#$%$&"'"&(&# %$&"'"&#Z#$$$#%#%$%$%$%(%%%#%$%$%#Z"%*#$%$%$%$%(%%%#%$%$ %#Z"%,($%$%$%(%%%#%$%$%#Z"%*%"%$%$%$%(%%%#%$%$%#Z#%%"#%#% $%$%$%$##&#%$%$%$%#Z$&""$%"&$%$%$%#%"%"&%%$%$%#Z%&%&# %"'"'"'###%*'"'"'"ZT%?ZT%?ZS'>Zv~; s;\s;;g; $;='@,=map{$.=$";join"",map((($.^=O)x(-33+ord)),/./g),$/}split+Z; s/./(rand)<.2?"o":$"/egfor@;=((5x84).$/)x30;map{ system$^O=~W?CLS:"clear";print@;;splice@;,-$_,2,pop@,; @;=($/,@;);sleep!$%}2..17'; $;=~s;\s;;g;eval$; The rules of this contest state that the program source code must fit precisely into the provided snowflake shape. To comply, you can pour the above program into the required shape with: sightly.pl -s snow -f snowing.pl -t -u# -n1 >snowflake.pl or equivalently (using the API instead of F): print sightly( { Shape => 'snow', SourceFile => 'snowing.pl', Text => 1, TextFiller => '#', Indent => 1 } ); producing a valid entry, F: $_= q~v ZvZ&%(' $&"'"&( &"& $&"' "&$Z$#$$$#$%$& "'"& (&# %$&"'"&#Z#$$ $#%# %$%$%$%(%%%# %$%$%#Z"%*#$ %$%$ %$%(%%%#%$%$ %# Z"%, ($% $% $%( %%%# %$ %$% #Z" %*%" %$ %$%$ %(% %%# %$%$%# Z#%%"#%#%$ %$ %$%$##&#%$ %$%$%# Z$ &""$%"&$%$%$%#%"%"&%%$%$%#Z%&% &# %"'"'"'###%*'"'"'"ZT%?ZT%?ZS'>Zv~;s;\s;;g;$;='@,=map {$.= $";join"" ,map((($ .^=O)x(- 33+ord)), /./g ),$ /}split +Z;s/. /(rand )<.2?"o ":$ "/eg for@;=((5 x84).$/) x30;map{ system$^O =~W? CLS:"clear";print@;;splice@;,-$_,2,pop@,;@;=($/,@;); sl eep!$%}2..17';$;=~s;\s;;g;eval $; ###### ########## ## ########## ###### ### ### #### ## #### ### ### ## #### ### ## ### #### ## ############ #### ############ ############ #### ############ ### #### ############## #### ### ####### ####### ### ### Running F produces a pretty C snow-scape. The leftover space at the bottom could be used to add a snowman: $_= q~v ZvZ&%(' $&"'"&( &"& $&"' "&$Z$#$$$#$%$& "'"& (&# %$&"'"&#Z#$$ $#%# %$%$%$%(%%%# %$%$%#Z"%*#$ %$%$ %$%(%%%#%$%$ %# Z"%, ($% $% $%( %%%# %$ %$% #Z" %*%" %$ %$%$ %(% %%# %$%$%# Z#%%"#%#%$ %$ %$%$##&#%$ %$%$%# Z$ &""$%"&$%$%$%#%"%"&%%$%$%#Z%&% &# %"'"'"'###%*'"'"'"ZT%?ZT%?ZS'>Zv~;s;\s;;g;$~=q~ZZZJ_ #_ZH /'\\ZG|#o #o#|ZG|$ <%|ZH\\" \\!_!_!/" /ZG/ )\\ ZF/+\\Z E|-|ZE |-|ZE| -|ZF\\+ /ZG \\)/ ~;;@x=@,= +map{$.= $";;join "",map((( $.^= O)x(-33+ord)),/./g)}split+Z;$~=~s~\s~~g;;s;.;(rand)< .2 ?"o":$";egxfor@;=(5x84)x30;map {# system $^O=~W?CLS :+ "clear";;; ;print $_. $/, ,for $_ -18? @;: ### (( map{ $|= 1; ;;; join "" ,map($|--?$" x(-3 *11+ord):$_, /./g)}split+ Z,$~ ),@x);splice @;, -$_, 2,pop@,;@;=("" ,@;) ;;; ;sleep! $%}+2.. 18# /-\ =head1 REFERENCE =head2 Sightly Encoding There are 32 characters in the sightly character set: ! " # $ % & ' ( ) * + , - . / (33-47) : ; < = > ? @ (58-64) [ \ ] ^ _ ` (91-96) { | } ~ (123-126) A I consists only of characters drawn from this set. The C function converts an ASCII string (0-255) to a sightly string; the C function does the reverse. =head2 Function Reference =over 4 =item ascii_to_sightly STRING Given an ascii string STRING, returns a sightly string. =item sightly_to_ascii STRING Given a sightly string STRING, returns an ascii string. =item regex_print_sightly STRING Given an ascii string STRING, returns a sightly-encoded Perl program with a print statement embedded in a regular expression. When run, the program will print STRING. =item regex_eval_sightly STRING Given a Perl program in ascii string STRING, returns an equivalent sightly-encoded Perl program using an eval statement embedded in a regular expression. =item clean_print_sightly STRING Given an ascii string STRING, returns a sightly-encoded Perl program with a print statement executed via eval. When run, the program will print STRING. =item clean_eval_sightly STRING Given a Perl program in ascii string STRING, returns an equivalent sightly-encoded Perl program using an eval statement executed via eval. =item regex_binmode_print_sightly STRING Given an ascii string STRING, returns a sightly-encoded Perl program with a binmode(STDOUT) and a print statement embedded in a regular expression. When run, the program will print STRING. Note that STRING may contain any character in the range 0-255. This function is used to sightly-encode binary files. This function is dodgy because regexs don't seem to like binary zeros; use C instead. =item clean_binmode_print_sightly STRING Given an ascii string STRING, returns a sightly-encoded Perl program with a binmode(STDOUT) and a print statement executed via eval. When run, the program will print STRING. Note that STRING may contain any character in the range 0-255. This function is used to sightly-encode binary files. =item get_builtin_shapes Returns a list of the built-in shape names. =item get_eye_dir Returns the directory containing the F<.eye> file shapes. This is the F sub-directory underneath where F is located. =item get_eye_shapes Returns a list of the I shapes in ascii-betical order. An eye shape is just a file with a F<.eye> extension residing in the F directory. =item get_eye_keywords Returns a hash reference keyed by keyword, with the value being the list of shapes containing the keyword. =item find_eye_shapes KEYWORDLIST Returns a list of the I shapes in ascii-betical order that contain all keywords in KEYWORDLIST. The keywords in KEYWORDLIST are implicitly AND'ed together. Additionally, you may use OR inside any KEYWORDLIST element. If this is unclear, see the examples in "Shape Properties" section below. =item get_eye_string SHAPENAME Given a .eye SHAPENAME, returns the shape string. =item get_eye_properties SHAPENAME Given a .eye SHAPENAME, returns a hash reference of the shape properties or undef if the shape has no properties. =item slurp_yerself Returns a string containing the contents of F. =item make_triangle WIDTH Returns a triangle shaped string of WIDTH characters. =item make_siertri WIDTH Returns a Sierpinski triangle shaped string containing 2**WIDTH lines. =item make_banner WIDTH STRING Linux only. Returns a banner of STRING, using the Linux command C. =item border_shape SHAPESTRING GAP_LEFT GAP_RIGHT GAP_TOP GAP_BOTTOM WIDTH_LEFT WIDTH_RIGHT WIDTH_TOP WIDTH_BOTTOM Put a border around a shape. =item invert_shape SHAPESTRING Invert a shape. =item reflect_shape SHAPESTRING Reflect a shape. =item reduce_shape SHAPESTRING FACT Reduce the size of a shape by a factor of FACT. =item expand_shape SHAPESTRING FACT Expand the size of a shape by a factor of FACT. =item rotate_shape SHAPESTRING DEGREES RTYPE FLIP Rotate a shape clockwise thru 90, 180 or 270 degrees. RTYPE=0 big rotated shape, RTYPE=1 small rotated shape, RTYPE=2 squashed rotated shape. FLIP=1 to flip (reflect) shape in addition to rotating it. RTYPE and FLIP do not apply to 180 degrees. =item hjoin_shapes GAP SHAPESTRINGLIST Join the shapes specified by SHAPESTRINGLIST horizontally with GAP spaces between each shape. =item pour_text SHAPESTRING TEXTSTRING GAP FILLTEXT Given a shape string SHAPESTRING, a string TEXTSTRING, and a GAP between successive shapes, returns a properly shaped string. That is, pour TEXTSTRING into SHAPESTRING. FILLTEXT (typically '#') is text to be used as a filler for any leftover part of the shape (if not set, don't fill in leftovers). =item pour_sightly SHAPESTRING PROGSTRING GAP RFILLVAR COMPACT IH Given a shape string SHAPESTRING, a sightly-encoded program string PROGSTRING, and a GAP between successive shapes, returns a properly shaped program string. That is, pour PROGSTRING into SHAPESTRING. RFILLVAR is either a reference to an array of filler variables or, alternatively, a string to fill the leftover of the last shape with. Common filler strings are C<''> for no filler at all, or C<'#'> or C<';'> or C<';#'>. A filler variable is a valid Perl variable consisting of two characters: C<$> and a punctuation character. For example, RFILLVAR = C<[ '$:', '$^', '$~' ]>. Do not use C<$;> or C<$"> or C<$_> as filler variables. If COMPACT is 1, use compact sightly encoding, if 0 use plain sightly encoding. If IH (inform handler) is undef, prints status of what it is doing to STDERR; you can override this by providing a subroutine reference taking a single inform string argument. To shut it up, set IH to C. =item sightly HASHREF Given a hash reference, HASHREF, describing various attributes, returns a properly shaped program string. There is no error return; if something is badly wrong, C is called -- so wrap the call to C in an eval block if you can't afford to die. The attributes that HASHREF may contain are: Shape Describes the shape you want. First, a built-in shape is looked for. Next, a 'eye' shape (.eye file in the get_eye_dir() directory unless overridden by the EyeDir attribute) is looked for. Finally, a file name is looked for. ShapeString Describes the shape you want. This time you specify a shape string. SourceFile The source file name to convert. SourceHandle Specify a file handle instead of a file name. SourceString Specify a string instead of a file name. BannerString String to use with built-in Shape 'banner'. Regex Regex can take the following values: 0: do not embed source program in a regex If Regex is positive, embed the program in a regex and: 1: add a leading "use re 'eval';" for Perl 5.18+ only 2: do not add a leading "use re 'eval';" 3: add a leading "use re 'eval';" Do not set this flag when converting complex programs. Compact Boolean. If set, use compact sightly encoding. Print Boolean. If set, use a print statement instead of the default eval statement. Set this flag when converting text files (not programs). Binary Boolean. Set if encoding a binary file. Text Boolean. Set if pouring unsightly text. TextFiller Filler string used with Text attribute. For example, TextFiller => '#'. Gap The number of lines between successive shapes. Rotate Rotate the shape clockwise 90, 180 or 270 degrees. RotateType 0 = big rotated shape, 1 = small rotated shape, 2 = squashed rotated shape. RotateFlip Boolean. Set if want to flip (reflect) the shape in addition to rotating it. Reflect Boolean. Reflect the shape. Reduce Reduce the size of the shape. Expand Expand the size of the shape. Invert Boolean. Invert the shape. Indent Indent the shape. The number of spaces to indent. TrailingSpaces Boolean. Ensure all lines of the shape are of equal length, adding trailing spaces if required. RemoveNewlines Boolean. Remove all newlines from the source before conversion. BorderGap Put a border around the shape. Gap between border and the shape. BorderGapLeft,BorderGapRight,BorderGapTop,BorderGapBottom You can override BorderGap with one or more from the above. BorderWidth Put a border around the shape. Width of border. BorderWidthLeft,BorderWidthRight,BorderWidthTop,BorderWidthBottom You can override BorderWidth with one or more from the above. Width Ignored for .eye file shapes. For built-in shapes, interpreted appropriately for the shape, typically the shape width in characters. If no shape is specified, a rectangular block of Width characters is generated. EyeDir Normally .eye files are got from the EyeDrops directory underneath where EyeDrops.pm is located. You can override that by specifying a directory containing the .eye shape files. InformHandler By default, sightly prints status of what it is doing to STDERR; you can override this by providing a subroutine reference taking a single inform string argument. To shut it up, set to sub {}. TrapEvalDie Boolean. Add closing 'die $@ if $@' to generated program. When an eval code block calls the die function, the program does not die; instead the die string is returned to eval in $@. Using this flag allows you to convert programs that call die. TrapWarn Boolean. Add leading 'local $SIG{__WARN__}=sub{};' to generated program. This shuts up some warnings. Use this option if generated program emits 'No such signal: SIGHUP at ...' when run with warnings enabled. FillerVar Reference to a list of 'filler variables'. A filler variable is a Perl variable consisting of two characters: $ and a punctuation character. For example, FillerVar => [ '$:', '$^' ]. Do not use $; or $" or $_ as filler variables. Alternatively, you may set this to '' if you don't want any filler, or to a string (e.g. '#' or ';' or ';#') to use instead of filler variables to fill the leftover part of the last shape with. =back =head2 Specifying a Shape When you specify a shape like this: sightly( { Shape => 'fred' ... first a built-in C shape is looked for, then EyeDrops looks for the file F in the F directory. If you specify a C<'/'> or C<'.'> in the Shape attribute, a file with that name is looked for instead, for example: sightly( { Shape => '/tmp/fred.eye' ... Finally, you may specify a shape with a string, for example: my $shapestr = <<'FLAMING_OSTRICHES'; ##### ####################### FLAMING_OSTRICHES sightly ( { ShapeString => $shapestr ... If you specify a shape without a source file: print sightly( { Shape => 'camel' } ); a I filler is used to fill the shape. If you specify a source file without a shape: print sightly( { SourceFile => 'helloworld.pl' } ); a shapeless sightly string without any spaces or newlines is generated. You can break this string into fixed width lines via the Width attribute: print sightly( { SourceFile => 'helloworld.pl', Width => 40 } ); Generally, you should specify the Width attribute of I shapes. Notice that the Width attribute is ignored for F<.eye> file shapes. =head2 Shape Reference The I shapes are: banner Linux banner command (/usr/games/banner -w Width) of text in BannerString attribute srcbanner Linux banner command (/usr/games/banner -w Width) of source text siertri A Sierpinski triangle (2**Width lines) triangle A triangle (width Width characters) all A shape consisting of all .eye shapes joined together (Width blank lines between each shape) The F<.eye> file shapes distributed with this version of EyeDrops are: a Horizontal banner of "a" acme Perl/Parrot/Ponie Euro-hacker and modern artist who likes the colour orange and enjoys having his bra-strap twanged adrianh Perl qa expert alien An alien (rumoured to be Ton Hospel, from the Roswell archives circa 1974) alpaca Lama pacos, from South America, with long shaggy hair and related to the llama autrijus The father of Pugs baghdad Baghdad Bob aka Comical Ali beer Beer glass designed by Matthew Byng-Maddick for the cam.pm Beerfestival Perl Programming Contest 2002 bighorn Ovis canadensis (bighorn sheep) found in the Rocky Mountains bleach Vertical banner of "use Acme::Bleach;" bottle A bottle of beer bottle2 Abbreviated version of shape bottle bottle3 A bottle of champagne with a champagne glass bra A bra buffy Vertical banner of "Buffy" buffy2 Buffy's angelic face buffy3 Buffy riding a pony buffy4 Horizontal banner of "Buffy" camel Dromedary (Camelus dromedarius, one hump) camel2 Another dromedary (from use.perl.org) camel3 London.pm's bactrian camel at London zoo campm Horizontal banner of "cam.pm" candle A Christmas candle china1 Chinese characters, roughly translated as "God is added a year of seniority; human is added a year of age, Spring fills the universe; luck and happiness fills the family" coffee A cup of coffee cricket Australia are world champions in this game damian The Acme namespace is all his fault dan The father of parrot debian Debian logo (contributed by Richard Hartmann) dipsy Teletubbies Dipsy (also london.pm infobot name) eugene Champion Perl golfer, Drs Eugene van der Pijll of Utrecht, Holland eye An eye flag_canada Canada's flag, contributed by `/anick gelly Featured speaker at every session of Y::E 2003, Paris golfer A golfer hitting a one iron halloween A witch riding a broomstick heart A heart shape contributed by `/anick hipowls A pair of hip owls japh JAPHs were invented by Randal L Schwartz in 1988 jon Kick-started the Perl 6 development effort by smashing a standard-issue white coffee mug against a hotel wall jon_oxer Linux Australia bigwig (contributed by Paul Fenwick) kangaroo A kangaroo kansai_pm Kansai.pm's mascot (Tiger with Perl characters) contributed by Takanori KAWAI (Japanese) kermit Kermit the frog koaladile A cross between a koala and a crocodile larry Wall, Larry (as opposed to Russell Wall who is Wall, Russ) larry2 Caricature of Larry contributed by Ryan King llama Llamas are so closely related to camels they can breed with them (their progeny are called camas) london Haiku "A Day in The Life of a London Perl Monger" map_australia Map of Australia map_italy Map of Italy map_japan Map of Japan map_uk Map of United Kingdom and Ireland map_world1 World globe, Asian view map_world2 World globe, African view map_world3 World globe, American view merlyn Just another Perl hacker, aka Randal L Schwartz mongers Perl Mongers logo moose A moose moosecamel A moose and a camel (modelled after http://irclog.perlgeek.de) mosquito A mosquito music A musical symbol naw Naked Arm Wrestling (Y::E 2002, Munich) opera Opera browser logo (contributed by Cosimo) panda A panda designed by Yanni Ellen Liu parrot Originally an April fool's joke, the joke was that it was not a joke pgolf Perl Golf logo (inspired by `/anick) pony Horizontal banner of "Pony" pony2 Picture of a Pony pugs Horizontal banner of "Pugs" pugs2 Picture of a Pugs dog riding Horizontal banner of "riding" rose A rose santa Santa Claus playing golf santa2 Santa Claus carrying presents saturn The planet Saturn schwern is my bitch schwern2 Shape schwern without the banner simon The inventor of parrot smiley A smiley face smiley2 Pulling a face smiley3 A sad face snow Snowflake designed by Matthew Byng-Maddick for the cam.pm Christmas Perl Programming Contest 2002 spider A spider (tarantula) spoon A wooden spoon tonick Pictorial representation of a golf contest between Ton Hospel and `/anick; colourful but not very suspenseful tpr Vertical banner of "The Perl Review" uml A UML diagram undies A pair of underpants window A window writing_perl Perl in camel-style by Takanori KAWAI (Japanese) yanick Caricature of `/anick's noggin yanick2 Uttered by `/anick during TPR02 yanick3 Pictorial version of yanick2 yanick4 Abbreviated version of shape yanick It is easy to create your own shapes. For some ideas on shapes, point your search engine at I or I. If you generate some nice shapes, please send them in so they can be included in future versions of EyeDrops. =head2 Shape Properties All the F<.eye> shape files have a corresponding F<.eyp> shape property file, specifying the shape's properties. Currently, the allowed shape properties are: name nick description cpanid author authorcpanid source keywords where valid keywords are: face person perlhacker animal object planet map flag sport underwear hbanner vbanner logo debian opera To give an example of how shape properties might be used, to find all shapes that depict just the faces of perl hackers: use Acme::EyeDrops qw(find_eye_shapes); my @perlhackers = find_eye_shapes('face', 'person', 'perlhacker'); Note that there is an implicit AND between each keyword; that is, the above code finds all shapes with face AND person AND perlhacker keywords. Additionally, you may use OR in any argument, for example: my @perlhackers = find_eye_shapes('face', 'person OR animal', 'perlhacker'); finds all shapes matching face AND (person OR animal) AND perlhacker. Instead of using the API, as shown above, you may also use the F command in the F directory: findshapes.pl -h (for help) findshapes.pl -v face person perlhacker The last example displays the faces and properties of all perl hackers. Please note that these shape properties are experimental and may change in future A::E releases. =head1 BUGS A really diabolical shape with lots of single character lines will defeat the shape-pouring algorithm. You can eliminate all alphanumerics (via Regex => 1) only if the program to be converted is careful with its use of regular expressions and C<$_>. To convert complex programs, you must use Regex => 0, which emits a leading unsightly double C. The code generated by non-zero Regex requires Perl 5.005 or higher in order to run; when run on earlier versions, you will likely see the error message: C. If using Perl 5.18+, the generated file needs a leading "use re 'eval'" when a postive value for Regex is used. The converted program runs inside an C which may cause problems for non-trivial programs. A C statement or an C block, for instance, may cause trouble. If desperate, give the C and C attributes a go, and see if they fix the problem. If the program to be converted uses the Perl format variables C<$:>, C<$~> or C<$^> you may need to explicitly set the C attribute to a Perl variable/s not used by the program. Linux F does not support the following characters: \ [ ] { } < > ^ _ | ~ When the CPAN Text::Banner module is enhanced, it will be used in place of the Linux banner command. =head1 AUTHOR Andrew Savige =head1 SEE ALSO Acme::EyeDrops lightning talk by Flavio Poletti at YAPC::Europe 2008 at F. Acme::EyeDrops in JPerl Advent Calendar (Japanese) at F. The history of Acme::Bleach, Acme::EyeDrops and related modules at F. Software Art page at F. Acme's Y::E 2002 naked arm wrestling movie at F. Japanese translations of selected CPAN modules (including Acme::EyeDrops) can be found at F. (Japanized Perl Resources Project is at F). Perl Obfuscation Engines, for example, yaoe by Perl Monk mtve, at F. More information on 99 bottles of beer can be found at F and F. Similar sites exist for I programs F, and I F. To learn more about HQ9+ programming visit F and F. Perl Monks Obfuscation section. In particular, ideas for EyeDrops shapes were got from: F (Erudil's camel code), F (Spaghetti Obfu), F (Just another Bach Hacker), F (hello world), F (Sierpinski Triangle), F (Halloween JAPH ?), F (Saturn). Changes to Perl 5.18 regex behavior are discussed at F. The Y::E 2002 I talk by Thomas Klausner at F. Les Perl Mongueurs de Paris $A++ page at F. Yanni Ellen Liu's excellent Ascii Art collection formerly at F. More information on I can be found at F. More information on koaladiles (and their relationship to kwalitee) can be found at F. The cam.pm Obfuscated Programming Contests at F. I was played monthly at F and is now played mostly at F. Ton Hospel's excellent generic golf tester can be got from F. The C<--$|> idiom (exploited in the I section) is "explained" in this thread: F. L L L L L L L =head1 CREDITS I blame Japhy and Ronald J Kimball and others on the fwp mailing list for exposing the ''=~ trick, Jas Nagra for explaining his C module, and Rajah Ankur and Supremely Unorthodox Eric for provoking me. I would also like to thank Ian Phillipps, Philip Newton, Ryan King, Michael G Schwern, Robert G Werner, Simon Cozens, and others on the fwp mailing list for their advice on ASCII Art, imaging programs, and on which picture of Larry to use. Thanks also to Mtv Europe, Ronald J Kimball and Eugene van der Pijll for their help in golfing the program in the I section. Keith Calvert Ivey also contributed some levity to this section. Ideas from Adam Antonik, Mtv Europe, Eugene van der Pijll, Ton Hospel and Keith Calvert Ivey were used in the I section. Thanks cog for the prod to add new Shape Properties feature. The jon shape was derived from F. Kudos to Elaine -HFB- Ashton for showing me this. The merlyn shape was derived from this photo F of Randal singing a duet with Samantha Fox. The simon shape was derived from a pencil sketch by the Japanese artist Eiko Yamashita. The candle, china1, panda and santa2 shapes were derived from similar ones at Yanni Ellen Liu's Ascii Art collection. =head1 COPYRIGHT Copyright (c) 2001-2008 Andrew Savige. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Acme-EyeDrops-1.61/lib/Acme/EyeDrops/a.eye100644 52 52 143 10163413422 17547 0ustar00arthurdent 0 0 ###### ## #### #### #### ## #### ####### #### #### #### #### #### ##### ##### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/a.eyp100644 52 52 77 10274032403 17547 0ustar00arthurdent 0 0 description : Horizontal banner of "a" keywords : hbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/acme.eye100644 52 52 4570 10163413422 20264 0ustar00arthurdent 0 0 ##################### ############################ ################################ #################################### ####################################### ########################################## ######################################### ## ####################################### ###### #################################### ########### ########################### ########### ########################### ########## ######################### ######### ####################### ########## #################### ######### ######## ######### ####### ######### ###### ######### ###### ######### ## ###### # ######### ## ##### # ####### #### ##### ### # #### ## ### #### # # ## ##### # ## ## # ### # # # # # ### # ## #### # # # # # # # # # # ### # # # # ### # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # ### ### # # #### # ####### ## # ############## # ########## # # #### # # # # # # # # # # # ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/acme.eyp100644 52 52 316 10274753236 20266 0ustar00arthurdent 0 0 nick : acme description : Perl/Parrot/Ponie Euro-hacker and modern artist who likes \ the colour orange and enjoys having his bra-strap twanged keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/adrianh.eye100644 52 52 4333 10310573505 20765 0ustar00arthurdent 0 0 ################## ######################## ############################# ################################ ########################## #### ########################### # ############################# # ############################## # ############################### # ############################### # ################################ # ################################ # ################## # ####### # ################ # # ###### # # ################ # #### # # # ################# # ## #### # ################# # # ##### # ## ################ # ###### # ##### ############### # ####### # # # ####### ############## ######### # ########## ############## ########## # ########### ###### ########## # # # ############ ########### # ############ # # # ############# # # ############# # # ############# # ############# # # # ############# # # ############# # # ############# # ############# # ############# # ############# # ############# # ############# # ############ # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/adrianh.eyp100644 52 52 133 10310572025 20746 0ustar00arthurdent 0 0 nick : adrianh description : Perl qa expert keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/alien.eye100644 52 52 5325 10163413422 20446 0ustar00arthurdent 0 0 ################### ############################# ################################### ######################################### ############################################# ################################################# ################################################### ##################################################### ####################################################### ######################################################### ########################################################### ########################################################### ############################################################# ############################################################# ############################################################# ############################################################### ############################################################### ############################################################### ############################################################### ############################################################### #### ####################################### #### #### ################################# #### #### ########################### #### ##### ####################### ##### ##### ##################### ##### ###### ################# ###### ##### ############### ##### ###### ############# ###### ###### ########### ###### ##### ######### ##### ###### ######### ###### ####### ####### ####### ####### ####### ####### ######## ##### ######## ######### ##### ######### ########## ##### ########## ############ ####### ############ ########################################### ######################################### ####################################### ##################################### ################################# ############################### ############################# ######################### ##################### ################# ############# ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/alien.eyp100644 52 52 177 10274032470 20444 0ustar00arthurdent 0 0 description : An alien (rumoured to be Ton Hospel, from the \ Roswell archives circa 1974) keywords : face Acme-EyeDrops-1.61/lib/Acme/EyeDrops/alpaca.eye100644 52 52 4510 10163413422 20572 0ustar00arthurdent 0 0 # ####### ### ########## ############# ###### ### ####### #### ############### ################ ########## #### ########### ########### ########### ########### ############## ############ ################################################# #################################################### #################################################### ####################################################### ######################################################### ########################################################## ########################################################## ######################################################### ######################################################## ###################################################### ##################################################### #################################################### ################################################## ################################################# ################################################ ############################################### ############################################### ################## ######################## ######### ######### #################### ######## ######### ################# ####### ######### ##### #### ##### ##### ####### # # ### ##### #### ###### ## #### ### #### ## ## ## #### ## ## ## #### ## ## ## ### ### ## ### ### #### ### ##### ### ##### ###### ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/alpaca.eyp100644 52 52 205 10274032565 20572 0ustar00arthurdent 0 0 description : Lama pacos, from South America, with long shaggy hair \ and related to the llama keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/autrijus.eye100644 52 52 4721 10243437760 21235 0ustar00arthurdent 0 0 ########## ####### ############## ######### ################# ########### ################### ############ #################### ############# ##################### ########### ################### ######### ################## ######### ################# ######## #################### ######## ####################### ######## ######################### ######## ##################### ########### ###### ################## ############# ##### ################ ################ ###### ############### ################# ###### ############## ######### ######## ###### # ############## ##### ###### ###### # # #### #### ## ##### ###### ### #### ###### ###### ###### ## #### ##### ###### ###### ######## ## #### ################## ###### ### #### ##################### ###### #### #### ###################### ###### ############## ######## ######## ###### ############## ##### ######### ###### ### ################ ##### ## ################## ###### # # ##### ########### ###### # # # # ### ########## ###### ## ## ########## ####### ## # ########### ######## ## ## # ## ########### ######## ########## ## ############# ######## # ###### # #### ################# ######### #### ################# ########## # # ##### ################ ########## # ###### ############### ########### # # # # ####### ############### ########## ####### ############### ######### ####### ############### ######## ####### ############### ####### ####### ############### ###### ###### ############### #### #### ############### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/autrijus.eyp100644 52 52 140 10274753222 21215 0ustar00arthurdent 0 0 nick : autrijus description : The father of Pugs keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/baghdad.eye100644 52 52 5566 10163413422 20737 0ustar00arthurdent 0 0 ############## ##################### ########################### ################################ ################################### ####################################### ################################## ### ################################### ### #################################### ### ###################################### #### ######################################## ##### ######################################### ###### ############################################ ######### ################### #################### ################ ############### ############## ############ ############ ######### ########### ###### ########### ##### ########## ############## ############### #### ######### # ######## # ##### ############ # # # # ############### ######## # # # # ###### ######## # ## # # # ###### ######## # # # # ###### ####### ############# ################ ## ## ##### # # # # # # # # # # # # # # # # # # # # # # ## ##### ## # # # # # # # # # # # # ########## # # # # ############## # # #### #### # # # # # ## # # # ## # ## ### # ############# # # ########### # # # # # # # # # # # # # # ########### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/baghdad.eyp100644 52 52 106 10274753272 20730 0ustar00arthurdent 0 0 description : Baghdad Bob aka Comical Ali keywords : face person Acme-EyeDrops-1.61/lib/Acme/EyeDrops/beer.eye100644 52 52 1775 10163413422 20300 0ustar00arthurdent 0 0 ################################ ################################ ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ################################ ################################ ############################## ############################## ############################## ############################## ############################ ############################ ############################ ############################ ########################## ########################## ########################## ########################## ######################## ######################## ######################## ######################## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/beer.eyp100644 52 52 234 10274035116 20263 0ustar00arthurdent 0 0 description : Beer glass designed by Matthew Byng-Maddick for the \ cam.pm Beerfestival Perl Programming Contest 2002 keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bighorn.eye100644 52 52 5024 10163413422 21002 0ustar00arthurdent 0 0 ## ###### ######## ####### ############# ######## ############### ######## ################# ########################### ############################ ############ ##### ######## ############# #### ####### ################### ###### # #################### ###### ###### ############## # ##### #### ############### ####### ############## ##### ############# ##################### ############ ############################################# ############################################### ############################################### ################################################# ################################################### #################################################### ##################################################### ################################################# ################################################# ################################################ ############################################### ############################################# ########################################## ####################################### ######### ########### ############## ######## ##### ############### ####### ############### ####### ###### ######### ##### ###### ####### ##### ###### ##### #### ###### #### #### ###### ### ### ##### ## ### #### ## ### ### ## ### ### ## ### ### ## #### ### ## ##### ### ### ##### #### #### ### #### ### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bighorn.eyp100644 52 52 142 10276262165 21004 0ustar00arthurdent 0 0 description : Ovis canadensis (bighorn sheep) found in the Rocky Mountains keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bleach.eye100644 52 52 31622 10163413422 20613 0ustar00arthurdent 0 0 ### ### ############################ ################################# ################################## #################################### #################################### ######## ###### #### #### #### #### #### ### ### #################################### #################################### #################################### #################################### #################################### #################################### ## ######## ##### ######## ######### ######## ############ ##### ################ ##### ################# #### ########### #### #### ########## ## ### ######## ### ## ######## ### ## ######### ### ## ######### ### ## ######### ### ### ######### #### #### ######### ##### ### ########## ##### ################## ######### ################## ######### ############## ########### ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### ## ## ## ### ##### ########### ## ######### ## ######### ## ######### ######## ######### ## ######## ## ######## ## ######### ## ######### ## ######## ## ######## ## ############### ## #################### ## ########################## ## ########################## ## ######################### ## ######################### ######################### ########################## ## ######################### ## ######################### ############################# ########################## ##################### ################## ################ ########### ######## ### ## ## ## ############ ################### ###################### ########################### ############################## ######### ######### ###### ###### #### #### #### ### ## ### ## ### ## ### ## ### ### ## ## ### ## ##### ### ##### #### ## ## # ## ### ## ### #################################### #################################### #################################### #################################### #################################### ## ### ## #### ### ## ##### #################################### #################################### #################################### ################################### ################################## ################################ ## #### ### ## ##### ## ###### #################################### #################################### ################################### ################################### ################################ ## ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### #### #### ####### ####### ######## ######## ######### ######### ######### ######### ####### ####### #### #### #### #### ####### ####### ######## ######## ######### ######### ######### ######### ####### ####### #### #### ## ### ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ### ### ## ### ### ## ### ### ## ### ### ## ### ### ## ### ### ## ### ### ## #### ### ### #### ### #### ##### #### ##### ####### #### ###### ########## ##### ###### ############# ####### ###### ################# ######### ########### ########## ###################### ############################# ##################### ########################### ################# ######################### ############## ################### ###### ################ ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ## ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### ##### ########### ############# ################# ####### ################### ######### ###### ###### ########## ##### ##### ######### #### #### ### #### #### ### #### #### ### #### #### ### ### ### ##### #### #### ###### ################################# ################################# ################################# ############################### ########################### #### ## # ############ ################### ###################### ########################### ############################## ######### ######### ###### ###### #### #### #### ### ## ### ## ### ## ### ## ### ### ## ## ### ## ##### ### ##### #### ## ## # ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ### ## #### ### #### #### ##### ##### ## ###### #################################### ################################### ################################### ################################## ############################### ############################ ## #### #### ####### ####### ######## ######## # ########### ######### ############### ######### ########## ####### ###### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bleach.eyp100644 52 52 115 10274035214 20561 0ustar00arthurdent 0 0 description : Vertical banner of "use Acme::Bleach;" keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle.eye100644 52 52 2443 10163413422 20645 0ustar00arthurdent 0 0 ########### ########### ########### ########### # # # # # # ######### ########### ########### ########### ########### ############# ############# ############### ############### ################# ################### ##################### ####################### ######################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### ########################### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle.eyp100644 52 52 66 10274035235 20624 0ustar00arthurdent 0 0 description : A bottle of beer keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle2.eye100644 52 52 363 10163413422 20706 0ustar00arthurdent 0 0 ##### ##### ##### ##### ##### ##### ####### ######### ########### ########### ########### ########### ########### ########### ########### ########### ########### ########### ########### ########### ########### ########### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle2.eyp100644 52 52 111 10274035264 20717 0ustar00arthurdent 0 0 description : Abbreviated version of shape bottle keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle3.eye100644 52 52 7221 10163413422 20727 0ustar00arthurdent 0 0 ########### ########### ########### ########### ########### ########### ####### ####### ####### ####### ####### ######### ######### ######### ######### ########### ########### ############# ############# ############### ############### ################# ################### ##################### ####################### ######################### ########################### ########################### ########################### ########################### ########################### #################################### ########################### ################################## ########################### ############################## ########################### ############################ ########################### ######################## ########################### ###################### ########################### ################## ########################### ################ ########################### ############ ########################### ########## ########################### ###### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #### ########################### #################################### ########################### #################################### ########################### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bottle3.eyp100644 52 52 122 10274035340 20715 0ustar00arthurdent 0 0 description : A bottle of champagne with a champagne glass keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bra.eye100644 52 52 3523 11753374120 20127 0ustar00arthurdent 0 0 ######### ######### ## ## ## ## ## ## ## ## ## ## # ## ## ## ## ## ## ## ## ## ## ## ## # ## ## ## ## ## ## # # ## # ## ## # ## ## ## # ## ## ## # # ## ## # ## ## ## ## # ## # ## ## # ## ## ## ## ### #### # ## #### ##### ## ## ###### ####### ## ## ####### ######### ## ## ######### ############# ############# ############# ############## ############### ################ ################### ################## ##################### ###################### ######################### ########################## ########################### ############################# ########################################################### ######################################################### ####################################################### ###################### ##################### ################ ############### ######### ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/bra.eyp100644 52 52 65 11753374130 20101 0ustar00arthurdent 0 0 description : A bra keywords : object underwear Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy.eye100644 52 52 11461 10163413422 20507 0ustar00arthurdent 0 0 ## ## ## ## ## ## ################################################### ################################################### ################################################### ################################################### ################################################### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ### ### #### ### #### ###### #### ##### ######## ##### ##### ########### ###### ######## ####### #################### ######################### ################# ####################### ################# ##################### ############ ################# ##### ######### ## ## ########################## ############################# ############################## ############################## ###### #### #### #### ### ### ## ## ############################## ############################## ############################## ############################## ############################## ## ## ## ## ############################################ ################################################ ################################################## ################################################## ################################################### ## ## ## ## ###### ### ## ########### ########### ########## #### ## ## ## ############################################ ################################################ ################################################## ################################################## ################################################### ## ## ## ## ###### ### ## ########### ########### ########## #### ### ## ##### ## ####### ##### ####### ########## ##### ############## ###### ################ ####### ##################### ######## ################## ## ###################### ################## ########## ####### ######## ####### ######## ## ####### ### ## ## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy.eyp100644 52 52 101 10274035365 20460 0ustar00arthurdent 0 0 description : Vertical banner of "Buffy" keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy2.eye100644 52 52 5026 10163413422 20551 0ustar00arthurdent 0 0 ############ ################# #################### ### # ### ### # ### ### # ### ### # ### ### # ### ### ###### ### ### #### # ### ### #### # ### ### ## # ### ### # # ### ### # ####### ### # # # # # #### ###### ###### # # # # ## # # # # # ## # # ## # # # # # #### #### # # # # ### # # ### # # ## # # # # ## ### # # # ### ######### ######## ######### ######### ######## ########## ##### # ######## ############ # ####### ############# # ####### ############# # # ####### ############# # ###### # ############ ####### # ############ ####### # ########### ######## ####### ########### ####### # ####### ################ # ###### # # # # ########## # # ##### # # # # ########## # # ##### # # # ########### # #### # # # ########### # # # # ######## # # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ######################################## # # # ############################################# # # ############################################## # # ################################################ # # ################################################# # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy2.eyp100644 52 52 72 10274035410 20520 0ustar00arthurdent 0 0 description : Buffy's angelic face keywords : person Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy3.eye100644 52 52 6162 10163413422 20554 0ustar00arthurdent 0 0 ## ######## ########## ############ ### ### # # # # ### ## #### ### ##### #### ##### # #### ##### #### ######## ### ##### # ### # # # # # # # # # # # # # # ############# # # ############### # #### #### # ############### # # ############# ## # ############### # # ########## # # ############# # ############ ## # ############# # # ######## #### ## # ############# # ######## # # ## # ############# ### ## #### ### ## # ############### ### ## ## # ## ### # ##################### ## ## ##### ## # ###################### ## ######## ## ### ######################## ### ######## ## ############################ ## #### ########## ###### ##################### ### ## ####### ###### ### #################### ############# ## # ### ## ########## ## #### ######## #### #### ####### ####### ## ########## ##### ####### ### #### ### ## ### ### ### ## ### ## ### ## ######### ## ## ## ##### ## ###### ## # ### ##### ## ### ## ## ## ##### ### ## ## ## ## ########## ### #### ### ## ## #### ###### ## #### ### ## ## #### ###### ###### ### ## ## ## ## ############ ## ## ### ## ## ## ########## ## ### # ## ## ###### ## #### ## ### #### # ## ## ## ## ## #### # ## ## # ## ##### # # ## ###### ## ## ## #### ## ## ##### ## ## ######### ## ##### #### ## ## ######## ############ ##### #### ### ## ############## #### ###### ###### ############################# ###### ################### ########### ####### ########### ######## ########## ######## ######## ####### ########## ######## ####### ##### ######## ####### ###### ##### ####### ###### #### ###### ####### ##### ##### ###### ########## #### ########## ############ #### ########### ############ #### ########### #### #### ##### ########### #### ## ###### ############ ######## ####### ########## ######## ###### ####### ####### ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy3.eyp100644 52 52 100 10274035434 20537 0ustar00arthurdent 0 0 description : Buffy riding a pony keywords : person animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy4.eye100644 52 52 1663 10163413422 20556 0ustar00arthurdent 0 0 ########### ###### ###### #### ##### ### ### ### ### #### ##### #### #### #### ##### #### #### #### ##### ###### ##### ######## ####### ###### ##### #### ##### #### #### #### #### #### # ######### #### #### #### #### #### # #### ##### #### #### #### #### #### # #### ##### #### #### #### #### #### # #### ##### #### #### #### #### #### #### ###### #### #### #### #### ### #### ##### ########### #### #### ## ########### #### ##### ###### ###### # ## # ### # ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/buffy4.eyp100644 52 52 103 10274035464 20546 0ustar00arthurdent 0 0 description : Horizontal banner of "Buffy" keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel.eye100644 52 52 5434 10163413422 20440 0ustar00arthurdent 0 0 ############ ###### ############### ########## ################## ########## ###### #################### #################### ###################### ##################### ####################### ################### ########################## ############## ############################# ############## ################################ ############### ################################### ############### ###################################### ############### ######################################## ############## ######################################### ############## ########################################## ########################################################## ########################################################### ########################################################## ########################################################### ########################################################### ########################################################## ##################################################### ### ################################################### ### ######################################### ######## ### ###################################### ####### ### ##### ############################## ####### ### ############################# ####### ### ######## ########## ###### ###### ## ####### ######## ###### ###### ## ####### ######## ##### ##### # ###### ######## #### #### ###### ######### #### #### ##### ######## #### #### ##### ####### #### #### #### ###### #### #### #### ### #### #### #### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## ## ###### ## ## ##### ## ## ######## ## ### #### ##### ## ### ###### #### ### #### ######## ### #### ###### ###### ######## ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel.eyp100644 52 52 117 10274730761 20437 0ustar00arthurdent 0 0 description : Dromedary (Camelus dromedarius, one hump) keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel2.eye100644 52 52 2506 10163413422 20517 0ustar00arthurdent 0 0 ######### ########### ############## ####### ##### ################### ################ ######################## ############### ############################## ############# #################################### ########## ####################################### ######### ########################################## ########## ######################################################### ######################################################### ######################################################## ###################################################### ################################################## ######################################### ############ #################### ############ ############ ######### ###### ####### ###### ####### ##### ####### ##### ### ### ##### ### ### ##### ### ### ##### ### ### ##### ### ### ##### ### #### ##### ### #### ###### #### ##### ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel2.eyp100644 52 52 113 10274272724 20515 0ustar00arthurdent 0 0 description : Another dromedary (from use.perl.org) keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel3.eye100644 52 52 4102 10163413422 20512 0ustar00arthurdent 0 0 ## ## ##### ##### ###### ####### ######## ##### ######## ########## ############# ########## ############ ####### ###### ############ ############# ################## ########################### ################### ############################ ################## ############################### ############# ################################# ############# ################################### ################################################### ################################################### #################################################### ################################################### # ################################################## # ################################################## # ################################################# # ########################################## ##### ################################ ####### ##### ########## ########## ####### ##### ##### ######### ##### ##### ######### ##### #### ######### ##### ### ######## ### ### ######## #### ### ### #### #### ### ### ##### #### ### #### ##### #### ## #### #### #### ## ### #### ##### ## #### ###### #### ## #### ##### ##### ### #### ## ###### #### ###### ###### ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/camel3.eyp100644 52 52 116 10274272757 20527 0ustar00arthurdent 0 0 description : London.pm's bactrian camel at London zoo keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/campm.eye100644 52 52 1621 10163413422 20446 0ustar00arthurdent 0 0 #### ###### ##### ###### ##### ##### ##### ##### ###### ##### ## ### ## #### ##### ###### ##### ##### #### ##### ###### ##### ### ### #### #### #### #### #### #### #### #### #### #### #### ## #### #### #### #### #### #### #### #### #### #### ####### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### # #### #### #### #### #### ## ##### #### #### #### #### ##### # #### ##### #### #### #### #### #### ##### #### #### #### ##### ##### #### ###### ###### ###### ## #### ###### ###### ###### #### #### ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/campm.eyp100644 52 52 104 10274273045 20444 0ustar00arthurdent 0 0 description : Horizontal banner of "cam.pm" keywords : hbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/candle.eye100644 52 52 4161 10163413422 20601 0ustar00arthurdent 0 0 # # # # # # # # # # # # # # # # ## # # ### # # # # # ##### # ######## # # ######### # # # ######### ###### # #### # # # ######## # ########### ################ ###################### ########################## ########################## ######################### ######################### ########################## ########################### ############################ ########################## ########################## ####################### ####################### ####################### ####################### ####################### ####################### ####################### ####################### ####################### # ####################### ######### ####################### # # ############# ####################### # ########## ################# ####################### ################# ## #################################### #################### ## ################################################## #### ##################### ## # # # # ############ ############## ################## ################## ### ### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/candle.eyp100644 52 52 70 10274273070 20555 0ustar00arthurdent 0 0 description : A Christmas candle keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/china1.eye100644 52 52 21677 10163413422 20551 0ustar00arthurdent 0 0 #### # # #### ### # ### #### ## ### ################## #### ################### ## #### ## ## #### ## ## ## #### ################# ## #### ## ## # #### ## ## ## ### #### ###################### ###################### #### ## # ### #### ## ## ## # #### ## ## ## # #### ############## ## # #### ## ## ##### ## ## #### # ## ## #### ## ## #### # ## ## # ## ## #### # ########### ## ## #### ## ## ## ## #### ## ## ## ### #### ## ## ## #### #### ########### ## # #### ## ## #### # # #### # #### # # # ## ## #### # ### ### ### ## ## #### ## ## ## ## ## # #### ## ## ## ## ## # # # ## #### ## ############### ## ############## #### # ## ## ## ## # ## #### # ## ## ## ### # #### #### ## ## ## # ## ## # # ## #### ## # ################ ####### ## # # # ## #### # # ## ## ## ## # ## #### # ## ## ## ############# #### # # ## ## ## ## # #### # ############### ## # ## #### ## ## ## ## ## ## ########### #### ## ## ## ## ## ## # ## ## #### #### ## ## ## ## ## # ## ## #### ## ## ## # ### ## #### ########## #### ## ## # # # #### #### ## ## #### ## ## # ## # ## #### ## ## #### ## ### # ## # ## ## #### ## ## # ## ########## #### ## ## ##### ## ## #### ## ## ## # # #### # # # #### # #### # # ### #### ### ### # ## ## #### ## ## ### ## ### #### ## ## ## ## ## ## #### ############ ## ## ## ## ## #### ## ######### ## ## ## #### # ## # ## ################## #### ########## # # # # #### ## ### ### #### ## ## ## ### ## #### ########## ####### ############### #### ## ## ## ## ## #### ## ## ## ## ## #### ########## ## ## # ## #### # ## # ## ## ## ## #### ## ## # ## ## #### ## ## ## # # ## #### ############ ## # ## #### ## ## # ## #### ## ## # ### #### ## ## ## #### #### ## ########## #### #### ## ######## ### #### # #### #### # # # ## #### ### ### ############# #### ## ## ## ## #### ## ## ## ## #### ## # ## ## ## ## #### ## ############# ## ## #### ## # ## ## ## ############ #### ######## ## ## ## ## ## #### ## ## ## ## ## ## #### ## ## ## ## ## ## #### ## ############ ## ## #### ## ## ## ## ## ## #### ## ## ## ## ############ #### ## ## ## ## ## ## #### ## # ## ## ## ## ## #### #### ############ ## ## #### ### ## ## ## # ## #### ### # ## # ## ## #### # ## ## ## #### ## ## ## #### ## ## ###### #### ## # ### #### ## # # #### # #### #### # # #### ## ## ### #### ## ############## ## #### ## ## #### # # ## ## #### ## ########### ### #### ######## ## ## ### #### ## ## ## ## # #### ## ## ## ## # #### ## ########## ## # #### ## # # ## # #### #### # ## ## # #### ### ## ############# ## ## #### ### # ## ## ## ## # #### # ## ## ## ## ## ## #### # ## ## ## ## ## ## #### ## ############ ## ## #### ## ## ## ## # ### #### ## ## ## ## # #### #### ## ## ## ## # ##### #### ## ############ # # #### ## ## ## # #### ## ## # #### # # #### # #### # # # ## ## #### # ### ### ### ## ## #### ## ## ## ## ## # #### ## ## ## ## ## # # # ## #### ## ############### ## ############## #### # ## ## ## ## # ## #### # ## ## ## ### # #### #### ## ## ## # ## ## # # ## #### ## # ################ ####### ## # # # ## #### # # ## ## ## ## # ## #### # ## ## ## ############# #### # # ## ## ## ## # #### # ############### ## # ## #### ## ## ## ## ## ## ########### #### ## ## ## ## ## ## # ## ## #### #### ## ## ## ## ## # ## ## #### ## ## ## # ### ## #### ########## #### ## ## # # # #### #### ## ## #### ## ## # ## # ## #### ## ## #### ## ### # ## # ## ## #### ## ## # ## ########## #### ## ## ##### ## ## #### ## ## ## # # #### # # # #### # #### ### #### ## ## #### ## ## ## ## #### ## ############ ################## #### # ## ## #### # ## ## ## #### ### ## ################ #### ## ## ## #### ## ## ## ## #### ## ## ###################### #### ## ## ## # #### ## ## # ### #### ## ## ## ## ## #### ## ## ################ #### ## ## ## ## #### ## ## ## # ## #### ## ## ## ## ## #### ## ## ## ## ## #### ## ## # # ## #### ## ## # ## #### ## ## ###### #### ## ###### ### #### # ### # #### # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/china1.eyp100644 52 52 404 10274273173 20517 0ustar00arthurdent 0 0 description : Chinese characters, roughly translated at \ "God is added a year of seniority; human is added a \ year of age, Spring fills the universe; luck and \ happiness fills the family" keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/coffee.eye100644 52 52 1213 10163413422 20575 0ustar00arthurdent 0 0 ########################################## ###### ########################################## ######### ############################################# ### ########################################### ### ########################################## ### ######################################## ### ######################################## #### ###################################### #### #################################### #### ####################################### #################################### ############################## ######################## ################## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/coffee.eyp100644 52 52 65 10274273217 20565 0ustar00arthurdent 0 0 description : A cup of coffee keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/cricket.eye100644 52 52 3577 10163413422 21011 0ustar00arthurdent 0 0 ### #### ##### ##### ###### ###### ###### ###### ###### ##### ###### ######## ######### ########## ######## ########### ######## ########## ######## ########## ########### ######### ############## ######## ####### ######## ########### ####### ###################### ####### ###################### ####### ##################### ###### #################### ########################### ############################ ########################### ####### ################ #### ############### ############### ################ ################ ################ ################ ################# ################### ###################### ######################## ######################### ########################### ############################# # ############### ############# ## ############# ############# ### ############ ############# ############# ############# ############# ############# ############## ############ ################ ############ ################## ########### ################# ############ ############## ############ ####### ########### ##### ########### ##### ########## #### ######## ### ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/cricket.eyp100644 52 52 135 10274273244 21000 0ustar00arthurdent 0 0 description : Australia are world champions in this game keywords : sport person object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/damian.eye100644 52 52 5247 10163413422 20612 0ustar00arthurdent 0 0 ############### #################### ######################### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### ### #### #### #### ###### #### #### #### # ### ### ### ######## # ### ### # #### ### # ### ### # ########### # ### ### # # ### ### # # ### ### # # ### ### # # ### ### # # ### ## # # ### # ## # # ## # ## # # ## # #### ######### ###### ### # ### ### ### ### ### ### # ## ## ######## ####### ## # # ## ## #### ## # ## #### ## # # # ### ########## # ########### # # # ## # # # ## # ## # ### # ## # ### # ### ####### # ### ##### # # # ### ##### # # # ### ###### ############ #### ###### #### ####### ################### #### ######## ######################## #### ######## ## ####### ############ ################## ###### ########## ############# ##### ########## ###### ############# ######### ################################ ################################ ############################### ############################## ############################ ######################### ####################### #################### ################# ########### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/damian.eyp100644 52 52 157 10274753071 20612 0ustar00arthurdent 0 0 nick : damian description : The Acme namespace is all his fault keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/dan.eye100644 52 52 5006 10163413422 20114 0ustar00arthurdent 0 0 ########## ################# ####################### ############################## ################################### ####################################### ########################################## ############################################ ############################################## ############################################## ## ############################################# #### ############################################## ##### ############################################# ####### ############################################ ######## ########################################### ########## ########################################### ########## ############# ######################### ########## ############ #################### ########## ########## ############# ########## ######### ########## ######## ######### ####### ###### ######### ####### ###### ## ## ####### ####### ## ## ###### ###### #### ##### ##### ##### # # #### ########### ########### # # ### ##### ##### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # ## # # # # # # # # # # # # # # # # # ################# # # # # ## ## # ############# # ##### # # # # # # # # # # # # # # ########## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/dan.eyp100644 52 52 135 10274753200 20111 0ustar00arthurdent 0 0 nick : dan description : The father of parrot keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/debian.eye100644 52 52 602 11037321655 20560 0ustar00arthurdent 0 0 ############### #################### ####### ###### ##### ####### #### ### ############ #### #### ##### #### #### #### #### ### #### #### #### #### #### ### ##### # ##### #### ############### #### ########### ##### ###### ###### ####### ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/debian.eyp100644 52 52 72 11056723151 20552 0ustar00arthurdent 0 0 description : The Debian logo keywords : debian logo Acme-EyeDrops-1.61/lib/Acme/EyeDrops/dipsy.eye100644 52 52 2213 10163413422 20477 0ustar00arthurdent 0 0 ## ## ## ## ## ## ## ## ## ######## ## #### # ### # # ### ### ## ## ### ### #### ## ### # ### #### ## #### ## ####### ##### # ### # ##### # ## ####### ##################### ####################### ####################### ####################### ###################### ##################### ##################### ################## ################## ######## ### ######### ### ######### #### ######### ##### ########## ###### ########## ###### ######################## ######################## ####################### ######################## ######################### ######################### ############# ######### ########### ####### ######## ####### ######## ######### ######## ######### ######## ######### ####### ####### ###### #### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/dipsy.eyp100644 52 52 77 10274275247 20476 0ustar00arthurdent 0 0 description : Teletubbies Dipsy (also london.pm infobot name) Acme-EyeDrops-1.61/lib/Acme/EyeDrops/eugene.eye100644 52 52 5174 10163413422 20630 0ustar00arthurdent 0 0 ################## ######################## ############################ ################################# #################################### ####################################### ######################################### ############################################ ############################################# ############################################### ############################### ############ ############################# ############ ########################### ######## ########################## ####### ###################### ######## ################## ####### ######### ###### ### ####### # ###### # ####### # #### # ###### # ### # ###### # ### # ##### # ## # ##### # # ### # ##### # # ## # #### # # ### # ### # # ## # ## # # # ### # ## # # # ## # # # ##### ## # # # # # ### ### # ### ## # ## ### # # # ## ##### # # # # # ## ### # #### ### # # ##### ### # ## ## ### # # ### ## ## # # ### ########## ## # # ### ######## ## ## ######## ### ## ######## ### ## ######### ### ## ######### #### ## ########## ###### ########## ## ########### ## ########## ## ########## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/eugene.eyp100644 52 52 240 10274753317 20625 0ustar00arthurdent 0 0 nick : (-ugene description : Champion Perl golfer, Drs Eugene van der Pijll \ of Utrecht, Holland keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/eye.eye100644 52 52 2071 10163413422 20133 0ustar00arthurdent 0 0 ################ # ###################### # # ########################## # # ############################## # # ################################ # # ################################## # # ################################## # # #################################### # # #################################### # # #################################### # # #################################### # # #################################### # # ################################## # # ################################## # # ################################ # # ############################## # # ########################## # # ###################### # ################ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/eye.eyp100644 52 52 26 10274275302 20112 0ustar00arthurdent 0 0 description : An eye Acme-EyeDrops-1.61/lib/Acme/EyeDrops/flag_canada.eye100644 52 52 2414 10163413422 21552 0ustar00arthurdent 0 0 ############### # ############### ############### ### ############### ############### ### ####### ### ############### ############### ################# ############### ############### # ################# # ############### ############### #### ############### #### ############### ############### ############# ############### ############# ############### ############### ######################################### ############### ############### ####################################### ############### ############### ########################################### ############### ############### ##################################### ############### ############### ############################# ############### ############### ####################### ############### ############### ####################### ############### ############### ### ############### ############### ### ############### ############### ### ############### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/flag_canada.eyp100644 52 52 111 10274273573 21553 0ustar00arthurdent 0 0 description : Canada's flag, contributed by `/anick keywords : flag Acme-EyeDrops-1.61/lib/Acme/EyeDrops/gelly.eye100644 52 52 5147 10163413422 20474 0ustar00arthurdent 0 0 ####### #### # ###### ### ### ##### ## # # #### ## # # ### ## ##### # ### ## ########### # #### ## ################ # # #### # #################### ### ######################## # ########################## # ########################### # ############################# # ############################## # ############################## # ############################## # ############################## # ############################# # # # ############################# # # ############### ######### # ### # ############### ###### #### # ################ ##### # ################ ###### # ################# # # ################ # # # ################# # ###### ################ # # # ######## ######## # # # ######## #### ### # # ### ######### #### ### ## ######### ### #### #### ######### #### ### # ######## #### #### # ####### #### ### # ## #### ### ### # ## #### ### ### # # ## #### ### ### # # ### ## # # # ## ### # # # # ## # # # # # # # # # # # # # # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/gelly.eyp100644 52 52 204 10274753123 20464 0ustar00arthurdent 0 0 nick : gellyfish description : Featured speaker at every session of Y::E 2003, Paris keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/golfer.eye100644 52 52 6030 10163413422 20626 0ustar00arthurdent 0 0 ##################################################### ### ###### ### ####### ### ####### ##### #### #### ##### #### ##### ######### ####### ############ ######## ############## ########## ############### ############ ############### ############## ################################# ############################# ################# ###### ################# ###### ####################### ###################### ##################### #################### ################### ################### ################### ################## ################## ################## ################# ################ ################ ################# ################# ################# ################## ################# ################# ################# ################# ################# ################# ################# ################## ################### ##################### ##################### ##################### ##################### #################### ########## ######### ######### ####### ######## ####### ####### ####### ####### ###### ############### ##### ############ #### ######### #### ####### #### ###### #### ##### #### #### ##### ### ####### ## ######## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/golfer.eyp100644 52 52 107 10274273652 20634 0ustar00arthurdent 0 0 description : A golfer hitting a one iron keywords : sport person Acme-EyeDrops-1.61/lib/Acme/EyeDrops/halloween.eye100644 52 52 5706 10163413422 21337 0ustar00arthurdent 0 0 # ## ### #### ##### ###### ####### ###### # ####### ## ####### ## ######### ## ############## ### ################## ###################### # ###################### ############################# ################################ ############################### ################################# ## ############################## ### ################################ ### ################################## ### #################################### ### ##################################### ### ##################################### ### ## ########## ##################### ####### ########## #################### ###### ############# ################### ########################### ################# ############################ ################# ######### ################ ################# ######################## ############### ########################## ############## ######################### ############ ####################### ######### ###### ############### ##### ######################## ### ############ ######### ############# ########### ############ ############## ########### ################ #### ###### ################### ####### ###################### ####### ###################### ### ####################### #### ###################### ##### ###################### ### ##################### #################### ################## ############## ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/halloween.eyp100644 52 52 110 10274274112 21316 0ustar00arthurdent 0 0 description : A witch riding a broomstick keywords : person object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/heart.eye100644 52 52 4354 10163413422 20462 0ustar00arthurdent 0 0 ######### ######### ################## ################## ######################## ######################## ############################# ############################# ############################### ############################### ################################# ################################# ##################################################################### ##################################################################### ####################################################################### ####################################################################### ####################################################################### ####################################################################### ####################################################################### ####################################################################### ####################################################################### ####################################################################### ##################################################################### ##################################################################### ################################################################### ################################################################### ################################################################# ################################################################# ############################################################### ############################################################# ########################################################### ######################################################### ##################################################### ################################################# ########################################### ################################### ########################### ################### ########### ##### ### # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/heart.eyp100644 52 52 64 10274275337 20445 0ustar00arthurdent 0 0 description : A heart shape contributed by `/anick Acme-EyeDrops-1.61/lib/Acme/EyeDrops/hipowls.eye100644 52 52 5235 10163413422 21043 0ustar00arthurdent 0 0 ############### ################### ####################### ######################### ### ########## #### ### ######## #### #### ########## ###### ############################### ############ ################## ############ ################### ############ ##################### ################################## ################################## ################################# ################################## ################################### #################################### #################################### #################################### ##################################### ###################################### ###################################### ####################################### ###################################### ####################################### ####################################### ###################################### #### ###################################### ####### ##################################### ########## ##################################### ############# #################################### ########### # #################################### ########### # ################################### ############## #### ################################# #### ################ ################################ ### ################# ############################### #### ##### ############## ############################# ############## ############### ########################### ################################ ######################### ################################ ######################## ################################ ####################### ############################### ######################### ############################## ########################## ########################### ###### ### ############### ###################### ############## ############## ############# # ####### #### ### ### ###### # ### ###### ### ###### ## ##### # #### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/hipowls.eyp100644 52 52 70 10274274134 21016 0ustar00arthurdent 0 0 description : A pair of hip owls keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/japh.eye100644 52 52 44022 10163413422 20315 0ustar00arthurdent 0 0 ##### ######### ############ ############### ############### ################ #### ######### ### ##### ## ## ## ### #### ###### ### ###### ### ########################################################### ########################################################## ######################################################### ######################################################## ##################################################### ################################################### ### ### ### ### ### ############################ ################################# ################################## #################################### #################################### ######## ###### #### #### #### #### #### ### ### #################################### #################################### #################################### #################################### #################################### #################################### ## ######## ##### ######## ######### ######## ############ ##### ################ ##### ################# #### ########### #### #### ########## ## ### ######## ### ## ######## ### ## ######### ### ## ######### ### ## ######### ### ### ######### #### #### ######### ##### ### ########## ##### ################## ######### ################## ######### ############## ########### ### ### ### ######################################### ########################################## ############################################ ############################################# ############################################# ####### ### ##### ### ##### ### ### ### ## ##### ########### ############# ################# ####### ################### ######### ###### ###### ########## ##### ##### ######### #### #### ### #### #### ### #### #### ### #### #### ### ### ### ##### #### #### ###### ################################# ################################# ################################# ############################### ########################### #### ## # ## ### ## ### #################################### #################################### #################################### #################################### #################################### ## ### ## #### ### #### #### ##### ##### ## ###### #################################### ################################### ################################### ################################## ############################### ############################ ## ############ ################### ###################### ########################### ############################## ######### ######### ###### ###### #### #### #### ### ## ### ## ### ## ### ### ### #### ### #### #### ###### ###### ######### ######### ############################## ########################### ###################### ################### ### ### ### ######################################### ########################################## ############################################ ############################################# ############################################# ####### ### ##### ### ##### ### ### ### ## ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ### ## #### ### #### #### ##### ##### ## ###### #################################### ################################### ################################### ################################## ############################### ############################ ## ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### ## ### ## ### #################################### #################################### #################################### #################################### #################################### ## #### ## #### ##### #### ###### ##### ########## ########### ############# ############# ############ ########### ##### ## ### ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ### ### ## ### ### ## ### ### ### ### ### ### ### ### ### ### #### ### #### ### #### #### #### #### ###### ##### ####### ####### ######### ######### ###################### ##################### ################# ############## ###### ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### ## ### ## ### #################################### #################################### #################################### #################################### #################################### ## #### ## #### ##### #### ###### ##### ########## ########### ############# ############# ############ ########### ##### ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ## ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ### ## #### ### #### #### ##### ##### ## ###### #################################### ################################### ################################### ################################## ############################### ############################ ## ##### ########### ############# ################# ####### ################### ######### ###### ###### ########## ##### ##### ######### #### #### ### #### #### ### #### #### ### #### #### ### ### ### ##### #### #### ###### ################################# ################################# ################################# ############################### ########################### #### ## # ############ ################### ###################### ########################### ############################## ######### ######### ###### ###### #### #### #### ### ## ### ## ### ## ### ## ### ### ## ## ### ## ##### ### ##### #### ## ## # ## ### ## ### ############################################################# ############################################################# ############################################################# ############################################################# ############################################################# ## ###### ## ######## ############## ################ ############## #### ############### #### ### ## ############### ####### ################# ###### ############## #### ############# ### ######### ### ######## #### ### ## ############ ################### ###################### ########################### ############################## ######### ## ######### ###### ## ###### #### ## #### #### ## ### ## ## ### ## ## ### ## ## ### ## ## ### ### ## #### ## ## ##### ## ## ######### ### ################ #### ############## ## ############# ########## ####### ## ### ## ### #################################### #################################### #################################### #################################### #################################### ## #### ## #### ##### #### ###### ##### ########## ########### ############# ############# ############ ########### ##### #### ####### ######## # ########### ############### ########## ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/japh.eyp100644 52 52 127 10274274236 20301 0ustar00arthurdent 0 0 description : JAPHs were invented by Randal L Schwartz in 1988 keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/jon.eye100644 52 52 5325 10163413422 20144 0ustar00arthurdent 0 0 ##### ######### ############ ############## ############## ############### ############### ################ ################ ############### ############### ############# ########### ########## ################## #################### ####################### ############################### ######################################## ################################################ ################################################### #################################### ####### ################################ ### ############################ ############################ ############################ ############################# ############################# ############################## ############################## ############################## ############################## ############################### ################################ ### ################################ ########## ################################ ############# ################################ ## ############################################## # # ################################################ # # ################################################### ####### #################################################### ########## ############################################################### ############################################################### ################################################################ ####### ##### ############################################## ## ############################################# ############################################ ################################### ##### ##################################### ###################################### ####################################### ######################################### ######################################### ##################### #################### ##################### ################### ##################### ################## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/jon.eyp100644 52 52 257 10276262147 20151 0ustar00arthurdent 0 0 description : Kick-started the Perl 6 development effort by smashing \ a standard-issue white coffee mug against a hotel wall keywords : person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/jon_oxer.eye100644 52 52 6713 10751074263 21214 0ustar00arthurdent 0 0 ############ ######################## ############################### ################################### ###################################### ### ############################################## ################################################# #################################################### ###################################################### ########################################################## ########################################################### ################################# ######## ############### ####################### #### # # ##### ########### ###################### ##### ## ## ######### ####################### ### ### ## ########## ###################### ### # ## ######### #################### ## # ########## ################### # # # ######## ################## # ## # ######## ################## # ## # ####### ################# # # ####### ################# # ####### ##### ######### # ###### ## #### ### ## # ######## ## ## # ### ## ## # ########## ###### # ## # ##### ## # ## # ### # # ##### ## # ### # # # ### # # # ### # # # #### # # # ##### # # # ####### # # # ###### ### # # ### ### # # ## ##### # # # ######### # # # ### ############# # ## # ## # # ## # # #### ## # ## # # ####### # ##### # ## # # # # # # # ## # ## ## # #### # # ##### # # ######## ## # ############# # ## ## #### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/jon_oxer.eyp100644 52 52 236 10751122252 21171 0ustar00arthurdent 0 0 description : Jon Oxer keywords : face person author : Paul Fenwick authorcpanid : PJF source : http://flickr.com/photos/pfenwick/361403121/ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kangaroo.eye100644 52 52 3074 11056723151 21163 0ustar00arthurdent 0 0 ############ ################### ## #### ######################## ########## ########################### ########### ############################### ################ ################################### ############################################################ ########################################################## ##################################################### ###################################################### ###################################################### ######################################## ############ # ##################################### ############ ## ########## ##################### ############# #### ##### ################ ###################### #### ############# ############### ### ######### ### ### ## ####### ## ###### ###### ###### ###### ####### ######## ######### ######### ######### ####### ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kangaroo.eyp100644 52 52 60 11056723151 21126 0ustar00arthurdent 0 0 description : A kangaroo keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kansai_pm.eye100644 52 52 7060 10163413422 21316 0ustar00arthurdent 0 0 ## ### ### #### ## ### ### ##### ########### ### ## ## ############# ##### #### ## ## ########## #### ##### #### ## ### #### #### ### ### ### ############ #### ## #### ## ##### ## #### ### ####### ## #### #### #### ### #### #### ### ### #### #### ### ####### ###### #### ### ###### ### # ##### ### ######## #### # ######## ### ########### #### # ##### ##### ## ### ###### ## # #### #### #### ## #### #### ## ###### ##### ## ### ### ## ### ## ## ##### #### #### ### ###### #### ######### #### #### ### ## ### ### #### ## ###### ###### ## ## ### ## ##### ## #### ##### ######## ##### ###### ## ##### ### ########### ########## #### ### ## ### #### ##### ##### #### # # ## # ######### ## ####### ###### ## ###### ##### ## ###### ###### ## ######## ## ####### ## ######## ###### ##### ## ## ##### ## ###### ###### #### ####### ### ## ###### ####### ####### # ###### ###################### ##### ######### ##### # ### ### #### ### #### ########## ###### #### # # #### # ###### ##### #### ### ## ####### #### #### #### ###### ### ## ### ####### ####### ### ##### ##### ##### ##### ###################### ############## ####### ##### #### ## ####### ################### ###### ####### #### #### ##### ############### ### ######### ##### ### ### ####### ##### ##### ######### ##### #### ####### #### #### ####### ### ## ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kansai_pm.eyp100644 52 52 171 10274274531 21316 0ustar00arthurdent 0 0 description : Kansai.pm's mascot (Tiger with Perl characters) \ contributed by Takanori KAWAI (Japanese) Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kermit.eye100644 52 52 5017 10163413422 20647 0ustar00arthurdent 0 0 ######### #### ### ######## ## ## ##### # ######## # ########## # ####### ## ### ### # ####### ## # ## # ## ## # #### # # #### # ###### # # ### # ##### # ## ### ###### # ##### # # #### # ### # ## ## ## # ## ## ## # ### # # # ###### # # # # # # # # # ## # # ## # # # ## # # # # # # # ### # # # # # ### # # # ## #### #### ## # # # ##### ###### # ## # # # ######## ######### ## ## ## # ########## ## # # ## ### ## # # ## ## # # ## ## # ## ## ## ## # ## ## ## ## ## ## ## ## ## ## ## ### ### ## ## ####### ## ## ## ## ## ## #### ############# Acme-EyeDrops-1.61/lib/Acme/EyeDrops/kermit.eyp100644 52 52 63 10274274547 20636 0ustar00arthurdent 0 0 description : Kermit the frog keywords : face Acme-EyeDrops-1.61/lib/Acme/EyeDrops/koaladile.eye100644 52 52 4563 10163413422 21306 0ustar00arthurdent 0 0 ### #### ########## ###### ############################## ##### ################################ ######## ############## ######################### ########################################## ########################################## ######################################### ###################### ## ############ #################### # ### ## ############# # # ########### # ########### # ############# # ############### # ################# # ##################### # ######################## # ############################ # ################################ # #################### ############# # # # ######################### ############# ## ### ############################## ############ ## ################################## ############# ## ###################################### ########### ######################################### #### ############################# ########## ############################## ########## ############ ############ ######## ########### ##### ########### ######## ########## ######### ########### ###### ######### ########### ########### ###### ######## ############# ########### #### ####################### ########### ### ######################## ########### ## ######################## ############ ######################### ############ ######################### ########### ######################### ########### ######################## ######### ######################## ######## ######################### ## ###### ######################## ##################### ############ #### ######## #### ### # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/koaladile.eyp100644 52 52 115 10274274436 21303 0ustar00arthurdent 0 0 description : A cross between a koala and a crocodile keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/larry.eye100644 52 52 5650 10163413422 20510 0ustar00arthurdent 0 0 ################ ####################### ############################## ##### #### #### ### #### ### #### # ### #### # ### #### ## # ### #### # # ### ### ## ## ### ### ## # ### ### #### # ### ### #### # ### ### #### # ### ### ######### # ### ### ## # ## ### ## # ## ### # # ## ### # ##### ### # ## ### # ###################################### ### ############ ####### # # ####### # ### # # ### ### ## # # ## ### ### # ### # # ############ # # ############ # ### # # # # # ## ### # # # ## # ## # ##### # # ## # ## # # # # # # ## # ### ############### # ############ ## # # # # # # # # # # # # ### # # # ### ## # # # ##################### # # # ######################## # # # ########################## # # # ##### ############## #### # # # #### # # ### # ## ### ################ ### # # # # # # # # # # # # # # # # # # # # # # # # # # # ### ## # # ########### # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/larry.eyp100644 52 52 226 10274753060 20505 0ustar00arthurdent 0 0 nick : larry description : Wall, Larry (as opposed to Russell Wall who is \ Wall, Russ) keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/larry2.eye100644 52 52 2177 10163413422 20573 0ustar00arthurdent 0 0 ############## ###################### ######################### ############ ######### ##### ############# ####### ## ### ### ########### ####### # ### ### ############ ##### # ### ### ########### #### # ## #### ########## #### # ###### ### ### # # ## ######### # # # # # ## ######### ##### #################### ######## ## ###### ## ## # ## ######## ### # # # ## ######## ## # # # # # ## ####### ## # # # ## ###### ## ## ## ### ####### # ######## #### ## ####### # ##### ##### # ## ######### ####### ########## ####### ########## ########### ##### # ######### # ###### # ##### #### # #### # # ### # ### ### # ## # # ## ## # # ########## # ### ## # # ## ## # ## # # ######## # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/larry2.eyp100644 52 52 167 10274753041 20572 0ustar00arthurdent 0 0 nick : larry description : Caricature of Larry contributed by Ryan King keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/llama.eye100644 52 52 4020 10163413422 20433 0ustar00arthurdent 0 0 ############ ######### ####### #################### ############# ### ########## ######### ######## ######## ######## ######## ######### ###### ####################### ########## ######### ########################## ############# ########## ########################################### ###################################################### ###################################################### ###################################################### #################################################### ################################################## ################################################ ############################################### ################# ########################### ################ ######################### ############### ####################### ############## #################### ############ ################# ########## ##### ######### ######## ######### ###### #### #### ##### #### #### #### ### #### #### ### #### ##### ### ### #### ## ### #### ## ### ### ## ## ## ## ## ## #### ## ## #### #### ##### #### ###### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/llama.eyp100644 52 52 230 10274274717 20444 0ustar00arthurdent 0 0 description : Llamas are so closely related to camels they can \ breed with them (their progeny are called camas) keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/london.eye100644 52 52 33653 10163413422 20674 0ustar00arthurdent 0 0 ############ ################# #################### ### # ### ### # ### ### # ### ### # ### ### # ### ### ###### ### ### #### # ### ### #### # ### ### ## # ### ### # # ### ### # ####### ### # # # # # #### ###### ###### # # # # ## # # # # # ## # # ## # # # # # #### #### # # # # ### # # ### # # ## # # # # ## ### # # # ### ######### ######## ######### ######### ######## ########## ##### # ######## ############ # ####### ############# # ####### ############# # # ####### ############# # ###### # ############ ####### # ############ ####### # ########### ######## ####### ########### ####### # ####### ################ # ###### # # # # ########## # # ##### # # # # ########## # # ##### # # # ########### # #### # # # ########### # # # # ######## # # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ######################################## # # # ############################################# # # ############################################## # # ################################################ # # ################################################# # ########### ###### ###### #### ##### ### ### ### ### #### ##### #### #### #### ##### #### #### #### ##### ###### ##### ######## ####### ###### ##### #### ##### #### #### #### #### #### # ######### #### #### #### #### #### # #### ##### #### #### #### #### #### # #### ##### #### #### #### #### #### # #### ##### #### #### #### #### #### #### ###### #### #### #### #### ### #### ##### ########### #### #### ## ########### #### ##### ###### ###### # ## # ### # ### # ## #### #### ##### ##### ######## ###### #### ### ### ##### #### #### #### ## ### ### #### #### #### #### # #### #### #### #### #### #### # #### #### #### #### #### #### # #### #### #### #### #### ##### ### ### #### #### #### ##### ### ### #### #### #### # ### #### ###### ###### #### # ## ## ##### ##### ###### ####### ######## ##### ######## ########## ############# ########## ############ ####### ###### ############ ############# ################## ########################### ################### ############################ ################## ############################### ############# ################################# ############# ################################### ################################################### ################################################### #################################################### ################################################### # ################################################## # ################################################## # ################################################# # ########################################## ##### ################################ ####### ##### ########## ########## ####### ##### ##### ######### ##### ##### ######### ##### #### ######### ##### ### ######## ### ### ######## #### ### ### #### #### ### ### ##### #### ### #### ##### #### ## #### #### #### ## ### #### ##### ## #### ###### #### ## #### ##### ##### ### #### ## ###### #### ###### ###### ####### ########## ##### ## ## ###### ### #### #### # ##### # ## ## ## #### # #### #### # ##### #### # ##### ######## #### # #### ## ## #### #### #### # #### ### # #### #### #### # #### #### #### #### #### # #### ##### #### #### ##### #### ##### #### #### #### #### # #### #### #### ### #### ## ### #### #### # # ###### # ##### ###### #### ##### #### #### #### #### ###### ##### ###### ##### #### #### ## ### ## #### ##### ###### ##### ### ### #### ### ### #### #### #### #### #### #### #### #### #### ## #### #### #### #### ########### #### #### ####### #### #### #### #### #### #### #### #### #### #### #### #### #### #### # #### #### #### #### #### #### # #### ##### # #### ##### #### #### #### #### # #### ##### ##### #### ###### ###### ###### ##### ###### ##### # # #### ## ## #### #### #### #### ###### ######## ######## #### ### #### ## #### #### #### #### ##### ### ### #### #### #### #### #### #### #### #### ## #### #### #### #### #### ########### ####### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### # #### ##### #### # #### # #### #### #### # ##### #### #### #### ###### ###### ##### ########### #### #### # ### ### ### ### ### ### ### ### ### ### ### #### #### #### #### ### #### #### #### #### ### #### #### #### #### ### # ### ### ### ### ### ## ### ### ### ### ############ #### #### ## ## ## ## ## ## ## ## ## ######## ## #### # ### # # ### ### ## ## ### ### #### ## ### # ### #### ## #### ## ####### ##### # ### # ##### # ## ####### ##################### ####################### ####################### ####################### ###################### ##################### ##################### ################## ################## ######## ### ######### ### ######### #### ######### ##### ########## ###### ########## ###### ######################## ######################## ####################### ######################## ######################### ######################### ############# ######### ########### ####### ######## ####### ######## ######### ######## ######### ######## ######### ####### ####### ###### #### ### ########### ## #### ##### #### #### #### ## #### #### #### ##### ##### ##### ##### #### # ###### ##### #### ##### #### ##### #### ## ## #### # #### ##### #### #### #### ### # #### # #### ##### #### #### #### #### #### # #### ##### #### #### #### ##### #### # #### #### #### #### #### ##### #### #### #### #### ##### #### # #### ### #### ##### #### #### ##### ## ### ## ########### ###### #### # ##### # #### ## # #### ### # ###### ### ##### #### #### #### ###### ##### ##### ### #### ## #### ##### #### ### ##### #### #### #### #### ### #### ## #### #### #### #### #### ####### #### #### #### #### #### #### #### #### #### #### #### #### #### #### ### #### #### ##### #### #### ### ##### ##### #### ###### ###### ### ##### ##### ###### ##### #### ##### ###### ##### ### ### #### #### #### #### #### #### #### #### ########### #### #### #### #### #### #### #### #### #### #### #### #### # #### #### #### #### # ###### ###### ###### ##### ##### ##### #### #### #### #### #### #### ### #### ##### ### ##### ##### ##### ##### #### #### ### ##### #### #### #### #### ##### #### #### # ### #### ##### #### #### #### #### #### # #### #### #### #### #### #### #### #### ## #### #### #### #### #### #### #### ######## #### #### #### #### #### #### #### #### #### ### #### #### #### #### #### #### #### #### ### ##### #### #### ##### #### #### #### #### ### ##### ###### ##### ##### ###### ###### ###### ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/london.eyp100644 52 52 101 10274275004 20632 0ustar00arthurdent 0 0 description : Haiku "A Day in The Life of a London Perl Monger" Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_australia.eye100644 52 52 4047 10163413422 22200 0ustar00arthurdent 0 0 ### ## ######## ### ############ #### ## ############# ##### #### ############ ##### #################### ####### ######################## ######## ############################ ######## ############################## ########## ########################################## ########################################### ############################################## ################################################## ###################################################### ######################################################### ########################################################## ########################################################### ############################################################ ############################################################# ############################################################ ########################################################### ########################################################## ########################################################## ######################################################### ################## ############################### ############## ############################ ############ ### ###################### ####### # ##################### ### #################### ################ ############### ############# #### ###### ##### ##### ##### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_australia.eyp100644 52 52 63 10274276721 22161 0ustar00arthurdent 0 0 description : Map of Australia keywords : map Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_italy.eye100644 52 52 3546 10163413422 21340 0ustar00arthurdent 0 0 ###### ########### ################# ## ####################### ############################## ################################# ############################## ############################# ############################## ############################### ############################## ####### ############### #### ############## ## ############### ################# ################# ################## # ################## #### ################# ##### ################# ##### ################# ##### ##################### ### ################## ################## ## ################# ######## ################## ######## ################### ####### ########### ##### ####### ######## ### ####### #### ## ####### ### ####### ##### #### ## ##### ## ##### #### #### # ## ##### ################ ## ############### ########### ######## ##### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_italy.eyp100644 52 52 57 10274276745 21327 0ustar00arthurdent 0 0 description : Map of Italy keywords : map Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_japan.eye100644 52 52 5120 10163413422 21275 0ustar00arthurdent 0 0 # ## # #### ##### ##### ###### ########### # ################ ################ # ################# ##################### ################# ################ ### # ###### #### ## #### ## ### ## ## ####### ####### ######## ########## ######### ######### ######## ######## ######## # ######## # ######## ########## ## ########### ## ############## ## ############## ################### #################### ##################### # ### ##################### ################################# ################################ ########################### ## ############# ###### # ################ ###### # ############# ##### # ######## ########### ### ########## ##### ## # ########## ### # # ######### ## ####### ###### ###### ###### #### # # # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_japan.eyp100644 52 52 57 10274276762 21275 0ustar00arthurdent 0 0 description : Map of Japan keywords : map Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_uk.eye100644 52 52 5227 10163413422 20633 0ustar00arthurdent 0 0 ### ########## ########## ########## ######## ######### # #################### ####################### ###################### #################### ################## ################## ################### ################## ################# ############### #################### ## #################### ### ################ ### ## ################ ###### ### ################## ############# ################### ############### ######## ########## ############### ### ############ ############## ############### #### ################# ############## ######################## ########### ###################### ############## ##################### ############### ###################### ############## ##################### ################ #################### ## ################## ################### ### ################## ################### ######################### #################### ######################### ###### ##################### ############################### ##################### ################################ ####################### ################################ ####################### ################################ ################ ################################### ########### ################################### ###### #### ########################## ######################## ######################### ############################### ############################## ############################## ########## ######## ########### ########### #### ## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_uk.eyp100644 52 52 104 10274277005 20623 0ustar00arthurdent 0 0 description : Map of United Kingdom and Ireland keywords : map Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world1.eye100644 52 52 5562 10163413422 21426 0ustar00arthurdent 0 0 ############## ############### ### ################### ### ################## # ### ####################### ### ######################### ### ########################### # ### ############################ # ### ########################## ## ### ############################# ### ### ############################## ### ############################### ### ################################ ### ##### ###################### ### ####### ###### ######### ## ### ###### ##### ####### ### ###### #### ###### ### #### ### ###### ### #### ## ##### # # ### ##### ## # # # # ### ##### # # # ### #### # # # # ### #### # # ## # ### ### # ### # ### ### ## ## ## ### ### ### ##### ### ### # # ##### ### ### ### ### ## # ### ### ###### ## ### ### ######## ### ### ### ############# # ### ### ################ # ### ### ################# ### ### ################# ### ### ################ ### ### ##### ####### ### ### ##### ### ### ## ## ### ### ## ### ### ## ### ### ### ### ### ### ### ### ### ############## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world1.eyp100644 52 52 101 10274277027 21415 0ustar00arthurdent 0 0 description : World globe, Asian view keywords : map planet Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world2.eye100644 52 52 5562 10163413422 21427 0ustar00arthurdent 0 0 ############## ### ########### ### # ################# ### ## ##################### ### ######################### ### ############################## ### #### # ######################## ### ### # # ####################### #### ## ######################## ##### ######## ##################### ##### ########## ## ###################### ##### ############################################ ##### ############################################### #### ################################### ########## ### ################################### ##### ### ### #################################### #### ### ### ################################### ### ### ### ################################## ## ### ### ################################ # # ### ### ################################### # # ### ### ################################# # ### ### ##### ###################### ### ### ##################### ### ### #################### ### #### ################### ### ####### ################# ### ######### ################ ### ######### ############### #### ####### ############### # #### ####### ############### ### ###### ############### # ### ####### ############### ## ### ###### ############# ### # ### ###### ########### ## # ### ##### ######### # ### #### ######## ### ### ###### ### ### ### ### ### # ### ### # ### ### #### ### ### ### ### ### ### ### ### ############## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world2.eyp100644 52 52 103 10274277050 21414 0ustar00arthurdent 0 0 description : World globe, African view keywords : map planet Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world3.eye100644 52 52 5562 10163413422 21430 0ustar00arthurdent 0 0 ############## ###################### ############ ###### ### ################ ### ### ##################### ### ######################### ### ############################ ### ########################### ### ### ######################### ### ### ###################### ### ### ##################### ### ### #################### ### ### ################# ### ### ################ ### ### ######## # ### ### ###### ### ### #### ## #### ### ### ######## #### ### ### ######## ### ### ### ### ### ## ####### ### ### ############# ### ### ############## ### ### ################ ### ### #################### ### ### ####################### ### ### ####################### ### ### ##################### ### ### ################### ### ### ################# ### ### ################ ### ### ############### ### ### ############ ### ### ########### ### ### ######### ### ### ####### ### ### ###### ### ### ###### ### ### ##### ### ### #### ### ### ### ### ### ## # ### ### ## ### ### ### ### ### ############## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/map_world3.eyp100644 52 52 104 10274277065 21424 0ustar00arthurdent 0 0 description : World globe, American view keywords : map planet Acme-EyeDrops-1.61/lib/Acme/EyeDrops/merlyn.eye100644 52 52 4604 10163413422 20663 0ustar00arthurdent 0 0 ##################### ########################### ################################ ##### ##### ##### ##### ##### ##### ###### ###### ##### ###### #### ###### #### # # ####### #### # # # ######## #### # # # # ######### ##### # # # # ######### ##### # # # # ######### ##### #### ## # ## ######### ##### # ####### ######## ######### ########### ######### ########## ######## ########## ###### ###### ######## ########## ### ### ### ### ####### ######### ###### # ###### ####### ######### ## ### ## # ## ### ## ###### ######## ########## # ########## ##### ####### # ### ###### # ### ##### # # # ### # ## # # # ### # # # # # # # ### # # # # # # # ## # # # # # # # # # # # # # ################ # # # # # # # # ## # # # # # ## # # ## ## # # # # # ## # # # # ##### # # # # # # # # # # # # # # # # # # # # # # # # # # ### ## ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/merlyn.eyp100644 52 52 173 10274753155 20670 0ustar00arthurdent 0 0 nick : merlyn description : Just another Perl hacker, aka Randal L Schwartz keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/mongers.eye100644 52 52 3351 10163413422 21025 0ustar00arthurdent 0 0 ################ ######### ################### ######### ###### ######## ###### ###### ####### ###### ###### ####### ###### ###### ####### ####### ######### #### ###### ###### ####### ########### ######### ###### ###### ###### ###### ###### ###### ####### ### ###### ###### ###### ###### ###### ###### # ###### ################ ###### ###### ###### ###### ############# ################# ###### ###### ######## ################# ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ## ###### ###### ###### ###### ### ###### ###### ############# ############## ########## ########## ############# ######## ########## ########## ## ## ## #### ## ### #### ## ##### ## ## #### # # # # # # # # # # # ## # # ## # # # # # # # # ## # # # # # # # # # # # # # # # # ####### # #### # # # # # # # # # # # # # # # # # # # # ## # # # # # ### ### ### #### ### ### #### # #### ### #### # # # ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/mongers.eyp100644 52 52 75 11056723151 21005 0ustar00arthurdent 0 0 description : Perl Mongers logo keywords : hbanner logo Acme-EyeDrops-1.61/lib/Acme/EyeDrops/moose.eye100644 52 52 3737 11056723151 20512 0ustar00arthurdent 0 0 ## ####### ####### ######### ######## ####### # ######## # ####### ### ####### #### ##### ########## ####### ###### ##################### ######################### #### ######################################### ############################################# ############################################### ################################################# ################################################## ### ########################################### #### #################################### # ################################### ################################ ############################### ############################### ############################# ############################# ############################ ############## ############## ########### ############## ############ ##### ####### ###### #### ##### ######## ##### #### ##### ######## ### #### #### ###### ### #### #### #### ## #### ##### ### ### #### ##### ## ### ### #### ### ## ### #### ### #### ### #### ### #### ### ### ### ### ### #### #### ### ### #### #### ## #### #### #### # ##### ##### ### #### ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/moose.eyp100644 52 52 55 11056723151 20453 0ustar00arthurdent 0 0 description : A moose keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/moosecamel.eye100644 52 52 12154 11056723151 21525 0ustar00arthurdent 0 0 ## ####### ####### ######### # ######## ### ### ####### ##### ##### # ######## ####### ##### # ####### ######### ###### ### ####### ########### ######## #### ##### ############# ########## ### ########## ######################### ########## ####### ###### ########################### ############ ##################### ############################ ############# ######################### #### ############################# ############## ######################################### ############################# ############## ############################################# ############################### ############# ############################################### ################################# ########## ################################################# ################################### ######## ################################################## ##################################### ######## ### ########################################### ################################################## #### #################################### ################################################# # ################################### ################################################# ################################ ################################################# ############################### ################################################ ############################### ############################################### ############################# ############################################### ############################# ############################################## ############################ ############################################# ############## ############## ############ ###################### # ########### ############## ##### ###### ################### ############ ##### ####### ##### ##### ################ ###### #### ##### ######## #### #### ###### ##### #### ##### ######## ### #### ###### ### #### #### ###### ### #### ##### ### #### #### #### ### #### ##### ## #### ##### ### ## ### ##### ### #### ##### ## ### #### ##### ### ### #### ### ### #### ##### ## ### #### ### ### #### ### #### ### #### ### ### ### #### #### ### ### ### ## ### #### ### ### #### #### ## ## ### ### ### #### #### ## ### ### ## #### #### #### ## ## ### # ##### ##### ### ## ## ### #### ##### ### ## ### # ## ### ## #### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/moosecamel.eyp100644 52 52 71 11056723151 21453 0ustar00arthurdent 0 0 description : A moose and a camel keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/mosquito.eye100644 52 52 3163 10163413422 21234 0ustar00arthurdent 0 0 ## ## ##### # # ######## # # ######### # # # # ########### # # # # ############ # # # # ############ # # # # ############ # # # # ############ # # # # ########### # # # # ######## ########## # # # # ############### ######## #### ### # # ################### ################ # ###################################### # ###################################### ##################### ########### ############# ############ ####### ### ### ## # # # ## # # # ## # # # ## # # # ## # # # #### # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ####### ###### ##### ##### ##### ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/mosquito.eyp100644 52 52 60 10274277146 21216 0ustar00arthurdent 0 0 description : A mosquito keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/music.eye100644 52 52 2725 10163413422 20477 0ustar00arthurdent 0 0 #### ######## ########## ############ ###### ###### #### #### ### ### ## ### ## ### ## ### ## #### ## #### # ##### # ###### ######## ######### ########## ########### ########### ########### # ########### # ########## # ########## ## ######### ## ######### ########### ######### ################ ####### ################### ###### ###################### ##### ###### ## ########## #### ###### ### ####### #### ##### ### ####### ### #### ## ###### ### ### ## ##### #### ## ## ##### ##### ### #### ################# ### #### ############ ### ## #### #### #### #### #### #### ##### #### ######### #### ########### #### ########## ##### ######### ##### ########## ###### ################# ############# ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/music.eyp100644 52 52 40 10274277175 20456 0ustar00arthurdent 0 0 description : A musical symbol Acme-EyeDrops-1.61/lib/Acme/EyeDrops/naw.eye100644 52 52 10113 10273047163 20161 0ustar00arthurdent 0 0 ## ### ############ ############## ################# ################### ####### #################### ########### ###################### ############## ################# ## ################ ################ # ################# ####### ### # # ################ ##### # # # # ################# ######## # #### ### # ################ ######## ## ## ## # ############## ########### # # ####### # ########## ############## ########### ######### # ######### ############### ### ## ########## # ###### ### ################ ###### ########### # ####### ################# ### ############ # ############ ################## ############ # ################ ################### ############# # # ################# ################### ######## ###### # ################## #################### ######### ###### ################### ##################### ######### ####### #################### ################################ ######## ###################### ############################### ######## ####################### ############################## ######### ######################## ######### ################### ################################## ######## ################# ################################## ###### ############## ################################## # ############# ################################# ########### ################################ ####### ############################## #### ########## ############# ## ####### ########### # #### ########### ### ######### ############# ################ ################### ##################### ###################### ################ ## ############### # ############### # ####################### ### ######### ## ### ### ## ###### # # ###### # # ####### ## # ########### ## ### ################# ###### ##################### ## ############################ ############################### ###### ################################## ########### ######## ################################# ############### ######## ################################# ################## ####### ################################# ##################### ###### ################### ##################### ###### ##################### ###################### ###### ###################### ###### ###################### ###### ####################### ########## ##################### ####### ######################## ########### ################## ######### ########## ############ ############ ################ ########## ########### ############ ############### ########## ############ ############ ############################## ###### ############# ############## ################### ####### ############## ############### ############ ########################## ################ ########## ######################### ################# ######## ####################### ################## ###### #################### ################### #### ################### ################### # ############## ######### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/naw.eyp100644 52 52 130 10274277226 20140 0ustar00arthurdent 0 0 description : Naked Arm Wrestling (Y::E 2002, Munich) keywords : person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/opera.eye100644 52 52 5307 11056723151 20471 0ustar00arthurdent 0 0 ########## ######################## ########## ########## ########## ########### ########### ############ ############ ############ ############ ############# ############# ############# ############# ############## ############## ############## ############### ############### ############### ############### ############### ################ ################ ################ ################ ################ ################ ################ ###################### ################ ##################################### ################ ############ ############################# ################ ############# ################ ################ ################ ############### ############### ################ ################ ################# ############### ################ ############### ################### ############## ############################### ################### ############### ############################ #################### ############## ######################### #################### ############# ###################### #################### ############# ################### ################### ############# ################## ################## ############ ############## ################## ########### ########### ################ ########## ########### ######################### ########## ################################### ################# Acme-EyeDrops-1.61/lib/Acme/EyeDrops/opera.eyp100644 52 52 225 11056723151 20456 0ustar00arthurdent 0 0 description : Opera Software's Logo, contributed by cosimo@cpan.org keywords : opera logo author : Cosimo Streppone authorcpanid : cosimo Acme-EyeDrops-1.61/lib/Acme/EyeDrops/panda.eye100644 52 52 6076 10163413422 20445 0ustar00arthurdent 0 0 ######### ############# ############### ######### ################# ############# ################# ######### ############### ############################################# ################# ############################# ##################### ##### ############ ############### #### ####### ########### #### ######## ###### ##### ######## ### ##### ######## ### ##### ######## ### #### ######### ### ### ##### ######## ######### #### ### #### ######### ########### ######## ## ##### ######### ############ ########## ## ##### ######### ############# ########### ## ##### ######### ############ ############ ### ###### ########## ########## ############ #### ####### ############ ###### ########### ##### ######## ############# ######## ###### ######## ################## ####### #### ######## ########## ####################### ########## ########### ############ ######################### ######### #################### ######################################## ## ######################## ############################################################################ ################################################ ########################### ############################################################################ ########################################################################### ################################################ ######################### ############################################### ###################### ################## ########################## ##################### ################# ########################## ##################### ################# ######################### #################### ################ ######################## ################### ############## ####################### ################## ########## ####################### ################# ###################### ############### ##################### ############ ################### ###### ################# Acme-EyeDrops-1.61/lib/Acme/EyeDrops/panda.eyp100644 52 52 111 10274701603 20424 0ustar00arthurdent 0 0 description : A panda designed by Yanni Ellen Liu keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/parrot.eye100644 52 52 3766 10163413422 20674 0ustar00arthurdent 0 0 ######### ############## #################### ######################### ################# ####### ##################### ######## #################################### ####################################### ########################################## ############################################ ############################################# ##################################### ### ##################################### ### ##################################### ##################################### ###################################### ###################################### ###################################### ###################################### ##################################### ##################################### ################################### ################################## ################################## ################################### ################################## ################################### ################################## ################################## ### ################################## # ################################ #### ############################### ####### ############################## ########### ############################# ############## #################### ## ################# #################### # ################### #################### # # ################# ##################### # ############## ##################### ########## #### ############### ####### ### ############### ### ## ################ # ################ ################ ################ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/parrot.eyp100644 52 52 173 10274701650 20662 0ustar00arthurdent 0 0 description : Originally an April fool's joke, the joke was that \ it was not a joke keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pgolf.eye100644 52 52 6521 10163413422 20464 0ustar00arthurdent 0 0 ########### ##### #### ##### #### #### ##### #### #### ##### #### #### ##### #### ##### ### #### #### ##### ### ### #### #### #### ######### #### #### ##### #### #### ########### #### #### #### #### #### #### #### #### #### #### #### #### # #### #### #### #### # #### #### ######## ##### ###### ###### #### #### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### # # # # # # # # # # # ##### # # ######## # ############## # ################## # #################### ##################### #################### ############## ############### ############### ################ ################ ############### ############### ############### ################ ################# ################# ################# ################ # # ############### # # ############### # # ############# # # ############ # # ########## # # ####### # # ##### # # # # # ######### ######### ########## ########## ######## ######## ###### ###### ######## # ##### ###### #### ### #### ### ### #### ## #### #### #### # #### #### #### #### #### ######## ##### ### ### #### #### ##### ### ### #### #### ##### ####### #### #### #### #### #### ##### #### #### #### #### #### ### #### #### #### #### #### ### ### ### #### #### #### #### ### ### #### #### ######## #### ###### ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pgolf.eyp100644 52 52 110 11056723151 20450 0ustar00arthurdent 0 0 description : Perl Golf logo (inspired by `/anick) keywords : logo Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pony.eye100644 52 52 1265 10163413422 20342 0ustar00arthurdent 0 0 ########### #### ##### #### ##### #### ##### #### ##### #### ##### ##### ###### ##### #### ##### ### ### ##### #### #### # ######### ### ### #### #### #### # #### #### #### #### #### #### # #### #### #### #### #### #### # #### #### #### #### #### #### #### ### ### #### #### ### #### ### ### #### #### ## ######## #### ###### ###### # ## # ### # ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pony.eyp100644 52 52 102 10274755463 20343 0ustar00arthurdent 0 0 description : Horizontal banner of "Pony" keywords : hbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pony2.eye100644 52 52 5075 10163413422 20427 0ustar00arthurdent 0 0 #### #### # ############# ## # ########## # ############# ## ######## #### ## ####### # # ## ## ## #### ### ## ## ## ## # ## ### ### ## ## ##### ## #### ## ######## ## ######### ##### ### ######## ## ############## ######## ## #### ########## ###### ##################### ### ## ####### ###### ### ################### ############# ## # ### ########### ## #### ######## #### #### ######### ## ########## ##### ####### ######## ## ### ### ### ## ###### ## ######### ## ## ##### ## ###### ## # ##### ## ### ## ## #### ### ## ## ## ######### ### #### ### ## ## ###### ## #### ### ## ### ###### ###### ### ## ### ############ ## ## ### ## ########## ## ### ## ###### ## #### ## ### ### # ## ## ## ## ## #### # ## ## # ## ##### # # ## ###### ## ## ## ## ## ##### ## ## ## ## ##### #### ## ## ## ############ ##### #### ### ## ############## #### ###### ###### ############################# ###### ################### ########### ####### ########### ######## ########## ######## ######## ####### ########## ######## ####### ##### ######## ####### ###### ##### ####### ###### #### ###### ####### ##### ##### ###### ########## #### ########## ############ #### ########### ############ #### ########### #### #### ##### ########### #### ## ###### ############ ######## ####### ########## ######## ###### ####### ####### ####### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pony2.eyp100644 52 52 67 10274701706 20406 0ustar00arthurdent 0 0 description : Picture of a pony keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pugs.eye100644 52 52 2404 10240275760 20336 0ustar00arthurdent 0 0 ############# ################ ##### ####### ##### ###### ##### ###### ##### ###### ##### ###### ##### ##### ####### ###### ########### ###### # ##### ##### ##### ##### ########## ### ## ############## ##### ##### #### #### ### # ########### ##### ##### #### #### #### ####### ##### ##### #### #### #### ##### ##### ##### #### #### ##### ##### ##### ##### #### #### ##### ##### ##### ##### #### #### ##### ##### ##### ###### ########## # ##### ########## ############## ###### ## ###### ########## ##### ###### # # ###### ############ ############## #### #### ### ### ### ### ### ### ############# ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pugs.eyp100644 52 52 102 10274702223 20316 0ustar00arthurdent 0 0 description : Horizontal banner of "Pugs" keywords : hbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pugs2.eye100644 52 52 4070 10240275770 20422 0ustar00arthurdent 0 0 #################### ############################# ################################## ######################################## ############################################# ################################################# ######################################### ######### ############################################ ######### ############################################### ######## ################################################## ####### ##################################################### ###### ####################################################### ##### ######################################################### ### ########################################################## ########################################################## ######## #################################### ####### ####### ################################### ##### ###### ################################### #### ###### #################################### ##### ##### ########## ######### ################ #### ######## ###### ###### ############### ### ####### #### ########## ############## ## ######## #### ############## ############ ## ################# ################## ########## ################ ##### ### ######### ######## ############## ################################ ############## ################################ ############################################## ####################### ############## ###################### ########### ######################################## ##################################### ################################### ################################ ########################### ################# Acme-EyeDrops-1.61/lib/Acme/EyeDrops/pugs2.eyp100644 52 52 73 10274702161 20370 0ustar00arthurdent 0 0 description : Picture of a Pugs dog keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/riding.eye100644 52 52 1646 10163413422 20634 0ustar00arthurdent 0 0 ## ##### ## #### #### #### ## #### ## #### ##### ## ##### #### #### ##### ##### ##### ########## #### #### #### ### ##### #### ##### #### ### ### ##### #### ### #### #### #### #### ### ### #### #### ### #### #### #### #### ### ### #### #### ### #### #### #### #### ### ### #### #### ### #### #### #### #### ##### #### #### ### ##### #### #### #### # ###### ###### #### ##### ###### ###### ###### ######### ########### ### ### ## ## ######## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/riding.eyp100644 52 52 104 10274702305 20617 0ustar00arthurdent 0 0 description : Horizontal banner of "riding" keywords : hbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/rose.eye100644 52 52 4623 10163413422 20326 0ustar00arthurdent 0 0 ############ ################# ####### #### ##### ######## ##### ##### ##### ##### ###### #### ##### ###### ##### ##### ###### ###### ##### ##### ###### ####### ########## ##### #################### ################# ############## ### ################## ########### #### ########## ######## ###### #### ########### ######### ############# ############ ############################# ########### #################### ##### ########## ################## ###### ######### ### ########## ######## ########### #### ### ########## ###################### ########### ###################################### ################## ### ### ############### ####### ### ### ### ### ### # ######### ### ## ########## ### ##### ########## ### ###### ######### ### ##### ###### ### ##### ### ### ###### ###### ########### ########### ################# ########### ########### ############# ########### ######## ###### ############ ########### ######### ######## ########## ########## ######### ######### ######### ######### ########## ########### ####### ####### ########## ########### ###### ###### ######### ########### #### ##### ####### ### ######## ### #### ##### ### ######### ## ### #### ### ####### ## ### ### ##### ### ## ### ### ### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/rose.eyp100644 52 52 54 10274702320 20274 0ustar00arthurdent 0 0 description : A rose keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/santa.eye100644 52 52 6121 10163413422 20457 0ustar00arthurdent 0 0 ##################################################### ### ###### ### ####### ### ####### ##### #### #### ######## ##### ############ #### ################ ##### ################### ####### ##################### ######## ##################### ########## ##### ############### ############ #### ############### ############## ### ################################# ## ############################## # ######################### # ######################## # ####################### ##### ###################### ####### ##################### ####### #################### ##### ##################### ####################### ######################## ######################## ######################## ######################## ######################## ######################## ####################### ####################### ###################### #################### ################## ################# ################# ################# ################# ################# ################# ################# ################## ################### ##################### ##################### ##################### ##################### #################### ########## ######### ######### ####### ######## ####### ####### ####### ####### ###### ############### ##### ############ #### ######### #### ####### #### ###### #### ##### #### #### ##### ### ####### ## ######## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/santa.eyp100644 52 52 76 10274702456 20450 0ustar00arthurdent 0 0 description : Santa Claus playing golf keywords : person Acme-EyeDrops-1.61/lib/Acme/EyeDrops/santa2.eye100644 52 52 11164 10163413422 20564 0ustar00arthurdent 0 0 ######### ################ ######### # # # # # # # ## ######### ### ## # # # # # # # ######### ############ # # # # # # # ################# ################### # # # # # # # # # ############ ################# # # # # # # ### # ########## ##### ################## # # # # # # # # ########## # # #### ################ ### # # # # ### # ########## # # # ### ###### ################################# # # # # ## ########################## ######### # # # # ### ##################### ##################### ##### # # # ### #### ############## ######## ##### # # ## ### #### # ##### #### # ## ### ############ ## # ## #### ### ### ####### ### ## ## ## #### #### ######### #### #### # ### ##### ### ### ### #### ## #### #### ### ###### ######## ### ## ### ##### #### ######## ## ### # ### ## ## ### ## ## ### # ##### ## ## ### ## ####### ############### #### ## ############ ### ###### ########## ###### ### ## ################ ### #### ######## ########## ### ## ################# #### ### ### ##### ################# ## #### ######## ####### # ###### ###################### ### ## ## # #### ### ########## #################### ### ###### # #### #### ### ################ ### ## ## ## ### #### ### ## ############ #### #### # ## ##### #### ### ######## ########### ############# ##### ### ########## ################ ### ########### ## ####### ##### ################# ### ####### ### ############ ################ ############# ## ################## ########################### ############# # ################ ######################## ############# # ################### ######################## ############# # ############ ###### #################### ############# # ########### ### ## ############## ############## # ########## ## ############ ############## # ########## ### ########### ############### ## ########## ### ########### ################# ## ######## ##### ########### ################# ## ###### ############# ## ################### ## ########## ####### #### #################### ## ########### #### ######################### ### ## ########################################## ### ## ############## # ############### ### ## ############ ##### ######## #### ## ######### ####### ##### ## ###### ########### ######## ### ################# ############# ###### ####################################### ############################################ #### ######## ################## # ############## # # # # # # # ## ## ## #### ###### ### ############ #### ##### # ##### ## ############# # ##### # ####### # # ##### # ####### # # ##### # ####### # ### ##### # ####### # ### ######## ####### # ### ########### ####### # ### ######## ### ####### ## #### ####### ####### ## ############ #### #### ####### ########## #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/santa2.eyp100644 52 52 103 10274702474 20541 0ustar00arthurdent 0 0 description : Santa Claus carrying presents keywords : person Acme-EyeDrops-1.61/lib/Acme/EyeDrops/saturn.eye100644 52 52 4624 10163413422 20673 0ustar00arthurdent 0 0 ###### ########### ############### ################# ################### #################### ##################### ############# ####### ######### ################### #### ######## ######################## ####### ############################# ####### ################################ ###### ################################## ###### #################################### ##### ###################################### ##### ##################################### #### #################################### #### ################################### ### ################################## ### ## ################################ ### #### ############################## ### ###### ############################ ### ######## ########################## ### ########## ######################## ### ########### ###################### ### ############# ##################### ### ############### ##################### ### ################ ###### ############# ### ################# ##### ########## ### ################## ###### ###### ### #################### ####### ## ### ##################### ####### #### ##################### ######### ##### ###################### ########## ######### ################# ###################### ########## #################### ################## ################ ############## ########### ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/saturn.eyp100644 52 52 67 10274702546 20656 0ustar00arthurdent 0 0 description : The planet Saturn keywords : planet Acme-EyeDrops-1.61/lib/Acme/EyeDrops/schwern.eye100644 52 52 7410 10163413422 21024 0ustar00arthurdent 0 0 ####### ############ ############### ################# #### ################### ####### ##################### ##################################### ######################################### ########################################### ############################################# ############################################### ################################################## #################################################### ##################################################### ################################################### # ############################################ # ################################### # ################################## #################################### # #################################### # ##################################### ##################################### # ##################################### # ##################################### # ##################################### ## # ####################### ############# # # # # # ###################### ################## # # # # ###################### ##### # # # # # ###################### ### # # # ## ######### ########### ## # # # # ######## ############ # ## ## # ##### ############ # ## ##### ## ############ # ## # ############## ### ########## ###### ##### ## # # ##### ## ###### # # ####### ### #### # # ######### #### # # ############## # # # ############# # ## # ################# ############## ######## ## #### ## ##### #### # ##### ###### ##### ###### ##### #### ## ## ##### ###### ##### #### # #### ### # #### #### #### #### # #### #### #### #### #### #### # #### ##### #### #### #### #### # #### ##### #### #### #### #### #### # #### #### #### #### ### #### ## ### #### #### #### ## ###### # ##### ###### ###### ###### # ## # ### # ### ##### ## ##### #### #### # #### #### ## ## #### #### #### #### #### ### ##### ######## #### #### ### ##### ### #### #### ## ### #### ##### #### ### #### #### ### ### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### ### #### #### #### # #### #### ##### ### #### #### # ##### # #### #### ##### ### ###### #### ##### ###### ###### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/schwern.eyp100644 52 52 123 10274753020 21015 0ustar00arthurdent 0 0 nick : schwern description : is my bitch keywords : person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/schwern2.eye100644 52 52 4472 10273040000 21101 0ustar00arthurdent 0 0 ####### ############ ############### ################# #### ################### ####### ##################### ##################################### ######################################### ########################################### ############################################# ############################################### ################################################## #################################################### ##################################################### ################################################### # ############################################ # ################################### # ################################## #################################### # #################################### # ##################################### ##################################### # ##################################### # ##################################### # ##################################### ## # ####################### ############# # # # # # ###################### ################## # # # # ###################### ##### # # # # # ###################### ### # # # ## ######### ########### ## # # # # ######## ############ # ## ## # ##### ############ # ## ##### ## ############ # ## # ############## ### ########## ###### ##### ## # # ##### ## ###### # # ####### ### #### # # ######### #### # # ############## # # # ############# # ## # ################# ############## ######## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/schwern2.eyp100644 52 52 157 10274753027 21115 0ustar00arthurdent 0 0 nick : schwern description : Just the face of Michael G Schwern keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/simon.eye100644 52 52 4511 10163413422 20477 0ustar00arthurdent 0 0 ################ ########### ######### ############## ########### ################ ############ ################## ############# ##################### ############# ####################### ############# ######################## ############## ########################## ############## ########################### ############### #################### ### ### ######## ################## ####### ################## ####### ################## ###### ################### ###### ################### ##### ################### # #### ################## # ### ################## # ## ################## # ## ################## # # # # # # # ################### # # # # # ################## ##### ### # # # ############### ######## ##### # # # ############ # # ########## # ### # ### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ######### # # # ############# # # ######## # # # ############# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/simon.eyp100644 52 52 141 10274753102 20472 0ustar00arthurdent 0 0 nick : simon description : The inventor of parrot keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley.eye100644 52 52 2032 10163413422 20650 0ustar00arthurdent 0 0 ############### ######################### ############################### ################################### ####################################### ########## ############# ########## ########## ########### ########## ########### ########### ########### ############# ############# ############# ############################################### ############################################### ############################################### ############################################### ##### ################################# ##### ##### ############################### ##### ###### ########################### ###### ###### ####################### ###### ###### ################### ###### ####### ########### ####### ######### ######### ########### ########### ############################### ######################### ############### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley.eyp100644 52 52 61 10274702705 20633 0ustar00arthurdent 0 0 description : A smiley face keywords : face Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley2.eye100644 52 52 3105 10163413422 20734 0ustar00arthurdent 0 0 ############### ######################### ############################### ################################### ####################################### ## # # ## ########## ############# ########## ## # # ## ## # # ## ########## ########### ########## ## # # ## ######## ########### ########### ########### ######## ####################### ############# ####################### ################################################################# ### ############################################### ### #### ############################################### #### ### ############################################### ### ############# ###################################### ############ ############# #################################### ############ ### #### ################################ ### ### #### ############################ ### #### ###################### ### ##### #### ###### ############## ##### ####### ############# ###### ########## ########### ##### ########### ########## # ####### ########### ############ ########### ######### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley2.eyp100644 52 52 62 10274702646 20722 0ustar00arthurdent 0 0 description : Pulling a face keywords : face Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley3.eye100644 52 52 2032 10163413422 20733 0ustar00arthurdent 0 0 ############### ######################### ############################### ################################### ####################################### ########## ############# ########## ########## ########### ########## ########### ########### ########### ############# ############# ############# ############################################### ############################################### ############################################### ################### ################### ############### ############### ############ ####### ############ ########## ############### ########## ######## ################### ######## ###### ####################### ###### #### ########################### #### ### ############################# ### ################################### ############################### ######################### ############### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/smiley3.eyp100644 52 52 56 10274702665 20727 0ustar00arthurdent 0 0 description : A sad face keywords : face Acme-EyeDrops-1.61/lib/Acme/EyeDrops/snow.eye100644 52 52 2137 10163413422 20342 0ustar00arthurdent 0 0 ### ### ####### ####### ### #### ############## #### ### ############ #### ############ ############ #### ############ ## #### ### ## ### #### ## ### ### #### ## #### ### ### ###### ########## ## ########## ###### ## ############################## ## #################################################### #### ######### ######## ######## ######### #### ### ####### ###### ###### ####### ### #### ######### ######## ######## ######### #### #################################################### ## ############################## ## ###### ########## ## ########## ###### ### ### #### ## #### ### ### ## #### ### ## ### #### ## ############ #### ############ ############ #### ############ ### #### ############## #### ### ####### ####### ### ### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/snow.eyp100644 52 52 230 10274702751 20336 0ustar00arthurdent 0 0 description : Snowflake designed by Matthew Byng-Maddick for the \ cam.pm Christmas Perl Programming Contest 2002 keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/spider.eye100644 52 52 5351 11753377566 20673 0ustar00arthurdent 0 0 ### ### ### ##### #### ##### ##### #### #### ##### ##### #### #### ##### ##### ## ##### # # ###### ### ##### ## ## ##### ##### ##### ##### ## ## ##### ######## ##### ##### ### ### #### ######## ##### ##### ### ### ##### ###### ###### ###### ################ ##### ###### ###### ############################ ####### ###### ######################### ###### ###### ##################### ####### ######################################## ################################## ########################### ######################## ################################## ######################################## ###### ################### ######### ####### ##################### ###### ###### ######################## ##### ##### ### ############## ### #### ##### ### ################ ### ##### ###### ### ################ #### ##### ##### ### ################ ### ##### ### ################ #### #### ################ ### ### ############### #### ### ############## ### ### ############ ### #### ####### #### ### ### ### ### ### #### ### ### #### ### #### ### ### ### ### ## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/spider.eyp100644 52 52 56 11753377744 20641 0ustar00arthurdent 0 0 description : A spider keywords : animal Acme-EyeDrops-1.61/lib/Acme/EyeDrops/spoon.eye100644 52 52 3032 10163413422 20505 0ustar00arthurdent 0 0 ######## ############ ############## ################ ################## #################### ###################### ###################### ###################### ###################### ###################### ###################### ###################### ###################### ###################### ###################### #################### #################### ################## ################## ################ ################ ############## ############## ############ ########## ########## ######## ######## ###### ###### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### #### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/spoon.eyp100644 52 52 64 10274733165 20476 0ustar00arthurdent 0 0 description : A wooden spoon keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/tonick.eye100644 52 52 7170 10163413422 20645 0ustar00arthurdent 0 0 ############### ##################### ######################### ############################# ############################### ################################# ################################### ##################################### ####################################### ######################################### ########################################### ############################################# ############################################### ################################################# ################################################# ############################################ ##### ########################################### #### ############################################ ##### ############################################# ###### ####################################################### ####################################################### ############################ ############################ ########################### ########################### ########################### ########################### ########################## ########################## ######################### ######################### ######################### ######################### ######################### ######################### ######################### ######################### ########################## ########################## ########################### ########################### #################### ##### ##### #################### ################### #### #### ################### ################## # # ################## ################## ################## ################## ################## ################## ################## #################### #################### #################### #################### ############# ##### ##### ############# ############ #### #### ############ ########### # ######### # ########### ########### ############## ########### ########### ################# ########### ############ #################### ############ ############# ###################### ############# ############# ######################## ############# ###### ##### ########################## ##### ###### ##### #### ############ ### #### ##### #### # ############ ### # #### ### ## ########### ### ### ## ### ## ###### ### ## # ### # #### ### # ## # # # # # # # # # # # # # # ### ### # # # # # # # ## # # # # # ## # # # # ##### # # ## ############ # # ############## # ############# ### ############ ########### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/tonick.eyp100644 52 52 216 10274730027 20640 0ustar00arthurdent 0 0 description : Pictorial representation of a golf contest between Ton \ Hospel and `/anick; colourful but not very suspenseful Acme-EyeDrops-1.61/lib/Acme/EyeDrops/tpr.eye100644 52 52 17024 10163413422 20202 0ustar00arthurdent 0 0 ########## ########## ########## ##### ### ## ## ### ## ### ## ### ## ################################################# ################################################# ################################################# ################################################# ### ## ### ## ## ## ## ### ##### ########## ########## ### ## ### ## ################################################# ################################################# ################################################# ################################################# ### ## ## #### #### #### ### ##### ############################# ############################# ########################### ######################### ### ######### ############### ################### ####################### ####### ## ###### #### ## #### ### ## ### ### ## ## ### ## ## ### ## ## ## ## ### ## ## #### ## ## ###### ### ############ ## ########## ######## ### ## ### ## ### ## ################################################# ################################################# ################################################# ################################################# ### ## ## ### ## ## ### ## ## ## ## ## ## ## ## ### ### ### #### #### ### ##### ##### ####### ####### ################## ################ ############# ######## ######### ############### ################### ####################### ####### ## ###### #### ## #### ### ## ### ### ## ## ### ## ## ### ## ## ## ## ### ## ## #### ## ## ###### ### ############ ## ########## ######## ### ## ### ## ############################# ############################# ############################# ############################# ### ### ### ### #### ##### ######### ########## ########## ######### #### ### ## ### ## ################################################# ################################################# ################################################# ################################################# ### ### ## ### ## ### ## ################################################# ################################################# ################################################# ################################################# ### #### ## ### ####### ## ### ######### ## ############ ## ############### ## ################## ## ### ################ ### ### ### ################ ### #### ################## #### ### ############### ##### ##### ############ ####### ####### ########## ################## ####### ################ ##### ############# ### ######## ### ######### ############### ################### ####################### ####### ## ###### #### ## #### ### ## ### ### ## ## ### ## ## ### ## ## ## ## ### ## ## #### ## ## ###### ### ############ ## ########## ######## ## ## ##### ########## ############# ################# ################# ## ################# ################# ############# ###### ###### ####### ####### ## ####### ### ## ### ## ### ## ### ############################# ###### ############################# ######## ############################# ###### ############################# ### ### ######### ############### ################### ####################### ####### ## ###### #### ## #### ### ## ### ### ## ## ### ## ## ### ## ## ## ## ### ## ## #### ## ## ###### ### ############ ## ########## ######## ## ## ##### ########## ############# ################# ################# ## ################# ################# ############# ###### ####### ############### ################# ############# ###### ###### ####### ####### ## ######### ##### ## ## Acme-EyeDrops-1.61/lib/Acme/EyeDrops/tpr.eyp100644 52 52 113 10274703033 20147 0ustar00arthurdent 0 0 description : Vertical banner of "The Perl Review" keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/uml.eye100644 52 52 2327 10163413422 20152 0ustar00arthurdent 0 0 ###################################### # # # # # # # # # # ###################################### # # # # # ####### # # ###################################### # # # # ############################### ############################### # # # # # # # # # # # # # # # # # # # # ############################### ############################### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/uml.eyp100644 52 52 35 10274731066 20131 0ustar00arthurdent 0 0 description : A UML diagram Acme-EyeDrops-1.61/lib/Acme/EyeDrops/undies.eye100644 52 52 1704 10163413422 20642 0ustar00arthurdent 0 0 ######################################################## ######################################################## ######################################################## ######################################################## ######################################################## ######################################################## ################################################## ############################################ ###################################### ################################## ############################## ########################## ######################## ###################### #################### ################## ################ ############## ############## ############ ############ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/undies.eyp100644 52 52 104 10274703065 20636 0ustar00arthurdent 0 0 description : A pair of underpants keywords : object underwear Acme-EyeDrops-1.61/lib/Acme/EyeDrops/window.eye100644 52 52 2615 10163413422 20664 0ustar00arthurdent 0 0 ################################################ ################################################ ################################################ ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ################################################ ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ##### ## ##### ################################################ ################################################ ################################################ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/window.eyp100644 52 52 56 10274703106 20640 0ustar00arthurdent 0 0 description : A window keywords : object Acme-EyeDrops-1.61/lib/Acme/EyeDrops/writing_perl.eye100644 52 52 11444 10163413422 22102 0ustar00arthurdent 0 0 ######### ################# ########## ######### ###### ####### ##### ##### #### ###### #### ###### ####### #### ###### ############ #### ###### ############### #### ##### ################## ### ##### ##### ####### ### ##### ##### # #### ## ## ##### ##### ### ### ## ### ##### ##### ### ## ### ##### ##### ### ### #### ##### #### ### ### ### # ##### #### ###### ############# ##### ### #### ########## ##### ### ##### ### ##### ## ##### # ###### ##### ###### ######## ##### #### ##### ## ### ##### ### #### ######## ######## ################# ###### ######### ############ ######################### #### ######################### #### ######### #### ######## #### ######## ## #### ######### ### #### ## ######### #### #### ### ######### #### ##### ## ######### ####### #### ### ### ############# ########### #### #### ### ####################### #### #### ### #################### #### ##### #### ################ ##### ##### #### ############ #### #### #### ######## #### #### #### #### #### ##### #### #### ##### #### #### ###### #### ##### ###### #### ##### ####### #### ##### ####### #### ##### ####### ##### ##### ######## ###### ###### ########### ####### ####### ########## #################### ####### ################## ################ ############ ##### Acme-EyeDrops-1.61/lib/Acme/EyeDrops/writing_perl.eyp100644 52 52 100 10274300013 22032 0ustar00arthurdent 0 0 description : Perl in camel-style by Takanori KAWAI (Japanese) Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick.eye100644 52 52 5225 10163413422 20633 0ustar00arthurdent 0 0 ################## ######################## ############################ ################################ ################################### ###################################### ######################################### ########################################### ############################################# ############################################## ############################################### ################################################# ################################################### ######################### ##### ####### ######################## ###### ####################### ##### ######################## ##### ##### ####################### ##### ######## ###################### ##### ########## ##### ############## ##### ########## #### ############ ##### ########## # ######## ##### ########## # ####### ##### ########## # ### ### ######## # ### # # # # # # ####### # ## # # # ###### # # # # ###### # # ###### # ###### ##### # ###### ### ###### ##### # ###### # # # ###### # # # ###### # ##### # # ###### # ##### # # ###### # # # ####### # ## # # ######## # ## # # ########## # ## # # ############# # ## # # ########################## ## # ############################ ## # ############################# #### ############################### # ################################ # ############################## ####### ############################# ############################ Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick.eyp100644 52 52 153 10274753143 20633 0ustar00arthurdent 0 0 nick : `/anick description : Caricature of `/anick's noggin keywords : face person perlhacker Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick2.eye100644 52 52 202616 10163413422 20760 0ustar00arthurdent 0 0 # # # # ################################## ################################## # ########### ################# ################### ################### ################### ############## ####### ####### ####### # ####### ################################## ################################## ################################## ################################## # # ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # #################### ### #################### ##### #################### ##### # # ### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ####################### ######################## ######################### ### # ### # # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ### ##### ######## ##### # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### ### #################### ##### #################### ##### # # ### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # # ################################ ################################# ################################## # # ### # # ####### ####### ### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # ################################## ################################## ################################## # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # ################################## ################################## ################################## # # # #################### ### #################### ##### #################### ##### # # ### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### ### #################### ##### #################### ##### # # ### # # ####################### ######################## ######################### ### # ### # # ### ####### ###### #### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## # # ################################## ################################## ################################## # # # #################### ### #################### ##### #################### ##### # # ### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ######## ############## ################## ##### ###### ### ## ## ## ## ## # ## ## ############################### ############################### ############################### # # # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # #################### ### #################### ##### #################### ##### # # ### # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # # ################################ ################################# ################################## # # ### # # ####### ####### ### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # # ## ### #### ##### ###### ### ######### ########### # ######### # ########## ######### ### ####### ### # #### ### ## # # # # # ############################### ############################### ############################### ############################### ## ## ## ## ## ## ### ## #### #### ################## ############## ######## # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # #################### ### #################### ##### #################### ##### # # ### ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # ####################### ######################## ######################### ### # ### # # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # #################### ### #################### ##### #################### ##### # # ### # # ####################### ######################## ######################### ### # ### # # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # #################### ### #################### ##### #################### ##### # # ### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # # ## # ## ## ## ## ## ## ### ### ##### ###### ################ ############ # # ################################## ################################## ################################## # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ### ##### ######## ##### # # # # ################################## ################################## ################################## # # # # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # # # ####################### ######################## ######################### ### # ### # # # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # ################################## ################################## ################################## # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## # ## ## ############################### ############################### ############################### # # # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # #################### ### #################### ##### #################### ##### # # ### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # ####################### ######################## ######################### ### # ### # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # # # ################################## ################################## ################################## # # # # ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # #################### ### #################### ##### #################### ##### # # ### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # ## ####### ######### ############## ############ ############ #### ##### ##### # ##### # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # # # ################################## ################################## ################################## # ## # ## ## ## ## ## ## ### ### ##### ###### ################ ############ ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick2.eyp100644 52 52 106 10274703167 20714 0ustar00arthurdent 0 0 description : Uttered by `/anick during TPR02 keywords : vbanner Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick3.eye100644 52 52 201613 10163413422 20755 0ustar00arthurdent 0 0 # # # # ################################## ################################## # ########### ################# ################### ################### ################### ############## ####### ####### ####### # ####### ################################## ################################## ################################## ################################## # # ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # ################## ######################## ############################ ################################ ################################### ###################################### ######################################### ########################################### ############################################# ############################################## ############################################### ################################################# ################################################### ######################### ##### ####### ######################## ###### ####################### ##### ######################## ##### ##### ####################### ##### ####### ###################### ##### ####### ##### ############## ##### ####### #### ############ ##### ####### # ######## ##### ####### # ####### ##### ####### # ### ### ##### # ### # # # # # # #### # ## # # # ### # # # # ### # # ### # ###### ##### # ### ### ###### ##### # ### # # # ### # # # ### # ##### # # ### # ##### # # ### # # # #### # ## # # ##### # ## # # ####### # ## # # ########## # ## # # ####################### ## # ######################### ## # ########################## #### ############################ # ############################# # ########################### ####### ########################## ######################### # # #################### ### #################### ##### #################### ##### # # ### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ####################### ######################## ######################### ### # ### # # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ### ##### ######## ##### # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### ### #################### ##### #################### ##### # # ### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ####################### ######################## ######################### ### # ### # # ################ # ###################### # # ########################## # # ############################## # # ################################ # # ################################## # # ################################## # # #################################### # # #################################### # # #################################### # # #################################### # # #################################### # # ################################## # # ################################## # # ################################ # # ############################## # # ########################## # # ###################### # ################ # # # ################################ ################################# ################################## # # ### # # ####### ####### ### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # ################################## ################################## ################################## # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # ################################## ################################## ################################## # # # #################### ### #################### ##### #################### ##### # # ### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### ### #################### ##### #################### ##### # # ### # # ####################### ######################## ######################### ### # ### # # ### ####### ###### #### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## # # ################################## ################################## ################################## # # # #################### ### #################### ##### #################### ##### # # ### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # ## ## ##### # # ######## # # ######### # # # # ########### # # # # ############ # # # # ############ # # # # ############ # # # # ############ # # # # ########### # # # # ######## ########## # # # # ############### ######## #### ### # # ################### ################ # ###################################### # ###################################### ##################### ########### ############# ############ ####### ### ### ## # # # ## # # # ## # # # ## # # # ## # # # #### # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ####### ###### ##### ##### ##### ##### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # # ################################ ################################# ################################## # # ### # # ####### ####### ### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ########################################## ###### ########################################## ######### ############################################# ### ########################################### ### ########################################## ### ######################################## ### ######################################## #### ###################################### #### #################################### #### ####################################### #################################### ############################## ######################## ################## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # #################### ### #################### ##### #################### ##### # # ### ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # ####################### ######################## ######################### ### # ### # # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # #################### ### #################### ##### #################### ##### # # ### # # ####################### ######################## ######################### ### # ### # # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # #################### ### #################### ##### #################### ##### # # ### #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # # # ################################## ################################## ################################## # # ## # ## ## ## ## ## ## ### ### ##### ###### ################ ############ # # ################################## ################################## ################################## # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ### ##### ######## ##### # # # # ################################## ################################## ################################## # # # # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # # # ####################### ######################## ######################### ### # ### # # # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # ################################## ################################## ################################## # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # ## ####### ######### ############## ############ ############ #### ######## ############ ######### ##### ##### ##### # ##### # # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## # ### #################### #################### ################## ## # ### #################### #################### ################### # # # ############################### ############################### ############################### ############################### # ## ## ## ## ## ## ### ## #### #### ################## ############## ######## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ######## ############## ################## ##### ###### ### ## ## ## ## ## # ## ## ############################### ############################### ############################### # # # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # # #################### ### #################### ##### #################### ##### # # ### ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # ####################### ######################## ######################### ### # ### # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # # # # # ################################## ################################## ################################## # # # # ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ##### ### ##### ####### ## ########## ### ###### ## ## ##### # # ##### # # ##### ## ## ##### ### ## ###### ##### ########## ##### ###### # # #################### ### #################### ##### #################### ##### # # ### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # ## ####### ######### ############## ############ ############ #### ##### ##### # ##### # # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # # ####################### ######################## ######################### ### # ### # # ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## # ################ ################### #################### #### ### ### ## # # #################### #################### #################### # # ###### ############ ################ ##### ##### ### ## # # # # # ## # ### ## ### ## # # ################################## ################################## ################################## # ## # ## ## ## # #### #################### ################### ################ # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # ################################## ################################## ################################## # ### # ######## ########## # ######## ## # ######### ### ####### ## #### ## # ###### ############ ################ ##### ## ##### ### ## ## # ## # # ## # # ## ## # ## #### ## ########## ## ######## #### ## # #### ## #### ####### #### ######### ##### ############## ##### ############ ############# #### ##### ##### # ##### # # # # ################################## ################################## ################################## # ## # ## ## ## ## ## ## ### ### ##### ###### ################ ############ ###### ############ ################ ##### ##### ### ## # # # # ## ## ## ### ##### ##### ############### ########## ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### #################### #################### # ### # ## ## ### ####### ####### ###### ######## ############## ################## ##### ###### ### ## ## ## ## ## ## ## # ################################## ################################## ################################## # # ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # #### #### ######## ######## ## ###### ############ ## ##################### ## ##### ## ## ## ##### # # ## ##### # # ### ##### ### ### ############ ############ ########## ############ ###### ######## #### ### ### ######## ########## ##### #### #### ###### ## ## ## ## ## # ## ## ## ################## ################### ################## ## # # # #################### ### #################### ##### #################### ##### # # ### # # #################### #################### #################### # ## ## ## ## # #### #################### ################### ################ # Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick3.eyp100644 52 52 54 10274300056 20665 0ustar00arthurdent 0 0 description : Pictorial version of yanick2 Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick4.eye100644 52 52 1322 10163413422 20711 0ustar00arthurdent 0 0 ######### ############## ################# #################### ###################### ######################## ########################## ############ ### ############ ### #### ########### ### ##### ## ###### ### ##### # #### ### #### # # # # # # # ### # # # # ### # ### ### # ### # # # ### # ## # # ### # # #### # # # # ####### # # ## ############## # # ################ # ############### ### ############## ############# Acme-EyeDrops-1.61/lib/Acme/EyeDrops/yanick4.eyp100644 52 52 63 10274300077 20671 0ustar00arthurdent 0 0 description : Abbreviated version of shape yanick Acme-EyeDrops-1.61/t/00_Coffee.t100644 52 52 3037 10163413376 15631 0ustar00arthurdent 0 0 #!/usr/bin/perl # 00_Coffee.t (was convert.t) # Test ascii_to_sightly() and sightly_to_ascii(). use strict; use Acme::EyeDrops qw(ascii_to_sightly sightly_to_ascii); $|=1; # XXX: The print "not " hack used below does not work on VMS apparently # (for some odd reason, I think it prints a newline after the "not ") print "1..10\n"; my $t1 = 'abcdefghijklmnopqrstuvwxyz'; my $f1 = ascii_to_sightly($t1); # There are 32 characters in the sightly character set, namely: # 33-47 (15), 58-64 (7), 91-96 (6), 123-126 (4). $f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/ and print "not "; print "ok 1\n"; my $t1a = sightly_to_ascii($f1); $t1 eq $t1a or print "not "; print "ok 2\n"; $t1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $f1 = ascii_to_sightly($t1); $f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/ and print "not "; print "ok 3\n"; $t1a = sightly_to_ascii($f1); $t1 eq $t1a or print "not "; print "ok 4\n"; $t1 = '0123456789'; $f1 = ascii_to_sightly($t1); $f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/ and print "not "; print "ok 5\n"; $t1a = sightly_to_ascii($f1); $t1 eq $t1a or print "not "; print "ok 6\n"; $t1 = "\n"; $f1 = ascii_to_sightly($t1); $f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/ and print "not "; print "ok 7\n"; $t1a = sightly_to_ascii($f1); $t1 eq $t1a or print "not "; print "ok 8\n"; $t1 = join("", map(chr, 0..255)); $f1 = ascii_to_sightly($t1); $f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/ and print "not "; print "ok 9\n"; $t1a = sightly_to_ascii($f1); $t1 eq $t1a or print "not "; print "ok 10\n"; Acme-EyeDrops-1.61/t/01_mug.t100644 52 52 11014 12146374572 15254 0ustar00arthurdent 0 0 #!/usr/bin/perl # 01_mug.t (was camel.t) use strict; use Acme::EyeDrops qw(sightly get_eye_string reflect_shape); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- # Sometimes tests 4 and 6 fails with "Out of memory!" with perl 5.10.0: # comment out these tests for now. # print "1..11\n"; print "1..6\n"; my $camelstr = get_eye_string('camel'); my $camel_Y_str = $camelstr; $camel_Y_str =~ tr/#/Y/; my $buffystr = get_eye_string('buffy2'); my $buffymirrorstr = reflect_shape($buffystr); my $tmpf = 'bill.tmp'; # ------------------------------------------------- my $itest = 0; my $prog; # ------------------------------------------------- # Test 12032 camels example. $prog = sightly( { Regex => 1, Compact => 1, RemoveNewlines => 1, BorderGap => 1, Shape => 'camel', InformHandler => sub {}, SourceString => <<'END_SRC_STR' } ); $~=uc shift;$:=pop||'#';open$%;chop(@~=<0>);$~=~R&& (@~=map{$-=$_+$_;join'',map/.{$-}(.)/,@~}$%..33); $|--&$~=~H&&next,$~!~Q&&eval"y, ,\Q$:\E,c",$~=~I&& eval"y, \Q$:\E,\Q$:\E ,",$~=~M&&($_=reverse), print$~=~V?/(.).?/g:$_,$/for$~=~U?reverse@~:@~ END_SRC_STR build_file($tmpf, $prog); my $camelprog = my $camelprogstr = $prog; $camelprogstr =~ tr/!-~/#/; # ------------------------------------------------- # This one used to be OK with -Mstrict but not as of perl 5.8.4. # From the perl 5.8.4 perldelta: # Pragmata are now correctly propagated into (?{...}) constructions in regexps. # Code such as # my $x = qr{ ... (??{ $x }) ... }; # will now (correctly) fail under use strict. # (As the inner $x is and has always referred to $::x) # This one used to be OK with -w but not as of perl 5.16.0. my $outstr = `$^X $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - 12032 camels rc\n"; $outstr eq $camelprogstr or print "not "; ++$itest; print "ok $itest - 12032 camels shape\n"; $outstr =~ s/^ //mg; $outstr =~ s/ +$//mg; $outstr =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $outstr =~ s/\n//; chop $outstr; $outstr eq $camelstr or print "not "; ++$itest; print "ok $itest - 12032 camels shape trail\n"; # ------------------------------------------------- # This one used to be OK with -Mstrict but not as of perl 5.8.4. # Sometimes fails with "Out of memory!" with perl 5.10.0: # comment out for now. # $outstr = `$^X -w $tmpf q`; # $rc = $? >> 8; # $rc == 0 or print "not "; # ++$itest; print "ok $itest - 12032 camels quine rc\n"; # $outstr eq $camelprog or print "not "; # ++$itest; print "ok $itest - 12032 camels quine shape\n"; # $camelprogstr =~ tr/#/Y/; # This one used to be OK with -Mstrict but not as of perl 5.8.4. # $outstr = `$^X -w $tmpf Y Y`; # $rc = $? >> 8; # $rc == 0 or print "not "; # ++$itest; print "ok $itest - 12032 camels Y rc\n"; # $outstr eq $camelprogstr or print "not "; # ++$itest; print "ok $itest - 12032 camels Y shape\n"; # $outstr =~ s/^ //mg; # $outstr =~ s/ +$//mg; # $outstr =~ s/\n//; chop $outstr; # $outstr eq $camel_Y_str or print "not "; # ++$itest; print "ok $itest - 12032 camels Y shape trail\n"; # ------------------------------------------------- # Test Buffy looking in the mirror example. my $src = <<'END_SRC_STR'; open$[;chop,($==y===c)>$-&&($-=$=)for@:=<0>; print$"x-(y---c-$-).reverse.$/for@: END_SRC_STR $prog = sightly( { Regex => 1, Compact => 1, Shape => 'buffy2', InformHandler => sub {}, SourceString => $src } ); build_file($tmpf, $prog); my $buffyprogstr = my $buffyprog = $prog; $buffyprogstr =~ tr/!-~/#/; # ------------------------------------------------- # This one used to be OK with -Mstrict but not as of perl 5.16.0. $outstr = `$^X -w $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - buffy rc\n"; $outstr =~ tr/!-~/#/; $outstr eq $buffyprogstr and print "not "; ++$itest; print "ok $itest - buffy shape\n"; $outstr =~ s/ +$//mg; $outstr =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $outstr eq $buffymirrorstr or print "not "; ++$itest; print "ok $itest - buffy shape mirror\n"; # ------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; Acme-EyeDrops-1.61/t/02_shatters.t100644 52 52 4552 12146374566 16316 0ustar00arthurdent 0 0 #!/usr/bin/perl # 02_shatters.t (was module.t) # Test program for module bug raised by Mark Puttman. use strict; use Acme::EyeDrops qw(sightly get_eye_string); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- # Fails with "Out of memory!" with perl 5.10.0: comment out tests 2-4 for now. # print "1..4\n"; print "1..1\n"; my $module_str = <<'GROK'; package MyEye; use strict; sub new { my $proto=shift; my $class=ref($proto) || $proto; my $self={}; $self->{name}=shift; bless $self,$class; return $self; } sub printName { my $self=shift; print "My Name is $self->{name}\n"; } 1; GROK my $main_str = <<'GROK'; use MyEye; my $obj=MyEye->new("mark"); $obj->printName(); GROK my $camelstr = get_eye_string('camel'); my $japhstr = get_eye_string('japh'); my $tmpf = 'bill.tmp'; # ------------------------------------------------- my $itest = 0; my $prog; # JAPH MyEye.pm ----------------------------------- $prog = sightly({ Shape => 'japh', SourceString => $module_str, InformHandler => sub {}, Regex => 1 } ); build_file('MyEye.pm', $prog); $prog =~ tr/!-~/#/; $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog eq $japhstr or print "not "; ++$itest; print "ok $itest - MyEye.pm shape\n"; # Camel myeye.pl ----------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $main_str, InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); # Fails with "Out of memory!" with perl 5.10.0: comment out tests 2-4 for now. # my $outstr = `$^X -w -Mstrict $tmpf`; # my $rc = $? >> 8; # $rc == 0 or print "not "; # ++$itest; print "ok $itest - MyEye.pm rc\n"; # $outstr eq "My Name is mark\n" or print "not "; # ++$itest; print "ok $itest - MyEye.pm output\n"; # $prog =~ tr/!-~/#/; # $prog eq $camelstr or print "not "; # ++$itest; print "ok $itest - shape\n"; # -------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; unlink('MyEye.pm') or die "error: unlink 'MyEye.pm': $!"; Acme-EyeDrops-1.61/t/03_Larry.t100644 52 52 11667 12146374516 15573 0ustar00arthurdent 0 0 #!/usr/bin/perl # 03_Larry.t (was limit.t) use strict; use Acme::EyeDrops qw(sightly regex_eval_sightly); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- print "1..45\n"; # Exact fit is 215 characters. my $exact = 215; my $tmpf = 'bill.tmp'; # -------------------------------------------------- my $itest = 0; my $prog; my $last; sub test_one { my ($e, $ostr, $enlf) = @_; build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - $e rc\n"; $outstr eq $ostr or print "not "; ++$itest; print "ok $itest - $e output\n"; $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line my $nlf = $prog =~ tr/\n//; $nlf == $enlf or print "not "; ++$itest; print "ok $itest - $e nlf $enlf\n"; $last = chop($prog); $last eq "\n" or print "not "; ++$itest; print "ok $itest - $e last is newline\n"; } # -------------------------------------------------- my $srcstr = qq#print "abc\\n";\n#; my $sightlystr = regex_eval_sightly($srcstr); length($sightlystr) == $exact or print "not "; ++$itest; print "ok $itest - exact 215\n"; # Exact fit abc ------------------------------------ $prog = sightly({ Width => $exact, SourceString => $srcstr, InformHandler => sub {}, Regex => 1 } ); test_one('Exact fit abc', "abc\n", 1); length($prog) == $exact or print "not "; ++$itest; print "ok $itest\n"; $prog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; $last = chop($prog); $last eq ')' or print "not "; ++$itest; print "ok $itest\n"; # One more abc ------------------------------------ $prog = sightly({ Width => $exact+1, SourceString => $srcstr, InformHandler => sub {}, Regex => 1 } ); test_one('One more abc', "abc\n", 1); length($prog) == $exact+1 or print "not "; ++$itest; print "ok $itest\n"; $last = chop($prog); $last eq ';' or print "not "; ++$itest; print "ok $itest\n"; $prog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; # One less abc ------------------------------------ $prog = sightly({ Width => $exact-1, SourceString => $srcstr, InformHandler => sub {}, Regex => 1 } ); test_one('One less abc', "abc\n", 2); my @lines = split(/^/, $prog, -1); chop(@lines); scalar(@lines) == 2 or print "not "; ++$itest; print "ok $itest\n"; my $fchar = substr($lines[1], 0, 1); $fchar eq ')' or print "not "; ++$itest; print "ok $itest\n"; length($prog) == 2*($exact-1)+1 or print "not "; ++$itest; print "ok $itest\n"; my $nprog = $lines[0] . $fchar; $nprog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; # -------------------------------------------------- # Test with FillerVar = '#' # Exact fit abc ------------------------------------ $prog = sightly({ Width => $exact, SourceString => $srcstr, FillerVar => '#', InformHandler => sub {}, Regex => 1 } ); test_one('Exact fit abc, FillerVar=#', "abc\n", 1); length($prog) == $exact or print "not "; ++$itest; print "ok $itest\n"; $prog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; $last = chop($prog); $last eq ')' or print "not "; ++$itest; print "ok $itest\n"; # One more abc ------------------------------------ $prog = sightly({ Width => $exact+1, SourceString => $srcstr, FillerVar => '#', InformHandler => sub {}, Regex => 1 } ); test_one('One more abc, FillerVar=#', "abc\n", 1); length($prog) == $exact+1 or print "not "; ++$itest; print "ok $itest\n"; $last = chop($prog); $last eq ';' or print "not "; ++$itest; print "ok $itest\n"; $prog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; # One less abc ------------------------------------ $prog = sightly({ Width => $exact-1, SourceString => $srcstr, FillerVar => '#', InformHandler => sub {}, Regex => 1 } ); test_one('One less abc, FillerVar=#', "abc\n", 2); @lines = split(/^/, $prog, -1); chop(@lines); scalar(@lines) == 2 or print "not "; ++$itest; print "ok $itest\n"; $fchar = substr($lines[1], 0, 1); $fchar eq ')' or print "not "; ++$itest; print "ok $itest\n"; length($prog) == 2*($exact-1)+1 or print "not "; ++$itest; print "ok $itest\n"; $nprog = $lines[0] . $fchar; $nprog eq $sightlystr or print "not "; ++$itest; print "ok $itest\n"; # -------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; Acme-EyeDrops-1.61/t/04_Apocalyptic.t100644 52 52 5642 12146374530 16723 0ustar00arthurdent 0 0 #!/usr/bin/perl # 04_Apocalyptic.t (was limit2.t) use strict; use Acme::EyeDrops qw(sightly); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- print "1..44\n"; my $tmpf = 'bill.tmp'; # -------------------------------------------------- my $itest = 0; my $srcstr = '$x=9'; sub test_one { my ($e, $shapestr, $enlf) = @_; my $prog = sightly({ ShapeString => $shapestr, SourceString => $srcstr, InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; $? >> 8 == 0 or print "not "; ++$itest; print "ok $itest - $e rc\n"; $outstr eq "" or print "not "; ++$itest; print "ok $itest - $e output\n"; $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ tr/\n// == $enlf or print "not "; ++$itest; print "ok $itest - $e nlf $enlf\n"; $prog =~ tr/!-~/#/; $prog eq $shapestr or print "not "; ++$itest; print "ok $itest - $e shape\n"; } sub test_one_empty { my $shapestr = shift; my $prog = sightly( { ShapeString => $shapestr, InformHandler => sub {} } ); build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; $? >> 8 == 0 or print "not "; ++$itest; print "ok $itest - rc\n"; $outstr eq "" or print "not "; ++$itest; print "ok $itest - output\n"; $prog =~ tr/\n// == 1 or print "not "; ++$itest; print "ok $itest - nlf\n"; $prog =~ tr/!-~/#/; $prog eq $shapestr or print "not "; ++$itest; print "ok $itest - shape\n"; } # -------------------------------------------------- my $bugshape = '#######################################################' . '#######################################################' . "\n" . "# # #\n"; my $onetoomanyshape = '#######################################################' . '#######################################################' . "\n" . "# # # #\n"; # ----------------------------------------------------- test_one('One too many bug', $onetoomanyshape, 2); test_one('Invalid program bug', $bugshape, 2); # more invalid program tests -------------------------- # This one failed prior to EyeDrops version 1.17. test_one_empty("############ ###### ### ###\n"); test_one_empty("############ ### ### #\n"); test_one_empty("############ ##### ### #\n"); test_one_empty("############ ### #### #\n"); test_one_empty("############ #\n"); test_one_empty("############ ##\n"); test_one_empty("############ ###\n"); test_one_empty("############ ####\n"); test_one_empty("############\n"); # ----------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; Acme-EyeDrops-1.61/t/05_Parrot.t100644 52 52 33653 12146374505 15750 0ustar00arthurdent 0 0 #!/usr/bin/perl # 05_parrot.t (was sightly.t) use strict; use Acme::EyeDrops qw(sightly get_eye_string make_siertri make_triangle regex_eval_sightly regex_binmode_print_sightly); $|=1; # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- print "1..75\n"; my $hellostr = <<'HELLO'; print "hello world\n"; HELLO my $helloteststr = <<'HELLOTEST'; # Just a test. use strict; for my $i (0..3) { print "hello test $i\n"; } HELLOTEST my $hellofile = 'helloworld.pl'; my $camelstr = get_eye_string('camel'); my $larrystr = get_eye_string('larry'); my $damianstr = get_eye_string('damian'); my $umlstr = get_eye_string('uml'); my $windowstr = get_eye_string('window'); my $japhstr = get_eye_string('japh'); my $yanick4str = get_eye_string('yanick4'); my $siertristr = make_siertri(5); my $baldprogstr = regex_eval_sightly($hellostr); # XXX: regex_binmode_print_sightly seems dodgy, this call is just to # improve code coverage. Investigate later. my $dodgyprogstr = regex_binmode_print_sightly($hellostr); my $tmpf = 'bill.tmp'; my $tmpeye = 'tmpeye.eye'; my $tmpeye2 = 'tmpeye2.eye'; build_file($hellofile, $hellostr); # -------------------------------------------------- my $itest = 0; my $prog; sub test_one { my ($e, $ostr, $sh) = @_; build_file($tmpf, $prog); my $outstr = `$^X -Tw -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - $e rc\n"; $outstr eq $ostr or print "not "; ++$itest; print "ok $itest - $e output\n"; $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ s/^.*eval.*\n\n\n//; $prog =~ tr/!-~/#/; $prog eq $sh or print "not "; ++$itest; print "ok $itest - $e shape\n"; } # Camel helloworld.pl ------------------------------ $prog = sightly({ Shape => 'camel', SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); test_one('Camel helloworld', "hello world\n", $camelstr); # uml/window helloworld.pl ------------------------- $prog = sightly({ Shape => 'uml,window', SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); test_one('uml/window helloworld', "hello world\n", $umlstr . $windowstr); # uml/window helloworld.pl ------------------------- build_file($tmpeye, $umlstr); build_file($tmpeye2, $windowstr); $prog = sightly({ Shape => 'all', EyeDir => '.', SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); test_one('uml/window all helloworld', "hello world\n", $umlstr . $windowstr); $prog = sightly({ Shape => 'all', EyeDir => '.', Width => 2, SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); test_one('uml/window all width helloworld', "hello world\n", $umlstr . "\n\n" . $windowstr); # Text string print -------------------------------- my $srcstr = "Bill Gates is a pest!\n"; $prog = sightly({ Shape => 'window', SourceString => $srcstr, Regex => 1, InformHandler => sub {}, Print => 1 } ); test_one('Bill Gates is a pest!', $srcstr, $windowstr); # Text string print (eval) ------------------------- $prog = sightly({ Shape => 'window', SourceString => $srcstr, Regex => 0, InformHandler => sub {}, Print => 1 } ); test_one('Bill Gates is a pest!', $srcstr, $windowstr); # Binary encode/decode ----------------------------- my $encodestr = qq#binmode(STDOUT);print eval '"'.\n\n\n#; $encodestr =~ tr/!-~/#/; $encodestr .= $camelstr x 5; $srcstr = join("", map(chr(), 0..255)); $prog = sightly({ Shape => 'camel', SourceString => $srcstr, Binary => 1, Regex => 0, InformHandler => sub {}, Print => 1 } ); build_file($tmpf, $prog); # This seems to stop on CTRL-Z on Windows! # Something to do with binmode ?? # $outstr = `$^X -w -Mstrict $tmpf`; # so use a temporary file instead. my $tmpf2 = 'bill2.tmp'; system("$^X -Tw -Mstrict $tmpf >$tmpf2"); my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - binary str encode rc\n"; open(TT, $tmpf2) or die "open '$tmpf2': $!"; binmode(TT); my $outstr = do { local $/; }; close(TT); $outstr eq $srcstr or print "not "; ++$itest; print "ok $itest - binary str encode output\n"; $prog =~ tr/!-~/#/; $prog eq $encodestr or print "not "; ++$itest; print "ok $itest - binary str encode shape\n"; $prog = sightly({ Shape => 'camel', SourceFile => $tmpf2, Binary => 1, Regex => 0, InformHandler => sub {}, Print => 1 } ); build_file($tmpf, $prog); system("$^X -Tw -Mstrict $tmpf >$tmpf2"); $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - binary file encode rc\n"; open(TT, $tmpf2) or die "open '$tmpf2': $!"; binmode(TT); $outstr = do { local $/; }; close(TT); $outstr eq $srcstr or print "not "; ++$itest; print "ok $itest - binary file encode output\n"; $prog =~ tr/!-~/#/; $prog eq $encodestr or print "not "; ++$itest; print "ok $itest - binary file encode shape\n"; # Self-printing JAPH ------------------------------- my $src = <<'PROG'; open 0; $/ = undef; $x = <0>; close 0; $x =~ tr/!-~/#/; print $x; PROG $prog = sightly({ Shape => 'japh', SourceString => $src, InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); # This one used to be OK with -Mstrict but not as of perl 5.8.4. # From the perl 5.8.4 perldelta: # Pragmata are now correctly propagated into (?{...}) constructions in regexps. # Code such as # my $x = qr{ ... (??{ $x }) ... }; # will now (correctly) fail under use strict. # (As the inner $x is and has always referred to $::x) $outstr = `$^X -Tw $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - self-printing japh rc\n"; $outstr =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $outstr eq $japhstr or print "not "; ++$itest; print "ok $itest - self-printing japh output\n"; # Camel helloworld.pl (FillerVar=';')--------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, FillerVar => ';', InformHandler => sub {}, Regex => 1 } ); test_one('Camel helloworld fillervar=;', "hello world\n", $camelstr); # Camel helloworld.pl (FillerVar=';#')-------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, FillerVar => ';#', InformHandler => sub {}, Regex => 1 } ); test_one('Camel helloworld fillervar=;#', "hello world\n", $camelstr); # Camel helloworld.pl (FillerVar='')---------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, FillerVar => '', InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); $outstr = `$^X -Tw -Mstrict $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - Camel helloworld fillervar= rc\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest - Camel helloworld fillervar= output\n"; $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line length($prog) eq 472 or print "not "; ++$itest; print "ok $itest - Camel helloworld fillervar= length\n"; # Yanick4 hellotest.pl -----------------(3 shapes)-- $prog = sightly({ Shape => 'yanick4', SourceString => $helloteststr, InformHandler => sub {}, Regex => 1 } ); test_one('Yanick4 hellotest', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); # Yanick4 hellotest.pl (FillerVar=';')--(3 shapes)-- $prog = sightly({ Shape => 'yanick4', SourceString => $helloteststr, FillerVar => ';', InformHandler => sub {}, Regex => 1 } ); test_one('Yanick4 hellotest FillerVar=;', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); # Yanick4 hellotest.pl (FillerVar='')---(3 shapes)-- $prog = sightly({ Shape => 'yanick4', SourceString => $helloteststr, FillerVar => '', InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); $outstr = `$^X -Tw -Mstrict $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - Yanick4 hellotest FillerVar= rc\n"; $outstr eq "hello test 0\nhello test 1\nhello test 2\nhello test 3\n" or print "not "; ++$itest; print "ok $itest - Yanick4 helloworld fillervar= output\n"; $prog =~ tr/!-~/#/; # Note: normal 'or' test is 'and' test on next line (hacky). $prog eq $yanick4str x 3 and print "not "; ++$itest; print "ok $itest - Yanick4 helloworld fillervar= shape\n"; # siertri hellotest.pl (FillerVar=';')--(3 shapes)-- $prog = sightly({ Shape => 'siertri', Width => 5, SourceString => $helloteststr, FillerVar => ';', InformHandler => sub {}, Regex => 1 } ); test_one('siertri hellotest FillerVar=;', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $siertristr x 5); # Camel helloworld.pl from local eye file ---------- build_file($tmpf2, $camelstr); $prog = sightly({ Shape => $tmpf2, SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); test_one('Camel helloworld local eye file', "hello world\n", $camelstr); # Shapeless helloworld.pl -------------------------- $prog = sightly({ SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); my $prog2 = $prog; $prog2 =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog2 eq $baldprogstr or print "not "; ++$itest; print "ok $itest - Shapeless helloworld bald\n"; build_file($tmpf, $prog); $outstr = `$^X -Tw -Mstrict $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - Shapeless helloworld rc\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest - Shapeless helloworld output\n"; $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ tr/!-~/#/; my $nwhite = $prog =~ tr/\n //; $nwhite == 0 or print "not "; ++$itest; print "ok $itest - Shapeless helloworld nwhite\n"; # Fixed width helloworld.pl ------------------------ $prog = sightly({ SourceString => $hellostr, Width => 42, InformHandler => sub {}, Regex => 1 } ); my $ss = '#' x 42 . "\n"; test_one('Fixed width helloworld', "hello world\n", $ss x 8); # -------------------------------------------------- $prog = sightly({ Shape => 'larry', SourceFile => $hellofile, InformHandler => sub {}, Regex => 1 } ); test_one("Larry helloworld", "hello world\n", $larrystr); # ---------------------------------------------------- $prog = sightly({ Shape => 'larry,damian', SourceFile => $hellofile, InformHandler => sub {}, Regex => 1 } ); test_one('Larry/Damian helloworld', "hello world\n", $larrystr . $damianstr); # ---------------------------------------------------- $prog = sightly({ Shape => 'damian,larry', SourceFile => $hellofile, Gap => 2, InformHandler => sub {}, Regex => 1 } ); test_one('Damian/Larry helloworld', "hello world\n", join("\n\n", $damianstr, $larrystr)); # ---------------------------------------------------- my $shape = "#################### \n \n########## \n" x 11; $prog = sightly({ ShapeString => $shape, SourceFile => $hellofile, InformHandler => sub {}, Regex => 1 } ); test_one('Trailing spaces in shape', "hello world\n", $shape); # ---------------------------------------------------- $prog = sightly({ Shape => 'siertri,larry,siertri,larry', SourceFile => $hellofile, Gap => 2, InformHandler => sub {}, Regex => 1 } ); test_one('siertr/Larry x 2 helloworld', "hello world\n", join("\n\n", make_siertri(0), $larrystr, make_siertri(0), $larrystr)); # ---------------------------------------------------- $prog = sightly({ Shape => "larry,triangle,$tmpf2", SourceFile => $hellofile, Gap => 2, InformHandler => sub {}, Regex => 1 } ); test_one('larry/triangle/camelshapefile helloworld', "hello world\n", join("\n\n", $larrystr, make_triangle(0), $camelstr)); # ---------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; unlink($tmpf2) or die "error: unlink '$tmpf2': $!"; unlink($tmpeye) or die "error: unlink '$tmpeye': $!"; unlink($tmpeye2) or die "error: unlink '$tmpeye2': $!"; unlink($hellofile) or die "error: unlink '$hellofile': $!"; Acme-EyeDrops-1.61/t/06_not.t100644 52 52 23274 12146374467 15307 0ustar00arthurdent 0 0 #!/usr/bin/perl # 06_not.t (was reshape.t) use strict; use Acme::EyeDrops qw(sightly get_eye_string); # ------------------------------------------------- select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- print "1..47\n"; my $hellostr = <<'HELLO'; print "hello world\n"; HELLO my $camelstr = get_eye_string('camel'); my $indent_camelstr = $camelstr; $indent_camelstr =~ s/^/ /mg; my $tmpf = 'bill.tmp'; my $tmpeye = 'tmpeye.eye'; # -------------------------------------------------- my $itest = 0; my $prog; sub test_one { my ($e, $ostr) = @_; build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - $e rc\n"; $outstr eq $ostr or print "not "; ++$itest; print "ok $itest - $e output\n"; } # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Expand => 1, InformHandler => sub {}, Regex => 1 } ); my $bigprog = $prog; test_one('big camel', "hello world\n"); $bigprog =~ tr/!-~/#/; $bigprog eq $camelstr and print "not "; ++$itest; print "ok $itest - bigprog\n"; # ------------------------------------------------- build_file($tmpeye, $camelstr); $prog = sightly({ Shape => 'tmpeye', EyeDir => '.', SourceString => $hellostr, Expand => 1, InformHandler => sub {}, Regex => 1 } ); $bigprog = $prog; test_one('big camel', "hello world\n"); $bigprog =~ tr/!-~/#/; $bigprog eq $camelstr and print "not "; ++$itest; print "ok $itest - bigprog EyeDir\n"; # ------------------------------------------------- $prog = sightly({ ShapeString => $bigprog, SourceString => $hellostr, Reduce => 1, InformHandler => sub {}, Regex => 1 } ); test_one('camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line # $prog =~ tr/!-~/#/; # $prog eq $camelstr or print "not "; # ++$itest; print "ok $itest - prog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, InformHandler => sub {}, Regex => 1 } ); my $rotprog = $prog; test_one('rot 90 camel', "hello world\n"); $rotprog =~ tr/!-~/#/; $rotprog eq $camelstr and print "not "; ++$itest; print "ok $itest - rotprog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, RotateFlip => 1, InformHandler => sub {}, Regex => 1 } ); my $rot90_flipprog = $prog; test_one('rot 90 flip camel', "hello world\n"); $rot90_flipprog =~ tr/!-~/#/; $rot90_flipprog eq $camelstr and print "not "; ++$itest; print "ok $itest - rot 90 flip prog\n"; $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, Reflect => 1, InformHandler => sub {}, Regex => 1 } ); my $rot90_refprog = $prog; test_one('rot 90 reflect camel', "hello world\n"); $rot90_refprog =~ tr/!-~/#/; $rot90_refprog eq $camelstr and print "not "; ++$itest; print "ok $itest - rot 90 ref prog\n"; $rot90_flipprog eq $rot90_refprog or print "not "; ++$itest; print "ok $itest - flip eq reflect\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 270, RotateFlip => 1, InformHandler => sub {}, Regex => 1 } ); my $rot270_flipprog = $prog; test_one('rot 270 flip camel', "hello world\n"); $rot270_flipprog =~ tr/!-~/#/; $rot270_flipprog eq $camelstr and print "not "; ++$itest; print "ok $itest - rot 270 flip prog\n"; $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 270, Reflect => 1, InformHandler => sub {}, Regex => 1 } ); my $rot270_refprog = $prog; test_one('rot 270 reflect camel', "hello world\n"); $rot270_refprog =~ tr/!-~/#/; $rot270_refprog eq $camelstr and print "not "; ++$itest; print "ok $itest - rot 270 ref prog\n"; $rot270_flipprog eq $rot270_refprog or print "not "; ++$itest; print "ok $itest - flip eq reflect\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, TrailingSpaces => 1, InformHandler => sub {}, Regex => 1 } ); $rotprog = $prog; test_one('rot 90 trail camel', "hello world\n"); $rotprog =~ tr/!-~/#/; $rotprog eq $camelstr and print "not "; ++$itest; print "ok $itest - prog\n"; # ------------------------------------------------- $prog = sightly({ ShapeString => $rotprog, SourceString => $hellostr, Rotate => 270, InformHandler => sub {}, Regex => 1 } ); test_one('rot 270 camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $prog =~ tr/!-~/#/; # $prog eq $bigprog or print "not "; # ++$itest; print "ok $itest - bigprog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, RotateType => 1, InformHandler => sub {}, Regex => 1 } ); $rotprog = $prog; test_one('rot 90 camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $rotprog =~ tr/!-~/#/; # $rotprog eq $camelstr and print "not "; # ++$itest; print "ok $itest - bigprog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 90, RotateType => 0, Reduce => 1, InformHandler => sub {}, Regex => 1 } ); test_one('rot 90 camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $prog =~ tr/!-~/#/; # $prog eq $rotprog or print "not "; # ++$itest; print "ok $itest - rotprog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Rotate => 180, InformHandler => sub {}, Regex => 1 } ); $rotprog = $prog; test_one('rot 180 camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $rotprog =~ tr/!-~/#/; # $rotprog eq $camelstr and print "not "; # ++$itest; print "ok $itest - rotprog\n"; # ------------------------------------------------- $prog = sightly({ ShapeString => $rotprog, SourceString => $hellostr, Rotate => 180, InformHandler => sub {}, Regex => 1 } ); test_one('rot 180 camel', "hello world\n"); # XXX: Test fails as at perl 5.18 # $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line # $prog =~ tr/!-~/#/; # $prog eq $camelstr or print "not "; # ++$itest; print "ok $itest - rotprog\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, Indent => 1, InformHandler => sub {}, Regex => 1 } ); test_one('indent 1 camel', "hello world\n"); $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ tr/!-~/#/; $prog eq $indent_camelstr or print "not "; ++$itest; print "ok $itest - indent 1 prog\n"; # ------------------------------------------------- my $testshape = "######## ##########\n" x 50; my $inv_testshape = " #########\n" x 50; my $ref_testshape = "########## ########\n" x 50; $prog = sightly({ ShapeString => $testshape, SourceString => $hellostr, Invert => 1, InformHandler => sub {}, Regex => 1 } ); test_one('inverted test shape', "hello world\n"); $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ tr/!-~/#/; $prog eq $inv_testshape or print "not "; ++$itest; print "ok $itest - inverted test shape prog\n"; $prog = sightly({ ShapeString => $testshape, SourceString => $hellostr, Reflect => 1, InformHandler => sub {}, Regex => 1 } ); test_one('reflected test shape', "hello world\n"); $prog =~ s/^use re 'eval';\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ tr/!-~/#/; $prog eq $ref_testshape or print "not "; ++$itest; print "ok $itest - reflected test shape prog\n"; # ------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; unlink($tmpeye) or die "error: unlink '$tmpeye': $!"; Acme-EyeDrops-1.61/t/07_a.t100644 52 52 13217 12146374547 14723 0ustar00arthurdent 0 0 #!/usr/bin/perl # 07_a.t (was border.t). Test Border stuff. use strict; use Acme::EyeDrops qw(sightly get_eye_string); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- print "1..16\n"; my $hellostr = <<'HELLO'; print "hello world\n"; HELLO my $camelstr = get_eye_string('camel'); my $camel2str = $camelstr . "\n\n\n" . $camelstr; my $tmpf = 'bill.tmp'; # Test bailing out via InformHandler when presented with a # diabolical shape which sends sightly() into an infinite loop. my $max_shapes = 5; my $exp_throw_str = "bailing out after " . ($max_shapes+1) . " shapes.\n"; sub throw_inform { $_[0] =~ /^(\d+) / or die "oops, invalid ihandler string"; $1 > $max_shapes and die "bailing out after $1 shapes.\n"; } # Simple test of InformHandler. my $inform_string; sub test_inform { $inform_string .= $_[0] } # ------------------------------------------------- my $itest = 0; my $prog; # ------------------------------------------------- eval { sightly( { ShapeString => "#\n#\n#\n#\n#\n", SourceString => "# Example nasty shape\n;1;\n", InformHandler => \&throw_inform, Regex => 1 } ); }; $@ or print "not "; ++$itest; print "ok $itest - InformHandler throw\n"; $@ eq $exp_throw_str or print "not "; ++$itest; print "ok $itest - InformHandler throw string\n"; # ------------------------------------------------- $prog = sightly({ Shape => 'camel', SourceString => $hellostr, BorderWidth => 2, BorderGap => 1, InformHandler => \&test_inform, Regex => 1 } ); build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest\n"; $prog =~ tr/!-~/#/; my @lines = split(/^/, $prog, -1); scalar(@lines) > 6 or print "not "; ++$itest; print "ok $itest\n"; pop(@lines);pop(@lines);pop(@lines); shift(@lines);shift(@lines);shift(@lines); $prog = join("", @lines); $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ s/^## //mg; $prog =~ s/ ##$//mg; $prog =~ s/ +$//mg; $prog eq $camelstr or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- # Same again, but exercise Left/Right/Top/Bottom $prog = sightly({ Shape => 'camel', SourceString => $hellostr, BorderWidthLeft => 2, BorderWidthRight => 2, BorderWidthTop => 2, BorderWidthBottom => 2, BorderGapLeft => 1, BorderGapRight => 1, BorderGapTop => 1, BorderGapBottom => 1, InformHandler => \&test_inform, Regex => 1 } ); build_file($tmpf, $prog); $outstr = `$^X -w -Mstrict $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest\n"; $prog =~ tr/!-~/#/; @lines = split(/^/, $prog, -1); scalar(@lines) > 6 or print "not "; ++$itest; print "ok $itest\n"; pop(@lines);pop(@lines);pop(@lines); shift(@lines);shift(@lines);shift(@lines); $prog = join("", @lines); $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ s/^## //mg; $prog =~ s/ ##$//mg; $prog =~ s/ +$//mg; $prog eq $camelstr or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- # This test failed prior to EyeDrops.pm version 1.41. $prog = sightly({ Shape => 'camel,camel', SourceString => $hellostr, BorderWidth => 2, BorderGap => 1, Gap => 3, InformHandler => \&test_inform, Regex => 1 } ); build_file($tmpf, $prog); $outstr = `$^X -w -Mstrict $tmpf`; $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest\n"; $prog =~ tr/!-~/#/; @lines = split(/^/, $prog, -1); scalar(@lines) > 6 or print "not "; ++$itest; print "ok $itest\n"; pop(@lines);pop(@lines);pop(@lines); shift(@lines);shift(@lines);shift(@lines); $prog = join("", @lines); $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog =~ s/^## //mg; $prog =~ s/ ##$//mg; $prog =~ s/ +$//mg; $prog eq $camel2str or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $inform_string eq "1 shapes completed.\n" x 3 or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- # ShapeString join v Shape/Gap multiple shapes sightly( { ShapeString => join("\n", get_eye_string('camel'), get_eye_string('mongers')), SourceString => $hellostr, Gap => 0, InformHandler => sub {}, Regex => 1 } ) eq sightly( { Shape => 'camel,mongers', SourceString => $hellostr, Gap => 1, InformHandler => sub {}, Regex => 1 } ) or print "not "; ++$itest; print "ok $itest - join v gap the same\n"; # ------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; Acme-EyeDrops-1.61/t/08_hoax.t100644 52 52 6305 10163413376 15412 0ustar00arthurdent 0 0 #!/usr/bin/perl # 08_hoax.t (was nasty.t) use strict; use Acme::EyeDrops qw(sightly get_eye_string); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- # my $have_stderr_redirect = 1; # if ($^O eq 'MSWin32') { # Win32::IsWinNT() or $have_stderr_redirect = 0; # } # print $have_stderr_redirect ? "1..7\n" : "1..3\n"; print "1..8\n"; # -------------------------------------------------- my $camelstr = get_eye_string('camel'); my $tmpf = 'bill.tmp'; my $tmpf2 = 'bill2.tmp'; # ------------------------------------------------- my $itest = 0; my $prog; # Camel beginend.pl -------------------------------- # This tests BEGIN/END blocks. my $evalstr = qq#eval eval '"'.\n\n\n#; $evalstr =~ tr/!-~/#/; my $teststr = $evalstr . $camelstr; my $srcstr = qq#BEGIN {print "begin\\n"}\n# . qq#END {print "end\\n"}\n# . qq#print "line1\\nline2\\n";\n#; $prog = sightly({ Shape => 'camel', SourceString => $srcstr, Regex => 0, InformHandler => sub {}, TrapEvalDie => 0 } ); build_file($tmpf, $prog); my $outstr = `$^X -w -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - BEGIN/END rc\n"; $outstr eq "begin\nline1\nline2\nend\n" or print "not "; ++$itest; print "ok $itest - BEGIN/END output\n"; $prog =~ tr/!-~/#/; $prog eq $teststr or print "not "; ++$itest; print "ok $itest - BEGIN/END shape\n"; # Camel hellodie.pl -------------------------------- # This tests catching die inside eval. $evalstr = qq#eval eval '"'.\n\n\n#; $evalstr =~ tr/!-~/#/; my $diestr = qq#\n\n\n;die \$\@ if \$\@\n#; $diestr =~ tr/!-~/#/; $teststr = $evalstr . $camelstr . $diestr; $srcstr = 'die "hello die\\n";'; $prog = sightly({ Shape => 'camel', SourceString => $srcstr, Regex => 0, InformHandler => sub {}, TrapEvalDie => 1 } ); build_file($tmpf, $prog); local *SAVERR; open(SAVERR, ">&STDERR"); # save original STDERR open(STDERR, '>'.$tmpf2) or die "Could not create '$tmpf2': $!"; $outstr = `$^X -w -Mstrict $tmpf`; $rc = $? >> 8; open(STDERR, ">&SAVERR"); # restore STDERR $rc == 0 and print "not "; ++$itest; print "ok $itest - die inside eval rc\n"; $outstr eq "" or print "not "; ++$itest; print "ok $itest - die inside eval output\n"; Acme::EyeDrops::_slurp_tfile($tmpf2) eq "hello die\n" or print "not "; ++$itest; print "ok $itest - die inside die output\n"; $prog =~ tr/!-~/#/; $prog eq $teststr or print "not "; ++$itest; print "ok $itest - die inside die shape\n"; # -------------------------------------------------- unlink($tmpf2) or die "error: unlink '$tmpf2': $!"; unlink($tmpf) or die "error: unlink '$tmpf': $!"; # -------------------------------------------------- # Test slurp of non-existent file. eval { Acme::EyeDrops::_slurp_tfile($tmpf) }; $@ =~ m|open \Q'$tmpf'\E| or print "not "; ++$itest; print "ok $itest - slurp of non-existent file\n"; Acme-EyeDrops-1.61/t/09_Gallop.t100644 52 52 6153 12146374556 15704 0ustar00arthurdent 0 0 #!/usr/bin/perl # 09_Gallop.t (was recur.t) use strict; use Acme::EyeDrops qw(sightly get_eye_string); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- # Fails with "Out of memory!" with perl 5.10.0: comment out tests 4-6 for now. # print "1..6\n"; print "1..3\n"; my $hellostr = <<'HELLO'; print "hello world\n"; HELLO my $camelstr = get_eye_string('camel'); $camelstr .= get_eye_string('window'); my $tmpf = 'bill.tmp'; # ------------------------------------------------- my $itest = 0; my $prog; # Run camel,window helloworld.pl on itself twice --- $prog = sightly({ Shape => 'camel,window', SourceString => $hellostr, InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); my $progorig = $prog; my $outstr = `$^X -w -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - twice rc\n"; $outstr eq "hello world\n" or print "not "; ++$itest; print "ok $itest - twice output\n"; $prog =~ tr/!-~/#/; $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog eq $camelstr or print "not "; ++$itest; print "ok $itest - twice shape\n"; # Prior to Acme::EyeDrops v1.42, test 4 fails on Perl 5.8.1 # with the error: panic: pad_free curpad (Perl bug #23143). # And you can make it fail again, by adding the attribute: # FillerVar => [ '$_' ], # to all sightly() calls in this test program. $prog = sightly({ Shape => 'camel,window', SourceString => $progorig, InformHandler => sub {}, Regex => 1 } ); build_file($tmpf, $prog); # Fails with "Out of memory!" with perl 5.10.0: comment out tests 4-6 for now. # $outstr = `$^X -w -Mstrict $tmpf`; # $rc = $? >> 8; # $rc == 0 or print "not "; # ++$itest; print "ok $itest - twice rc\n"; # $outstr eq "hello world\n" or print "not "; # ++$itest; print "ok $itest - twice output\n"; # my $teststr = $camelstr x 16; # $prog =~ tr/!-~/#/; # $prog eq $teststr or print "not "; # ++$itest; print "ok $itest - twice shape\n"; # -------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; # -------------------------------------------------- # Original Perl bug report #23143 follows: # The following program works under Perl 5.8.0 but fails under # 5.8.1 with the error: "panic: pad_free curpad". # # ''=~m<(?{eval'print 4;$_=9'})>;($_)=9; # # If you change it to: # # ''=~m<(?{eval'print 4;$_=9'})>;$_=9; # # it works fine. Take out the eval: # # ''=~m<(?{print 4;$_=9})>;($_)=9; # # and it fails with "Modification of a read-only value attempted" # on all Perl versions that I tested on. However, Perl 5.8.1 # then goes on to further fail with: "panic: pad_free curpad". # # BTW, the next two work fine on all versions that I tested: # # ''=~m<(?{print 4;local $_=9})>;($_)=9; # ''=~m<(?{eval'print 4;local $_=9'})>;($_)=9; Acme-EyeDrops-1.61/t/10_Ponie.t100644 52 52 13333 11753374015 15537 0ustar00arthurdent 0 0 #!/usr/bin/perl # 10_Ponie.t (was text.t) # This tests OK as taint-safe (i.e. with -Tw added to first line above). use strict; use Acme::EyeDrops qw(sightly hjoin_shapes get_eye_string pour_text); # -------------------------------------------------- select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush print "1..34\n"; my $snow = get_eye_string('snow'); my $src = <<'SNOWING'; $_=q~vZvZ&%('$&"'"&(&"&$&"'"&$Z$#$$$#$%$&"'"&(&# %$&"'"&#Z#$$$#%#%$%$%$%(%%%#%$%$%#Z"%*#$%$%$%$%(%%%#%$%$ %#Z"%,($%$%$%(%%%#%$%$%#Z"%*%"%$%$%$%(%%%#%$%$%#Z#%%"#%#% $%$%$%$##&#%$%$%$%#Z$&""$%"&$%$%$%#%"%"&%%$%$%#Z%&%&# %"'"'"'###%*'"'"'"ZT%?ZT%?ZS'>Zv~; s;\s;;g; $;='@,=map{$.=$";join"",map((($.^=O)x(-33+ord)),/./g),$/}split+Z; s/./(rand)<.2?"o":$"/egfor@;=((5x84).$/)x30;map{ system$^O=~W?CLS:"clear";print@;;splice@;,-$_,2,pop@,; @;=($/,@;);sleep!$%}2..17'; $;=~s;\s;;g;eval$; SNOWING # ------------------------------------------------- my $itest = 0; my $snowflake = pour_text($snow, "", 1, '#'); $snowflake eq $snow or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $snowflake = pour_text($snow, $src, 1, ""); my $t = $snowflake; $t =~ s/\s+//g; my $v = $src; $v =~ s/\s+//g; substr($t, 0, length($v)) eq $v or print "not "; ++$itest; print "ok $itest\n"; substr($t, length($v)) eq '' or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $snowflake = pour_text($snow, $src, 1, '#'); $t = $snowflake; $t =~ tr/!-~/#/; $t eq $snow or print "not "; ++$itest; print "ok $itest\n"; $t = $snowflake; $t =~ s/\s+//g; $v = $src; $v =~ s/\s+//g; substr($t, 0, length($v)) eq $v or print "not "; ++$itest; print "ok $itest\n"; substr($t, length($v)) eq '#' x (length($t)-length($v)) or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $snowflake = sightly( { Shape => 'snow', SourceString => $src, Text => 1, TextFiller => '#' } ); $t = $snowflake; $t =~ tr/!-~/#/; $t eq $snow or print "not "; ++$itest; print "ok $itest\n"; $t = $snowflake; $t =~ s/\s+//g; $v = $src; $v =~ s/\s+//g; substr($t, 0, length($v)) eq $v or print "not "; ++$itest; print "ok $itest\n"; substr($t, length($v)) eq '#' x (length($t)-length($v)) or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- my $shape = "## ###\n"; my $p = pour_text($shape, "", 1, ""); $p eq "\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'X', 1, ""); $p eq "X\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XX', 1, ""); $p eq "XX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXX', 1, ""); $p eq "XX X\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXXX', 1, ""); $p eq "XX XXX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXXXX', 1, ""); $p eq "XX XXX\n\nX\n" or print "not "; ++$itest; print "ok $itest\n"; my $shape_gap = "## ###\n\n####\n"; $p = pour_text($shape_gap, 'XXXXX', 4, ""); $p eq "XX XXX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape_gap, 'XXXXXX', 4, ""); $p eq "XX XXX\n\nX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape_gap, 'XXXXXXXXX', 4, ""); $p eq "XX XXX\n\nXXXX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape_gap, 'XXXXXXXXXX', 4, ""); $p eq "XX XXX\n\nXXXX\n\n\n\n\nX\n" or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $p = pour_text($shape, '', 2, '#'); $p eq "## ###\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'X', 2, '#'); $p eq "X# ###\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XX', 2, '#'); $p eq "XX ###\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXX', 2, '#'); $p eq "XX X##\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXX', 2, '#'); $p eq "XX XX#\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXXX', 2, '#'); $p eq "XX XXX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXXXX', 2, '#'); $p eq "XX XXX\n\n\nX# ###\n" or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $p = pour_text($shape, 'X', 3, 'abc'); $p eq "Xa bca\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'X', 3, 'abcd'); $p eq "Xa bcd\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, 'XXXXX', 3, 'abc'); $p eq "XX XXX\n" or print "not "; ++$itest; print "ok $itest\n"; $p = pour_text($shape, '1234567', 3, 'abc'); $p eq "12 345\n\n\n\n67 abc\n" or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $p = sightly( { SourceString => 'knob', Width => 1, Text => 1, TextFiller => '#' } ); $p eq "k\nn\no\nb\n" or print "not "; ++$itest; print "ok $itest\n"; $p = sightly( { SourceString => 'knob', Width => 3, Text => 1, TextFiller => '#' } ); $p eq "kno\nb##\n" or print "not "; ++$itest; print "ok $itest\n"; $p = sightly( { SourceString => 'knob', Width => 4, Text => 1, TextFiller => '#' } ); $p eq "knob\n" or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- $p = hjoin_shapes(2, "##\n###\n", "#\n##\n###\n"); $p eq "## #\n### ##\n ###\n" or print "not "; ++$itest; print "ok $itest\n"; # ------------------------------------------------- Acme-EyeDrops-1.61/t/11_bold.t100644 52 52 10404 11753374010 15375 0ustar00arthurdent 0 0 #!/usr/bin/perl # 11_bold.t (was vshape.t) # This tests OK as taint-safe (i.e. with -Tw added to first line above). use strict; use Acme::EyeDrops qw(get_eye_string get_eye_shapes get_builtin_shapes make_triangle make_siertri border_shape invert_shape reflect_shape hjoin_shapes sightly reduce_shape expand_shape rotate_shape); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- # A valid shape should: # 1) contain only ' ' '#' and "\n" # 2) be left-justified # 3) no line should contain trailing spaces # 4) be properly newline-terminated # 5) contain no leading or trailing newlines # This test verifies that is the case for all .eye shapes # and for all subroutines that generate shapes. # -------------------------------------------------- my @eye_shapes = get_eye_shapes(); my $n_tests = @eye_shapes * 6 + 13 * 6; $n_tests += 2; # plus builtin shape tests print "1..$n_tests\n"; my $itest = 0; sub test_one_shape { my ($e, $s) = @_; $s =~ tr/ #\n//c and print "not "; ++$itest; print "ok $itest - $e valid chars\n"; $s =~ /^#/m or print "not "; ++$itest; print "ok $itest - $e left justified\n"; $s =~ / +$/m and print "not "; ++$itest; print "ok $itest - $e trailing spaces\n"; substr($s, 0, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e leading blank lines\n"; substr($s, -1, 1) eq "\n" or print "not "; ++$itest; print "ok $itest - $e trailing blank lines\n"; substr($s, -2, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e properly newline terminated\n"; } for my $e (@eye_shapes) { test_one_shape($e, get_eye_string($e)) } my $s = get_eye_string('camel'); test_one_shape('border_shape', border_shape($s, 1, 1, 1, 1, 1, 1, 1, 1)); test_one_shape('invert_shape', invert_shape($s)); test_one_shape('reflect_shape', reflect_shape($s)); test_one_shape('hjoin_shapes', hjoin_shapes(3, $s, $s)); test_one_shape('reduce_shape', reduce_shape($s, 1)); test_one_shape('expand_shape', expand_shape($s, 1)); test_one_shape('rotate_shape-90', rotate_shape($s, 90, 0, 0)); test_one_shape('rotate_shape-180', rotate_shape($s, 180, 0, 0)); test_one_shape('rotate_shape-270', rotate_shape($s, 270, 0, 0)); test_one_shape('make_triangle', make_triangle(71)); test_one_shape('make_triangle', make_triangle(2)); test_one_shape('make_siertri', make_siertri(5)); my $p = sightly( { SourceString => "knob\n", Print => 1, Regex => 1, Shape => 'camel,mongers', Gap => 3 } ); $p =~ tr/!-~/#/; test_one_shape('multiple_shapes', $p); my @oldb = get_builtin_shapes(); @oldb == 5 or print "not "; ++$itest; print "ok $itest - get_builtin_shape n\n"; "@oldb" eq 'all banner siertri srcbanner triangle' or print "not "; ++$itest; print "ok $itest - get_builtin_shape v\n"; # Old tests -- add_builtin_shape/del_builtin_shape have been removed. # add_builtin_shape('knobsiertri', sub { make_siertri($_[0]->{Width}) } ); # my @newb = get_builtin_shapes(); # @newb == 6 or print "not "; # ++$itest; print "ok $itest - get_builtin_shape n\n"; # "@newb" eq 'all banner knobsiertri siertri srcbanner triangle' or print "not "; # ++$itest; print "ok $itest - get_builtin_shape v\n"; # my $ksier = sightly( { SourceString => "knob\n", # Print => 1, # Regex => 1, # Shape => 'knobsiertri', # Gap => 3 } ); # my $osier = sightly( { SourceString => "knob\n", # Print => 1, # Regex => 1, # Shape => 'siertri', # Gap => 3 } ); # $ksier eq $osier or print "not "; # ++$itest; print "ok $itest - siertr eq knobsiertri\n"; # del_builtin_shape('knobsiertri'); # @oldb = get_builtin_shapes(); # @oldb == 5 or print "not "; # ++$itest; print "ok $itest - get_builtin_shape n\n"; # "@oldb" eq 'all banner siertri srcbanner triangle' or print "not "; # ++$itest; print "ok $itest - get_builtin_shape v\n"; # ----------------------------------------------------------------------- Acme-EyeDrops-1.61/t/12_Beer.t100644 52 52 4157 10163413376 15326 0ustar00arthurdent 0 0 #!/usr/bin/perl # 12_Beer.t (was banner test in vshape.t) # This test is not taint-safe (rest of vshape.t is, so separate this one) # Test make_banner. use strict; use Acme::EyeDrops qw(make_banner); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- # make_banner is linux only (also requires /usr/games/banner executable) my $have_banner = $^O eq 'linux' && -x '/usr/games/banner'; print "1..7\n"; my $itest = 0; sub test_one_shape { my ($e, $s) = @_; $s =~ tr/ #\n//c and print "not "; ++$itest; print "ok $itest - $e valid chars\n"; $s =~ /^#/m or print "not "; ++$itest; print "ok $itest - $e left justified\n"; $s =~ / +$/m and print "not "; ++$itest; print "ok $itest - $e trailing spaces\n"; substr($s, 0, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e leading blank lines\n"; substr($s, -1, 1) eq "\n" or print "not "; ++$itest; print "ok $itest - $e trailing blank lines\n"; substr($s, -2, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e properly newline terminated\n"; } sub skip_one_shape { my $e = shift; ++$itest; print "ok $itest # skip $e, valid chars\n"; ++$itest; print "ok $itest # skip $e, left justified\n"; ++$itest; print "ok $itest # skip $e, trailing spaces\n"; ++$itest; print "ok $itest # skip $e, leading blank lines\n"; ++$itest; print "ok $itest # skip $e, trailing blank lines\n"; ++$itest; print "ok $itest # skip $e, properly newline terminated\n"; } if ($have_banner) { test_one_shape('make_banner', make_banner(70, "a bc")); } else { skip_one_shape('Linux /usr/games/banner not available'); } # Test invalid /usr/games/banner # XXX: Improve make_banner() interface to make testable. my $b_exe = '/usr/games/banner'; if (-x $b_exe) { ++$itest; print "ok $itest # skip invalid banner exe (you have '$b_exe')\n"; } else { eval { make_banner(70, "a bc") }; $@ =~ m|\Q'$b_exe'\E not available on this platform| or print "not "; ++$itest; print "ok $itest - invalid banner exe\n"; } # ----------------------------------------------------------------------- Acme-EyeDrops-1.61/t/13_to.t100644 52 52 37056 11056722633 15121 0ustar00arthurdent 0 0 #!/usr/bin/perl # 13_to.t # Tests _make_filler(), get_eye_dir(), slurp_yerself() # get_eye_properties(), get_eye_keywords(), find_eye_shapes() use strict; use Acme::EyeDrops qw(get_eye_dir get_eye_shapes get_eye_properties get_eye_keywords find_eye_shapes); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # -------------------------------------------------- my $tmpf = 'bill.tmp'; # -------------------------------------------------- # A valid property file should: # 1) contain no "weird" chars. # 2) no line should contain trailing spaces # 3) be properly newline-terminated # 4) contain no leading newlines # 5) contain no trailing newlines # test_one_propchars() below verifies that is # the case for all .eyp shapes. # 6) contain only valid properties # Tested by get_prop_names() # 7) contain only valid keywords # Tested near the end via get_eye_keywords(). # -------------------------------------------------- my @eye_shapes = get_eye_shapes(); my $n_tests = @eye_shapes * 6; $n_tests += 101; # plus other tests print "1..$n_tests\n"; # -------------------------------------------------- my $itest = 0; # -------------------------------------------------- # Test _make_filler() { my $fillv = '#'; # This line is used in A::E pour_sightly(). # Note: 11 is the length of, for example, $:='.'^'~'; # Multiple of 6 because each filler contains 6 tokens: # $: = '.' ^ '~' ; # Also, no single quoted string should contain " or ; # Oh, and $; variable is banned. # XXX: add tests for all these later. my @filler = Acme::EyeDrops::_make_filler( ref($fillv) ? $fillv : [ '$:', '$~', '$^' ]); my $nfiller = @filler; $nfiller == 72 or print "not "; ++$itest; print "ok $itest - _make_filler 72 items (got $nfiller)\n"; $nfiller % 6 == 0 or print "not "; ++$itest; print "ok $itest - _make_filler multiple of 6 (got $nfiller)\n"; @filler = Acme::EyeDrops::_make_filler([ '$:', '$~', '$^', '$:', '$~' ]); $nfiller = @filler; $nfiller == 60 or print "not "; ++$itest; print "ok $itest - _make_filler 60 items (got $nfiller)\n"; $nfiller % 6 == 0 or print "not "; ++$itest; print "ok $itest - _make_filler multiple of 6 (got $nfiller)\n"; my $badfiller = [ '$:', '$~', '$^', '$:', '$~', '$^', '$:', '$~', '$^', '$:', '$~', '$^', '$:' ]; eval { Acme::EyeDrops::_make_filler($badfiller) }; $@ or print "not "; ++$itest; print "ok $itest - _make_filler, too many filler vars\n"; } # ----------------------------------------------------------------------- sub test_one_propchars { my ($e, $s) = @_; $s =~ tr K-_:$@*&!%.;"'`()[]{},/\\ a-zA-Z0-9\nKKc and print "not "; ++$itest; print "ok $itest - $e valid chars\n"; $s =~ / +$/m and print "not "; ++$itest; print "ok $itest - $e trailing spaces\n"; substr($s, 0, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e leading blank lines\n"; substr($s, -1, 1) eq "\n" or print "not "; ++$itest; print "ok $itest - $e trailing blank lines\n"; substr($s, -2, 1) eq "\n" and print "not "; ++$itest; print "ok $itest - $e properly newline terminated\n"; } sub test_one_get_properties { my ($e, $pstr, $hexp) = @_; build_file($tmpf, $pstr); my $h = Acme::EyeDrops::_get_properties($tmpf); ref($h) eq 'HASH' or print "not "; ++$itest; print "ok $itest - _get_properties 1 $e\n"; my @a = sort keys %$h; my @aexp = sort keys %$hexp; scalar(@a) == scalar(@aexp) or print "not "; ++$itest; print "ok $itest - _get_properties 2 $e\n"; return unless @aexp; my $min = @a; $min = @aexp if @aexp < $min; for my $i (0 .. $min-1) { $a[$i] eq $aexp[$i] or print "not "; ++$itest; print "ok $itest - _get_properties 3 $e\n"; $h->{$a[$i]} eq $hexp->{$aexp[$i]} or print "not "; ++$itest; print "ok $itest - _get_properties 4 $e\n"; } } sub test_one_find_eye_shapes { my ($e, $s, $sexp) = @_; my @shapes = find_eye_shapes(@$s); scalar(@shapes) == scalar(@$sexp) or print "not "; ++$itest; print "ok $itest - find_eye_shapes 1 $e\n"; return unless @$sexp; my $min = @shapes; $min = @$sexp if @$sexp < $min; for my $i (0 .. $min-1) { $shapes[$i] eq $sexp->[$i] or print "not "; ++$itest; print "ok $itest - find_eye_shapes 2 $e\n"; } } sub test_one__find_eye_shapes { my ($e, $s, $sexp) = @_; my @shapes = Acme::EyeDrops::_find_eye_shapes('.', @$s); scalar(@shapes) == scalar(@$sexp) or print "not "; ++$itest; print "ok $itest - _find_eye_shapes 1 $e\n"; return unless @$sexp; my $min = @shapes; $min = @$sexp if @$sexp < $min; for my $i (0 .. $min-1) { $shapes[$i] eq $sexp->[$i] or print "not "; ++$itest; print "ok $itest - _find_eye_shapes 2 $e\n"; } } sub get_prop_names { my %h; for my $s (get_eye_shapes()) { my $p = get_eye_properties($s) or next; # no properties my @k = keys(%{$p}) or next; for my $k (@k) { push(@{$h{$k}}, $s) } } return \%h; } # Hacked from _get_eye_shapes(). sub _get_eyp_shapes { my $d = shift; local *D; opendir(D, $d) or die "opendir '$d': $!"; my @e = sort map(/(.+)\.eyp$/, readdir(D)); closedir(D); @e; } # ----------------------------------------------------------------------- # slurp_yerself() tests (primitive) my $eyedrops_pm = Acme::EyeDrops::slurp_yerself(); my $elen = length($eyedrops_pm); $elen > 50000 or print "not "; ++$itest; print "ok $itest - slurp_yerself length is $elen\n"; my $nlines = $eyedrops_pm =~ tr/\n//; $nlines > 1000 or print "not "; ++$itest; print "ok $itest - slurp_yerself line count is $nlines\n"; # XXX: could add MD5 checksum test here. # XXX: beware above test is fragile when testing auto-generated EyeDrops.pm # (as is done by 19_surrounds.t) # ----------------------------------------------------------------------- # get_eye_dir() tests. my $eyedir = get_eye_dir(); $eyedir or print "not "; ++$itest; print "ok $itest - get_eye_dir sane\n"; -d $eyedir or print "not "; ++$itest; print "ok $itest - get_eye_dir dir\n"; -f "$eyedir/camel.eye" or print "not "; ++$itest; print "ok $itest - get_eye_dir camel.eye\n"; # v1.50 added eye property (.eyp) files. -f "$eyedir/camel.eyp" or print "not "; ++$itest; print "ok $itest - get_eye_dir camel.eyp\n"; # ----------------------------------------------------------------------- # Sanity check on all properties files. { # Check that .eye files and .eyp files match. my @eyp_shapes = _get_eyp_shapes($eyedir); # print STDERR "# There are: " . scalar(@eyp_shapes) . " property files\n"; scalar(@eye_shapes) == scalar(@eyp_shapes) or print "not "; ++$itest; print "ok $itest - num .eyp matches num .eye\n"; for my $i (0 .. $#eye_shapes) { $eye_shapes[$i] eq $eyp_shapes[$i] or print "not "; ++$itest; print "ok $itest - '$eye_shapes[$i]' .eye matches .eyp\n"; } } for my $e (@eye_shapes) { test_one_propchars($e, Acme::EyeDrops::_slurp_tfile($eyedir . '/' . $e . '.eyp')); } { # XXX: need to update test when update shape properties. my $h = get_prop_names(); # for my $k (sort keys %{$h}) { print "k='$k' v='@{$h->{$k}}'\n" } ref($h) eq 'HASH' or print "not "; ++$itest; print "ok $itest - valid props, hash ref\n"; my @skey = sort keys %{$h}; my $nskey = @skey; print STDERR "# properties: @skey\n"; $nskey == 6 or print "not "; ++$itest; print "ok $itest - valid props, number should be $nskey\n"; for my $k ('author', 'authorcpanid', 'description', 'keywords', 'nick', 'source') { shift(@skey) eq $k or print "not "; ++$itest; print "ok $itest - valid props, '$k'\n"; } } # ----------------------------------------------------------------------- # _get_properties() tests. test_one_get_properties( 'empty file', "", {} ); test_one_get_properties( 'simple file', "tang:autrijus\n", { 'tang' => 'autrijus' } ); test_one_get_properties( 'comment file', " # comment\n \ttang \t :\t autrijus", { 'tang' => 'autrijus' } ); test_one_get_properties( 'extendo file', "wall:larry \\\n \t not wall russ\n", { 'wall' => 'larry not wall russ' } ); test_one_get_properties( 'two keys file', " wall:larry\\\nnot wall russ\n\tConway: The Damian \t\n", { 'wall' => 'larrynot wall russ', 'Conway' => 'The Damian' } ); # ----------------------------------------------------------------------- # get_eye_properties() tests. { my $tmpeyp = 'tmpeye.eyp'; -f $tmpeyp and (unlink($tmpeyp) or die "error unlink '$tmpeyp': $!"); my $h = Acme::EyeDrops::_get_eye_properties('.', 'tmpeye'); defined($h) and print "not "; ++$itest; print "ok $itest - get_eye_properties, no props\n"; } { # XXX: need to update test when update shape properties. my $h = get_eye_properties('camel'); ref($h) eq 'HASH' or print "not "; ++$itest; print "ok $itest - get_eye_properties, camel 1\n"; keys(%$h) == 2 or print "not "; ++$itest; print "ok $itest - get_eye_properties, camel 2\n"; $h->{'keywords'} eq 'animal' or print "not "; ++$itest; print "ok $itest - get_eye_properties, camel 3\n"; } # ----------------------------------------------------------------------- # find_eye_shapes() tests. eval { find_eye_shapes() }; $@ or print "not "; ++$itest; print "ok $itest - find_eye_shapes, no params\n"; # XXX: need to update test when update shape properties. test_one_find_eye_shapes( 'one', [ 'flag' ], [ 'flag_canada' ] ); # XXX: need to update test when update shape properties. test_one_find_eye_shapes( 'dup keyword', [ 'flag', 'flag' ], [ 'flag_canada' ] ); # XXX: need to update test when update shape properties. # This is the example from the doco that cog specifically asked for. test_one_find_eye_shapes( 'cog', [ 'face', 'person', 'perlhacker' ], [ 'acme', 'adrianh', 'autrijus', 'damian', 'dan', 'eugene', 'gelly', 'larry', 'larry2', 'merlyn', 'schwern2', 'simon', 'yanick' ] ); # XXX: need to update test when update shape properties. test_one_find_eye_shapes( 'OR', [ 'flag OR sport' ], [ 'cricket', 'flag_canada', 'golfer' ] ); { my $tmpeye = 'tmpeye.eye'; my $tmpeyp = 'tmpeye.eyp'; my $tmpeye2 = 'tmpeye2.eye'; my $tmpeyp2 = 'tmpeye2.eyp'; my $tmpeye3 = 'tmpeye3.eye'; my $tmpeyp3 = 'tmpeye3.eyp'; my $tmpeye4 = 'tmpeye4.eye'; my $tmpeyp4 = 'tmpeye4.eyp'; my $tmpeye5 = 'tmpeye5.eye'; my $tmpeyp5 = 'tmpeye5.eyp'; my $tmpeye6 = 'tmpeye6.eye'; my $tmpeyp6 = 'tmpeye6.eyp'; my $tmpeye7 = 'tmpeye7.eye'; # Test .eye file with no .eyp file build_file($tmpeye, ""); build_file($tmpeye2, ""); build_file($tmpeye3, ""); build_file($tmpeye4, ""); build_file($tmpeye5, ""); build_file($tmpeye6, ""); build_file($tmpeye7, ""); build_file($tmpeyp, <<'FLAMING_OSTRICHES'); keywords : pink cat FLAMING_OSTRICHES build_file($tmpeyp2, <<'FLAMING_OSTRICHES'); keywords : dog orange FLAMING_OSTRICHES build_file($tmpeyp3, <<'FLAMING_OSTRICHES'); keywords : dog apple FLAMING_OSTRICHES build_file($tmpeyp4, <<'FLAMING_OSTRICHES'); keywords : dog big FLAMING_OSTRICHES build_file($tmpeyp5, <<'FLAMING_OSTRICHES'); # Test a comment line, blank lines and empty keywords. \t \t keywords : # final comment line FLAMING_OSTRICHES build_file($tmpeyp6, <<'FLAMING_OSTRICHES'); # Test no keywords FLAMING_OSTRICHES my @catdog = Acme::EyeDrops::_find_eye_shapes('.', 'cat', 'dog'); @catdog == 0 or print "not "; ++$itest; print "ok $itest - _find_eye_shapes, no cats or dogs\n"; test_one__find_eye_shapes( 'OR', [ 'pink OR big' ], [ 'tmpeye', 'tmpeye4' ] ); test_one__find_eye_shapes( 'AND OR', [ 'dog', 'apple OR orange' ], [ 'tmpeye2', 'tmpeye3' ] ); # Test some _get_eye_keywords... { my $h = Acme::EyeDrops::_get_eye_keywords('.'); # for my $k (sort keys %{$h}) { print "k='$k' v='@{$h->{$k}}'\n" } ref($h) eq 'HASH' or print "not "; ++$itest; print "ok $itest - get_eye_keywords, hash ref\n"; my @skey = sort keys %{$h}; @skey == 6 or print "not "; ++$itest; print "ok $itest - get_eye_keywords, number\n"; for my $k ('apple', 'big', 'cat', 'dog', 'orange', 'pink') { shift(@skey) eq $k or print "not "; ++$itest; print "ok $itest - get_eye_keywords, '$k'\n"; } } unlink($tmpeye, $tmpeyp, $tmpeye2, $tmpeyp2, $tmpeye3, $tmpeyp3, $tmpeye4, $tmpeyp4, $tmpeye5, $tmpeyp5, $tmpeye6, $tmpeyp6, $tmpeye7); } { # XXX: need to update test when update shape properties. my $h = get_eye_keywords(); # for my $k (sort keys %{$h}) { print "k='$k' v='@{$h->{$k}}'\n" } ref($h) eq 'HASH' or print "not "; ++$itest; print "ok $itest - get_eye_keywords, hash ref\n"; my @skey = sort keys %{$h}; @skey == 15 or print "not "; ++$itest; print "ok $itest - get_eye_keywords, number\n"; for my $k ('animal', 'debian', 'face', 'flag', 'hbanner', 'logo', 'map', 'object', 'opera', 'perlhacker', 'person', 'planet', 'sport', 'underwear', 'vbanner') { shift(@skey) eq $k or print "not "; ++$itest; print "ok $itest - get_eye_keywords, '$k'\n"; } } # ----------------------------------------------------------------------- # Old tests -- function set_eye_dir() has been removed. # my $mypwd = Cwd::cwd(); # my $mytesteyedir = "$mypwd/eyedir.tmp"; # my $mytesteyefile = "$mytesteyedir/tmp.eye"; # -d $mytesteyedir or (mkdir($mytesteyedir, 0777) or die "error: mkdir '$mytesteyedir': $!"); # build_file($mytesteyefile, $mytestshapestr); # set_eye_dir($mytesteyedir); # get_eye_dir() eq $mytesteyedir or print "not "; # ++$itest; print "ok $itest - set_eye_dir sane\n"; # my @eyes = get_eye_shapes(); # @eyes==1 or print "not "; # ++$itest; print "ok $itest - set_eye_dir number\n"; # $eyes[0] eq 'tmp' or print "not "; # ++$itest; print "ok $itest - set_eye_dir filename\n"; # test_one_shape('tmp', get_eye_string('tmp')); # This is just a simple example of testing die inside EyeDrops.pm. # eval { set_eye_dir($mytesteyefile) }; # $@ or print "not "; # ++$itest; print "ok $itest - set_eye_dir eval die\n"; # $@ eq "error set_eye_dir '" . $mytesteyefile . "': no such directory\n" # or print "not "; # ++$itest; print "ok $itest - set_eye_dir eval die string\n"; # ----------------------------------------------------------------------- # unlink($mytesteyefile) or die "error: unlink '$mytesteyefile': $!"; # rmdir($mytesteyedir) or die "error: rmdir '$mytesteyedir': $!"; # -------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; # ---------------------------------------------------------------- # Test for file that does not exist. eval { Acme::EyeDrops::_get_properties($tmpf) }; $@ =~ /'\Q$tmpf\E':/ or print "not "; ++$itest; print "ok $itest - _get_properties, file not found\n"; eval { Acme::EyeDrops::_get_eye_shapes($tmpf) }; $@ =~ /'\Q$tmpf\E':/ or print "not "; ++$itest; print "ok $itest - _get_eye_shapes, dir not found\n"; # ---------------------------------------------------------------- Acme-EyeDrops-1.61/t/14_gulp.t100644 52 52 17144 12146374540 15444 0ustar00arthurdent 0 0 #!/usr/bin/perl # 14_gulp.t # Test new SourceHandle attribute and invalid attributes (new with A::E v1.44). use strict; use Acme::EyeDrops qw(sightly get_eye_string); $|=1; # ---------------------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } # ---------------------------------------------------------------- print "1..38\n"; my $helloteststr = <<'HELLOTEST'; # Just a test. use strict; for my $i (0..3) { print "hello test $i\n"; } HELLOTEST my $hellotestfile = 'hellotest.pl'; my $zerotestfile = '0'; my $yanick4str = get_eye_string('yanick4'); my $tmpf = 'bill.tmp'; build_file($hellotestfile, $helloteststr); build_file($zerotestfile, $helloteststr); # ---------------------------------------------------------------- my $itest = 0; my $prog; sub test_one { my ($e, $ostr, $sh) = @_; build_file($tmpf, $prog); my $outstr = `$^X -Tw -Mstrict $tmpf`; my $rc = $? >> 8; $rc == 0 or print "not "; ++$itest; print "ok $itest - $e rc\n"; $outstr eq $ostr or print "not "; ++$itest; print "ok $itest - $e output\n"; $prog =~ tr/!-~/#/; $prog =~ s/^.+\n// if $] >= 5.017; # remove leading use re 'eval' line $prog eq $sh or print "not "; ++$itest; print "ok $itest - $e shape\n"; } sub skip_one { my $e = shift; ++$itest; print "ok $itest # skip $e, rc\n"; ++$itest; print "ok $itest # skip $e, output\n"; ++$itest; print "ok $itest # skip $e, shape\n"; } $prog = sightly({ Shape => 'yanick4', SourceString => $helloteststr, InformHandler => sub {}, Regex => 1 } ); test_one('hellotest SourceString', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); $prog = sightly({ Shape => 'yanick4', SourceFile => $hellotestfile, InformHandler => sub {}, Regex => 1 } ); test_one('hellotest SourceFile string', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); # For different ways to pass a handle, see Perl Cookbook, 2nd edition, # Recipe 7.5: # 1) *FH typeglob # 2) \*FH ref to typeglob # 3) *FH{IO} I/O object open(FH, $hellotestfile) or die "error: open '$hellotestfile': $!"; $prog = sightly({ Shape => 'yanick4', SourceHandle => *FH, InformHandler => sub {}, Regex => 1 } ); close(FH) or die "error: close '$hellotestfile': $!"; test_one('hellotest SourceHandle typeglob', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); open(FH, $hellotestfile) or die "error: open '$hellotestfile': $!"; $prog = sightly({ Shape => 'yanick4', SourceHandle => \*FH, InformHandler => sub {}, Regex => 1 } ); close(FH) or die "error: close '$hellotestfile': $!"; test_one('hellotest SourceHandle typeglob ref', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); open(FH, $hellotestfile) or die "error: open '$hellotestfile': $!"; $prog = sightly({ Shape => 'yanick4', SourceHandle => *FH{IO}, InformHandler => sub {}, Regex => 1 } ); close(FH) or die "error: close '$hellotestfile': $!"; test_one('hellotest SourceHandle I/O object', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); require IO::File; my $fh = IO::File->new(); $fh->open($hellotestfile) or die "error: open '$hellotestfile': $!"; $prog = sightly({ Shape => 'yanick4', SourceHandle => $fh, InformHandler => sub {}, Regex => 1 } ); $fh->close() or die "error: close '$hellotestfile': $!"; test_one('hellotest SourceHandle IO::File', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); if ($] < 5.006) { skip_one("hellotest SourceHandle autovivify, perl version less than 5.006"); } else { open(my $fh, $hellotestfile) or die "error: open '$hellotestfile': $!"; $prog = sightly({ Shape => 'yanick4', SourceHandle => $fh, InformHandler => sub {}, Regex => 1 } ); close($fh) or die "error: close '$hellotestfile': $!"; test_one('hellotest SourceHandle autovivify', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); } $prog = sightly({ Shape => 'yanick4', SourceFile => $zerotestfile, InformHandler => sub {}, Regex => 1 } ); test_one('hellotest zero SourceFile string', "hello test 0\nhello test 1\nhello test 2\nhello test 3\n", $yanick4str x 3); # ---------------------------------------------------------------- $prog = sightly({ Shape => 'yanick4', SourceString => '0', InformHandler => sub {}, Print => 1, Regex => 1 } ); test_one('0 SourceString', '0', $yanick4str); $prog = sightly({ Shape => 'yanick4', SourceString => '1', InformHandler => sub {}, Print => 1, Regex => 1 } ); test_one('1 SourceString', '1', $yanick4str); # ---------------------------------------------------------------- eval { sightly( { Shape => 'InvalidShape' } ) }; $@ =~ /InvalidShape/ or print "not "; ++$itest; print "ok $itest - InvalidShape\n"; eval { sightly( { InvalidAttr => 1 } ) }; $@ =~ /invalid parameter 'InvalidAttr'/ or print "not "; ++$itest; print "ok $itest - InvalidAttr\n"; eval { sightly({ Shape => 'yanick4', SourceFile => $hellotestfile, SourceHandle => 1 } ); }; $@ =~ /SourceHandle/ or print "not "; ++$itest; print "ok $itest - InvalidAttrs SourceFile/SourceHandle\n"; eval { sightly({ Shape => 'yanick4', SourceFile => $hellotestfile, SourceString => $helloteststr } ); }; $@ =~ /SourceFile/ or print "not "; ++$itest; print "ok $itest - InvalidAttrs SourceFile/SourceString\n"; eval { sightly({ Shape => 'yanick4', SourceHandle => 1, SourceString => $helloteststr } ); }; $@ =~ /SourceString/ or print "not "; ++$itest; print "ok $itest - InvalidAttrs SourceString/SourceHandle\n"; eval { sightly({ Shape => 'yanick4', ShapeString => '#####' x 42, SourceString => $helloteststr } ); }; $@ =~ /ShapeString/ or print "not "; ++$itest; print "ok $itest - InvalidAttrs Shape/ShapeString\n"; eval { sightly({ Width => 3, SourceString => $helloteststr } ); }; $@ =~ /invalid width/ or print "not "; ++$itest; print "ok $itest - Invalid Width\n"; # ---------------------------------------------------------------- unlink($tmpf) or die "error: unlink '$tmpf': $!"; unlink($hellotestfile) or die "error: unlink '$hellotestfile': $!"; unlink($zerotestfile) or die "error: unlink '$zerotestfile': $!"; # ---------------------------------------------------------------- # Test for file that does not exist. eval { sightly({ Shape => 'yanick4', SourceFile => $hellotestfile, InformHandler => sub {}, Regex => 1 } ); }; $@ =~ /'\Q$hellotestfile\E':/ or print "not "; ++$itest; print "ok $itest - Invalid SourceFile, file not found\n"; # ---------------------------------------------------------------- Acme-EyeDrops-1.61/t/15_Buffy.t100644 52 52 2655 10163413376 15530 0ustar00arthurdent 0 0 #!/usr/bin/perl # 15_Buffy.t use strict; use Acme::EyeDrops qw(ascii_to_sightly sightly_to_ascii get_eye_string make_siertri make_triangle pour_sightly); $|=1; print "1..6\n"; my $last_bit = <<'LAST_CAMEL'; ############ ###### ############### ########## ################## ########## ###### ################### LAST_CAMEL my $camelstr = get_eye_string('camel'); my $t1 = join("", map(chr, 0..255)); my $f1 = ascii_to_sightly($t1); my $shape = pour_sightly($camelstr, $f1, 0, "", 0, sub {}); my $t1a = sightly_to_ascii($shape); $t1 eq $t1a or print "not "; print "ok 1\n"; $shape =~ tr/!-~/#/; $shape eq $camelstr x 4 . $last_bit or print "not "; print "ok 2\n"; my $siertristr = make_siertri(5); $t1 = 'ABCDEFGHIJKLMNOPQ'; $f1 = ascii_to_sightly($t1); $shape = pour_sightly($siertristr, $f1, 0, '#', 0, sub {}); $t1a = sightly_to_ascii($shape); $t1 eq $t1a or print "not "; print "ok 3\n"; $shape =~ tr/!-~/#/; $shape eq $siertristr or print "not "; print "ok 4\n"; my $trianglestr = make_triangle(42); $t1 = 'abcdefghijklmnopqrstuvwxyz0123456789'; $f1 = ascii_to_sightly($t1); $shape = pour_sightly($trianglestr, $f1, 0, '#', 0, sub {}); $t1a = sightly_to_ascii($shape); $t1 eq $t1a or print "not "; print "ok 5\n"; $shape =~ tr/!-~/#/; $shape eq $trianglestr or print "not "; print "ok 6\n"; Acme-EyeDrops-1.61/t/16_astride.t100644 52 52 3621 11753374003 16102 0ustar00arthurdent 0 0 #!/usr/bin/perl # 16_astride.t - simple threads test. # XXX: This test seems to generate occasional failures via CPAN testers # with "Tests out of sequence". # For now comment out all Test::More tests in do_one_thread() # below to see if this makes any difference. use strict; use warnings; use Config; use Acme::EyeDrops qw(ascii_to_sightly sightly_to_ascii); sub skip_test { print "1..0 # Skipped: $_[0]\n"; exit } BEGIN { $] >= 5.008 && $Config{'useithreads'} or skip_test('no threads'); eval { require threads }; skip_test('threads module required for testing threads') if $@; 'threads'->import(); eval { require Test::More }; skip_test('Test::More required for testing threads') if $@; Test::More->import(); } # -------------------------------------------------- $|=1; my $Num_Threads = 3; my $N_Iter = 10; # plan tests => $Num_Threads * ($N_Iter * 2) + $Num_Threads; plan tests => $Num_Threads; sub do_one_thread { my $kid = shift; my $rc = 0; print "# kid $kid start\n"; for my $j (1 .. $N_Iter) { my $t1 = join("", map(chr, 0..255)); my $f1 = ascii_to_sightly($t1); # unlike( $f1, qr/[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/, 'ascii_to_sightly' ); if ($f1 =~ /[^!"#\$%&'()*+,\-.\/:;<=>?\@\[\\\]^_`\{|\}~]/) { print STDERR "# $kid, $j: oops 1: $f1 contains unsightly chars\n"; ++$rc; } my $t1a = sightly_to_ascii($f1); # is( $t1, $t1a, 'sightly_to_ascii' ); if ($t1 ne $t1a) { print STDERR "# $kid, $j: oops 2: $t1 ne $t1a\n"; ++$rc; } } print "# kid $kid exit\n"; return $rc; } my @kids = (); for my $i (1 .. $Num_Threads) { my $t = threads->new(\&do_one_thread, $i); print "# parent $$: continue\n"; push @kids, $t; } for my $t (@kids) { print "# parent $$: waiting for join\n"; my $rc = $t->join(); cmp_ok( $rc, '==', 0, "threads exit status is $rc" ); } Acme-EyeDrops-1.61/t/17_Orange.t100644 52 52 655 10240300010 15620 0ustar00arthurdent 0 0 #!/usr/bin/perl use strict; sub skip_test { print "1..0 # Skipped: $_[0]\n"; exit } BEGIN { eval { require Test::More }; skip_test('Test::More required for testing Test::Pod::Coverage') if $@; Test::More->import(); } # -------------------------------------------------- eval "use Test::Pod::Coverage 0.08"; plan skip_all => "Test::Pod::Coverage 0.08 required for testing POD coverage" if $@; all_pod_coverage_ok(); Acme-EyeDrops-1.61/t/18_sky.t100644 52 52 573 10240300731 15225 0ustar00arthurdent 0 0 #!/usr/bin/perl use strict; sub skip_test { print "1..0 # Skipped: $_[0]\n"; exit } BEGIN { eval { require Test::More }; skip_test('Test::More required for Test::Pod') if $@; Test::More->import(); } # -------------------------------------------------- eval "use Test::Pod 1.12"; plan skip_all => "Test::Pod 1.12 required for testing POD" if $@; all_pod_files_ok(); Acme-EyeDrops-1.61/t/19_surrounds.t100644 52 52 15767 10274760034 16554 0ustar00arthurdent 0 0 #!/usr/bin/perl # 19_surrounds.t # Generate a new EyeDrops.pm as described in the doco: # "EyeDropping EyeDrops.pm" section. # Run various tests on the EyeDrop'ed EyeDrops.pm. # Also generate sightly versions of 0..18 tests with a 'z' prefix. # Since this test is very slow only run if the # PERL_SMOKE environment variable is set. # # zsightly.t test works but the following might be written to stderr: # Scalar found where operator expected at (eval 2) line 41, near "regex_eval_sightly($hellostr" # This seems to happen only on Perl versions before 5.6.1. Is this a Perl bug? use strict; use File::Basename (); use File::Copy (); use File::Path (); use Acme::EyeDrops qw(sightly); use Test::Harness (); $|=1; # -------------------------------------------------- sub skip_test { print "1..0 # Skipped: $_[0]\n"; exit } sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } sub get_first_line { my $f = shift; local *T; open(T, $f) or die "open '$f': $!"; my $s = ; close(T); $s; } sub rm_f_dir { my $d = shift; -d $d or return; File::Path::rmtree($d, 0, 0); -d $d and die "error: could not delete everything in '$d': $!"; } # -------------------------------------------------- skip_test('Skipping long running generator tests unless $ENV{PERL_SMOKE} is true') unless $ENV{PERL_SMOKE}; print STDERR "Long running generated tests running...\n"; print STDERR "(these are only run if PERL_SMOKE environment variable is true).\n"; print "1..4\n"; # -------------------------------------------------- sub eye_drop_eyedrops_pm { # Slurp EyeDrops.pm into $orig string. my $orig = Acme::EyeDrops::slurp_yerself(); # Split $orig into the source ($src) and the pod ($doc). my ($src, $doc) = split(/\n1;\n/, $orig, 2); # Remove the line containing $eye_dir = __FILE__ ... # because this line confuses eval. $src =~ s/^(my \$eye_dir\b.*)$//m; # Return the new sightly version of EyeDrops.pm. $1 . sightly( { Regex => 0, Compact => 1, TrapEvalDie => 1, FillerVar => ';#', InformHandler => sub {}, Shape => 'camel', Gap => 1, SourceString => $src } ) . ";\n1;\n" . $doc; } # Copy lib/Acme to temporary new $genbase. sub create_eyedrops_tree { my ($fromdir, $todir) = @_; my $fromdrops = "$fromdir/lib/Acme/EyeDrops"; my $todrops = "$todir/lib/Acme/EyeDrops"; File::Path::mkpath($todrops, 0, 0777) or die "error: mkpath '$todrops': $!"; local *D; opendir(D, $fromdrops) or die "error: opendir '$fromdrops': $!"; my @eye = grep(/\.ey[ep]$/, readdir(D)); closedir(D); for my $f (@eye) { File::Copy::copy("$fromdrops/$f", "$todrops/$f") or die "error: File::Copy::copy '$f': $!"; } build_file("$todir/lib/Acme/EyeDrops.pm", eye_drop_eyedrops_pm()); } # -------------------------------------------------- my $genbase = 'knob'; my $base = File::Basename::dirname($0); # In the normal case, $base will be set to 't'. # If you are naughtily running the tests from the t directory, # base will probably be set to '.'. my $frombase = $base eq 't' ? '.' : '..'; rm_f_dir($genbase); create_eyedrops_tree($frombase, $genbase); # -------------------------------------------------- # This saving and re-directing of STDOUT/STDERR in temporary files # (implemented in test_one() below) is simple but not very clean. # An alternative may be to use tie in some way, for example: # my $knob; # package MyStdout; # sub TIEHANDLE { # my $class = shift; # bless [], $class; # } # sub PRINT { my $self = shift; $knob .= join('', @_) } # sub PRINTF { # my $self = shift; my $fmt = shift; # $knob .= sprintf($fmt, @_); # } # package main; # tie *STDOUT, 'MyStdout'; # See, for example, TieOut.pm in the t/lib directory of ExtUtils-MakeMaker. # (TieOut.pm is a little invention of chromatic's). my $outf = 'out.tmp'; my $errf = 'err.tmp'; -f $outf and (unlink($outf) or die "error: unlink '$outf': $!"); -f $errf and (unlink($errf) or die "error: unlink '$errf': $!"); my $itest = 0; sub test_one { my ($e, $rtests) = @_; local *SAVERR; open(SAVERR, ">&STDERR"); # save original STDERR local *SAVOUT; open(SAVOUT, ">&STDOUT"); # save original STDOUT open(STDOUT, '>'.$outf) or die "Could not create '$outf': $!"; open(STDERR, '>'.$errf) or die "Could not create '$errf': $!"; my $status = Test::Harness::runtests(@{$rtests}); # XXX: Test harness does not like the next two closes. # close(STDOUT) or die "error: close STDOUT: $!"; # close(STDERR) or die "error: close STDERR: $!"; open(STDERR, ">&SAVERR") or die "error: restore STDERR: $!"; open(STDOUT, ">&SAVOUT") or die "error: restore STDOUT: $!"; # XXX: is this necessary to prevent leaks? close(SAVOUT) or die "error: close SAVOUT: $!"; close(SAVERR) or die "error: close SAVERR: $!"; my $outstr = Acme::EyeDrops::_slurp_tfile($outf); my $errstr = Acme::EyeDrops::_slurp_tfile($errf); print STDERR "\nstdout of TestHarness::runtests:\n$outstr\n"; print STDERR "stderr of TestHarness::runtests:\n$errstr\n"; $status or print "not "; ++$itest; print "ok $itest - TestHarness::runtests of $e\n"; } # -------------------------------------------------- my %attrs = ( Shape => 'camel', Regex => 0, Compact => 1, TrapEvalDie => 1, InformHandler => sub {}, Shape => 'camel', Gap => 1 ); my @unames = ( '00_Coffee.t', '01_mug.t', '02_shatters.t', '03_Larry.t', '04_Apocalyptic.t', '05_Parrot.t', '06_not.t', '07_a.t', '08_hoax.t', '09_Gallop.t', '10_Ponie.t', '11_bold.t', '12_Beer.t', '13_to.t', '14_gulp.t', '15_Buffy.t', '16_astride.t', '17_Orange.t', '18_sky.t', ); my @tests = map("$base/$_", @unames); my @ztests = map("$base/z$_", @unames); # Generate sightly-encoded versions of test programs (see also gen.t). for my $i (0..$#unames) { $attrs{SourceFile} = $tests[$i]; # Assume first line is #!/usr/bin/perl (needed for taint mode tests). my $s_new = get_first_line($attrs{SourceFile}) . "# This program was generated by $0\n"; $s_new .= sightly(\%attrs); build_file($ztests[$i], $s_new); } # -------------------------------------------------- # Run with normal EyeDrops.pm as a speed comparison. test_one('unsightly EyeDrops.pm, plain tests', \@tests); test_one('unsightly EyeDrops.pm, generated tests', \@ztests); # Now run with generated EyeDrops.pm. { local @INC = @INC; unshift(@INC, "$genbase/lib"); test_one('sightly EyeDrops.pm, plain tests', \@tests); test_one('sightly EyeDrops.pm, generated tests', \@ztests); } # ---------------------------------------------------- for my $t (@ztests) { unlink($t) or die "error: unlink '$t': $!" } rm_f_dir($genbase); unlink($outf) or die "error: unlink '$outf': $!"; unlink($errf) or die "error: unlink '$errf': $!"; Acme-EyeDrops-1.61/t/gen.t100644 52 52 2776 10163413376 14725 0ustar00arthurdent 0 0 #!/usr/bin/perl # gen.t # If you run this program with a first argument of 'generate' # it will generate the z... programs for each in @pnames. # These are then put into the distribution. use strict; use File::Basename (); use Acme::EyeDrops qw(sightly); select(STDERR);$|=1;select(STDOUT);$|=1; # autoflush # -------------------------------------------------- sub build_file { my ($f, $d) = @_; local *F; open(F, '>'.$f) or die "open '$f': $!"; print F $d or die "write '$f': $!"; close(F); } sub get_first_line { my $f = shift; local *T; open(T, $f) or die "open '$f': $!"; my $s = ; close(T); $s; } # -------------------------------------------------- my $generate = @ARGV && $ARGV[0] eq 'generate'; my %attrs = ( Shape => 'camel', Regex => 0, Compact => 1, TrapEvalDie => 1, InformHandler => sub {}, Shape => 'camel', Gap => 1 ); my @pnames = ( 'gen.t' ); print "1..", scalar(@pnames), "\n"; my $itest = 0; my $base = File::Basename::dirname($0); for my $p (@pnames) { $attrs{SourceFile} = "$base/$p"; # Assume first line is #!/usr/bin/perl (needed for taint mode tests). my $s_new = get_first_line($attrs{SourceFile}) . "# This program was generated by gen.t\n"; $s_new .= sightly(\%attrs); if ($generate) { build_file("$base/z$p", $s_new); next; } my $s_old = Acme::EyeDrops::_slurp_tfile("$base/z$p"); $s_old eq $s_new or print "not "; ++$itest; print "ok $itest - $p\n"; } Acme-EyeDrops-1.61/t/zgen.t100644 52 52 62134 10163413376 15131 0ustar00arthurdent 0 0 #!/usr/bin/perl # This program was generated by gen.t eval eval '"'. '#!/'.("\["^ '.').( '['^'(').("\["^ ')').'/'.( '`'|'"').('`'|')') .('`'|'.') .'/'.( '['^'+').('`'|'%').( '['^')').('`'|',').( '!'^'+').'#'.('{'^'[') .('`'|"'").('`'|'%'). ('`'|'.').'.'.('['^'/') .('!'^'+').'#'.('{' ^'[').('`'^')').('`'|'&'). ('{'^'[').('[' ^'"').('`'|'/').('['^('.')).( '{'^'[').('['^ ')').('['^'.').('`'|'.').(('{')^ '[').('['^'/'). ('`'|'(').('`'|')').('['^'(').('{'^ '[').('['^'+'). ('['^')').('`'|'/').('`'|"'").('['^')' ).('`'|('!')).( '`'|'-').('{'^'[').('['^',').('`'|')').( '['^'/').('`'| '(').('{'^'[').('`'|'!').('{'^'[').("\`"| '&').('`'|')') .('['^')').('['^'(').('['^'/').('{'^'[').( '`'|'!').('['^')').('`'|"'").('['^'.').('`'|'-').('`'|'%') .('`'|'.').('['^'/').('{'^'[').('`'|'/').('`'|'&').('{'^'[' )."'".('`'|"'").('`'|'%').('`'|'.').('`'|'%').('['^"\)").( '`'|'!').('['^'/').('`'|'%')."'".('!'^'+').'#'.('{'^"\[").( '`'|')').('['^'/').('{'^'[').('['^',').('`'|')').('`'|','). ('`'|',').('{'^'[').('`'|"'").('`'|'%').('`'|'.').('`'|'%' ).('['^')').('`'|'!').('['^'/').('`'|'%').('{'^'[').( '[' ^'/').('`'|'(').('`'|'%').('{'^'[').('['^'!').'...' .+( '{'^'[').('['^'+').('['^')').('`'|"\/").( '`'|"'") .+( '['^')').('`'|'!').('`'|'-').('['^'(') .("\{"^ '[' ).''. ('`'|'&').('`'|'/').('['^')'). (('{')^ '[' ).('`'|'%').('`'|'!').(('`')| "\#").( '`' |"\(").( '{'^'[').( ('`')| ')').( (( "\`"))| ('.')).( ('{')^ "\["). (( '\\')). '@'.('[' ^'+') .('`' | '.').( '`'|'!') .''. ('`' |'-'). ('`'|'%') .''. ('[' ^'(') .('.').( '!'^ '+') .'#'. (('{')^ '[') .''. ('{' ^'/'). ('`' |'(' ).+( '`' |'%' ).+( '['^ '(' ).( '`' |(( '%' ))) .+( '{' ^(( '[' ))) .+( '`' |(( (( (( '!'))) )) )) .('[' ^+ (( ')'))).( (( '`' ))|+ '%'). +( '{' ^'['). ('[' ^(( '/') )).('`'| '(' ).+( ('`')| '%').( '`'|'.') .("\{"^ '[').(('[')^ '+').( '['^'.').("\["^ '/').('{'^ '[').('`'|(')')).( '`'|'.').( ('[')^ '/').('`'|'/').('{'^ '[').('['^'/').('`'| '(').('`'|'%').(('{')^ '[').('`'|'$').("\`"| ')').('['^'(').('['^'/' ).('['^')').(('`')| ')').('`'|'"').('['^'.').( '['^'/').('`'| ')').('`'|'/').('`'|'.').'.'. ('!'^'+').('!' ^'+').('['^'.').('['^'(').("\`"| '%').('{'^'['). ('['^'(').('['^'/').('['^')').('`'| ')').('`'|'#'). ('['^'/').';'.('!'^'+').('['^'.').('[' ^'(').('`'|'%') .('{'^'[').('`'^'&').('`'|')').('`'|',') .('`'|'%').':' .':'.('`'^'"').('`'|'!').('['^'(').("\`"| '%').('`'|'.') .('`'|'!').('`'|'-').('`'|'%').('{'^"\["). '();'.('!'^'+').('['^'.').('['^'(').('`'|'%').('{'^"\[").( '`'^'!').('`'|'#').('`'|'-').('`'|'%').'::'.('`'^'%').('['^ '"').('`'|'%').('`'^'$').('['^')').('`'|'/').('['^('+')).( '['^'(').('{'^'[').('['^'*').('['^',').'('.('['^'(').("\`"| ')').('`'|"'").('`'|'(').('['^'/').('`'|',').('['^'"').');' .('!'^'+').('!'^'+').('['^'(').('`'|'%').('`'|',').(('`')| '%').('`'|'#').('['^'/').'('.('{'^'(').('{'^'/').('`' ^(( '$'))).('`'^'%').('{'^')').('{'^')').');\\$|='.('^' ^+( '`'|'/')).';'.('['^'(').('`'|'%').(('`')| (',')).( '`' |'%').('`'|'#').('['^'/').'('.('{'^'(' ).('{'^ '/' ).''. ('`'^'$').('`'^'/').('{'^'.'). (('{')^ '/' ).');\\$|='.('^'^('`'|"\/")). (';').( '{' ^"\[").( '{'^"\["). "\#".( ('{')^ (( '['))). ('`'|'!' ).('[' ^'.'). +( '['^'/' ).("\`"| '/'). ('`'| ( '&')). ('`'|',' ).+( '['^ '.').( '['^'('). ('`' |'(' ).''. ('!'^'+' ).+( '!'^ '+'). ('#').( '{'^ '[') .'-' .'---' .'-' .'-' .'-' .(( '-') ).(( '-') ).+ '-' .(( '-' )). '-' .(( '-' )). '-' .(( '-' )). '-' .+ (( '-')). (( (( '-')) )) .+ '------' .+ '-' .'-' .'--' .+ '-' .'---' .'-' .(( '-') ).'----' .(( '-') ).'--' .'---' .'-----' ."\-".( '!'^('+')).( ('!')^ '+').('['^'('). ('['^'.'). ('`'|'"').('{'^'[' ).('`'|'"' ).('[' ^'.').('`'|')').('`' |',').('`'|'$').'_'. ('`'|'&').('`'|"\)").( '`'|',').('`'|"\%").( '{'^'[').'\\{'.('!'^'+' ).('{'^'[').(('{')^ '[').('{'^'[').('`'|'-').( '['^'"').('{'^ '[').'(\\$'.('`'|'&').(',').( '{'^'[').'\\$' .('`'|'$').')'.('{'^'[').('=').( '{'^'[').'\\@_' .';'.('!'^'+').('{'^'[').('{'^'['). ('{'^'[').('`'| ',').('`'|'/').('`'|'#').('`'|('!')).( '`'|',').("\{"^ '[').'*'.('`'^'&').';'.('{'^'[').(('`')| '/').('['^'+') .('`'|'%').('`'|'.').'('.('`'^'&')."\,".( '{'^'[')."\'". '>'."'".'.\\$'.('`'|'&').')'.('{'^('[')).( '`'|'/').('['^')').('{'^'[').('`'|'$').('`'|')').('`'|'%') .('{'^'[').'\\"'.('`'|'/').('['^'+').('`'|'%').('`'|"\.").( '{'^'[')."'".'\\$'.('`'|'&')."'".':'.('{'^'[').'\\$!\\";'. ('!'^'+').('{'^'[').('{'^'[').('{'^'[').('['^'+').('['^')') .('`'|')').('`'|'.').('['^'/').('{'^'[').('`'^'&').('{'^'[' ).'\\$'.('`'|'$').('{'^'[').('`'|'/').('['^')').('{'^'['). ('`'|'$').('`'|')').('`'|'%').('{'^'[').'\\"'.(('[')^ ',' ).('['^')').('`'|')').('['^'/').('`'|'%').('{'^'[') .(( "'")).'\\$'.('`'|'&')."'".':'.('{'^"\["). '\\$!\\' .(( '"')).';'.('{'^'[').('`'|'#').('`'|',' ).('`'| '/' ).''. ('['^'(').('`'|'%').'('.("\`"^ ('&')). ')' .';'.('!'^'+').'\\}'.('!'^'+' ).('!'^ '+' ).("\["^ '(').('['^ '.').( ('`')| (( '"'))). ('{'^'[' ).('`' |"'"). +( '`'|'%' ).("\["^ '/'). '_'.( ( "\`")| ('&')).( '`'| ')') .('['^ ')').('[' ^'(' ).+( "\["^ '/').'_' .''. ('`' |',') .("\`"| ')') .''. ('`' |'.'). ('`' |'%' ).+( '{' ^'[' ).(( '\\' )). '{' .+( '!' ^(( '+' ))) .+( '{' ^(( '[' ))) .+( '{' ^+ (( '['))) .( (( '{')) ^+ (( '['))).( (( '`' ))|+ '-'). +( '[' ^'"'). ('{' ^(( '[') )).'\\$' .+( '`'| '&').( ('{')^ '[').'=' .("\{"^ '[').(('[')^ '(').( '`'|'(').("\`"| ')').('`'| '&').('['^'/').';' .('{'^'[') .('`'| ',').('`'|'/').('`'| '#').('`'|'!').('`'| ',').('{'^'[').('*').( '{'^'/').';'.('{'^'[' ).('`'|'/').('['^'+').( '`'|'%').('`'|'.'). '('.('{'^'/').','.('{'^'[' ).'\\$'.("\`"| '&').')'.('{'^'[').('`'|'/'). ('['^')').('{' ^'[').('`'|'$').('`'|')').("\`"| '%').('{'^'['). '\\"'.('`'|'/').('['^'+').('`'|'%') .('`'|'.').('{' ^'[')."'".'\\$'.('`'|'&')."'".':'.('{' ^'[').'\\$!\\"' .';'.('!'^'+').('{'^'[').('{'^'[').('{'^ '[').('`'|'-') .('['^'"').('{'^'[').'\\$'.('['^'(').('{' ^'[').'='.('{' ^'[').'<'.('{'^'/').'>;'.('{'^'[').(('`')| '#').('`'|',').('`'|'/').('['^'(').('`'|'%').'('.('{'^'/') .');'.('{'^'[').'\\$'.('['^'(').';'.('!'^'+').'\\}'.(('!')^ '+').('!'^'+').'#'.('{'^'[').'---------------------------' .'-----------------------'.('!'^'+').('!'^'+').('`'|"\-").( '['^'"').('{'^'[').'\\$'.('`'|"'").('`'|'%').('`'|'.').('`' |'%').('['^')').('`'|'!').('['^'/').('`'|'%').('{'^('[')). '='.('{'^'[').'\\@'.('`'^'!').('{'^')').('`'^("'")).( '{' ^'-').('{'^'[').'&&'.('{'^'[').'\\$'.('`'^'!').('{' ^(( ')'))).('`'^"'").('{'^'-').'['.('^'^('`'| ('.'))). ']' .('{'^'[').('`'|'%').('['^'*').(('{')^ ('[')). "'" .('`' |"'").('`'|'%').('`'|'.').('`' |'%').( '[' ^')').('`'|'!').('['^('/')).( '`'|'%' ).+ "'".';'. ('!'^'+'). ("\!"^ '+').( (( "\`"))| ('-')).( ('[')^ '"').( (( "\{"))^ '[').'%' .('`' |'!') . ("\["^ ('/')).( '['^ '/') .('['^ ')').('[' ^'(' ).+( "\{"^ '[').'=' .''. ('{' ^'[') ."\(".( '!'^ '+') .''. ("\{"^ '[') .''. ('{' ^(( '[') )).( '{'^ '[' ).( '{' ^(( '(' ))) .+( '`' |(( '(' ))) .+( '`' |(( (( (( '!'))) )) )) .('[' ^+ (( '+'))).( (( '`' ))|+ '%'). +( '{' ^'['). ('{' ^(( '[') )).('{'^ '[' ).+( ('{')^ '[').( '{'^'[') .("\{"^ '[').(('{')^ '[').( '{'^'[').("\{"^ '[').('{'^ '[').'=>'.('{'^'[' )."'".('`' |'#'). ('`'|'!').('`'|'-'). ('`'|'%').('`'|','). "'".','.('!'^'+').('{' ^'[').('{'^'[').('{'^ '[').('{'^')').('`'|'%' ).('`'|"'").(('`')| '%').('['^'#').('{'^'[').( '{'^'[').('{'^ '[').('{'^'[').('{'^'[').('{' ^'[').('{'^'[' ).('{'^'[').('{'^'[').('{'^'['). '=>'.('{'^'['). ('^'^('`'|'.')).','.('!'^'+').('{'^ '[').('{'^'['). ('{'^'[').('`'^'#').('`'|'/').('`'|'-' ).('['^('+')).( '`'|'!').('`'|'#').('['^'/').('{'^'[').( '{'^'[').('{'^ '[').('{'^'[').('{'^'[').('{'^'[').("\{"^ '[').('{'^'[') .'=>'.('{'^'[').('^'^('`'|'/')).','.("\!"^ '+').('{'^'[').('{'^'[').('{'^'[').('{'^'/').('['^(')')).( '`'|'!').('['^'+').('`'^'%').('['^'-').('`'|'!').('`'|','). ('`'^'$').('`'|')').('`'|'%').('{'^'[').('{'^'[').('{'^'[' ).('{'^'[').'=>'.('{'^'[').('^'^('`'|'/')).','.('!'^"\+").( '{'^'[').('{'^'[').('{'^'[').('`'^')').('`'|'.').('`'|'&'). ('`'|'/').('['^')').('`'|'-').('`'^'(').('`'|'!').('`'|'.' ).('`'|'$').('`'|',').('`'|'%').('['^')').('{'^'[').( '{' ^'[').'=>'.('{'^'[').('['^'(').('['^'.').('`'|'"'). ((( '{'))^'[').'\\{\\},'.('!'^'+').('{'^'['). ('{'^'[' ).( '{'^'[').('{'^'(').('`'|'(').('`'|'!') .("\["^ '+' ).''. ('`'|'%').('{'^'[').('{'^'['). (('{')^ '[' ).('{'^'[').('{'^'[').(('{')^ "\[").( '{' ^"\[").( '{'^'[').( ('{')^ '[').( (( "\{"))^ '[').'=' .'>'.( ('{')^ (( '['))). "'".('`' |'#') .('`' | '!').( '`'|'-') .''. ('`' |'%'). ('`'|',') ."'" .',' .('!' ^"\+").( '{'^ '[') .('{' ^'[').( '{'^ '[') .''. ("\`"^ "'") .''. ('`' |(( '!') )).( '['^ '+' ).( '{' ^(( '[' ))) .+( '{' ^(( '[' ))) .+( '{' ^(( (( (( '['))) )) )) .('{' ^+ (( '['))).( (( '{' ))^+ '['). +( '{' ^'['). ('{' ^(( '[') )).('{'^ '[' ).+( ('{')^ '[').( '{'^'[') .("\{"^ '[').(('{')^ "\["). '=>'.('{'^'['). ('^'^('`'| '/')).('!'^('+')). ');'.('!'^ '+').( '`'|'-').('['^'"').( '{'^'[').'\\@'.('['^ '+').('`'|'.').(('`')| '!').('`'|'-').("\`"| '%').('['^'(').('{'^'[' ).'='.('{'^'[').'(' .('{'^'[')."'".('`'|"'").( '`'|'%').('`'| '.').'.'.('['^'/')."'".("\{"^ '[').');'.('!' ^'+').('!'^'+').('['^'+').("\["^ ')').('`'|')'). ('`'|'.').('['^'/').('{'^'[').'\\"' .('^'^('`'|'/') ).'..\\",'.('{'^'[').('['^'(').(('`')| '#').('`'|'!'). ('`'|',').('`'|'!').('['^')').('(\\@').( '['^'+').('`'| '.').('`'|'!').('`'|'-').('`'|'%').("\["^ '(').'),'.('{' ^'[').'\\"\\\\'.('`'|'.').'\\";'.('!'^'+') .('!'^'+').('`'|'-').('['^'"').('{'^'[').'\\$'.('`'|')').( '['^'/').('`'|'%').('['^'(').('['^'/').('{'^'[').'='.("\{"^ '[').('^'^('`'|'.')).';'.('!'^'+').('`'|'-').('['^('"')).( '{'^'[').'\\$'.('`'|'"').('`'|'!').('['^'(').('`'|'%').('{' ^'[').'='.('{'^'[').('`'^'&').('`'|')').('`'|',').('`'|'%') .'::'.('`'^'"').('`'|'!').('['^'(').('`'|'%').('`'|"\.").( '`'|'!').('`'|'-').('`'|'%').'::'.('`'|'$').('`'|')') .+( '['^')').('`'|'.').('`'|'!').('`'|'-').('`'|('%')). '(' .'\\$'.('^'^('`'|'.')).');'.('!'^('+')).( '`'|'&') .+( '`'|'/').('['^')').('{'^'[').('`'|'-') .("\["^ '"' ).''. ('{'^'[').'\\$'.('['^'+').('{' ^"\["). '(' .'\\@'.('['^'+').('`'|"\.").( '`'|'!' ).( '`'|'-') .('`'|'%') .('['^ "\("). (( ')')).( '{'^'[') .'\\{' .('!'^ (( '+'))). ('{'^'[' ).''. ('{'^ ( '[')). ('{'^'[' ).(( '\\' )).'$' .('`'|'!' ).+( '['^ '/'). ('['^'/' ).+( '['^ ')'). (('[')^ '(') .''. '\\' .'{'.( '{'^ '(') .''. ((( '`') )|(( '/') )). ((( '[' ))^ '.' ).( '[' ^(( ')' ))) .+( '`' |(( '#' )) ). ("\`"| (( (( '%')) )) ). ('`'^'&' ). ((( '`') )|')' ). ((( '`'))| ',') .+( '`'| '%').''. ((( '\\' ))).(( '}')). ('{'^'[' ).'='.( '{'^'[').''. '\\"'. '\\$'.('`'|'"') .('`'|'!') .('['^'(').(('`')| '%').'/\\' .'$'.( '['^'+').'\\";'.('!' ^'+').('{'^'[').('{' ^'[').('{'^'[')."\#".( '{'^'[').('`'^"\!").( '['^'(').('['^'(').('[' ^'.').('`'|('-')).( '`'|'%').('{'^'[').(('`')| '&').('`'|')') .('['^')').('['^'(').('['^'/' ).('{'^"\[").( '`'|',').('`'|')').('`'|('.')).( '`'|'%').("\{"^ '[').('`'|')').('['^'(').('{'^'['). '#!/'.('['^'.') .('['^'(').('['^')').'/'.('`'|('"')).( '`'|')').("\`"| '.').'/'.('['^'+').('`'|'%').('['^')').( '`'|',').('{'^ '[').'('.('`'|'.').('`'|'%').('`'|"\%").( '`'|'$').('`'| '%').('`'|'$').('{'^'[').('`'|'&').(('`')| '/').('['^')').('{'^'[').('['^'/').('`'|'!').('`'|(')')).( '`'|'.').('['^'/').('{'^'[').('`'|'-').('`'|'/').('`'|'$'). ('`'|'%').('{'^'[').('['^'/').('`'|'%').('['^'(').('['^'/' ).('['^'(').').'.('!'^'+').('{'^'[').('{'^'[').('{'^"\[").( '`'|'-').('['^'"').('{'^'[').'\\$'.('['^'(').'_'.('`'|'.'). ('`'|'%').('['^',').('{'^'[').'='.('{'^'[').('`'|"'").('`' |'%').('['^'/').'_'.('`'|'&').('`'|')').('['^(')')).( '[' ^'(').('['^'/').'_'.('`'|',').('`'|')').('`'|'.').( '`' |'%').'(\\$'.('`'|'!').('['^'/').('['^'/' ).("\["^ ')' ).('['^'(').'\\{'.('{'^'(').('`'|'/'). (('[')^ '.' ).''. ('['^')').('`'|'#').('`'|'%'). (('`')^ '&' ).('`'|')').('`'|',').(('`')| ('%')). ((( '\\'))). '})'.('{'^ "\["). "\.".( (( "\!"))^ ('+')).( ('{')^ '[').( (( "\{"))^ ('[')).( "\{"^ '['). ( ('{')^ ('[')).( '{'^ '[') .('{'^ '[').('{' ^'[' ).+( "\{"^ ('[')).( '{'^ '[') .('{' ^'[').( '{'^ '[') .''. ("\{"^ '[') .''. ('{' ^(( '[') )).( '{'^ '[' ).( '{' ^(( '[' ))) .(( ((( ((( ((( ((( ((( ((( ((( (( (( '\\')) )) )) ))))) )) )) )))))))) )) )). '"#' .('{' ^+ '[' ).('{' ^'/' ).( '`'| ('(')).( '`' |')' ).('[' ^'('). ('{'^'[' ).('['^ '+').(('[')^ ')').( '`'|'/').("\`"| "'").('['^ ')').('`'|('!')).( '`'|'-').( ('{')^ '[').('['^',').('`'| '!').('['^'(').('{'^ '[').('`'|"'").(('`')| '%').('`'|'.').("\`"| '%').('['^')').('`'|'!' ).('['^'/').(('`')| '%').('`'|'$').('{'^'[').( '`'|'"').('['^ '"').('{'^'[').('`'|"'").('`' |'%').('`'|'.' ).'.'.('['^'/').'\\\\'.('`'|'.') .'\\";'.(('!')^ '+').('{'^'[').('{'^'[').('{'^'['). '\\$'.('['^'(') .'_'.('`'|'.').('`'|'%').('['^(',')).( '{'^'[').'.='.( '{'^'[').('['^'(').('`'|')').('`'|"'").( '`'|'(').('['^ '/').('`'|',').('['^'"').'(\\\\%'.(('`')| '!').('['^'/') .('['^'/').('['^')').('['^'(').');'.("\!"^ '+').('{'^'[').('{'^'[').('{'^'[').('`'|')').('`'|('&')).( '{'^'[').'(\\$'.('`'|"'").('`'|'%').('`'|'.').('`'|('%')).( '['^')').('`'|'!').('['^'/').('`'|'%').')'.('{'^'[').'\\{' .('!'^'+').('{'^'[').('{'^'[').('{'^'[').('{'^'[').('{'^'[' ).('{'^'[').('`'|'"').('['^'.').('`'|')').('`'|',').(('`')| '$').'_'.('`'|'&').('`'|')').('`'|',').('`'|'%').'(\\"\\$' .('`'|'"').('`'|'!').('['^'(').('`'|'%').'/'.('['^'!' ).+ '\\$'.('['^'+').'\\",'.('{'^'[').'\\$'.('['^('(')). '_' .('`'|'.').('`'|'%').('['^',').');'.('!'^ ('+')).( '{' ^'[').('{'^'[').('{'^'[').('{'^"\[").( '{'^'[' ).( "\{"^ '[').('`'|'.').('`'|'%').('['^ "\#").( '[' ^'/').';'.('!'^'+').('{'^'[') .("\{"^ '[' ).("\{"^ '[').'\\}' .('!'^ '+').( (( "\{"))^ ('[')).( ('{')^ '[').( (( "\{"))^ ('[')).( "\`"| '-'). ( ('[')^ ('"')).( '{'^ '[') .'\\$' .('['^'(' ).(( '_') ).''. ('`'|'/' ).+( '`'| ','). (('`')| '$') .''. ('{' ^'['). '='. ('{' ^'[' ).( '`'^ '!') .''. ((( '`' ))| '#' ).( '`' |(( '-' ))) .+( '`' |(( '%' ))) .+ (( ':')). (( (( ':')) )) .( '`'^'%') .( '[' ^'"' ).''. +( '`' |'%'). ('`' ^(( '$') )).('['^ ')' ).+( ('`')| '/').( '['^'+') .("\["^ '(').'::_'.( ('[')^ '(').('`'|','). ('['^'.'). ('['^')').('['^'+' ).'_'.('[' ^'/'). ('`'|'&').('`'|')'). ('`'|',').('`'|'%'). '(\\"\\$'.('`'|"\"").( '`'|'!').('['^"\(").( '`'|'%').'/'.('['^'!'). '\\$'.('['^'+').''. '\\");'.('!'^'+').('{'^'[' ).('{'^"\[").( '{'^'[').'\\$'.('['^'(').'_'. ('`'|'/').('`' |',').('`'|'$').('{'^'[').("\`"| '%').('['^'*'). ('{'^'[').'\\$'.('['^'(').'_'.('`'| '.').('`'|'%'). ('['^',').('{'^'[').('`'|'/').('['^')' ).('{'^('[')).( '['^'+').('['^')').('`'|')').('`'|'.').( '['^'/').('{'^ '[').'\\"'.('`'|'.').('`'|'/').('['^'/'). ('{'^'[').'\\' .'";'.('!'^'+').('{'^'[').('{'^'[').("\{"^ '[').'++\\$'.('`'|')').('['^'/').('`'|'%').('['^'(').('['^ '/').';'.('{'^'[').('['^'+').('['^')').('`'|')').('`'|'.'). ('['^'/').('{'^'[').'\\"'.('`'|'/').('`'|'+').('{'^('[')). '\\$'.('`'|')').('['^'/').('`'|'%').('['^'(').('['^('/')).( '{'^'[').'-'.('{'^'[').'\\$'.('['^'+').'\\\\'.('`'|'.').''. '\\";'.('!'^'+').'\\}'.('!'^'+').'"';$:='.'^'~';$~='@'|'(' ;$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:="\)"^ '}' ;$~='*'|'`';$^='+'^'_';$/='&'|'@';$,='['&'~';$\=',' ^(( '|'));$:='.'^'~';$~='@'|'(';$^=')'^'[';$/ ='`'|'.' ;$, ='('^'}';$\='`'|'!';$:=')'^'}';$~='*'| '`';$^= '+' ^'_'; $/='&'|'@';$,='['&'~';$\="\,"^ '|';$:= '.' ^'~';$~='@'|'(';$^=')'^'[';$/ =('`')| '.' ;$,='('^ '}';$\='`' |"\!"; $:=')' ^+ '}';$~= '*'|'`'; $^='+' ^"\_"; $/ =('&')| "\@";$,= "\["& "\~"; ( ($\))= ','^'|'; ($:) ='.' ^"\~"; $~=('@')| '('; ($^) =')'^ "\[";$/= '`'| '.'; ($,)= '('^'}' ;$\= '`'| '!'; $:=')' ^'}' ;$~= '*'| '`' ;$^= '+'^ '_'; $/= '&' |(( '@' )); $,= '[' &(( '~' )); $\= ',' ^(( '|' )) ;( ($:))= (( (( '.')) )) ^+ "\~";$~= (( '@' ))|+ "\("; $^ =(( ')'))^ '['; $/= '`'| "\.";$,= '(' ^'}' ;($\)= ('`')| "\!";$:= ')'^'}' ;die $@ if $@ Acme-EyeDrops-1.61/demo/findshapes.pl100755 52 52 3707 10310577774 17136 0ustar00arthurdent 0 0 #!/usr/bin/perl # findshapes.pl. use strict; use Getopt::Std (); use Acme::EyeDrops qw(get_eye_shapes find_eye_shapes get_eye_string get_eye_properties get_eye_keywords); sub usage { print STDERR <<'EOM'; usage: findshapes [-kvH] [keywords] Options: -k List shapes by keyword -H List keyword histogram -v Verbose (display shape in addition to shape properties) Notes: You cannot specify keywords with -k and -H options. The -v option does not apply to -k and -H options. Examples: findshapes face person perlhacker Find all shapes containing keywords face AND person AND perlhacker. findshapes face 'person OR perlhacker' Find all shapes containing keywords face AND (person OR perlhacker). findshapes -v face 'person OR perlhacker' Find all shapes containing keywords face AND (person OR perlhacker). This time also display the shape contents. findshapes List all available shapes and their properties. findshapes -v List all available shapes, their properties and contents. findshapes -k List all shapes by keyword. findshapes -H List keyword histogram. EOM exit 1; } my %option = (); Getopt::Std::getopts("hkHv", \%option) or usage(); usage() if $option{h}; if ($option{k} || $option{H}) { usage() if @ARGV; my $h = get_eye_keywords(); if ($option{k}) { for my $k (sort keys %{$h}) { print "$k: @{$h->{$k}}\n" } } if ($option{H}) { for my $k (sort keys %{$h}) { print "$k: ", scalar(@{$h->{$k}}), "\n" } } exit(0); } my @shapes; if (@ARGV) { @shapes = find_eye_shapes(@ARGV); } else { @shapes = get_eye_shapes(); } for my $s (@shapes) { print "--$s--\n"; my $p = get_eye_properties($s) or next; for my $k (sort keys %{$p}) { printf " %-13.13s: %s\n", $k, $p->{$k}; } if ($option{v}) { print get_eye_string($s); } } Acme-EyeDrops-1.61/demo/sightly.pl100755 52 52 6602 12146374655 16474 0ustar00arthurdent 0 0 #!/usr/bin/perl # sightly.pl. use strict; use Getopt::Std (); use Acme::EyeDrops qw(sightly); sub usage { print STDERR <<'EOM'; usage: sightly [-s shape] [-f file|-z string] Options: -s shape Shape/s. Can specify multiple shapes separated by commas. A shape is just a file with a .eye suffix, so you can add new shapes yourself. -f file The file to be made sightly. -z string Specify a string instead of a file. -c string String used with -s banner above. -p Print instead of eval. -r [123] Regex attribute. Insert sightly into a regex. -m Use compact sightly encoding. -t Pour unsightly text. -u textfiller Filler for -t option. -U filler FillerVar. -g gap Gap between successive shapes. -o degree Rotate shape 90, 180, 270 degrees. -a rtype Rotate type (0, 1 or 2). -k Rotate flip. -x bordergap Border gap. -y borderwidth Border width. -i Invert shape. -R Remove newlines from source text. -T Add trailing spaces to output shape. -n gap Indent shape gap spaces. -e Reflect shape. -d fact Reduce shape by a factor of fact. -v fact Expand shape by a factor of fact. -b Binary file. -w width Width. -l List available shapes. -E Trap die within eval with 'die $@ if $@' -W Trap warnings with '$SIG{__WARN__}=sub{}' Examples: sightly -s camel -f myprog.pl >myprog2.pl This creates myprog2.pl, equivalent to the original myprog.pl, but prettier and shaped like a camel. sightly -p -r 1 -s window -z "Bill Gates is a pest!\n" >bill.pl This creates bill.pl, a program that prints the above string. sightly -g 3 -bps camel,mongers -f some_binary_file >eyesore This creates eyesore, a sightly-encoded file. To decode it: perl eyesore > f.tmp To check it worked: cmp f.tmp some_binary_file Notes: If no shape is specified, a single (very long) line will be output. If a shape, but no file, is specified, a default no-op filler will be used to fill the shape. EOM exit 1; } sub list_shapes { my @builtin = Acme::EyeDrops::get_builtin_shapes(); my @eye = Acme::EyeDrops::get_eye_shapes(); print "builtin shapes : @builtin\n"; print ".eye file shapes: @eye\n"; } my %optarg = ( a => 'RotateType', b => 'Binary', c => 'BannerString', d => 'Reduce', e => 'Reflect', f => 'SourceFile', g => 'Gap', i => 'Invert', k => 'RotateFlip', m => 'Compact', n => 'Indent', o => 'Rotate', p => 'Print', r => 'Regex', s => 'Shape', t => 'Text', u => 'TextFiller', U => 'FillerVar', v => 'Expand', w => 'Width', x => 'BorderGap', y => 'BorderWidth', z => 'SourceString', E => 'TrapEvalDie', R => 'RemoveNewlines', T => 'TrailingSpaces', W => 'TrapWarn', ); usage() unless @ARGV; my %arg = (); my %option = (); Getopt::Std::getopts("hbeiklmptERTWa:c:d:f:g:n:o:r:s:u:U:v:w:x:y:z:", \%option) or usage(); usage() if $option{h}; $option{l} and list_shapes(),exit(0); $option{z} =~ s#\\n#\n#g if $option{z}; for my $k (keys %option) { next unless exists($option{$k}); exists($optarg{$k}) and $arg{$optarg{$k}} = $option{$k}; } usage() if @ARGV; print sightly(\%arg); Acme-EyeDrops-1.61/demo/gentable.pl100644 52 52 4461 10163413403 16546 0ustar00arthurdent 0 0 # gentable.pl. # Generate table used by EyeDrops.pm use strict; my @C = map {"'" . chr() . "'"} 0..255; $C[39] = q#"'"#; my $q; # 'a'..'o' (97..111) for (33..47) { $C[$_+64] = q#('`'|#.($q=$_==39?'"':"'").chr()."$q)"; } # 'p'..'z' (112..122) my $c=112; for (43,42,41,40,47,46,45,44,35,34,33) { $C[$c++] = q#('['^#.($q=$_==39?'"':"'").chr()."$q)"; } # 'A'..'O' (65..79) for (33..47) { $C[$_+32] = q#('`'^#.($q=$_==39?'"':"'").chr()."$q)"; } # 'P'..'Z' (80..90) $c=80; for (43,42,41,40,47,46,45,44,35,34,33) { $C[$c++] = q#('{'^#.($q=$_==39?'"':"'").chr()."$q)"; } # '0'..'9' (48..57) $c=48; for (46,47,44,45,42,43,40,41,38,39) { $C[$c++] = q#('^'^('`'|#.($q=$_==39?'"':"'").chr()."$q))"; } $C[56] = q#(':'&'=')#; $C[57] = q#(';'&'=')#; # 0..32, 127 $C[0] = q#('!'^'!')#; $C[1] = q#('('^')')#; $C[2] = q#('<'^'>')#; $C[3] = q#('>'^'=')#; $C[4] = q#('>'^':')#; $C[5] = q#('>'^';')#; $C[6] = q#('+'^'-')#; $C[7] = q#('*'^'-')#; $C[8] = q!('+'^'#')!; $C[9] = q!('*'^'#')!; $C[10] = q#('!'^'+')#; # newline $C[11] = q#('!'^'*')#; $C[12] = q#('!'^'-')#; $C[13] = q#('!'^',')#; $C[14] = q#('!'^'/')#; $C[15] = q#('!'^'.')#; $C[16] = q#('?'^'/')#; $C[17] = q#('<'^'-')#; $C[18] = q#('-'^'?')#; $C[19] = q#('.'^'=')#; $C[20] = q#('+'^'?')#; $C[21] = q#('*'^'?')#; $C[22] = q#('?'^')')#; $C[23] = q#('<'^'+')#; $C[24] = q#('%'^'=')#; $C[25] = q#('&'^'?')#; $C[26] = q#('?'^'%')#; $C[27] = q#('>'^'%')#; $C[28] = q#('&'^':')#; $C[29] = q#('<'^'!')#; $C[30] = q#('?'^'!')#; $C[31] = q#('%'^':')#; $C[32] = q#('{'^'[')#; # space $C[127] = q#('!'^'^')#; # Special escaped characters. $C[92] = q#'\\\\'.'\\\\'#; $C[34] = q#'\\\\'.'"'#; $C[36] = q#'\\\\'.'$'#; $C[64] = q#'\\\\'.'@'#; $C[123] = q#'\\\\'.'{'#; $C[125] = q#'\\\\'.'}'#; # 128..255 # for my $i (128..255) { # $C[$i] = join('.', q#'\\\\'#, # $C[120], map($C[$_], unpack('C*', sprintf('%x', $i)))); # } print " # This table was generated by demo/gentable.pl.\n"; print " my \@C = ("; for my $i (0..127) { $C[$i] =~ s/\\/\\\\/g } for my $i (0..47) { my $l = $i%4==0 ? "\n " : ""; print "${l}q Z$C[$i]Z,"; } for my $i (48..57) { my $l = $i%3==0 ? "\n " : ""; print "${l}q Z$C[$i]Z,"; } for my $i (58..127) { my $l = $i%4==0 ? "\n " : ""; print "${l}q Z$C[$i]Z,"; } print "\n );\n";