<?php

final class PhabricatorSourceDocumentEngine
  extends PhabricatorTextDocumentEngine {

  const ENGINEKEY = 'source';

  public function getViewAsLabel(PhabricatorDocumentRef $ref) {
    return pht('View as Source');
  }

  public function canConfigureHighlighting(PhabricatorDocumentRef $ref) {
    return true;
  }

  protected function getDocumentIconIcon(PhabricatorDocumentRef $ref) {
    return 'fa-code';
  }

  protected function getContentScore(PhabricatorDocumentRef $ref) {
    return 1500;
  }

  protected function newDocumentContent(PhabricatorDocumentRef $ref) {
    $content = $this->loadTextData($ref);

    $messages = array();

    $highlighting = $this->getHighlightingConfiguration();
    if ($highlighting !== null) {
      $content = PhabricatorSyntaxHighlighter::highlightWithLanguage(
        $highlighting,
        $content);
    } else {
      $highlight_limit = DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT;
      if (strlen($content) > $highlight_limit) {
        $messages[] = $this->newMessage(
          pht(
            'This file is larger than %s, so syntax highlighting was skipped.',
            phutil_format_bytes($highlight_limit)));
      } else {
        $content = PhabricatorSyntaxHighlighter::highlightWithFilename(
          $ref->getName(),
          $content);
      }
    }

    return array(
      $messages,
      $this->newTextDocumentContent($content),
    );
  }

}

<?php

final class PhabricatorSourceDocumentEngine
  extends PhabricatorTextDocumentEngine {

  const ENGINEKEY = 'source';

  public function getViewAsLabel(PhabricatorDocumentRef $ref) {
    return pht('View as Source');
  }

  public function canConfigureHighlighting(PhabricatorDocumentRef $ref) {
    return true;
  }

  protected function getDocumentIconIcon(PhabricatorDocumentRef $ref) {
    return 'fa-code';
  }

  protected function getContentScore(PhabricatorDocumentRef $ref) {
    return 1500;
  }

  protected function newDocumentContent(PhabricatorDocumentRef $ref) {
    $content = $this->loadTextData($ref);

    $highlighting = $this->getHighlightingConfiguration();
    if ($highlighting !== null) {
      $content = PhabricatorSyntaxHighlighter::highlightWithLanguage(
        $highlighting,
        $content);
    } else {
      $content = PhabricatorSyntaxHighlighter::highlightWithFilename(
        $ref->getName(),
        $content);
    }

    return $this->newTextDocumentContent($content);
  }

}

--- 
+++ 
@@ -24,18 +24,31 @@
   protected function newDocumentContent(PhabricatorDocumentRef $ref) {
     $content = $this->loadTextData($ref);
 
+    $messages = array();
+
     $highlighting = $this->getHighlightingConfiguration();
     if ($highlighting !== null) {
       $content = PhabricatorSyntaxHighlighter::highlightWithLanguage(
         $highlighting,
         $content);
     } else {
-      $content = PhabricatorSyntaxHighlighter::highlightWithFilename(
-        $ref->getName(),
-        $content);
+      $highlight_limit = DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT;
+      if (strlen($content) > $highlight_limit) {
+        $messages[] = $this->newMessage(
+          pht(
+            'This file is larger than %s, so syntax highlighting was skipped.',
+            phutil_format_bytes($highlight_limit)));
+      } else {
+        $content = PhabricatorSyntaxHighlighter::highlightWithFilename(
+          $ref->getName(),
+          $content);
+      }
     }
 
-    return $this->newTextDocumentContent($content);
+    return array(
+      $messages,
+      $this->newTextDocumentContent($content),
+    );
   }
 
 }
Disable default syntax highlighting for large files in DocumentEngine

Summary: Ref T13105. See also T7895. When users render very large files as source via DocumentEngine, skip highlighting.

Test Plan: Fiddled with the limit, viewed files, saw highlighting degrade.

Reviewers: mydeveloperday

Reviewed By: mydeveloperday

Maniphest Tasks: T13105

Differential Revision: https://secure.phabricator.com/D19306
