1
0
mirror of https://github.com/erusev/parsedown.git synced 2025-09-03 20:02:33 +02:00

Compare commits

...

115 Commits

Author SHA1 Message Date
Emanuil Rusev
0d28808392 void markup blocks be marked 2015-01-12 23:24:13 +02:00
Emanuil Rusev
78960cf792 improve formatting 2015-01-12 18:53:24 +02:00
Emanuil Rusev
8f2e9c7cf6 definitions are blocks
in the old implementation it wasn’t possible to have multiline
definitions
2015-01-12 18:52:17 +02:00
Emanuil Rusev
3eb6d349f0 "src" and "alt" attributes should come first 2015-01-12 02:58:08 +02:00
Emanuil Rusev
859b1b10c1 update tests 2015-01-12 02:57:20 +02:00
Emanuil Rusev
08b01a1a29 blocks should be able to return markup 2015-01-12 02:55:00 +02:00
Emanuil Rusev
1686b2fbff we no longer call inline elements spans 2015-01-12 02:55:00 +02:00
Emanuil Rusev
15a32fcd0e no need to know the structure of markup blocks 2015-01-12 02:55:00 +02:00
Emanuil Rusev
4aca208f96 update readme 2015-01-11 16:23:43 +02:00
Emanuil Rusev
cedf96a64e update readme 2015-01-11 16:04:19 +02:00
Emanuil Rusev
9f58363e4b Merge pull request #260 from rhukster/master
Fix for Parsedown stripping classes on images supported by ParsedownExtra
2015-01-11 14:50:08 +02:00
Emanuil Rusev
6b4a459f97 Merge pull request #261 from naNuke/master
breaksEnabled fix
2015-01-11 14:08:17 +02:00
naNuke
05bf198d26 breaksEnabled fix 2015-01-11 06:12:01 +01:00
Andy Miller
30234a58fa No longer needed in this solution 2015-01-10 19:44:30 -07:00
Andy Miller
03ff22c7df Attempted fix for stripped classes on images with ParsedownExtra - re: https://github.com/erusev/parsedown-extra/issues/32 2015-01-10 19:40:39 -07:00
Emanuil Rusev
098f188552 update readme 2015-01-10 14:53:08 +02:00
Emanuil Rusev
e68a458105 improve consistency 2015-01-10 14:22:54 +02:00
Emanuil Rusev
86a27b48bc update readme 2015-01-10 03:43:48 +02:00
Emanuil Rusev
c45dee6850 update readme 2015-01-10 03:41:29 +02:00
Emanuil Rusev
06135cd75a improve CommonMark compliance 2015-01-10 02:45:51 +02:00
Emanuil Rusev
7d3af6bf83 update commonmark test 2015-01-09 00:08:14 +02:00
Emanuil Rusev
dfacf7a71a add urlsLinked setter 2015-01-08 16:13:55 +02:00
Emanuil Rusev
fd0d8125e7 introduce more structure to parsing of unmarked inlines 2015-01-08 15:19:43 +02:00
Emanuil Rusev
b1be886d65 improve names of protected members 2015-01-05 15:05:18 +02:00
Emanuil Rusev
19bc6a7083 update variable names to match updated member names 2015-01-05 14:22:06 +02:00
Emanuil Rusev
b5efe98e2f improve names of protected members 2015-01-05 14:22:06 +02:00
Emanuil Rusev
5639ef7d69 fix PHPDoc 2015-01-05 14:22:06 +02:00
Emanuil Rusev
d42fcdc423 improve readme 2015-01-05 14:18:36 +02:00
Emanuil Rusev
d29d879ec6 separate parsing of inlines that don't have markers to improve simplicity 2015-01-04 18:37:24 +02:00
Emanuil Rusev
c9b4de3c9d resolve #253 2014-12-21 13:51:16 +02:00
Emanuil Rusev
38cc1ca7e0 resolve #251 2014-12-16 13:58:33 +02:00
Emanuil Rusev
23c4097fde restore support for PHP 5.2 2014-12-15 13:59:37 +02:00
Emanuil Rusev
05e87566a9 Merge branch 'master' of https://github.com/erusev/parsedown 2014-12-15 01:08:15 +02:00
Emanuil Rusev
ac68800717 improve extensibility 2014-12-15 01:07:29 +02:00
Emanuil Rusev
1aade35c5e update test 2014-12-15 00:56:22 +02:00
Emanuil Rusev
361febf7c6 improve CommonMark compliance 2014-12-15 00:52:03 +02:00
Emanuil Rusev
715f7572ad improve readme 2014-12-12 02:30:45 +02:00
Emanuil Rusev
907bd11613 improve readme 2014-12-11 15:30:40 +02:00
Emanuil Rusev
56c6169822 improve readme 2014-12-11 14:34:58 +02:00
Emanuil Rusev
6d54fda73a improve readme 2014-12-10 20:37:33 +02:00
Emanuil Rusev
3b5e4e23ec improve readme 2014-12-10 20:36:15 +02:00
Emanuil Rusev
85ee06898b resolve #182 2014-12-10 17:19:05 +02:00
Emanuil Rusev
4c24e68b42 Merge remote-tracking branch 'origin/commonmark'
Conflicts:
	Parsedown.php
	phpunit.xml.dist
	test/ParsedownTest.php
