| 148 |
lars |
1 |
# league/commonmark
|
|
|
2 |
|
|
|
3 |
[](https://packagist.org/packages/league/commonmark)
|
|
|
4 |
[](https://packagist.org/packages/league/commonmark)
|
|
|
5 |
[](LICENSE)
|
|
|
6 |
[](https://github.com/thephpleague/commonmark/actions?query=workflow%3ATests+branch%3Amain)
|
|
|
7 |
[](https://scrutinizer-ci.com/g/thephpleague/commonmark/code-structure)
|
|
|
8 |
[](https://scrutinizer-ci.com/g/thephpleague/commonmark)
|
|
|
9 |
[](https://shepherd.dev/github/thephpleague/commonmark)
|
|
|
10 |
[](https://bestpractices.coreinfrastructure.org/projects/126)
|
|
|
11 |
[](https://www.colinodell.com/sponsor)
|
|
|
12 |
|
|
|
13 |

|
|
|
14 |
|
|
|
15 |
**league/commonmark** is a highly-extensible PHP Markdown parser created by [Colin O'Dell][@colinodell] which supports the full [CommonMark] spec and [GitHub-Flavored Markdown]. It is based on the [CommonMark JS reference implementation][commonmark.js] by [John MacFarlane] \([@jgm]\).
|
|
|
16 |
|
|
|
17 |
## 📦 Installation & Basic Usage
|
|
|
18 |
|
|
|
19 |
This project requires PHP 7.4 or higher with the `mbstring` extension. To install it via [Composer] simply run:
|
|
|
20 |
|
|
|
21 |
``` bash
|
|
|
22 |
$ composer require league/commonmark
|
|
|
23 |
```
|
|
|
24 |
|
|
|
25 |
The `CommonMarkConverter` class provides a simple wrapper for converting CommonMark to HTML:
|
|
|
26 |
|
|
|
27 |
```php
|
|
|
28 |
use League\CommonMark\CommonMarkConverter;
|
|
|
29 |
|
|
|
30 |
$converter = new CommonMarkConverter([
|
|
|
31 |
'html_input' => 'strip',
|
|
|
32 |
'allow_unsafe_links' => false,
|
|
|
33 |
]);
|
|
|
34 |
|
|
|
35 |
echo $converter->convert('# Hello World!');
|
|
|
36 |
|
|
|
37 |
// <h1>Hello World!</h1>
|
|
|
38 |
```
|
|
|
39 |
|
|
|
40 |
Or if you want GitHub-Flavored Markdown, use the `GithubFlavoredMarkdownConverter` class instead:
|
|
|
41 |
|
|
|
42 |
```php
|
|
|
43 |
use League\CommonMark\GithubFlavoredMarkdownConverter;
|
|
|
44 |
|
|
|
45 |
$converter = new GithubFlavoredMarkdownConverter([
|
|
|
46 |
'html_input' => 'strip',
|
|
|
47 |
'allow_unsafe_links' => false,
|
|
|
48 |
]);
|
|
|
49 |
|
|
|
50 |
echo $converter->convert('# Hello World!');
|
|
|
51 |
|
|
|
52 |
// <h1>Hello World!</h1>
|
|
|
53 |
```
|
|
|
54 |
|
|
|
55 |
Please note that only UTF-8 and ASCII encodings are supported. If your Markdown uses a different encoding please convert it to UTF-8 before running it through this library.
|
|
|
56 |
|
|
|
57 |
🔒 If you will be parsing untrusted input from users, please consider setting the `html_input` and `allow_unsafe_links` options per the example above. See <https://commonmark.thephpleague.com/security/> for more details. If you also do choose to allow raw HTML input from untrusted users, consider using a library (like [HTML Purifier](https://github.com/ezyang/htmlpurifier)) to provide additional HTML filtering.
|
|
|
58 |
|
|
|
59 |
## 📓 Documentation
|
|
|
60 |
|
|
|
61 |
Full documentation on advanced usage, configuration, and customization can be found at [commonmark.thephpleague.com][docs].
|
|
|
62 |
|
|
|
63 |
## ⏫ Upgrading
|
|
|
64 |
|
|
|
65 |
Information on how to upgrade to newer versions of this library can be found at <https://commonmark.thephpleague.com/releases>.
|
|
|
66 |
|
|
|
67 |
## 💻 GitHub-Flavored Markdown
|
|
|
68 |
|
|
|
69 |
The `GithubFlavoredMarkdownConverter` shown earlier is a drop-in replacement for the `CommonMarkConverter` which adds additional features found in the GFM spec:
|
|
|
70 |
|
|
|
71 |
- Autolinks
|
|
|
72 |
- Disallowed raw HTML
|
|
|
73 |
- Strikethrough
|
|
|
74 |
- Tables
|
|
|
75 |
- Task Lists
|
|
|
76 |
|
|
|
77 |
See the [Extensions documentation](https://commonmark.thephpleague.com/customization/extensions/) for more details on how to include only certain GFM features if you don't want them all.
|
|
|
78 |
|
|
|
79 |
## 🗃️ Related Packages
|
|
|
80 |
|
|
|
81 |
### Integrations
|
|
|
82 |
|
|
|
83 |
- [CakePHP 3](https://github.com/gourmet/common-mark)
|
|
|
84 |
- [Drupal](https://www.drupal.org/project/markdown)
|
|
|
85 |
- [Laravel 4+](https://github.com/GrahamCampbell/Laravel-Markdown)
|
|
|
86 |
- [Sculpin](https://github.com/bcremer/sculpin-commonmark-bundle)
|
|
|
87 |
- [Symfony 2 & 3](https://github.com/webuni/commonmark-bundle)
|
|
|
88 |
- [Symfony 4](https://github.com/avensome/commonmark-bundle)
|
|
|
89 |
- [Twig Markdown extension](https://github.com/twigphp/markdown-extension)
|
|
|
90 |
- [Twig filter and tag](https://github.com/aptoma/twig-markdown)
|
|
|
91 |
- [Laravel CommonMark Blog](https://github.com/spekulatius/laravel-commonmark-blog)
|
|
|
92 |
|
|
|
93 |
### Included Extensions
|
|
|
94 |
|
|
|
95 |
See [our extension documentation](https://commonmark.thephpleague.com/extensions/overview) for a full list of extensions bundled with this library.
|
|
|
96 |
|
|
|
97 |
### Community Extensions
|
|
|
98 |
|
|
|
99 |
Custom parsers/renderers can be bundled into extensions which extend CommonMark. Here are some that you may find interesting:
|
|
|
100 |
|
|
|
101 |
- [Alt Three Emoji](https://github.com/AltThree/Emoji) An emoji parser for CommonMark.
|
|
|
102 |
- [Sup Sub extensions](https://github.com/OWS/commonmark-sup-sub-extensions) - Adds support of superscript and subscript (`<sup>` and `<sub>` HTML tags)
|
|
|
103 |
- [YouTube iframe extension](https://github.com/zoonru/commonmark-ext-youtube-iframe) - Replaces youtube link with iframe.
|
|
|
104 |
- [Lazy Image extension](https://github.com/simonvomeyser/commonmark-ext-lazy-image) - Adds various options for lazy loading of images.
|
|
|
105 |
- [Marker Extension](https://github.com/noah1400/commonmark-marker-extension) - Adds support of highlighted text (`<mark>` HTML tag)
|
|
|
106 |
|
|
|
107 |
Others can be found on [Packagist under the `commonmark-extension` package type](https://packagist.org/packages/league/commonmark?type=commonmark-extension).
|
|
|
108 |
|
|
|
109 |
If you build your own, feel free to submit a PR to add it to this list!
|
|
|
110 |
|
|
|
111 |
### Others
|
|
|
112 |
|
|
|
113 |
Check out the other cool things people are doing with `league/commonmark`: <https://packagist.org/packages/league/commonmark/dependents>
|
|
|
114 |
|
|
|
115 |
## 🏷️ Versioning
|
|
|
116 |
|
|
|
117 |
[SemVer](http://semver.org/) is followed closely. Minor and patch releases should not introduce breaking changes to the codebase; however, they might change the resulting AST or HTML output of parsed Markdown (due to bug fixes, spec changes, etc.) As a result, you might get slightly different HTML, but any custom code built onto this library should still function correctly.
|
|
|
118 |
|
|
|
119 |
Any classes or methods marked `@internal` are not intended for use outside of this library and are subject to breaking changes at any time, so please avoid using them.
|
|
|
120 |
|
|
|
121 |
## 🛠️ Maintenance & Support
|
|
|
122 |
|
|
|
123 |
When a new **minor** version (e.g. `2.0` -> `2.1`) is released, the previous one (`2.0`) will continue to receive security and critical bug fixes for *at least* 3 months.
|
|
|
124 |
|
|
|
125 |
When a new **major** version is released (e.g. `1.6` -> `2.0`), the previous one (`1.6`) will receive critical bug fixes for *at least* 3 months and security updates for 6 months after that new release comes out.
|
|
|
126 |
|
|
|
127 |
(This policy may change in the future and exceptions may be made on a case-by-case basis.)
|
|
|
128 |
|
|
|
129 |
**Professional support, including notification of new releases and security updates, is available through a [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme).**
|
|
|
130 |
|
|
|
131 |
## 👷â€â™€ï¸ Contributing
|
|
|
132 |
|
|
|
133 |
To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure with us.
|
|
|
134 |
|
|
|
135 |
If you encounter a bug in the spec, please report it to the [CommonMark] project. Any resulting fix will eventually be implemented in this project as well.
|
|
|
136 |
|
|
|
137 |
Contributions to this library are **welcome**, especially ones that:
|
|
|
138 |
|
|
|
139 |
* Improve usability or flexibility without compromising our ability to adhere to the [CommonMark spec]
|
|
|
140 |
* Mirror fixes made to the [reference implementation][commonmark.js]
|
|
|
141 |
* Optimize performance
|
|
|
142 |
* Fix issues with adhering to the [CommonMark spec]
|
|
|
143 |
|
|
|
144 |
Major refactoring to core parsing logic should be avoided if possible so that we can easily follow updates made to [the reference implementation][commonmark.js]. That being said, we will absolutely consider changes which don't deviate too far from the reference spec or which are favored by other popular CommonMark implementations.
|
|
|
145 |
|
|
|
146 |
Please see [CONTRIBUTING](https://github.com/thephpleague/commonmark/blob/main/.github/CONTRIBUTING.md) for additional details.
|
|
|
147 |
|
|
|
148 |
## 🧪 Testing
|
|
|
149 |
|
|
|
150 |
``` bash
|
|
|
151 |
$ composer test
|
|
|
152 |
```
|
|
|
153 |
|
|
|
154 |
This will also test league/commonmark against the latest supported spec.
|
|
|
155 |
|
|
|
156 |
## 🚀 Performance Benchmarks
|
|
|
157 |
|
|
|
158 |
You can compare the performance of **league/commonmark** to other popular parsers by running the included benchmark tool:
|
|
|
159 |
|
|
|
160 |
``` bash
|
|
|
161 |
$ ./tests/benchmark/benchmark.php
|
|
|
162 |
```
|
|
|
163 |
|
|
|
164 |
## 👥 Credits & Acknowledgements
|
|
|
165 |
|
|
|
166 |
- [Colin O'Dell][@colinodell]
|
|
|
167 |
- [John MacFarlane][@jgm]
|
|
|
168 |
- [All Contributors]
|
|
|
169 |
|
|
|
170 |
This code is partially based on the [CommonMark JS reference implementation][commonmark.js] which is written, maintained and copyrighted by [John MacFarlane]. This project simply wouldn't exist without his work.
|
|
|
171 |
|
|
|
172 |
### Sponsors
|
|
|
173 |
|
|
|
174 |
We'd also like to extend our sincere thanks the following sponsors who support ongoing development of this project:
|
|
|
175 |
|
|
|
176 |
- [Tidelift](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme) for offering support to both the maintainers and end-users through their [professional support](https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme) program
|
|
|
177 |
- [Blackfire](https://www.blackfire.io/) for providing an Open-Source Profiler subscription
|
|
|
178 |
- [JetBrains](https://www.jetbrains.com/) for supporting this project with complimentary [PhpStorm](https://www.jetbrains.com/phpstorm/) licenses
|
|
|
179 |
- [Taylor Otwell](https://twitter.com/taylorotwell) for sponsoring this project through GitHub sponsors
|
|
|
180 |
|
|
|
181 |
Are you interested in sponsoring development of this project? See <https://www.colinodell.com/sponsor> for a list of ways to contribute.
|
|
|
182 |
|
|
|
183 |
## 📄 License
|
|
|
184 |
|
|
|
185 |
**league/commonmark** is licensed under the BSD-3 license. See the [`LICENSE`](LICENSE) file for more details.
|
|
|
186 |
|
|
|
187 |
## 🏛️ Governance
|
|
|
188 |
|
|
|
189 |
This project is primarily maintained by [Colin O'Dell][@colinodell]. Members of the [PHP League] Leadership Team may occasionally assist with some of these duties.
|
|
|
190 |
|
|
|
191 |
## ðŸ—ºï¸ Who Uses It?
|
|
|
192 |
|
|
|
193 |
This project is used by [Drupal](https://www.drupal.org/project/markdown), [Laravel Framework](https://laravel.com/), [Cachet](https://cachethq.io/), [Firefly III](https://firefly-iii.org/), [Neos](https://www.neos.io/), [Daux.io](https://daux.io/), and [more](https://packagist.org/packages/league/commonmark/dependents)!
|
|
|
194 |
|
|
|
195 |
---
|
|
|
196 |
|
|
|
197 |
<div align="center">
|
|
|
198 |
<b>
|
|
|
199 |
<a href="https://tidelift.com/subscription/pkg/packagist-league-commonmark?utm_source=packagist-league-commonmark&utm_medium=referral&utm_campaign=readme">Get professional support for league/commonmark with a Tidelift subscription</a>
|
|
|
200 |
</b>
|
|
|
201 |
<br>
|
|
|
202 |
<sub>
|
|
|
203 |
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
|
|
204 |
</sub>
|
|
|
205 |
</div>
|
|
|
206 |
|
|
|
207 |
[CommonMark]: http://commonmark.org/
|
|
|
208 |
[CommonMark spec]: http://spec.commonmark.org/
|
|
|
209 |
[commonmark.js]: https://github.com/jgm/commonmark.js
|
|
|
210 |
[GitHub-Flavored Markdown]: https://github.github.com/gfm/
|
|
|
211 |
[John MacFarlane]: http://johnmacfarlane.net
|
|
|
212 |
[docs]: https://commonmark.thephpleague.com/
|
|
|
213 |
[docs-examples]: https://commonmark.thephpleague.com/customization/overview/#examples
|
|
|
214 |
[docs-example-twitter]: https://commonmark.thephpleague.com/customization/inline-parsing#example-1---twitter-handles
|
|
|
215 |
[docs-example-smilies]: https://commonmark.thephpleague.com/customization/inline-parsing#example-2---emoticons
|
|
|
216 |
[All Contributors]: https://github.com/thephpleague/commonmark/contributors
|
|
|
217 |
[@colinodell]: https://www.twitter.com/colinodell
|
|
|
218 |
[@jgm]: https://github.com/jgm
|
|
|
219 |
[jgm/stmd]: https://github.com/jgm/stmd
|
|
|
220 |
[Composer]: https://getcomposer.org/
|
|
|
221 |
[PHP League]: https://thephpleague.com
|