Browse Source

Fix Pico::parseFileMeta() for non-YAML 1-liners

\Symfony\Component\Yaml\Parser::parse() returns the unchanged value when a 1-liner string which is no valid YAML is passed. Assume this string to be the page title. Thus the following page will work now:

```
---
This is the title
---

# Example page

{{ meta.title }} is going to be "This is the title" - or "%meta.title%" == "This is the title".
```
Daniel Rudolf 9 years ago
parent
commit
fb4bdfe1fc
2 changed files with 9 additions and 1 deletions
  1. 1 0
      CHANGELOG.md
  2. 8 1
      lib/Pico.php

+ 1 - 0
CHANGELOG.md

@@ -6,6 +6,7 @@ Released: -
 
 ```
 * [New] Add Pico's social icons to default theme
+* [Fixed] Fix handling of non-YAML 1-line front matters
 ```
 
 ### Version 1.0.3

+ 8 - 1
lib/Pico.php

@@ -777,7 +777,14 @@ class Pico
         if (preg_match($pattern, $rawContent, $rawMetaMatches) && isset($rawMetaMatches[3])) {
             $yamlParser = new \Symfony\Component\Yaml\Parser();
             $meta = $yamlParser->parse($rawMetaMatches[3]);
-            $meta = ($meta !== null) ? array_change_key_case($meta, CASE_LOWER) : array();
+
+            if ($meta !== null) {
+                // the parser may return a string for non-YAML 1-liners
+                // assume that this string is the page title
+                $meta = is_array($meta) ? array_change_key_case($meta, CASE_LOWER) : array('title' => $meta);
+            } else {
+                $meta = array();
+            }
 
             foreach ($headers as $fieldId => $fieldName) {
                 $fieldName = strtolower($fieldName);