Parsers e pipeline de metadata
FrontMatterParser separa YAML e corpo e devolve um ContentDocument. Ele exige delimitadores completos, aceita CRLF e rejeita YAML que não resulte em mapa.
Para MDX, MetaCascadeResolver lê _defaults.yaml da raiz à folha e faz merge raso. Em paralelo, MetaKeyOriginResolver registra o arquivo de origem de cada chave raiz para mensagens de lint.
ContentMetaLinter verifica chaves permitidas e sugestões. ContentMetaValidator verifica obrigatoriedade e tipos. ContentMetaHydrator converte o array em ContentMeta e DTOs aninhados como SocialMeta, OpenGraphMeta, ArticleMeta, TwitterCardMeta e SitemapMeta.
Itens de Collection passam posteriormente por outro ciclo array → merge → validação → hidratação em CollectionDefaultsMerger.
MarkdownParser usa GithubFlavoredMarkdownConverter com HTML permitido. A extensão GFM ainda bloqueia tags perigosas.
Depois da conversão, ReadingTimeCalculator conta as palavras do HTML visível,
conta imagens e acrescenta 12 segundos por imagem. O resultado é anexado ao
ContentMeta somente depois da cascata e dos defaults de Collection, garantindo
que ContentSummaryFactory apenas repasse o mesmo objeto sem recalcular.
Como nomes de componentes com ponto não fazem parte da gramática de tags do CommonMark, o parser troca temporariamente os pontos de tags x-* por um placeholder válido e os restaura depois da conversão.
Antes de o HTML intermediário virar Blade real, escapeLiteralBladeSyntax() protege echos e diretivas com o mecanismo de escape nativo. Assim, somente componentes atravessam como Blade executável.