ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ # Change Log All notable changes to this project will be documented in this file. Updates should follow the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [Unreleased][unreleased] ## [1.6.2] - 2021-05-12 ### Fixed - Fixed incorrect error level for deprecation notices ## [1.6.1] - 2021-05-08 ### Fixed - Fixed `HeadingPermalinkProcessor` skipping text contents from certain nodes (#615) ## [1.6.0] - 2021-05-01 ### Added - Added forward-compatibility for [configuration options which will be changing in 2.0](https://commonmark.thephpleague.com/1.6/upgrading/): - `commonmark/enable_em` (currently `enable_em` in 1.x) - `commonmark/enable_strong` (currently `enable_strong` in 1.x) - `commonmark/use_asterisk` (currently `use_asterisk` in 1.x) - `commonmark/use_underscore` (currently `use_underscore` in 1.x) - `commonmark/unordered_list_markers` (currently `unordered_list_markers` in 1.x) - `mentions/*/prefix` (currently `mentions/*/symbol` in 1.x) - `mentions/*/pattern` (currently `mentions/*/regex` in 1.x) - `max_nesting_level` (currently supports `int` and `float` values in 1.x; will only support `int` in 2.0) - Added new `MarkdownConverter` class for creating converters with custom environments; this replaces the previously-deprecated `Converter` class - Added new `RegexHelper::matchFirst()` method - Added new `Configuration::exists()` method ### Changed - The `max_nesting_level` option now defaults to `PHP_INT_MAX` instead of `INF` ### Deprecated - Deprecated the [configuration options shown above](https://commonmark.thephpleague.com/1.6/upgrading/) - Deprecated the ability to pass a custom `Environment` into the constructors of `CommonMarkConverter` and `GithubFlavoredMarkdownConverter`; use `MarkdownConverter` instead - Deprecated `ConfigurableEnvironmentInterface::setConfig()`; use `mergeConfig()` instead - Deprecated calling `ConfigurableEnvironmentInterface::mergeConfig()` without any parameters - Deprecated calling `Configuration::get()` and `EnvironmentInterface::getConfig()` without any parameters - Deprecated calling `Configuration::set()` without the second `$value` parameter - Deprecated `RegexHelper::matchAll()`; use `RegexHelper::matchFirst()` instead - Deprecated extending the `ArrayCollection` class; will be marked `final` in 2.0 ### Fixed - Fixed missing check for empty arrays being passed into the `unordered_list_markers` configuration option ## [1.5.8] - 2021-03-28 ### Fixed - Fixed Table of Contents not rendering heading inlines properly (#587, #588) - Fixed parsing of tables within list items (#590) ## [1.5.7] - 2020-10-31 ### Fixed - Fixed mentions not being parsed when appearing after non-word characters (#582) ## [1.5.6] - 2020-10-17 ### Changed - Blocks added outside of the parsing context now have their start/end line numbers defaulted to 0 to avoid type errors (#579) ### Fixed - Fixed replacement blocks not inheriting the start line number of the container they're replacing (#579) - Fixed Table of Contents blocks not having correct start/end line numbers (#579) ## [1.5.5] - 2020-09-13 ### Changed - Bumped CommonMark spec compliance to 0.28.2 ### Fixed - Fixed `textarea` elements not being treated as a type 1 HTML block (like `script`, `style`, or `pre`) - Fixed autolink processor not handling other unmatched trailing parentheses ## [1.5.4] - 2020-08-17 ### Fixed - Fixed footnote ID configuration not taking effect (#524, #530) - Fixed heading permalink slugs not being unique (#531, #534) ## [1.5.3] - 2020-07-19 ### Fixed - Fixed regression of multi-byte inline parser characters not being matched ## [1.5.2] - 2020-07-19 ### Changed - Significantly improved performance of the inline parser regex ### Fixed - Fixed parent class lookups for non-existent classes on PHP 8 (#517) ## [1.5.1] - 2020-06-27 ### Fixed - Fixed UTF-8 encoding not being checked in the `UrlEncoder` utility (#509) or the `Cursor` ## [1.5.0] - 2020-06-21 ### Added - Added new `AttributesExtension` based on (#474) - Added new `FootnoteExtension` based on (#474) - Added new `MentionExtension` to replace `InlineMentionParser` with more flexibility and customization - Added the ability to render `TableOfContents` nodes anywhere in a document (given by a placeholder) - Added the ability to properly clone `Node` objects - Added options to customize the value of `rel` attributes set via the `ExternalLink` extension (#476) - Added a new `heading_permalink/slug_normalizer` configuration option to allow custom slug generation (#460) - Added a new `heading_permalink/symbol` configuration option to replace the now deprecated `heading_permalink/inner_contents` configuration option (#505) - Added `SlugNormalizer` and `TextNormalizer` classes to make normalization reusable by extensions (#485) - Added new classes: - `TableOfContentsGenerator` - `TableOfContentsGeneratorInterface` - `TableOfContentsPlaceholder` - `TableOfContentsPlaceholderParser` - `TableOfContentsPlaceholderRenderer` ### Changed - "Moved" the `TableOfContents` class into a new `Node` sub-namespace (with backward-compatibility) - Reference labels are now generated and stored in lower-case instead of upper-case - Reference labels are no longer normalized inside the `Reference`, only the `ReferenceMap` ### Fixed - Fixed reference label case folding polyfill not being consistent between different PHP versions ### Deprecated - Deprecated the `CommonMarkConverter::VERSION` constant (#496) - Deprecated `League\CommonMark\Extension\Autolink\InlineMentionParser` (use `League\CommonMark\Extension\Mention\MentionParser` instead) - Deprecated everything under `League\CommonMark\Extension\HeadingPermalink\Slug` (use the classes under `League\CommonMark\Normalizer` instead) - Deprecated `League\CommonMark\Extension\TableOfContents\TableOfContents` (use the one in the new `Node` sub-namespace instead) - Deprecated the `STYLE_` and `NORMALIZE_` constants in `TableOfContentsBuilder` (use the ones in `TableOfContentsGenerator` instead) - Deprecated the `\League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkRenderer::DEFAULT_INNER_CONTENTS` constant (#505) - Deprecated the `heading_permalink/inner_contents` configuration option in the `HeadingPermalink` extension (use the new `heading_permalink/symbol` configuration option instead) (#505) ## [1.4.3] - 2020-05-04 ### Fixed - Fixed certain Unicode letters, numbers, and marks not being preserved when generating URL slugs (#467) ## [1.4.2] - 2020-04-24 ### Fixed - Fixed inline code blocks not be included within heading permalinks (#457) ## [1.4.1] - 2020-04-20 ### Fixed - Fixed BC break caused by ConverterInterface alias not being used by some DI containers (#454) ## [1.4.0] - 2020-04-18 ### Added - Added new [Heading Permalink extension](https://commonmark.thephpleague.com/extensions/heading-permalinks/) (#420) - Added new [Table of Contents extension](https://commonmark.thephpleague.com/extensions/table-of-contents/) (#441) - Added new `MarkdownConverterInterface` as a long-term replacement for `ConverterInterface` (#439) - Added new `DocumentPreParsedEvent` event (#427, #359, #399) - Added new `ListBlock::TYPE_BULLET` constant as a replacement for `ListBlock::TYPE_UNORDERED` - Added new `MarkdownInput` class and `MarkdownInputInterface` to handle pre-parsing and allow listeners to replace Markdown contents ### Changed - Block & inline renderers will now render child classes automatically (#222, #209) - The `ListBlock` constants now use fully-lowercased values instead of titlecased values - Significantly improved typing ### Fixed - Fixed loose comparison when checking for table alignment - Fixed `StaggeredDelimiterProcessor` returning from a `void` function ### Deprecated - The `Converter` class has been deprecated; use `CommonMarkConverter` instead (#438, #439) - The `ConverterInterface` has been deprecated; use `MarkdownConverterInterface` instead (#438, #439) - The `bin/commonmark` script has been deprecated - The following methods of `ArrayCollection` have been deprecated: - `add()` - `set()` - `get()` - `remove()` - `isEmpty()` - `contains()` - `indexOf()` - `containsKey()` - `replaceWith()` - `removeGaps()` - The `ListBlock::TYPE_UNORDERED` constant has been deprecated, use `ListBlock::TYPE_BULLET` instead ## [1.3.4] - 2020-04-13 ### Fixed - Fixed configuration/environment not being injected into event listeners when adding them via `[$instance, 'method']` callable syntax (#440) ## [1.3.3] - 2020-04-05 ### Fixed - Fixed event listeners not having the environment or configuration injected if they implemented the `EnvironmentAwareInterface` or `ConfigurationAwareInterface` (#423) ## [1.3.2] - 2020-03-25 ### Fixed - Optimized URL normalization in cases where URLs don't contain special characters (#417, #418) ## [1.3.1] - 2020-02-28 ### Fixed - Fixed return types of `Environment::createCommonMarkEnvironment()` and `Environment::createGFMEnvironment()` ## [1.3.0] - 2020-02-08 ### Added - Added (optional) **full GFM support!** 🎉🎉🎉 (#409) - Added check to ensure Markdown input is valid UTF-8 (#401, #405) - Added new `unordered_list_markers` configuration option (#408, #411) ### Changed - Introduced several micro-optimizations for a 5-10% performance boost ## [1.2.2] - 2020-01-15 This release contains the same changes as 1.1.3: ### Fixed - Fixed link parsing edge case (#403) ## [1.1.3] - 2020-01-15 ### Fixed - Fixed link parsing edge case (#403) ## [1.2.1] - 2020-01-14 ### Changed - Introduced several micro-optimizations, reducing the parse time by 8% ## [1.2.0] - 2020-01-09 ### Changed - Removed URL decoding step before encoding (more performant and better matches the JS library) - Removed redundant token from HTML tag regex ## [1.1.2] - 2019-12-09 ### Fixed - Fixed URL normalization not handling non-UTF-8 sequences properly (#395, #396) ## [1.1.1] - 2019-11-11 ### Fixed - Fixed handling of link destinations with unbalanced unescaped parens - Fixed adding delimiters to stack which can neither open nor close a run ## [1.1.0] - 2019-10-31 ### Added - Added a new `Html5EntityDecoder` class (#387) ### Changed - Improved performance by 10% (#389) - Made entity decoding less memory-intensive (#386, #387) ### Fixed - Fixed PHP 7.4 compatibility issues ### Deprecated - Deprecated the `Html5Entities` class - use `Html5EntityDecoder` instead (#387) ## [1.0.0] - 2019-06-29 No changes were made since 1.0.0-rc1. ## [1.0.0-rc1] - 2019-06-19 ### Added - Extracted a `ReferenceMapInterface` from the `ReferenceMap` class - Added optional `ReferenceMapInterface` parameter to the `Document` constructor ### Changed - Replaced all references to `ReferenceMap` with `ReferenceMapInterface` - `ReferenceMap::addReference()` no longer returns `$this` ### Fixed - Fixed bug where elements with content of `"0"` wouldn't be rendered (#376) ## [1.0.0-beta4] - 2019-06-05 ### Added - Added event dispatcher functionality (#359, #372) ### Removed - Removed `DocumentProcessorInterface` functionality in favor of event dispatching (#373) ## [1.0.0-beta3] - 2019-05-27 ### Changed - Made the `Delimiter` class final and extracted a new `DelimiterInterface` - Modified most external usages to use this new interface - Renamed three `Delimiter` methods: - `getOrigDelims()` renamed to `getOriginalLength()` - `getNumDelims()` renamed to `getLength()` - `setNumDelims()` renamed to `setLength()` - Made additional classes final: - `DelimiterStack` - `ReferenceMap` - `ReferenceParser` - Moved `ReferenceParser` into the `Reference` sub-namespace ### Removed - Removed unused `Delimiter` methods: - `setCanOpen()` - `setCanClose()` - `setChar()` - `setIndex()` - `setInlineNode()` - Removed fluent interface from `Delimiter` (setter methods now have no return values) ## [1.0.0-beta2] - 2019-05-27 ### Changed - `DelimiterProcessorInterface::process()` will accept any type of `AbstractStringContainer` now, not just `Text` nodes - The `Delimiter` constructor, `getInlineNode()`, and `setInlineNode()` no longer accept generic `Node` elements - only `AbstractStringContainer`s ### Removed - Removed all deprecated functionality: - The `safe` option (use `html_input` and `allow_unsafe_links` options instead) - All deprecated `RegexHelper` constants - `DocParser::getEnvironment()` (you should obtain it some other way) - `AbstractInlineContainer` (use `AbstractInline` instead and make `isContainer()` return `true`) ## [1.0.0-beta1] - 2019-05-26 ### Added - Added proper support for delimiters, including custom delimiters - `addDelimiterProcessor()` added to `ConfigurableEnvironmentInterface` and `Environment` - Basic delimiters no longer need custom parsers - they'll be parsed automatically - Added new methods: - `AdjacentTextMerger::mergeTextNodesBetweenExclusive()` - `CommonMarkConveter::getEnvironment()` - `Configuration::set()` - Extracted some new interfaces from base classes: - `DocParserInterface` created from `DocParser` - `ConfigurationInterface` created from `Configuration` - `ReferenceInterface` created from `Reference` ### Changed - Renamed several methods of the `Configuration` class: - `getConfig()` renamed to `get()` - `mergeConfig()` renamed to `merge()` - `setConfig()` renamed to `replace()` - Changed `ConfigurationAwareInterface::setConfiguration()` to accept the new `ConfigurationInterface` instead of the concrete class - Renamed the `AdjoiningTextCollapser` class to `AdjacentTextMerger` - Replaced its `collapseTextNodes()` method with the new `mergeChildNodes()` method - Made several classes `final`: - `Configuration` - `DocParser` - `HtmlRenderer` - `InlineParserEngine` - `NodeWalker` - `Reference` - All of the block/inline parsers and renderers - Reduced visibility of several internal methods to `private`: - `DelimiterStack::findEarliest()` - All `protected` methods in `InlineParserEngine` - Marked some classes and methods as `@internal` - `ElementRendererInterface` now requires a public `renderInline()` method; added this to `HtmlRenderer` - Changed `InlineParserEngine::parse()` to require an `AbstractStringContainerBlock` instead of the generic `Node` class - Un-deprecated the `CommonmarkConverter::VERSION` constant - The `Converter` constructor now requires an instance of `DocParserInterface` instead of the concrete `DocParser` - Changed `Emphasis`, `Strong`, and `AbstractWebResource` to directly extend `AbstractInline` instead of the (now-deprecated) intermediary `AbstractInlineContainer` class ### Fixed - Fixed null errors when inserting sibling `Node`s without parents - Fixed `NodeWalkerEvent` not requiring a `Node` via its constructor - Fixed `Reference::normalizeReference()` improperly converting to uppercase instead of performing proper Unicode case-folding - Fixed strong emphasis delimiters not being preserved when `enable_strong` is set to `false` (it now works identically to `enable_em`) ### Deprecated - Deprecated `DocParser::getEnvironment()` (you should obtain it some other way) - Deprecated `AbstractInlineContainer` (use `AbstractInline` instead and make `isContainer()` return `true`) ### Removed - Removed inline processor functionality now that we have proper delimiter support: - Removed `addInlineProcessor()` from `ConfigurableEnvironmentInterface` and `Environment` - Removed `getInlineProcessors()` from `EnvironmentInterface` and `Environment` - Removed `EmphasisProcessor` - Removed `InlineProcessorInterface` - Removed `EmphasisParser` now that we have proper delimiter support - Removed support for non-UTF-8-compatible encodings - Removed `getEncoding()` from `ContextInterface` - Removed `getEncoding()`, `setEncoding()`, and `$encoding` from `Context` - Removed `getEncoding()` and the second `$encoding` constructor param from `Cursor` - Removed now-unused methods - Removed `DelimiterStack::getTop()` (no replacement) - Removed `DelimiterStack::iterateByCharacters()` (use the new `processDelimiters()` method instead) - Removed the protected `DelimiterStack::findMatchingOpener()` method [unreleased]: https://github.com/thephpleague/commonmark/compare/1.6.2...1.6 [1.6.2]: https://github.com/thephpleague/commonmark/compare/1.6.1...1.6.2 [1.6.1]: https://github.com/thephpleague/commonmark/compare/1.6.0...1.6.1 [1.6.0]: https://github.com/thephpleague/commonmark/compare/1.5.8...1.6.0 [1.5.8]: https://github.com/thephpleague/commonmark/compare/1.5.7...1.5.8 [1.5.7]: https://github.com/thephpleague/commonmark/compare/1.5.6...1.5.7 [1.5.6]: https://github.com/thephpleague/commonmark/compare/1.5.5...1.5.6 [1.5.5]: https://github.com/thephpleague/commonmark/compare/1.5.4...1.5.5 [1.5.4]: https://github.com/thephpleague/commonmark/compare/1.5.3...1.5.4 [1.5.3]: https://github.com/thephpleague/commonmark/compare/1.5.2...1.5.3 [1.5.2]: https://github.com/thephpleague/commonmark/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/thephpleague/commonmark/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/thephpleague/commonmark/compare/1.4.3...1.5.0 [1.4.3]: https://github.com/thephpleague/commonmark/compare/1.4.2...1.4.3 [1.4.2]: https://github.com/thephpleague/commonmark/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/thephpleague/commonmark/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/thephpleague/commonmark/compare/1.3.4...1.4.0 [1.3.4]: https://github.com/thephpleague/commonmark/compare/1.3.3...1.3.4 [1.3.3]: https://github.com/thephpleague/commonmark/compare/1.3.2...1.3.3 [1.3.2]: https://github.com/thephpleague/commonmark/compare/1.3.1...1.3.2 [1.3.1]: https://github.com/thephpleague/commonmark/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/thephpleague/commonmark/compare/1.2.2...1.3.0 [1.2.2]: https://github.com/thephpleague/commonmark/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/thephpleague/commonmark/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/thephpleague/commonmark/compare/1.1.2...1.2.0 [1.1.3]: https://github.com/thephpleague/commonmark/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/thephpleague/commonmark/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/thephpleague/commonmark/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/thephpleague/commonmark/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/thephpleague/commonmark/compare/1.0.0-rc1...1.0.0 [1.0.0-rc1]: https://github.com/thephpleague/commonmark/compare/1.0.0-beta4...1.0.0-rc1 [1.0.0-beta4]: https://github.com/thephpleague/commonmark/compare/1.0.0-beta3...1.0.0-beta4 [1.0.0-beta3]: https://github.com/thephpleague/commonmark/compare/1.0.0-beta2...1.0.0-beta3 [1.0.0-beta2]: https://github.com/thephpleague/commonmark/compare/1.0.0-beta1...1.0.0-beta2 [1.0.0-beta1]: https://github.com/thephpleague/commonmark/compare/0.19.2...1.0.0-beta1