From 405b05a49014eede90c098a8f9af1e41f5cd76dd Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 24 Jun 2011 10:59:57 -0700 Subject: [PATCH] Basic @mentions support Summary: Provides basic Remarkup support for @mentions. No application integration yet so these aren't terribly useful until that happens. Test Plan: https://secure.phabricator.com/file/view/PHID-FILE-83d68e7af6085ae928df/ Reviewers: tomo, mroch, jsp Commenters: tomo CC: aran, tomo, epriestley Differential Revision: 517 --- src/__celerity_resource_map__.php | 36 +++---- src/__phutil_library_map__.php | 2 + .../DifferentialMarkupEngineFactory.php | 1 + .../differential/parser/markup/__init__.php | 1 + .../PhabricatorRemarkupRuleMention.php | 93 +++++++++++++++++++ .../remarkup/markuprule/mention/__init__.php | 16 ++++ webroot/rsrc/css/core/remarkup.css | 12 +++ 7 files changed, 143 insertions(+), 18 deletions(-) create mode 100644 src/infrastructure/markup/remarkup/markuprule/mention/PhabricatorRemarkupRuleMention.php create mode 100644 src/infrastructure/markup/remarkup/markuprule/mention/__init__.php diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index dd5008b80a..2c299dd4c8 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1057,7 +1057,7 @@ celerity_register_resource_map(array( ), 'phabricator-remarkup-css' => array( - 'uri' => '/res/774d4078/rsrc/css/core/remarkup.css', + 'uri' => '/res/d7e98209/rsrc/css/core/remarkup.css', 'type' => 'css', 'requires' => array( @@ -1132,7 +1132,7 @@ celerity_register_resource_map(array( 'uri' => '/res/pkg/2892314d/typeahead.pkg.js', 'type' => 'js', ), - 'c2d123fd' => + 'd752b5da' => array ( 'name' => 'core.pkg.css', 'symbols' => @@ -1153,7 +1153,7 @@ celerity_register_resource_map(array( 13 => 'phabricator-remarkup-css', 14 => 'syntax-highlighting-css', ), - 'uri' => '/res/pkg/c2d123fd/core.pkg.css', + 'uri' => '/res/pkg/d752b5da/core.pkg.css', 'type' => 'css', ), 'da416e1c' => @@ -1225,15 +1225,15 @@ celerity_register_resource_map(array( ), 'reverse' => array ( - 'aphront-crumbs-view-css' => 'c2d123fd', - 'aphront-dialog-view-css' => 'c2d123fd', - 'aphront-form-view-css' => 'c2d123fd', - 'aphront-list-filter-view-css' => 'c2d123fd', - 'aphront-panel-view-css' => 'c2d123fd', - 'aphront-side-nav-view-css' => 'c2d123fd', - 'aphront-table-view-css' => 'c2d123fd', - 'aphront-tokenizer-control-css' => 'c2d123fd', - 'aphront-typeahead-control-css' => 'c2d123fd', + 'aphront-crumbs-view-css' => 'd752b5da', + 'aphront-dialog-view-css' => 'd752b5da', + 'aphront-form-view-css' => 'd752b5da', + 'aphront-list-filter-view-css' => 'd752b5da', + 'aphront-panel-view-css' => 'd752b5da', + 'aphront-side-nav-view-css' => 'd752b5da', + 'aphront-table-view-css' => 'd752b5da', + 'aphront-tokenizer-control-css' => 'd752b5da', + 'aphront-typeahead-control-css' => 'd752b5da', 'differential-changeset-view-css' => '55967526', 'differential-core-view-css' => '55967526', 'differential-revision-add-comment-css' => '55967526', @@ -1270,13 +1270,13 @@ celerity_register_resource_map(array( 'javelin-util' => 'db95a6d0', 'javelin-vector' => 'db95a6d0', 'javelin-workflow' => 'f1d27e2a', - 'phabricator-core-buttons-css' => 'c2d123fd', - 'phabricator-core-css' => 'c2d123fd', - 'phabricator-directory-css' => 'c2d123fd', + 'phabricator-core-buttons-css' => 'd752b5da', + 'phabricator-core-css' => 'd752b5da', + 'phabricator-directory-css' => 'd752b5da', 'phabricator-keyboard-shortcut' => 'f1d27e2a', 'phabricator-keyboard-shortcut-manager' => 'f1d27e2a', - 'phabricator-remarkup-css' => 'c2d123fd', - 'phabricator-standard-page-view' => 'c2d123fd', - 'syntax-highlighting-css' => 'c2d123fd', + 'phabricator-remarkup-css' => 'd752b5da', + 'phabricator-standard-page-view' => 'd752b5da', + 'syntax-highlighting-css' => 'd752b5da', ), )); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index aae4751e44..d7ade37707 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -440,6 +440,7 @@ phutil_register_library_map(array( 'PhabricatorRemarkupRuleDiffusion' => 'infrastructure/markup/remarkup/markuprule/diffusion', 'PhabricatorRemarkupRuleImageMacro' => 'infrastructure/markup/remarkup/markuprule/imagemacro', 'PhabricatorRemarkupRuleManiphest' => 'infrastructure/markup/remarkup/markuprule/maniphest', + 'PhabricatorRemarkupRuleMention' => 'infrastructure/markup/remarkup/markuprule/mention', 'PhabricatorRemarkupRuleObjectName' => 'infrastructure/markup/remarkup/markuprule/objectname', 'PhabricatorRemarkupRuleProxyImage' => 'infrastructure/markup/remarkup/markuprule/proxyimage', 'PhabricatorRemarkupRuleYoutube' => 'infrastructure/markup/remarkup/markuprule/youtube', @@ -907,6 +908,7 @@ phutil_register_library_map(array( 'PhabricatorRemarkupRuleDiffusion' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleManiphest' => 'PhabricatorRemarkupRuleObjectName', + 'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleObjectName' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleProxyImage' => 'PhutilRemarkupRule', 'PhabricatorRemarkupRuleYoutube' => 'PhutilRemarkupRule', diff --git a/src/applications/differential/parser/markup/DifferentialMarkupEngineFactory.php b/src/applications/differential/parser/markup/DifferentialMarkupEngineFactory.php index da1410b798..959c18fbb8 100644 --- a/src/applications/differential/parser/markup/DifferentialMarkupEngineFactory.php +++ b/src/applications/differential/parser/markup/DifferentialMarkupEngineFactory.php @@ -42,6 +42,7 @@ class DifferentialMarkupEngineFactory { $rules[] = new PhabricatorRemarkupRuleDiffusion(); $rules[] = new PhabricatorRemarkupRuleManiphest(); $rules[] = new PhabricatorRemarkupRuleImageMacro(); + $rules[] = new PhabricatorRemarkupRuleMention(); $custom_rule_classes = PhabricatorEnv::getEnvConfig('differential.custom-remarkup-rules'); diff --git a/src/applications/differential/parser/markup/__init__.php b/src/applications/differential/parser/markup/__init__.php index 16e58bca7b..2a6ad93b73 100644 --- a/src/applications/differential/parser/markup/__init__.php +++ b/src/applications/differential/parser/markup/__init__.php @@ -11,6 +11,7 @@ phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/ phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/diffusion'); phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/imagemacro'); phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/maniphest'); +phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/mention'); phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/proxyimage'); phutil_require_module('phabricator', 'infrastructure/markup/remarkup/markuprule/youtube'); diff --git a/src/infrastructure/markup/remarkup/markuprule/mention/PhabricatorRemarkupRuleMention.php b/src/infrastructure/markup/remarkup/markuprule/mention/PhabricatorRemarkupRuleMention.php new file mode 100644 index 0000000000..0849570767 --- /dev/null +++ b/src/infrastructure/markup/remarkup/markuprule/mention/PhabricatorRemarkupRuleMention.php @@ -0,0 +1,93 @@ +establishConnection('r'), + 'SELECT username, phid, realName FROM %T WHERE username IN (%Ls)', + $user_table->getTableName(), + $usernames); + + foreach ($real_user_names as $row) { + $this->actualUsers[strtolower($row['username'])] = $row; + } + + return preg_replace_callback( + $regexp, + array($this, 'markupMention'), + $text); + } + + public function markupMention($matches) { + $username = strtolower($matches[1]); + $exists = isset($this->actualUsers[$username]); + + $real = $this->actualUsers[$username]['realName']; + + $class = $exists + ? 'phabricator-remarkup-mention-exists' + : 'phabricator-remarkup-mention-unknown'; + + if ($exists) { + $tag = phutil_render_tag( + 'a', + array( + 'class' => $class, + 'href' => '/p/'.$username.'/', + 'target' => '_blank', + 'title' => $real, + ), + phutil_escape_html('@'.$username)); + } else { + $tag = phutil_render_tag( + 'span', + array( + 'class' => $class, + ), + phutil_escape_html('@'.$username)); + } + + return $this->getEngine()->storeText($tag); + } + +} diff --git a/src/infrastructure/markup/remarkup/markuprule/mention/__init__.php b/src/infrastructure/markup/remarkup/markuprule/mention/__init__.php new file mode 100644 index 0000000000..cd604a4585 --- /dev/null +++ b/src/infrastructure/markup/remarkup/markuprule/mention/__init__.php @@ -0,0 +1,16 @@ +