1
0
mirror of https://github.com/erusev/parsedown.git synced 2023-08-10 21:13:06 +03:00

Compare commits

..

57 Commits

Author SHA1 Message Date
6598f3860c update readme 2020-08-09 17:12:21 +03:00
1e5080190c update readme
we already say "warning" in bold and upper case — the warning emoji feels unnecessary
2020-08-09 17:06:19 +03:00
1610e4747c Merge pull request #741 from GrahamCampbell/patch-1
Update .travis.yml
2020-02-18 12:38:52 +02:00
3159a9d3cd Merge pull request #751 from jeanmonod/patch-1
Update GitHub flavored markdown url
2020-01-22 09:53:45 +02:00
dbee8ab4f2 Update GitHub flavored markdown url 2020-01-21 22:07:12 +01:00
dba4125b59 Update .travis.yml 2019-12-20 00:05:10 +00:00
bfaa76d370 Reflect travis breadth in README
Closes https://github.com/erusev/parsedown/issues/692
2019-04-07 16:36:22 +01:00
3825db53a2 Merge branch '1.8.x-beta' 2019-04-06 17:58:29 +01:00
fe7a50eceb New release due to mislabeled previous tag 2019-03-17 18:47:21 +00:00
bce642f2d7 7.3 was released 2019-03-17 18:38:54 +00:00
7d4c06cb52 Bump version 2019-03-17 17:19:07 +00:00
f7b66e6b20 Merge pull request #701 from aidantwoods/fix/spaces-in-class-names-1.8.x-beta
[1.8.x-beta] Fix spaces in class names
2019-03-17 17:10:10 +00:00
811bc32726 Fix test platforms 2019-03-17 17:04:25 +00:00
8fd5464c46 [1.8.x-beta] Fix spaces in class names 2019-03-17 17:01:52 +00:00
21c8c792de Merge pull request #698 from cybernet/patch-1
Symfony Demo link update
2019-03-14 18:49:20 +00:00
6ca29539e1 Symfony Demo link update 2019-03-12 20:49:21 +00:00
a503c1a69b composer/composer#7990 2019-03-02 12:08:48 +02:00
819c68899d Simplify installation instructions 2018-12-28 13:17:22 +02:00
4c2d79fc6a More consistent code blocks in readme 2018-12-28 12:50:30 +02:00
48a2fb26fe Add badges to readme 2018-12-28 12:47:13 +02:00
33b79d2446 More logo padding and no underline 2018-12-28 02:21:55 +02:00
d6d2d96459 Add repo name as h1 2018-12-28 02:19:44 +02:00
d5b6ab5198 Readme logo to be centered 2018-12-28 02:14:25 +02:00
15e8439c7f Back to smaller padding in readme logo 2018-12-28 02:04:16 +02:00
ff6148f9b9 Improve readme badges 2018-12-28 01:56:45 +02:00
dfd8657bc5 h1 around logo in readme 2018-12-28 01:28:59 +02:00
ee64646765 More padding for logo in readme 2018-12-28 01:21:51 +02:00
c956090b55 Update readme logo 2018-12-28 01:07:49 +02:00
0be26550f3 Update readme logo 2018-12-28 00:55:48 +02:00
8e26a65a6f More consistent letter case in readme 2018-12-28 00:41:14 +02:00
2a24a8583b More consistent formatting in readme 2018-12-28 00:36:04 +02:00
1d55344e92 Simpler readme header 2018-12-27 23:59:37 +02:00
5dc8d1cc39 Simpler readme examples 2018-12-27 23:51:07 +02:00
33cf0f0b99 Centered header in readme 2018-12-27 23:46:53 +02:00
dc1ff7d6c2 Remove horizontal rule from readme 2018-12-27 22:50:39 +02:00
0f0987571d Bigger headings in readme 2018-12-27 22:32:54 +02:00
18eaa649b5 Add logo to readme 2018-12-27 22:23:17 +02:00
e124572b60 Merge pull request #675 from andreybolonin/patch-1
add php 7.3
2018-11-16 07:45:32 +00:00
1686a34469 add php 7.3 to allow_failures 2018-11-16 09:34:17 +02:00
2bd7113c55 Merge pull request #676 from aidantwoods/fix/uninitialized-string-offset
Fix access to potentially uninitialised offset
2018-11-06 21:49:46 +00:00
29fce0ec37 Fix access to potentially uninitialised offset 2018-11-06 21:10:23 +00:00
b0bbc275d4 add php 7.3 2018-10-31 15:48:28 +02:00
72f9ca92ae Merge pull request #671 from aidantwoods/fix/line-ending-standardisation
Ensure line-breaks get standardised when using Parsedown via `line` method
2018-10-16 18:51:05 +01:00
89c3fa05d9 Ensure line-breaks get standardised when using via line method
As noted in https://github.com/erusev/parsedown/pull/624 there are
occasions where line break standardisation is assumed (e.g. where
`inlineCode` replaces line breaks with a space).