2014-12-06 02:50:54 +02:00
Emanuil Rusev
094cb88dac update test 2014-12-02 23:53:19 +02:00
Emanuil Rusev
7ab3c60a77 improve CommonMark compliance 2014-12-02 22:23:43 +02:00
Emanuil Rusev
2438c1a43d improve output readability 2014-11-29 23:53:38 +02:00
Emanuil Rusev
46196c1ac3 markup formatting shouldn't impact results 2014-11-29 22:58:42 +02:00
Emanuil Rusev
aa3d4d6eb7 simplify 2014-11-29 21:39:42 +02:00
Emanuil Rusev
6fb534bc34 improve consistency 2014-11-29 21:34:46 +02:00
Emanuil Rusev
28a202ee9e simplify 2014-11-29 20:18:23 +02:00
Emanuil Rusev
e46be110fb Merge branch 'master' into commonmark 2014-11-29 16:42:04 +02:00
Emanuil Rusev
495e7ac73b resolve #247 2014-11-29 04:29:14 +02:00
Emanuil Rusev
5bc6d90f8b resolve #248 2014-11-28 14:03:12 +02:00
Emanuil Rusev
9816507a75 markup should preserve empty lines 2014-11-19 20:18:56 +02:00
Emanuil Rusev
7000cbc2d2 improve readme 2014-11-12 22:27:29 +02:00
Emanuil Rusev
6df242bc97 improve readme 2014-11-12 03:37:36 +02:00
Emanuil Rusev
f4453fd729 improve readme 2014-11-12 03:36:17 +02:00
Emanuil Rusev
d8011c00ab improve readme 2014-11-09 13:40:39 +02:00
Emanuil Rusev
da5d75e97e resolve #209 2014-10-29 22:29:46 +02:00
Emanuil Rusev
2adb87ef41 Merge pull request #236 from naNuke/escapeComment
Ignore html comments as well with markupEscape option.
2014-10-10 21:11:23 +03:00
naNuke
74926c9831 Add test of escaped html comment. 2014-10-10 20:07:41 +02:00
naNuke
68f3aea036 Ignore html comments as well with markupEscape option. 2014-10-10 19:07:25 +02:00
Emanuil Rusev
f91e4dece3 improve consistency 2014-09-26 13:06:40 +03:00
Emanuil Rusev
c62365adc4 improve extensibility of test case 2014-09-26 02:06:16 +03:00
Emanuil Rusev
bb7a3f41e3 improve readme 2014-09-22 12:01:39 +03:00
Emanuil Rusev
f64c1387f8 fix indents 2014-09-22 02:52:45 +03:00
Emanuil Rusev
59c77e706b improve consistency 2014-09-22 02:36:42 +03:00
Emanuil Rusev
e0965ce09b Merge pull request #224 from hkdobrev/no-markup-option
Add `noMarkup` option to escape user HTML
2014-09-21 23:19:23 +03:00
Haralan Dobrev
0a3fde3774 Add noMarkup option to escape user HTML
Resolves #106.

This change introduces a new option - `noMarkup`. You could set it the
`setNoMarkup()` method similar to the `setBreaksEnabled()` one.

Example usage:

