Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15417690
D19301.id46189.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
20 KB
Referenced Files
None
Subscribers
None
D19301.id46189.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2819,6 +2819,7 @@
'PhabricatorDivinerApplication' => 'applications/diviner/application/PhabricatorDivinerApplication.php',
'PhabricatorDocumentEngine' => 'applications/files/document/PhabricatorDocumentEngine.php',
'PhabricatorDocumentRef' => 'applications/files/document/PhabricatorDocumentRef.php',
+ 'PhabricatorDocumentRenderingEngine' => 'applications/files/document/render/PhabricatorDocumentRenderingEngine.php',
'PhabricatorDoorkeeperApplication' => 'applications/doorkeeper/application/PhabricatorDoorkeeperApplication.php',
'PhabricatorDraft' => 'applications/draft/storage/PhabricatorDraft.php',
'PhabricatorDraftDAO' => 'applications/draft/storage/PhabricatorDraftDAO.php',
@@ -3010,6 +3011,7 @@
'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php',
'PhabricatorFileDeleteTransaction' => 'applications/files/xaction/PhabricatorFileDeleteTransaction.php',
'PhabricatorFileDocumentController' => 'applications/files/controller/PhabricatorFileDocumentController.php',
+ 'PhabricatorFileDocumentRenderingEngine' => 'applications/files/document/render/PhabricatorFileDocumentRenderingEngine.php',
'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php',
'PhabricatorFileEditController' => 'applications/files/controller/PhabricatorFileEditController.php',
'PhabricatorFileEditEngine' => 'applications/files/editor/PhabricatorFileEditEngine.php',
@@ -8401,6 +8403,7 @@
'PhabricatorDivinerApplication' => 'PhabricatorApplication',
'PhabricatorDocumentEngine' => 'Phobject',
'PhabricatorDocumentRef' => 'Phobject',
+ 'PhabricatorDocumentRenderingEngine' => 'Phobject',
'PhabricatorDoorkeeperApplication' => 'PhabricatorApplication',
'PhabricatorDraft' => 'PhabricatorDraftDAO',
'PhabricatorDraftDAO' => 'PhabricatorLiskDAO',
@@ -8624,6 +8627,7 @@
'PhabricatorFileDeleteController' => 'PhabricatorFileController',
'PhabricatorFileDeleteTransaction' => 'PhabricatorFileTransactionType',
'PhabricatorFileDocumentController' => 'PhabricatorFileController',
+ 'PhabricatorFileDocumentRenderingEngine' => 'PhabricatorDocumentRenderingEngine',
'PhabricatorFileDropUploadController' => 'PhabricatorFileController',
'PhabricatorFileEditController' => 'PhabricatorFileController',
'PhabricatorFileEditEngine' => 'PhabricatorEditEngine',
diff --git a/src/applications/files/application/PhabricatorFilesApplication.php b/src/applications/files/application/PhabricatorFilesApplication.php
--- a/src/applications/files/application/PhabricatorFilesApplication.php
+++ b/src/applications/files/application/PhabricatorFilesApplication.php
@@ -73,7 +73,7 @@
=> 'PhabricatorFileViewController',
'/file/' => array(
'(query/(?P<queryKey>[^/]+)/)?' => 'PhabricatorFileListController',
- 'view/(?P<id>[^/]+)/'.
+ 'view/(?P<id>[1-9]\d*)/'.
'(?:(?P<engineKey>[^/]+)/)?'.
'(?:\$(?P<lines>\d+(?:-\d+)?))?'
=> 'PhabricatorFileViewController',
diff --git a/src/applications/files/controller/PhabricatorFileDocumentController.php b/src/applications/files/controller/PhabricatorFileDocumentController.php
--- a/src/applications/files/controller/PhabricatorFileDocumentController.php
+++ b/src/applications/files/controller/PhabricatorFileDocumentController.php
@@ -3,10 +3,6 @@
final class PhabricatorFileDocumentController
extends PhabricatorFileController {
- private $file;
- private $engine;
- private $ref;
-
public function shouldAllowPublic() {
return true;
}
@@ -26,102 +22,14 @@
'This file ("%s") does not exist or could not be loaded.',
$file_phid));
}
- $this->file = $file;
$ref = id(new PhabricatorDocumentRef())
->setFile($file);
- $this->ref = $ref;
-
- $engines = PhabricatorDocumentEngine::getEnginesForRef($viewer, $ref);
- $engine_key = $request->getURIData('engineKey');
- if (!isset($engines[$engine_key])) {
- return $this->newErrorResponse(
- pht(
- 'The engine ("%s") is unknown, or unable to render this document.',
- $engine_key));
- }
- $engine = $engines[$engine_key];
- $this->engine = $engine;
-
- $encode_setting = $request->getStr('encode');
- if (strlen($encode_setting)) {
- $engine->setEncodingConfiguration($encode_setting);
- }
-
- $highlight_setting = $request->getStr('highlight');
- if (strlen($highlight_setting)) {
- $engine->setHighlightingConfiguration($highlight_setting);
- }
-
- try {
- $content = $engine->newDocument($ref);
- } catch (Exception $ex) {
- return $this->newErrorResponse($ex->getMessage());
- }
-
- return $this->newContentResponse($content);
- }
-
- private function newErrorResponse($message) {
- $container = phutil_tag(
- 'div',
- array(
- 'class' => 'document-engine-error',
- ),
- array(
- id(new PHUIIconView())
- ->setIcon('fa-exclamation-triangle red'),
- ' ',
- $message,
- ));
-
- return $this->newContentResponse($container);
- }
-
-
- private function newContentResponse($content) {
- $viewer = $this->getViewer();
- $request = $this->getRequest();
-
- $file = $this->file;
- $engine = $this->engine;
- $ref = $this->ref;
-
- if ($request->isAjax()) {
- return id(new AphrontAjaxResponse())
- ->setContent(
- array(
- 'markup' => hsprintf('%s', $content),
- ));
- }
-
- $crumbs = $this->buildApplicationCrumbs();
- if ($file) {
- $crumbs->addTextCrumb($file->getMonogram(), $file->getInfoURI());
- }
-
- $label = $engine->getViewAsLabel($ref);
- if ($label) {
- $crumbs->addTextCrumb($label);
- }
-
- $crumbs->setBorder(true);
-
- $content_frame = id(new PHUIObjectBoxView())
- ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
- ->appendChild($content);
-
- $page_frame = id(new PHUITwoColumnView())
- ->setFooter($content_frame);
- return $this->newPage()
- ->setCrumbs($crumbs)
- ->setTitle(
- array(
- $ref->getName(),
- pht('Standalone'),
- ))
- ->appendChild($page_frame);
+ return id(new PhabricatorFileDocumentRenderingEngine())
+ ->setRequest($request)
+ ->setController($this)
+ ->newRenderResponse($ref);
}
}
diff --git a/src/applications/files/controller/PhabricatorFileViewController.php b/src/applications/files/controller/PhabricatorFileViewController.php
--- a/src/applications/files/controller/PhabricatorFileViewController.php
+++ b/src/applications/files/controller/PhabricatorFileViewController.php
@@ -403,122 +403,15 @@
}
private function newFileContent(PhabricatorFile $file) {
- $viewer = $this->getViewer();
$request = $this->getRequest();
$ref = id(new PhabricatorDocumentRef())
->setFile($file);
- $engines = PhabricatorDocumentEngine::getEnginesForRef($viewer, $ref);
-
- $engine_key = $request->getURIData('engineKey');
- if (!isset($engines[$engine_key])) {
- $engine_key = head_key($engines);
- }
- $engine = $engines[$engine_key];
-
- $lines = $request->getURILineRange('lines', 1000);
- if ($lines) {
- $engine->setHighlightedLines(range($lines[0], $lines[1]));
- }
-
- $encode_setting = $request->getStr('encode');
- if (strlen($encode_setting)) {
- $engine->setEncodingConfiguration($encode_setting);
- }
-
- $highlight_setting = $request->getStr('highlight');
- if (strlen($highlight_setting)) {
- $engine->setHighlightingConfiguration($highlight_setting);
- }
+ $engine = id(new PhabricatorFileDocumentRenderingEngine())
+ ->setRequest($request);
- $views = array();
- foreach ($engines as $candidate_key => $candidate_engine) {
- $label = $candidate_engine->getViewAsLabel($ref);
- if ($label === null) {
- continue;
- }
-
- $view_uri = '/file/view/'.$file->getID().'/'.$candidate_key.'/';
-
- $view_icon = $candidate_engine->getViewAsIconIcon($ref);
- $view_color = $candidate_engine->getViewAsIconColor($ref);
- $loading = $candidate_engine->newLoadingContent($ref);
-
- $views[] = array(
- 'viewKey' => $candidate_engine->getDocumentEngineKey(),
- 'icon' => $view_icon,
- 'color' => $view_color,
- 'name' => $label,
- 'engineURI' => $candidate_engine->getRenderURI($ref),
- 'viewURI' => $view_uri,
- 'loadingMarkup' => hsprintf('%s', $loading),
- 'canEncode' => $candidate_engine->canConfigureEncoding($ref),
- 'canHighlight' => $candidate_engine->CanConfigureHighlighting($ref),
- );
- }
-
- $viewport_id = celerity_generate_unique_node_id();
- $control_id = celerity_generate_unique_node_id();
- $icon = $engine->newDocumentIcon($ref);
-
- if ($engine->shouldRenderAsync($ref)) {
- $content = $engine->newLoadingContent($ref);
- $config = array(
- 'renderControlID' => $control_id,
- );
- } else {
- $content = $engine->newDocument($ref);
- $config = array();
- }
-
- Javelin::initBehavior('document-engine', $config);
-
- $viewport = phutil_tag(
- 'div',
- array(
- 'id' => $viewport_id,
- ),
- $content);
-
- $meta = array(
- 'viewportID' => $viewport_id,
- 'viewKey' => $engine->getDocumentEngineKey(),
- 'views' => $views,
- 'standaloneURI' => $engine->getRenderURI($ref),
- 'encode' => array(
- 'icon' => 'fa-font',
- 'name' => pht('Change Text Encoding...'),
- 'uri' => '/services/encoding/',
- 'value' => $encode_setting,
- ),
- 'highlight' => array(
- 'icon' => 'fa-lightbulb-o',
- 'name' => pht('Highlight As...'),
- 'uri' => '/services/highlight/',
- 'value' => $highlight_setting,
- ),
- );
-
- $view_button = id(new PHUIButtonView())
- ->setTag('a')
- ->setText(pht('View Options'))
- ->setIcon('fa-file-image-o')
- ->setColor(PHUIButtonView::GREY)
- ->setID($control_id)
- ->setMetadata($meta)
- ->setDropdown(true)
- ->addSigil('document-engine-view-dropdown');
-
- $header = id(new PHUIHeaderView())
- ->setHeaderIcon($icon)
- ->setHeader($ref->getName())
- ->addActionLink($view_button);
-
- return id(new PHUIObjectBoxView())
- ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
- ->setHeader($header)
- ->appendChild($viewport);
+ return $engine->newDocumentView($ref);
}
}
diff --git a/src/applications/files/document/PhabricatorDocumentEngine.php b/src/applications/files/document/PhabricatorDocumentEngine.php
--- a/src/applications/files/document/PhabricatorDocumentEngine.php
+++ b/src/applications/files/document/PhabricatorDocumentEngine.php
@@ -152,18 +152,6 @@
return null;
}
- public function getRenderURI(PhabricatorDocumentRef $ref) {
- $file = $ref->getFile();
- if (!$file) {
- throw new PhutilMethodNotImplementedException();
- }
-
- $engine_key = $this->getDocumentEngineKey();
- $file_phid = $file->getPHID();
-
- return "/file/document/{$engine_key}/{$file_phid}/";
- }
-
final public static function getEnginesForRef(
PhabricatorUser $viewer,
PhabricatorDocumentRef $ref) {
diff --git a/src/applications/files/document/render/PhabricatorDocumentRenderingEngine.php b/src/applications/files/document/render/PhabricatorDocumentRenderingEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/files/document/render/PhabricatorDocumentRenderingEngine.php
@@ -0,0 +1,285 @@
+<?php
+
+abstract class PhabricatorDocumentRenderingEngine
+ extends Phobject {
+
+ private $request;
+ private $controller;
+ private $activeEngine;
+
+ final public function setRequest(AphrontRequest $request) {
+ $this->request = $request;
+ return $this;
+ }
+
+ final public function getRequest() {
+ if (!$this->request) {
+ throw new PhutilInvalidStateException('setRequest');
+ }
+
+ return $this->request;
+ }
+
+ final public function setController(PhabricatorController $controller) {
+ $this->controller = $controller;
+ return $this;
+ }
+
+ final public function getController() {
+ if (!$this->controller) {
+ throw new PhutilInvalidStateException('setController');
+ }
+
+ return $this->controller;
+ }
+
+ final protected function getActiveEngine() {
+ if (!$this->activeEngine) {
+ throw new PhutilInvalidStateException('setActiveEngine');
+ }
+
+ return $this->activeEngine;
+ }
+
+ final public function newDocumentView(PhabricatorDocumentRef $ref) {
+ $request = $this->getRequest();
+ $viewer = $request->getViewer();
+
+ $engines = PhabricatorDocumentEngine::getEnginesForRef($viewer, $ref);
+
+ $engine_key = $this->getSelectedDocumentEngineKey();
+ if (!isset($engines[$engine_key])) {
+ $engine_key = head_key($engines);
+ }
+ $engine = $engines[$engine_key];
+
+ $lines = $request->getURILineRange('lines', 1000);
+ if ($lines) {
+ $engine->setHighlightedLines(range($lines[0], $lines[1]));
+ }
+
+ $encode_setting = $request->getStr('encode');
+ if (strlen($encode_setting)) {
+ $engine->setEncodingConfiguration($encode_setting);
+ }
+
+ $highlight_setting = $request->getStr('highlight');
+ if (strlen($highlight_setting)) {
+ $engine->setHighlightingConfiguration($highlight_setting);
+ }
+
+ $views = array();
+ foreach ($engines as $candidate_key => $candidate_engine) {
+ $label = $candidate_engine->getViewAsLabel($ref);
+ if ($label === null) {
+ continue;
+ }
+
+ $view_uri = $this->newRefViewURI($ref, $candidate_engine);
+
+ $view_icon = $candidate_engine->getViewAsIconIcon($ref);
+ $view_color = $candidate_engine->getViewAsIconColor($ref);
+ $loading = $candidate_engine->newLoadingContent($ref);
+
+ $views[] = array(
+ 'viewKey' => $candidate_engine->getDocumentEngineKey(),
+ 'icon' => $view_icon,
+ 'color' => $view_color,
+ 'name' => $label,
+ 'engineURI' => $this->newRefRenderURI($ref, $candidate_engine),
+ 'viewURI' => $view_uri,
+ 'loadingMarkup' => hsprintf('%s', $loading),
+ 'canEncode' => $candidate_engine->canConfigureEncoding($ref),
+ 'canHighlight' => $candidate_engine->CanConfigureHighlighting($ref),
+ );
+ }
+
+ $viewport_id = celerity_generate_unique_node_id();
+ $control_id = celerity_generate_unique_node_id();
+ $icon = $engine->newDocumentIcon($ref);
+
+ if ($engine->shouldRenderAsync($ref)) {
+ $content = $engine->newLoadingContent($ref);
+ $config = array(
+ 'renderControlID' => $control_id,
+ );
+ } else {
+ $content = $engine->newDocument($ref);
+ $config = array();
+ }
+
+ Javelin::initBehavior('document-engine', $config);
+
+ $viewport = phutil_tag(
+ 'div',
+ array(
+ 'id' => $viewport_id,
+ ),
+ $content);
+
+ $meta = array(
+ 'viewportID' => $viewport_id,
+ 'viewKey' => $engine->getDocumentEngineKey(),
+ 'views' => $views,
+ 'encode' => array(
+ 'icon' => 'fa-font',
+ 'name' => pht('Change Text Encoding...'),
+ 'uri' => '/services/encoding/',
+ 'value' => $encode_setting,
+ ),
+ 'highlight' => array(
+ 'icon' => 'fa-lightbulb-o',
+ 'name' => pht('Highlight As...'),
+ 'uri' => '/services/highlight/',
+ 'value' => $highlight_setting,
+ ),
+ );
+
+ $view_button = id(new PHUIButtonView())
+ ->setTag('a')
+ ->setText(pht('View Options'))
+ ->setIcon('fa-file-image-o')
+ ->setColor(PHUIButtonView::GREY)
+ ->setID($control_id)
+ ->setMetadata($meta)
+ ->setDropdown(true)
+ ->addSigil('document-engine-view-dropdown');
+
+ $header = id(new PHUIHeaderView())
+ ->setHeaderIcon($icon)
+ ->setHeader($ref->getName())
+ ->addActionLink($view_button);
+
+ return id(new PHUIObjectBoxView())
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->setHeader($header)
+ ->appendChild($viewport);
+ }
+
+ abstract protected function newRefViewURI(
+ PhabricatorDocumentRef $ref,
+ PhabricatorDocumentEngine $engine);
+
+ abstract protected function newRefRenderURI(
+ PhabricatorDocumentRef $ref,
+ PhabricatorDocumentEngine $engine);
+
+ protected function getSelectedDocumentEngineKey() {
+ return $this->getRequest()->getURIData('engineKey');
+ }
+
+ final public function newRenderResponse(PhabricatorDocumentRef $ref) {
+ $request = $this->getRequest();
+ $viewer = $request->getViewer();
+
+ $engines = PhabricatorDocumentEngine::getEnginesForRef($viewer, $ref);
+ $engine_key = $request->getURIData('engineKey');
+ if (!isset($engines[$engine_key])) {
+ return $this->newErrorResponse(
+ $ref,
+ pht(
+ 'The engine ("%s") is unknown, or unable to render this document.',
+ $engine_key));
+ }
+ $engine = $engines[$engine_key];
+
+ $this->activeEngine = $engine;
+
+ $encode_setting = $request->getStr('encode');
+ if (strlen($encode_setting)) {
+ $engine->setEncodingConfiguration($encode_setting);
+ }
+
+ $highlight_setting = $request->getStr('highlight');
+ if (strlen($highlight_setting)) {
+ $engine->setHighlightingConfiguration($highlight_setting);
+ }
+
+ try {
+ $content = $engine->newDocument($ref);
+ } catch (Exception $ex) {
+ return $this->newErrorResponse($ref, $ex->getMessage());
+ }
+
+ return $this->newContentResponse($ref, $content);
+ }
+
+ private function newErrorResponse(
+ PhabricatorDocumentRef $ref,
+ $message) {
+
+ $container = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'document-engine-error',
+ ),
+ array(
+ id(new PHUIIconView())
+ ->setIcon('fa-exclamation-triangle red'),
+ ' ',
+ $message,
+ ));
+
+ return $this->newContentResponse($ref, $container);
+ }
+
+ private function newContentResponse(
+ PhabricatorDocumentRef $ref,
+ $content) {
+
+ $request = $this->getRequest();
+ $viewer = $request->getViewer();
+ $controller = $this->getController();
+
+ if ($request->isAjax()) {
+ return id(new AphrontAjaxResponse())
+ ->setContent(
+ array(
+ 'markup' => hsprintf('%s', $content),
+ ));
+ }
+
+ $crumbs = $this->newCrumbs($ref);
+ if ($crumbs) {
+ $crumbs->setBorder(true);
+ }
+
+ $content_frame = id(new PHUIObjectBoxView())
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->appendChild($content);
+
+ $page_frame = id(new PHUITwoColumnView())
+ ->setFooter($content_frame);
+
+ return $controller->newPage()
+ ->setCrumbs($crumbs)
+ ->setTitle(
+ array(
+ $ref->getName(),
+ pht('Standalone'),
+ ))
+ ->appendChild($page_frame);
+ }
+
+ protected function newCrumbs(PhabricatorDocumentRef $ref) {
+ $controller = $this->getController();
+ $crumbs = $controller->buildApplicationCrumbsForEditEngine();
+
+ $this->addApplicationCrumbs($ref, $crumbs);
+
+ $engine = $this->getActiveEngine();
+ $label = $engine->getViewAsLabel($ref);
+ if ($label) {
+ $crumbs->addTextCrumb($label);
+ }
+
+ return $crumbs;
+ }
+
+ protected function addApplicationCrumbs(
+ PhabricatorDocumentRef $ref,
+ PHUICrumbsView $crumbs) {
+ return;
+ }
+
+}
diff --git a/src/applications/files/document/render/PhabricatorFileDocumentRenderingEngine.php b/src/applications/files/document/render/PhabricatorFileDocumentRenderingEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/files/document/render/PhabricatorFileDocumentRenderingEngine.php
@@ -0,0 +1,47 @@
+<?php
+
+final class PhabricatorFileDocumentRenderingEngine
+ extends PhabricatorDocumentRenderingEngine {
+
+ protected function newRefViewURI(
+ PhabricatorDocumentRef $ref,
+ PhabricatorDocumentEngine $engine) {
+
+ $file = $ref->getFile();
+ $engine_key = $engine->getDocumentEngineKey();
+
+ return urisprintf(
+ '/file/view/%d/%s/',
+ $file->getID(),
+ $engine_key);
+ }
+
+ protected function newRefRenderURI(
+ PhabricatorDocumentRef $ref,
+ PhabricatorDocumentEngine $engine) {
+ $file = $ref->getFile();
+ if (!$file) {
+ throw new PhutilMethodNotImplementedException();
+ }
+
+ $engine_key = $engine->getDocumentEngineKey();
+ $file_phid = $file->getPHID();
+
+ return urisprintf(
+ '/file/document/%s/%s/',
+ $engine_key,
+ $file_phid);
+ }
+
+ protected function addApplicationCrumbs(
+ PhabricatorDocumentRef $ref,
+ PHUICrumbsView $crumbs) {
+
+ $file = $ref->getFile();
+ if ($file) {
+ $crumbs->addTextCrumb($file->getMonogram(), $file->getInfoURI());
+ }
+
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 21, 5:54 PM (1 d, 5 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7715833
Default Alt Text
D19301.id46189.diff (20 KB)
Attached To
Mode
D19301: Pull file Document Engine rendering out of "Files" application controllers
Attached
Detach File
Event Timeline
Log In to Comment