id = $data['id']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $paste = id(new PhabricatorPasteQuery()) ->setViewer($user) ->withPasteIDs(array($this->id)) ->executeOne(); if (!$paste) { return new Aphront404Response(); } $file = id(new PhabricatorFile())->loadOneWhere( 'phid = %s', $paste->getFilePHID()); if (!$file) { return new Aphront400Response(); } $corpus = $this->buildCorpus($paste, $file); $paste_panel = new AphrontPanelView(); $author_phid = $paste->getAuthorPHID(); $header = 'Viewing Paste '.$paste->getID().' by '. PhabricatorObjectHandleData::loadOneHandle($author_phid)->renderLink(); if (strlen($paste->getTitle())) { $header .= ' - '.phutil_escape_html($paste->getTitle()); } $paste_panel->setHeader($header); $paste_panel->setWidth(AphrontPanelView::WIDTH_FULL); $paste_panel->addButton( phutil_render_tag( 'a', array( 'href' => '/paste/?fork='.$paste->getID(), 'class' => 'green button', ), 'Fork This')); $raw_uri = $file->getBestURI(); $paste_panel->addButton( phutil_render_tag( 'a', array( 'href' => $raw_uri, 'class' => 'button', ), 'View Raw Text')); $paste_panel->appendChild($corpus); $forks_panel = null; $forks_of_this_paste = id(new PhabricatorPaste())->loadAllWhere( 'parentPHID = %s', $paste->getPHID()); if ($forks_of_this_paste) { $forks_panel = new AphrontPanelView(); $forks_panel->setHeader("Forks of this paste"); $forks = array(); foreach ($forks_of_this_paste as $fork) { $forks[] = array( $fork->getID(), phutil_render_tag( 'a', array( 'href' => '/P'.$fork->getID(), ), phutil_escape_html($fork->getTitle()) ) ); } $forks_table = new AphrontTableView($forks); $forks_table->setHeaders( array( 'Paste ID', 'Title', ) ); $forks_table->setColumnClasses( array( null, 'wide pri', ) ); $forks_panel->appendChild($forks_table); } return $this->buildStandardPageResponse( array( $paste_panel, $forks_panel, ), array( 'title' => 'Paste: '.nonempty($paste->getTitle(), 'P'.$paste->getID()), )); } private function buildCorpus($paste, $file) { // Blantently copied from DiffusionBrowseFileController require_celerity_resource('diffusion-source-css'); require_celerity_resource('syntax-highlighting-css'); $language = $paste->getLanguage(); $source = $file->loadFileData(); if (empty($language)) { $source = PhabricatorSyntaxHighlighter::highlightWithFilename( $paste->getTitle(), $source); } else { $source = PhabricatorSyntaxHighlighter::highlightWithLanguage( $language, $source); } $text_list = explode("\n", $source); Javelin::initBehavior('phabricator-oncopy', array()); $rows = $this->buildDisplayRows($text_list); // TODO: Split the "one-up source listing" view into its own class and // share it properly between Paste and Diffusion. $corpus_table = phutil_render_tag( 'table', array( 'class' => 'diffusion-source remarkup-code PhabricatorMonospaced', ), implode("\n", $rows)); $corpus = phutil_render_tag( 'div', array( 'style' => 'padding: 0pt 2em;', ), $corpus_table); return $corpus; } private function buildDisplayRows($text_list) { $rows = array(); $n = 1; foreach ($text_list as $k => $line) { // Pardon the ugly for the time being. // And eventually this will highlight a line that you click // like diffusion does. Or maybe allow for line comments // like differential. Either way it will be better than it is now. $anchor = 'L'.$n; $link = phutil_render_tag( 'a', array( 'name' => $anchor, 'href' => '#'.$anchor, ), $n); $link = phutil_render_tag( 'th', array( 'class' => 'diffusion-line-link', ), $link); $rows[] = ''.$link. ''. // NOTE: See the 'phabricator-oncopy' behavior. "\xE2\x80\x8B". $line.''; ++$n; } return $rows; } }