2014-09-26 03:04:25 +04:00
|
|
|
<?php
|
2018-03-15 22:46:03 +03:00
|
|
|
require 'SampleExtensions.php';
|
2014-09-26 03:04:25 +04:00
|
|
|
|
2017-11-11 05:56:03 +03:00
|
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
|
|
|
|
class ParsedownTest extends TestCase
|
2014-09-26 03:04:25 +04:00
|
|
|
{
|
|
|
|
final function __construct($name = null, array $data = array(), $dataName = '')
|
|
|
|
{
|
|
|
|
$this->dirs = $this->initDirs();
|
|
|
|
$this->Parsedown = $this->initParsedown();
|
|
|
|
|
|
|
|
parent::__construct($name, $data, $dataName);
|
|
|
|
}
|
|
|
|
|
2017-06-19 01:00:00 +03:00
|
|
|
private $dirs;
|
|
|
|
protected $Parsedown;
|
2014-09-26 03:04:25 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function initDirs()
|
|
|
|
{
|
|
|
|
$dirs []= dirname(__FILE__).'/data/';
|
|
|
|
|
|
|
|
return $dirs;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return Parsedown
|
|
|
|
*/
|
|
|
|
protected function initParsedown()
|
|
|
|
{
|
2016-09-05 22:10:23 +03:00
|
|
|
$Parsedown = new TestParsedown();
|
2014-09-26 03:04:25 +04:00
|
|
|
|
|
|
|
return $Parsedown;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider data
|
|
|
|
* @param $test
|
|
|
|
* @param $dir
|
|
|
|
*/
|
|
|
|
function test_($test, $dir)
|
|
|
|
{
|
|
|
|
$markdown = file_get_contents($dir . $test . '.md');
|
|
|
|
|
|
|
|
$expectedMarkup = file_get_contents($dir . $test . '.html');
|
|
|
|
|
|
|
|
$expectedMarkup = str_replace("\r\n", "\n", $expectedMarkup);
|
|
|
|
$expectedMarkup = str_replace("\r", "\n", $expectedMarkup);
|
|
|
|
|
2017-05-09 21:22:58 +03:00
|
|
|
$this->Parsedown->setSafeMode(substr($test, 0, 3) === 'xss');
|
2018-04-02 19:06:31 +03:00
|
|
|
$this->Parsedown->setStrictMode(substr($test, 0, 6) === 'strict');
|
2017-05-01 05:33:49 +03:00
|
|
|
|
2014-09-26 03:04:25 +04:00
|
|
|
$actualMarkup = $this->Parsedown->text($markdown);
|
|
|
|
|
|
|
|
$this->assertEquals($expectedMarkup, $actualMarkup);
|
|
|
|
}
|
|
|
|
|
2018-03-15 22:46:03 +03:00
|
|
|
function testRawHtml()
|
2018-03-15 13:42:29 +03:00
|
|
|
{
|
|
|
|
$markdown = "```php\nfoobar\n```";
|
|
|
|
$expectedMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
|
2018-03-15 14:09:55 +03:00
|
|
|
$expectedSafeMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
|
2018-03-15 13:42:29 +03:00
|
|
|
|
|
|
|
$unsafeExtension = new UnsafeExtension;
|
|
|
|
$actualMarkup = $unsafeExtension->text($markdown);
|
|
|
|
|
|
|
|
$this->assertEquals($expectedMarkup, $actualMarkup);
|
2018-03-15 14:09:55 +03:00
|
|
|
|
|
|
|
$unsafeExtension->setSafeMode(true);
|
|
|
|
$actualSafeMarkup = $unsafeExtension->text($markdown);
|
|
|
|
|
|
|
|
$this->assertEquals($expectedSafeMarkup, $actualSafeMarkup);
|
2018-03-15 13:42:29 +03:00
|
|
|
}
|
|
|
|
|
2018-03-15 22:46:03 +03:00
|
|
|
function testTrustDelegatedRawHtml()
|
|
|
|
{
|
|
|
|
$markdown = "```php\nfoobar\n```";
|
|
|
|
$expectedMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
|
|
|
|
$expectedSafeMarkup = $expectedMarkup;
|
|
|
|
|
|
|
|
$unsafeExtension = new TrustDelegatedExtension;
|
|
|
|
$actualMarkup = $unsafeExtension->text($markdown);
|
|
|
|
|
|
|
|
$this->assertEquals($expectedMarkup, $actualMarkup);
|
|
|
|
|
|
|
|
$unsafeExtension->setSafeMode(true);
|
|
|
|
$actualSafeMarkup = $unsafeExtension->text($markdown);
|
|
|
|
|
|
|
|
$this->assertEquals($expectedSafeMarkup, $actualSafeMarkup);
|
|
|
|
}
|
|
|
|
|
2014-09-26 03:04:25 +04:00
|
|
|
function data()
|
|
|
|
{
|
|
|
|
$data = array();
|
|
|
|
|
|
|
|
foreach ($this->dirs as $dir)
|
|
|
|
{
|
|
|
|
$Folder = new DirectoryIterator($dir);
|
|
|
|
|
|
|
|
foreach ($Folder as $File)
|
|
|
|
{
|
|
|
|
/** @var $File DirectoryIterator */
|
|
|
|
|
|
|
|
if ( ! $File->isFile())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$filename = $File->getFilename();
|
|
|
|
|
|
|
|
$extension = pathinfo($filename, PATHINFO_EXTENSION);
|
|
|
|
|
|
|
|
if ($extension !== 'md')
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$basename = $File->getBasename('.md');
|
|
|
|
|
|
|
|
if (file_exists($dir . $basename . '.html'))
|
|
|
|
{
|
|
|
|
$data []= array($basename, $dir);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function test_no_markup()
|
|
|
|
{
|
|
|
|
$markdownWithHtml = <<<MARKDOWN_WITH_MARKUP
|
|
|
|
<div>_content_</div>
|
|
|
|
|
|
|
|
sparse:
|
|
|
|
|
|
|
|
<div>
|
|
|
|
<div class="inner">
|
|
|
|
_content_
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
paragraph
|
|
|
|
|
|
|
|
<style type="text/css">
|
|
|
|
p {
|
|
|
|
color: red;
|
|
|
|
}
|
|
|
|
</style>
|
2014-10-10 22:07:41 +04:00
|
|
|
|
|
|
|
comment
|
|
|
|
|
|
|
|
<!-- html comment -->
|
2014-09-26 03:04:25 +04:00
|
|
|
MARKDOWN_WITH_MARKUP;
|
|
|
|
|
|
|
|
$expectedHtml = <<<EXPECTED_HTML
|
2014-12-03 00:53:19 +03:00
|
|
|
<p><div><em>content</em></div></p>
|
2014-09-26 03:04:25 +04:00
|
|
|
<p>sparse:</p>
|
2014-12-03 00:53:19 +03:00
|
|
|
<p><div>
|
2018-03-19 01:33:26 +03:00
|
|
|
<div class="inner">
|
2014-09-26 03:04:25 +04:00
|
|
|
<em>content</em>
|
2014-12-03 00:53:19 +03:00
|
|
|
</div>
|
|
|
|
</div></p>
|
2014-09-26 03:04:25 +04:00
|
|
|
<p>paragraph</p>
|
2018-03-19 01:33:26 +03:00
|
|
|
<p><style type="text/css">
|
2014-12-15 01:52:03 +03:00
|
|
|
p {
|
|
|
|
color: red;
|
|
|
|
}
|
|
|
|
</style></p>
|
2014-10-10 22:07:41 +04:00
|
|
|
<p>comment</p>
|
2014-12-03 00:53:19 +03:00
|
|
|
<p><!-- html comment --></p>
|
2014-09-26 03:04:25 +04:00
|
|
|
EXPECTED_HTML;
|
2016-09-05 22:10:23 +03:00
|
|
|
|
|
|
|
$parsedownWithNoMarkup = new TestParsedown();
|
2014-09-26 03:04:25 +04:00
|
|
|
$parsedownWithNoMarkup->setMarkupEscaped(true);
|
|
|
|
$this->assertEquals($expectedHtml, $parsedownWithNoMarkup->text($markdownWithHtml));
|
|
|
|
}
|
2015-07-20 17:30:15 +03:00
|
|
|
|
|
|
|
public function testLateStaticBinding()
|
|
|
|
{
|
|
|
|
$parsedown = Parsedown::instance();
|
|
|
|
$this->assertInstanceOf('Parsedown', $parsedown);
|
|
|
|
|
|
|
|
// After instance is already called on Parsedown
|
|
|
|
// subsequent calls with the same arguments return the same instance
|
|
|
|
$sameParsedown = TestParsedown::instance();
|
|
|
|
$this->assertInstanceOf('Parsedown', $sameParsedown);
|
|
|
|
$this->assertSame($parsedown, $sameParsedown);
|
|
|
|
|
|
|
|
$testParsedown = TestParsedown::instance('test late static binding');
|
|
|
|
$this->assertInstanceOf('TestParsedown', $testParsedown);
|
|
|
|
|
|
|
|
$sameInstanceAgain = TestParsedown::instance('test late static binding');
|
|
|
|
$this->assertSame($testParsedown, $sameInstanceAgain);
|
|
|
|
}
|
2014-09-26 03:04:25 +04:00
|
|
|
}
|