<?php
/**
 * Class AMP_Rule_Spec
 *
 * @package AMP
 */

/**
 * Class AMP_Rule_Spec
 *
 * Set of constants used throughout the sanitizer.
 *
 * @internal
 */
abstract class AMP_Rule_Spec {
	/*
	 * AMP rule_spec types
	 */
	const ATTR_SPEC_LIST = 'attr_spec_list';
	const TAG_SPEC       = 'tag_spec';
	const CDATA          = 'cdata';

	/*
	 * AMP attr_spec value check results.
	 *
	 * In 0.7 these changed from strings to integers to speed up comparisons.
	 */
	const PASS           = 1;
	const FAIL           = 0;
	const NOT_APPLICABLE = -1;

	/*
	 * HTML Element Tag rule names
	 */
	const DISALLOWED_ANCESTOR = 'disallowed_ancestor';
	const MANDATORY_ANCESTOR  = 'mandatory_ancestor';
	const MANDATORY_PARENT    = 'mandatory_parent';
	const DESCENDANT_TAG_LIST = 'descendant_tag_list';
	const CHILD_TAGS          = 'child_tags';
	const SIBLINGS_DISALLOWED = 'siblings_disallowed';

	/*
	 * HTML Element Attribute rule names
	 */
	const ALLOW_EMPTY            = 'allow_empty';
	const ALLOW_RELATIVE         = 'allow_relative';
	const ALLOWED_PROTOCOL       = 'protocol';
	const ALTERNATIVE_NAMES      = 'alternative_names';
	const DISALLOWED_VALUE_REGEX = 'disallowed_value_regex';
	const MANDATORY              = 'mandatory';
	const MANDATORY_ANYOF        = 'mandatory_anyof';
	const MANDATORY_ONEOF        = 'mandatory_oneof';
	const VALUE                  = 'value';
	const VALUE_CASEI            = 'value_casei';
	const VALUE_REGEX            = 'value_regex';
	const VALUE_REGEX_CASEI      = 'value_regex_casei';
	const VALUE_PROPERTIES       = 'value_properties';
	const VALUE_URL              = 'value_url';

	/*
	 * AMP layout types.
	 *
	 * @deprecated Use `AmpProject\Layout` interface instead.
	 */
	const LAYOUT_NODISPLAY    = 'nodisplay';
	const LAYOUT_FIXED        = 'fixed';
	const LAYOUT_FIXED_HEIGHT = 'fixed-height';
	const LAYOUT_RESPONSIVE   = 'responsive';
	const LAYOUT_CONTAINER    = 'container';
	const LAYOUT_FILL         = 'fill';
	const LAYOUT_FLEX_ITEM    = 'flex-item';
	const LAYOUT_FLUID        = 'fluid';
	const LAYOUT_INTRINSIC    = 'intrinsic';

	/**
	 * Attribute name for AMP dev mode.
	 *
	 * @since 1.2.2
	 * @link https://github.com/ampproject/amphtml/issues/20974
	 * @var string
	 */
	const DEV_MODE_ATTRIBUTE = 'data-ampdevmode';

	/**
	 * Supported layout values.
	 *
	 * @deprecated Use `AmpProject\Layout::FROM_SPEC` instead.
	 *
	 * @since 1.0
	 * @var array
	 */
	public static $layout_enum = [
		1 => 'nodisplay',
		2 => 'fixed',
		3 => 'fixed-height',
		4 => 'responsive',
		5 => 'container',
		6 => 'fill',
		7 => 'flex-item',
		8 => 'fluid',
		9 => 'intrinsic',
	];

	/**
	 * List of boolean attributes.
	 *
	 * @since 0.7
	 * @var array
	 */
	public static $boolean_attributes = [
		'allowfullscreen',
		'async',
		'autofocus',
		'autoplay',
		'checked',
		'compact',
		'controls',
		'declare',
		'default',
		'defaultchecked',
		'defaultmuted',
		'defaultselected',
		'defer',
		'disabled',
		'draggable',
		'enabled',
		'formnovalidate',
		'hidden',
		'indeterminate',
		'inert',
		'ismap',
		'itemscope',
		'loop',
		'multiple',
		'muted',
		'nohref',
		'noresize',
		'noshade',
		'novalidate',
		'nowrap',
		'open',
		'pauseonexit',
		'readonly',
		'required',
		'reversed',
		'scoped',
		'seamless',
		'selected',
		'sortable',
		'spellcheck',
		'translate',
		'truespeed',
		'typemustmatch',
		'visible',
	];

	/**
	 * Additional allowed tags.
	 *
	 * @var array
	 */
	public static $additional_allowed_tags = [

		// An experimental tag with no protoascii.
		'amp-share-tracking' => [
			'attr_spec_list' => [],
			'tag_spec'       => [],
		],
	];
}
