Differential D14102 Diff 34087 src/infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php
| <?php | <?php | ||||
| final class PhabricatorRemarkupFigletBlockInterpreter | final class PhabricatorRemarkupFigletBlockInterpreter | ||||
| extends PhutilRemarkupBlockInterpreter { | extends PhutilRemarkupBlockInterpreter { | ||||
| public function getInterpreterName() { | public function getInterpreterName() { | ||||
| return 'figlet'; | return 'figlet'; | ||||
| } | } | ||||
| /** | |||||
| * @phutil-external-symbol class Text_Figlet | |||||
| */ | |||||
| public function markupContent($content, array $argv) { | public function markupContent($content, array $argv) { | ||||
| if (!Filesystem::binaryExists('figlet')) { | $map = self::getFigletMap(); | ||||
| return $this->markupError( | |||||
| pht( | $font = idx($argv, 'font'); | ||||
| 'Unable to locate the `%s` binary. Install figlet.', | $font = phutil_utf8_strtolower($font); | ||||
| 'figlet')); | if (empty($map[$font])) { | ||||
| } | $font = 'standard'; | ||||
| $font = idx($argv, 'font', 'standard'); | |||||
| $safe_font = preg_replace('/[^0-9a-zA-Z-_.]/', '', $font); | |||||
| $future = id(new ExecFuture('figlet -f %s', $safe_font)) | |||||
| ->setTimeout(15) | |||||
| ->write(trim($content, "\n")); | |||||
| list($err, $stdout, $stderr) = $future->resolve(); | |||||
| if ($err) { | |||||
| return $this->markupError( | |||||
| pht( | |||||
| 'Execution of `%s` failed: %s', | |||||
| 'figlet', | |||||
| $stderr)); | |||||
| } | } | ||||
| $root = dirname(phutil_get_library_root('phabricator')); | |||||
| require_once $root.'/externals/pear-figlet/Text/Figlet.php'; | |||||
| $figlet = new Text_Figlet(); | |||||
| $figlet->loadFont($map[$font]); | |||||
| $result = $figlet->lineEcho($content); | |||||
| if ($this->getEngine()->isTextMode()) { | if ($this->getEngine()->isTextMode()) { | ||||
| return $stdout; | return $result; | ||||
| } | } | ||||
| return phutil_tag( | return phutil_tag( | ||||
| 'div', | 'div', | ||||
| array( | array( | ||||
| 'class' => 'PhabricatorMonospaced remarkup-figlet', | 'class' => 'PhabricatorMonospaced remarkup-figlet', | ||||
| ), | ), | ||||
| $stdout); | $result); | ||||
| } | |||||
| private static function getFigletMap() { | |||||
| $root = dirname(phutil_get_library_root('phabricator')); | |||||
| $dirs = array( | |||||
| $root.'/externals/figlet/fonts/', | |||||
| $root.'/externals/pear-figlet/fonts/', | |||||
| $root.'/resources/figlet/custom/', | |||||
| ); | |||||
| $map = array(); | |||||
| foreach ($dirs as $dir) { | |||||
| foreach (Filesystem::listDirectory($dir, false) as $file) { | |||||
| if (preg_match('/\.flf\z/', $file)) { | |||||
| $name = phutil_utf8_strtolower($file); | |||||
| $name = preg_replace('/\.flf\z/', '', $name); | |||||
| $map[$name] = $dir.$file; | |||||
| } | |||||
| } | |||||
| } | |||||
| return $map; | |||||
| } | } | ||||
| } | } | ||||