Closes #624
2018-10-16 18:41:42 +01:00
69163d6e88 Merge pull request #670 from tillkruss/patch-1
Add "tel:" to whitelist
2018-10-14 21:48:40 +01:00
3a0c964291 Add "tel:" to whitelist 2018-10-02 16:38:21 -07:00
1829106e60 Merge pull request #668 from itshoro/block-heading-min
remove redundant header level cap
2018-09-19 21:28:02 +01:00
464f5f9329 removed min function as it is redundant in the context 2018-09-19 17:36:40 +02:00
c26a2ee4bf Bump beta version 2018-06-11 19:15:32 +01:00
ba3b60d6e4 Merge pull request #641 from aidantwoods/fix/api-stability-complete-function-removal
Restore existence of protected API methods
2018-06-08 14:38:42 +01:00
0b1e6b8c86 Restore existence of protected API methods 2018-06-07 19:47:09 +01:00
1f69f7e697 Bump version 2018-05-08 22:46:15 +01:00
c83af0a7d5 Merge pull request #628 from aidantwoods/fix/revert-rawHtml-breaks-insertion
Preserve plain-text in AST to avoid blinding extensions to it
2018-05-08 22:41:44 +01:00
4686daf8c2 Preserve plain-text in AST to avoid blinding extensions to it 2018-05-08 22:32:57 +01:00
c9e7183cfa Merge pull request #627 from aidantwoods/fix/hidden-blocks
Intepret special "hidden" key as an empty element
2018-05-08 22:07:51 +01:00
9eed1104e7 Intepret special "hidden" key as an empty element 2018-05-08 21:54:30 +01:00
fd95703da5 Version bump 2018-05-07 14:26:12 +01:00
3 changed files with 94 additions and 53 deletions

View File

@ -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

View File

@ -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(

View File

@ -1,60 +1,61 @@
> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC. <!-- ![Parsedown](https://i.imgur.com/yE8afYV.png) -->
## Parsedown <p align="center"><img alt="Parsedown" src="https://i.imgur.com/fKVY6Kz.png" width="240" /></p>
[![Build Status](https://img.shields.io/travis/erusev/parsedown/master.svg?style=flat-square)](https://travis-ci.org/erusev/parsedown) <h1>Parsedown</h1>
<!--[![Total Downloads](http://img.shields.io/packagist/dt/erusev/parsedown.svg?style=flat-square)](https://packagist.org/packages/erusev/parsedown)-->
Better Markdown Parser in PHP [![Build Status](https://travis-ci.org/erusev/parsedown.svg)](https://travis-ci.org/erusev/parsedown)
[![Total Downloads](https://poser.pugx.org/erusev/parsedown/d/total.svg)](https://packagist.org/packages/erusev/parsedown)
[![Version](https://poser.pugx.org/erusev/parsedown/v/stable.svg)](https://packagist.org/packages/erusev/parsedown)
[![License](https://poser.pugx.org/erusev/parsedown/license.svg)](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 :)