1
0
mirror of https://github.com/erusev/parsedown.git synced 2025-09-02 19:32:35 +02:00

Compare commits

...

75 Commits

Author SHA1 Message Date
Emanuil Rusev
0b274ac959 Format installation command in README 2025-08-31 10:57:44 +03:00
Emanuil Rusev
5b74b74145 Update README.md 2025-06-05 08:59:58 +03:00
Emanuil Rusev
95c7e4c3d7 Update README.md 2025-05-20 21:25:06 +03:00
Emanuil Rusev
c9dc49f68f Update README.md 2024-12-01 18:36:17 +02:00
Emanuil Rusev
28a9b057c7 Update README.md 2024-12-01 17:27:57 +02:00
Emanuil Rusev
e0082193b1 Update README.md 2024-12-01 17:27:10 +02:00
Emanuil Rusev
999fcf7886 update version 2024-11-10 09:39:46 +02:00
Emanuil Rusev
582f9f9cd1 Merge pull request #881 from xPaw/merge-1.8.x
Merge `1.8.x-beta` into `master`
2024-10-12 10:06:08 +03:00
Emanuil Rusev
e76c4e44be Update README.md 2024-09-08 10:15:41 +03:00
Pavel Djundik
cfb313fb1f Revert "Merge pull request #876 from xabbuh/branch-alias"
This reverts commit 0476f3be5b, reversing
changes made to 9d00deadcd.
2024-08-28 11:19:02 +03:00
Pavel Djundik
9b14567c57 Fix commonmark test 2024-08-28 11:18:17 +03:00
Pavel Djundik
c65c451606 Merge branch '1.8.x-beta' 2024-08-28 11:15:16 +03:00
Emanuil Rusev
0476f3be5b Merge pull request #876 from xabbuh/branch-alias
add a branch alias to allow installing untagged 1.8 versions
2024-07-18 10:01:16 +03:00
Emanuil Rusev
9d00deadcd Merge pull request #872 from xabbuh/pr-868-1.8
[PHP 8.4] Fixes for implicit nullability deprecation
2024-07-17 09:19:21 +03:00
Emanuil Rusev
15048b0210 Merge pull request #875 from xabbuh/pr-874
fix GitHub Actions config file syntax
2024-07-17 09:15:20 +03:00
Christian Flothmann
e7a3bccbae add a branch alias to allow installing untagged 1.8 versions 2024-07-17 05:59:36 +02:00
Christian Flothmann
26362c5fe9 fix GitHub Actions config file syntax 2024-07-17 05:52:46 +02:00
Emanuil Rusev
89880dd0a9 Merge pull request #874 from xabbuh/ci-1.8
enable GitHub Actions and drop support for PHP < 7.1
2024-07-15 13:33:21 +03:00
Christian Flothmann
44fd383db7 run tests using GitHub actions 2024-07-15 10:51:54 +02:00
Christian Flothmann
54f1ffc214 drop support for PHP < 7.1 2024-07-15 10:46:34 +02:00
Ayesh Karunaratne
6ae01284b8 [PHP 8.4] Fixes for implicit nullability deprecation
Fixes all issues that emit deprecation notices on PHP 8.4 for implicit nullable parameter type declarations.

