Add metadata support, fixes #210
This commit is contained in:
parent
295aee5f77
commit
93330e86db
5
docs/05_More_Examples/Hello_World_de.md
Normal file
5
docs/05_More_Examples/Hello_World_de.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
title: Hallo Welt
|
||||||
|
date: 12th December 1984
|
||||||
|
-------
|
||||||
|
|
||||||
|
This is a page which has attributes and a overriden Title
|
@ -2,21 +2,18 @@
|
|||||||
|
|
||||||
class Content extends Entry
|
class Content extends Entry
|
||||||
{
|
{
|
||||||
/**
|
/** @var string */
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $content;
|
protected $content;
|
||||||
|
|
||||||
/**
|
/** @var Content */
|
||||||
* @var Content
|
|
||||||
*/
|
|
||||||
protected $previous;
|
protected $previous;
|
||||||
|
|
||||||
/**
|
/** @var Content */
|
||||||
* @var Content
|
|
||||||
*/
|
|
||||||
protected $next;
|
protected $next;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
protected $attributes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@ -26,6 +23,10 @@ class Content extends Entry
|
|||||||
$this->content = file_get_contents($this->getPath());
|
$this->content = file_get_contents($this->getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->attributes === null) {
|
||||||
|
$this->parseAttributes();
|
||||||
|
}
|
||||||
|
|
||||||
return $this->content;
|
return $this->content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +75,68 @@ class Content extends Entry
|
|||||||
return $this->name == 'index' || $this->name == '_index';
|
return $this->name == 'index' || $this->name == '_index';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle()
|
||||||
|
{
|
||||||
|
if ($title = $this->getAttribute('title')) {
|
||||||
|
return $title;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function parseAttributes()
|
||||||
|
{
|
||||||
|
// We set an empty array first to
|
||||||
|
// avoid a loop when "parseAttributes"
|
||||||
|
// is called in "getContent"
|
||||||
|
$this->attributes = [];
|
||||||
|
|
||||||
|
$content = $this->getContent();
|
||||||
|
$sections = preg_split('/\s+-{3,}\s+/', $content, 2);
|
||||||
|
|
||||||
|
// Only do it if we have two sections
|
||||||
|
if (count($sections) != 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the different attributes
|
||||||
|
$lines = preg_split('/\n/', $sections[0]);
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
$parts = preg_split('/:/', $line, 2);
|
||||||
|
if (count($parts) !== 2) continue;
|
||||||
|
$key = strtolower(trim($parts[0]));
|
||||||
|
$value = trim($parts[1]);
|
||||||
|
$this->attributes[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only remove the content if we have at least one attribute
|
||||||
|
if (count($this->attributes) > 0) {
|
||||||
|
$this->setContent($sections[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAttributes(array $attributes)
|
||||||
|
{
|
||||||
|
$this->attributes = $attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAttribute($key = null)
|
||||||
|
{
|
||||||
|
if ($this->attributes === null) {
|
||||||
|
$this->parseAttributes();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($key)) {
|
||||||
|
return $this->attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists($key, $this->attributes)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->attributes[$key];
|
||||||
|
}
|
||||||
|
|
||||||
public function dump()
|
public function dump()
|
||||||
{
|
{
|
||||||
$dump = parent::dump();
|
$dump = parent::dump();
|
||||||
|
56
tests/Tree/ContentTest.php
Normal file
56
tests/Tree/ContentTest.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php namespace Todaymade\Daux\Tree;
|
||||||
|
|
||||||
|
use Todaymade\Daux\Config;
|
||||||
|
|
||||||
|
class ContentTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
protected function createContent($content) {
|
||||||
|
$dir = new Directory(new Root(new Config, ''), '');
|
||||||
|
$obj = new Content($dir, '');
|
||||||
|
$obj->setContent($content);
|
||||||
|
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerTestAttributes()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
['This is content', []],
|
||||||
|
["title: This is a simple title\n---\nThis is content\n", ['title' => 'This is a simple title']],
|
||||||
|
["title: This is a simple title\ntitle :This is another title\n---\nThis is content\n", ['title' => 'This is another title']],
|
||||||
|
["title: This is a simple title\nthis is not metadata\n---\nThis is content\n", ['title' => 'This is a simple title']],
|
||||||
|
["title: This is only metatada, no content", []],
|
||||||
|
["title: This is almost only metadata\n---\n", ["title" => "This is almost only metadata"]]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerTestAttributes
|
||||||
|
*/
|
||||||
|
public function testAttributes($content, $attributes)
|
||||||
|
{
|
||||||
|
$obj = $this->createContent($content);
|
||||||
|
|
||||||
|
$this->assertEquals($attributes, $obj->getAttribute());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNoAttributes()
|
||||||
|
{
|
||||||
|
$content = "This is a content with a separator\n----\n this wasn't an attribute";
|
||||||
|
|
||||||
|
$obj = $this->createContent($content);
|
||||||
|
|
||||||
|
$this->assertEquals($content, $obj->getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testContentPreserved()
|
||||||
|
{
|
||||||
|
$content = "this was an attribute, but also a separator\n----\nand it works";
|
||||||
|
$with_attribute = "title: a title\n----\n$content";
|
||||||
|
|
||||||
|
$obj = $this->createContent($with_attribute);
|
||||||
|
|
||||||
|
$this->assertEquals($content, $obj->getContent());
|
||||||
|
$this->assertEquals('a title', $obj->getAttribute('title'));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user