Fix the way front matter is handled, fixes #345
This commit is contained in:
parent
3375f8ff2b
commit
97c4014926
@ -13,14 +13,15 @@
|
|||||||
],
|
],
|
||||||
"bin": ["bin/daux"],
|
"bin": ["bin/daux"],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.5",
|
|
||||||
"league/plates": "~3.1",
|
|
||||||
"guzzlehttp/guzzle": "~6.0",
|
"guzzlehttp/guzzle": "~6.0",
|
||||||
"league/commonmark": "^0.13",
|
"league/commonmark": "^0.13",
|
||||||
|
"league/plates": "~3.1",
|
||||||
|
"myclabs/deep-copy": "^1.5",
|
||||||
|
"php": ">=5.5",
|
||||||
"symfony/console": "~3.0",
|
"symfony/console": "~3.0",
|
||||||
"symfony/finder": "~3.0",
|
"symfony/finder": "~3.0",
|
||||||
"webuni/commonmark-table-extension": "0.4.*",
|
"webuni/commonmark-table-extension": "0.4.*",
|
||||||
"myclabs/deep-copy": "^1.5"
|
"webuni/front-matter": "^0.2.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
158
composer.lock
generated
158
composer.lock
generated
@ -4,8 +4,8 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "d8c4d9d882622af07b8a8a0fad47a353",
|
"hash": "3f12815cfe3d8c82016da7a7a12021a0",
|
||||||
"content-hash": "b0946ce60712726d3e60655d461db484",
|
"content-hash": "746afc5f583eddb95134fae836cd66f3",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/guzzle",
|
"name": "guzzlehttp/guzzle",
|
||||||
@ -558,6 +558,55 @@
|
|||||||
],
|
],
|
||||||
"time": "2016-05-18 14:26:46"
|
"time": "2016-05-18 14:26:46"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/yaml",
|
||||||
|
"version": "v3.1.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/yaml.git",
|
||||||
|
"reference": "2884c26ce4c1d61aebf423a8b912950fe7c764de"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/yaml/zipball/2884c26ce4c1d61aebf423a8b912950fe7c764de",
|
||||||
|
"reference": "2884c26ce4c1d61aebf423a8b912950fe7c764de",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.9"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.1-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Yaml\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Yaml Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2016-06-29 05:41:56"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "webuni/commonmark-table-extension",
|
"name": "webuni/commonmark-table-extension",
|
||||||
"version": "0.4.3",
|
"version": "0.4.3",
|
||||||
@ -611,6 +660,62 @@
|
|||||||
"table"
|
"table"
|
||||||
],
|
],
|
||||||
"time": "2016-01-14 22:54:18"
|
"time": "2016-01-14 22:54:18"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "webuni/front-matter",
|
||||||
|
"version": "0.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/webuni/front-matter.git",
|
||||||
|
"reference": "dfede21e98a91729151e9665a81215f838e9320f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/webuni/front-matter/zipball/dfede21e98a91729151e9665a81215f838e9320f",
|
||||||
|
"reference": "dfede21e98a91729151e9665a81215f838e9320f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^5.5|^7.0",
|
||||||
|
"symfony/yaml": "^2.3|^3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"coduo/phpspec-data-provider-extension": "^1.0",
|
||||||
|
"fabpot/php-cs-fixer": "^1.9",
|
||||||
|
"memio/spec-gen": "~0.3",
|
||||||
|
"mthaml/mthaml": "^1.2",
|
||||||
|
"phpspec/phpspec": "^2.5",
|
||||||
|
"twig/twig": "~1.20|~2.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "0.1-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Webuni\\FrontMatter\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Martin Hasoň",
|
||||||
|
"email": "martin.hason@gmail.com",
|
||||||
|
"role": "Lead Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Front matter parser and dumper for PHP",
|
||||||
|
"homepage": "https://github.com/webuni/front-yaml",
|
||||||
|
"keywords": [
|
||||||
|
"front-matter",
|
||||||
|
"yaml"
|
||||||
|
],
|
||||||
|
"time": "2016-04-26 23:39:13"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
@ -1665,55 +1770,6 @@
|
|||||||
"homepage": "https://github.com/sebastianbergmann/version",
|
"homepage": "https://github.com/sebastianbergmann/version",
|
||||||
"time": "2015-06-21 13:59:46"
|
"time": "2015-06-21 13:59:46"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "symfony/yaml",
|
|
||||||
"version": "v3.1.2",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/symfony/yaml.git",
|
|
||||||
"reference": "2884c26ce4c1d61aebf423a8b912950fe7c764de"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/2884c26ce4c1d61aebf423a8b912950fe7c764de",
|
|
||||||
"reference": "2884c26ce4c1d61aebf423a8b912950fe7c764de",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.5.9"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "3.1-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Component\\Yaml\\": ""
|
|
||||||
},
|
|
||||||
"exclude-from-classmap": [
|
|
||||||
"/Tests/"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Fabien Potencier",
|
|
||||||
"email": "fabien@symfony.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Symfony Community",
|
|
||||||
"homepage": "https://symfony.com/contributors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Symfony Yaml Component",
|
|
||||||
"homepage": "https://symfony.com",
|
|
||||||
"time": "2016-06-29 05:41:56"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "webmozart/assert",
|
"name": "webmozart/assert",
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
|
18
docs/01_Features/Front_Matter.md
Normal file
18
docs/01_Features/Front_Matter.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
To customize your pages even further, you can add a Front Matter to your files.
|
||||||
|
|
||||||
|
Front Matter is a block you add at the top of your file and looks like this:
|
||||||
|
|
||||||
|
---
|
||||||
|
title: Hallo Welt
|
||||||
|
date: 12th December 1984
|
||||||
|
---
|
||||||
|
|
||||||
|
## Changing the title
|
||||||
|
|
||||||
|
The only implemented customization right now is the override of the title.
|
||||||
|
|
||||||
|
If your file is named "Hello_World_de.md" and your front matter is the one displayed above, you will get a page named "Hallo Welt"
|
||||||
|
|
||||||
|
## For Developers
|
||||||
|
|
||||||
|
You can then access this information in each `Content` with `$content->getAttributes()`
|
@ -1,5 +1,6 @@
|
|||||||
|
---
|
||||||
title: Hallo Welt
|
title: Hallo Welt
|
||||||
date: 12th December 1984
|
date: 12th December 1984
|
||||||
-------
|
---
|
||||||
|
|
||||||
This is a page which has attributes and a overriden Title
|
This is a page which has attributes and a overriden Title
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<?php namespace Todaymade\Daux\Tree;
|
<?php namespace Todaymade\Daux\Tree;
|
||||||
|
|
||||||
|
use Webuni\FrontMatter\FrontMatter;
|
||||||
|
|
||||||
class Content extends Entry
|
class Content extends Entry
|
||||||
{
|
{
|
||||||
/** @var string */
|
/** @var string */
|
||||||
@ -99,39 +101,12 @@ class Content extends Entry
|
|||||||
// is called in "getContent"
|
// is called in "getContent"
|
||||||
$this->attributes = [];
|
$this->attributes = [];
|
||||||
|
|
||||||
$content = $this->getContent();
|
$frontMatter = new FrontMatter();
|
||||||
$sections = preg_split('/\s+-{3,}\s+/', $content, 2);
|
|
||||||
|
|
||||||
// Only do it if we have two sections
|
$document = $frontMatter->parse($this->getContent());
|
||||||
if (count($sections) != 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the different attributes
|
$this->attributes = array_replace_recursive($this->attributes, $document->getData());
|
||||||
$lines = preg_split('/\n/', $sections[0]);
|
$this->setContent($document->getContent());
|
||||||
foreach ($lines as $line) {
|
|
||||||
$trimmed = trim($line);
|
|
||||||
if ($trimmed == '') {
|
|
||||||
continue;
|
|
||||||
} // skip empty lines
|
|
||||||
if ($trimmed[0] == '#') {
|
|
||||||
continue;
|
|
||||||
} // can be taken as comments
|
|
||||||
|
|
||||||
$re = '/^([-\\w]*)\\s*?:(.*)/';
|
|
||||||
if (!preg_match($re, $trimmed, $parts)) {
|
|
||||||
break;
|
|
||||||
} //Break as soon as we have a line that doesn't match
|
|
||||||
|
|
||||||
$key = strtolower(trim($parts[1]));
|
|
||||||
$value = trim($parts[2]);
|
|
||||||
$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)
|
public function setAttributes(array $attributes)
|
||||||
|
@ -20,11 +20,10 @@ class ContentTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
['This is content', [], 'This is content'],
|
['This is content', [], 'This is content'],
|
||||||
["title: This is a simple title\n---\nThis is content\n", ['title' => 'This is a simple title'], 'This is content'],
|
["---\ntitle: This is a simple title\n---\nThis is content\n", ['title' => 'This is a simple title'], 'This is content'],
|
||||||
["title: This is a simple title\ntitle :This is another title\n---\nThis is content\n", ['title' => 'This is another title'], 'This is content'],
|
["---\ntitle: This is a simple title\ntags:\n - One\n - Second Tag\n---\nThis is content\n", ['title' => 'This is a simple title', 'tags' => ['One', 'Second Tag']], 'This is content'],
|
||||||
["title: This is a simple title\nthis is not metadata\n---\nThis is content\n", ['title' => 'This is a simple title'], 'This is content'],
|
|
||||||
['title: This is only metatada, no content', [], 'title: This is only metatada, no content'],
|
['title: This is only metatada, no content', [], 'title: This is only metatada, no content'],
|
||||||
["title: This is almost only metadata\n---\n", ['title' => 'This is almost only metadata'], ''],
|
["---\ntitle: This is almost only metadata\n---\n", ['title' => 'This is almost only metadata'], ''],
|
||||||
["# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up", [], "# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up"],
|
["# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up", [], "# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up"],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -42,7 +41,7 @@ class ContentTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testNoAttributes()
|
public function testNoAttributes()
|
||||||
{
|
{
|
||||||
$content = "This is a content with a separator\n----\n this wasn't an attribute";
|
$content = "This is a content with a separator\n---\n this wasn't an attribute";
|
||||||
|
|
||||||
$obj = $this->createContent($content);
|
$obj = $this->createContent($content);
|
||||||
|
|
||||||
@ -51,8 +50,8 @@ class ContentTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testContentPreserved()
|
public function testContentPreserved()
|
||||||
{
|
{
|
||||||
$content = "this was an attribute, but also a separator\n----\nand it works";
|
$content = "this was an attribute, but also a separator\n---\nand it works";
|
||||||
$with_attribute = "title: a title\n----\n$content";
|
$with_attribute = "---\ntitle: a title\n---\n$content";
|
||||||
|
|
||||||
$obj = $this->createContent($with_attribute);
|
$obj = $this->createContent($with_attribute);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user