From 5bc53cfe53d0afe813b19f28d6151273e7b86499 Mon Sep 17 00:00:00 2001 From: sten Date: Tue, 12 Sep 2023 17:01:45 +0100 Subject: [PATCH] Update PhutilCowsay.php to work for small cows Summary: Update PhutilCowsay.php to work for small cows. In doing so, we also simplify the code to just use multiline regexps rather than trying to parse a line at a time. cowsay(cow='small'){{{What about me?}}} Test Plan: Check cowsay works for the built in non-perl cow: ``` cowsay(cow='companion'){{{Built in}}} ``` Test all the perl cows: ``` cowsay(cow='bunny'){{{Testing bunny}}} cowsay(cow='cower'){{{Testing cower}}} cowsay(cow='daemon'){{{Testing daemon}}} cowsay(cow='default'){{{Testing default}}} cowsay(cow='dragon-and-cow'){{{Testing dragon-and-cow}}} cowsay(cow='dragon'){{{Testing dragon}}} cowsay(cow='elephant'){{{Testing elephant}}} cowsay(cow='eyes'){{{Testing eyes}}} cowsay(cow='flaming-sheep'){{{Testing flaming-sheep}}} cowsay(cow='head-in'){{{Testing head-in}}} cowsay(cow='kitty'){{{Testing kitty}}} cowsay(cow='koala'){{{Testing koala}}} cowsay(cow='meow'){{{Testing meow}}} cowsay(cow='moofasa'){{{Testing moofasa}}} cowsay(cow='moose'){{{Testing moose}}} cowsay(cow='mutilated'){{{Testing mutilated}}} cowsay(cow='satanic'){{{Testing satanic}}} cowsay(cow='sheep'){{{Testing sheep}}} cowsay(cow='skeleton'){{{Testing skeleton}}} cowsay(cow='small'){{{Testing small}}} cowsay(cow='squirrel'){{{Testing squirrel}}} cowsay(cow='stegosaurus'){{{Testing stegosaurus}}} cowsay(cow='supermilker'){{{Testing supermilker}}} cowsay(cow='surgery'){{{Testing surgery}}} cowsay(cow='turkey'){{{Testing turkey}}} cowsay(cow='turtle'){{{Testing turtle}}} cowsay(cow='tux'){{{Testing tux}}} cowsay(cow='www'){{{Testing www}}} ``` Reviewers: O1 Blessed Committers, valerio.bozzolan Reviewed By: O1 Blessed Committers, valerio.bozzolan Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno Differential Revision: https://we.phorge.it/D25436 --- src/utils/PhutilCowsay.php | 41 ++++++++++------------- src/utils/__tests__/cowsay/cube_perl.test | 3 +- src/utils/__tests__/cowsay/small.expect | 7 ++++ src/utils/__tests__/cowsay/small.test | 12 +++++++ 4 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 src/utils/__tests__/cowsay/small.expect create mode 100644 src/utils/__tests__/cowsay/small.test diff --git a/src/utils/PhutilCowsay.php b/src/utils/PhutilCowsay.php index ca0290b9..aeabf145 100644 --- a/src/utils/PhutilCowsay.php +++ b/src/utils/PhutilCowsay.php @@ -41,34 +41,29 @@ final class PhutilCowsay extends Phobject { $template = $this->template; // Real ".cow" files are Perl scripts which define a variable called - // "$the_cow". We aren't going to interpret Perl, so strip all this stuff - // (and any comments in the file) away. - $template = phutil_split_lines($template, true); - $keep = array(); - $is_perl_cowfile = false; - foreach ($template as $key => $line) { - if (preg_match('/^#/', $line)) { - continue; - } - if (preg_match('/^\s*\\$the_cow/', $line)) { - $is_perl_cowfile = true; - continue; - } - if (preg_match('/^\s*EOC\s*$/', $line)) { - continue; - } - $keep[] = $line; - } - $template = implode('', $keep); + // "$the_cow". We aren't going to interpret Perl, so just get everything + // between the EOC (End Of Cow) tokens. The initial EOC might be in + // quotes, and might have a semicolon. + // We apply regexp modifiers + // * 's' to make . match newlines within the EOC ... EOC block + // * 'm' so we can use ^ to match start of line within the multiline string + $matches = null; + if ( + preg_match('/\$the_cow/', $template) && + preg_match('/EOC[\'"]?;?.*?^(.*?)^EOC/sm', $template, $matches) + ) { + $template = $matches[1]; - // Original .cow files are perl scripts which contain escaped sequences. - // We attempt to unescape here by replacing any character preceded by a - // backslash/escape with just that character. - if ($is_perl_cowfile) { + // Original .cow files are perl scripts which contain escaped sequences. + // We attempt to unescape here by replacing any character preceded by a + // backslash/escape with just that character. $template = preg_replace( '/\\\\(.)/', '$1', $template); + } else { + // Text template. Just strip away comments. + $template = preg_replace('/^#.*$/', '', $template); } $token_patterns = array( diff --git a/src/utils/__tests__/cowsay/cube_perl.test b/src/utils/__tests__/cowsay/cube_perl.test index d9582d2b..a950e588 100644 --- a/src/utils/__tests__/cowsay/cube_perl.test +++ b/src/utils/__tests__/cowsay/cube_perl.test @@ -1,5 +1,5 @@ # test case for original perl-script cowfile -$the_cow = +$the_cow = < + ------------------ + \ ,__, + \ (oo)____ + (__) )\ + ||--|| * diff --git a/src/utils/__tests__/cowsay/small.test b/src/utils/__tests__/cowsay/small.test new file mode 100644 index 00000000..bc3e08e4 --- /dev/null +++ b/src/utils/__tests__/cowsay/small.test @@ -0,0 +1,12 @@ +$eyes = ".." unless ($eyes); +$the_cow = <