WP_HTML_Doctype_Info::__construct()privateWP 6.7.0

Constructor.

This class should not be instantiated directly. Use the static {@see self::from_doctype_token} method instead.

The arguments to this constructor correspond to the "DOCTYPE token" as defined in the HTML specification.

DOCTYPE tokens have a name, a public identifier, a system identifier, > and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier, > and system identifier must be marked as missing (which is a distinct state from the > empty string), and the force-quirks flag must be set to off (its other state is on).

Method of the class: WP_HTML_Doctype_Info{}

No Hooks.

Return

null. Nothing (null).

Usage

// private - for code of main (parent) class only
$result = $this->__construct(;

Notes

Changelog

Since 6.7.0 Introduced.

WP_HTML_Doctype_Info::__construct() code WP 6.7.1

private function __construct(
	?string $name,
	?string $public_identifier,
	?string $system_identifier,
	bool $force_quirks_flag
) {
	$this->name              = $name;
	$this->public_identifier = $public_identifier;
	$this->system_identifier = $system_identifier;

	/*
	 * > If the DOCTYPE token matches one of the conditions in the following list,
	 * > then set the Document to quirks mode:
	 */

	/*
	 * > The force-quirks flag is set to on.
	 */
	if ( $force_quirks_flag ) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * Normative documents will contain the literal `<!DOCTYPE html>` with no
	 * public or system identifiers; short-circuit to avoid extra parsing.
	 */
	if ( 'html' === $name && null === $public_identifier && null === $system_identifier ) {
		$this->indicated_compatability_mode = 'no-quirks';
		return;
	}

	/*
	 * > The name is not "html".
	 *
	 * The tokenizer must report the name in lower case even if provided in
	 * the document in upper case; thus no conversion is required here.
	 */
	if ( 'html' !== $name ) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * Set up some variables to handle the rest of the conditions.
	 *
	 * > set...the public identifier...to...the empty string if the public identifier was missing.
	 * > set...the system identifier...to...the empty string if the system identifier was missing.
	 * >
	 * > The system identifier and public identifier strings must be compared...
	 * > in an ASCII case-insensitive manner.
	 * >
	 * > A system identifier whose value is the empty string is not considered missing
	 * > for the purposes of the conditions above.
	 */
	$system_identifier_is_missing = null === $system_identifier;
	$public_identifier            = null === $public_identifier ? '' : strtolower( $public_identifier );
	$system_identifier            = null === $system_identifier ? '' : strtolower( $system_identifier );

	/*
	 * > The public identifier is set to…
	 */
	if (
		'-//w3o//dtd w3 html strict 3.0//en//' === $public_identifier ||
		'-/w3c/dtd html 4.0 transitional/en' === $public_identifier ||
		'html' === $public_identifier
	) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * > The system identifier is set to…
	 */
	if ( 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd' === $system_identifier ) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * All of the following conditions depend on matching the public identifier.
	 * If the public identifier is empty, none of the following conditions will match.
	 */
	if ( '' === $public_identifier ) {
		$this->indicated_compatability_mode = 'no-quirks';
		return;
	}

	/*
	 * > The public identifier starts with…
	 *
	 * @todo Optimize this matching. It shouldn't be a large overall performance issue,
	 *       however, as only a single DOCTYPE declaration token should ever be parsed,
	 *       and normative documents will have exited before reaching this condition.
	 */
	if (
		str_starts_with( $public_identifier, '+//silmaril//dtd html pro v0r11 19970101//' ) ||
		str_starts_with( $public_identifier, '-//as//dtd html 3.0 aswedit + extensions//' ) ||
		str_starts_with( $public_identifier, '-//advasoft ltd//dtd html 3.0 aswedit + extensions//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 1//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 level 2//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 1//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict level 2//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0 strict//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.0//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 2.1e//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 3.0//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 3.2 final//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 3.2//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html 3//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html level 0//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html level 1//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html level 2//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html level 3//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html strict level 0//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html strict level 1//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html strict level 2//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html strict level 3//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html strict//' ) ||
		str_starts_with( $public_identifier, '-//ietf//dtd html//' ) ||
		str_starts_with( $public_identifier, '-//metrius//dtd metrius presentational//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html strict//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 html//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 2.0 tables//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html strict//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 html//' ) ||
		str_starts_with( $public_identifier, '-//microsoft//dtd internet explorer 3.0 tables//' ) ||
		str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd html//' ) ||
		str_starts_with( $public_identifier, '-//netscape comm. corp.//dtd strict html//' ) ||
		str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html 2.0//" ) ||
		str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended 1.0//" ) ||
		str_starts_with( $public_identifier, "-//o'reilly and associates//dtd html extended relaxed 1.0//" ) ||
		str_starts_with( $public_identifier, '-//sq//dtd html 2.0 hotmetal + extensions//' ) ||
		str_starts_with( $public_identifier, '-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//' ) ||
		str_starts_with( $public_identifier, '-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//' ) ||
		str_starts_with( $public_identifier, '-//spyglass//dtd html 2.0 extended//' ) ||
		str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava html//' ) ||
		str_starts_with( $public_identifier, '-//sun microsystems corp.//dtd hotjava strict html//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 3 1995-03-24//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 draft//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 3.2 final//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 3.2//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 3.2s draft//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 frameset//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html 4.0 transitional//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html experimental 19960712//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd html experimental 970421//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd w3 html//' ) ||
		str_starts_with( $public_identifier, '-//w3o//dtd w3 html 3.0//' ) ||
		str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html 2.0//' ) ||
		str_starts_with( $public_identifier, '-//webtechs//dtd mozilla html//' )
	) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * > The system identifier is missing and the public identifier starts with…
	 */
	if (
		$system_identifier_is_missing && (
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
		)
	) {
		$this->indicated_compatability_mode = 'quirks';
		return;
	}

	/*
	 * > Otherwise, if the DOCTYPE token matches one of the conditions in
	 * > the following list, then set the Document to limited-quirks mode.
	 */

	/*
	 * > The public identifier starts with…
	 */
	if (
		str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 frameset//' ) ||
		str_starts_with( $public_identifier, '-//w3c//dtd xhtml 1.0 transitional//' )
	) {
		$this->indicated_compatability_mode = 'limited-quirks';
		return;
	}

	/*
	 * > The system identifier is not missing and the public identifier starts with…
	 */
	if (
		! $system_identifier_is_missing && (
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 frameset//' ) ||
			str_starts_with( $public_identifier, '-//w3c//dtd html 4.01 transitional//' )
		)
	) {
		$this->indicated_compatability_mode = 'limited-quirks';
		return;
	}

	$this->indicated_compatability_mode = 'no-quirks';
}