mirror of
https://github.com/erusev/parsedown.git
synced 2023-08-10 21:13:06 +03:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
d60bcdc469 | |||
c390a9e406 | |||
0f1e9da8f4 | |||
bc003952fc |
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -1,6 +1,5 @@
|
|||||||
# Ignore all tests for archive
|
# Ignore all tests for archive
|
||||||
/test export-ignore
|
/test export-ignore
|
||||||
/.gitattributes export-ignore
|
/.gitattributes export-ignore
|
||||||
/.gitignore export-ignore
|
|
||||||
/.travis.yml export-ignore
|
/.travis.yml export-ignore
|
||||||
/phpunit.xml.dist export-ignore
|
/phpunit.xml.dist export-ignore
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
composer.lock
|
|
||||||
vendor/
|
|
16
.travis.yml
16
.travis.yml
@ -1,25 +1,23 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
|
dist: trusty
|
||||||
|
sudo: false
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- php: 5.3
|
- php: 5.3
|
||||||
dist: precise
|
dist: precise
|
||||||
- php: 5.4
|
- php: 5.4
|
||||||
dist: trusty
|
|
||||||
- php: 5.5
|
- php: 5.5
|
||||||
dist: trusty
|
|
||||||
- php: 5.6
|
- php: 5.6
|
||||||
dist: xenial
|
|
||||||
- php: 7.0
|
- php: 7.0
|
||||||
dist: xenial
|
|
||||||
- php: 7.1
|
- php: 7.1
|
||||||
dist: bionic
|
|
||||||
- php: 7.2
|
- php: 7.2
|
||||||
dist: bionic
|
|
||||||
- php: 7.3
|
- php: 7.3
|
||||||
dist: bionic
|
- php: nightly
|
||||||
- php: 7.4
|
fast_finish: true
|
||||||
dist: bionic
|
allow_failures:
|
||||||
|
- php: nightly
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- composer install --prefer-dist --no-interaction --no-progress
|
- composer install --prefer-dist --no-interaction --no-progress
|
||||||
|
1185
Parsedown.php
1185
Parsedown.php
File diff suppressed because it is too large
Load Diff
69
README.md
69
README.md
@ -1,61 +1,49 @@
|
|||||||
<!--  -->
|
> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC.
|
||||||
|
|
||||||
<p align="center"><img alt="Parsedown" src="https://i.imgur.com/fKVY6Kz.png" width="240" /></p>
|
## Parsedown
|
||||||
|
|
||||||
<h1>Parsedown</h1>
|
[](https://travis-ci.org/erusev/parsedown)
|
||||||
|
<!--[](https://packagist.org/packages/erusev/parsedown)-->
|
||||||
|
|
||||||
[](https://travis-ci.org/erusev/parsedown)
|
Better Markdown Parser in PHP
|
||||||
[](https://packagist.org/packages/erusev/parsedown)
|
|
||||||
[](https://packagist.org/packages/erusev/parsedown)
|
|
||||||
[](https://packagist.org/packages/erusev/parsedown)
|
|
||||||
|
|
||||||
Better Markdown Parser in PHP - <a href="http://parsedown.org/demo">Demo</a>.
|
[Demo](http://parsedown.org/demo) |
|
||||||
|
[Benchmarks](http://parsedown.org/speed) |
|
||||||
|
[Tests](http://parsedown.org/tests/) |
|
||||||
|
[Documentation](https://github.com/erusev/parsedown/wiki/)
|
||||||
|
|
||||||
## Features
|
### Features
|
||||||
|
|
||||||
* One File
|
* One File
|
||||||
* No Dependencies
|
* No Dependencies
|
||||||
* [Super Fast](http://parsedown.org/speed)
|
* Super Fast
|
||||||
* Extensible
|
* Extensible
|
||||||
* [GitHub flavored](https://github.github.com/gfm)
|
* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
|
||||||
* [Tested](http://parsedown.org/tests/) in 5.3 to 7.3
|
* Tested in 5.3 to 7.1 and in HHVM
|
||||||
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
|
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
|
||||||
|
|
||||||
## Installation
|
### Installation
|
||||||
|
|
||||||
Install the [composer package]:
|
Include `Parsedown.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown).
|
||||||
|
|
||||||
composer require erusev/parsedown
|
### Example
|
||||||
|
|
||||||
Or download the [latest release] and include `Parsedown.php`
|
``` php
|
||||||
|
|
||||||
[composer package]: https://packagist.org/packages/erusev/parsedown "The Parsedown package on packagist.org"
|
|
||||||
[latest release]: https://github.com/erusev/parsedown/releases/latest "The latest release of Parsedown"
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```php
|
|
||||||
$Parsedown = new Parsedown();
|
$Parsedown = new Parsedown();
|
||||||
|
|
||||||
echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</em>!</p>
|
echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</em>!</p>
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also parse inline markdown only:
|
|
||||||
|
|
||||||
```php
|
|
||||||
echo $Parsedown->line('Hello _Parsedown_!'); # prints: Hello <em>Parsedown</em>!
|
|
||||||
```
|
|
||||||
|
|
||||||
More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI).
|
More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI).
|
||||||
|
|
||||||
## Security
|
### Security
|
||||||
|
|
||||||
Parsedown is capable of escaping user-input within the HTML that it generates. Additionally Parsedown will apply sanitisation to additional scripting vectors (such as scripting link destinations) that are introduced by the markdown syntax itself.
|
Parsedown is capable of escaping user-input within the HTML that it generates. Additionally Parsedown will apply sanitisation to additional scripting vectors (such as scripting link destinations) that are introduced by the markdown syntax itself.
|
||||||
|
|
||||||
To tell Parsedown that it is processing untrusted user-input, use the following:
|
To tell Parsedown that it is processing untrusted user-input, use the following:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$Parsedown->setSafeMode(true);
|
$parsedown = new Parsedown;
|
||||||
|
$parsedown->setSafeMode(true);
|
||||||
```
|
```
|
||||||
|
|
||||||
If instead, you wish to allow HTML within untrusted user-input, but still want output to be free from XSS it is recommended that you make use of a HTML sanitiser that allows HTML tags to be whitelisted, like [HTML Purifier](http://htmlpurifier.org/).
|
If instead, you wish to allow HTML within untrusted user-input, but still want output to be free from XSS it is recommended that you make use of a HTML sanitiser that allows HTML tags to be whitelisted, like [HTML Purifier](http://htmlpurifier.org/).
|
||||||
@ -66,19 +54,18 @@ In both cases you should strongly consider employing defence-in-depth measures,
|
|||||||
|
|
||||||
Safe mode does not necessarily yield safe results when using extensions to Parsedown. Extensions should be evaluated on their own to determine their specific safety against XSS.
|
Safe mode does not necessarily yield safe results when using extensions to Parsedown. Extensions should be evaluated on their own to determine their specific safety against XSS.
|
||||||
|
|
||||||
## Escaping HTML
|
### Escaping HTML
|
||||||
|
> ⚠️ **WARNING:** This method isn't safe from XSS!
|
||||||
> **WARNING:** This method isn't safe from XSS!
|
|
||||||
|
|
||||||
If you wish to escape HTML **in trusted input**, you can use the following:
|
If you wish to escape HTML **in trusted input**, you can use the following:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$Parsedown->setMarkupEscaped(true);
|
$parsedown = new Parsedown;
|
||||||
|
$parsedown->setMarkupEscaped(true);
|
||||||
```
|
```
|
||||||
|
|
||||||
Beware that this still allows users to insert unsafe scripting vectors, such as links like `[xss](javascript:alert%281%29)`.
|
Beware that this still allows users to insert unsafe scripting vectors, such as links like `[xss](javascript:alert%281%29)`.
|
||||||
|
|
||||||
## Questions
|
### Questions
|
||||||
|
|
||||||
**How does Parsedown work?**
|
**How does Parsedown work?**
|
||||||
|
|
||||||
@ -92,12 +79,8 @@ It passes most of the CommonMark tests. Most of the tests that don't pass deal w
|
|||||||
|
|
||||||
**Who uses it?**
|
**Who uses it?**
|
||||||
|
|
||||||
[Laravel Framework](https://laravel.com/), [Bolt CMS](http://bolt.cm/), [Grav CMS](http://getgrav.org/), [Herbie CMS](http://www.getherbie.org/), [Kirby CMS](http://getkirby.com/), [October CMS](http://octobercms.com/), [Pico CMS](http://picocms.org), [Statamic CMS](http://www.statamic.com/), [phpDocumentor](http://www.phpdoc.org/), [RaspberryPi.org](http://www.raspberrypi.org/), [Symfony Demo](https://github.com/symfony/demo) and [more](https://packagist.org/packages/erusev/parsedown/dependents).
|
[Laravel Framework](https://laravel.com/), [Bolt CMS](http://bolt.cm/), [Grav CMS](http://getgrav.org/), [Herbie CMS](http://www.getherbie.org/), [Kirby CMS](http://getkirby.com/), [October CMS](http://octobercms.com/), [Pico CMS](http://picocms.org), [Statamic CMS](http://www.statamic.com/), [phpDocumentor](http://www.phpdoc.org/), [RaspberryPi.org](http://www.raspberrypi.org/), [Symfony demo](https://github.com/symfony/symfony-demo) and [more](https://packagist.org/packages/erusev/parsedown/dependents).
|
||||||
|
|
||||||
**How can I help?**
|
**How can I help?**
|
||||||
|
|
||||||
Use it, star it, share it and if you feel generous, [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2).
|
Use it, star it, share it and if you feel generous, [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2).
|
||||||
|
|
||||||
**What else should I know?**
|
|
||||||
|
|
||||||
I also make [Nota](https://nota.md/) — a writing app designed for Markdown files :)
|
|
||||||
|
43
test/ParsedownTest.php
Executable file → Normal file
43
test/ParsedownTest.php
Executable file → Normal file
@ -1,5 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
require 'SampleExtensions.php';
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
@ -13,8 +12,7 @@ class ParsedownTest extends TestCase
|
|||||||
parent::__construct($name, $data, $dataName);
|
parent::__construct($name, $data, $dataName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private $dirs;
|
private $dirs, $Parsedown;
|
||||||
protected $Parsedown;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array
|
* @return array
|
||||||
@ -51,47 +49,12 @@ class ParsedownTest extends TestCase
|
|||||||
$expectedMarkup = str_replace("\r", "\n", $expectedMarkup);
|
$expectedMarkup = str_replace("\r", "\n", $expectedMarkup);
|
||||||
|
|
||||||
$this->Parsedown->setSafeMode(substr($test, 0, 3) === 'xss');
|
$this->Parsedown->setSafeMode(substr($test, 0, 3) === 'xss');
|
||||||
$this->Parsedown->setStrictMode(substr($test, 0, 6) === 'strict');
|
|
||||||
|
|
||||||
$actualMarkup = $this->Parsedown->text($markdown);
|
$actualMarkup = $this->Parsedown->text($markdown);
|
||||||
|
|
||||||
$this->assertEquals($expectedMarkup, $actualMarkup);
|
$this->assertEquals($expectedMarkup, $actualMarkup);
|
||||||
}
|
}
|
||||||
|
|
||||||
function testRawHtml()
|
|
||||||
{
|
|
||||||
$markdown = "```php\nfoobar\n```";
|
|
||||||
$expectedMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
|
|
||||||
$expectedSafeMarkup = '<pre><code class="language-php"><p>foobar</p></code></pre>';
|
|
||||||
|
|
||||||
$unsafeExtension = new UnsafeExtension;
|
|
||||||
$actualMarkup = $unsafeExtension->text($markdown);
|
|
||||||
|
|
||||||
$this->assertEquals($expectedMarkup, $actualMarkup);
|
|
||||||
|
|
||||||
$unsafeExtension->setSafeMode(true);
|
|
||||||
$actualSafeMarkup = $unsafeExtension->text($markdown);
|
|
||||||
|
|
||||||
$this->assertEquals($expectedSafeMarkup, $actualSafeMarkup);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
function data()
|
function data()
|
||||||
{
|
{
|
||||||
$data = array();
|
$data = array();
|
||||||
@ -160,12 +123,12 @@ MARKDOWN_WITH_MARKUP;
|
|||||||
<p><div><em>content</em></div></p>
|
<p><div><em>content</em></div></p>
|
||||||
<p>sparse:</p>
|
<p>sparse:</p>
|
||||||
<p><div>
|
<p><div>
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<em>content</em>
|
<em>content</em>
|
||||||
</div>
|
</div>
|
||||||
</div></p>
|
</div></p>
|
||||||
<p>paragraph</p>
|
<p>paragraph</p>
|
||||||
<p><style type="text/css">
|
<p><style type="text/css">
|
||||||
p {
|
p {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
class UnsafeExtension extends Parsedown
|
|
||||||
{
|
|
||||||
protected function blockFencedCodeComplete($Block)
|
|
||||||
{
|
|
||||||
$text = $Block['element']['element']['text'];
|
|
||||||
unset($Block['element']['element']['text']);
|
|
||||||
|
|
||||||
// WARNING: There is almost always a better way of doing things!
|
|
||||||
//
|
|
||||||
// This example is one of them, unsafe behaviour is NOT needed here.
|
|
||||||
// Only use this if you trust the input and have no idea what
|
|
||||||
// the output HTML will look like (e.g. using an external parser).
|
|
||||||
$Block['element']['element']['rawHtml'] = "<p>$text</p>";
|
|
||||||
|
|
||||||
return $Block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class TrustDelegatedExtension extends Parsedown
|
|
||||||
{
|
|
||||||
protected function blockFencedCodeComplete($Block)
|
|
||||||
{
|
|
||||||
$text = $Block['element']['element']['text'];
|
|
||||||
unset($Block['element']['element']['text']);
|
|
||||||
|
|
||||||
// WARNING: There is almost always a better way of doing things!
|
|
||||||
//
|
|
||||||
// This behaviour is NOT needed in the demonstrated case.
|
|
||||||
// Only use this if you are sure that the result being added into
|
|
||||||
// rawHtml is safe.
|
|
||||||
// (e.g. using an external parser with escaping capabilities).
|
|
||||||
$Block['element']['element']['rawHtml'] = "<p>$text</p>";
|
|
||||||
$Block['element']['element']['allowRawHtmlInSafeMode'] = true;
|
|
||||||
|
|
||||||
return $Block;
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,8 +6,4 @@
|
|||||||
<h6>h6</h6>
|
<h6>h6</h6>
|
||||||
<p>####### not a heading</p>
|
<p>####### not a heading</p>
|
||||||
<h1>closed h1</h1>
|
<h1>closed h1</h1>
|
||||||
<h1></h1>
|
<p>#</p>
|
||||||
<h2></h2>
|
|
||||||
<h1># of levels</h1>
|
|
||||||
<h1># of levels #</h1>
|
|
||||||
<h1>heading</h1>
|
|
@ -14,12 +14,4 @@
|
|||||||
|
|
||||||
# closed h1 #
|
# closed h1 #
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
# # of levels
|
|
||||||
|
|
||||||
# # of levels # #
|
|
||||||
|
|
||||||
#heading
|
|
@ -5,9 +5,4 @@ echo $message;</code></pre>
|
|||||||
<hr />
|
<hr />
|
||||||
<pre><code>> not a quote
|
<pre><code>> not a quote
|
||||||
- not a list item
|
- not a list item
|
||||||
[not a reference]: http://foo.com</code></pre>
|
[not a reference]: http://foo.com</code></pre>
|
||||||
<hr />
|
|
||||||
<pre><code>foo
|
|
||||||
|
|
||||||
|
|
||||||
bar</code></pre>
|
|
@ -7,11 +7,4 @@
|
|||||||
|
|
||||||
> not a quote
|
> not a quote
|
||||||
- not a list item
|
- not a list item
|
||||||
[not a reference]: http://foo.com
|
[not a reference]: http://foo.com
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
foo
|
|
||||||
|
|
||||||
|
|
||||||
bar
|
|
@ -1,40 +1,12 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>li<ul>
|
<li>li
|
||||||
<li>li<ul>
|
|
||||||
<li>li</li>
|
|
||||||
<li>li</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>li</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>li</li>
|
|
||||||
</ul>
|
|
||||||
<hr />
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>level 1<ul>
|
<li>li
|
||||||
<li>level 2<ul>
|
|
||||||
<li>level 3<ul>
|
|
||||||
<li>level 4<ul>
|
|
||||||
<li>level 5</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<hr />
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>a</li>
|
<li>li</li>
|
||||||
<li>b</li>
|
<li>li</li>
|
||||||
<li>c</li>
|
</ul></li>
|
||||||
<li>d</li>
|
<li>li</li>
|
||||||
<li>e</li>
|
</ul></li>
|
||||||
<li>f</li>
|
<li>li</li>
|
||||||
<li>g</li>
|
|
||||||
<li>h</li>
|
|
||||||
<li>i</li>
|
|
||||||
</ul>
|
</ul>
|
@ -3,24 +3,4 @@
|
|||||||
- li
|
- li
|
||||||
- li
|
- li
|
||||||
- li
|
- li
|
||||||
- li
|
- li
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
- level 1
|
|
||||||
- level 2
|
|
||||||
- level 3
|
|
||||||
- level 4
|
|
||||||
- level 5
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
- a
|
|
||||||
- b
|
|
||||||
- c
|
|
||||||
- d
|
|
||||||
- e
|
|
||||||
- f
|
|
||||||
- g
|
|
||||||
- h
|
|
||||||
- i
|
|
@ -1,2 +1 @@
|
|||||||
<p>my email is <a href="mailto:me@example.com">me@example.com</a></p>
|
<p>my email is <a href="mailto:me@example.com">me@example.com</a></p>
|
||||||
<p>html tags shouldn't start an email autolink <strong>first.last@example.com</strong></p>
|
|
@ -1,3 +1 @@
|
|||||||
my email is <me@example.com>
|
my email is <me@example.com>
|
||||||
|
|
||||||
html tags shouldn't start an email autolink <strong>first.last@example.com</strong>
|
|
@ -8,11 +8,4 @@ echo $message;</code></pre>
|
|||||||
<pre><code class="language-html+php"><?php
|
<pre><code class="language-html+php"><?php
|
||||||
echo "Hello World";
|
echo "Hello World";
|
||||||
?>
|
?>
|
||||||
<a href="http://auraphp.com" >Aura Project</a></code></pre>
|
<a href="http://auraphp.com" >Aura Project</a></code></pre>
|
||||||
<pre><code>the following isn't quite enough to close
|
|
||||||
```
|
|
||||||
still a fenced code block</code></pre>
|
|
||||||
<pre><code>foo
|
|
||||||
|
|
||||||
|
|
||||||
bar</code></pre>
|
|
@ -22,17 +22,4 @@ echo 'language identifier with non words';
|
|||||||
echo "Hello World";
|
echo "Hello World";
|
||||||
?>
|
?>
|
||||||
<a href="http://auraphp.com" >Aura Project</a>
|
<a href="http://auraphp.com" >Aura Project</a>
|
||||||
```
|
|
||||||
|
|
||||||
````
|
|
||||||
the following isn't quite enough to close
|
|
||||||
```
|
|
||||||
still a fenced code block
|
|
||||||
````
|
|
||||||
|
|
||||||
```
|
|
||||||
foo
|
|
||||||
|
|
||||||
|
|
||||||
bar
|
|
||||||
```
|
```
|
@ -2,10 +2,4 @@
|
|||||||
<p>paragraph</p>
|
<p>paragraph</p>
|
||||||
<!--
|
<!--
|
||||||
multiline -->
|
multiline -->
|
||||||
<p>paragraph</p>
|
<p>paragraph</p>
|
||||||
<!-- sss -->abc
|
|
||||||
<ul>
|
|
||||||
<li>abcd</li>
|
|
||||||
<li>bbbb</li>
|
|
||||||
<li>cccc</li>
|
|
||||||
</ul>
|
|
@ -5,10 +5,4 @@ paragraph
|
|||||||
<!--
|
<!--
|
||||||
multiline -->
|
multiline -->
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
|
|
||||||
<!-- sss -->abc
|
|
||||||
|
|
||||||
* abcd
|
|
||||||
* bbbb
|
|
||||||
* cccc
|
|
@ -1,8 +1,6 @@
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<p>quote
|
<p>quote
|
||||||
the rest of it</p>
|
the rest of it</p>
|
||||||
</blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<p>another paragraph
|
<p>another paragraph
|
||||||
the rest of it</p>
|
the rest of it</p>
|
||||||
</blockquote>
|
</blockquote>
|
@ -1,3 +0,0 @@
|
|||||||
<div>Markup</div>
|
|
||||||
_No markdown_ without blank line for **strict** compliance with CommonMark.
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,4 +0,0 @@
|
|||||||
<div>Markup</div>
|
|
||||||
_No markdown_ without blank line for **strict** compliance with CommonMark.
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -1,4 +0,0 @@
|
|||||||
<div>One markup on
|
|
||||||
two lines</div>
|
|
||||||
_No markdown_
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,5 +0,0 @@
|
|||||||
<div>One markup on
|
|
||||||
two lines</div>
|
|
||||||
_No markdown_
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -1,3 +0,0 @@
|
|||||||
<div><p>Stripped markup</p></div>
|
|
||||||
_No markdown_
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,4 +0,0 @@
|
|||||||
<div><p>Stripped markup</p></div>
|
|
||||||
_No markdown_
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -1,3 +0,0 @@
|
|||||||
<div>First markup</div><p>and second markup on the same line.</p>
|
|
||||||
_No markdown_
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,4 +0,0 @@
|
|||||||
<div>First markup</div><p>and second markup on the same line.</p>
|
|
||||||
_No markdown_
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -1,4 +0,0 @@
|
|||||||
<div>First markup</div><p>and partial markup
|
|
||||||
on two lines.</p>
|
|
||||||
_No markdown_
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,5 +0,0 @@
|
|||||||
<div>First markup</div><p>and partial markup
|
|
||||||
on two lines.</p>
|
|
||||||
_No markdown_
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -1,4 +0,0 @@
|
|||||||
<div><p>Stripped markup
|
|
||||||
on two lines</p></div>
|
|
||||||
_No markdown_
|
|
||||||
<p><strong>Markdown</strong></p>
|
|
@ -1,5 +0,0 @@
|
|||||||
<div><p>Stripped markup
|
|
||||||
on two lines</p></div>
|
|
||||||
_No markdown_
|
|
||||||
|
|
||||||
**Markdown**
|
|
@ -10,7 +10,4 @@
|
|||||||
<p>large numbers:</p>
|
<p>large numbers:</p>
|
||||||
<ol start="123">
|
<ol start="123">
|
||||||
<li>one</li>
|
<li>one</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>foo 1. the following should not start a list
|
|
||||||
100.<br />
|
|
||||||
200. </p>
|
|
@ -8,8 +8,4 @@ repeating numbers:
|
|||||||
|
|
||||||
large numbers:
|
large numbers:
|
||||||
|
|
||||||
123. one
|
123. one
|
||||||
|
|
||||||
foo 1. the following should not start a list
|
|
||||||
100.
|
|
||||||
200.
|
|
@ -1,18 +1,12 @@
|
|||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
<hr class="foo" id="bar" />
|
<hr class="foo" id="bar" />
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
<hr class="foo" id="bar"/>
|
<hr class="foo" id="bar"/>
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
<hr class="foo" id="bar" >
|
<hr class="foo" id="bar" >
|
||||||
|
|
||||||
paragraph
|
paragraph
|
@ -1,12 +0,0 @@
|
|||||||
<h1>trailing space</h1>
|
|
||||||
<h2>trailing space</h2>
|
|
||||||
<h1>leading and trailing space</h1>
|
|
||||||
<h2>leading and trailing space</h2>
|
|
||||||
<h1>1 leading space</h1>
|
|
||||||
<h2>1 leading space</h2>
|
|
||||||
<h1>3 leading spaces</h1>
|
|
||||||
<h2>3 leading spaces</h2>
|
|
||||||
<p>too many leading spaces
|
|
||||||
==</p>
|
|
||||||
<p>too many leading spaces
|
|
||||||
--</p>
|
|
@ -1,29 +0,0 @@
|
|||||||
trailing space
|
|
||||||
==
|
|
||||||
|
|
||||||
trailing space
|
|
||||||
--
|
|
||||||
|
|
||||||
leading and trailing space
|
|
||||||
==
|
|
||||||
|
|
||||||
leading and trailing space
|
|
||||||
--
|
|
||||||
|
|
||||||
1 leading space
|
|
||||||
==
|
|
||||||
|
|
||||||
1 leading space
|
|
||||||
--
|
|
||||||
|
|
||||||
3 leading spaces
|
|
||||||
==
|
|
||||||
|
|
||||||
3 leading spaces
|
|
||||||
--
|
|
||||||
|
|
||||||
too many leading spaces
|
|
||||||
==
|
|
||||||
|
|
||||||
too many leading spaces
|
|
||||||
--
|
|
@ -8,19 +8,4 @@
|
|||||||
<p>no space after <code>></code>:</p>
|
<p>no space after <code>></code>:</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>quote</p>
|
<p>quote</p>
|
||||||
</blockquote>
|
|
||||||
<hr />
|
|
||||||
<blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<p>Info 1 text</p>
|
|
||||||
</blockquote>
|
|
||||||
</blockquote>
|
|
||||||
</blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<blockquote>
|
|
||||||
<p>Info 2 text</p>
|
|
||||||
</blockquote>
|
|
||||||
</blockquote>
|
|
||||||
</blockquote>
|
</blockquote>
|
@ -4,10 +4,4 @@ indented:
|
|||||||
> quote
|
> quote
|
||||||
|
|
||||||
no space after `>`:
|
no space after `>`:
|
||||||
>quote
|
>quote
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
>>> Info 1 text
|
|
||||||
|
|
||||||
>>> Info 2 text
|
|
@ -34,42 +34,4 @@
|
|||||||
<td>cell 2.2</td>
|
<td>cell 2.2</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<hr />
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th style="text-align: left;">header 1</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td style="text-align: left;">cell 1.1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td style="text-align: left;">cell 2.1</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<hr />
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>header 1</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>cell 1.1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>cell 2.1</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<hr />
|
|
||||||
<p>Not a table, we haven't ended the paragraph:
|
|
||||||
header 1 | header 2
|
|
||||||
-------- | --------
|
|
||||||
cell 1.1 | cell 1.2
|
|
||||||
cell 2.1 | cell 2.2</p>
|
|
@ -8,26 +8,4 @@ cell 2.1 | cell 2.2
|
|||||||
header 1 | header 2
|
header 1 | header 2
|
||||||
:------- | --------
|
:------- | --------
|
||||||
cell 1.1 | cell 1.2
|
cell 1.1 | cell 1.2
|
||||||
cell 2.1 | cell 2.2
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
header 1
|
|
||||||
:-------
|
|
||||||
cell 1.1
|
|
||||||
cell 2.1
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
header 1
|
|
||||||
-------|
|
|
||||||
cell 1.1
|
|
||||||
cell 2.1
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Not a table, we haven't ended the paragraph:
|
|
||||||
header 1 | header 2
|
|
||||||
-------- | --------
|
|
||||||
cell 1.1 | cell 1.2
|
|
||||||
cell 2.1 | cell 2.2
|
cell 2.1 | cell 2.2
|
@ -1,6 +1,8 @@
|
|||||||
<div>
|
<div>
|
||||||
line 1
|
line 1
|
||||||
<p>line 2
|
|
||||||
line 3</p>
|
line 2
|
||||||
<p>line 4</p>
|
line 3
|
||||||
|
|
||||||
|
line 4
|
||||||
</div>
|
</div>
|
@ -1,13 +0,0 @@
|
|||||||
<h1>h1</h1>
|
|
||||||
<h2>h2</h2>
|
|
||||||
<h3>h3</h3>
|
|
||||||
<h4>h4</h4>
|
|
||||||
<h5>h5</h5>
|
|
||||||
<h6>h6</h6>
|
|
||||||
<p>####### not a heading</p>
|
|
||||||
<p>#not a heading</p>
|
|
||||||
<h1>closed h1</h1>
|
|
||||||
<h1></h1>
|
|
||||||
<h2></h2>
|
|
||||||
<h1># of levels</h1>
|
|
||||||
<h1># of levels #</h1>
|
|
@ -1,25 +0,0 @@
|
|||||||
# h1
|
|
||||||
|
|
||||||
## h2
|
|
||||||
|
|
||||||
### h3
|
|
||||||
|
|
||||||
#### h4
|
|
||||||
|
|
||||||
##### h5
|
|
||||||
|
|
||||||
###### h6
|
|
||||||
|
|
||||||
####### not a heading
|
|
||||||
|
|
||||||
#not a heading
|
|
||||||
|
|
||||||
# closed h1 #
|
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
# # of levels
|
|
||||||
|
|
||||||
# # of levels # #
|
|
@ -1,4 +1,3 @@
|
|||||||
<p><del>strikethrough</del></p>
|
<p><del>strikethrough</del></p>
|
||||||
<p>here's <del>one</del> followed by <del>another one</del></p>
|
<p>here's <del>one</del> followed by <del>another one</del></p>
|
||||||
<p>~~ this ~~ is not one neither is ~this~</p>
|
<p>~~ this ~~ is not one neither is ~this~</p>
|
||||||
<p>escaped ~~this~~</p>
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
here's ~~one~~ followed by ~~another one~~
|
here's ~~one~~ followed by ~~another one~~
|
||||||
|
|
||||||
~~ this ~~ is not one neither is ~this~
|
~~ this ~~ is not one neither is ~this~
|
||||||
|
|
||||||
escaped \~\~this\~\~
|
|
@ -2,21 +2,9 @@
|
|||||||
<li>li</li>
|
<li>li</li>
|
||||||
<li>li</li>
|
<li>li</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>mixed unordered markers:</p>
|
<p>mixed markers:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>li</li>
|
<li>li</li>
|
||||||
</ul>
|
|
||||||
<ul>
|
|
||||||
<li>li</li>
|
<li>li</li>
|
||||||
</ul>
|
|
||||||
<ul>
|
|
||||||
<li>li</li>
|
<li>li</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>mixed ordered markers:</p>
|
|
||||||
<ol>
|
|
||||||
<li>starting at 1, list one</li>
|
|
||||||
<li>number 2, list one</li>
|
|
||||||
</ol>
|
|
||||||
<ol start="3">
|
|
||||||
<li>starting at 3, list two</li>
|
|
||||||
</ol>
|
|
@ -1,14 +1,8 @@
|
|||||||
- li
|
- li
|
||||||
- li
|
- li
|
||||||
|
|
||||||
mixed unordered markers:
|
mixed markers:
|
||||||
|
|
||||||
* li
|
* li
|
||||||
+ li
|
+ li
|
||||||
- li
|
- li
|
||||||
|
|
||||||
mixed ordered markers:
|
|
||||||
|
|
||||||
1. starting at 1, list one
|
|
||||||
2. number 2, list one
|
|
||||||
3) starting at 3, list two
|
|
Reference in New Issue
Block a user