123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <?php
- declare(strict_types=1);
- /**
- * @package Grav\Framework\File\Formatter
- *
- * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
- * @license MIT License; see LICENSE file for details.
- */
- namespace Grav\Framework\File\Formatter;
- use Grav\Framework\File\Interfaces\FileFormatterInterface;
- class MarkdownFormatter extends AbstractFormatter
- {
- /** @var FileFormatterInterface */
- private $headerFormatter;
- public function __construct(array $config = [], FileFormatterInterface $headerFormatter = null)
- {
- $config += [
- 'file_extension' => '.md',
- 'header' => 'header',
- 'body' => 'markdown',
- 'raw' => 'frontmatter',
- 'yaml' => ['inline' => 20]
- ];
- parent::__construct($config);
- $this->headerFormatter = $headerFormatter ?: new YamlFormatter($config['yaml']);
- }
- /**
- * Returns header field used in both encode() and decode().
- *
- * @return string
- */
- public function getHeaderField(): string
- {
- return $this->getConfig('header');
- }
- /**
- * Returns body field used in both encode() and decode().
- *
- * @return string
- */
- public function getBodyField(): string
- {
- return $this->getConfig('body');
- }
- /**
- * Returns raw field used in both encode() and decode().
- *
- * @return string
- */
- public function getRawField(): string
- {
- return $this->getConfig('raw');
- }
- /**
- * Returns header formatter object used in both encode() and decode().
- *
- * @return FileFormatterInterface
- */
- public function getHeaderFormatter(): FileFormatterInterface
- {
- return $this->headerFormatter;
- }
- /**
- * {@inheritdoc}
- * @see FileFormatterInterface::encode()
- */
- public function encode($data): string
- {
- $headerVar = $this->getHeaderField();
- $bodyVar = $this->getBodyField();
- $header = isset($data[$headerVar]) ? (array) $data[$headerVar] : [];
- $body = isset($data[$bodyVar]) ? (string) $data[$bodyVar] : '';
- // Create Markdown file with YAML header.
- $encoded = '';
- if ($header) {
- $encoded = "---\n" . trim($this->getHeaderFormatter()->encode($data['header'])) . "\n---\n\n";
- }
- $encoded .= $body;
- // Normalize line endings to Unix style.
- $encoded = preg_replace("/(\r\n|\r)/", "\n", $encoded);
- return $encoded;
- }
- /**
- * {@inheritdoc}
- * @see FileFormatterInterface::decode()
- */
- public function decode($data): array
- {
- $headerVar = $this->getHeaderField();
- $bodyVar = $this->getBodyField();
- $rawVar = $this->getRawField();
- // Define empty content
- $content = [
- $headerVar => [],
- $bodyVar => ''
- ];
- $headerRegex = "/^---\n(.+?)\n---\n{0,}(.*)$/uis";
- // Normalize line endings to Unix style.
- $data = preg_replace("/(\r\n|\r)/", "\n", $data);
- // Parse header.
- preg_match($headerRegex, ltrim($data), $matches);
- if(empty($matches)) {
- $content[$bodyVar] = $data;
- } else {
- // Normalize frontmatter.
- $frontmatter = preg_replace("/\n\t/", "\n ", $matches[1]);
- if ($rawVar) {
- $content[$rawVar] = $frontmatter;
- }
- $content[$headerVar] = $this->getHeaderFormatter()->decode($frontmatter);
- $content[$bodyVar] = $matches[2];
- }
- return $content;
- }
- }
|