private function markupText($markup_file)
 {
     $contents = Filesystem::readFile($markup_file);
     $file = basename($markup_file);
     $parts = explode("\n~~~~~~~~~~\n", $contents);
     $this->assertEqual(3, count($parts), $markup_file);
     list($input_remarkup, $expected_output, $expected_text) = $parts;
     $engine = $this->buildNewTestEngine();
     switch ($file) {
         case 'raw-escape.txt':
             // NOTE: Here, we want to test PhutilRemarkupEscapeRemarkupRule and
             // PhutilRemarkupBlockStorage, which are triggered by "\1". In the
             // test, "~" is used as a placeholder for "\1" since it's hard to type
             // "\1".
             $input_remarkup = str_replace('~', "", $input_remarkup);
             $expected_output = str_replace('~', "", $expected_output);
             $expected_text = str_replace('~', "", $expected_text);
             break;
         case 'toc.txt':
             $engine->setConfig('header.generate-toc', true);
             break;
     }
     $actual_output = (string) $engine->markupText($input_remarkup);
     switch ($file) {
         case 'toc.txt':
             $table_of_contents = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
             $actual_output = $table_of_contents . "\n\n" . $actual_output;
             break;
     }
     $this->assertEqual($expected_output, $actual_output, pht("Failed to markup HTML in file '%s'.", $file));
     $engine->setMode(PhutilRemarkupEngine::MODE_TEXT);
     $actual_output = (string) $engine->markupText($input_remarkup);
     $this->assertEqual($expected_text, $actual_output, pht("Failed to markup text in file '%s'.", $file));
 }
 /**
  * @task markup
  */
 public function didMarkupText($field, $output, PhutilMarkupEngine $engine)
 {
     $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
     if ($toc) {
         $toc = phutil_tag_div('phabricator-remarkup-toc', array(phutil_tag_div('phabricator-remarkup-toc-header', pht('Table of Contents')), $toc));
     }
     return phutil_tag_div('phabricator-remarkup', array($toc, $output));
 }
 /**
  * @task markup
  */
 public function didMarkupText($field, $output, PhutilMarkupEngine $engine)
 {
     $classes = array();
     $classes[] = 'phabricator-remarkup';
     $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
     if ($toc) {
         $classes[] = 'remarkup-has-toc';
         $toc = phutil_tag_div('phabricator-remarkup-toc', array(phutil_tag_div('phabricator-remarkup-toc-header', pht('Table of Contents')), $toc));
     }
     return phutil_tag('div', array('class' => implode(' ', $classes)), array($toc, $output));
 }
 public function render()
 {
     $readme_path = $this->getPath();
     $readme_name = basename($readme_path);
     $interpreter = $this->getReadmeLanguage($readme_name);
     require_celerity_resource('diffusion-readme-css');
     $content = $this->getContent();
     $class = null;
     switch ($interpreter) {
         case 'remarkup':
             // TODO: This is sketchy, but make sure we hit the markup cache.
             $markup_object = id(new PhabricatorMarkupOneOff())->setEngineRuleset('diffusion-readme')->setContent($content);
             $markup_field = 'default';
             $content = id(new PhabricatorMarkupEngine())->setViewer($this->getUser())->addObject($markup_object, $markup_field)->process()->getOutput($markup_object, $markup_field);
             $engine = $markup_object->newMarkupEngine($markup_field);
             $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
             if ($toc) {
                 $toc = phutil_tag_div('phabricator-remarkup-toc', array(phutil_tag_div('phabricator-remarkup-toc-header', pht('Table of Contents')), $toc));
                 $content = array($toc, $content);
             }
             $readme_content = $content;
             $class = null;
             break;
         case 'rainbow':
             $content = id(new PhutilRainbowSyntaxHighlighter())->getHighlightFuture($content)->resolve();
             $readme_content = phutil_escape_html_newlines($content);
             require_celerity_resource('syntax-highlighting-css');
             $class = 'remarkup-code ml';
             break;
         default:
         case 'text':
             $readme_content = phutil_escape_html_newlines($content);
             $class = 'ml';
             break;
     }
     $readme_content = phutil_tag_div($class, $readme_content);
     $header = id(new PHUIHeaderView())->setHeader($readme_name);
     $document = id(new PHUIDocumentViewPro())->setFluid(true)->appendChild($readme_content);
     return id(new PHUIObjectBoxView())->setHeader($header)->appendChild($document)->addClass('diffusion-readme-view');
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $path_dicts = $request->getValue('paths', array());
     $paths = array();
     foreach ($path_dicts as $dict) {
         $paths[] = DiffusionRepositoryPath::newFromDictionary($dict);
     }
     $best = -1;
     $readme = '';
     $best_render_type = 'plain';
     foreach ($paths as $result_path) {
         $file_type = $result_path->getFileType();
         if ($file_type != ArcanistDiffChangeType::FILE_NORMAL && $file_type != ArcanistDiffChangeType::FILE_TEXT) {
             // Skip directories, etc.
             continue;
         }
         $path = strtolower($result_path->getPath());
         if ($path === 'readme') {
             $path .= '.remarkup';
         }
         if (strncmp($path, 'readme.', 7) !== 0) {
             continue;
         }
         $priority = 0;
         switch (substr($path, 7)) {
             case 'remarkup':
                 $priority = 100;
                 $render_type = 'remarkup';
                 break;
             case 'rainbow':
                 $priority = 90;
                 $render_type = 'rainbow';
                 break;
             case 'md':
                 $priority = 50;
                 $render_type = 'remarkup';
                 break;
             case 'txt':
                 $priority = 10;
                 $render_type = 'plain';
                 break;
             default:
                 $priority = 0;
                 $render_type = 'plain';
                 break;
         }
         if ($priority > $best) {
             $best = $priority;
             $readme = $result_path;
             $best_render_type = $render_type;
         }
     }
     if (!$readme) {
         return '';
     }
     $readme_request = DiffusionRequest::newFromDictionary(array('user' => $request->getUser(), 'repository' => $drequest->getRepository(), 'commit' => $drequest->getStableCommit(), 'path' => $readme->getFullPath()));
     $file_content = DiffusionFileContent::newFromConduit(DiffusionQuery::callConduitWithDiffusionRequest($request->getUser(), $readme_request, 'diffusion.filecontentquery', array('commit' => $drequest->getStableCommit(), 'path' => $readme->getFullPath(), 'needsBlame' => false)));
     $readme_content = $file_content->getCorpus();
     switch ($best_render_type) {
         case 'plain':
             $readme_content = phutil_escape_html_newlines($readme_content);
             $class = null;
             break;
         case 'rainbow':
             $highlighter = new PhutilRainbowSyntaxHighlighter();
             $readme_content = $highlighter->getHighlightFuture($readme_content)->resolve();
             $readme_content = phutil_escape_html_newlines($readme_content);
             require_celerity_resource('syntax-highlighting-css');
             $class = 'remarkup-code';
             break;
         case 'remarkup':
             // TODO: This is sketchy, but make sure we hit the markup cache.
             $markup_object = id(new PhabricatorMarkupOneOff())->setEngineRuleset('diffusion-readme')->setContent($readme_content);
             $markup_field = 'default';
             $readme_content = id(new PhabricatorMarkupEngine())->setViewer($request->getUser())->addObject($markup_object, $markup_field)->process()->getOutput($markup_object, $markup_field);
             $engine = $markup_object->newMarkupEngine($markup_field);
             $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
             if ($toc) {
                 $toc = phutil_tag_div('phabricator-remarkup-toc', array(phutil_tag_div('phabricator-remarkup-toc-header', pht('Table of Contents')), $toc));
                 $readme_content = array($toc, $readme_content);
             }
             $class = 'phabricator-remarkup';
             break;
     }
     $readme_content = phutil_tag('div', array('class' => $class), $readme_content);
     return $readme_content;
 }
 /**
  * @task markup
  */
 public function didMarkupText($field, $output, PhutilMarkupEngine $engine)
 {
     $this->renderedTableOfContents = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
     return phutil_tag('div', array('class' => 'phabricator-remarkup'), $output);
 }