See:
 - [RFC](https://wiki.php.net/rfc/deprecate-implicitly-nullable-types)
 - [PHP 8.4: Implicitly nullable parameter declarations deprecated](https://php.watch/versions/8.4/implicitly-marking-parameter-type-nullable-deprecated)
2024-07-09 10:54:53 +02:00
Emanuil Rusev
26cfde9dbf Merge pull request #868 from Ayesh/php84/nullability
[PHP 8.4] Fixes for implicit nullability deprecation
2024-07-09 09:15:45 +03:00
Emanuil Rusev
232c57201e Update README.md 2024-06-10 10:08:19 +03:00
Emanuil Rusev
5362f4cbe3 Update README.md 2024-05-11 08:10:21 +03:00
Emanuil Rusev
b3e2fa192c Update README.md 2024-04-11 08:59:50 +03:00
Ayesh Karunaratne
908754bcdd [PHP 8.4] Fixes for implicit nullability deprecation
Fixes all issues that emit deprecation notices on PHP 8.4 for implicit nullable parameter type declarations.

See:
 - [RFC](https://wiki.php.net/rfc/deprecate-implicitly-nullable-types)
 - [PHP 8.4: Implicitly nullable parameter declarations deprecated](https://php.watch/versions/8.4/implicitly-marking-parameter-type-nullable-deprecated)
2024-03-16 02:44:40 +07:00
Emanuil Rusev
1ff0382739 Update README.md 2024-03-12 07:27:45 +02:00
Emanuil Rusev
f5aa6fd1ca Update README.md 2024-02-11 11:36:09 +02:00
Emanuil Rusev
77947eda2f Update README.md 2023-10-13 11:10:28 +03:00
Emanuil Rusev
0586729b46 Update README.md 2023-10-13 11:09:51 +03:00
Emanuil Rusev
a86a4e19da Update README.md 2023-10-13 11:08:28 +03:00
Emanuil Rusev
6598f3860c update readme 2020-08-09 17:12:21 +03:00
Emanuil Rusev
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
Emanuil Rusev
1610e4747c Merge pull request #741 from GrahamCampbell/patch-1
Update .travis.yml
2020-02-18 12:38:52 +02:00
Emanuil Rusev
3159a9d3cd Merge pull request #751 from jeanmonod/patch-1
Update GitHub flavored markdown url
2020-01-22 09:53:45 +02:00
Jeanmonod David
dbee8ab4f2 Update GitHub flavored markdown url 2020-01-21 22:07:12 +01:00
Graham Campbell
dba4125b59 Update .travis.yml 2019-12-20 00:05:10 +00:00
Aidan Woods
87b57bf3cb Add test to prevent regression 2019-04-10 21:54:34 +01:00
Aidan Woods
bfaa76d370 Reflect travis breadth in README
Closes https://github.com/erusev/parsedown/issues/692
2019-04-07 16:36:22 +01:00
Aidan Woods
3825db53a2 Merge branch '1.8.x-beta' 2019-04-06 17:58:29 +01:00
Aidan Woods
bce642f2d7 7.3 was released 2019-03-17 18:38:54 +00:00
Aidan Woods
21c8c792de Merge pull request #698 from cybernet/patch-1
Symfony Demo link update
2019-03-14 18:49:20 +00:00
cybernet
6ca29539e1 Symfony Demo link update 2019-03-12 20:49:21 +00:00
Emanuil Rusev
a503c1a69b composer/composer#7990 2019-03-02 12:08:48 +02:00
Emanuil Rusev
819c68899d Simplify installation instructions 2018-12-28 13:17:22 +02:00
Emanuil Rusev
4c2d79fc6a More consistent code blocks in readme 2018-12-28 12:50:30 +02:00
Emanuil Rusev
48a2fb26fe Add badges to readme 2018-12-28 12:47:13 +02:00
Emanuil Rusev
33b79d2446 More logo padding and no underline 2018-12-28 02:21:55 +02:00
Emanuil Rusev
d6d2d96459 Add repo name as h1 2018-12-28 02:19:44 +02:00
Emanuil Rusev
d5b6ab5198 Readme logo to be centered 2018-12-28 02:14:25 +02:00
Emanuil Rusev
15e8439c7f Back to smaller padding in readme logo 2018-12-28 02:04:16 +02:00
Emanuil Rusev
ff6148f9b9 Improve readme badges 2018-12-28 01:56:45 +02:00
Emanuil Rusev
dfd8657bc5 h1 around logo in readme 2018-12-28 01:28:59 +02:00
Emanuil Rusev
ee64646765 More padding for logo in readme 2018-12-28 01:21:51 +02:00
Emanuil Rusev
c956090b55 Update readme logo 2018-12-28 01:07:49 +02:00
Emanuil Rusev
0be26550f3 Update readme logo 2018-12-28 00:55:48 +02:00
Emanuil Rusev
8e26a65a6f More consistent letter case in readme 2018-12-28 00:41:14 +02:00
Emanuil Rusev
2a24a8583b More consistent formatting in readme 2018-12-28 00:36:04 +02:00
Emanuil Rusev
1d55344e92 Simpler readme header 2018-12-27 23:59:37 +02:00
Emanuil Rusev
5dc8d1cc39 Simpler readme examples 2018-12-27 23:51:07 +02:00
Emanuil Rusev
33cf0f0b99 Centered header in readme 2018-12-27 23:46:53 +02:00
Emanuil Rusev
dc1ff7d6c2 Remove horizontal rule from readme 2018-12-27 22:50:39 +02:00
Emanuil Rusev
0f0987571d Bigger headings in readme 2018-12-27 22:32:54 +02:00
Emanuil Rusev
18eaa649b5 Add logo to readme 2018-12-27 22:23:17 +02:00
Aidan Woods
e124572b60 Merge pull request #675 from andreybolonin/patch-1
add php 7.3
2018-11-16 07:45:32 +00:00
Andrey Bolonin
1686a34469 add php 7.3 to allow_failures 2018-11-16 09:34:17 +02:00
Aidan Woods
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
Aidan Woods
29fce0ec37 Fix access to potentially uninitialised offset 2018-11-06 21:10:23 +00:00
Andrey Bolonin
b0bbc275d4 add php 7.3 2018-10-31 15:48:28 +02:00
Aidan Woods
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
Aidan Woods
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
Aidan Woods
69163d6e88 Merge pull request #670 from tillkruss/patch-1
Add "tel:" to whitelist
2018-10-14 21:48:40 +01:00
Till Krüss
3a0c964291 Add "tel:" to whitelist 2018-10-02 16:38:21 -07:00
Aidan Woods
1829106e60 Merge pull request #668 from itshoro/block-heading-min
remove redundant header level cap
2018-09-19 21:28:02 +01:00
horodev
464f5f9329 removed min function as it is redundant in the context 2018-09-19 17:36:40 +02:00
10 changed files with 105 additions and 81 deletions

37
.github/workflows/unit-tests.yaml vendored Normal file
View File

@@ -0,0 +1,37 @@
on:
- push
- pull_request
jobs:
phpunit:
runs-on: ubuntu-latest
strategy:
matrix:
php:
- '7.1'
- '7.2'
- '7.3'
- '7.4'
- '8.0'
- '8.1'
- '8.2'
- '8.3'
- '8.4'
steps:
- name: Checkout the source code
uses: actions/checkout@v4
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '${{ matrix.php }}'
- name: Install dependencies
run: composer install
- name: Run tests
run: |
vendor/bin/phpunit
vendor/bin/phpunit test/CommonMarkTestWeak.php || true

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
composer.lock
vendor/
.phpunit.result.cache

View File

@@ -1,28 +0,0 @@
language: php
dist: trusty
sudo: false
matrix:
include:
- php: 5.3
dist: precise
- php: 5.4
- php: 5.5
- php: 5.6
- php: 7.0
- php: 7.1
- php: 7.2
- php: 7.3
- php: nightly
fast_finish: true
allow_failures:
- php: nightly
install:
- composer install --prefer-dist --no-interaction --no-progress
script:
- vendor/bin/phpunit
- vendor/bin/phpunit test/CommonMarkTestWeak.php || true
- '[ -z "$TRAVIS_TAG" ] || [ "$TRAVIS_TAG" == "$(php -r "require(\"Parsedown.php\"); echo Parsedown::version;")" ]'

View File

@@ -17,7 +17,7 @@ class Parsedown
{
# ~
const version = '1.8.0-beta-7';
const version = '1.8.0';
# ~
@@ -107,6 +107,7 @@ class Parsedown
'ftp://',
'ftps://',
'mailto:',
'tel:',
'data:image/png;base64,',
'data:image/gif;base64,',
'data:image/jpeg;base64,',
@@ -555,7 +556,7 @@ class Parsedown
$Block = array(
'element' => array(
'name' => 'h' . min(6, $level),
'name' => 'h' . $level,
'handler' => array(
'function' => 'lineElements',
'argument' => $text,
@@ -570,7 +571,7 @@ class Parsedown
#
# List
protected function blockList($Line, array $CurrentBlock = null)
protected function blockList($Line, ?array $CurrentBlock = null)
{
list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]');
@@ -807,7 +808,7 @@ class Parsedown
#
# Setext
protected function blockSetextHeader($Line, array $Block = null)
protected function blockSetextHeader($Line, ?array $Block = null)
{
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
{
@@ -893,7 +894,7 @@ class Parsedown
#
# Table
protected function blockTable($Line, array $Block = null)
protected function blockTable($Line, ?array $Block = null)
{
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
{
@@ -1133,6 +1134,9 @@ class Parsedown
protected function lineElements($text, $nonNestables = array())
{
# standardize line breaks
$text = str_replace(array("\r\n", "\r"), "\n", $text);
$Elements = array();
$nonNestables = (empty($nonNestables)
@@ -1490,7 +1494,7 @@ class Parsedown
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)
) {
return array(

View File

@@ -1,82 +1,79 @@
> I also make [Caret](https://caret.io?ref=parsedown) - a Markdown editor for Mac and PC.
# Parsedown
## 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)
[![Build Status](https://img.shields.io/travis/erusev/parsedown/master.svg?style=flat-square)](https://travis-ci.org/erusev/parsedown)
<!--[![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 — <a href="https://parsedown.org/demo">demo</a>
Better Markdown Parser in PHP
## Features
[Demo](http://parsedown.org/demo) |
[Benchmarks](http://parsedown.org/speed) |
[Tests](http://parsedown.org/tests/) |
[Documentation](https://github.com/erusev/parsedown/wiki/)
- One file
- No dependencies
- [Super fast](http://parsedown.org/speed)
- Extensible
- [GitHub flavored](https://github.github.com/gfm)
- [Tested](http://parsedown.org/tests/) in 5.3 to 7.3
- [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
### Features
## Installation
* One File
* No Dependencies
* Super Fast
* Extensible
* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
* Tested in 5.3 to 7.2 and in HHVM
* [Markdown Extra extension](https://github.com/erusev/parsedown-extra)
Install the [composer package]:
### Installation
#### Composer
Install the [composer package] by running the following command:
```sh
composer require erusev/parsedown
```
composer require erusev/parsedown
#### Manual
1. Download the "Source code" from the [latest release]
2. Include `Parsedown.php`
Or download the [latest release] and include `Parsedown.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
## Example
``` php
```php
$Parsedown = new Parsedown();
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>!
```
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.
To tell Parsedown that it is processing untrusted user-input, use the following:
```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/).
In both cases you should strongly consider employing defence-in-depth measures, like [deploying a Content-Security-Policy](https://scotthelme.co.uk/content-security-policy-an-introduction/) (a browser security feature) so that your page is likely to be safe even if an attacker finds a vulnerability in one of the first lines of defence above.
#### Security of Parsedown Extensions
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
> ⚠️  **WARNING:** This method isn't safe from XSS!
## Escaping HTML
> WARNING: This method is not 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
$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, ex: `[xss](javascript:alert%281%29)`.
### Questions
## Questions
**How does Parsedown work?**
@@ -90,8 +87,12 @@ It passes most of the CommonMark tests. Most of the tests that don't pass deal w
**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?**
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 notes app designed for local Markdown files.

View File

@@ -13,11 +13,11 @@
}
],
"require": {
"php": ">=5.3.0",
"php": ">=7.1",
"ext-mbstring": "*"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35"
"phpunit/phpunit": "^7.5|^8.5|^9.6"
},
"autoload": {
"psr-0": {"Parsedown": ""}

View File

@@ -1,17 +1,19 @@
<?php
use PHPUnit\Framework\TestCase;
/**
* Test Parsedown against the CommonMark spec
*
* @link http://commonmark.org/ CommonMark
*/
class CommonMarkTestStrict extends PHPUnit_Framework_TestCase
class CommonMarkTestStrict extends TestCase
{
const SPEC_URL = 'https://raw.githubusercontent.com/jgm/CommonMark/master/spec.txt';
protected $parsedown;
protected function setUp()
protected function setUp() : void
{
$this->parsedown = new TestParsedown();
$this->parsedown->setUrlsLinked(false);

View File

@@ -17,7 +17,7 @@ class CommonMarkTestWeak extends CommonMarkTestStrict
{
protected $textLevelElementRegex;
protected function setUp()
protected function setUp() : void
{
parent::setUp();

View File

@@ -15,4 +15,6 @@ still a fenced code block</code></pre>
<pre><code>foo
bar</code></pre>
bar</code></pre>
<pre><code class="language-php">&lt;?php
echo "Hello World";</code></pre>

View File

@@ -35,4 +35,9 @@ foo
bar
```
```php some-class
<?php
echo "Hello World";
```