Path: blob/master/src/applications/macro/markup/PhabricatorIconRemarkupRule.php
12241 views
<?php12final class PhabricatorIconRemarkupRule extends PhutilRemarkupRule {34public function getPriority() {5return 200.0;6}78public function apply($text) {9return preg_replace_callback(10'@{icon\b((?:[^}\\\\]+|\\\\.)*)}@m',11array($this, 'markupIcon'),12$text);13}1415public function markupIcon(array $matches) {16$engine = $this->getEngine();17$text_mode = $engine->isTextMode();18$mail_mode = $engine->isHTMLMailMode();1920if (!$this->isFlatText($matches[0]) || $text_mode || $mail_mode) {21return $matches[0];22}2324$extra = idx($matches, 1);2526// We allow various forms, like these:27//28// {icon}29// {icon camera}30// {icon,camera}31// {icon camera color=red}32// {icon, camera, color=red}3334$extra = ltrim($extra, ", \n");35$extra = preg_split('/[\s,]+/', $extra, 2);3637// Choose some arbitrary default icon so that previews render in a mostly38// reasonable way as you're typing the syntax.39$icon = idx($extra, 0, 'paw');4041$defaults = array(42'color' => null,43'spin' => false,44);4546$options = idx($extra, 1, '');47$parser = new PhutilSimpleOptions();48$options = $parser->parse($options) + $defaults;4950// NOTE: We're validating icon and color names to prevent users from51// adding arbitrary CSS classes to the document. Although this probably52// isn't dangerous, it's safer to validate.5354static $icon_names;55if (!$icon_names) {56$icon_names = array_fuse(PHUIIconView::getIcons());57}5859static $color_names;60if (!$color_names) {61$color_names = array_fuse(PHUIIconView::getIconColors());62}6364if (empty($icon_names['fa-'.$icon])) {65$icon = 'paw';66}6768$color = $options['color'];69if (empty($color_names[$color])) {70$color = null;71}7273$classes = array();74$classes[] = $color;7576$spin = $options['spin'];77if ($spin) {78$classes[] = 'ph-spin';79}8081$icon_view = id(new PHUIIconView())82->setIcon('fa-'.$icon, implode(' ', $classes));8384return $this->getEngine()->storeText($icon_view);85}8687}888990