diff --git a/externals/skins/oblivious/header.php b/externals/skins/oblivious/header.php index b7aadc236..c3e7a4d60 100644 --- a/externals/skins/oblivious/header.php +++ b/externals/skins/oblivious/header.php @@ -1,18 +1,18 @@ <?php echo _e($title); ?> getCSSResources(); ?>

- ">getName()); ?>

getDescription()); ?>

diff --git a/src/applications/phame/skins/PhameBasicBlogSkin.php b/src/applications/phame/skins/PhameBasicBlogSkin.php index 60dea6a46..800f02e3d 100644 --- a/src/applications/phame/skins/PhameBasicBlogSkin.php +++ b/src/applications/phame/skins/PhameBasicBlogSkin.php @@ -1,304 +1,315 @@ uriPath = $uri_path; + return $this; + } + public function getURIPath() { + return $this->uriPath; + } protected function setOGType($og_type) { $this->oGType = $og_type; return $this; } protected function getOGType() { return $this->oGType; } protected function setDescription($description) { $this->description = $description; return $this; } protected function getDescription() { return $this->description; } protected function setTitle($title) { $this->title = $title; return $this; } protected function getTitle() { return $this->title; } public function processRequest() { $request = $this->getRequest(); $content = $this->renderContent($request); if (!$content) { $content = $this->render404Page(); } $content = array( $this->renderHeader(), $content, $this->renderFooter(), ); $view = id(new PhabricatorBarePageView()) ->setRequest($request) ->setController($this) ->setDeviceReady(true) ->setTitle($this->getBlog()->getName()); if ($this->getPreview()) { $view->setFrameable(true); } $view->appendChild($content); $response = new AphrontWebpageResponse(); $response->setContent($view->render()); return $response; } public function getSkinName() { return get_class($this); } abstract protected function renderHeader(); abstract protected function renderFooter(); protected function renderPostDetail(PhamePostView $post) { return $post; } protected function renderPostList(array $posts) { $summaries = array(); foreach ($posts as $post) { $summaries[] = $post->renderWithSummary(); } $list = phutil_render_tag( 'div', array( 'class' => 'phame-post-list', ), id(new AphrontNullView())->appendChild($summaries)->render()); $pager = $this->renderOlderPageLink().$this->renderNewerPageLink(); if ($pager) { $pager = phutil_render_tag( 'div', array( 'class' => 'phame-pager', )); } return $list.$pager; } protected function render404Page() { return '

404 Not Found

'; } final public function getResourceURI($resource) { $root = $this->getSpecification()->getRootDirectory(); $path = $root.DIRECTORY_SEPARATOR.$resource; $data = Filesystem::readFile($path); $hash = PhabricatorHash::digest($data); $hash = substr($hash, 0, 6); $id = $this->getBlog()->getID(); $uri = '/phame/r/'.$id.'/'.$hash.'/'.$resource; $uri = PhabricatorEnv::getCDNURI($uri); return $uri; } /* -( Paging )------------------------------------------------------------- */ /** * @task paging */ public function getPageSize() { return 100; } /** * @task paging */ protected function getOlderPageURI() { if ($this->pager) { $next = $this->pager->getNextPageID(); if ($next) { return $this->getURI('older/'.$next.'/'); } } return null; } /** * @task paging */ protected function renderOlderPageLink() { $uri = $this->getOlderPageURI(); if (!$uri) { return null; } return phutil_render_tag( 'a', array( 'class' => 'phame-page-link phame-page-older', 'href' => $uri, ), pht("\xE2\x80\xB9 Older")); } /** * @task paging */ protected function getNewerPageURI() { if ($this->pager) { $next = $this->pager->getPrevPageID(); if ($next) { return $this->getURI('newer/'.$next.'/'); } } return null; } /** * @task paging */ protected function renderNewerPageLink() { $uri = $this->getNewerPageURI(); if (!$uri) { return null; } return phutil_render_tag( 'a', array( 'class' => 'phame-page-link phame-page-newer', 'href' => $uri, ), pht("Newer \xE2\x80\xBA")); } /* -( Internals )---------------------------------------------------------- */ /** * @task internal */ protected function renderContent(AphrontRequest $request) { $user = $request->getUser(); $matches = null; $path = $request->getPath(); // default to the blog-wide values $this->setTitle($this->getBlog()->getName()); $this->setDescription($this->getBlog()->getDescription()); $this->setOGType('website'); + $this->setURIPath(''); if (preg_match('@^/post/(?P.*)$@', $path, $matches)) { $post = id(new PhamePostQuery()) ->setViewer($user) ->withBlogPHIDs(array($this->getBlog()->getPHID())) ->withPhameTitles(array($matches['name'])) ->executeOne(); if ($post) { $description = $post->getMarkupText(PhamePost::MARKUP_FIELD_SUMMARY); $this->setTitle($post->getTitle()); $this->setDescription($description); $this->setOGType('article'); + $this->setURIPath('post/'.$post->getPhameTitle()); $view = head($this->buildPostViews(array($post))); return $this->renderPostDetail($view); } } else { $pager = new AphrontCursorPagerView(); if (preg_match('@^/older/(?P\d+)/$@', $path, $matches)) { $pager->setAfterID($matches['before']); } else if (preg_match('@^/newer/(?P\d)/$@', $path, $matches)) { $pager->setBeforeID($matches['after']); } else if (preg_match('@^/$@', $path, $matches)) { // Just show the first page. } else { return null; } $pager->setPageSize($this->getPageSize()); $posts = id(new PhamePostQuery()) ->setViewer($user) ->withBlogPHIDs(array($this->getBlog()->getPHID())) ->executeWithCursorPager($pager); $this->pager = $pager; if ($posts) { $views = $this->buildPostViews($posts); return $this->renderPostList($views); } } return null; } private function buildPostViews(array $posts) { assert_instances_of($posts, 'PhamePost'); $user = $this->getRequest()->getUser(); $engine = id(new PhabricatorMarkupEngine()) ->setViewer($user); $phids = array(); foreach ($posts as $post) { $engine->addObject($post, PhamePost::MARKUP_FIELD_BODY); $engine->addObject($post, PhamePost::MARKUP_FIELD_SUMMARY); $phids[] = $post->getBloggerPHID(); } $handles = id(new PhabricatorObjectHandleData($phids)) ->loadHandles(); $engine->process(); $views = array(); foreach ($posts as $post) { $view = id(new PhamePostView()) ->setUser($user) ->setSkin($this) ->setPost($post) ->setBody($engine->getOutput($post, PhamePost::MARKUP_FIELD_BODY)) ->setSummary($engine->getOutput($post, PhamePost::MARKUP_FIELD_SUMMARY)) ->setAuthor($handles[$post->getBloggerPHID()]); $post->makeEphemeral(); if (!$post->getDatePublished()) { $post->setDatePublished(time()); } $views[] = $view; } return $views; } } diff --git a/src/applications/phame/skins/PhameBasicTemplateBlogSkin.php b/src/applications/phame/skins/PhameBasicTemplateBlogSkin.php index 02034d423..709b3a191 100644 --- a/src/applications/phame/skins/PhameBasicTemplateBlogSkin.php +++ b/src/applications/phame/skins/PhameBasicTemplateBlogSkin.php @@ -1,125 +1,126 @@ getPath('css/'); if (Filesystem::pathExists($css)) { $this->cssResources = array(); foreach (Filesystem::listDirectory($css) as $path) { if (!preg_match('/.css$/', $path)) { continue; } $this->cssResources[] = phutil_render_tag( 'link', array( 'rel' => 'stylesheet', 'type' => 'text/css', 'href' => $this->getResourceURI('css/'.$path), )); } $this->cssResources = implode("\n", $this->cssResources); } $request = $this->getRequest(); $content = $this->renderContent($request); if (!$content) { $content = $this->render404Page(); } $content = array( $this->renderHeader(), $content, $this->renderFooter(), ); $response = new AphrontWebpageResponse(); $response->setContent(implode("\n", $content)); return $response; } public function getCSSResources() { return $this->cssResources; } public function getName() { return $this->getSpecification()->getName(); } public function getPath($to_file = null) { $path = $this->getSpecification()->getRootDirectory(); if ($to_file) { $path = $path.DIRECTORY_SEPARATOR.$to_file; } return $path; } private function renderTemplate($__template__, array $__scope__) { chdir($this->getPath()); ob_start(); if (Filesystem::pathExists($this->getPath($__template__))) { // Fool lint. $__evil__ = 'extract'; $__evil__($__scope__ + $this->getDefaultScope()); require $this->getPath($__template__); } return ob_get_clean(); } private function getDefaultScope() { return array( 'skin' => $this, 'blog' => $this->getBlog(), - 'uri' => $this->getURI(''), + 'uri' => $this->getURI($this->getURIPath()), + 'home_uri' => $this->getURI(''), 'title' => $this->getTitle(), 'description' => $this->getDescription(), 'og_type' => $this->getOGType(), ); } protected function renderHeader() { return $this->renderTemplate( 'header.php', array() ); } protected function renderFooter() { return $this->renderTemplate('footer.php', array()); } protected function render404Page() { return $this->renderTemplate('404.php', array()); } protected function renderPostDetail(PhamePostView $post) { return $this->renderTemplate( 'post-detail.php', array( 'post' => $post, )); } protected function renderPostList(array $posts) { return $this->renderTemplate( 'post-list.php', array( 'posts' => $posts, 'older' => $this->renderOlderPageLink(), 'newer' => $this->renderNewerPageLink(), )); } }