``` php
<?php

$parsedown = new Parsedown();
$parsedown->setNoMarkup(true);
$parsedown->text('<div><strong>*Some text*</strong></div>');

// Outputs:
// <p>&lt;div>&lt;strong><em>Some text</em>&lts;/strong>&lt;/div></p>
```
2014-09-20 14:53:19 +03:00
Emanuil Rusev
93f7b26427 imp 2014-09-14 01:14:40 +03:00
Emanuil Rusev
d53c7dbcd9 Merge pull request #221 from hkdobrev/commonmark-renaming
Rename everything to CommonMark
2014-09-14 00:29:04 +03:00
Haralan Dobrev
42222e6b01 Rename everything to CommonMark 2014-09-14 00:11:18 +03:00
Emanuil Rusev
e1cb3b7b23 improve readme 2014-09-13 00:11:56 +03:00
Emanuil Rusev
5bf56ea041 improve readme 2014-09-12 23:52:06 +03:00
Emanuil Rusev
9e98ed04de improve readme 2014-09-11 15:47:59 +03:00
Emanuil Rusev
1c89e6f771 improve readme 2014-09-09 14:30:17 +03:00
Emanuil Rusev
e7d160049e Merge pull request #218 from hkdobrev/common-mark
Rename Standard Markdown to CommonMark
2014-09-06 01:17:15 +03:00
Haralan Dobrev
ce4a29aec5 Rename Standard Markdown to CommonMark
http://blog.codinghorror.com/standard-markdown-is-now-common-markdown/

2d37920c39
2014-09-06 01:12:35 +03:00
Emanuil Rusev
8ecf828777 Merge pull request #217 from hkdobrev/standard-markdown
Standard markdown
2014-09-05 23:38:01 +03:00
Haralan Dobrev
c18ff7f370 Add Docblock and attribution to JS test runner 2014-09-05 23:28:07 +03:00
Haralan Dobrev
6f1fac9823 Add Standard Markdown testsuite.
You could run the Parsedown testsuite only with:
    phpunit --testsuite ParsedownTests

And you could run the Standard Markdown one with:
    phpunit --testsuite StandardMarkdown

