All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
Please also have a look at our API and deprecation policy.
- The
render()methods will now throw an exception upon an internal error fromDOMDocument, instead of returning an empty string (#1588) - Require
sabberworm/php-css-parser>= 9.3.0 (#1575, #1582, #1583)
- Clear all previous caches on each invokation to avoid memory usage build-up (#1567)
- Allow very deeply-nested HTML (#1556, #1560)
- Add support for Symfony 8.0 (#1509)
- Improve performance of checking for existing
Content-Type(#1518, #1519)
- Support very large content in
metaelement inhead(#1519) - Support very large HTML files without a
Content-Type(#1518) - Allow numbers and underscores in CSS property names (#1500)
- Use safe version of some PHP functions (#1457, #1492, #1495, #1496, #1499, #1503, #1513, #1515, #1517)
- Add support for PHP 8.5 (#1470)
- Require
sabberworm/php-css-parserversion 9.1.0 or higher (#1465) - Improve declaration block parsing performance (#1452)
- Make some type annotations more specific (#1428)
- Require
sabberworm/php-css-parserversion 9.0.0 or higher (#1399, #1418, #1421) - Raise the minimum required Symfony bugfix versions (#1361)
- Drop support for Symfony 4.4, 6.0, 6.1, 6.2 (#1358, #1361)
- Add support for PHP 8.4 (#1278)
- Support CSS custom properties (variables) (#1336)
- Support
:rootpseudo-class (#1306) - Add CSS selectors exclusion feature (#1236)
- Require
sabberworm/php-css-parser:^8.7.0(#1355)
- Preserve case of CSS custom property (variable) names (#1332)
- Add an API and deprecation policy (#1323)
- Add support for Symfony 7 (#1243)
- Add support for PHP 8.3 (#1218)
- Disable HTML formatting by default (#1214)
- Add support for PHP 8.2 (#1155)
- Throw exception with invalid CSS in debug mode (#1142)
- Only support up to 69 atomic expressions in a selector (#1113)
- Require
sabberworm/php-css-parser:^8.4.0(#1134) - Upgrade to PHPUnit 9 (#1112)
- Support for PHP 7.3 will be removed in Emogrifier 8.0.
- Drop support for Symfony 3.x and 5.3 (#1120, #1162)
- Drop support for PHP 7.2 (#1111)
- Bump the minimum Symfony 4.4 version to avoid PHP deprecation warnings (#1187)
- Test with Symfony 6-dev (#1109)
- Add support for PHP 8.1 (#1103)
- Add a dedicated class for caching (#1097)
- Allow installation together with Symfony 6 (#1065)
- Support more file types in the
.editorconfig(#1035) - Set
alignattribute of<th>elements withCssToAttributeConverter(#1008)
- Use
sabberworm/php-css-parserto parse the CSS (#1015) - Also check the unit test code with Psalm (#1003)
- Support for PHP 7.2 will be removed in Emogrifier 7.0.
- Remove a redundant CSS data cache (#1018)
- Drop support for Symfony 5.1 and 5.2 (#972, #1104)
- Drop support for PHP 7.1 (#967)
- Allow
@importafter ignored invalid@charset(@1081) - Allow line feeds within
<html>tag (#987)
- Switch the default branch from
mastertomain(#951)
- Ignore
http-equivContent-Typein<body>(#961) - Allow "Content-Type" in content (#959)
- Add an
.editorconfigfile (#940) - Support PHP 8.0 (#926)
- Run the CI build once a week (#933)
- Move more development tools to PHIVE (#894, #907)
- Automatically add a backslash for global functions (#909)
- Update the development tools (#898, #895)
- Upgrade to PHPUnit 7.5 (#888)
- Enforce constant visibility (#892)
- Rename the PHPCS configuration file (#891, #896)
- Make use of PHP 7.1 language features (#883)
- Support for PHP 7.1 will be removed in Emogrifier 6.0.
- Drop support for Symfony 4.3 and 5.0 (#936)
- Stop checking
tests/with Psalm (#885) - Drop support for PHP 7.0 (#880)
- Fix a nonsensical code example in the README (#920, #935)
- Remove
!importantfromstyleattributes also when uppercase, mixed case or having whitespace after!(#911) - Copy rules using
:...of-typewithout a type to the<style>element (#904) - Support combinator followed by dynamic pseudo-class in minified CSS (#903)
- Preserve all uninlinable (or otherwise unprocessed) at-rules (#899)
- Allow Windows CLI to run development tools installed through PHIVE (#900)
- Switch to a maintained package for parallel PHP linting (#884)
- Add
.0version suffixes to PHP version requirements (#881)
- Extract and inject
@font-facerules into head (#870) - Test tag omission in conformant supplied HTML (#868)
- Check for missing return type hint annotations in the code sniffs (#860)
- Support
:only-of-type(with a type) (#849, #856) - Configuration setting methods now all return
$thisto allow chaining (#824, #854) - Disable php-cs-fixer Yoda conditions (#791, #794)
- Check the code with psalm (#537, #779)
- Composer script to run tests with
--stop-on-failure(#782) - Test universal selector with combinators (#776)
- Normalize DOCTYPE declaration according to polyglot markup recommendation (#866)
- Upgrade to V2 of the PHP setup GitHub action (#861)
- Move the development tools to PHIVE (#850, #851)
- Switch the parallel linting to a maintained fork (#842)
- Move continuous integration from Travis CI to GitHub actions (#832, #834, #838, #839, #840, #841, #843, #846, #849)
- Clean up the folder structure and autoloading configuration (#529, #785)
- Use
selfas the return type forfromHtml(#784) - Make use of PHP 7.0 language features (#777)
- Support for PHP 7.0 will be removed in Emogrifier 5.0.
- Drop support for Symfony versions that have reached their end of life (#847)
- Drop the
Emogrifierclass (#774) - Drop support for PHP 5.6 (#773)
- Allow
:last-of-typeetc. without type, without causing exception (#875) - Make sure to use the Composer-installed development tools (#862, #865)
- Add missing
<head>element when there's a<header>element (#844, #853) - Fix mapping width/height when decimal is used (#845)
- Actually use the specified PHP version on GitHub actions (#836)
- Support
ci:php:linton Windows (#740, #780)
- Add support for PHP 7.4 (#821, #829)
- Upgrade to Symfony 5.0 (#820)
- Test and document excluding entire subtree with
addExcludedSelector()(#347, #768) - Test that rules with
:optionalor:requiredare copied to the<style>element (#748, #765) - Test that rules with
:only-of-typeare copied to the<style>element (#748, #760) - Support
:last-of-type(#748, #758) - Support
:first-of-type(#748, #757) - Support
:empty(#748, #756) - Test that rules with
:any-linkare copied to the<style>element (#748, #755) - Support and test
:only-child(#747, #754) - Support and test
:nth-last-of-type(#747, #751) - Support and test
:nth-last-child(#747, #750) - Support and test general sibling combinator (#723, #745)
- Test universal selector with combinators (#723, #743)
- Preserve
display: noneelements with-emogrifier-keepclass (#252, #737) - Preserve valid
@importrules (#338, #334, #732, #735) - Add
HtmlPruner::removeRedundantClassesAfterCssInlined(#380, #724) - Check on Travis that PHP-CS-Fixer will not change anything (#727)
- Support
:not(…)as an entire selector (#469, #725) - Add
HtmlPruner::removeRedundantClasses(#380, #708) - Support multiple attributes selectors (#385, #721)
- Support
> :first-childand> :last-childin selectors (#384, #720) - Add an
ArrayIntersectorclass (#708, #710) - Add
CssInliner::getMatchingUninlinableSelectors(#380, #707) - Add tests for
:nth-childand:nth-of-type(#71, #698)
- Relax the dependency on
symfony/css-selector(#762) - Rename
HtmlPruner::removeInvisibleNodestoHtmlPruner::removeElementsWithDisplayNone(#717, #718) - Mark the utility classes as internal (#715)
- Move utility classes to the
Pelago\Emogrifier\Utilitiesnamespace (#712) - Make the
$cssparameter of theinlineCssmethod optional (#700) - Update the development dependencies (#691)
- Support for PHP 5.6 will be removed in Emogrifier 4.0.
- Deprecate the
Emogrifierclass (#701)
- Drop
enableCssToHtmlMappinganddisableInvisibleNodeRemoval(#692) - Drop support for PHP 5.5 (#690)
- Fix PhpStorm code inspection warnings (#729, #770)
- Uppercase type combined with class or ID in selector (#590, #769)
- Dynamic pseudo-class combined with static one (rules copied to
<style>element, #746) - Descendant attribute selectors (such as
html input[disabled]) (#375, #709) - Attribute selectors with hyphen in attribute name (#284, #540, #704)
- Attribute selectors with space, hyphen, colon, semicolon or (most) other non-alphanumeric characters in attribute value (#284, #333, #550, #540, #704)
- Don’t create empty
styleattributes for unparsable declarations (#259, #702) - Allow
:not(:behavioural-pseudo-class)in selectors (#697, #703)
- Add a
HtmlPrunerclass (#679) - Add
AbstractHtmlProcessor::fromDomDocument(#676) - Add
AbstractHtmlProcessor::fromHtml(#675)
- Make the closures static (#674)
- Keep
<wbr>elements by default withCssInliner(#665) - Make the
CssInlinerinheritAbstractHtmlProcessor(#660) - Separate
CssInliner::inlineCssand the rendering (#654)
- Drop the removal of unprocessable tags from
CssInliner(#685) - Drop the removal of invisible nodes from
CssInliner(#684)
- Remove opening
<body>tag frombodycontent when element has attribute(s) (#677, #683) - Keep development files out of the Composer packages (#678)
- Call all static methods statically in
CssConcatenator(#670) - Support all HTML5 self-closing tags, including
<embed>,<source>,<track>and<wbr>(#653) - Remove all "unprocessable" (e.g.
<wbr>) tags (#650) - Correct translated xpath of
:nth-childselector (#648)
- Add a test that a missing document type gets added (#641)
- Keep the
styleelement thehead(#642)
- PHP 7.3 support (#638)
- Allow PHP 7.3 in
composer.json - Test in Travis for PHP 7.3
- Allow PHP 7.3 in
- Add a
renderBodyContent()method (#633) - Add a
getDomDocument()method (#630) - Add a Composer script for PHP CS Fixer (#607)
- Copy matching rules with dynamic pseudo-classes or pseudo-elements in selectors to the style element (#280, #562, #567)
- Add a CssToAttributeConverter (#546)
- Expose the DOMDocument in AbstractHtmlProcessor (#520)
- Add an HtmlNormalizer class (#513, #516)
- Add a CssInliner class (#514, #522)
- Composer scripts for the various CI build steps
- Validate the composer.json on Travis (#476)
- Mark the work-in-progress classes as
@internal(#640) - Remove the unprocessable tags from the DOM, not from the raw HTML (#627)
- Reject empty HTML in
setHtml()(#622) - Stop passing the DOM document around (#618)
- Improve performance by using explicit namespaces for PHP functions (#573, #576)
- Add type hint checking to the code sniffs (#566)
- Check the code with PHPMD (#561)
- Add the cyclomatic complexity to the checked code sniffs (#558)
- Use the Symfony CSS selector component (#540)
- Support for PHP 5.5 will be removed in Emogrifier 3.0.
- Support for PHP 5.6 will be removed in Emogrifier 4.0.
- The removal of invisible nodes will be removed in Emogrifier 3.0. (#473)
- Converting CSS styles to (non-CSS) HTML attributes will be removed in Emogrifier 3.0. Please use the new CssToAttributeConverter instead. (#474)
- Emogrifier 3.x.y will be the last release that supports usage without Composer (i.e., you can still require the class file). Starting with version 4.0, Emogrifier will only work with Composer.
- The Emogrifier class will be superseded by CssInliner class in Emogrifier 3.0. For this, the Emogrifier class will be deprecated for version 3.0 and removed for version 4.0.
- Drop the
@versionPHPDoc annotations (#637) - Drop the destructors (#619)
- Add required XML PHP extension to
composer.json(#614) - Add required DOM PHP extension to
composer.json(#595) - Escape hyphens in regular expressions (#588)
- Fix Travis for PHP 5.x (#589)
- Allow CSS between empty
@mediarule and another@mediarule (#534) - Allow additional whitespace in media-query-list of disallowed
@mediarules ( #532) - Allow multiple minified
@importrules in the CSS without error (note:@imports are currently ignored, #527) - Style property ordering when multiple mixed individual and shorthand properties apply (#511, #508)
- Calculation of selector precedence for selectors involving pseudo-classes and/or attributes (#502)
- Allow
@charsetin the CSS without error (note: its value is currently ignored, #507) - Allow attribute selectors in descendants (#506, #381, #443)
- Allow adjacent sibling CSS selector combinator in minified CSS (#505)
- Allow CSS property values containing newlines (#504)
- Support for CSS :not() selector (#431)
- Automatically remove !important annotations from final inline style declarations (#420)
- Automatically move
<style>block from<head>to<body>(#396) - PHP 7.2 support (#398)
- Allow PHP 7.2 in
composer.json, cleaner PHP version constraint - Test in Travis for PHP 7.2
- Allow PHP 7.2 in
- Debug mode. Throw debug exceptions only if debug is active. (#392)
- Test with latest and oldest dependencies on Travis (#463)
- Always enable the debug mode in the tests (#448)
- Optimize the string operations (#430)
- Support for PHP 5.5 will be removed in Emogrifier 3.0.
- Support for PHP 5.6 will be removed in Emogrifier 4.0.
- Drop support for PHP 5.4 (#422)
- Drop support for HHVM (#386)
- Handle invalid/unrecognized selectors in media query blocks (#442)
- Throw (the correct) exception for invalid excluded selectors (#437)
- emogrifyBody must not encode umlaut entities (#414)
- Fix mapped HTML attribute values (#405)
- Make sure the HTML always has a BODY element (#410)
- Make inline style priority higher than css block priority (#404)
- Fix media regex parsing (#402)
- Silence purposefully ignored PHP Warnings (#400)
- Handling invalid xPath expression warnings (#361)
- Support for PHP 5.5 will be removed in Emogrifier 3.0.
- Support for PHP 5.4 will be removed in Emogrifier 2.0.
- Allow colon (
:) and semi-colon (;) when using the*=selector (#371) - Ignore "auto" width and height (#365)
- Add support for PHP 7.1 (#342)
- Support the attr|=value selector (#337)
- Support the attr*=value selector (#330)
- Support the attr$=value selector (#329)
- Support the attr^=value selector (#324)
- Support the attr~=value selector (#323)
- Add CSS to HTML attribute mapper (#288)
- Remove composer dependency from PHP mbstring extension (Actual code dependency were removed a lot of time ago) (#295)
- Support for PHP 5.5 will be removed in Emogrifier 3.0.
- Support for PHP 5.4 will be removed in Emogrifier 2.0.
- Method emogrifyBodyContent() doesn't keeps utf8 umlauts (#349)
- Ignore value with words more than one in the attribute selector (#327)
- Ignore spaces around the > in the direct child selector (#322)
- Ignore empty media queries (#307) (#237)
- Ignore pseudo-class when combined with pseudo-element (#308)
- First-child and last-child selectors are broken (#293)
- Second !important rule needs to overwrite the first one (#292)
- Add branch alias (#231)
- Remove media queries which do not impact the document (#217)
- Allow elements to be excluded from emogrification (#215)
- Handle !important (#214)
- emogrifyBodyContent() method (#206)
- Cache combinedStyles (#211)
- Allow user to define media types to keep (#200)
- Ignore invalid CSS selectors (#194)
- isRemoveDisplayNoneEnabled option (#162)
- Allow disabling of "inline style" and "style block" parsing (#156)
- Preserve @media if necessary (#62)
- Add extraction of style blocks within the HTML
- Add several new pseudo-selectors (first-child, last-child, nth-child, and nth-of-type)
- Make HTML5 the default document type (#245)
- Make copyCssWithMediaToStyleNode private (#218)
- Stop encoding umlauts and dollar signs (#170)
- Convert the classes to namespaces (#41)
- Support for PHP 5.4 will be removed in Emogrifier 2.0.
- Drop support for PHP 5.3 (#114)
- Support for character sets other than UTF-8 was removed.
- Fix failing tests on Windows due to line endings (#263)
- Parsing CSS declaration blocks (#261)
- Fix first-child and last-child selectors (#257)
- Fix parsing of CSS for data URIs (#243)
- Fix multi-line media queries (#241)
- Keep CSS media queries even if followed by CSS comments (#201)
- Fix CSS selectors with exact attribute only (#197)
- Properly handle UTF-8 characters and entities (#189)
- Add mbstring extension to composer.json (#93)
- Prevent incorrectly capitalized CSS selectors from being stripped (#85)
- Fix CSS selectors with exact attribute only (#197)
- Wrong selector extraction from minified CSS (#69)
- Restore libxml error handler state after clearing (#65)
- Ignore all warnings produced by DOMDocument::loadHTML() (#63)
- Style tags in HTML cause an Xpath invalid query error (#60)
- Fix PHP warnings with PHP 5.5 (#26)
- Make removal of invisible nodes operate in a case-insensitive manner
- Fix a bug that was overwriting existing inline styles from the original HTML