function FrontMatter::parse

Same name in other branches
  1. 9 core/lib/Drupal/Component/FrontMatter/FrontMatter.php \Drupal\Component\FrontMatter\FrontMatter::parse()
  2. 10 core/lib/Drupal/Component/FrontMatter/FrontMatter.php \Drupal\Component\FrontMatter\FrontMatter::parse()
  3. 11.x core/lib/Drupal/Component/FrontMatter/FrontMatter.php \Drupal\Component\FrontMatter\FrontMatter::parse()

Parses the source.

Return value

array An associative array containing:

  • code: The real source code.
  • data: The front matter data extracted and decoded.
  • line: The line number where the real source code starts.

Throws

\Drupal\Component\Serialization\Exception\InvalidDataTypeException Exception thrown when the Front Matter cannot be parsed.

File

core/modules/help_topics/src/FrontMatter.php, line 95

Class

FrontMatter
Extracts Front Matter from the beginning of a source.

Namespace

Drupal\help_topics

Code

private function parse() {
    if (!$this->parsed) {
        $this->parsed = [
            'code' => $this->source,
            'data' => [],
            'line' => 1,
        ];
        // Check for front matter data.
        $len = strlen(static::FRONT_MATTER_SEPARATOR);
        $matches = [];
        if (substr($this->parsed['code'], 0, $len + 1) === static::FRONT_MATTER_SEPARATOR . "\n" || substr($this->parsed['code'], 0, $len + 2) === static::FRONT_MATTER_SEPARATOR . "\r\n") {
            preg_match(static::FRONT_MATTER_REGEXP, $this->parsed['code'], $matches);
            $matches = array_map('trim', $matches);
        }
        // Immediately return if the code doesn't contain front matter data.
        if (empty($matches)) {
            return $this->parsed;
        }
        // Set the extracted source code.
        $this->parsed['code'] = $matches[2];
        // Set the extracted front matter data. Do not catch any exceptions here
        // as doing so would only obfuscate any errors found in the front matter
        // data. Typecast to an array to ensure top level scalars are in an array.
        if ($matches[1]) {
            $this->parsed['data'] = (array) $this->serializer::decode($matches[1]);
        }
        // Determine the real source line by counting newlines from the data and
        // then adding 2 to account for the front matter separator (---) wrappers
        // and then adding 1 more for the actual line number after the data.
        $this->parsed['line'] = count(preg_split('/\\r\\n|\\n/', $matches[1])) + 3;
    }
    return $this->parsed;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.