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.
This library can be installed via Composer:
composer require webuni/front-matter
This library can parse all form of front matter:
YAML (Neon) | TOML | Twig | Pug | Json |
---|---|---|---|---|
---
foo: bar
---
# Section
Text |
+++
foo = bar
+++
# Section
Text |
{#---
foo: bar
---#}
<h1>Section</h1>
<p>{{ foo }}</p> |
--
foo: bar
h1 Section
p= foo |
{
"foo": "bar"
}
# Section
Text |
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();
<?php
$frontMatter = new \Webuni\FrontMatter\FrontMatter();
$document = $frontMatter->parse($string);
$data = $document->getData();
$content = $document->getContent();
<?php
$frontMatter = new \Webuni\FrontMatter\FrontMatter();
$hasFrontMatter = $frontMatter->exists($string);
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} %} |
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