1# league/commonmark 2 3[](https://packagist.org/packages/league/commonmark) 4[](https://packagist.org/packages/league/commonmark) 5[](LICENSE) 6[](https://travis-ci.org/thephpleague/commonmark) 7[](https://scrutinizer-ci.com/g/thephpleague/commonmark/code-structure) 8[](https://scrutinizer-ci.com/g/thephpleague/commonmark) 9[](https://bestpractices.coreinfrastructure.org/projects/126) 10 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 19This project requires PHP 7.1 or higher with the `mbstring` extension. To install it via [Composer] simply run: 20 21``` bash 22$ composer require league/commonmark 23``` 24 25The `CommonMarkConverter` class provides a simple wrapper for converting CommonMark to HTML: 26 27```php 28use League\CommonMark\CommonMarkConverter; 29 30$converter = new CommonMarkConverter([ 31 'html_input' => 'strip', 32 'allow_unsafe_links' => false, 33]); 34 35echo $converter->convertToHtml('# Hello World!'); 36 37// <h1>Hello World!</h1> 38``` 39 40Or if you want Github-Flavored Markdown, use the `GithubFlavoredMarkdownConverter` class instead: 41 42```php 43use League\CommonMark\GithubFlavoredMarkdownConverter; 44 45$converter = new GithubFlavoredMarkdownConverter([ 46 'html_input' => 'strip', 47 'allow_unsafe_links' => false, 48]); 49 50echo $converter->convertToHtml('# Hello World!'); 51 52// <h1>Hello World!</h1> 53``` 54 55Please 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, considering using a library (like [HTML Purifier](https://github.com/ezyang/htmlpurifier)) to provide additional HTML filtering. 58 59## Documentation 60 61Full documentation on advanced usage, configuration, and customization can be found at [commonmark.thephpleague.com][docs]. 62 63## ⏫ Upgrading 64 65Information 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 69The `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 77See 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 & 5](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 92### Included Extensions 93 94See [our extension documentation](https://commonmark.thephpleague.com/extensions/overview) for a full list of extensions bundled with this library. 95 96### Community Extensions 97 98Custom parsers/renderers can be bundled into extensions which extend CommonMark. Here are some that you may find interesting: 99 100 - [Alt Three Emoji](https://github.com/AltThree/Emoji) An emoji parser for CommonMark. 101 - [Sup Sub extensions](https://github.com/OWS/commonmark-sup-sub-extensions) - Adds support of superscript and subscript (`<sup>` and `<sub>` HTML tags) 102 - [YouTube iframe extension](https://github.com/zoonru/commonmark-ext-youtube-iframe) - Replaces youtube link with iframe. 103 104Others can be found on [Packagist under the `commonmark-extension` package type](https://packagist.org/packages/league/commonmark?type=commonmark-extension). 105 106If you build your own, feel free to submit a PR to add it to this list! 107 108### Others 109 110Check out the other cool things people are doing with `league/commonmark`: <https://packagist.org/packages/league/commonmark/dependents> 111 112## ️ Versioning 113 114[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. 115 116Any 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. 117 118## ️ Maintenance & Support 119 120When a new **minor** version (e.g. `1.4` -> `1.5`) is released, the previous one (`1.4`) will continue to receive security and critical bug fixes for *at least* 3 months. 121 122When a new **major** version is released (e.g. `1.5` -> `2.0`), the previous one (`1.5`) will receive critical bug fixes for *at least* 3 months and security updates for 6 months after that new release comes out. 123 124(This policy may change in the future and exceptions may be made on a case-by-case basis.) 125 126**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).** 127 128## ♀️ Contributing 129 130To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure with us. 131 132If 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. 133 134Contributions to this library are **welcome**, especially ones that: 135 136 * Improve usability or flexibility without compromising our ability to adhere to the [CommonMark spec] 137 * Mirror fixes made to the [reference implementation][commonmark.js] 138 * Optimize performance 139 * Fix issues with adhering to the [CommonMark spec] 140 141Major 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. 142 143Please see [CONTRIBUTING](https://github.com/thephpleague/commonmark/blob/latest/.github/CONTRIBUTING.md) for additional details. 144 145## Testing 146 147``` bash 148$ composer test 149``` 150 151This will also test league/commonmark against the latest supported spec. 152 153## Performance Benchmarks 154 155You can compare the performance of **league/commonmark** to other popular parsers by running the included benchmark tool: 156 157``` bash 158$ ./tests/benchmark/benchmark.php 159``` 160 161## Credits & Acknowledgements 162 163- [Colin O'Dell][@colinodell] 164- [John MacFarlane][@jgm] 165- [All Contributors] 166 167This 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. 168 169### Sponsors 170 171We'd also like to extend our sincere thanks the following sponsors who support ongoing development of this project: 172 173 - [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 174 - [RIPS Technologies](https://www.ripstech.com/) for supporting this project with a complimentary [RIPS SaaS](https://www.ripstech.com/product/) license 175 - [JetBrains](https://www.jetbrains.com/) for supporting this project with complimentary [PhpStorm](https://www.jetbrains.com/phpstorm/) licenses 176 177Are you interested in sponsoring development of this project? See <https://www.colinodell.com/sponsor> for a list of ways to contribute. 178 179## License 180 181**league/commonmark** is licensed under the BSD-3 license. See the [`LICENSE`](LICENSE) file for more details. 182 183## ️ Governance 184 185This project is primarily maintained by [Colin O'Dell][@colinodell]. Members of the [PHP League] Leadership Team may occasionally assist with some of these duties. 186 187## ️ Who Uses It? 188 189This 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)! 190 191--- 192 193<div align="center"> 194 <b> 195 <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> 196 </b> 197 <br> 198 <sub> 199 Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies. 200 </sub> 201</div> 202 203[CommonMark]: http://commonmark.org/ 204[CommonMark spec]: http://spec.commonmark.org/ 205[commonmark.js]: https://github.com/jgm/commonmark.js 206[Github-Flavored Markdown]: https://github.github.com/gfm/ 207[John MacFarlane]: http://johnmacfarlane.net 208[docs]: https://commonmark.thephpleague.com/ 209[docs-examples]: https://commonmark.thephpleague.com/customization/overview/#examples 210[docs-example-twitter]: https://commonmark.thephpleague.com/customization/inline-parsing#example-1---twitter-handles 211[docs-example-smilies]: https://commonmark.thephpleague.com/customization/inline-parsing#example-2---emoticons 212[All Contributors]: https://github.com/thephpleague/commonmark/contributors 213[@colinodell]: https://www.twitter.com/colinodell 214[@jgm]: https://github.com/jgm 215[jgm/stmd]: https://github.com/jgm/stmd 216[Composer]: https://getcomposer.org/ 217[PHP League]: https://thephpleague.com 218