/** * Build base format context * * @param mixed $context * * @return Configuration */ protected function buildBaseFormatContext($context) { $baseContext = new Configuration(array('site' => $this->siteConfiguration->export(), 'page' => $context, 'formatter' => $this->defaultFormatter, 'converters' => array())); if (isset($context['url'])) { if ('/' === $context['url']) { $relativeUrl = '.'; } else { $relativeUrl = rtrim(str_repeat('../', substr_count($context['url'], '/')), '/'); } $baseContext->set('relative_root_url', $relativeUrl); } foreach ($this->dataProviderManager->dataProviders() as $name) { if (isset($context['use']) and in_array($name, $context['use'])) { $baseContext->set('data.' . $name, $this->dataProviderManager->dataProvider($name)->provideData()); } } return $baseContext; }
/** * {@inheritdoc} */ public function generate(SourceInterface $source) { // select data source $data = null; $config = $source->data()->get('sculpin_calendarian') ?: array(); if (!isset($config['provider'])) { $config['provider'] = 'data.posts'; } if (preg_match('/^(data|page)\\.(.+)$/', $config['provider'], $matches)) { switch ($matches[1]) { case 'data': $data = $this->dataProviderManager->dataProvider($matches[2])->provideData(); break; case 'page': $data = $source->data()->get($matches[2]); break; } } if (null === $data) { return; } // distribute the post by date $page_list = array(); foreach ($data as $id => $d) { $year = date('Y****', $d->date()); $month = date('Ym**', $d->date()); $day = date('Ymd', $d->date()); // add to 'year' if (!array_key_exists($year, $page_list)) { $page_list[$year] = array(); } $page_list[$year][] = $d; // add to 'month' if (!array_key_exists($month, $page_list)) { $page_list[$month] = array(); } $page_list[$month][] = $d; // add to 'day' if (!array_key_exists($day, $page_list)) { $page_list[$day] = array(); } $page_list[$day][] = $d; } $pages = array(); foreach ($page_list as $k => $sources) { // generate permalink $key = str_replace('/**', '', preg_replace('/(....)(..)(..)/', '$1/$2/$3', $k)); $permalink = $source->data()->get('permalink') ?: $source->relativePathname(); $basename = basename($permalink); if (preg_match('/^(.+?)\\.(.+)$/', $basename, $m)) { $permalink = dirname($permalink) . '/' . $key . '/index.' . $m[2]; } else { $permalink = null; } $page = $source->duplicate($source->sourceId() . ':calendarian=' . $key); $keys = explode('/', $key); if (0 < count($keys)) { $page->data()->set('calendarian.year', (int) $keys[0]); } if (1 < count($keys)) { $page->data()->set('calendarian.month', (int) $keys[1]); } if (2 < count($keys)) { $page->data()->set('calendarian.day', (int) $keys[2]); } if (null != $permalink) { $page->data()->set('permalink', $permalink); } $page->data()->set('calendarian.items', $sources); $pages[] = $page; } return $pages; }
/** * {@inheritdoc} */ public function generate(SourceInterface $source) { $data = null; $config = $source->data()->get('pagination') ?: array(); if (!isset($config['provider'])) { $config['provider'] = 'data.posts'; } if (preg_match('/^(data|page)\\.(.+)$/', $config['provider'], $matches)) { switch ($matches[1]) { case 'data': $data = $this->dataProviderManager->dataProvider($matches[2])->provideData(); break; case 'page': $data = $source->data()->get($matches[2]); break; } } if (null === $data) { return; } $maxPerPage = isset($config['max_per_page']) ? $config['max_per_page'] : $this->maxPerPage; $slices = array(); $slice = array(); $totalItems = 0; foreach ($data as $k => $v) { if (count($slice) == $maxPerPage) { $slices[] = $slice; $slice = array(); } $slice[$k] = $v; $totalItems++; } if (count($slice)) { $slices[] = $slice; } $sources = array(); $pageNumber = 0; foreach ($slices as $slice) { $pageNumber++; $permalink = null; if ($pageNumber > 1) { $permalink = $source->data()->get('permalink') ?: $source->relativePathname(); $basename = basename($permalink); if (preg_match('/^(.+?)\\.(.+)$/', $basename, $matches)) { if ('index' === $matches[1]) { $paginatedPage = ''; $index = '/index'; } else { $paginatedPage = $matches[1] . '/'; $index = ''; } $permalink = dirname($permalink) . '/' . $paginatedPage . 'page/' . $pageNumber . $index . '.' . $matches[2]; } else { $permalink = dirname($permalink) . '/' . $basename . '/page/' . $pageNumber . '.html'; } if (0 === strpos($permalink, './')) { $permalink = substr($permalink, 2); } } $generatedSource = $source->duplicate($source->sourceId() . ':page=' . $pageNumber); if (null !== $permalink) { $generatedSource->data()->set('permalink', $permalink); } $generatedSource->data()->set('pagination.items', $slice); $generatedSource->data()->set('pagination.page', $pageNumber); $generatedSource->data()->set('pagination.total_pages', count($slices)); $generatedSource->data()->set('pagination.total_items', $totalItems); $sources[] = $generatedSource; } for ($i = 0; $i < count($sources); $i++) { $generatedSource = $sources[$i]; if (0 === $i) { $generatedSource->data()->set('pagination.previous_page', null); } else { $generatedSource->data()->set('pagination.previous_page', $sources[$i - 1]); } if ($i + 1 < count($sources)) { $generatedSource->data()->set('pagination.next_page', $sources[$i + 1]); } else { $generatedSource->data()->set('pagination.next_page', null); } } return $sources; }