From b1964a7c37480051c9bbe0f5bb6987b11906fc85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ste=CC=81phane=20Goetz?= Date: Sun, 31 Jan 2016 12:00:29 +0100 Subject: [PATCH] Add computed raw pages, to create special content at any time --- .../10_For_Developers/Creating_a_Processor.md | 6 + libs/Format/Base/ComputedRawPage.php | 18 +++ libs/Format/HTML/ComputedRawPage.php | 6 + libs/Format/HTML/Generator.php | 7 +- libs/Tree/Builder.php | 29 ++--- libs/Tree/ComputedRaw.php | 23 ++++ tests/Tree/BuilderTest.php | 103 ++++++++++++++++++ 7 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 libs/Format/Base/ComputedRawPage.php create mode 100644 libs/Format/HTML/ComputedRawPage.php create mode 100644 libs/Tree/ComputedRaw.php diff --git a/docs/10_For_Developers/Creating_a_Processor.md b/docs/10_For_Developers/Creating_a_Processor.md index 60f6c9e..19ed4b6 100644 --- a/docs/10_For_Developers/Creating_a_Processor.md +++ b/docs/10_For_Developers/Creating_a_Processor.md @@ -62,6 +62,12 @@ Two helpers from the class `Todaymade\Daux\Tree\Builder` will greatly help you d Both methods `getOrCreateDir` and `getOrCreatePage` take two parameters : `parent` and `title` +The page will automatically be treated as markdown and converted like a normal page. + +If you create a new ContentType, like let's say LaTeX, you would set the title `My Page.tex` it will keep the title `My Page` and use your renderer. + +If the extension is not mapped to a Generator, it will simply create the file as-is without manipulation. + ### Extend the Markdown Generator You can extend the Markdown Parser in any way wou want with this method. diff --git a/libs/Format/Base/ComputedRawPage.php b/libs/Format/Base/ComputedRawPage.php new file mode 100644 index 0000000..8fdef8f --- /dev/null +++ b/libs/Format/Base/ComputedRawPage.php @@ -0,0 +1,18 @@ +raw = $content; + } + + public function getContent() + { + return $this->raw->getContent(); + } +} diff --git a/libs/Format/HTML/ComputedRawPage.php b/libs/Format/HTML/ComputedRawPage.php new file mode 100644 index 0000000..72ddfc4 --- /dev/null +++ b/libs/Format/HTML/ComputedRawPage.php @@ -0,0 +1,6 @@ +getPath(), $output_dir . DIRECTORY_SEPARATOR . $key); return; } @@ -118,6 +119,10 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator return new RawPage($node->getPath()); } + if ($node instanceof ComputedRaw) { + return new ComputedRawPage($node); + } + $params['request'] = $node->getUrl(); return ContentPage::fromFile($node, $params, $this->daux->getContentTypeHandler()->getType($node)); } diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 7af752e..ed52ed4 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -169,32 +169,35 @@ class Builder */ public static function getOrCreatePage(Directory $parent, $path) { - $title = static::getName($path); - + $extension = pathinfo($path, PATHINFO_EXTENSION); // If the file doesn't have an extension, set .md as a default - if (pathinfo($path, PATHINFO_EXTENSION) == '') { + if ($extension == '') { + $extension = 'md'; $path .= '.md'; } - $uri = $slug = DauxHelper::slug($title); - if ($parent->getConfig()['mode'] === Daux::STATIC_MODE) { - $uri = $slug . ".html"; + $raw = !in_array($extension, $parent->getConfig()['valid_content_extensions']); + + $title = $uri = $path; + if (!$raw) { + $title = static::getName($path); + $uri = DauxHelper::slug($title); + if ($parent->getConfig()['mode'] === Daux::STATIC_MODE) { + $uri .= ".html"; + } } if (array_key_exists($uri, $parent->getEntries())) { return $parent->getEntries()[$uri]; } - $page = new Content($parent, $uri); + $page = $raw? new ComputedRaw($parent, $uri) : new Content($parent, $uri); $page->setContent("-"); //set an almost empty content to avoid problems + $page->setName($path); + $page->setTitle($title); - if ($title == 'index') { - // TODO :: clarify the difference between 'index' and '_index' - $page->setName('_index.' . pathinfo($path, PATHINFO_EXTENSION)); + if ($title == 'index' || $title == '_index') { $page->setTitle($parent->getTitle()); - } else { - $page->setName($path); - $page->setTitle($title); } return $page; diff --git a/libs/Tree/ComputedRaw.php b/libs/Tree/ComputedRaw.php new file mode 100644 index 0000000..ca76319 --- /dev/null +++ b/libs/Tree/ComputedRaw.php @@ -0,0 +1,23 @@ +content; + } + + /** + * @param string $content + */ + public function setContent($content) + { + $this->content = $content; + } +} diff --git a/tests/Tree/BuilderTest.php b/tests/Tree/BuilderTest.php index 4e28c0e..c2599a2 100644 --- a/tests/Tree/BuilderTest.php +++ b/tests/Tree/BuilderTest.php @@ -1,6 +1,9 @@ assertEquals($expected, Builder::removeSortingInformations($value)); } + + public function testGetOrCreateDirNew() { + $root = new Root(new Config(), ''); + + + $dir = Builder::getOrCreateDir($root, 'directory'); + + $this->assertSame($root, $dir->getParent()); + $this->assertEquals('directory', $dir->getTitle()); + $this->assertEquals('directory', $dir->getUri()); + + } + + public function testGetOrCreateDirExisting() { + $root = new Root(new Config(), ''); + $directory = new Directory($root, 'directory'); + $directory->setTitle('directory'); + + $dir = Builder::getOrCreateDir($root, 'directory'); + + $this->assertSame($root, $dir->getParent()); + $this->assertEquals('directory', $dir->getTitle()); + $this->assertEquals('directory', $dir->getUri()); + $this->assertSame($directory, $dir); + } + + public function getStaticRoot() { + $config = new Config(); + $config['mode'] = Daux::STATIC_MODE; + $config['index_key'] = 'index.html'; + $config['valid_content_extensions'] = ['md']; + + return new Root($config, ''); + } + + public function testGetOrCreatePage() + { + $directory = new Directory($this->getStaticRoot(), 'dir'); + + $entry = Builder::getOrCreatePage($directory, 'A Page.md'); + + $this->assertSame($directory, $entry->getParent()); + $this->assertEquals('dir/A_Page.html', $entry->getUrl()); + $this->assertEquals('A_Page.html', $entry->getUri()); + $this->assertEquals('A Page', $entry->getTitle()); + $this->assertInstanceOf('Todaymade\Daux\Tree\Content', $entry); + } + + public function testGetOrCreatePageAutoMarkdown() + { + $directory = new Directory($this->getStaticRoot(), 'dir'); + + $entry = Builder::getOrCreatePage($directory, 'A Page'); + + $this->assertSame($directory, $entry->getParent()); + $this->assertEquals('dir/A_Page.html', $entry->getUrl()); + $this->assertEquals('A_Page.html', $entry->getUri()); + $this->assertEquals('A Page', $entry->getTitle()); + $this->assertInstanceOf('Todaymade\Daux\Tree\Content', $entry); + } + + public function testGetOrCreateIndexPage() + { + $directory = new Directory($this->getStaticRoot(), 'dir'); + $directory->setTitle('Tutorials'); + + $entry = Builder::getOrCreatePage($directory, 'index.md'); + + $this->assertSame($directory, $entry->getParent()); + $this->assertEquals('dir/index.html', $entry->getUrl()); + $this->assertEquals('Tutorials', $entry->getTitle()); + $this->assertInstanceOf('Todaymade\Daux\Tree\Content', $entry); + } + + public function testGetOrCreatePageExisting() + { + $directory = new Directory($this->getStaticRoot(), 'dir'); + $existingEntry = new Content($directory, 'A_Page.html'); + $existingEntry->setContent('-'); + + $entry = Builder::getOrCreatePage($directory, 'A Page.md'); + + $this->assertSame($directory, $entry->getParent()); + $this->assertSame($existingEntry, $entry); + $this->assertEquals('dir/A_Page.html', $entry->getUrl()); + $this->assertEquals('A_Page.html', $entry->getUri()); + $this->assertInstanceOf('Todaymade\Daux\Tree\Content', $entry); + } + + public function testGetOrCreateRawPage() + { + $directory = new Directory($this->getStaticRoot(), 'dir'); + + $entry = Builder::getOrCreatePage($directory, 'file.json'); + + $this->assertSame($directory, $entry->getParent()); + $this->assertEquals('dir/file.json', $entry->getUrl()); + $this->assertEquals('file.json', $entry->getUri()); + $this->assertInstanceOf('Todaymade\Daux\Tree\ComputedRaw', $entry); + } }