addExtension(new CommonMarkCoreExtension()); $environment->addExtension(new FrontMatterExtension($parser)); return $environment; } private function skipIfParserNotAvailable(FrontMatterDataParserInterface $parser, bool $shouldTest): void { if (! $shouldTest) { $this->markTestSkipped(\sprintf('Cannot test with %s due to missing prerequisites', \get_class($parser))); } } /** * @dataProvider parserProvider */ public function testWithSampleData(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $markdown = <<Hello World!

This is my awesome blog post

EOT; $expectedFrontMatter = [ 'layout' => 'post', 'title' => 'Blogging Like a Hacker', 'redirect_from' => [ '/blog/my-post', '/blog/2020-04/my-post', ], ]; $converter = new MarkdownConverter($this->getEnvironment($parser)); $result = $converter->convert($markdown); $this->assertInstanceOf(RenderedContentWithFrontMatter::class, $result); $this->assertInstanceOf(\Stringable::class, $result); \assert($result instanceof RenderedContentWithFrontMatter); $this->assertSame($expectedFrontMatter, $result->getFrontMatter()); $this->assertSame($expectedHtml, (string) $result->getContent()); $this->assertSame($expectedHtml, (string) $result); $this->assertSame(1, $result->getDocument()->getStartLine()); $this->assertSame(9, $result->getDocument()->firstChild()->getStartLine()); } /** * @dataProvider parserProvider */ public function testWithMultipleYamlDocuments(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $markdown = <<

more_yaml: true

Hello World!

EOT; $expectedFrontMatter = [ 'layout' => 'post', 'title' => 'Blogging Like a Hacker', 'redirect_from' => [ '/blog/my-post', '/blog/2020-04/my-post', ], ]; $converter = new MarkdownConverter($this->getEnvironment($parser)); $result = $converter->convert($markdown); $this->assertInstanceOf(RenderedContentWithFrontMatter::class, $result); $this->assertInstanceOf(\Stringable::class, $result); \assert($result instanceof RenderedContentWithFrontMatter); $this->assertSame($expectedFrontMatter, $result->getFrontMatter()); $this->assertSame($expectedHtml, (string) $result->getContent()); $this->assertSame($expectedHtml, (string) $result); $this->assertSame(1, $result->getDocument()->getStartLine()); $this->assertSame(9, $result->getDocument()->firstChild()->getStartLine()); } /** * @dataProvider parserProvider */ public function testWithWindowsLineEndings(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $markdown = "---\r\nfoo: bar\r\n---\r\n\r\n# Test"; $expectedHtml = "

Test

\n"; $expectedFrontMatter = ['foo' => 'bar']; $converter = new MarkdownConverter($this->getEnvironment($parser)); $result = $converter->convertToHtml($markdown); $this->assertInstanceOf(RenderedContentWithFrontMatter::class, $result); $this->assertInstanceOf(\Stringable::class, $result); \assert($result instanceof RenderedContentWithFrontMatter); $this->assertSame($expectedFrontMatter, $result->getFrontMatter()); $this->assertSame($expectedHtml, (string) $result->getContent()); $this->assertSame($expectedHtml, (string) $result); $this->assertSame(1, $result->getDocument()->getStartLine()); $this->assertSame(5, $result->getDocument()->firstChild()->getStartLine()); } /** * @dataProvider parserProvider */ public function testWithNoFrontMatter(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $markdown = '# Hello World!'; $converter = new MarkdownConverter($this->getEnvironment($parser)); $result = $converter->convert($markdown); $this->assertInstanceOf(RenderedContentInterface::class, $result); $this->assertNotInstanceOf(RenderedContentWithFrontMatter::class, $result); $this->assertInstanceOf(\Stringable::class, $result); $expectedHtml = "

Hello World!

\n"; $this->assertSame($expectedHtml, $result->getContent()); $this->assertSame($expectedHtml, (string) $result); $this->assertSame(1, $result->getDocument()->getStartLine()); $this->assertSame(1, $result->getDocument()->firstChild()->getStartLine()); } /** * @dataProvider parserProvider */ public function testWithInvalidYaml(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $this->expectException(InvalidFrontMatterException::class); $markdown = <<getEnvironment($parser)); $converter->convert($markdown); } /** * @dataProvider parserProvider */ public function testRenderXml(FrontMatterDataParserInterface $parser, bool $shouldTest): void { $this->skipIfParserNotAvailable($parser, $shouldTest); $markdown = << Hello World! This is my awesome blog post XML; $environment = $this->getEnvironment($parser); $document = (new MarkdownParser($environment))->parse($markdown); $xml = (new XmlRenderer($environment))->renderDocument($document)->getContent(); $this->assertSame($expectedXml, \rtrim($xml)); } }