From 9422596ebf2fca0495a60288af5ac3d8f097a982 Mon Sep 17 00:00:00 2001 From: Josh Cox Date: Tue, 30 Aug 2016 00:41:47 +0000 Subject: [PATCH] Converted Paste language selection to a typeahead Summary: Fixes T11532. The language selection for pastes is now a typeahead that is backed by `pygments.dropdown-choices`. There is still a bit of weirdness around making "auto-detection" the default state. To actually select a different language, you first need to remove the "auto detect" option that is pre-populated in a new paste. Other than that, it works as intended. Test Plan: Create a new paste with a file extension that can be auto-detected. Created a new paste and manually selected the language Edited a paste and changed the language. Reviewers: #blessed_reviewers, epriestley Reviewed By: #blessed_reviewers, epriestley Subscribers: Korvin, epriestley, yelirekim Maniphest Tasks: T11532 Differential Revision: https://secure.phabricator.com/D16463 --- .../20160829.pastebin.01.language.sql | 3 ++ .../20160829.pastebin.02.language.sql | 2 + src/__phutil_library_map__.php | 2 + .../editor/PhabricatorPasteEditEngine.php | 10 ++--- .../paste/storage/PhabricatorPaste.php | 3 +- .../PasteLanguageSelectDatasource.php | 42 +++++++++++++++++++ 6 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 resources/sql/autopatches/20160829.pastebin.01.language.sql create mode 100644 resources/sql/autopatches/20160829.pastebin.02.language.sql create mode 100644 src/applications/paste/typeahead/PasteLanguageSelectDatasource.php diff --git a/resources/sql/autopatches/20160829.pastebin.01.language.sql b/resources/sql/autopatches/20160829.pastebin.01.language.sql new file mode 100644 index 0000000000..b29a9d0bc5 --- /dev/null +++ b/resources/sql/autopatches/20160829.pastebin.01.language.sql @@ -0,0 +1,3 @@ +/* Allow this column to be nullable (null means we'll try to autodetect) */ +ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste MODIFY language VARCHAR(64) + COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160829.pastebin.02.language.sql b/resources/sql/autopatches/20160829.pastebin.02.language.sql new file mode 100644 index 0000000000..b6876c6c69 --- /dev/null +++ b/resources/sql/autopatches/20160829.pastebin.02.language.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_pastebin.pastebin_paste SET language = NULL + WHERE language = ''; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ac0a35e75e..831d22a1a5 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1732,6 +1732,7 @@ phutil_register_library_map(array( 'PasteEditConduitAPIMethod' => 'applications/paste/conduit/PasteEditConduitAPIMethod.php', 'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php', 'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php', + 'PasteLanguageSelectDatasource' => 'applications/paste/typeahead/PasteLanguageSelectDatasource.php', 'PasteMailReceiver' => 'applications/paste/mail/PasteMailReceiver.php', 'PasteQueryConduitAPIMethod' => 'applications/paste/conduit/PasteQueryConduitAPIMethod.php', 'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php', @@ -6401,6 +6402,7 @@ phutil_register_library_map(array( 'PasteEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'PasteEmbedView' => 'AphrontView', 'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod', + 'PasteLanguageSelectDatasource' => 'PhabricatorTypeaheadDatasource', 'PasteMailReceiver' => 'PhabricatorObjectMailReceiver', 'PasteQueryConduitAPIMethod' => 'PasteConduitAPIMethod', 'PasteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', diff --git a/src/applications/paste/editor/PhabricatorPasteEditEngine.php b/src/applications/paste/editor/PhabricatorPasteEditEngine.php index 1bad86da15..5578a7c9f6 100644 --- a/src/applications/paste/editor/PhabricatorPasteEditEngine.php +++ b/src/applications/paste/editor/PhabricatorPasteEditEngine.php @@ -63,10 +63,6 @@ final class PhabricatorPasteEditEngine } protected function buildCustomEditFields($object) { - $langs = array( - '' => pht('(Detect From Filename in Title)'), - ) + PhabricatorEnv::getEnvConfig('pygments.dropdown-choices'); - return array( id(new PhabricatorTextEditField()) ->setKey('title') @@ -76,14 +72,14 @@ final class PhabricatorPasteEditEngine ->setConduitDescription(pht('Retitle the paste.')) ->setConduitTypeDescription(pht('New paste title.')) ->setValue($object->getTitle()), - id(new PhabricatorSelectEditField()) + id(new PhabricatorDatasourceEditField()) ->setKey('language') ->setLabel(pht('Language')) ->setTransactionType( PhabricatorPasteLanguageTransaction::TRANSACTIONTYPE) ->setAliases(array('lang')) ->setIsCopyable(true) - ->setOptions($langs) + ->setDatasource(new PasteLanguageSelectDatasource()) ->setDescription( pht( 'Language used for syntax highlighting. By default, inferred '. @@ -91,7 +87,7 @@ final class PhabricatorPasteEditEngine ->setConduitDescription( pht('Change language used for syntax highlighting.')) ->setConduitTypeDescription(pht('New highlighting language.')) - ->setValue($object->getLanguage()), + ->setSingleValue($object->getLanguage()), id(new PhabricatorTextAreaEditField()) ->setKey('text') ->setLabel(pht('Text')) diff --git a/src/applications/paste/storage/PhabricatorPaste.php b/src/applications/paste/storage/PhabricatorPaste.php index 0e8f497936..19aabcf8e0 100644 --- a/src/applications/paste/storage/PhabricatorPaste.php +++ b/src/applications/paste/storage/PhabricatorPaste.php @@ -42,7 +42,6 @@ final class PhabricatorPaste extends PhabricatorPasteDAO return id(new PhabricatorPaste()) ->setTitle('') - ->setLanguage('') ->setStatus(self::STATUS_ACTIVE) ->setAuthorPHID($actor->getPHID()) ->setViewPolicy($view_policy) @@ -72,7 +71,7 @@ final class PhabricatorPaste extends PhabricatorPasteDAO self::CONFIG_COLUMN_SCHEMA => array( 'status' => 'text32', 'title' => 'text255', - 'language' => 'text64', + 'language' => 'text64?', 'mailKey' => 'bytes20', 'parentPHID' => 'phid?', diff --git a/src/applications/paste/typeahead/PasteLanguageSelectDatasource.php b/src/applications/paste/typeahead/PasteLanguageSelectDatasource.php new file mode 100644 index 0000000000..45c36db968 --- /dev/null +++ b/src/applications/paste/typeahead/PasteLanguageSelectDatasource.php @@ -0,0 +1,42 @@ +buildResults(); + return $this->filterResultsAgainstTokens($results); + } + + + protected function renderSpecialTokens(array $values) { + return $this->renderTokensFromResults($this->buildResults(), $values); + } + + private function buildResults() { + $results = array(); + $languages = PhabricatorEnv::getEnvConfig('pygments.dropdown-choices'); + + foreach ($languages as $value => $name) { + $result = id(new PhabricatorTypeaheadResult()) + ->setPHID($value) + ->setName($name); + + $results[$value] = $result; + } + return $results; + } + +}