load(); $this->shareCommonDataWithView(); } /** * Renders a card HTML view of the bundle, suitable to display in lists */ public function renderCard() { $this->prepareRenderCard(); return view('article-card', $this->viewData); } /** * Return an instance of the creator, using specified data as input */ public static function make(Bundle $bundle): RendersBundle { return new static($bundle); } /** * Renders a complete HTML view of the bundle */ protected function prepareRender() { $this->bundle->markdown()->lint(); $coverRef = $this->bundle->metadata()->get('cover'); $cover = null; if (!empty($coverRef)) { $cover = $this->bundle->attachments(AttachmentsManager::Images)->getComponentByRef($coverRef, 'article'); } $date = $this->bundle->metadata()->get('date'); if (!empty($date)) { data_set($this->viewData, 'date', Carbon::parse($date)); } data_set($this->viewData, 'cover', $cover ? $cover->render() : null); data_set($this->viewData, 'body', $this->bundle->markdown()->render()); $this->handlePagination(); } /** * Renders a HTML card view of the bundle */ protected function prepareRenderCard() { $coverRef = $this->bundle->metadata()->get('cover'); $cover = null; if (!empty($coverRef)) { $cover = $this->bundle->attachments(AttachmentsManager::Images)->getComponentByRef($coverRef, 'listitem', ['nolink' => true]); } $date = $this->bundle->metadata()->get('date'); if (!empty($date)) { data_set($this->viewData, 'date', Carbon::parse($date)); } data_set($this->viewData, 'cover', $cover ? $cover->render() : null); data_set($this->viewData, 'section', $this->bundle->getSection()); } /** * Pre-fill view with data used by all renderers */ protected function shareCommonDataWithView(): void { data_set($this->viewData, 'siteTitle', $this->bundle->getSiteTitle()); data_set($this->viewData, 'articleTitle', $this->bundle->getArticleTitle()); data_set($this->viewData, 'bundle', $this->bundle); } protected function handlePagination() { $itemsPerPage = config('pagination.itemsPerPage'); $currentPage = $this->bundle->getCurrentPage(); $subBundles = $this->collectSubBundles(); if (!$this->bundle->exists() && empty($subBundles)) { throw new Exception(sprintf( 'Page %s does not exist in bundle %s', $this->bundle->getCurrentPage(), $this->bundle->getPath() )); } $totalPages = 1; if (!empty($subBundles)) { $chunks = array_chunk($subBundles, $itemsPerPage); if (!array_key_exists($currentPage - 1, $chunks) && $currentPage > 1) { throw new Exception(sprintf( 'Page %s does not exist in bundle %s', $currentPage - 1, $this->bundle->getPath() )); } $currentChunk = $chunks[$currentPage - 1]; $totalPages = count($chunks); } else { $currentChunk = []; } $bundles = []; if (!empty($currentChunk)) { $bundles = array_map(fn (string $path) => new Bundle($path, $this->bundle->getDisk()), $currentChunk); } $data = [ 'root' => $this->bundle->getPath(), 'itemsPerPage' => $itemsPerPage, 'currentPage' => $currentPage, 'totalPages' => $totalPages, 'items' => $bundles, ]; data_set($this->viewData, 'pagination', $data); } protected function collectSubBundles() { $subBundles = Bundle::findBundles($this->bundle->getDisk(), $this->bundle->getPath(), true); $subBundles = collect($subBundles) ->filter(fn (Bundle $bundle) => !empty($bundle->metadata()->get('date')) && $bundle->getPath() !== $this->bundle->getPath()) ->sort(function (Bundle $bundleA, Bundle $bundleB) { return Carbon::parse($bundleA->metadata()->get('date'))->lt(Carbon::parse($bundleB->metadata()->get('date'))); }) ->map(fn (Bundle $bundle) => $bundle->getPath()) ->toArray(); return $subBundles; } }