diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index b67f2b85ba..f12b305c9d 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1122,6 +1122,7 @@ phutil_register_library_map(array( 'PhabricatorRemarkupRuleImageMacro' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleImageMacro.php', 'PhabricatorRemarkupRuleManiphest' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleManiphest.php', 'PhabricatorRemarkupRuleManiphestHandle' => 'infrastructure/markup/rule/handle/PhabricatorRemarkupRuleManiphestHandle.php', + 'PhabricatorRemarkupRuleMeme' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleMeme.php', 'PhabricatorRemarkupRuleMention' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleMention.php', 'PhabricatorRemarkupRuleObjectHandle' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObjectHandle.php', 'PhabricatorRemarkupRuleObjectName' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObjectName.php', @@ -2499,6 +2500,7 @@ phutil_register_library_map(array( 'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleManiphest' => 'PhabricatorRemarkupRuleObjectName', 'PhabricatorRemarkupRuleManiphestHandle' => 'PhabricatorRemarkupRuleObjectHandle', + 'PhabricatorRemarkupRuleMeme' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleObjectHandle' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleObjectName' => 'PhutilRemarkupRule', diff --git a/src/infrastructure/markup/PhabricatorMarkupEngine.php b/src/infrastructure/markup/PhabricatorMarkupEngine.php index a064f7edd6..94c55f5738 100644 --- a/src/infrastructure/markup/PhabricatorMarkupEngine.php +++ b/src/infrastructure/markup/PhabricatorMarkupEngine.php @@ -419,6 +419,7 @@ final class PhabricatorMarkupEngine { if ($options['macros']) { $rules[] = new PhabricatorRemarkupRuleImageMacro(); + $rules[] = new PhabricatorRemarkupRuleMeme(); } $rules[] = new PhabricatorRemarkupRuleMention(); diff --git a/src/infrastructure/markup/rule/PhabricatorRemarkupRuleMeme.php b/src/infrastructure/markup/rule/PhabricatorRemarkupRuleMeme.php new file mode 100644 index 0000000000..5b5135bc11 --- /dev/null +++ b/src/infrastructure/markup/rule/PhabricatorRemarkupRuleMeme.php @@ -0,0 +1,42 @@ + null, + 'above' => null, + 'below' => null, + ); + + $parser = new PhutilSimpleOptions(); + $options = $parser->parse($matches[1]) + $options; + + $uri = id(new PhutilURI('/macro/meme/')) + ->alter('macro', $options['src']) + ->alter('uppertext', $options['above']) + ->alter('lowertext', $options['below']); + + $img = phutil_render_tag( + 'img', + array( + 'src' => (string)$uri, + )); + + return $this->getEngine()->storeText($img); + } + +} diff --git a/src/view/form/control/PhabricatorRemarkupControl.php b/src/view/form/control/PhabricatorRemarkupControl.php index ac238426ec..5198c0cf8d 100644 --- a/src/view/form/control/PhabricatorRemarkupControl.php +++ b/src/view/form/control/PhabricatorRemarkupControl.php @@ -49,6 +49,12 @@ final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl { 'table' => array( 'tip' => pht('Table'), ), + array( + 'spacer' => true, + ), + 'meme' => array( + 'tip' => pht('Meme'), + ), 'help' => array( 'tip' => pht('Help'), 'align' => 'right', diff --git a/webroot/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js b/webroot/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js index 11db6f95ba..f6c2f38cd2 100644 --- a/webroot/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js +++ b/webroot/rsrc/js/application/core/behavior-phabricator-remarkup-assist.js @@ -59,6 +59,17 @@ JX.behavior('phabricator-remarkup-assist', function(config) { case 'table': update(area, (r.start == 0 ? '' : '\n\n') + '| ', sel || 'data', ' |'); break; + case 'meme': + new JX.Workflow('/macro/meme/create/') + .setHandler(function(response) { + update( + area, + '', + sel, + (r.start == 0 ? '' : '\n\n') + response.text + '\n\n'); + }) + .start(); + break; } }