See more at http://standardmarkdown.com/
2014-09-05 23:12:33 +03:00
Emanuil Rusev
0220a93010 Merge pull request #208 from apfelbox/max-h6
Limit generated headlines to h6
2014-08-26 09:31:52 +03:00
Jannik Zschiesche
512cc1f065 Limit generated headlines to h6 2014-08-25 21:06:03 +02:00
Emanuil Rusev
9437766539 Merge pull request #200 from hkdobrev/html-attributes-slashes
Allow slashes in HTML attributes
2014-08-14 01:27:48 +03:00
Haralan Dobrev
1127681d56 Allow slashes in HTML attributes 2014-08-13 23:54:52 +03:00
Emanuil Rusev
e33ac1c56e improve readme 2014-06-18 12:27:25 +03:00
Emanuil Rusev
d24439ada0 improve test suite 2014-05-21 23:20:46 +03:00
Emanuil Rusev
1ae100beab improve comment 2014-05-17 17:37:17 +03:00
Emanuil Rusev
82a5a78a36 improve readme 2014-05-17 17:13:00 +03:00
Emanuil Rusev
4ede4340ab improve readme 2014-05-16 03:34:43 +03:00
Emanuil Rusev
170a6bf770 improve readme 2014-05-16 01:27:54 +03:00
Emanuil Rusev
21db821324 improve readme 2014-05-16 01:15:21 +03:00
Emanuil Rusev
b384839d15 update readme 2014-05-14 20:07:52 +03:00
Emanuil Rusev
2da10d277b resolve #105 2014-05-14 13:14:49 +03:00
Emanuil Rusev
532b5ede35 resolve #129 2014-05-14 01:11:05 +03:00
Emanuil Rusev
2bd2f81f4f methods should not have more than one optional parameters 2014-05-12 16:18:00 +03:00
Emanuil Rusev
e318e66de5 improve consistency 2014-05-12 00:41:00 +03:00
Emanuil Rusev
0820d0a607 paragraph doesn't have to use a type 2014-05-12 00:34:47 +03:00
Emanuil Rusev
b8d1cfe91a improve extensibility 2014-05-11 22:31:02 +03:00
Emanuil Rusev
d85a233611 Merge pull request #171 from scarwu/master
identifyEscapeSequence() needs Array check
2014-05-11 20:57:05 +03:00
ScarWu
973d4a866d add array check 2014-05-11 23:36:01 +08:00
Emanuil Rusev
d19c2b6942 improve names 2014-05-10 16:28:00 +03:00
Emanuil Rusev
4dde57451d fix consecutive reference links 2014-05-06 17:05:49 +03:00
Emanuil Rusev
44686c4f1e improve extensibility 2014-05-06 01:12:27 +03:00
Emanuil Rusev
db02ecf259 "reference" is a definition 2014-05-05 14:43:31 +03:00
Emanuil Rusev
aa004d4595 improve code organisation 2014-05-05 14:39:40 +03:00
Emanuil Rusev
1bb65457ed remove unnecessary comments 2014-05-05 13:46:26 +03:00
Emanuil Rusev
0c9a4af8ab improve naming consistency 2014-05-03 18:02:06 +03:00
Emanuil Rusev
cc94c1b584 resolve #167 2014-05-02 18:21:10 +03:00
Emanuil Rusev
e8d8801db4 resolve #135 2014-05-01 02:44:35 +03:00
Emanuil Rusev
521803cdcd resolve #136 2014-05-01 02:42:01 +03:00
Emanuil Rusev
0eb480324c resolve #145 2014-05-01 02:02:14 +03:00
Emanuil Rusev
7c78aff578 resolve #163 2014-05-01 01:47:14 +03:00
Emanuil Rusev
2a5f99547c resolve #162 2014-05-01 01:05:31 +03:00
Emanuil Rusev
e373391e7d resolve #164 2014-05-01 00:29:21 +03:00
35 changed files with 975 additions and 562 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +1,18 @@
## Parsedown
Better [Markdown](http://en.wikipedia.org/wiki/Markdown) parser for PHP.
Better Markdown Parser in PHP
- [Demo](http://parsedown.org/demo)
- [Tests](http://parsedown.org/tests/)
[[ demo ]](http://parsedown.org/demo)
### Features
* [Fast](http://parsedown.org/speed)
* [Consistent](http://parsedown.org/consistency)
* [GitHub Flavored](https://help.github.com/articles/github-flavored-markdown)
* [Tested](https://travis-ci.org/erusev/parsedown) in PHP 5.2, 5.3, 5.4, 5.5, 5.6 and [hhvm](http://www.hhvm.com/)
* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
* [Tested](http://parsedown.org/tests/) in PHP 5.2, 5.3, 5.4, 5.5, 5.6 and [hhvm](http://www.hhvm.com/)
* Extensible
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
* [JavaScript port](https://github.com/hkdobrev/parsedown.js) under development
### Installation
@@ -24,3 +25,22 @@ $Parsedown = new Parsedown();
echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</em>!</p>
```
More examples in [the wiki](https://github.com/erusev/parsedown/wiki/Usage) and in [this video tutorial](http://youtu.be/wYZBY8DEikI).
### Questions
**How does Parsedown work?**<br/>
It tries to read Markdown like a human. First, it looks at the lines. Its interested in how the lines start. This helps it recognise blocks. It knows, for example, that if a line start with a `-` then it perhaps belong to a list. Once it recognises the blocks, it continues to the content. As it reads, it watches out for special characters. This helps it recognise inline elements (or inlines).
**Why doesnt Parsedown use namespaces?**<br/>
It'd mean no support for PHP 5.2. Would it be worth it?
**Is Parsedown compliant with CommonMark?**<br/>
The majority of the CommonMark tests pass. Most of the tests that don't pass deal with cases that are quite extreme. Yet, we are working on them. As CommonMark matures, compliance should improve.
**Who uses Parsedown?**<br/>
[phpDocumentor](http://www.phpdoc.org/), [October CMS](http://octobercms.com/), [Bolt CMS](http://bolt.cm/), [Kirby CMS](http://getkirby.com/), [Grav CMS](http://getgrav.org/), [Statamic CMS](http://www.statamic.com/), [RaspberryPi.org](http://www.raspberrypi.org/) and [more](https://www.versioneye.com/php/erusev:parsedown/references).
**How can I help?**<br/>
Use the project, tell friends about it and if you feel generous, [donate some money](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2).

View File

@@ -2,7 +2,7 @@
<phpunit bootstrap="test/bootstrap.php" colors="true">
<testsuites>
<testsuite>
<file>test/Test.php</file>
<file>test/ParsedownTest.php</file>
</testsuite>
</testsuites>
</phpunit>

74
test/CommonMarkTest.php Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
* Test Parsedown against the CommonMark spec.
*
* Some code based on the original JavaScript test runner by jgm.
*
* @link http://commonmark.org/ CommonMark
* @link http://git.io/8WtRvQ JavaScript test runner
*/
class CommonMarkTest extends PHPUnit_Framework_TestCase
{
const SPEC_URL = 'https://raw.githubusercontent.com/jgm/stmd/master/spec.txt';
/**
* @dataProvider data
* @param $section
* @param $markdown
* @param $expectedHtml
*/
function test_($section, $markdown, $expectedHtml)
{
$Parsedown = new Parsedown();
$Parsedown->setUrlsLinked(false);
$actualHtml = $Parsedown->text($markdown);
$actualHtml = $this->normalizeMarkup($actualHtml);
$this->assertEquals($expectedHtml, $actualHtml);
}
function data()
{
$spec = file_get_contents(self::SPEC_URL);
$spec = strstr($spec, '<!-- END TESTS -->', true);
$tests = array();
$currentSection = '';
preg_replace_callback(
'/^\.\n([\s\S]*?)^\.\n([\s\S]*?)^\.$|^#{1,6} *(.*)$/m',
function($matches) use ( & $tests, & $currentSection, & $testCount) {
if (isset($matches[3]) and $matches[3]) {
$currentSection = $matches[3];
} else {
$testCount++;
$markdown = $matches[1];
$markdown = preg_replace('/→/', "\t", $markdown);
$expectedHtml = $matches[2];
$expectedHtml = $this->normalizeMarkup($expectedHtml);
$tests []= array(
$currentSection, # section
$markdown, # markdown
$expectedHtml, # html
);
}
},
$spec
);
return $tests;
}
private function normalizeMarkup($markup)
{
$markup = preg_replace("/\n+/", "\n", $markup);
$markup = preg_replace('/^\s+/m', '', $markup);
$markup = preg_replace('/^((?:<[\w]+>)+)\n/m', '$1', $markup);
$markup = preg_replace('/\n((?:<\/[\w]+>)+)$/m', '$1', $markup);
$markup = trim($markup);
return $markup;
}
}

139
test/ParsedownTest.php Normal file
View File

@@ -0,0 +1,139 @@
<?php
class ParsedownTest extends PHPUnit_Framework_TestCase
{
final function __construct($name = null, array $data = array(), $dataName = '')
{
$this->dirs = $this->initDirs();
$this->Parsedown = $this->initParsedown();
parent::__construct($name, $data, $dataName);
}
private $dirs, $Parsedown;
/**
* @return array
*/
protected function initDirs()
{
$dirs []= dirname(__FILE__).'/data/';
return $dirs;
}
/**
* @return Parsedown
*/
protected function initParsedown()
{
$Parsedown = new Parsedown();
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);
$actualMarkup = $this->Parsedown->text($markdown);
$this->assertEquals($expectedMarkup, $actualMarkup);
}
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>
comment
<!-- html comment -->
MARKDOWN_WITH_MARKUP;
$expectedHtml = <<<EXPECTED_HTML
<p>&lt;div&gt;<em>content</em>&lt;/div&gt;</p>
<p>sparse:</p>
<p>&lt;div&gt;
&lt;div class=&quot;inner&quot;&gt;
<em>content</em>
&lt;/div&gt;
&lt;/div&gt;</p>
<p>paragraph</p>
<p>&lt;style type=&quot;text/css&quot;&gt;
p {
color: red;
}
&lt;/style&gt;</p>
<p>comment</p>
<p>&lt;!-- html comment --&gt;</p>
EXPECTED_HTML;
$parsedownWithNoMarkup = new Parsedown();
$parsedownWithNoMarkup->setMarkupEscaped(true);
$this->assertEquals($expectedHtml, $parsedownWithNoMarkup->text($markdownWithHtml));
}
}

View File

@@ -1,65 +0,0 @@
<?php
class Test extends PHPUnit_Framework_TestCase
{
public function __construct($name = null, array $data = array(), $dataName = '')
{
$this->dataDir = dirname(__FILE__).'/data/';
parent::__construct($name, $data, $dataName);
}
private $dataDir;
/**
* @dataProvider data
*/
function test_($filename)
{
$markdown = file_get_contents($this->dataDir . $filename . '.md');
$expectedMarkup = file_get_contents($this->dataDir . $filename . '.html');
$expectedMarkup = str_replace("\r\n", "\n", $expectedMarkup);
$expectedMarkup = str_replace("\r", "\n", $expectedMarkup);
$actualMarkup = Parsedown::instance()->text($markdown);
$this->assertEquals($expectedMarkup, $actualMarkup);
}
function data()
{
$data = array();
$Folder = new DirectoryIterator($this->dataDir);
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($this->dataDir . $basename . '.html'))
{
$data []= array($basename);
}
}
return $data;
}
}

View File

@@ -4,5 +4,6 @@
<h4>h4</h4>
<h5>h5</h5>
<h6>h6</h6>
<p>####### not a heading</p>
<h1>closed h1</h1>
<p>#</p>

View File

@@ -10,6 +10,8 @@
###### h6
####### not a heading
# closed h1 #
#

View File

@@ -1,5 +1,13 @@
<div>_content_</div>
<p>sparse:</p>
<div>
<div class="inner">
_content_
</div>
</div>
</div>
<p>paragraph</p>
<style type="text/css">
p {
color: red;
}
</style>

View File

@@ -3,5 +3,15 @@
sparse:
<div>
<div class="inner">
_content_
</div>
</div>
</div>
paragraph
<style type="text/css">
p {
color: red;
}
</style>

View File

@@ -1,4 +1,6 @@
<p>escaped *emphasis*.</p>
<p><code>escaped \*emphasis\* in a code span</code></p>
<pre><code>escaped \*emphasis\* in a code block</code></pre>
<p>\ ` * _ { } [ ] ( ) > # + - . !</p>
<p>\ ` * _ { } [ ] ( ) > # + - . !</p>
<p><em>one_two</em> <strong>one_two</strong></p>
<p><em>one*two</em> <strong>one*two</strong></p>

View File

@@ -4,4 +4,8 @@ escaped \*emphasis\*.
escaped \*emphasis\* in a code block
\\ \` \* \_ \{ \} \[ \] \( \) \> \# \+ \- \. \!
\\ \` \* \_ \{ \} \[ \] \( \) \> \# \+ \- \. \!
_one\_two_ __one\_two__
*one\*two* **one\*two**

View File

@@ -0,0 +1,5 @@
<!-- single line -->
<p>paragraph</p>
<!--
multiline -->
<p>paragraph</p>

View File

@@ -0,0 +1,8 @@
<!-- single line -->
paragraph
<!--
multiline -->
paragraph

View File

@@ -1,28 +0,0 @@
<p>Headings:</p>
<h2 id="overview">Overview</h2>
<p>blah</p>
<H2 id="block">Block Elements</H2>
<p>blah</p>
<h3 id="span">
Span Elements
</h3>
<p>blah</p>
<p>Hr's:</p>
<hr>
<p>blah</p>
<hr/>
<p>blah</p>
<hr />
<p>blah</p>
<hr>
<p>blah</p>
<hr/>
<p>blah</p>
<hr />
<p>blah</p>
<hr class="foo" id="bar" />
<p>blah</p>
<hr class="foo" id="bar"/>
<p>blah</p>
<hr class="foo" id="bar" >
<p>blah</p>

View File

@@ -1,39 +0,0 @@
Headings:
<h2 id="overview">Overview</h2>
blah
<H2 id="block">Block Elements</H2>
blah
<h3 id="span">
Span Elements
</h3>
blah
Hr's:
<hr>
blah
<hr/>
blah
<hr />
blah
<hr>
blah
<hr/>
blah
<hr />
blah
<hr class="foo" id="bar" />
blah
<hr class="foo" id="bar"/>
blah
<hr class="foo" id="bar" >
blah

View File

@@ -1 +1,2 @@
<p><img alt="Markdown Logo" src="/md.png" /></p>
<p><img src="/md.png" alt="Markdown Logo" /></p>
<p>![missing reference]</p>

View File

@@ -1,3 +1,5 @@
![Markdown Logo][image]
[image]: /md.png
![missing reference]

View File

@@ -1 +1 @@
<p><img alt="alt" src="/md.png" title="title" /></p>
<p><img src="/md.png" alt="alt" title="title" /></p>

View File

@@ -1,3 +1,4 @@
<p>an <a href="http://example.com">implicit</a> reference link</p>
<p>an <a href="http://example.com">implicit</a> reference link with an empty link definition</p>
<p>an <a href="http://example.com">implicit</a> reference link followed by <a href="http://cnn.com">another</a></p>
<p>an <a href="http://example.com" title="Example">explicit</a> reference link with a title</p>

View File

@@ -4,6 +4,10 @@ an [implicit] reference link
an [implicit][] reference link with an empty link definition
an [implicit][] reference link followed by [another][]
[another]: http://cnn.com
an [explicit][example] reference link with a title
[example]: http://example.com "Example"

View File

@@ -1,4 +1,4 @@
<p><a href="http://example.com">link</a> and <a href="/tests/">another link</a></p>
<p><a href="http://example.com"><code>link</code></a></p>
<p><a href="http://example.com"><img alt="MD Logo" src="http://parsedown.org/md.png" /></a></p>
<p><a href="http://example.com"><img alt="MD Logo" src="http://parsedown.org/md.png" /> and text</a></p>
<p><a href="http://example.com"><img src="http://parsedown.org/md.png" alt="MD Logo" /></a></p>
<p><a href="http://example.com"><img src="http://parsedown.org/md.png" alt="MD Logo" /> and text</a></p>

View File

@@ -1,4 +1,6 @@
<blockquote>
<p>quote
the rest of it</p>
<p>another paragraph
the rest of it</p>
</blockquote>

View File

@@ -1,2 +1,5 @@
> quote
the rest of it
> another paragraph
the rest of it

View File

@@ -1,4 +0,0 @@
<hr />
<p>attributes:</p>
<hr style="background: #9bd;" />
<p>...</p>

View File

@@ -1,7 +0,0 @@
<hr />
attributes:
<hr style="background: #9bd;" />
...

View File

@@ -0,0 +1,12 @@
<hr>
<p>paragraph</p>
<hr/>
<p>paragraph</p>
<hr />
<p>paragraph</p>
<hr class="foo" id="bar" />
<p>paragraph</p>
<hr class="foo" id="bar"/>
<p>paragraph</p>
<hr class="foo" id="bar" >
<p>paragraph</p>

View File

@@ -0,0 +1,12 @@
<hr>
paragraph
<hr/>
paragraph
<hr />
paragraph
<hr class="foo" id="bar" />
paragraph
<hr class="foo" id="bar"/>
paragraph
<hr class="foo" id="bar" >
paragraph

View File

@@ -0,0 +1,9 @@
<ul>
<li>
<p>li</p>
<ul>
<li>li</li>
<li>li</li>
</ul>
</li>
</ul>

View File

@@ -0,0 +1,4 @@
- li
- li
- li

View File

@@ -1,4 +1,5 @@
<p>an <b>important</b> <a href=''>link</a></p>
<p>broken<br/>
line</p>
<p><b>inline tag</b> at the beginning</p>
<p><b>inline tag</b> at the beginning</p>
<p><span><a href="http://example.com">http://example.com</a></span></p>

View File

@@ -3,4 +3,6 @@ an <b>important</b> <a href=''>link</a>
broken<br/>
line
<b>inline tag</b> at the beginning
<b>inline tag</b> at the beginning
<span>http://example.com</span>

View File

@@ -0,0 +1,8 @@
<div>
line 1
line 2
line 3
line 4
</div>

8
test/data/sparse_html.md Normal file
View File

@@ -0,0 +1,8 @@
<div>
line 1
line 2
line 3
line 4
</div>

View File

@@ -1,6 +1,6 @@
<p>AT&amp;T has an ampersand in their name</p>
<p>this &amp; that</p>
<p>4 &lt; 5 and 6 > 5</p>
<p>4 &lt; 5 and 6 &gt; 5</p>
<p><a href="http://example.com/autolink?a=1&amp;b=2">http://example.com/autolink?a=1&amp;b=2</a></p>
<p><a href="/script?a=1&amp;b=2">inline link</a></p>
<p><a href="http://example.com/?a=1&amp;b=2">reference link</a></p>