* Note: this release detects stylesheets which were skipped before, so optionally run Save & Optimize once after updating to add them to your cache. Nothing breaks if you don't.
* Fixed: Optimize Local/External Stylesheets skipped any link element written over multiple lines (or with a line break inside its href attribute), while browsers load those just fine. The pattern used to find them couldn't match line breaks, but could run past the > which ends an element. Both are fixed, and line breaks are now stripped from the URL before it's requested, just like browsers do.
* Improved: the classes which collect @import statements (and the one which adds the Material Icons subset) registered their filters once per instance, while they're constructed on every processing run. Because nothing ever removed those filters, they stacked up within a single request, which meant the same @import could be optimized several times over, and the Material Icons subset could be added to the subset list more than once.
* Fixed: @import statements spread over multiple lines weren't detected. CSS allows whitespace (incl. line breaks) after @import and inside url(), and a backslash followed by a line break is a line continuation inside a string, but none of those were matched. A raw line break inside the URL is still ignored, because that's an unterminated string, which browsers don't load either.
* Fixed: Smart Optimize (Unused Fonts) could return a blank page when an inline @import statement was fully unloaded. The pattern used to remove that statement removed everything between the first @import and the last occurrence of the stylesheet's URL, and exceeded PCRE's runtime limits on documents larger than ~100KB, in which case the entire document was replaced with nothing (accompanied by a 'preg_replace_callback(): Passing null to parameter #3 ($subject)' deprecation notice). Matching is now confined to a single @import statement, and a failed search/replace leaves the document untouched.
* Fixed: Smart Optimize (Unused Fonts) didn't remove any @font-face rules from stylesheets whose fonts are split into subsets. The subset was matched against the font file's URL using a pattern which
couldn't match the hyphen separating the subset from the font-weight (e.g., source-sans-pro-normal-latin-400.woff2), so no rule ever matched. The subset is now matched against the @font-face rule's
unicode-range, and only falls back to the filename for rules which don't define one.
* Fixed: Smart Optimize (Unused Fonts) now removes a stylesheet's link element from the HTML entirely when all of its @font-face rules are unloaded, instead of leaving behind a request for an empty stylesheet. Generated stylesheets always start with a header comment, which meant they were never detected as empty. This also fixes the deregistration of fully unloaded Async Stylesheets.
* Fixed: an unused Material Icons stylesheet wasn't removed from the HTML. Its cached URL was looked up in the wrong list, so it was never recognized, and clearing the link element's href attribute left behind a request for the page itself. Its link element is now removed entirely.