[wp-trac] [WordPress Trac] #65129: Improve maintainability of DOCTYPE quirks mode detection in `WP_HTML_Doctype_Info` class
WordPress Trac
noreply at wordpress.org
Sat Apr 25 19:27:00 UTC 2026
#65129: Improve maintainability of DOCTYPE quirks mode detection in
`WP_HTML_Doctype_Info` class
-------------------------------------------+-------------------------------
Reporter: baikare.sandeep007 | Owner: (none)
Type: enhancement | Status: new
Priority: normal | Milestone: Awaiting Review
Component: HTML API | Version: trunk
Severity: normal | Keywords: has-patch needs-
Focuses: performance, coding-standards | testing
-------------------------------------------+-------------------------------
= Improve maintainability of DOCTYPE quirks mode detection in
`WP_HTML_Doctype_Info` class =
== Description
This patch refactors the DOCTYPE quirks mode detection logic in
`WP_HTML_Doctype_Info` by extracting the large list of legacy public
identifier prefixes into a separate array and using a `foreach` loop
instead of a monolithic `if` condition with multiple `str_starts_with()`
calls chained with `||` operators.
== Current Behavior
The `determine_quirks_mode_from_public_identifier()` method currently
contains a single `if` statement with over **70** conditions chained
together using logical OR operators:
{{{#!php
<?php
if (
str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11
19970101//' ) ||
str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit +
extensions//' ) ||
// ... 70+ more conditions
) {
$this->indicated_compatibility_mode = 'quirks';
return;
}
}}}
== Issues with Current Approach
* Poor maintainability – Adding, removing, or modifying prefixes requires
editing a long, sprawling conditional statement
* Reduced readability – The logic flow is obscured by the sheer number of
conditions
* Difficult to test – Individual prefixes cannot be easily referenced or
validated in isolation
* Code duplication – The same pattern of str_starts_with() calls is
repeated for each prefix
== Proposed Changes
This patch replaces the large conditional block with:
* A single source of truth – All legacy quirks mode prefixes are now
stored in a dedicated array $quirks_prefixes
* Clean iteration – A foreach loop checks each prefix using
str_starts_with()
* Early return – When a match is found, the compatibility mode is set and
the method exits immediately
== Impact
* No functional changes – The exact same set of public identifiers
triggers quirks mode
* Backward compatible – Behavior remains identical for all DOCTYPE
declarations
* Performance neutral – The loop iterates through the same number of
checks as before
* Improves code quality – Makes the HTML API more maintainable for future
contributors
--
Ticket URL: <https://core.trac.wordpress.org/ticket/65129>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list