mirror of
https://github.com/erusev/parsedown.git
synced 2023-08-10 21:13:06 +03:00
Compare commits
57 Commits
1.8.0-beta
...
master
Author | SHA1 | Date | |
---|---|---|---|
6598f3860c | |||
1e5080190c | |||
1610e4747c | |||
3159a9d3cd | |||
dbee8ab4f2 | |||
dba4125b59 | |||
bfaa76d370 | |||
3825db53a2 | |||
fe7a50eceb | |||
bce642f2d7 | |||
7d4c06cb52 | |||
f7b66e6b20 | |||
811bc32726 | |||
8fd5464c46 | |||
21c8c792de | |||
6ca29539e1 | |||
a503c1a69b | |||
819c68899d | |||
4c2d79fc6a | |||
48a2fb26fe | |||
33b79d2446 | |||
d6d2d96459 | |||
d5b6ab5198 | |||
15e8439c7f | |||
ff6148f9b9 | |||
dfd8657bc5 | |||
ee64646765 | |||
c956090b55 | |||
0be26550f3 | |||
8e26a65a6f | |||
2a24a8583b | |||
1d55344e92 | |||
5dc8d1cc39 | |||
33cf0f0b99 | |||
dc1ff7d6c2 | |||
0f0987571d | |||
18eaa649b5 | |||
e124572b60 | |||
1686a34469 | |||
2bd7113c55 | |||
29fce0ec37 | |||
b0bbc275d4 | |||
72f9ca92ae | |||
89c3fa05d9 | |||
69163d6e88 | |||
3a0c964291 | |||
1829106e60 | |||
464f5f9329 | |||
c26a2ee4bf | |||
ba3b60d6e4 | |||
0b1e6b8c86 | |||
1f69f7e697 | |||
c83af0a7d5 | |||
4686daf8c2 | |||
c9e7183cfa | |||
9eed1104e7 | |||
fd95703da5 |
20
.travis.yml
20
.travis.yml
@ -1,25 +1,25 @@
|
|||||||
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
|
||||||
- php: nightly
|
dist: bionic
|
||||||
- php: hhvm
|
- php: 7.3
|
||||||
- php: hhvm-nightly
|
dist: bionic
|
||||||
fast_finish: true
|
- php: 7.4
|
||||||
allow_failures:
|
dist: bionic
|
||||||
- php: nightly
|
|
||||||
- php: hhvm-nightly
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- composer install --prefer-dist --no-interaction --no-progress
|
- composer install --prefer-dist --no-interaction --no-progress
|
||||||
|
@ -17,7 +17,7 @@ class Parsedown
|
|||||||
{
|
{
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
const version = '1.8.0-beta-1';
|
const version = '1.8.0-beta-7';
|
||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
@ -107,6 +107,7 @@ class Parsedown
|
|||||||
'ftp://',
|
'ftp://',
|
||||||
'ftps://',
|
'ftps://',
|
||||||
'mailto:',
|
'mailto:',
|
||||||
|
'tel:',
|
||||||
'data:image/png;base64,',
|
'data:image/png;base64,',
|
||||||
'data:image/gif;base64,',
|
'data:image/gif;base64,',
|
||||||
'data:image/jpeg;base64,',
|
'data:image/jpeg;base64,',
|
||||||
@ -317,10 +318,17 @@ class Parsedown
|
|||||||
|
|
||||||
protected function extractElement(array $Component)
|
protected function extractElement(array $Component)
|
||||||
{
|
{
|
||||||
if ( ! isset($Component['element']) and isset($Component['markup']))
|
if ( ! isset($Component['element']))
|
||||||
|
{
|
||||||
|
if (isset($Component['markup']))
|
||||||
{
|
{
|
||||||
$Component['element'] = array('rawHtml' => $Component['markup']);
|
$Component['element'] = array('rawHtml' => $Component['markup']);
|
||||||
}
|
}
|
||||||
|
elseif (isset($Component['hidden']))
|
||||||
|
{
|
||||||
|
$Component['element'] = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $Component['element'];
|
return $Component['element'];
|
||||||
}
|
}
|
||||||
@ -384,6 +392,11 @@ class Parsedown
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function blockCodeComplete($Block)
|
||||||
|
{
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Comment
|
# Comment
|
||||||
|
|
||||||
@ -457,7 +470,21 @@ class Parsedown
|
|||||||
|
|
||||||
if ($infostring !== '')
|
if ($infostring !== '')
|
||||||
{
|
{
|
||||||
$Element['attributes'] = array('class' => "language-$infostring");
|
/**
|
||||||
|
* https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes
|
||||||
|
* Every HTML element may have a class attribute specified.
|
||||||
|
* The attribute, if specified, must have a value that is a set
|
||||||
|
* of space-separated tokens representing the various classes
|
||||||
|
* that the element belongs to.
|
||||||
|
* [...]
|
||||||
|
* The space characters, for the purposes of this specification,
|
||||||
|
* are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab),
|
||||||
|
* U+000A LINE FEED (LF), U+000C FORM FEED (FF), and
|
||||||
|
* U+000D CARRIAGE RETURN (CR).
|
||||||
|
*/
|
||||||
|
$language = substr($infostring, 0, strcspn($infostring, " \t\n\f\r"));
|
||||||
|
|
||||||
|
$Element['attributes'] = array('class' => "language-$language");
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block = array(
|
$Block = array(
|
||||||
@ -501,6 +528,11 @@ class Parsedown
|
|||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function blockFencedCodeComplete($Block)
|
||||||
|
{
|
||||||
|
return $Block;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Header
|
# Header
|
||||||
|
|
||||||
@ -524,7 +556,7 @@ class Parsedown
|
|||||||
|
|
||||||
$Block = array(
|
$Block = array(
|
||||||
'element' => array(
|
'element' => array(
|
||||||
'name' => 'h' . min(6, $level),
|
'name' => 'h' . $level,
|
||||||
'handler' => array(
|
'handler' => array(
|
||||||
'function' => 'lineElements',
|
'function' => 'lineElements',
|
||||||
'argument' => $text,
|
'argument' => $text,
|
||||||
@ -1102,6 +1134,9 @@ class Parsedown
|
|||||||
|
|
||||||
protected function lineElements($text, $nonNestables = array())
|
protected function lineElements($text, $nonNestables = array())
|
||||||
{
|
{
|
||||||
|
# standardize line breaks
|
||||||
|
$text = str_replace(array("\r\n", "\r"), "\n", $text);
|
||||||
|
|
||||||
$Elements = array();
|
$Elements = array();
|
||||||
|
|
||||||
$nonNestables = (empty($nonNestables)
|
$nonNestables = (empty($nonNestables)
|
||||||
@ -1208,14 +1243,14 @@ class Parsedown
|
|||||||
'element' => array(),
|
'element' => array(),
|
||||||
);
|
);
|
||||||
|
|
||||||
$safeText = self::escape($text, true);
|
$Inline['element']['elements'] = self::pregReplaceElements(
|
||||||
|
|
||||||
$Inline['element']['rawHtml'] = preg_replace(
|
|
||||||
$this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/',
|
$this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/',
|
||||||
"<br />\n",
|
array(
|
||||||
$safeText
|
array('name' => 'br'),
|
||||||
|
array('text' => "\n"),
|
||||||
|
),
|
||||||
|
$text
|
||||||
);
|
);
|
||||||
$Inline['element']['allowRawHtmlInSafeMode'] = true;
|
|
||||||
|
|
||||||
return $Inline;
|
return $Inline;
|
||||||
}
|
}
|
||||||
@ -1459,7 +1494,7 @@ class Parsedown
|
|||||||
|
|
||||||
protected function inlineSpecialCharacter($Excerpt)
|
protected function inlineSpecialCharacter($Excerpt)
|
||||||
{
|
{
|
||||||
if ($Excerpt['text'][1] !== ' ' and strpos($Excerpt['text'], ';') !== false
|
if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false
|
||||||
and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)
|
and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)
|
||||||
) {
|
) {
|
||||||
return array(
|
return array(
|
||||||
|
66
README.md
66
README.md
@ -1,60 +1,61 @@
|
|||||||
> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC.
|
<!--  -->
|
||||||
|
|
||||||
## Parsedown
|
<p align="center"><img alt="Parsedown" src="https://i.imgur.com/fKVY6Kz.png" width="240" /></p>
|
||||||
|
|
||||||
[](https://travis-ci.org/erusev/parsedown)
|
<h1>Parsedown</h1>
|
||||||
<!--[](https://packagist.org/packages/erusev/parsedown)-->
|
|
||||||
|
|
||||||
Better Markdown Parser in PHP
|
[](https://travis-ci.org/erusev/parsedown)
|
||||||
|
[](https://packagist.org/packages/erusev/parsedown)
|
||||||
|
[](https://packagist.org/packages/erusev/parsedown)
|
||||||
|
[](https://packagist.org/packages/erusev/parsedown)
|
||||||
|
|
||||||
[Demo](http://parsedown.org/demo) |
|
Better Markdown Parser in PHP - <a href="http://parsedown.org/demo">Demo</a>.
|
||||||
[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
|
* [Super Fast](http://parsedown.org/speed)
|
||||||
* Extensible
|
* Extensible
|
||||||
* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
|
* [GitHub flavored](https://github.github.com/gfm)
|
||||||
* Tested in 5.3 to 7.2 and in HHVM
|
* [Tested](http://parsedown.org/tests/) in 5.3 to 7.3
|
||||||
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
|
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
|
||||||
|
|
||||||
### Installation
|
## Installation
|
||||||
#### Composer
|
|
||||||
Install the [composer package] by running the following command:
|
Install the [composer package]:
|
||||||
|
|
||||||
composer require erusev/parsedown
|
composer require erusev/parsedown
|
||||||
|
|
||||||
#### Manual
|
Or download the [latest release] and include `Parsedown.php`
|
||||||
1. Download the "Source code" from the [latest release]
|
|
||||||
2. Include `Parsedown.php`
|
|
||||||
|
|
||||||
[composer package]: https://packagist.org/packages/erusev/parsedown "The Parsedown package on packagist.org"
|
[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"
|
[latest release]: https://github.com/erusev/parsedown/releases/latest "The latest release of Parsedown"
|
||||||
|
|
||||||
### Example
|
## Example
|
||||||
|
|
||||||
```php
|
```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
|
```
|
||||||
|
|
||||||
|
You can also parse inline markdown only:
|
||||||
|
|
||||||
|
```php
|
||||||
echo $Parsedown->line('Hello _Parsedown_!'); # prints: Hello <em>Parsedown</em>!
|
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 = new Parsedown;
|
$Parsedown->setSafeMode(true);
|
||||||
$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/).
|
||||||
@ -65,18 +66,19 @@ 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 = new Parsedown;
|
$Parsedown->setMarkupEscaped(true);
|
||||||
$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?**
|
||||||
|
|
||||||
@ -90,8 +92,12 @@ 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/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/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 :)
|
||||||
|
Reference in New Issue
Block a user