| 1 | efrain | 1 | PHP Markdown
 | 
        
           |  |  | 2 | ============
 | 
        
           |  |  | 3 |   | 
        
           |  |  | 4 | 
 | 
        
           |  |  | 5 |   | 
        
           |  |  | 6 | by Michel Fortin
 | 
        
           |  |  | 7 | <https://michelf.ca/>
 | 
        
           |  |  | 8 |   | 
        
           |  |  | 9 | based on Markdown by John Gruber
 | 
        
           |  |  | 10 | <https://daringfireball.net/>
 | 
        
           |  |  | 11 |   | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 | Introduction
 | 
        
           |  |  | 14 | ------------
 | 
        
           |  |  | 15 |   | 
        
           |  |  | 16 | This is a library package that includes the PHP Markdown parser and its
 | 
        
           |  |  | 17 | sibling PHP Markdown Extra with additional features.
 | 
        
           |  |  | 18 |   | 
        
           |  |  | 19 | Markdown is a text-to-HTML conversion tool for web writers. Markdown
 | 
        
           |  |  | 20 | allows you to write using an easy-to-read, easy-to-write plain text
 | 
        
           |  |  | 21 | format, then convert it to structurally valid XHTML (or HTML).
 | 
        
           |  |  | 22 |   | 
        
           |  |  | 23 | "Markdown" is actually two things: a plain text markup syntax, and a
 | 
        
           |  |  | 24 | software tool, originally written in Perl, that converts the plain text
 | 
        
           |  |  | 25 | markup to HTML. PHP Markdown is a port to PHP of the original Markdown
 | 
        
           |  |  | 26 | program by John Gruber.
 | 
        
           |  |  | 27 |   | 
        
           |  |  | 28 | *	[Full documentation of the Markdown syntax](<https://daringfireball.net/projects/markdown/>)
 | 
        
           |  |  | 29 | 	— Daring Fireball (John Gruber)
 | 
        
           |  |  | 30 | *	[Markdown Extra syntax additions](<https://michelf.ca/projects/php-markdown/extra/>)
 | 
        
           |  |  | 31 | 	— Michel Fortin
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 |   | 
        
           |  |  | 34 | Requirement
 | 
        
           |  |  | 35 | -----------
 | 
        
           |  |  | 36 |   | 
        
           |  |  | 37 | This library package requires PHP 7.4 or later.
 | 
        
           |  |  | 38 |   | 
        
           |  |  | 39 | Note: The older plugin/library hybrid package for PHP Markdown and
 | 
        
           |  |  | 40 | PHP Markdown Extra is no longer maintained but will work with PHP 4.0.5 and
 | 
        
           |  |  | 41 | later.
 | 
        
           |  |  | 42 |   | 
        
           |  |  | 43 | You might need to set pcre.backtrack_limit higher than 1 000 000
 | 
        
           |  |  | 44 | (the default), though the default is usually fine.
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 |   | 
        
           |  |  | 47 | Usage
 | 
        
           |  |  | 48 | -----
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 | To use this library with Composer, first install it with:
 | 
        
           |  |  | 51 |   | 
        
           |  |  | 52 | 	$ composer require michelf/php-markdown
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 | Then include Composer's generated vendor/autoload.php to [enable autoloading]:
 | 
        
           |  |  | 55 |   | 
        
           |  |  | 56 | 	require 'vendor/autoload.php';
 | 
        
           |  |  | 57 |   | 
        
           |  |  | 58 | Without Composer, for autoloading to work, your project needs an autoloader
 | 
        
           |  |  | 59 | compatible with PSR-4 or PSR-0. See the included Readme.php file for a minimal
 | 
        
           |  |  | 60 | autoloader setup. (If you cannot use autoloading, see below.)
 | 
        
           |  |  | 61 |   | 
        
           |  |  | 62 | With class autoloading in place:
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 | 	use Michelf\Markdown;
 | 
        
           |  |  | 65 | 	$my_html = Markdown::defaultTransform($my_text);
 | 
        
           |  |  | 66 |   | 
        
           |  |  | 67 | Markdown Extra syntax is also available the same way:
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 | 	use Michelf\MarkdownExtra;
 | 
        
           |  |  | 70 | 	$my_html = MarkdownExtra::defaultTransform($my_text);
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 | If you wish to use PHP Markdown with another text filter function
 | 
        
           |  |  | 73 | built to parse HTML, you should filter the text *after* the `transform`
 | 
        
           |  |  | 74 | function call. This is an example with [PHP SmartyPants]:
 | 
        
           |  |  | 75 |   | 
        
           |  |  | 76 | 	use Michelf\Markdown, Michelf\SmartyPants;
 | 
        
           |  |  | 77 | 	$my_html = Markdown::defaultTransform($my_text);
 | 
        
           |  |  | 78 | 	$my_html = SmartyPants::defaultTransform($my_html);
 | 
        
           |  |  | 79 |   | 
        
           |  |  | 80 | All these examples are using the static `defaultTransform` static function
 | 
        
           |  |  | 81 | found inside the parser class. If you want to customize the parser
 | 
        
           |  |  | 82 | configuration, you can also instantiate it directly and change some
 | 
        
           |  |  | 83 | configuration variables:
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 | 	use Michelf\MarkdownExtra;
 | 
        
           |  |  | 86 | 	$parser = new MarkdownExtra;
 | 
        
           |  |  | 87 | 	$parser->fn_id_prefix = "post22-";
 | 
        
           |  |  | 88 | 	$my_html = $parser->transform($my_text);
 | 
        
           |  |  | 89 |   | 
        
           |  |  | 90 | To learn more, see the full list of [configuration variables].
 | 
        
           |  |  | 91 |   | 
        
           |  |  | 92 |  [enable autoloading]: https://getcomposer.org/doc/01-basic-usage.md#autoloading
 | 
        
           |  |  | 93 |  [PHP SmartyPants]: https://michelf.ca/projects/php-smartypants/
 | 
        
           |  |  | 94 |  [configuration variables]: https://michelf.ca/projects/php-markdown/configuration/
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 |   | 
        
           |  |  | 97 | ### Usage without an autoloader
 | 
        
           |  |  | 98 |   | 
        
           |  |  | 99 | If you cannot use class autoloading, you can still use `include` or `require`
 | 
        
           |  |  | 100 | to access the parser. To load the `Michelf\Markdown` parser, do it this way:
 | 
        
           |  |  | 101 |   | 
        
           |  |  | 102 | 	require_once 'Michelf/Markdown.inc.php';
 | 
        
           |  |  | 103 |   | 
        
           |  |  | 104 | Or, if you need the `Michelf\MarkdownExtra` parser:
 | 
        
           |  |  | 105 |   | 
        
           |  |  | 106 | 	require_once 'Michelf/MarkdownExtra.inc.php';
 | 
        
           |  |  | 107 |   | 
        
           |  |  | 108 | While the plain `.php` files depend on autoloading to work correctly, using the
 | 
        
           |  |  | 109 | `.inc.php` files instead will eagerly load the dependencies that would be
 | 
        
           |  |  | 110 | loaded on demand if you were using autoloading.
 | 
        
           |  |  | 111 |   | 
        
           |  |  | 112 |   | 
        
           |  |  | 113 | Public API and Versioning Policy
 | 
        
           |  |  | 114 | ---------------------------------
 | 
        
           |  |  | 115 |   | 
        
           |  |  | 116 | Version numbers are of the form *major*.*minor*.*patch*.
 | 
        
           |  |  | 117 |   | 
        
           |  |  | 118 | The public API of PHP Markdown consist of the two parser classes `Markdown`
 | 
        
           |  |  | 119 | and `MarkdownExtra`, their constructors, the `transform` and `defaultTransform`
 | 
        
           |  |  | 120 | functions and their configuration variables. The public API is stable for
 | 
        
           |  |  | 121 | a given major version number. It might get additions when the minor version
 | 
        
           |  |  | 122 | number increments.
 | 
        
           |  |  | 123 |   | 
        
           |  |  | 124 | **Protected members are not considered public API.** This is unconventional
 | 
        
           |  |  | 125 | and deserves an explanation. Incrementing the major version number every time
 | 
        
           |  |  | 126 | the underlying implementation of something changes is going to give
 | 
        
           |  |  | 127 | nonessential version numbers for the vast majority of people who just use the
 | 
        
           |  |  | 128 | parser.  Protected members are meant to create parser subclasses that behave in
 | 
        
           |  |  | 129 | different ways. Very few people create parser subclasses. I don't want to
 | 
        
           |  |  | 130 | discourage it by making everything private, but at the same time I can't
 | 
        
           |  |  | 131 | guarantee any stable hook between versions if you use protected members.
 | 
        
           |  |  | 132 |   | 
        
           |  |  | 133 | **Syntax changes** will increment the minor number for new features, and the
 | 
        
           |  |  | 134 | patch number for small corrections. A *new feature* is something that needs a
 | 
        
           |  |  | 135 | change in the syntax documentation. Note that since PHP Markdown Lib includes
 | 
        
           |  |  | 136 | two parsers, a syntax change for either of them will increment the minor
 | 
        
           |  |  | 137 | number. Also note that there is nothing perfectly backward-compatible with the
 | 
        
           |  |  | 138 | Markdown syntax: all inputs are always valid, so new features always replace
 | 
        
           |  |  | 139 | something that was previously legal, although generally nonsensical to do.
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 |   | 
        
           |  |  | 142 | Bugs
 | 
        
           |  |  | 143 | ----
 | 
        
           |  |  | 144 |   | 
        
           |  |  | 145 | To file bug reports please send email to:
 | 
        
           |  |  | 146 | <michel.fortin@michelf.ca>
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 | Please include with your report: (1) the example input; (2) the output you
 | 
        
           |  |  | 149 | expected; (3) the output PHP Markdown actually produced.
 | 
        
           |  |  | 150 |   | 
        
           |  |  | 151 | If you have a problem where Markdown gives you an empty result, first check
 | 
        
           |  |  | 152 | that the backtrack limit is not too low by running `php --info | grep pcre`.
 | 
        
           |  |  | 153 | See Installation and Requirement above for details.
 | 
        
           |  |  | 154 |   | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 | Development and Testing
 | 
        
           |  |  | 157 | -----------------------
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 | Pull requests for fixing bugs are welcome. Proposed new features are
 | 
        
           |  |  | 160 | going to be meticulously reviewed -- taking into account backward compatibility,
 | 
        
           |  |  | 161 | potential side effects, and future extensibility -- before deciding on
 | 
        
           |  |  | 162 | acceptance or rejection.
 | 
        
           |  |  | 163 |   | 
        
           |  |  | 164 | If you make a pull request that includes changes to the parser please add
 | 
        
           |  |  | 165 | tests for what is being changed to the `test/` directory. This can be as
 | 
        
           |  |  | 166 | simple as adding a `.text` (input) file with a corresponding `.xhtml`
 | 
        
           |  |  | 167 | (output) file to proper category under `./test/resources/`.
 | 
        
           |  |  | 168 |   | 
        
           |  |  | 169 | Traditionally tests were in a separate repository, [MDTest](https://github.com/michelf/mdtest)
 | 
        
           |  |  | 170 | but they are now located here, alongside the source code.
 | 
        
           |  |  | 171 |   | 
        
           |  |  | 172 |   | 
        
           |  |  | 173 | Donations
 | 
        
           |  |  | 174 | ---------
 | 
        
           |  |  | 175 |   | 
        
           |  |  | 176 | If you wish to make a donation that will help me devote more time to
 | 
        
           |  |  | 177 | PHP Markdown, please visit [michelf.ca/donate].
 | 
        
           |  |  | 178 |   | 
        
           |  |  | 179 |  [michelf.ca/donate]: https://michelf.ca/donate/#!Thanks%20for%20PHP%20Markdown
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 |   | 
        
           |  |  | 182 | Version History
 | 
        
           |  |  | 183 | ---------------
 | 
        
           |  |  | 184 |   | 
        
           |  |  | 185 | PHP Markdown Lib 2.0.0 (26 Sep 2022)
 | 
        
           |  |  | 186 |   | 
        
           |  |  | 187 | *	Now requiring PHP version 7.4 or later.
 | 
        
           |  |  | 188 |   | 
        
           |  |  | 189 | *	Added type annotations to configuration properties of the parser.
 | 
        
           |  |  | 190 | 	(Thanks to Tac Tacelosky.)
 | 
        
           |  |  | 191 |   | 
        
           |  |  | 192 | *	Fixing a TypeError in PHP 8 caused by invalid counter variable.
 | 
        
           |  |  | 193 | 	(Thanks to Alexey Kopytko.)
 | 
        
           |  |  | 194 |   | 
        
           |  |  | 195 | *	Composer package now excludes development files.
 | 
        
           |  |  | 196 | 	(Thanks to Cédric Anne.)
 | 
        
           |  |  | 197 |   | 
        
           |  |  | 198 |   | 
        
           |  |  | 199 | PHP Markdown Lib 1.9.1 (23 Nov 2021)
 | 
        
           |  |  | 200 |   | 
        
           |  |  | 201 | *	Now treating `<details>` and `<summary>` as block level so they don't
 | 
        
           |  |  | 202 | 	get wrapped in `<p>`.
 | 
        
           |  |  | 203 | 	(Thanks to Thomas Hochstein for the fix.)
 | 
        
           |  |  | 204 |   | 
        
           |  |  | 205 | *	Fix for unintended blank title attribute when adding supplementary attributes
 | 
        
           |  |  | 206 | 	to a link in Markdown Extra.
 | 
        
           |  |  | 207 | 	(Thanks to Richie Black for the fix.)
 | 
        
           |  |  | 208 |   | 
        
           |  |  | 209 |   | 
        
           |  |  | 210 | PHP Markdown Lib 1.9.0 (1 Dec 2019)
 | 
        
           |  |  | 211 |   | 
        
           |  |  | 212 | *	Added `fn_backlink_label` configuration variable to put some text in the
 | 
        
           |  |  | 213 | 	`aria-label` attribute.
 | 
        
           |  |  | 214 | 	(Thanks to Sunny Walker for the implementation.)
 | 
        
           |  |  | 215 |   | 
        
           |  |  | 216 | *	Occurances of "`^^`" in `fn_backlink_html`, `fn_backlink_class`,
 | 
        
           |  |  | 217 | 	`fn_backlink_title`, and `fn_backlink_label` will be replaced by the
 | 
        
           |  |  | 218 | 	corresponding footnote number in the HTML output. Occurances of "`%%`" will be
 | 
        
           |  |  | 219 | 	replaced by a number for the reference (footnotes can have multiple references).
 | 
        
           |  |  | 220 | 	(Thanks to Sunny Walker for the implementation.)
 | 
        
           |  |  | 221 |   | 
        
           |  |  | 222 | *	Added configuration variable `omit_footnotes`. When `true` footnotes are not
 | 
        
           |  |  | 223 | 	appended at the end of the generated HTML and the `footnotes_assembled`
 | 
        
           |  |  | 224 | 	variable will contain the HTML for the footnote list, allowing footnotes to be
 | 
        
           |  |  | 225 | 	moved somewhere else on the page.
 | 
        
           |  |  | 226 | 	(Thanks to James K. for the implementation.)
 | 
        
           |  |  | 227 |   | 
        
           |  |  | 228 | 	Note: when placing the content of `footnotes_assembled` on the page, consider
 | 
        
           |  |  | 229 | 	adding the attribute `role="doc-endnotes"` to the `<div>` or `<section>` that will
 | 
        
           |  |  | 230 | 	enclose the list of footnotes so they are reachable to accessibility tools the
 | 
        
           |  |  | 231 | 	same way they would be with the default HTML output.
 | 
        
           |  |  | 232 |   | 
        
           |  |  | 233 | *	Fixed deprecation warnings from PHP about usage of curly braces to access
 | 
        
           |  |  | 234 | 	characters in text strings.
 | 
        
           |  |  | 235 | 	(Thanks to Remi Collet and Frans-Willem Post.)
 | 
        
           |  |  | 236 |   | 
        
           |  |  | 237 |   | 
        
           |  |  | 238 | PHP Markdown Lib 1.8.0 (14 Jan 2018)
 | 
        
           |  |  | 239 |   | 
        
           |  |  | 240 | *	Autoloading with Composer now uses PSR-4.
 | 
        
           |  |  | 241 |   | 
        
           |  |  | 242 | *	HTML output for Markdown Extra footnotes now include `role` attributes
 | 
        
           |  |  | 243 | 	with values from [WAI-ARIA](https://www.w3.org/TR/dpub-aria/) to
 | 
        
           |  |  | 244 | 	make them more accessible.
 | 
        
           |  |  | 245 | 	(Thanks to Tobias Bengfort)
 | 
        
           |  |  | 246 |   | 
        
           |  |  | 247 | *	In Markdown Extra, added the `hashtag_protection` configuration variable.
 | 
        
           |  |  | 248 | 	When set to `true` it prevents ATX-style headers with no space after the initial
 | 
        
           |  |  | 249 | 	hash from being interpreted as headers. This way your precious hashtags
 | 
        
           |  |  | 250 | 	are preserved.
 | 
        
           |  |  | 251 | 	(Thanks to Jaussoin Timothée for the implementation.)
 | 
        
           |  |  | 252 |   | 
        
           |  |  | 253 |   | 
        
           |  |  | 254 | PHP Markdown Lib 1.7.0 (29 Oct 2016)
 | 
        
           |  |  | 255 |   | 
        
           |  |  | 256 | *	Added a `hard_wrap` configuration variable to make all newline characters
 | 
        
           |  |  | 257 | 	in the text become `<br>` tags in the HTML output. By default, according
 | 
        
           |  |  | 258 | 	to the standard Markdown syntax these newlines are ignored unless they a
 | 
        
           |  |  | 259 | 	preceded by two spaces. Thanks to Jonathan Cohlmeyer for the implementation.
 | 
        
           |  |  | 260 |   | 
        
           |  |  | 261 | *	Improved the parsing of list items to fix problematic cases that came to
 | 
        
           |  |  | 262 | 	light with the addition of `hard_wrap`. This should have no effect on the
 | 
        
           |  |  | 263 | 	output except span-level list items that ended with two spaces (and thus
 | 
        
           |  |  | 264 | 	ended with a line break).
 | 
        
           |  |  | 265 |   | 
        
           |  |  | 266 | *	Added a `code_span_content_func` configuration variable which takes a
 | 
        
           |  |  | 267 | 	function that will convert the content of the code span to HTML. This can
 | 
        
           |  |  | 268 | 	be useful to implement syntax highlighting. Although contrary to its
 | 
        
           |  |  | 269 | 	code block equivalent, there is no syntax for specifying a language.
 | 
        
           |  |  | 270 | 	Credits to styxit for the implementation.
 | 
        
           |  |  | 271 |   | 
        
           |  |  | 272 | *	Fixed a Markdown Extra issue where two-space-at-end-of-line hard breaks
 | 
        
           |  |  | 273 | 	wouldn't work inside of HTML block elements such as `<p markdown="1">`
 | 
        
           |  |  | 274 | 	where the element expects only span-level content.
 | 
        
           |  |  | 275 |   | 
        
           |  |  | 276 | *	In the parser code, switched to PHPDoc comment format. Thanks to
 | 
        
           |  |  | 277 | 	Robbie Averill for the help.
 | 
        
           |  |  | 278 |   | 
        
           |  |  | 279 |   | 
        
           |  |  | 280 | PHP Markdown Lib 1.6.0 (23 Dec 2015)
 | 
        
           |  |  | 281 |   | 
        
           |  |  | 282 | Note: this version was incorrectly released as 1.5.1 on Dec 22, a number
 | 
        
           |  |  | 283 | that contradicted the versioning policy.
 | 
        
           |  |  | 284 |   | 
        
           |  |  | 285 | *	For fenced code blocks in Markdown Extra, can now set a class name for the
 | 
        
           |  |  | 286 | 	code block's language before the special attribute block. Previously, this
 | 
        
           |  |  | 287 | 	class name was only allowed in the absence of the special attribute block.
 | 
        
           |  |  | 288 |   | 
        
           |  |  | 289 | *	Added a `code_block_content_func` configuration variable which takes a
 | 
        
           |  |  | 290 | 	function that will convert the content of the code block to HTML. This is
 | 
        
           |  |  | 291 | 	most useful for syntax highlighting. For fenced code blocks in Markdown
 | 
        
           |  |  | 292 | 	Extra, the function has access to the language class name (the one outside
 | 
        
           |  |  | 293 | 	of the special attribute block). Credits to Mario Konrad for providing the
 | 
        
           |  |  | 294 | 	implementation.
 | 
        
           |  |  | 295 |   | 
        
           |  |  | 296 | *	The curled arrow character for the backlink in footnotes is now followed
 | 
        
           |  |  | 297 | 	by a Unicode variant selector to prevent it from being displayed in emoji
 | 
        
           |  |  | 298 | 	form on iOS.
 | 
        
           |  |  | 299 |   | 
        
           |  |  | 300 | 	Note that in older browsers the variant selector is often interpreted as a
 | 
        
           |  |  | 301 | 	separate character, making it visible after the arrow. So there is now a
 | 
        
           |  |  | 302 | 	also a `fn_backlink_html` configuration variable that can be used to set
 | 
        
           |  |  | 303 | 	the link text to something else. Credits to Dana for providing the
 | 
        
           |  |  | 304 | 	implementation.
 | 
        
           |  |  | 305 |   | 
        
           |  |  | 306 | *	Fixed an issue in MarkdownExtra where long header lines followed by a
 | 
        
           |  |  | 307 | 	special attribute block would hit the backtrack limit an cause an empty
 | 
        
           |  |  | 308 | 	string to be returned.
 | 
        
           |  |  | 309 |   | 
        
           |  |  | 310 |   | 
        
           |  |  | 311 | PHP Markdown Lib 1.5.0 (1 Mar 2015)
 | 
        
           |  |  | 312 |   | 
        
           |  |  | 313 | *	Added the ability start ordered lists with a number different from 1 and
 | 
        
           |  |  | 314 | 	and have that reflected in the HTML output. This can be enabled with
 | 
        
           |  |  | 315 | 	the `enhanced_ordered_lists` configuration variable for the Markdown
 | 
        
           |  |  | 316 | 	parser; it is enabled by default for Markdown Extra.
 | 
        
           |  |  | 317 | 	Credits to Matt Gorle for providing the implementation.
 | 
        
           |  |  | 318 |   | 
        
           |  |  | 319 | *	Added the ability to insert custom HTML attributes with simple values
 | 
        
           |  |  | 320 | 	everywhere an extra attribute block is allowed (links, images, headers).
 | 
        
           |  |  | 321 | 	The value must be unquoted, cannot contains spaces and is limited to
 | 
        
           |  |  | 322 | 	alphanumeric ASCII characters.
 | 
        
           |  |  | 323 | 	Credits to Peter Droogmans for providing the implementation.
 | 
        
           |  |  | 324 |   | 
        
           |  |  | 325 | *	Added a `header_id_func` configuration variable which takes a function
 | 
        
           |  |  | 326 | 	that can generate an `id` attribute value from the header text.
 | 
        
           |  |  | 327 | 	Credits to Evert Pot for providing the implementation.
 | 
        
           |  |  | 328 |   | 
        
           |  |  | 329 | *	Added a `url_filter_func` configuration variable which takes a function
 | 
        
           |  |  | 330 | 	that can rewrite any link or image URL to something different.
 | 
        
           |  |  | 331 |   | 
        
           |  |  | 332 |   | 
        
           |  |  | 333 | PHP Markdown Lib 1.4.1 (4 May 2014)
 | 
        
           |  |  | 334 |   | 
        
           |  |  | 335 | *	The HTML block parser will now treat `<figure>` as a block-level element
 | 
        
           |  |  | 336 | 	(as it should) and no longer wrap it in `<p>` or parse it's content with
 | 
        
           |  |  | 337 | 	the as Markdown syntax (although with Extra you can use `markdown="1"`
 | 
        
           |  |  | 338 | 	if you wish to use the Markdown syntax inside it).
 | 
        
           |  |  | 339 |   | 
        
           |  |  | 340 | *	The content of `<style>` elements will now be left alone, its content
 | 
        
           |  |  | 341 | 	won't be interpreted as Markdown.
 | 
        
           |  |  | 342 |   | 
        
           |  |  | 343 | *	Corrected an bug where some inline links with spaces in them would not
 | 
        
           |  |  | 344 | 	work even when surounded with angle brackets:
 | 
        
           |  |  | 345 |   | 
        
           |  |  | 346 | 		[link](<s p a c e s>)
 | 
        
           |  |  | 347 |   | 
        
           |  |  | 348 | *	Fixed an issue where email addresses with quotes in them would not always
 | 
        
           |  |  | 349 | 	have the quotes escaped in the link attribute, causing broken links (and
 | 
        
           |  |  | 350 | 	invalid HTML).
 | 
        
           |  |  | 351 |   | 
        
           |  |  | 352 | *	Fixed the case were a link definition following a footnote definition would
 | 
        
           |  |  | 353 | 	be swallowed by the footnote unless it was separated by a blank line.
 | 
        
           |  |  | 354 |   | 
        
           |  |  | 355 |   | 
        
           |  |  | 356 | PHP Markdown Lib 1.4.0 (29 Nov 2013)
 | 
        
           |  |  | 357 |   | 
        
           |  |  | 358 | *	Added support for the `tel:` URL scheme in automatic links.
 | 
        
           |  |  | 359 |   | 
        
           |  |  | 360 | 		<tel:+1-111-111-1111>
 | 
        
           |  |  | 361 |   | 
        
           |  |  | 362 | 	It gets converted to this (note the `tel:` prefix becomes invisible):
 | 
        
           |  |  | 363 |   | 
        
           |  |  | 364 | 		<a href="tel:+1-111-111-1111">+1-111-111-1111</a>
 | 
        
           |  |  | 365 |   | 
        
           |  |  | 366 | *	Added backtick fenced code blocks to MarkdownExtra, originally from
 | 
        
           |  |  | 367 | 	Github-Flavored Markdown.
 | 
        
           |  |  | 368 |   | 
        
           |  |  | 369 | *	Added an interface called MarkdownInterface implemented by both
 | 
        
           |  |  | 370 | 	the Markdown and MarkdownExtra parsers. You can use the interface if
 | 
        
           |  |  | 371 | 	you want to create a mockup parser object for unit testing.
 | 
        
           |  |  | 372 |   | 
        
           |  |  | 373 | *	For those of you who cannot use class autoloading, you can now
 | 
        
           |  |  | 374 | 	include `Michelf/Markdown.inc.php` or `Michelf/MarkdownExtra.inc.php` (note
 | 
        
           |  |  | 375 | 	the 	`.inc.php` extension) to automatically include other files required
 | 
        
           |  |  | 376 | 	by the parser.
 | 
        
           |  |  | 377 |   | 
        
           |  |  | 378 |   | 
        
           |  |  | 379 | PHP Markdown Lib 1.3 (11 Apr 2013)
 | 
        
           |  |  | 380 |   | 
        
           |  |  | 381 | This is the first release of PHP Markdown Lib. This package requires PHP
 | 
        
           |  |  | 382 | version 5.3 or later and is designed to work with PSR-0 autoloading and,
 | 
        
           |  |  | 383 | optionally with Composer. Here is a list of the changes since
 | 
        
           |  |  | 384 | PHP Markdown Extra 1.2.6:
 | 
        
           |  |  | 385 |   | 
        
           |  |  | 386 | *	Plugin interface for WordPress and other systems is no longer present in
 | 
        
           |  |  | 387 | 	the Lib package. The classic package is still available if you need it:
 | 
        
           |  |  | 388 | 	<https://michelf.ca/projects/php-markdown/classic/>
 | 
        
           |  |  | 389 |   | 
        
           |  |  | 390 | *	Added `public` and `protected` protection attributes, plus a section about
 | 
        
           |  |  | 391 | 	what is "public API" and what isn't in the Readme file.
 | 
        
           |  |  | 392 |   | 
        
           |  |  | 393 | *	Changed HTML output for footnotes: now instead of adding `rel` and `rev`
 | 
        
           |  |  | 394 | 	attributes, footnotes links have the class name `footnote-ref` and
 | 
        
           |  |  | 395 | 	backlinks `footnote-backref`.
 | 
        
           |  |  | 396 |   | 
        
           |  |  | 397 | *	Fixed some regular expressions to make PCRE not shout warnings about POSIX
 | 
        
           |  |  | 398 | 	collation classes (dependent on your version of PCRE).
 | 
        
           |  |  | 399 |   | 
        
           |  |  | 400 | *	Added optional class and id attributes to images and links using the same
 | 
        
           |  |  | 401 | 	syntax as for headers:
 | 
        
           |  |  | 402 |   | 
        
           |  |  | 403 | 		[link](url){#id .class}
 | 
        
           |  |  | 404 | 		{#id .class}
 | 
        
           |  |  | 405 |   | 
        
           |  |  | 406 | 	It work too for reference-style links and images. In this case you need
 | 
        
           |  |  | 407 | 	to put those attributes at the reference definition:
 | 
        
           |  |  | 408 |   | 
        
           |  |  | 409 | 		[link][linkref] or [linkref]
 | 
        
           |  |  | 410 | 		![img][linkref]
 | 
        
           |  |  | 411 |   | 
        
           |  |  | 412 | 		[linkref]: url "optional title" {#id .class}
 | 
        
           |  |  | 413 |   | 
        
           |  |  | 414 | *	Fixed a PHP notice message triggered when some table column separator
 | 
        
           |  |  | 415 | 	markers are missing on the separator line below column headers.
 | 
        
           |  |  | 416 |   | 
        
           |  |  | 417 | *	Fixed a small mistake that could cause the parser to retain an invalid
 | 
        
           |  |  | 418 | 	state related to parsing links across multiple runs. This was never
 | 
        
           |  |  | 419 | 	observed (that I know of), but it's still worth fixing.
 | 
        
           |  |  | 420 |   | 
        
           |  |  | 421 |   | 
        
           |  |  | 422 | Copyright and License
 | 
        
           |  |  | 423 | ---------------------
 | 
        
           |  |  | 424 |   | 
        
           |  |  | 425 | PHP Markdown Lib
 | 
        
           |  |  | 426 | Copyright (c) 2004-2022 Michel Fortin
 | 
        
           |  |  | 427 | <https://michelf.ca/>
 | 
        
           |  |  | 428 | All rights reserved.
 | 
        
           |  |  | 429 |   | 
        
           |  |  | 430 | Based on Markdown
 | 
        
           |  |  | 431 | Copyright (c) 2003-2005 John Gruber
 | 
        
           |  |  | 432 | <https://daringfireball.net/>
 | 
        
           |  |  | 433 | All rights reserved.
 | 
        
           |  |  | 434 |   | 
        
           |  |  | 435 | Redistribution and use in source and binary forms, with or without
 | 
        
           |  |  | 436 | modification, are permitted provided that the following conditions are
 | 
        
           |  |  | 437 | met:
 | 
        
           |  |  | 438 |   | 
        
           |  |  | 439 | *   Redistributions of source code must retain the above copyright
 | 
        
           |  |  | 440 |     notice, this list of conditions and the following disclaimer.
 | 
        
           |  |  | 441 |   | 
        
           |  |  | 442 | *   Redistributions in binary form must reproduce the above copyright
 | 
        
           |  |  | 443 |     notice, this list of conditions and the following disclaimer in the
 | 
        
           |  |  | 444 |     documentation and/or other materials provided with the
 | 
        
           |  |  | 445 |     distribution.
 | 
        
           |  |  | 446 |   | 
        
           |  |  | 447 | *   Neither the name "Markdown" nor the names of its contributors may
 | 
        
           |  |  | 448 |     be used to endorse or promote products derived from this software
 | 
        
           |  |  | 449 |     without specific prior written permission.
 | 
        
           |  |  | 450 |   | 
        
           |  |  | 451 | This software is provided by the copyright holders and contributors "as
 | 
        
           |  |  | 452 | is" and any express or implied warranties, including, but not limited
 | 
        
           |  |  | 453 | to, the implied warranties of merchantability and fitness for a
 | 
        
           |  |  | 454 | particular purpose are disclaimed. In no event shall the copyright owner
 | 
        
           |  |  | 455 | or contributors be liable for any direct, indirect, incidental, special,
 | 
        
           |  |  | 456 | exemplary, or consequential damages (including, but not limited to,
 | 
        
           |  |  | 457 | procurement of substitute goods or services; loss of use, data, or
 | 
        
           |  |  | 458 | profits; or business interruption) however caused and on any theory of
 | 
        
           |  |  | 459 | liability, whether in contract, strict liability, or tort (including
 | 
        
           |  |  | 460 | negligence or otherwise) arising in any way out of the use of this
 | 
        
           |  |  | 461 | software, even if advised of the possibility of such damage.
 |