public function renderCow()

in src/utils/PhutilCowsay.php [39:131]


  public function renderCow() {
    $width = 40;
    $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);

    // 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) {
      $template = preg_replace(
        '/\\\\(.)/',
        '$1',
        $template);
    }

    $template = preg_replace_callback(
      '/\\$([a-z]+)/',
      array($this, 'replaceTemplateVariable'),
      $template);
    if ($template === false) {
      throw new Exception(
        pht(
          'Failed to replace template variables while rendering cow!'));
    }

    $lines = $this->text;

    // TODO: It would be nice to use a utf8 soft wrap here instead, but we
    // do not currently have one. Soft wrap first, then force to utf8.
    $lines = wordwrap($lines, $width - 4, "\n", true);
    $lines = phutil_split_lines($lines, false);
    foreach ($lines as $key => $line) {
      $lines[$key] = phutil_utf8ize($line);
    }

    if ($this->action == 'think') {
      $borders = '((()))';
    } else {
      if (count($lines) == 1) {
        $borders = '<<<>>>';
      } else {
        $borders = '/|\\\\|/';
      }
    }

    $size = 0;
    foreach ($lines as $line) {
      $size = max(strlen($line), $size);
    }

    $balloon = array();
    $balloon[] = ' '.str_repeat('_', $size + 2);
    $lines = array_values($lines);
    $last = (count($lines) - 1);
    foreach ($lines as $idx => $line) {
      if ($idx == 0) {
        $l = $borders[0];
        $r = $borders[3];
      } else if ($idx == $last) {
        $l = $borders[2];
        $r = $borders[5];
      } else {
        $l = $borders[1];
        $r = $borders[4];
      }
      $balloon[] = $l.' '.str_pad($line, $size).' '.$r;

    }
    $balloon[] = ' '.str_repeat('-', $size + 2);
    $balloon = implode("\n", $balloon);

    return rtrim($balloon."\n".$template);
  }