webuni / front-matter
Front matter parser and dumper for PHP
Requires
- php: ^8.1
- symfony/yaml: ^3.4.31|^4.3.4|^5.0|^6.0|^7.0|^8.0
Requires (Dev)
- ext-json: *
- devium/toml: ^1.0
- friendsofphp/php-cs-fixer: ^3.65
- league/commonmark: ^2.0
- nette/neon: ^2.2|^3.0
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^10.5
- symfony/var-dumper: *
- twig/twig: ^3.0
Suggests
- devium/toml: If you want to use TOML v1.0.0 as front matter
- nette/neon: If you want to use NEON as front matter
Provides
None
Conflicts
None
Replaces
None
README
The most universal Front matter (yaml, json, neon, toml) parser and dumper for PHP. Front matter allows page-specific variables to be included at the top of a page.
Features
This library can parse all form of front matter:
| YAML (Neon) | TOML | Json | Twig | Pug |
|---|---|---|---|---|
--- foo: bar --- # Section Text |
+++ foo = bar +++ # Section Text |
{
"foo": "bar"
}
# Section
Text
|
{#---
foo: bar
---#}
<h1>Section</h1>
<p>{{ foo }}</p>
|
--
foo: bar
h1 Section
p= foo
|
Installation
This library can be installed via Composer:
composer require webuni/front-matter
Usage
Automatic front matter detection and parsing
The following code will automatically detect the above front matter types:
<?php $frontMatter = \Webuni\FrontMatter\FrontMatterChain::create(); $document = $frontMatter->parse($string); $data = $document->getData(); $content = $document->getContent();
Parse an arbitrary string
<?php $frontMatter = new \Webuni\FrontMatter\FrontMatter(); $document = $frontMatter->parse($string); $data = $document->getData(); $content = $document->getContent();
Check if a string has front matter
<?php $frontMatter = new \Webuni\FrontMatter\FrontMatter(); $hasFrontMatter = $frontMatter->exists($string);
Twig loader
If you want to store metadata about twig template, e.g.:
{#--- title: Hello world menu: main weight: 20 ---#} {% extend layout.html.twig %} {% block content %} Hello world! {% endblock %}
you can use FrontMatterLoader, that decorates another Twig loader:
$frontMatter = \Webuni\FrontMatter\Twig\TwigCommentFrontMatter::create(); $loader = new \Twig\Loader\FilesystemLoader(['path/to/templates']); $loader = new \Webuni\FrontMatter\Twig\FrontMatterLoader($frontMatter, $loader); $twig = new \Twig\Environment($loader); $content = $twig->render('template', []); // rendered the valid twig template without front matter
It is possible to inject front matter to Twig template as variables:
// … $converter = \Webuni\FrontMatter\Twig\DataToTwigConvertor::vars(); $loader = new \Webuni\FrontMatter\Twig\FrontMatterLoader($frontMatter, $loader, $converter); // …
Loaded Twig template has this code:
{% set title = "Hello world" %}
{% set menu = "main" %}
{% set weight = 20 %}
{% line 5 %}
{% extend layout.html.twig %}
{% block content %}
Hello world!
{% endblock %}
Available converters:
| Converter | Twig |
|---|---|
DataToTwigConvertor::nothing() |
|
DataToTwigConvertor::vars() |
{% set key1 = value1 %} |
DataToTwigConvertor::vars(false) |
{% set key1 = key1 is defined ? key1 : value1 %} |
DataToTwigConvertor::var('name') |
{% set name = {key1: value1, key2: value2} %} |
DataToTwigConvertor::var('name', false) |
{% set name = name is defined ? name : {key1: value1} %} |
Markdown
The most commonly used front matter is for markdown files:
--- layout: post title: I Love Markdown tags: - test - example --- # Hello World!
This library can be used with league/commonmark:
$frontMatter = new \Webuni\FrontMatter\FrontMatter(); $extension = new \Webuni\FrontMatter\Markdown\FrontMatterLeagueCommonMarkExtension($frontMatter); $converter = new \League\CommonMark\CommonMarkConverter([]); $converter->getEnvironment()->addExtension($extension); $html = $converter->convertToHtml('markdown'); // html without front matter