public function render()
 {
     $old = $this->oldText;
     $new = $this->newText;
     // TODO: On mobile, or perhaps by default, we should switch to 1-up once
     // that is built.
     if (strlen($old)) {
         $old = phutil_utf8_hard_wrap($old, 80);
         $old = implode("\n", $old) . "\n";
     }
     if (strlen($new)) {
         $new = phutil_utf8_hard_wrap($new, 80);
         $new = implode("\n", $new) . "\n";
     }
     try {
         $engine = new PhabricatorDifferenceEngine();
         $changeset = $engine->generateChangesetFromFileContent($old, $new);
         $whitespace_mode = DifferentialChangesetParser::WHITESPACE_SHOW_ALL;
         $markup_engine = new PhabricatorMarkupEngine();
         $markup_engine->setViewer($this->getUser());
         $parser = new DifferentialChangesetParser();
         $parser->setUser($this->getUser());
         $parser->setChangeset($changeset);
         $parser->setMarkupEngine($markup_engine);
         $parser->setWhitespaceMode($whitespace_mode);
         return $parser->render(0, PHP_INT_MAX, array());
     } catch (Exception $ex) {
         return $ex->getMessage();
     }
 }
Ejemplo n.º 2
0
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $document = id(new PhrictionDocumentQuery())->setViewer($user)->withIDs(array($this->id))->needContent(true)->executeOne();
     if (!$document) {
         return new Aphront404Response();
     }
     $current = $document->getContent();
     $l = $request->getInt('l');
     $r = $request->getInt('r');
     $ref = $request->getStr('ref');
     if ($ref) {
         list($l, $r) = explode(',', $ref);
     }
     $content = id(new PhrictionContent())->loadAllWhere('documentID = %d AND version IN (%Ld)', $document->getID(), array($l, $r));
     $content = mpull($content, null, 'getVersion');
     $content_l = idx($content, $l, null);
     $content_r = idx($content, $r, null);
     if (!$content_l || !$content_r) {
         return new Aphront404Response();
     }
     $text_l = $content_l->getContent();
     $text_r = $content_r->getContent();
     $text_l = phutil_utf8_hard_wrap($text_l, 80);
     $text_l = implode("\n", $text_l);
     $text_r = phutil_utf8_hard_wrap($text_r, 80);
     $text_r = implode("\n", $text_r);
     $engine = new PhabricatorDifferenceEngine();
     $changeset = $engine->generateChangesetFromFileContent($text_l, $text_r);
     $changeset->setOldProperties(array('Title' => $content_l->getTitle()));
     $changeset->setNewProperties(array('Title' => $content_r->getTitle()));
     $whitespace_mode = DifferentialChangesetParser::WHITESPACE_SHOW_ALL;
     $parser = new DifferentialChangesetParser();
     $parser->setChangeset($changeset);
     $parser->setRenderingReference("{$l},{$r}");
     $parser->setWhitespaceMode($whitespace_mode);
     $engine = new PhabricatorMarkupEngine();
     $engine->setViewer($user);
     $engine->process();
     $parser->setMarkupEngine($engine);
     $spec = $request->getStr('range');
     list($range_s, $range_e, $mask) = DifferentialChangesetParser::parseRangeSpecification($spec);
     $output = $parser->render($range_s, $range_e, $mask);
     if ($request->isAjax()) {
         return id(new PhabricatorChangesetResponse())->setRenderedChangeset($output);
     }
     require_celerity_resource('differential-changeset-view-css');
     require_celerity_resource('syntax-highlighting-css');
     require_celerity_resource('phriction-document-css');
     Javelin::initBehavior('differential-show-more', array('uri' => '/phriction/diff/' . $document->getID() . '/', 'whitespace' => $whitespace_mode));
     $slug = $document->getSlug();
     $revert_l = $this->renderRevertButton($content_l, $current);
     $revert_r = $this->renderRevertButton($content_r, $current);
     $crumbs = $this->buildApplicationCrumbs();
     $crumb_views = $this->renderBreadcrumbs($slug);
     foreach ($crumb_views as $view) {
         $crumbs->addCrumb($view);
     }
     $crumbs->addTextCrumb(pht('History'), PhrictionDocument::getSlugURI($slug, 'history'));
     $title = pht('Version %s vs %s', $l, $r);
     $header = id(new PHUIHeaderView())->setHeader($title);
     $crumbs->addTextCrumb($title, $request->getRequestURI());
     $comparison_table = $this->renderComparisonTable(array($content_r, $content_l));
     $navigation_table = null;
     if ($l + 1 == $r) {
         $nav_l = $l > 1;
         $nav_r = $r != $current->getVersion();
         $uri = $request->getRequestURI();
         if ($nav_l) {
             $link_l = phutil_tag('a', array('href' => $uri->alter('l', $l - 1)->alter('r', $r - 1), 'class' => 'button'), pht("« Previous Change"));
         } else {
             $link_l = phutil_tag('a', array('href' => '#', 'class' => 'button grey disabled'), pht('Original Change'));
         }
         $link_r = null;
         if ($nav_r) {
             $link_r = phutil_tag('a', array('href' => $uri->alter('l', $l + 1)->alter('r', $r + 1), 'class' => 'button'), pht("Next Change »"));
         } else {
             $link_r = phutil_tag('a', array('href' => '#', 'class' => 'button grey disabled'), pht('Most Recent Change'));
         }
         $navigation_table = phutil_tag('table', array('class' => 'phriction-history-nav-table'), phutil_tag('tr', array(), array(phutil_tag('td', array('class' => 'nav-prev'), $link_l), phutil_tag('td', array('class' => 'nav-next'), $link_r))));
     }
     $output = hsprintf('<div class="phriction-document-history-diff">' . '%s%s' . '<table class="phriction-revert-table">' . '<tr><td>%s</td><td>%s</td>' . '</table>' . '%s' . '</div>', $comparison_table->render(), $navigation_table, $revert_l, $revert_r, $output);
     $object_box = id(new PHUIObjectBoxView())->setHeader($header)->appendChild($output);
     return $this->buildApplicationPage(array($crumbs, $object_box), array('title' => pht('Document History')));
 }
 public function testUTF8NonHTMLWrap()
 {
     $inputs = array(array('aaaaaaa', 3, array('aaa', 'aaa', 'a')), array('abracadabra!', 4, array('abra', 'cada', 'bra!')), array('', 10, array()), array('a', 20, array('a')), array("aa東aaaa", 3, array("aa東", 'aaa', 'a')), array("mmm\nmmm\nmmmm", 3, array('mmm', 'mmm', 'mmm', 'm')));
     foreach ($inputs as $input) {
         list($string, $width, $expect) = $input;
         $this->assertEqual($expect, phutil_utf8_hard_wrap($string, $width), "Wrapping of '" . $string . "'");
     }
 }