From c241ecdc14b4bb4e50c48029ed94136664afb6a7 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 13:16:39 +0000 Subject: [PATCH 01/17] Use composer instead of submodules --- .gitmodules | 4 ---- Gruntfile.js | 2 +- composer.json | 3 ++- composer.lock | 47 +++++++++++++++++++++++++++++++++++++++++++---- phpcs.xml | 1 - 5 files changed, 46 insertions(+), 11 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a2da7e17ea5..00000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "dev-lib"] - path = dev-lib - url = https://github.com/xwp/wp-dev-lib.git - branch = master diff --git a/Gruntfile.js b/Gruntfile.js index 725b78af2a1..0d4c36cc63a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -34,7 +34,7 @@ module.exports = function( grunt ) { stderr: true }, readme: { - command: './dev-lib/generate-markdown-readme' // Generate the readme.md. + command: './vendor/xwp/wp-dev-lib/generate-markdown-readme' // Generate the readme.md. }, phpunit: { command: 'phpunit' diff --git a/composer.json b/composer.json index c13e765d545..ca15ebd0c16 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ ], "require": { "php": "^5.3.6 || ^7.0", - "sabberworm/php-css-parser": "dev-master" + "sabberworm/php-css-parser": "dev-master", + "xwp/wp-dev-lib": "dev-master" }, "require-dev": { "wp-coding-standards/wpcs": "^0.14.0", diff --git a/composer.lock b/composer.lock index 382e098823c..83eed3b1af4 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "33d4c9d9bf48285e6557d79a6b4b7601", + "content-hash": "712d01725ebb02474abc18782e3de7ac", "packages": [ { "name": "sabberworm/php-css-parser", @@ -50,7 +50,45 @@ "support": { "source": "https://github.com/xwp/PHP-CSS-Parser/tree/master" }, - "time": "2018-11-25 04:50:29" + "time": "2018-11-25T04:50:29+00:00" + }, + { + "name": "xwp/wp-dev-lib", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/xwp/wp-dev-lib.git", + "reference": "ff2cfd2dfbf42360d70b38089d31eaeefd715146" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/xwp/wp-dev-lib/zipball/ff2cfd2dfbf42360d70b38089d31eaeefd715146", + "reference": "ff2cfd2dfbf42360d70b38089d31eaeefd715146", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Weston Ruter", + "email": "weston@xwp.co", + "homepage": "https://weston.ruter.net" + }, + { + "name": "XWP", + "email": "engage@xwp.co", + "homepage": "https://xwp.co" + } + ], + "description": "Common code used during development of WordPress plugins and themes", + "homepage": "https://github.com/xwp/wp-dev-lib", + "keywords": [ + "wordpress" + ], + "time": "2018-11-22T04:47:01+00:00" } ], "packages-dev": [ @@ -270,7 +308,8 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "sabberworm/php-css-parser": 20 + "sabberworm/php-css-parser": 20, + "xwp/wp-dev-lib": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/phpcs.xml b/phpcs.xml index ef3a5c5b010..87fa0be5872 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -42,7 +42,6 @@ . - */dev-lib/* */node_modules/* */vendor/* includes/lib/* From 82b4767992f700509327481f9ae62910e9cde958 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 13:17:07 +0000 Subject: [PATCH 02/17] Deleted folder --- dev-lib | 1 - 1 file changed, 1 deletion(-) delete mode 160000 dev-lib diff --git a/dev-lib b/dev-lib deleted file mode 160000 index e5c56ae4401..00000000000 --- a/dev-lib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e5c56ae44013f5f056ba97f35bd060a2b49e12f3 From e91bc1522251d0caf60fba8e07455b000005b625 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 13:35:44 +0000 Subject: [PATCH 03/17] Updated folder --- .travis.yml | 2 +- Gruntfile.js | 2 +- contributing.md | 13 +++++++++---- phpunit.xml | 3 +-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad755016ee4..387d02f91ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ cache: install: - if [[ $DEV_LIB_SKIP =~ composer ]]; then composer install --no-dev; fi - nvm install 8.11.4 && nvm use 8.11.4 - - export DEV_LIB_PATH=dev-lib + - export DEV_LIB_PATH=vendor/xwp/wp-dev-lib - source $DEV_LIB_PATH/travis.install.sh script: diff --git a/Gruntfile.js b/Gruntfile.js index 0d4c36cc63a..18c7d5defdc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -113,7 +113,7 @@ module.exports = function( grunt ) { versionAppend = new Date().toISOString().replace( /\.\d+/, '' ).replace( /-|:/g, '' ) + '-' + commitHash; paths = lsOutput.trim().split( /\n/ ).filter( function( file ) { - return ! /^(blocks|\.|bin|([^/]+)+\.(md|json|xml)|Gruntfile\.js|tests|wp-assets|dev-lib|readme\.md|composer\..*|webpack.*|languages\/README.*)/.test( file ); + return ! /^(blocks|\.|bin|([^/]+)+\.(md|json|xml)|Gruntfile\.js|tests|wp-assets|readme\.md|composer\..*|webpack.*|languages\/README.*)/.test( file ); } ); paths.push( 'vendor/autoload.php' ); paths.push( 'assets/js/*-compiled.js' ); diff --git a/contributing.md b/contributing.md index 95c5e419e5b..e24cf27af32 100644 --- a/contributing.md +++ b/contributing.md @@ -5,14 +5,19 @@ Thanks for taking the time to contribute! To start, clone this repository into your WordPress install being used for development: ```bash -cd wp-content/plugins && git clone --recursive git@github.com:Automattic/amp-wp.git amp +cd wp-content/plugins && git clone git@github.com:Automattic/amp-wp.git amp ``` -If you happened to have cloned without `--recursive` previously, please do `git submodule update --init` to ensure the [dev-lib](https://github.com/xwp/wp-dev-lib/) submodule is available for development. +### Build dependencies with [Composer](https://getcomposer.org) -Lastly, to get the plugin running in your WordPress install, run `composer install` and then activate the plugin via the WordPress dashboard or `wp plugin activate amp`. +```bash +cd amp +composer install +``` + +Lastly, activate the plugin via the WordPress dashboard or `wp plugin activate amp`. -To install the `pre-commit` hook, do `bash dev-lib/install-pre-commit-hook.sh`. +To install the `pre-commit` hook, do `bash vendor/xwp/wp-dev-lib/install-pre-commit-hook.sh`. Note that pull requests will be checked against [WordPress-Coding-Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards) with PHPCS, and for JavaScript linting is done with ESLint and (for now) JSCS and JSHint. diff --git a/phpunit.xml b/phpunit.xml index a1b4d099ded..eee736f3ee1 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,5 +1,5 @@ ./ - dev-lib svn node_modules tests From 599181c0d11376c41d3ac7fc812bee08b896f4b3 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 14:46:06 +0000 Subject: [PATCH 04/17] Fixing scripts --- bin/amphtml-update.sh | 6 +++--- bin/create-gutenberg-test-post.sh | 2 +- bin/install-wp-tests.sh | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bin/amphtml-update.sh b/bin/amphtml-update.sh index 653ceed52ba..89f6a96c09a 100644 --- a/bin/amphtml-update.sh +++ b/bin/amphtml-update.sh @@ -17,14 +17,14 @@ fi sudo apt-get install git python protobuf-compiler python-protobuf # Create and go to vendor. -if [[ ! -e $VENDOR_PATH ]]; then +if [ ! -e $VENDOR_PATH ]; then mkdir $VENDOR_PATH fi cd $VENDOR_PATH # Clone amphtml repo. -if [[ ! -e $VENDOR_PATH/amphtml ]]; then - git clone https://github.com/ampproject/amphtml amphtml +if [ ! -e $VENDOR_PATH/amphtml ]; then + git clone --depth=1 https://github.com/ampproject/amphtml amphtml else cd $VENDOR_PATH/amphtml/validator git fetch --tags diff --git a/bin/create-gutenberg-test-post.sh b/bin/create-gutenberg-test-post.sh index 1c719dac00c..a2513887110 100644 --- a/bin/create-gutenberg-test-post.sh +++ b/bin/create-gutenberg-test-post.sh @@ -13,7 +13,7 @@ if [[ ! -e $GUTENBERG_PATH ]]; then echo "This needs to clone the Gutenberg plugin into your plugins directory, as it looks like it's not there." read -p "Is that alright? y/n " -r if [[ $REPLY =~ [Yy] ]]; then - git clone https://github.com/WordPress/gutenberg.git + git clone --depth=1 https://github.com/WordPress/gutenberg.git wp plugin activate gutenberg echo "The Gutenberg plugin is cloned. Please follow the build steps:" echo "https://github.com/WordPress/gutenberg/blob/master/CONTRIBUTING.md" diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh index 9f009876bfb..1a6c88a5a0a 100755 --- a/bin/install-wp-tests.sh +++ b/bin/install-wp-tests.sh @@ -104,7 +104,8 @@ install_db() { fi # create database - mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA + mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA -e"DROP DATABASE IF EXISTS $DB_NAME" + mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA -e"create DATABASE $DB_NAME" } install_wp From 807b48fe3619af0357965c110c5fe711f24a9bd2 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 14:57:35 +0000 Subject: [PATCH 05/17] Speeding up script --- bin/amphtml-update.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/amphtml-update.sh b/bin/amphtml-update.sh index 89f6a96c09a..c83ad4e05ad 100644 --- a/bin/amphtml-update.sh +++ b/bin/amphtml-update.sh @@ -26,8 +26,8 @@ cd $VENDOR_PATH if [ ! -e $VENDOR_PATH/amphtml ]; then git clone --depth=1 https://github.com/ampproject/amphtml amphtml else - cd $VENDOR_PATH/amphtml/validator - git fetch --tags + cd $VENDOR_PATH/amphtml + git pull fi # Check out the latest tag. From 60615fff192ca0495ab93b7ebfd7a261c09f5458 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 14:57:44 +0000 Subject: [PATCH 06/17] Run update --- .../class-amp-allowed-tags-generated.php | 428 ++++++++++++++---- 1 file changed, 346 insertions(+), 82 deletions(-) diff --git a/includes/sanitizers/class-amp-allowed-tags-generated.php b/includes/sanitizers/class-amp-allowed-tags-generated.php index 7d85042a281..f25c2ac88a0 100644 --- a/includes/sanitizers/class-amp-allowed-tags-generated.php +++ b/includes/sanitizers/class-amp-allowed-tags-generated.php @@ -13,7 +13,7 @@ */ class AMP_Allowed_Tags_Generated { - private static $spec_file_revision = 757; + private static $spec_file_revision = 772; private static $minimum_validator_revision_required = 348; private static $allowed_tags = array( @@ -1680,6 +1680,36 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'amp-delight-player' => array( + array( + 'attr_spec_list' => array( + 'data-content-id' => array( + 'mandatory' => true, + ), + 'media' => array(), + 'noloading' => array( + 'value' => array( + '', + ), + ), + ), + 'tag_spec' => array( + 'amp_layout' => array( + 'supported_layouts' => array( + 6, + 2, + 3, + 7, + 1, + 4, + ), + ), + 'requires_extension' => array( + 'amp-delight-player', + ), + ), + ), + ), 'amp-embed' => array( array( 'attr_spec_list' => array( @@ -2936,6 +2966,36 @@ class AMP_Allowed_Tags_Generated { 'unique' => true, ), ), + array( + 'attr_spec_list' => array( + 'data-client' => array( + 'mandatory' => true, + ), + 'data-slot' => array( + 'mandatory' => true, + ), + 'type' => array( + 'mandatory' => true, + 'value' => array( + 'adsense', + ), + ), + ), + 'tag_spec' => array( + 'reference_points' => array( + 'AMP-NEXT-PAGE > [separator]' => array( + 'mandatory' => false, + 'unique' => true, + ), + ), + 'requires_extension' => array( + 'amp-next-page', + ), + 'spec_name' => 'amp-next-page [type=adsense]', + 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-next-page', + 'unique' => true, + ), + ), ), 'amp-nexxtv-player' => array( array( @@ -3438,47 +3498,6 @@ class AMP_Allowed_Tags_Generated { ), ), ), - 'amp-script' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-script', - ), - 'requires_extension' => array( - 'amp-script', - ), - ), - ), - ), 'amp-selector' => array( array( 'attr_spec_list' => array( @@ -4376,6 +4395,151 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'amp-video-iframe' => array( + array( + 'attr_spec_list' => array( + 'album' => array(), + 'alt' => array(), + 'artist' => array(), + 'artwork' => array(), + 'attribution' => array(), + 'autoplay' => array( + 'value' => array( + '', + ), + ), + 'implements-media-session' => array( + 'value' => array( + '', + ), + ), + 'implements-rotate-to-fullscreen' => array( + 'value' => array( + '', + ), + ), + 'lightbox' => array(), + 'lightbox-thumbnail-id' => array( + 'value_regex_casei' => '^[a-z][a-z\\d_-]*', + ), + 'media' => array(), + 'noloading' => array( + 'value' => array( + '', + ), + ), + 'poster' => array( + 'mandatory' => true, + ), + 'referrerpolicy' => array(), + 'rotate-to-fullscreen' => array( + 'value' => array( + '', + ), + ), + 'src' => array( + 'blacklisted_value_regex' => '__amp_source_origin', + 'mandatory' => true, + 'value_url' => array( + 'protocol' => array( + 'https', + ), + ), + ), + ), + 'tag_spec' => array( + 'amp_layout' => array( + 'supported_layouts' => array( + 6, + 2, + 3, + 7, + 9, + 1, + 4, + ), + ), + 'requires_extension' => array( + 'amp-video-iframe', + ), + 'spec_name' => 'AMP-VIDEO-IFRAME[poster]', + 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video-iframe', + ), + ), + array( + 'attr_spec_list' => array( + 'album' => array(), + 'alt' => array(), + 'artist' => array(), + 'artwork' => array(), + 'attribution' => array(), + 'autoplay' => array( + 'value' => array( + '', + ), + ), + 'implements-media-session' => array( + 'value' => array( + '', + ), + ), + 'implements-rotate-to-fullscreen' => array( + 'value' => array( + '', + ), + ), + 'lightbox' => array(), + 'lightbox-thumbnail-id' => array( + 'value_regex_casei' => '^[a-z][a-z\\d_-]*', + ), + 'media' => array(), + 'noloading' => array( + 'value' => array( + '', + ), + ), + 'referrerpolicy' => array(), + 'rotate-to-fullscreen' => array( + 'value' => array( + '', + ), + ), + 'src' => array( + 'blacklisted_value_regex' => '__amp_source_origin', + 'mandatory' => true, + 'value_url' => array( + 'protocol' => array( + 'https', + ), + ), + ), + ), + 'tag_spec' => array( + 'amp_layout' => array( + 'supported_layouts' => array( + 6, + 2, + 3, + 7, + 9, + 1, + 4, + ), + ), + 'reference_points' => array( + 'AMP-VIDEO-IFRAME > [placeholder]' => array( + 'mandatory' => true, + 'unique' => true, + ), + ), + 'requires_extension' => array( + 'amp-video-iframe', + ), + 'spec_name' => 'AMP-VIDEO-IFRAME with [placeholder]', + 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video-iframe', + ), + ), + ), 'amp-vimeo' => array( array( 'attr_spec_list' => array( @@ -6807,6 +6971,7 @@ class AMP_Allowed_Tags_Generated { array( 'attr_spec_list' => array( 'alt' => array(), + 'attribution' => array(), 'border' => array(), 'decoding' => array( 'value' => array( @@ -6826,6 +6991,7 @@ class AMP_Allowed_Tags_Generated { ), ), ), + 'sizes' => array(), 'src' => array( 'alternative_names' => array( 'srcset', @@ -10025,6 +10191,31 @@ class AMP_Allowed_Tags_Generated { ), ), ), + array( + 'attr_spec_list' => array( + 'async' => array( + 'mandatory' => true, + 'value' => array( + '', + ), + ), + 'nonce' => array(), + 'type' => array( + 'value_casei' => array( + 'text/javascript', + ), + ), + ), + 'tag_spec' => array( + 'extension_spec' => array( + 'name' => 'amp-delight-player', + 'version' => array( + '0.1', + 'latest', + ), + ), + ), + ), array( 'attr_spec_list' => array( 'async' => array( @@ -11346,31 +11537,6 @@ class AMP_Allowed_Tags_Generated { ), ), ), - array( - 'attr_spec_list' => array( - 'async' => array( - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'nonce' => array(), - 'type' => array( - 'value_casei' => array( - 'text/javascript', - ), - ), - ), - 'tag_spec' => array( - 'extension_spec' => array( - 'name' => 'amp-script', - 'version' => array( - '0.1', - 'latest', - ), - ), - ), - ), array( 'attr_spec_list' => array( 'async' => array( @@ -11637,6 +11803,25 @@ class AMP_Allowed_Tags_Generated { ), ), ), + array( + 'attr_spec_list' => array( + 'type' => array( + 'dispatch_key' => 3, + 'mandatory' => true, + 'value_casei' => array( + 'application/json', + ), + ), + ), + 'tag_spec' => array( + 'mandatory_parent' => 'amp-story-bookend', + 'requires_extension' => array( + 'amp-story', + ), + 'spec_name' => 'amp-story-bookend extension .json script', + 'unique' => true, + ), + ), array( 'attr_spec_list' => array( 'nonce' => array(), @@ -11830,6 +12015,61 @@ class AMP_Allowed_Tags_Generated { ), ), ), + array( + 'attr_spec_list' => array( + 'async' => array( + 'mandatory' => true, + 'value' => array( + '', + ), + ), + 'nonce' => array(), + 'type' => array( + 'value_casei' => array( + 'text/javascript', + ), + ), + ), + 'tag_spec' => array( + 'extension_spec' => array( + 'name' => 'amp-video-docking', + 'requires_usage' => 3, + 'version' => array( + '0.1', + 'latest', + ), + ), + 'requires_extension' => array( + 'amp-video', + ), + 'spec_name' => 'amp-video-docking for amp-video', + ), + ), + array( + 'attr_spec_list' => array( + 'async' => array( + 'mandatory' => true, + 'value' => array( + '', + ), + ), + 'nonce' => array(), + 'type' => array( + 'value_casei' => array( + 'text/javascript', + ), + ), + ), + 'tag_spec' => array( + 'extension_spec' => array( + 'name' => 'amp-video-iframe', + 'version' => array( + '0.1', + 'latest', + ), + ), + ), + ), array( 'attr_spec_list' => array( 'async' => array( @@ -12463,21 +12703,6 @@ class AMP_Allowed_Tags_Generated { 'unique' => true, ), ), - array( - 'attr_spec_list' => array( - 'nonce' => array(), - ), - 'cdata' => array( - 'cdata_regex' => 'body ?{opacity: ?0}', - ), - 'tag_spec' => array( - 'mandatory_alternatives' => 'head > style[amp-boilerplate]', - 'mandatory_parent' => 'head', - 'spec_name' => 'head > style[amp-boilerplate] - old variant', - 'spec_url' => 'https://github.com/ampproject/amphtml/blob/master/spec/amp-boilerplate.md', - 'unique' => true, - ), - ), array( 'attr_spec_list' => array( 'amp-boilerplate' => array( @@ -14384,6 +14609,20 @@ class AMP_Allowed_Tags_Generated { 'animate-in-after' => array(), 'animate-in-delay' => array(), 'animate-in-duration' => array(), + 'data-tooltip-icon' => array( + 'value_url' => array( + 'protocol' => array( + 'http', + 'https', + 'data', + ), + ), + ), + 'target' => array( + 'value' => array( + '_blank', + ), + ), ), 'tag_spec' => array( 'reference_points' => array( @@ -14450,6 +14689,15 @@ class AMP_Allowed_Tags_Generated { 'animate-in-after' => array(), 'animate-in-delay' => array(), 'animate-in-duration' => array(), + 'data-tooltip-icon' => array( + 'value_url' => array( + 'protocol' => array( + 'http', + 'https', + 'data', + ), + ), + ), 'grid-area' => array(), 'justify-content' => array( 'value' => array( @@ -14478,6 +14726,11 @@ class AMP_Allowed_Tags_Generated { 'stretch', ), ), + 'target' => array( + 'value' => array( + '_blank', + ), + ), ), 'tag_spec' => array( 'reference_points' => array( @@ -14490,6 +14743,17 @@ class AMP_Allowed_Tags_Generated { 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-story', ), ), + 'AMP-VIDEO-IFRAME > [placeholder]' => array( + 'attr_spec_list' => array( + 'placeholder' => array( + 'mandatory' => true, + ), + ), + 'tag_spec' => array( + 'spec_name' => 'AMP-VIDEO-IFRAME > [placeholder]', + 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video-iframe', + ), + ), ); From e79d8f21bdc61ea0d868ae116a7153e5a1034984 Mon Sep 17 00:00:00 2001 From: Marcelo Vani Date: Thu, 29 Nov 2018 15:42:16 +0000 Subject: [PATCH 07/17] Moved files into amp-sanitizer library --- bin/amphtml-update.py | 648 - bin/amphtml-update.sh | 47 - composer.json | 3 +- composer.lock | 42 +- .../class-amp-allowed-tags-generated.php | 14820 ---------------- .../sanitizers/class-amp-audio-sanitizer.php | 172 - .../sanitizers/class-amp-base-sanitizer.php | 583 - .../class-amp-blacklist-sanitizer.php | 301 - .../sanitizers/class-amp-block-sanitizer.php | 133 - .../class-amp-comments-sanitizer.php | 156 - .../class-amp-core-theme-sanitizer.php | 1107 -- .../sanitizers/class-amp-embed-sanitizer.php | 47 - .../sanitizers/class-amp-form-sanitizer.php | 156 - .../class-amp-gallery-block-sanitizer.php | 207 - .../sanitizers/class-amp-iframe-sanitizer.php | 196 - .../sanitizers/class-amp-img-sanitizer.php | 376 - .../class-amp-o2-player-sanitizer.php | 140 - .../class-amp-playbuzz-sanitizer.php | 146 - includes/sanitizers/class-amp-rule-spec.php | 139 - .../sanitizers/class-amp-script-sanitizer.php | 49 - .../sanitizers/class-amp-style-sanitizer.php | 2225 --- .../class-amp-tag-and-attribute-sanitizer.php | 1874 -- .../sanitizers/class-amp-video-sanitizer.php | 231 - 23 files changed, 42 insertions(+), 23756 deletions(-) delete mode 100644 bin/amphtml-update.py delete mode 100644 bin/amphtml-update.sh delete mode 100644 includes/sanitizers/class-amp-allowed-tags-generated.php delete mode 100644 includes/sanitizers/class-amp-audio-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-base-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-blacklist-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-block-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-comments-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-core-theme-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-embed-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-form-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-gallery-block-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-iframe-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-img-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-o2-player-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-playbuzz-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-rule-spec.php delete mode 100644 includes/sanitizers/class-amp-script-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-style-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php delete mode 100644 includes/sanitizers/class-amp-video-sanitizer.php diff --git a/bin/amphtml-update.py b/bin/amphtml-update.py deleted file mode 100644 index bf6071200c4..00000000000 --- a/bin/amphtml-update.py +++ /dev/null @@ -1,648 +0,0 @@ -""" -This script is used to generate the 'class-amp-allowed-tags-generated.php' -file that is used by the class AMP_Tag_And_Attribute_Sanitizer. - -A bash script, amphtml-update.sh, is provided to automatically run this script. To run the bash script, type: - -`bash amphtml-update.sh` - -from within a Linux environment such as VVV. - -See the Updating Allowed Tags and Attributes section of the Contributing guide -https://github.com/Automattic/amp-wp/blob/develop/contributing.md#updating-allowed-tags-and-attributes. - -Then have fun sanitizing your AMP posts! -""" - -import glob -import logging -import os -import platform -import re -import shutil -import subprocess -import sys -import tempfile -import collections -import json -import google - -def Die(msg): - print >> sys.stderr, msg - sys.exit(1) - - -def SetupOutDir(out_dir): - """Sets up a clean output directory. - - Args: - out_dir: directory name of the output directory. Must not have slashes, - dots, etc. - """ - logging.info('entering ...') - assert re.match(r'^[a-zA-Z_\-0-9]+$', out_dir), 'bad out_dir: %s' % out_dir - - if os.path.exists(out_dir): - subprocess.check_call(['rm', '-rf', out_dir]) - os.mkdir(out_dir) - logging.info('... done') - - -def GenValidatorPb2Py(out_dir): - """Calls the proto compiler to generate validator_pb2.py. - - Args: - out_dir: directory name of the output directory. Must not have slashes, - dots, etc. - """ - logging.info('entering ...') - assert re.match(r'^[a-zA-Z_\-0-9]+$', out_dir), 'bad out_dir: %s' % out_dir - - subprocess.check_call(['protoc', 'validator.proto', - '--python_out=%s' % out_dir]) - open('%s/__init__.py' % out_dir, 'w').close() - logging.info('... done') - - -def GenValidatorProtoascii(out_dir): - """Assembles the validator protoascii file from the main and extensions. - - Args: - out_dir: directory name of the output directory. Must not have slashes, - dots, etc. - """ - logging.info('entering ...') - assert re.match(r'^[a-zA-Z_\-0-9]+$', out_dir), 'bad out_dir: %s' % out_dir - - protoascii_segments = [open('validator-main.protoascii').read()] - extensions = glob.glob('extensions/*/validator-*.protoascii') - # In the Github project, the extensions are located in a sibling directory - # to the validator rather than a child directory. - if not extensions: - extensions = glob.glob('../extensions/*/validator-*.protoascii') - extensions.sort() - for extension in extensions: - protoascii_segments.append(open(extension).read()) - f = open('%s/validator.protoascii' % out_dir, 'w') - f.write(''.join(protoascii_segments)) - f.close() - - logging.info('... done') - - -def GeneratePHP(out_dir): - """Generates PHP for WordPress AMP plugin to consume. - - Args: - out_dir: directory name of the output directory. Must not have slashes, - dots, etc. - """ - logging.info('entering ...') - assert re.match(r'^[a-zA-Z_\-0-9]+$', out_dir), 'bad out_dir: %s' % out_dir - - allowed_tags, attr_lists, reference_points, versions = ParseRules(out_dir) - - #Generate the output - out = [] - GenerateHeaderPHP(out) - GenerateSpecVersionPHP(out, versions) - GenerateAllowedTagsPHP(out, allowed_tags) - GenerateLayoutAttributesPHP(out, attr_lists) - GenerateGlobalAttributesPHP(out, attr_lists) - GenerateReferencePointsPHP(out, reference_points) - GenerateFooterPHP(out) - - # join out array into a single string and remove unneeded whitespace - output = re.sub("\\(\\s*\\)", "()", '\n'.join(out)) - - # replace 'True' with true and 'False' with false - output = re.sub("'True'", "true", output) - output = re.sub("'False'", "false", output) - - # Write the php file to disk. - f = open('%s/class-amp-allowed-tags-generated.php' % out_dir, 'w') - # f.write('\n'.join(out)) - f.write(output) - f.close() - logging.info('... done') - - -def GenerateHeaderPHP(out): - logging.info('entering ...') - - # Output the file's header - out.append(' 0: - tag_spec_dict['cdata'] = cdata_dict - - return tag_spec_dict - - -def GetTagRules(tag_spec): - logging.info('entering ...') - - tag_rules = {} - - if hasattr(tag_spec, 'also_requires_tag') and tag_spec.also_requires_tag: - also_requires_tag_list = [] - for also_requires_tag in tag_spec.also_requires_tag: - also_requires_tag_list.append(UnicodeEscape(also_requires_tag)) - tag_rules['also_requires_tag'] = also_requires_tag_list - - if hasattr(tag_spec, 'requires_extension') and len( tag_spec.requires_extension ) != 0: - requires_extension_list = [] - for requires_extension in tag_spec.requires_extension: - requires_extension_list.append(requires_extension) - tag_rules['requires_extension'] = requires_extension_list - - if hasattr(tag_spec, 'reference_points') and len( tag_spec.reference_points ) != 0: - tag_reference_points = {} - for reference_point_spec in tag_spec.reference_points: - tag_reference_points[ reference_point_spec.tag_spec_name ] = { - "mandatory": reference_point_spec.mandatory, - "unique": reference_point_spec.unique - } - if len( tag_reference_points ) > 0: - tag_rules['reference_points'] = tag_reference_points - - if hasattr(tag_spec, 'also_requires_tag_warning') and len( tag_spec.also_requires_tag_warning ) != 0: - also_requires_tag_warning_list = [] - for also_requires_tag_warning in tag_spec.also_requires_tag_warning: - also_requires_tag_warning_list.append(also_requires_tag_warning) - tag_rules['also_requires_tag_warning'] = also_requires_tag_warning_list - - if tag_spec.disallowed_ancestor: - disallowed_ancestor_list = [] - for disallowed_ancestor in tag_spec.disallowed_ancestor: - disallowed_ancestor_list.append(UnicodeEscape(disallowed_ancestor).lower()) - tag_rules['disallowed_ancestor'] = disallowed_ancestor_list - - if tag_spec.html_format: - html_format_list = [] - has_amp_format = False - for html_format in tag_spec.html_format: - if 1 == html_format: - has_amp_format = True - if not has_amp_format: - return None - - if tag_spec.HasField('extension_spec'): - extension_spec = {} - for field in tag_spec.extension_spec.ListFields(): - if isinstance(field[1], (list, google.protobuf.internal.containers.RepeatedScalarFieldContainer)): - extension_spec[ field[0].name ] = [] - for val in field[1]: - extension_spec[ field[0].name ].append( val ) - else: - extension_spec[ field[0].name ] = field[1] - tag_rules['extension_spec'] = extension_spec - - if tag_spec.HasField('mandatory'): - tag_rules['mandatory'] = tag_spec.mandatory - - if tag_spec.HasField('mandatory_alternatives'): - tag_rules['mandatory_alternatives'] = UnicodeEscape(tag_spec.mandatory_alternatives) - - if tag_spec.HasField('mandatory_ancestor'): - tag_rules['mandatory_ancestor'] = UnicodeEscape(tag_spec.mandatory_ancestor).lower() - - if tag_spec.HasField('mandatory_ancestor_suggested_alternative'): - tag_rules['mandatory_ancestor_suggested_alternative'] = UnicodeEscape(tag_spec.mandatory_ancestor_suggested_alternative).lower() - - if tag_spec.HasField('mandatory_parent'): - tag_rules['mandatory_parent'] = UnicodeEscape(tag_spec.mandatory_parent).lower() - - if tag_spec.HasField('spec_name'): - tag_rules['spec_name'] = UnicodeEscape(tag_spec.spec_name) - - if tag_spec.HasField('spec_url'): - tag_rules['spec_url'] = UnicodeEscape(tag_spec.spec_url) - - if tag_spec.HasField('unique'): - tag_rules['unique'] = tag_spec.unique - - if tag_spec.HasField('unique_warning'): - tag_rules['unique_warning'] = tag_spec.unique_warning - - if tag_spec.HasField('amp_layout'): - amp_layout = {} - for field in tag_spec.amp_layout.ListFields(): - if 'supported_layouts' == field[0].name: - amp_layout['supported_layouts'] = [ val for val in field[1] ] - else: - amp_layout[ field[0].name ] = field[1] - tag_rules['amp_layout'] = amp_layout - - logging.info('... done') - return tag_rules - - -def GetAttrs(attrs): - logging.info('entering ...') - - attr_dict = {} - for attr_spec in attrs: - - value_dict = GetValues(attr_spec) - - # Add attribute name and alternative_names - attr_dict[UnicodeEscape(attr_spec.name)] = value_dict - - logging.info('... done') - return attr_dict - - -def GetValues(attr_spec): - logging.info('entering ...') - - value_dict = {} - - # Add alternative names - if attr_spec.alternative_names: - alt_names_list = [] - for alternative_name in attr_spec.alternative_names: - alt_names_list.append(UnicodeEscape(alternative_name)) - value_dict['alternative_names'] = alt_names_list - - # Add blacklisted value regex - if attr_spec.HasField('blacklisted_value_regex'): - value_dict['blacklisted_value_regex'] = attr_spec.blacklisted_value_regex - - # dispatch_key is an int - if attr_spec.HasField('dispatch_key'): - value_dict['dispatch_key'] = attr_spec.dispatch_key - - # mandatory is a boolean - if attr_spec.HasField('mandatory'): - value_dict['mandatory'] = attr_spec.mandatory - - # Add allowed value - if attr_spec.value: - value_dict['value'] = list( attr_spec.value ) - - # value_casei - if attr_spec.value_casei: - value_dict['value_casei'] = list( attr_spec.value_casei ) - - # value_regex - if attr_spec.HasField('value_regex'): - value_dict['value_regex'] = attr_spec.value_regex - - # value_regex_casei - if attr_spec.HasField('value_regex_casei'): - value_dict['value_regex_casei'] = attr_spec.value_regex_casei - - #value_properties is a dictionary of dictionaries - if attr_spec.HasField('value_properties'): - value_properties_dict = {} - for (value_properties_key, value_properties_val) in attr_spec.value_properties.ListFields(): - for value_property in value_properties_val: - property_dict = {} - # print 'value_property.name: %s' % value_property.name - for (key,val) in value_property.ListFields(): - if val != value_property.name: - if isinstance(val, unicode): - val = UnicodeEscape(val) - property_dict[UnicodeEscape(key.name)] = val - value_properties_dict[UnicodeEscape(value_property.name)] = property_dict - value_dict['value_properties'] = value_properties_dict - - # value_url is a dictionary - if attr_spec.HasField('value_url'): - value_url_dict = {} - for (value_url_key, value_url_val) in attr_spec.value_url.ListFields(): - if isinstance(value_url_val, (list, collections.Sequence, google.protobuf.internal.containers.RepeatedScalarFieldContainer)): - value_url_val_val = [] - for val in value_url_val: - value_url_val_val.append(UnicodeEscape(val)) - else: - value_url_val_val = value_url_val - value_url_dict[value_url_key.name] = value_url_val_val - value_dict['value_url'] = value_url_dict - - logging.info('... done') - return value_dict - - -def UnicodeEscape(string): - """Helper function which escapes unicode characters. - - Args: - string: A string which may contain unicode characters. - Returns: - An escaped string. - """ - return ('' + string).encode('unicode-escape') - -def Phpize(data, indent=0): - """Helper function to convert JSON-serializable data into PHP literals. - - Args: - data: Any JSON-serializable. - Returns: - String formatted as PHP literal. - """ - json_string = json.dumps(data, sort_keys=True, ensure_ascii=False) - - pipe = subprocess.Popen(['php', '-r', 'var_export( json_decode( file_get_contents( "php://stdin" ), true ) );'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) - php_stdout = pipe.communicate(input=json_string)[0] - php_exported = php_stdout.decode() - - # Clean up formatting. - # TODO: Just use PHPCBF for this. - php_exported = re.sub( r'^ +', lambda match: ( len(match.group(0))/2 ) * '\t', php_exported, flags=re.MULTILINE ) - php_exported = php_exported.replace( 'array (', 'array(' ) - php_exported = re.sub( r' => \n\s+', ' => ', php_exported, flags=re.MULTILINE ) - php_exported = re.sub( r'^(\s+)\d+ =>\s*', r'\1', php_exported, flags=re.MULTILINE ) - - # Add additional indents. - if indent > 0: - php_exported = re.sub( r'^', '\t' * indent, php_exported, flags=re.MULTILINE ) - return php_exported - -def Main(): - """The main method, which executes all build steps and runs the tests.""" - logging.basicConfig( - format='[[%(filename)s %(funcName)s]] - %(message)s', level=logging.INFO) - - out_dir = 'amp_wp' - - SetupOutDir(out_dir) - GenValidatorProtoascii(out_dir) - GenValidatorPb2Py(out_dir) - GenValidatorProtoascii(out_dir) - GeneratePHP(out_dir) - -if __name__ == '__main__': - Main() diff --git a/bin/amphtml-update.sh b/bin/amphtml-update.sh deleted file mode 100644 index c83ad4e05ad..00000000000 --- a/bin/amphtml-update.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -e - -# Go to the right location. -cd "$(dirname "$0")" - -BIN_PATH="$(pwd)" -PROJECT_PATH=$(dirname $PWD) -VENDOR_PATH=$PROJECT_PATH/vendor - -if ! command -v apt-get >/dev/null 2>&1; then - echo "The AMP HTML uses apt-get, make sure to run this script in a Linux environment" - exit 1 -fi - -# Install dependencies. -sudo apt-get install git python protobuf-compiler python-protobuf - -# Create and go to vendor. -if [ ! -e $VENDOR_PATH ]; then - mkdir $VENDOR_PATH -fi -cd $VENDOR_PATH - -# Clone amphtml repo. -if [ ! -e $VENDOR_PATH/amphtml ]; then - git clone --depth=1 https://github.com/ampproject/amphtml amphtml -else - cd $VENDOR_PATH/amphtml - git pull -fi - -# Check out the latest tag. -cd $VENDOR_PATH/amphtml -LATEST_TAG=$( git describe --abbrev=0 --tags ) -git checkout $LATEST_TAG - -# Copy script to location and go there. -cp $BIN_PATH/amphtml-update.py $VENDOR_PATH/amphtml/validator -cd $VENDOR_PATH/amphtml/validator - -# Run script. -python amphtml-update.py -mv amp_wp/class-amp-allowed-tags-generated.php ../../../includes/sanitizers/ -rm -r amp_wp - -echo "Generated from tag $LATEST_TAG" diff --git a/composer.json b/composer.json index ca15ebd0c16..e07f32fbca3 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,8 @@ "require": { "php": "^5.3.6 || ^7.0", "sabberworm/php-css-parser": "dev-master", - "xwp/wp-dev-lib": "dev-master" + "xwp/wp-dev-lib": "dev-master", + "marcelovani/amp-sanitizer": "dev-master" }, "require-dev": { "wp-coding-standards/wpcs": "^0.14.0", diff --git a/composer.lock b/composer.lock index 83eed3b1af4..9731eaf8f8f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,45 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "712d01725ebb02474abc18782e3de7ac", + "content-hash": "aa0fbfa002263abe1019d76833748b0f", "packages": [ + { + "name": "marcelovani/amp-sanitizer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/marcelovani/amp-sanitizer.git", + "reference": "16b5d0d8695a708f3f27c0cd1a183bc8721e80ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marcelovani/amp-sanitizer/zipball/16b5d0d8695a708f3f27c0cd1a183bc8721e80ba", + "reference": "16b5d0d8695a708f3f27c0cd1a183bc8721e80ba", + "shasum": "" + }, + "require": { + "php": "^5.3.6 || ^7.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", + "sabberworm/php-css-parser": "dev-master", + "wimg/php-compatibility": "^8.1", + "wp-coding-standards/wpcs": "^0.14.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "": "includes/sanitizers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "description": "Consumes AMPHtml rules and generates AMP sanitizers", + "homepage": "https://github.com/marcelovani/amp-sanitizer", + "time": "2018-11-29T15:33:45+00:00" + }, { "name": "sabberworm/php-css-parser", "version": "dev-master", @@ -309,7 +346,8 @@ "minimum-stability": "stable", "stability-flags": { "sabberworm/php-css-parser": 20, - "xwp/wp-dev-lib": 20 + "xwp/wp-dev-lib": 20, + "marcelovani/amp-sanitizer": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/includes/sanitizers/class-amp-allowed-tags-generated.php b/includes/sanitizers/class-amp-allowed-tags-generated.php deleted file mode 100644 index f25c2ac88a0..00000000000 --- a/includes/sanitizers/class-amp-allowed-tags-generated.php +++ /dev/null @@ -1,14820 +0,0 @@ - array( - array( - 'attr_spec_list' => array( - '[href]' => array(), - 'border' => array(), - 'download' => array(), - 'href' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'ftp', - 'geo', - 'http', - 'https', - 'mailto', - 'maps', - 'bip', - 'bbmi', - 'fb-messenger', - 'intent', - 'line', - 'skype', - 'sms', - 'snapchat', - 'tel', - 'tg', - 'threema', - 'twitter', - 'viber', - 'webcal', - 'web+mastodon', - 'whatsapp', - ), - ), - ), - 'hreflang' => array(), - 'media' => array(), - 'name' => array(), - 'referrerpolicy' => array(), - 'rel' => array( - 'blacklisted_value_regex' => '(^|\\s)(components|dns-prefetch|import|manifest|preconnect|prefetch|preload|prerender|serviceworker|stylesheet|subresource|)(\\s|$)', - ), - 'role' => array(), - 'tabindex' => array(), - 'target' => array( - 'value' => array( - '_blank', - '_self', - '_top', - ), - ), - 'type' => array( - 'value_casei' => array( - 'text/html', - ), - ), - ), - 'tag_spec' => array( - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#links', - ), - ), - ), - 'abbr' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'acronym' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'address' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'amp-3d-gltf' => array( - array( - 'attr_spec_list' => array( - 'alpha' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'antialiasing' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'autorotate' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'clearcolor' => array(), - 'enablezoom' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'maxpixelratio' => array( - 'value_regex' => '[+-]?(\\d*\\.)?\\d+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-3d-gltf', - ), - ), - ), - ), - 'amp-3q-player' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'data-id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-3q-player', - ), - ), - ), - ), - 'amp-accordion' => array( - array( - 'attr_spec_list' => array( - 'animate' => array( - 'value' => array( - '', - ), - ), - 'disable-session-states' => array( - 'value' => array( - '', - ), - ), - 'expand-single-section' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - ), - ), - 'requires_extension' => array( - 'amp-accordion', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-accordion', - ), - ), - ), - 'amp-ad' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'json' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rtc-config' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'template' => array(), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-ad extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 8, - 9, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - ), - 'requires_extension' => array( - 'amp-ad', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'data-multi-size' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'json' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rtc-config' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-ad extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 8, - 9, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - 'amp-carousel', - 'amp-fx-flying-carpet', - 'amp-lightbox', - 'amp-sticky-ad', - ), - 'requires_extension' => array( - 'amp-ad', - ), - 'spec_name' => 'amp-ad with data-multi-size attribute', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'data-enable-refresh' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'json' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-ad extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 8, - 9, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - 'amp-fx-flying-carpet', - 'amp-lightbox', - ), - 'requires_extension' => array( - 'amp-ad', - ), - 'spec_name' => 'amp-ad with data-enable-refresh attribute', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - ), - 'amp-addthis' => array( - array( - 'attr_spec_list' => array( - 'data-pub-id' => array( - 'mandatory' => true, - ), - 'data-share-media' => array( - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'data-share-url' => array( - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'data-widget-id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-addthis', - ), - ), - ), - ), - 'amp-analytics' => array( - array( - 'attr_spec_list' => array( - 'config' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'type' => array(), - ), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-analytics', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-analytics', - ), - ), - ), - 'amp-anim' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'attribution' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'alternative_names' => array( - 'srcset', - ), - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'data', - 'http', - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-anim', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-anim', - ), - ), - ), - 'amp-animation' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'trigger' => array( - 'value' => array( - 'visibility', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-animation', - ), - ), - ), - ), - 'amp-apester-media' => array( - array( - 'attr_spec_list' => array( - 'data-apester-channel-token' => array( - 'value_regex' => '[0-9a-zA-Z]+', - ), - 'data-apester-media-id' => array( - 'value_regex' => '[0-9a-zA-Z]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-apester-media', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-apester-media', - ), - ), - ), - 'amp-app-banner' => array( - array( - 'attr_spec_list' => array( - 'id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'mandatory_parent' => 'body', - 'requires_extension' => array( - 'amp-app-banner', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-app-banner', - 'unique' => true, - ), - ), - ), - 'amp-audio' => array( - array( - 'attr_spec_list' => array( - 'album' => array(), - 'artist' => array(), - 'artwork' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'controls' => array(), - 'controlslist' => array(), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'muted' => array( - 'value' => array( - '', - ), - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'preload' => array( - 'value_casei' => array( - 'auto', - 'metadata', - 'none', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'defines_default_height' => true, - 'defines_default_width' => true, - 'supported_layouts' => array( - 2, - 3, - 1, - ), - ), - 'disallowed_ancestor' => array( - 'amp-story', - ), - 'requires_extension' => array( - 'amp-audio', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-audio', - ), - ), - array( - 'attr_spec_list' => array( - 'album' => array(), - 'artist' => array(), - 'artwork' => array(), - 'autoplay' => array( - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'controls' => array(), - 'controlslist' => array(), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'muted' => array( - 'value' => array( - '', - ), - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'defines_default_height' => true, - 'defines_default_width' => true, - 'supported_layouts' => array( - 2, - 3, - 1, - ), - ), - 'mandatory_ancestor' => 'amp-story', - 'requires_extension' => array( - 'amp-audio', - ), - 'spec_name' => 'amp-story >> amp-audio', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-audio', - ), - ), - ), - 'amp-auto-ads' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'amp-auto-ads', - ), - 'requires_extension' => array( - 'amp-auto-ads', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-auto-ads', - ), - ), - ), - 'amp-beopinion' => array( - array( - 'attr_spec_list' => array( - 'data-account' => array( - 'mandatory' => true, - 'value_regex_casei' => '[0-9a-f]{24}', - ), - 'data-content' => array( - 'value_regex_casei' => '[0-9a-f]{24}', - ), - 'data-my-content' => array( - 'value' => array( - '0', - '1', - ), - ), - 'data-name' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-beopinion', - ), - ), - ), - ), - 'amp-bind-macro' => array( - array( - 'attr_spec_list' => array( - 'arguments' => array(), - 'expression' => array( - 'mandatory' => true, - ), - 'id' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-bind', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-bind', - ), - ), - ), - 'amp-bodymovin-animation' => array( - array( - 'attr_spec_list' => array( - 'loop' => array( - 'value_casei' => array( - 'false', - 'number', - 'true', - ), - ), - 'noautoplay' => array( - 'value' => array( - '', - ), - ), - 'renderer' => array( - 'value_casei' => array( - 'svg', - 'html', - ), - ), - 'src' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-bodymovin-animation', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-bodymovin-animation', - ), - ), - ), - 'amp-brid-player' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array(), - 'data-outstream' => array( - 'value_regex' => '[0-9]+', - ), - 'data-partner' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'data-player' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'data-playlist' => array( - 'value_regex' => '[0-9]+', - ), - 'data-video' => array( - 'value_regex' => '[0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-brid-player', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-brid-player', - ), - ), - ), - 'amp-brightcove' => array( - array( - 'attr_spec_list' => array( - '[data-account]' => array(), - '[data-embed]' => array(), - '[data-player-id]' => array(), - '[data-player]' => array(), - '[data-playlist-id]' => array(), - '[data-referrer]' => array(), - '[data-video-id]' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'data-account' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-brightcove', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-brightcove', - ), - ), - ), - 'amp-byside-content' => array( - array( - 'attr_spec_list' => array( - 'data-label' => array( - 'mandatory' => true, - ), - 'data-webcare-id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-byside-content', - ), - ), - ), - ), - 'amp-call-tracking' => array( - array( - 'attr_spec_list' => array( - 'config' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-call-tracking', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-call-tracking', - ), - ), - ), - 'amp-carousel' => array( - array( - 'attr_spec_list' => array( - '[slide]' => array(), - 'arrows' => array( - 'value' => array( - '', - ), - ), - 'autoplay' => array( - 'value_regex' => '(|[0-9]+)', - ), - 'controls' => array(), - 'delay' => array( - 'value_regex' => '[0-9]+', - ), - 'dots' => array( - 'value' => array( - '', - ), - ), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'value' => array( - 'slides', - 'carousel', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-carousel', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-carousel', - ), - ), - array( - 'attr_spec_list' => array( - '[slide]' => array(), - 'arrows' => array( - 'value' => array( - '', - ), - ), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'controls' => array(), - 'delay' => array( - 'value_regex' => '[0-9]+', - ), - 'dots' => array( - 'value' => array( - '', - ), - ), - 'lightbox' => array( - 'mandatory' => true, - ), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'value' => array( - 'slides', - 'carousel', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'reference_points' => array( - 'AMP-CAROUSEL lightbox [child]' => array( - 'mandatory' => false, - 'unique' => false, - ), - 'AMP-CAROUSEL lightbox [lightbox-exclude]' => array( - 'mandatory' => false, - 'unique' => false, - ), - ), - 'requires_extension' => array( - 'amp-carousel', - 'amp-lightbox-gallery', - ), - 'spec_name' => 'AMP-CAROUSEL [lightbox]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-carousel', - ), - ), - ), - 'amp-consent' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-consent', - ), - 'unique' => true, - ), - ), - ), - 'amp-dailymotion' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array(), - 'data-endscreen-enable' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'data-info' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'data-mute' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'data-sharing-enable' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'data-start' => array( - 'value_regex' => '[0-9]+', - ), - 'data-ui-highlight' => array( - 'value_regex_casei' => '([0-9a-f]{3}){1,2}', - ), - 'data-ui-logo' => array( - 'value' => array( - 'false', - 'true', - ), - ), - 'data-videoid' => array( - 'mandatory' => true, - 'value_regex_casei' => '[a-z0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-dailymotion', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-dailymotion', - ), - ), - ), - 'amp-date-countdown' => array( - array( - 'attr_spec_list' => array( - 'biggest-unit' => array( - 'value_casei' => array( - 'days', - 'hours', - 'minutes', - 'seconds', - ), - ), - 'end-date' => array( - 'value_regex' => '\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d(:[0-5]\\d(\\.\\d+)?)?(Z|[+-][0-1][0-9]:[0-5][0-9])', - ), - 'locale' => array( - 'value_casei' => array( - 'de', - 'en', - 'es', - 'fr', - 'id', - 'it', - 'ja', - 'ko', - 'nl', - 'pt', - 'ru', - 'th', - 'tr', - 'vi', - 'zh-cn', - 'zh-tw', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'offset-seconds' => array( - 'value_regex' => '-?\\d+', - ), - 'template' => array(), - 'timeleft-ms' => array( - 'value_regex' => '\\d+', - ), - 'timestamp-ms' => array( - 'value_regex' => '\\d{13}', - ), - 'timestamp-seconds' => array( - 'value_regex' => '\\d{10}', - ), - 'when-ended' => array( - 'value_casei' => array( - 'continue', - 'stop', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-date-countdown', - ), - ), - ), - ), - 'amp-date-picker' => array( - array( - 'attr_spec_list' => array( - '[max]' => array(), - '[min]' => array(), - 'allow-blocked-ranges' => array( - 'value' => array( - '', - ), - ), - 'blocked' => array(), - 'date' => array(), - 'day-size' => array( - 'value_regex' => '[0-9]+', - ), - 'first-day-of-week' => array( - 'value_regex' => '[0-6]', - ), - 'format' => array(), - 'fullscreen' => array( - 'value' => array( - '', - ), - ), - 'highlighted' => array(), - 'input-selector' => array(), - 'locale' => array(), - 'max' => array(), - 'media' => array(), - 'min' => array(), - 'mode' => array( - 'value_casei' => array( - 'static', - ), - ), - 'month-format' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'number-of-months' => array( - 'value_regex' => '[0-9]+', - ), - 'open-after-clear' => array( - 'value' => array( - '', - ), - ), - 'open-after-select' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'type' => array( - 'value_casei' => array( - 'single', - ), - ), - 'week-day-format' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-date-picker', - ), - 'spec_name' => 'amp-date-picker[type=single][mode=static]', - ), - ), - array( - 'attr_spec_list' => array( - '[max]' => array(), - '[min]' => array(), - 'allow-blocked-ranges' => array( - 'value' => array( - '', - ), - ), - 'blocked' => array(), - 'date' => array(), - 'day-size' => array( - 'value_regex' => '[0-9]+', - ), - 'first-day-of-week' => array( - 'value_regex' => '[0-6]', - ), - 'format' => array(), - 'highlighted' => array(), - 'input-selector' => array(), - 'locale' => array(), - 'max' => array(), - 'media' => array(), - 'min' => array(), - 'mode' => array( - 'mandatory' => true, - 'value_casei' => array( - 'overlay', - ), - ), - 'month-format' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'number-of-months' => array( - 'value_regex' => '[0-9]+', - ), - 'open-after-clear' => array( - 'value' => array( - '', - ), - ), - 'open-after-select' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'touch-keyboard-editable' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'value_casei' => array( - 'single', - ), - ), - 'week-day-format' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 1, - ), - ), - 'requires_extension' => array( - 'amp-date-picker', - ), - 'spec_name' => 'amp-date-picker[type=single][mode=overlay]', - ), - ), - array( - 'attr_spec_list' => array( - '[max]' => array(), - '[min]' => array(), - 'allow-blocked-ranges' => array( - 'value' => array( - '', - ), - ), - 'blocked' => array(), - 'day-size' => array( - 'value_regex' => '[0-9]+', - ), - 'end-date' => array(), - 'end-input-selector' => array(), - 'first-day-of-week' => array( - 'value_regex' => '[0-6]', - ), - 'format' => array(), - 'fullscreen' => array( - 'value' => array( - '', - ), - ), - 'highlighted' => array(), - 'locale' => array(), - 'max' => array(), - 'media' => array(), - 'min' => array(), - 'minimum-nights' => array( - 'value_regex' => '[0-9]+', - ), - 'mode' => array( - 'value_casei' => array( - 'static', - ), - ), - 'month-format' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'number-of-months' => array( - 'value_regex' => '[0-9]+', - ), - 'open-after-clear' => array( - 'value' => array( - '', - ), - ), - 'open-after-select' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'start-date' => array(), - 'start-input-selector' => array(), - 'type' => array( - 'mandatory' => true, - 'value_casei' => array( - 'range', - ), - ), - 'week-day-format' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-date-picker', - ), - 'spec_name' => 'amp-date-picker[type=range][mode=static]', - ), - ), - array( - 'attr_spec_list' => array( - '[max]' => array(), - '[min]' => array(), - 'allow-blocked-ranges' => array( - 'value' => array( - '', - ), - ), - 'blocked' => array(), - 'day-size' => array( - 'value_regex' => '[0-9]+', - ), - 'end-date' => array(), - 'end-input-selector' => array(), - 'first-day-of-week' => array( - 'value_regex' => '[0-6]', - ), - 'format' => array(), - 'highlighted' => array(), - 'locale' => array(), - 'max' => array(), - 'media' => array(), - 'min' => array(), - 'minimum-nights' => array( - 'value_regex' => '[0-9]+', - ), - 'mode' => array( - 'mandatory' => true, - 'value_casei' => array( - 'overlay', - ), - ), - 'month-format' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'number-of-months' => array( - 'value_regex' => '[0-9]+', - ), - 'open-after-clear' => array( - 'value' => array( - '', - ), - ), - 'open-after-select' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'start-date' => array(), - 'start-input-selector' => array(), - 'touch-keyboard-editable' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'mandatory' => true, - 'value_casei' => array( - 'range', - ), - ), - 'week-day-format' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 1, - ), - ), - 'requires_extension' => array( - 'amp-date-picker', - ), - 'spec_name' => 'amp-date-picker[type=range][mode=overlay]', - ), - ), - ), - 'amp-delight-player' => array( - array( - 'attr_spec_list' => array( - 'data-content-id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-delight-player', - ), - ), - ), - ), - 'amp-embed' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'json' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rtc-config' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'template' => array(), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-ad extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 8, - 9, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - ), - 'requires_extension' => array( - 'amp-ad', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'data-multi-size' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'json' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rtc-config' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-ad extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 8, - 9, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - 'amp-carousel', - 'amp-fx-flying-carpet', - 'amp-lightbox', - 'amp-sticky-ad', - ), - 'requires_extension' => array( - 'amp-ad', - ), - 'spec_name' => 'amp-embed with data-multi-size attribute', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - ), - 'amp-embedly-card' => array( - array( - 'attr_spec_list' => array( - 'data-url' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 4, - ), - ), - 'requires_extension' => array( - 'amp-embedly-card', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-embedly-card', - ), - ), - ), - 'amp-embedly-key' => array( - array( - 'attr_spec_list' => array( - 'value' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-embedly-card', - ), - 'unique' => true, - ), - ), - ), - 'amp-experiment' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-experiment', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-experiment', - 'unique' => true, - ), - ), - ), - 'amp-facebook' => array( - array( - 'attr_spec_list' => array( - 'data-href' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-facebook', - ), - ), - ), - ), - 'amp-facebook-comments' => array( - array( - 'attr_spec_list' => array( - 'data-href' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-facebook-comments', - ), - ), - ), - ), - 'amp-facebook-like' => array( - array( - 'attr_spec_list' => array( - 'data-href' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-facebook-like', - ), - ), - ), - ), - 'amp-facebook-page' => array( - array( - 'attr_spec_list' => array( - 'data-href' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-facebook-page', - ), - ), - ), - ), - 'amp-fit-text' => array( - array( - 'attr_spec_list' => array( - 'max-font-size' => array(), - 'media' => array(), - 'min-font-size' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-fit-text', - ), - ), - ), - ), - 'amp-font' => array( - array( - 'attr_spec_list' => array( - 'font-family' => array( - 'mandatory' => true, - ), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'on-error-add-class' => array(), - 'on-error-remove-class' => array(), - 'on-load-add-class' => array(), - 'on-load-remove-class' => array(), - 'timeout' => array( - 'value_regex' => '[0-9]+', - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-font', - ), - ), - ), - ), - 'amp-fx-flying-carpet' => array( - array( - 'attr_spec_list' => array( - 'height' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-fx-flying-carpet', - ), - ), - ), - ), - 'amp-geo' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-geo', - ), - 'unique' => true, - ), - ), - ), - 'amp-gfycat' => array( - array( - 'attr_spec_list' => array( - 'data-gfyid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noautoplay' => array( - 'value' => array( - '', - ), - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-gfycat', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-gfycat', - ), - ), - ), - 'amp-gist' => array( - array( - 'attr_spec_list' => array( - 'data-gistid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 3, - ), - ), - 'requires_extension' => array( - 'amp-gist', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-gist', - ), - ), - ), - 'amp-google-document-embed' => array( - array( - 'attr_spec_list' => array( - '[src]' => array(), - '[title]' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-google-document-embed', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-google-document-embed', - ), - ), - ), - 'amp-hulu' => array( - array( - 'attr_spec_list' => array( - 'data-eid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-hulu', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-hulu', - ), - ), - ), - 'amp-iframe' => array( - array( - 'attr_spec_list' => array( - '[src]' => array(), - 'allow' => array(), - 'allowfullscreen' => array( - 'value' => array( - '', - ), - ), - 'allowpaymentrequest' => array( - 'value' => array( - '', - ), - ), - 'allowtransparency' => array( - 'value' => array( - '', - ), - ), - 'frameborder' => array( - 'value' => array( - '0', - '1', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'referrerpolicy' => array(), - 'resizable' => array( - 'value' => array( - '', - ), - ), - 'sandbox' => array(), - 'scrolling' => array( - 'value' => array( - 'auto', - 'no', - 'yes', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'data', - 'https', - ), - ), - ), - 'srcdoc' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-iframe', - ), - ), - ), - ), - 'amp-ima-video' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'data-src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'data-tag' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-ima-video', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ima-video', - ), - ), - ), - 'amp-image-lightbox' => array( - array( - 'attr_spec_list' => array( - 'controls' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-image-lightbox', - ), - ), - ), - ), - 'amp-image-slider' => array( - array( - 'attr_spec_list' => array( - 'disable-hint-reappear' => array(), - 'initial-slider-position' => array( - 'value_regex' => '0(\\.[0-9]+)?|1(\\.0+)?', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'step-size' => array( - 'value_regex' => '0(\\.[0-9]+)?|1(\\.0+)?', - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 2, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-image-slider', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-image-slider', - ), - ), - ), - 'amp-img' => array( - array( - 'attr_spec_list' => array( - '[alt]' => array(), - '[attribution]' => array(), - '[src]' => array(), - '[srcset]' => array(), - 'alt' => array(), - 'attribution' => array(), - 'lightbox' => array(), - 'lightbox-thumbnail-id' => array( - 'value_regex_casei' => '^[a-z][a-z\\d_-]*', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'placeholder' => array(), - 'src' => array( - 'alternative_names' => array( - 'srcset', - ), - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'data', - 'http', - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-img', - ), - ), - ), - 'amp-imgur' => array( - array( - 'attr_spec_list' => array( - 'data-imgur-id' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-imgur', - ), - ), - ), - ), - 'amp-instagram' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'data-shortcode' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-instagram', - ), - ), - ), - ), - 'amp-install-serviceworker' => array( - array( - 'attr_spec_list' => array( - 'data-iframe-src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-install-serviceworker', - ), - ), - ), - ), - 'amp-izlesene' => array( - array( - 'attr_spec_list' => array( - 'data-videoid' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-izlesene', - ), - ), - ), - ), - 'amp-jwplayer' => array( - array( - 'attr_spec_list' => array( - 'data-media-id' => array( - 'value_regex_casei' => '[0-9a-z]{8}', - ), - 'data-player-id' => array( - 'mandatory' => true, - 'value_regex_casei' => '[0-9a-z]{8}', - ), - 'data-playlist-id' => array( - 'value_regex_casei' => '[0-9a-z]{8}', - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-jwplayer', - ), - ), - ), - ), - 'amp-kaltura-player' => array( - array( - 'attr_spec_list' => array( - 'data-partner' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-kaltura-player', - ), - ), - ), - ), - 'amp-layout' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - 5, - ), - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-layout', - ), - ), - ), - 'amp-lightbox' => array( - array( - 'attr_spec_list' => array( - '[open]' => array(), - 'animate-in' => array( - 'value_casei' => array( - 'fade-in', - 'fly-in-bottom', - 'fly-in-top', - ), - ), - 'controls' => array(), - 'from' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'scrollable' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-lightbox', - ), - ), - ), - ), - 'amp-list' => array( - array( - 'attr_spec_list' => array( - '[src]' => array(), - '[state]' => array(), - 'auto-resize' => array( - 'value' => array( - '', - ), - ), - 'binding' => array( - 'value' => array( - 'always', - 'no', - 'refresh', - ), - ), - 'credentials' => array(), - 'items' => array(), - 'max-items' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'reset-on-refresh' => array( - 'value' => array( - '', - 'always', - 'fetch', - ), - ), - 'single-item' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - 'template' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-list', - ), - ), - ), - ), - 'amp-live-list' => array( - array( - 'attr_spec_list' => array( - 'data-max-items-per-page' => array( - 'mandatory' => true, - 'value_regex' => '\\d+', - ), - 'data-poll-interval' => array( - 'value_regex' => '\\d{5,}', - ), - 'disabled' => array( - 'value' => array( - '', - ), - ), - 'id' => array( - 'mandatory' => true, - ), - 'sort' => array( - 'value' => array( - 'ascending', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 3, - ), - ), - 'reference_points' => array( - 'AMP-LIVE-LIST [items]' => array( - 'mandatory' => true, - 'unique' => true, - ), - 'AMP-LIVE-LIST [pagination]' => array( - 'mandatory' => false, - 'unique' => true, - ), - 'AMP-LIVE-LIST [update]' => array( - 'mandatory' => true, - 'unique' => true, - ), - ), - 'requires_extension' => array( - 'amp-live-list', - ), - ), - ), - ), - 'amp-mathml' => array( - array( - 'attr_spec_list' => array( - 'data-formula' => array( - 'mandatory' => true, - ), - 'inline' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - ), - ), - 'requires_extension' => array( - 'amp-mathml', - ), - ), - ), - ), - 'amp-mowplayer' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array(), - 'data-mediaid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-mowplayer', - ), - ), - ), - ), - 'amp-next-page' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'reference_points' => array( - 'AMP-NEXT-PAGE > [separator]' => array( - 'mandatory' => false, - 'unique' => true, - ), - 'amp-next-page extension .json configuration' => array( - 'mandatory' => true, - 'unique' => true, - ), - ), - 'requires_extension' => array( - 'amp-next-page', - ), - 'spec_name' => 'amp-next-page with inline config', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-next-page', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'reference_points' => array( - 'AMP-NEXT-PAGE > [separator]' => array( - 'mandatory' => false, - 'unique' => true, - ), - ), - 'requires_extension' => array( - 'amp-next-page', - ), - 'spec_name' => 'amp-next-page with src attribute', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-next-page', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'data-client' => array( - 'mandatory' => true, - ), - 'data-slot' => array( - 'mandatory' => true, - ), - 'type' => array( - 'mandatory' => true, - 'value' => array( - 'adsense', - ), - ), - ), - 'tag_spec' => array( - 'reference_points' => array( - 'AMP-NEXT-PAGE > [separator]' => array( - 'mandatory' => false, - 'unique' => true, - ), - ), - 'requires_extension' => array( - 'amp-next-page', - ), - 'spec_name' => 'amp-next-page [type=adsense]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-next-page', - 'unique' => true, - ), - ), - ), - 'amp-nexxtv-player' => array( - array( - 'attr_spec_list' => array( - 'data-client' => array( - 'mandatory' => true, - ), - 'data-mediaid' => array( - 'mandatory' => true, - 'value_regex' => '[^=/?:]+', - ), - 'data-mode' => array( - 'value' => array( - 'api', - 'static', - ), - ), - 'data-origin' => array( - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'https', - 'http', - ), - ), - ), - 'data-streamtype' => array( - 'value' => array( - 'album', - 'audio', - 'live', - 'playlist', - 'playlist-marked', - 'video', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-nexxtv-player', - ), - ), - ), - ), - 'amp-o2-player' => array( - array( - 'attr_spec_list' => array( - 'data-bcid' => array( - 'mandatory' => true, - ), - 'data-pid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-o2-player', - ), - ), - ), - ), - 'amp-ooyala-player' => array( - array( - 'attr_spec_list' => array( - 'data-embedcode' => array( - 'mandatory' => true, - ), - 'data-pcode' => array( - 'mandatory' => true, - ), - 'data-playerid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-ooyala-player', - ), - ), - ), - ), - 'amp-orientation-observer' => array( - array( - 'attr_spec_list' => array( - 'alpha-range' => array( - 'value_regex' => '(\\d+)\\s{1}(\\d+)', - ), - 'beta-range' => array( - 'value_regex' => '(\\d+)\\s{1}(\\d+)', - ), - 'gamma-range' => array( - 'value_regex' => '(\\d+)\\s{1}(\\d+)', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-orientation-observer', - ), - ), - ), - ), - 'amp-pan-zoom' => array( - array( - 'attr_spec_list' => array( - 'disable-double-tap' => array( - 'value' => array( - '', - ), - ), - 'initial-scale' => array( - 'value_regex' => '[0-9]+(\\.[0-9]+)?', - ), - 'initial-x' => array( - 'value_regex' => '[0-9]+', - ), - 'initial-y' => array( - 'value_regex' => '[0-9]+', - ), - 'max-scale' => array( - 'value_regex' => '[0-9]+(\\.[0-9]+)?', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'reset-on-resize' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 4, - ), - ), - 'requires_extension' => array( - 'amp-pan-zoom', - ), - ), - ), - ), - 'amp-pinterest' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'data-do' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-pinterest', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-pinterest', - ), - ), - ), - 'amp-pixel' => array( - array( - 'attr_spec_list' => array( - 'allow-ssr-img' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'referrerpolicy' => array( - 'value' => array( - 'no-referrer', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_empty' => true, - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'defines_default_height' => true, - 'defines_default_width' => true, - 'supported_layouts' => array( - 2, - 1, - ), - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-pixel', - ), - ), - ), - 'amp-playbuzz' => array( - array( - 'attr_spec_list' => array( - 'data-comments' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'data-item' => array(), - 'data-item-info' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'data-share-buttons' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'src' => array(), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 4, - 3, - ), - ), - 'requires_extension' => array( - 'amp-playbuzz', - ), - ), - ), - ), - 'amp-position-observer' => array( - array( - 'attr_spec_list' => array( - 'intersection-ratios' => array( - 'value_regex' => '^([0]*?\\.\\d*$|1$|0$)|([0]*?\\.\\d*|1|0)\\s{1}([0]*?\\.\\d*$|1$|0$)', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'once' => array( - 'value' => array( - '', - ), - ), - 'target' => array(), - 'viewport-margins' => array( - 'value_regex' => '^(\\d+$|\\d+px$|\\d+vh$)|((\\d+|\\d+px|\\d+vh)\\s{1}(\\d+$|\\d+px$|\\d+vh$))', - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-position-observer', - ), - ), - ), - ), - 'amp-powr-player' => array( - array( - 'attr_spec_list' => array( - '[data-referrer]' => array(), - 'autoplay' => array(), - 'data-account' => array( - 'mandatory' => true, - 'value_regex' => '[0-9a-zA-Z-]+', - ), - 'data-player' => array( - 'mandatory' => true, - 'value_regex' => '[0-9a-zA-Z-]+', - ), - 'data-terms' => array(), - 'data-video' => array( - 'value_regex' => '[0-9a-zA-Z-]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-powr-player', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-powr-player', - ), - ), - ), - 'amp-reach-player' => array( - array( - 'attr_spec_list' => array( - 'data-embed-id' => array( - 'mandatory' => true, - 'value_regex' => '[0-9a-z-]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-reach-player', - ), - ), - ), - ), - 'amp-reddit' => array( - array( - 'attr_spec_list' => array( - 'data-embedlive' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'data-embedparent' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'data-embedtype' => array( - 'mandatory' => true, - 'value_casei' => array( - 'comment', - 'post', - ), - ), - 'data-src' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-reddit', - ), - ), - ), - ), - 'amp-riddle-quiz' => array( - array( - 'attr_spec_list' => array( - 'data-riddle-id' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 4, - ), - ), - 'requires_extension' => array( - 'amp-riddle-quiz', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-riddle-quiz', - ), - ), - ), - 'amp-selector' => array( - array( - 'attr_spec_list' => array( - '[disabled]' => array(), - '[selected]' => array(), - 'disabled' => array( - 'value' => array( - '', - ), - ), - 'form' => array(), - 'keyboard-select-mode' => array( - 'value_casei' => array( - 'focus', - 'none', - 'select', - ), - ), - 'media' => array(), - 'multiple' => array( - 'value' => array( - '', - ), - ), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 1, - 4, - 5, - ), - ), - 'disallowed_ancestor' => array( - 'amp-selector', - ), - 'reference_points' => array( - 'AMP-SELECTOR child' => array( - 'mandatory' => false, - 'unique' => false, - ), - 'AMP-SELECTOR option' => array( - 'mandatory' => false, - 'unique' => false, - ), - ), - 'requires_extension' => array( - 'amp-selector', - ), - ), - ), - ), - 'amp-sidebar' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'side' => array( - 'value' => array( - 'left', - 'right', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'mandatory_parent' => 'body', - 'requires_extension' => array( - 'amp-sidebar', - ), - ), - ), - ), - 'amp-skimlinks' => array( - array( - 'attr_spec_list' => array( - 'custom-tracking-id' => array( - 'value_regex_casei' => '^.{0,50}$', - ), - 'excluded-domains' => array(), - 'link-selector' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'publisher-code' => array( - 'mandatory' => true, - 'value_regex_casei' => '^[0-9]+X[0-9]+$', - ), - 'tracking' => array( - 'value' => array( - 'false', - 'true', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-skimlinks', - ), - ), - ), - ), - 'amp-social-share' => array( - array( - 'attr_spec_list' => array( - 'data-share-endpoint' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'ftp', - 'http', - 'https', - 'mailto', - 'bbmi', - 'fb-messenger', - 'intent', - 'line', - 'skype', - 'sms', - 'snapchat', - 'tel', - 'tg', - 'threema', - 'viber', - 'whatsapp', - ), - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 5, - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-social-share', - ), - ), - ), - ), - 'amp-soundcloud' => array( - array( - 'attr_spec_list' => array( - 'data-color' => array( - 'value_regex_casei' => '([0-9a-f]{3}){1,2}', - ), - 'data-playlistid' => array( - 'value_regex' => '[0-9]+', - ), - 'data-secret-token' => array( - 'value_regex' => '[A-Za-z0-9_-]+', - ), - 'data-trackid' => array( - 'value_regex' => '[0-9]+', - ), - 'data-visual' => array( - 'value_casei' => array( - 'false', - 'true', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 3, - ), - ), - 'requires_extension' => array( - 'amp-soundcloud', - ), - ), - ), - ), - 'amp-springboard-player' => array( - array( - 'attr_spec_list' => array( - 'data-content-id' => array( - 'mandatory' => true, - ), - 'data-domain' => array( - 'mandatory' => true, - ), - 'data-items' => array( - 'mandatory' => true, - ), - 'data-mode' => array( - 'mandatory' => true, - 'value_casei' => array( - 'playlist', - 'video', - ), - ), - 'data-player-id' => array( - 'mandatory' => true, - 'value_regex_casei' => '[a-z0-9]+', - ), - 'data-site-id' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-springboard-player', - ), - ), - ), - ), - 'amp-state' => array( - array( - 'attr_spec_list' => array( - '[src]' => array(), - 'credentials' => array(), - 'id' => array( - 'mandatory' => true, - ), - 'overridable' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-bind', - ), - 'spec_name' => 'amp-state', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-bind', - ), - ), - ), - 'amp-sticky-ad' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'disallowed_ancestor' => array( - 'amp-app-banner', - ), - 'requires_extension' => array( - 'amp-sticky-ad', - ), - 'unique' => true, - ), - ), - ), - 'amp-story' => array( - array( - 'attr_spec_list' => array( - 'background-audio' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'bookend-config-src' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'poster-landscape-src' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'poster-portrait-src' => array( - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'poster-square-src' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'publisher' => array( - 'mandatory' => true, - ), - 'publisher-logo-src' => array( - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'standalone' => array( - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'title' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'body', - 'requires_extension' => array( - 'amp-story', - ), - ), - ), - ), - 'amp-story-access' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'type' => array( - 'value' => array( - 'blocking', - 'notification', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-story', - 'requires_extension' => array( - 'amp-access', - ), - ), - ), - ), - 'amp-story-auto-ads' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-story', - 'requires_extension' => array( - 'amp-story-auto-ads', - ), - 'spec_url' => 'https://github.com/ampproject/amphtml/blob/master/extensions/amp-story/amp-story-auto-ads.md', - 'unique' => true, - ), - ), - ), - 'amp-story-bookend' => array( - array( - 'attr_spec_list' => array( - 'layout' => array( - 'mandatory' => true, - 'value' => array( - 'nodisplay', - ), - ), - 'src' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'amp-story', - ), - ), - ), - 'amp-story-consent' => array( - array( - 'attr_spec_list' => array( - 'id' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'mandatory_parent' => 'amp-consent', - 'requires_extension' => array( - 'amp-consent', - 'amp-story', - ), - ), - ), - ), - 'amp-story-cta-layer' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory_ancestor' => 'amp-story-page', - 'reference_points' => array( - 'AMP-STORY-CTA-LAYER animate-in' => array( - 'mandatory' => false, - 'unique' => false, - ), - ), - ), - ), - ), - 'amp-story-grid-layer' => array( - array( - 'attr_spec_list' => array( - 'template' => array( - 'mandatory' => true, - 'value' => array( - 'fill', - 'horizontal', - 'thirds', - 'vertical', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'amp-story-page', - 'reference_points' => array( - 'AMP-STORY-GRID-LAYER animate-in' => array( - 'mandatory' => false, - 'unique' => false, - ), - 'AMP-STORY-GRID-LAYER default' => array( - 'mandatory' => false, - 'unique' => false, - ), - ), - ), - ), - ), - 'amp-story-page' => array( - array( - 'attr_spec_list' => array( - 'auto-advance-after' => array(), - 'background-audio' => array( - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'id' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-story', - 'requires_extension' => array( - 'amp-story', - ), - ), - ), - ), - 'amp-timeago' => array( - array( - 'attr_spec_list' => array( - '[datetime]' => array(), - '[title]' => array(), - 'cutoff' => array( - 'value_regex' => '\\d+', - ), - 'datetime' => array( - 'mandatory' => true, - 'value_regex' => '\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d(:[0-5]\\d(\\.\\d+)?)?(Z|[+-][0-1][0-9]:[0-5][0-9])', - ), - 'locale' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 2, - 3, - 4, - ), - ), - 'requires_extension' => array( - 'amp-timeago', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-timeago', - ), - ), - ), - 'amp-twitter' => array( - array( - 'attr_spec_list' => array( - 'data-cards' => array(), - 'data-conversation' => array(), - 'data-limit' => array(), - 'data-link-color' => array(), - 'data-momentid' => array( - 'value_regex' => '\\d+', - ), - 'data-theme' => array(), - 'data-timeline-id' => array( - 'value_regex' => '\\d+', - ), - 'data-timeline-owner-screen-name' => array(), - 'data-timeline-screen-name' => array(), - 'data-timeline-slug' => array(), - 'data-timeline-source-type' => array(), - 'data-timeline-url' => array( - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'data-timeline-user-id' => array( - 'value_regex' => '\\d+', - ), - 'data-tweetid' => array(), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-twitter', - ), - ), - ), - ), - 'amp-user-notification' => array( - array( - 'attr_spec_list' => array( - 'data-dismiss-href' => array( - 'value_url' => array( - 'allow_empty' => false, - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'data-show-if-href' => array( - 'value_url' => array( - 'allow_empty' => false, - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'enctype' => array( - 'value' => array( - 'application/x-www-form-urlencoded', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-user-notification', - ), - ), - ), - ), - 'amp-video' => array( - array( - 'attr_spec_list' => array( - '[album]' => array(), - '[alt]' => array(), - '[artist]' => array(), - '[artwork]' => array(), - '[attribution]' => array(), - '[controls]' => array(), - '[controlslist]' => array(), - '[loop]' => array(), - '[poster]' => array(), - '[preload]' => array(), - '[src]' => array(), - '[title]' => array(), - 'album' => array(), - 'alt' => array(), - 'artist' => array(), - 'artwork' => array(), - 'attribution' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'controls' => array( - 'value' => array( - '', - ), - ), - 'controlslist' => array(), - 'crossorigin' => array(), - 'disableremoteplayback' => array( - 'value' => array( - '', - ), - ), - 'dock' => array(), - 'lightbox' => array(), - 'lightbox-thumbnail-id' => array( - 'value_regex_casei' => '^[a-z][a-z\\d_-]*', - ), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'muted' => array( - 'value' => array( - '', - ), - ), - 'noaudio' => array( - 'value' => array( - '', - ), - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'placeholder' => array(), - 'poster' => array(), - 'preload' => array( - 'value' => array( - 'auto', - 'metadata', - 'none', - '', - ), - ), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'also_requires_tag_warning' => array( - 'amp-video extension .js script', - ), - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'disallowed_ancestor' => array( - 'amp-story', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video', - ), - ), - array( - 'attr_spec_list' => array( - '[album]' => array(), - '[alt]' => array(), - '[artist]' => array(), - '[artwork]' => array(), - '[attribution]' => array(), - '[controls]' => array(), - '[controlslist]' => array(), - '[loop]' => array(), - '[poster]' => array(), - '[preload]' => array(), - '[src]' => array(), - '[title]' => array(), - 'album' => array(), - 'alt' => array(), - 'artist' => array(), - 'artwork' => array(), - 'attribution' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'controls' => array( - 'value' => array( - '', - ), - ), - 'controlslist' => array(), - 'crossorigin' => array(), - 'disableremoteplayback' => array( - 'value' => array( - '', - ), - ), - 'dock' => array(), - 'loop' => array( - 'value' => array( - '', - ), - ), - 'media' => array(), - 'muted' => array( - 'value' => array( - '', - ), - ), - 'noaudio' => array( - 'value' => array( - '', - ), - ), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'placeholder' => array(), - 'poster' => array( - 'mandatory' => true, - ), - 'preload' => array( - 'value' => array( - 'auto', - 'metadata', - 'none', - '', - ), - ), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'mandatory_ancestor' => 'amp-story', - 'requires_extension' => array( - 'amp-video', - ), - 'spec_name' => 'amp-story >> amp-video', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video', - ), - ), - ), - 'amp-video-iframe' => array( - array( - 'attr_spec_list' => array( - 'album' => array(), - 'alt' => array(), - 'artist' => array(), - 'artwork' => array(), - 'attribution' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'implements-media-session' => array( - 'value' => array( - '', - ), - ), - 'implements-rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'lightbox' => array(), - 'lightbox-thumbnail-id' => array( - 'value_regex_casei' => '^[a-z][a-z\\d_-]*', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'poster' => array( - 'mandatory' => true, - ), - 'referrerpolicy' => array(), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-video-iframe', - ), - 'spec_name' => 'AMP-VIDEO-IFRAME[poster]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video-iframe', - ), - ), - array( - 'attr_spec_list' => array( - 'album' => array(), - 'alt' => array(), - 'artist' => array(), - 'artwork' => array(), - 'attribution' => array(), - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'implements-media-session' => array( - 'value' => array( - '', - ), - ), - 'implements-rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'lightbox' => array(), - 'lightbox-thumbnail-id' => array( - 'value_regex_casei' => '^[a-z][a-z\\d_-]*', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'referrerpolicy' => array(), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 9, - 1, - 4, - ), - ), - 'reference_points' => array( - 'AMP-VIDEO-IFRAME > [placeholder]' => array( - 'mandatory' => true, - 'unique' => true, - ), - ), - 'requires_extension' => array( - 'amp-video-iframe', - ), - 'spec_name' => 'AMP-VIDEO-IFRAME with [placeholder]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-video-iframe', - ), - ), - ), - 'amp-vimeo' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array( - 'value' => array( - '', - ), - ), - 'data-videoid' => array( - 'mandatory' => true, - 'value_regex' => '[0-9]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-vimeo', - ), - ), - ), - ), - 'amp-vine' => array( - array( - 'attr_spec_list' => array( - 'data-vineid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-vine', - ), - ), - ), - ), - 'amp-viqeo-player' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array(), - 'data-profileid' => array( - 'mandatory' => true, - 'value_regex' => '[0-9a-f]*', - ), - 'data-videoid' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-viqeo-player', - ), - ), - ), - ), - 'amp-vk' => array( - array( - 'attr_spec_list' => array( - 'data-embedtype' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 2, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-vk', - ), - ), - ), - ), - 'amp-web-push' => array( - array( - 'attr_spec_list' => array( - 'helper-iframe-url' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'id' => array( - 'mandatory' => true, - 'value' => array( - 'amp-web-push', - ), - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'permission-dialog-url' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - 'service-worker-url' => array( - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 1, - ), - ), - 'requires_extension' => array( - 'amp-web-push', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-web-push', - ), - ), - ), - 'amp-web-push-widget' => array( - array( - 'attr_spec_list' => array( - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'visibility' => array( - 'mandatory' => true, - 'value' => array( - 'blocked', - 'subscribed', - 'unsubscribed', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 2, - ), - ), - 'requires_extension' => array( - 'amp-web-push', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-web-push', - ), - ), - ), - 'amp-wistia-player' => array( - array( - 'attr_spec_list' => array( - 'data-media-hashed-id' => array( - 'mandatory' => true, - 'value_regex' => '[0-9a-zA-Z]+', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - 'rotate-to-fullscreen' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 4, - ), - ), - 'requires_extension' => array( - 'amp-wistia-player', - ), - ), - ), - ), - 'amp-yotpo' => array( - array( - 'attr_spec_list' => array( - 'data-app-key' => array( - 'mandatory' => true, - ), - 'data-widget-type' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-yotpo', - ), - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-yotpo', - ), - ), - ), - 'amp-youtube' => array( - array( - 'attr_spec_list' => array( - '[data-videoid]' => array(), - 'autoplay' => array(), - 'credentials' => array( - 'value_casei' => array( - 'include', - 'omit', - ), - ), - 'data-live-channelid' => array( - 'value_regex' => '[^=/?:]+', - ), - 'data-videoid' => array( - 'value_regex' => '[^=/?:]+', - ), - 'lightbox' => array(), - 'lightbox-thumbnail-id' => array( - 'value_regex_casei' => '^[a-z][a-z\\d_-]*', - ), - 'media' => array(), - 'noloading' => array( - 'value' => array( - '', - ), - ), - ), - 'tag_spec' => array( - 'amp_layout' => array( - 'supported_layouts' => array( - 6, - 2, - 3, - 7, - 1, - 4, - ), - ), - 'requires_extension' => array( - 'amp-youtube', - ), - ), - ), - ), - 'article' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'aside' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'audio' => array( - array( - 'attr_spec_list' => array( - 'autoplay' => array(), - 'controls' => array(), - 'loop' => array(), - 'muted' => array(), - 'preload' => array(), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'data', - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'noscript', - 'mandatory_ancestor_suggested_alternative' => 'amp-audio', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-audio', - ), - ), - ), - 'b' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'base' => array( - array( - 'attr_spec_list' => array( - 'href' => array( - 'value' => array( - '/', - ), - ), - 'target' => array( - 'value_casei' => array( - '_blank', - '_self', - '_top', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'unique' => true, - ), - ), - ), - 'bdi' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'bdo' => array( - array( - 'attr_spec_list' => array( - 'dir' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'big' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'blockquote' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - 'cite' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - ), - 'tag_spec' => array(), - ), - ), - 'body' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'html', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - ), - 'br' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'button' => array( - array( - 'attr_spec_list' => array( - '[disabled]' => array(), - '[type]' => array(), - '[value]' => array(), - 'disabled' => array( - 'value' => array( - '', - ), - ), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'role' => array(), - 'tabindex' => array(), - 'type' => array(), - 'value' => array(), - ), - 'tag_spec' => array(), - ), - array( - 'attr_spec_list' => array( - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'open-button' => array( - 'value' => array( - '', - ), - ), - 'role' => array(), - 'tabindex' => array(), - 'type' => array(), - 'value' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'amp-app-banner', - 'spec_name' => 'amp-app-banner button[open-button]', - ), - ), - ), - 'caption' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'center' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'circle' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'cx' => array(), - 'cy' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'r' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'cite' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'clippath' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'clippathunits' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'code' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'col' => array( - array( - 'attr_spec_list' => array( - 'span' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'colgroup' => array( - array( - 'attr_spec_list' => array( - 'span' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'data' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'datalist' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - ), - 'dd' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'defs' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'del' => array( - array( - 'attr_spec_list' => array( - 'cite' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'datetime' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'desc' => array( - array( - 'attr_spec_list' => array( - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'dfn' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'dir' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'div' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'verify-error' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [verify-error]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'template' => array( - 'mandatory' => true, - ), - 'verify-error' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [verify-error][template]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submitting' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submitting]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submitting' => array( - 'mandatory' => true, - ), - 'template' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submitting][template]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submit-success' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submit-success]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submit-success' => array( - 'mandatory' => true, - ), - 'template' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submit-success][template]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submit-error' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submit-error]', - ), - ), - array( - 'attr_spec_list' => array( - 'align' => array(), - 'submit-error' => array( - 'mandatory' => true, - ), - 'template' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form', - 'spec_name' => 'FORM DIV [submit-error][template]', - ), - ), - array( - 'attr_spec_list' => array( - 'first' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-image-slider', - 'spec_name' => 'AMP-IMAGE-SLIDER > DIV [first]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-image-slider', - ), - ), - array( - 'attr_spec_list' => array( - 'second' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-image-slider', - 'spec_name' => 'AMP-IMAGE-SLIDER > DIV [second]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-image-slider', - ), - ), - ), - 'dl' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'dt' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'ellipse' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'cx' => array(), - 'cy' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'rx' => array(), - 'ry' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'em' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'fecolormatrix' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'in' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'type' => array(), - 'unicode-bidi' => array(), - 'values' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'fecomposite' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'in' => array(), - 'in2' => array(), - 'k1' => array(), - 'k2' => array(), - 'k3' => array(), - 'k4' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'operator' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'feflood' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'fegaussianblur' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'edgemode' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'in' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stddeviation' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'femerge' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'femergenode' => array( - array( - 'attr_spec_list' => array( - 'in' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'feoffset' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'dx' => array(), - 'dy' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'in' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'result' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'fieldset' => array( - array( - 'attr_spec_list' => array( - '[disabled]' => array(), - 'disabled' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - ), - 'tag_spec' => array(), - ), - ), - 'figcaption' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'figure' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'filter' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'filterres' => array(), - 'filterunits' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'primitiveunits' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'footer' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'form' => array( - array( - 'attr_spec_list' => array( - 'accept' => array(), - 'accept-charset' => array(), - 'action' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - 'action-xhr' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - 'autocomplete' => array(), - 'custom-validation-reporting' => array( - 'value' => array( - 'as-you-go', - 'interact-and-submit', - 'show-all-on-submit', - 'show-first-on-submit', - ), - ), - 'enctype' => array(), - 'method' => array( - 'value_casei' => array( - 'get', - ), - ), - 'name' => array(), - 'novalidate' => array(), - 'target' => array( - 'mandatory' => true, - 'value_casei' => array( - '_blank', - '_top', - ), - ), - 'verify-xhr' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'amp-app-banner', - ), - 'requires_extension' => array( - 'amp-form', - ), - 'spec_name' => 'FORM [method=GET]', - ), - ), - array( - 'attr_spec_list' => array( - 'accept' => array(), - 'accept-charset' => array(), - 'action-xhr' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - 'autocomplete' => array(), - 'custom-validation-reporting' => array( - 'value' => array( - 'as-you-go', - 'interact-and-submit', - 'show-all-on-submit', - 'show-first-on-submit', - ), - ), - 'enctype' => array(), - 'method' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'post', - ), - ), - 'name' => array(), - 'novalidate' => array(), - 'target' => array( - 'value_casei' => array( - '_blank', - '_top', - ), - ), - 'verify-xhr' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - ), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'amp-app-banner', - ), - 'requires_extension' => array( - 'amp-form', - ), - 'spec_name' => 'FORM [method=POST]', - ), - ), - ), - 'g' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'glyph' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'arabic-form' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'd' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-name' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'horiz-adv-x' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'orientation' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'vert-adv-y' => array(), - 'vert-origin-x' => array(), - 'vert-origin-y' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'glyphref' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'dx' => array(), - 'dy' => array(), - 'enable-background' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'format' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'glyphref' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'h1' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'h2' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'h3' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'h4' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'h5' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'h6' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'head' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'html', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - ), - 'header' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'hgroup' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'hkern' => array( - array( - 'attr_spec_list' => array( - 'g1' => array(), - 'g2' => array(), - 'k' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'u1' => array(), - 'u2' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'hr' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'html' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => '!doctype', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - ), - 'i' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'iframe' => array( - array( - 'attr_spec_list' => array( - 'frameborder' => array( - 'value' => array( - '0', - '1', - ), - ), - 'height' => array(), - 'name' => array(), - 'referrerpolicy' => array(), - 'resizable' => array( - 'value' => array( - '', - ), - ), - 'sandbox' => array(), - 'scrolling' => array( - 'value' => array( - 'auto', - 'yes', - 'no', - ), - ), - 'src' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_relative' => false, - 'protocol' => array( - 'data', - 'https', - ), - ), - ), - 'srcdoc' => array(), - 'width' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'noscript', - 'mandatory_ancestor_suggested_alternative' => 'amp-iframe', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-iframe', - ), - ), - ), - 'image' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'preserveaspectratio' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'blacklisted_value_regex' => '(^|\\s)data:image\\/svg\\+xml', - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'data', - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'img' => array( - array( - 'attr_spec_list' => array( - 'alt' => array(), - 'attribution' => array(), - 'border' => array(), - 'decoding' => array( - 'value' => array( - 'async', - 'auto', - 'sync', - ), - ), - 'height' => array(), - 'ismap' => array(), - 'longdesc' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'sizes' => array(), - 'src' => array( - 'alternative_names' => array( - 'srcset', - ), - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'allow_relative' => true, - 'protocol' => array( - 'data', - 'https', - ), - ), - ), - 'width' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'noscript', - 'mandatory_ancestor_suggested_alternative' => 'amp-img', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-img', - ), - ), - ), - 'input' => array( - array( - 'attr_spec_list' => array( - '[accept]' => array(), - '[accesskey]' => array(), - '[autocomplete]' => array(), - '[checked]' => array(), - '[disabled]' => array(), - '[height]' => array(), - '[inputmode]' => array(), - '[max]' => array(), - '[maxlength]' => array(), - '[min]' => array(), - '[minlength]' => array(), - '[multiple]' => array(), - '[pattern]' => array(), - '[placeholder]' => array(), - '[readonly]' => array(), - '[required]' => array(), - '[selectiondirection]' => array(), - '[size]' => array(), - '[spellcheck]' => array(), - '[step]' => array(), - '[type]' => array(), - '[value]' => array(), - '[width]' => array(), - 'accept' => array(), - 'accesskey' => array(), - 'autocomplete' => array(), - 'autofocus' => array(), - 'checked' => array(), - 'disabled' => array(), - 'height' => array(), - 'inputmode' => array(), - 'list' => array(), - 'max' => array(), - 'maxlength' => array(), - 'min' => array(), - 'minlength' => array(), - 'multiple' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'no-verify' => array( - 'value' => array( - '', - ), - ), - 'pattern' => array(), - 'placeholder' => array(), - 'readonly' => array(), - 'required' => array(), - 'selectiondirection' => array(), - 'size' => array(), - 'spellcheck' => array(), - 'step' => array(), - 'tabindex' => array(), - 'type' => array( - 'blacklisted_value_regex' => '(^|\\s)(button|file|image|password|)(\\s|$)', - ), - 'value' => array(), - 'width' => array(), - ), - 'tag_spec' => array( - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - array( - 'attr_spec_list' => array( - '[accept]' => array(), - '[accesskey]' => array(), - '[autocomplete]' => array(), - '[checked]' => array(), - '[disabled]' => array(), - '[height]' => array(), - '[inputmode]' => array(), - '[max]' => array(), - '[maxlength]' => array(), - '[min]' => array(), - '[minlength]' => array(), - '[multiple]' => array(), - '[pattern]' => array(), - '[placeholder]' => array(), - '[readonly]' => array(), - '[required]' => array(), - '[selectiondirection]' => array(), - '[size]' => array(), - '[spellcheck]' => array(), - '[step]' => array(), - '[value]' => array(), - '[width]' => array(), - 'accept' => array(), - 'accesskey' => array(), - 'autocomplete' => array(), - 'autofocus' => array(), - 'checked' => array(), - 'disabled' => array(), - 'height' => array(), - 'inputmode' => array(), - 'list' => array(), - 'max' => array(), - 'maxlength' => array(), - 'min' => array(), - 'minlength' => array(), - 'multiple' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'no-verify' => array( - 'value' => array( - '', - ), - ), - 'pattern' => array(), - 'placeholder' => array(), - 'readonly' => array(), - 'required' => array(), - 'selectiondirection' => array(), - 'size' => array(), - 'spellcheck' => array(), - 'step' => array(), - 'tabindex' => array(), - 'type' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'file', - ), - ), - 'value' => array(), - 'width' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form [method=post]', - 'spec_name' => 'INPUT [type=file]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - array( - 'attr_spec_list' => array( - '[accept]' => array(), - '[accesskey]' => array(), - '[autocomplete]' => array(), - '[checked]' => array(), - '[disabled]' => array(), - '[height]' => array(), - '[inputmode]' => array(), - '[max]' => array(), - '[maxlength]' => array(), - '[min]' => array(), - '[minlength]' => array(), - '[multiple]' => array(), - '[pattern]' => array(), - '[placeholder]' => array(), - '[readonly]' => array(), - '[required]' => array(), - '[selectiondirection]' => array(), - '[size]' => array(), - '[spellcheck]' => array(), - '[step]' => array(), - '[value]' => array(), - '[width]' => array(), - 'accept' => array(), - 'accesskey' => array(), - 'autocomplete' => array(), - 'autofocus' => array(), - 'checked' => array(), - 'disabled' => array(), - 'height' => array(), - 'inputmode' => array(), - 'list' => array(), - 'max' => array(), - 'maxlength' => array(), - 'min' => array(), - 'minlength' => array(), - 'multiple' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'pattern' => array(), - 'placeholder' => array(), - 'readonly' => array(), - 'required' => array(), - 'selectiondirection' => array(), - 'size' => array(), - 'spellcheck' => array(), - 'step' => array(), - 'tabindex' => array(), - 'type' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'password', - ), - ), - 'value' => array(), - 'width' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'form [method=post]', - 'spec_name' => 'INPUT [type=password]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - array( - 'attr_spec_list' => array( - '[accept]' => array(), - '[accesskey]' => array(), - '[autocomplete]' => array(), - '[checked]' => array(), - '[disabled]' => array(), - '[height]' => array(), - '[inputmode]' => array(), - '[max]' => array(), - '[maxlength]' => array(), - '[min]' => array(), - '[minlength]' => array(), - '[multiple]' => array(), - '[pattern]' => array(), - '[placeholder]' => array(), - '[readonly]' => array(), - '[required]' => array(), - '[selectiondirection]' => array(), - '[size]' => array(), - '[spellcheck]' => array(), - '[step]' => array(), - '[type]' => array(), - '[value]' => array(), - '[width]' => array(), - 'accept' => array(), - 'accesskey' => array(), - 'autocomplete' => array(), - 'autofocus' => array(), - 'checked' => array(), - 'disabled' => array(), - 'height' => array(), - 'inputmode' => array(), - 'list' => array(), - 'mask' => array( - 'dispatch_key' => 1, - 'mandatory' => true, - ), - 'mask-output' => array(), - 'max' => array(), - 'maxlength' => array(), - 'min' => array(), - 'minlength' => array(), - 'multiple' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - 'pattern' => array(), - 'placeholder' => array(), - 'readonly' => array(), - 'required' => array(), - 'selectiondirection' => array(), - 'size' => array(), - 'spellcheck' => array(), - 'step' => array(), - 'tabindex' => array(), - 'type' => array( - 'value' => array( - 'text', - 'tel', - 'search', - ), - ), - 'value' => array(), - 'width' => array(), - ), - 'tag_spec' => array( - 'requires_extension' => array( - 'amp-inputmask', - ), - 'spec_name' => 'input [mask]', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-inputmask', - ), - ), - ), - 'ins' => array( - array( - 'attr_spec_list' => array( - 'cite' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'datetime' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'kbd' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'label' => array( - array( - 'attr_spec_list' => array( - 'for' => array(), - ), - 'tag_spec' => array( - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - ), - 'legend' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'li' => array( - array( - 'attr_spec_list' => array( - 'value' => array( - 'value_regex' => '[0-9]*', - ), - ), - 'tag_spec' => array(), - ), - ), - 'line' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x1' => array(), - 'x2' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y1' => array(), - 'y2' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'lineargradient' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'gradienttransform' => array(), - 'gradientunits' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'shape-rendering' => array(), - 'spreadmethod' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x1' => array(), - 'x2' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y1' => array(), - 'y2' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'link' => array( - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array(), - 'hreflang' => array(), - 'media' => array(), - 'rel' => array( - 'blacklisted_value_regex' => '(^|\\s)(canonical|components|import|manifest|preload|serviceworker|stylesheet|subresource|)(\\s|$)', - 'mandatory' => true, - ), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'template', - ), - 'spec_name' => 'link rel=', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'hreflang' => array(), - 'media' => array(), - 'rel' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'canonical', - ), - ), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'head', - 'spec_name' => 'link rel=canonical', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - 'hreflang' => array(), - 'media' => array(), - 'rel' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'manifest', - ), - ), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'link rel=manifest', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'as' => array(), - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array(), - 'hreflang' => array(), - 'media' => array(), - 'rel' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'preload', - ), - ), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'template', - ), - 'spec_name' => 'link rel=preload', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'async' => array(), - 'crossorigin' => array(), - 'href' => array( - 'mandatory' => true, - 'value_regex' => 'https://cdn\\.materialdesignicons\\.com/([0-9]+\\.?)+/css/materialdesignicons\\.min\\.css|https://cloud\\.typography\\.com/[0-9]*/[0-9]*/css/fonts\\.css|https://fast\\.fonts\\.net/.*|https://fonts\\.googleapis\\.com/css\\?.*|https://fonts\\.googleapis\\.com/icon\\?.*|https://fonts\\.googleapis\\.com/earlyaccess/.*\\.css|https://maxcdn\\.bootstrapcdn\\.com/font-awesome/([0-9]+\\.?)+/css/font-awesome\\.min\\.css(\\?.*)?|https://(use|pro)\\.fontawesome\\.com/releases/v([0-9]+\\.?)+/css/(all|brands|solid|regular|light|fontawesome)\\.css|https://(use|pro)\\.fontawesome\\.com/[0-9a-zA-Z]+\\.css|https://use\\.typekit\\.net/[\\w\\p{L}\\p{N}_]+\\.css', - ), - 'integrity' => array(), - 'media' => array(), - 'rel' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'stylesheet', - ), - ), - 'type' => array( - 'value_casei' => array( - 'text/css', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'link rel=stylesheet for fonts', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#custom-fonts', - ), - ), - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array( - 'mandatory' => true, - ), - 'hreflang' => array(), - 'itemprop' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'sameas', - ), - ), - 'media' => array(), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'spec_name' => 'link itemprop=sameAs', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array( - 'mandatory' => true, - ), - 'hreflang' => array(), - 'itemprop' => array( - 'mandatory' => true, - ), - 'media' => array(), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'spec_name' => 'link itemprop=', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'charset' => array( - 'value_casei' => array( - 'utf-8', - ), - ), - 'color' => array(), - 'crossorigin' => array(), - 'href' => array( - 'mandatory' => true, - ), - 'hreflang' => array(), - 'media' => array(), - 'property' => array( - 'mandatory' => true, - ), - 'sizes' => array(), - 'target' => array(), - 'type' => array(), - ), - 'tag_spec' => array( - 'spec_name' => 'link property=', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - ), - 'listing' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'main' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'mark' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'marker' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'markerheight' => array(), - 'markerunits' => array(), - 'markerwidth' => array(), - 'mask' => array(), - 'opacity' => array(), - 'orient' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'preserveaspectratio' => array(), - 'refx' => array(), - 'refy' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'viewbox' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'mask' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'maskcontentunits' => array(), - 'maskunits' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'meta' => array( - array( - 'attr_spec_list' => array( - 'charset' => array( - 'dispatch_key' => 1, - 'mandatory' => true, - 'value_casei' => array( - 'utf-8', - ), - ), - ), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'head', - 'spec_name' => 'meta charset=utf-8', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_properties' => array( - 'height' => array(), - 'initial-scale' => array(), - 'maximum-scale' => array(), - 'minimum-scale' => array(), - 'shrink-to-fit' => array(), - 'user-scalable' => array(), - 'viewport-fit' => array(), - 'width' => array( - 'mandatory' => true, - 'value' => 'device-width', - ), - ), - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value' => array( - 'viewport', - ), - ), - ), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=viewport', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_properties' => array( - 'chrome' => array( - 'value' => '1', - ), - 'ie' => array( - 'value' => 'edge', - ), - ), - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'x-ua-compatible', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=X-UA-Compatible', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_regex' => '.*app-id=.*', - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'apple-itunes-app', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=apple-itunes-app', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-experiments-opt-in', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-experiments-opt-in', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_url' => array( - 'protocol' => array( - 'https', - ), - ), - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-3p-iframe-src', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-3p-iframe-src', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-ad', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-experiment-token', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-experiment-token', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-link-variable-allowed-origin', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-link-variable-allowed-origin', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-google-client-id-api', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-google-clientid-id-api', - ), - ), - array( - 'attr_spec_list' => array( - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-ad-doubleclick-sra', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-ad-doubleclick-sra', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array(), - 'itemprop' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(amp-.*|amp4ads-.*|apple-itunes-app|content-disposition|revisit-after|viewport)(\\s|$)', - ), - 'property' => array(), - 'scheme' => array(), - ), - 'tag_spec' => array( - 'spec_name' => 'meta name= and content=', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_casei' => array( - 'text/html; charset=utf-8', - ), - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'content-type', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=Content-Type', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'content-language', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=content-language', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'pics-label', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=pics-label', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'imagetoolbar', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=imagetoolbar', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_casei' => array( - 'text/css', - ), - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'content-style-type', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=Content-Style-Type', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_casei' => array( - 'text/javascript', - ), - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'content-script-type', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=Content-Script-Type', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'origin-trial', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=origin-trial', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'resource-type', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=resource-type', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - 'value_casei' => array( - 'off', - 'on', - ), - ), - 'http-equiv' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'x-dns-prefetch-control', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta http-equiv=x-dns-prefetch-control', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#html-tags', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-ad-enable-refresh', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'head', - 'spec_name' => 'meta name=amp-ad-enable-refresh', - ), - ), - array( - 'attr_spec_list' => array( - 'content' => array( - 'mandatory' => true, - ), - 'name' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'amp-to-amp-navigation', - ), - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'head', - 'spec_name' => 'meta name=amp-to-amp-navigation', - 'unique' => true, - ), - ), - ), - 'metadata' => array( - array( - 'attr_spec_list' => array( - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'meter' => array( - array( - 'attr_spec_list' => array( - 'high' => array(), - 'low' => array(), - 'max' => array(), - 'min' => array(), - 'optimum' => array(), - 'value' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'multicol' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'nav' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - array( - 'attr_spec_list' => array( - 'toolbar' => array( - 'dispatch_key' => 1, - 'mandatory' => true, - ), - 'toolbar-target' => array( - 'mandatory' => true, - ), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'amp-sidebar', - 'spec_name' => 'amp-sidebar > nav', - ), - ), - ), - 'nextid' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'nobr' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'noscript' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'head', - 'spec_name' => 'noscript enclosure for boilerplate', - 'spec_url' => 'https://github.com/ampproject/amphtml/blob/master/spec/amp-boilerplate.md', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'disallowed_ancestor' => array( - 'noscript', - ), - 'mandatory_ancestor' => 'body', - ), - ), - ), - 'o:p' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'ol' => array( - array( - 'attr_spec_list' => array( - 'reversed' => array( - 'value' => array( - '', - ), - ), - 'start' => array( - 'value_regex' => '[0-9]*', - ), - 'type' => array( - 'value_regex' => '[1AaIi]', - ), - ), - 'tag_spec' => array(), - ), - ), - 'optgroup' => array( - array( - 'attr_spec_list' => array( - '[disabled]' => array(), - '[label]' => array(), - 'disabled' => array(), - 'label' => array(), - ), - 'tag_spec' => array( - 'mandatory_parent' => 'select', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - ), - 'option' => array( - array( - 'attr_spec_list' => array( - '[disabled]' => array(), - '[label]' => array(), - '[selected]' => array(), - '[value]' => array(), - 'disabled' => array(), - 'label' => array(), - 'selected' => array(), - 'value' => array(), - ), - 'tag_spec' => array( - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-form', - ), - ), - ), - 'output' => array( - array( - 'attr_spec_list' => array( - 'for' => array(), - 'form' => array(), - 'name' => array( - 'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)', - ), - ), - 'tag_spec' => array(), - ), - ), - 'p' => array( - array( - 'attr_spec_list' => array( - 'align' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'path' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'd' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pathlength' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'pattern' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'patterncontentunits' => array(), - 'patterntransform' => array(), - 'patternunits' => array(), - 'pointer-events' => array(), - 'preserveaspectratio' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'viewbox' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'picture' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array( - 'mandatory_parent' => 'noscript', - 'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-img', - ), - ), - ), - 'polygon' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'points' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'polyline' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'points' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'pre' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'progress' => array( - array( - 'attr_spec_list' => array( - 'max' => array(), - 'value' => array(), - ), - 'tag_spec' => array(), - ), - ), - 'q' => array( - array( - 'attr_spec_list' => array( - 'cite' => array( - 'blacklisted_value_regex' => '__amp_source_origin', - 'value_url' => array( - 'allow_empty' => true, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - ), - 'tag_spec' => array(), - ), - ), - 'radialgradient' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'cx' => array(), - 'cy' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'fr' => array(), - 'fx' => array(), - 'fy' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'gradienttransform' => array(), - 'gradientunits' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'r' => array(), - 'shape-rendering' => array(), - 'spreadmethod' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'xlink:actuate' => array(), - 'xlink:arcrole' => array(), - 'xlink:href' => array( - 'alternative_names' => array( - 'href', - ), - 'value_url' => array( - 'allow_empty' => false, - 'protocol' => array( - 'http', - 'https', - ), - ), - ), - 'xlink:role' => array(), - 'xlink:show' => array(), - 'xlink:title' => array(), - 'xlink:type' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'rb' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'rect' => array( - array( - 'attr_spec_list' => array( - 'alignment-baseline' => array(), - 'baseline-shift' => array(), - 'clip' => array(), - 'clip-path' => array(), - 'clip-rule' => array(), - 'color' => array(), - 'color-interpolation' => array(), - 'color-interpolation-filters' => array(), - 'color-profile' => array(), - 'color-rendering' => array(), - 'cursor' => array(), - 'direction' => array(), - 'display' => array(), - 'dominant-baseline' => array(), - 'enable-background' => array(), - 'externalresourcesrequired' => array(), - 'fill' => array(), - 'fill-opacity' => array(), - 'fill-rule' => array(), - 'filter' => array(), - 'flood-color' => array(), - 'flood-opacity' => array(), - 'focusable' => array(), - 'font-family' => array(), - 'font-size' => array(), - 'font-size-adjust' => array(), - 'font-stretch' => array(), - 'font-style' => array(), - 'font-variant' => array(), - 'font-weight' => array(), - 'glyph-orientation-horizontal' => array(), - 'glyph-orientation-vertical' => array(), - 'height' => array(), - 'image-rendering' => array(), - 'kerning' => array(), - 'letter-spacing' => array(), - 'lighting-color' => array(), - 'marker-end' => array(), - 'marker-mid' => array(), - 'marker-start' => array(), - 'mask' => array(), - 'opacity' => array(), - 'overflow' => array(), - 'pointer-events' => array(), - 'requiredextensions' => array(), - 'requiredfeatures' => array(), - 'rx' => array(), - 'ry' => array(), - 'shape-rendering' => array(), - 'sketch:type' => array(), - 'stop-color' => array(), - 'stop-opacity' => array(), - 'stroke' => array(), - 'stroke-dasharray' => array(), - 'stroke-dashoffset' => array(), - 'stroke-linecap' => array(), - 'stroke-linejoin' => array(), - 'stroke-miterlimit' => array(), - 'stroke-opacity' => array(), - 'stroke-width' => array(), - 'style' => array( - 'blacklisted_value_regex' => '!important', - ), - 'systemlanguage' => array(), - 'text-anchor' => array(), - 'text-decoration' => array(), - 'text-rendering' => array(), - 'transform' => array(), - 'unicode-bidi' => array(), - 'vector-effect' => array(), - 'visibility' => array(), - 'width' => array(), - 'word-spacing' => array(), - 'writing-mode' => array(), - 'x' => array(), - 'xml:lang' => array(), - 'xml:space' => array(), - 'xmlns' => array(), - 'xmlns:xlink' => array(), - 'y' => array(), - ), - 'tag_spec' => array( - 'mandatory_ancestor' => 'svg', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#svg', - ), - ), - ), - 'rp' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'rt' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'rtc' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'ruby' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 's' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'samp' => array( - array( - 'attr_spec_list' => array(), - 'tag_spec' => array(), - ), - ), - 'script' => array( - array( - 'attr_spec_list' => array( - 'async' => array( - 'mandatory' => true, - 'value' => array( - '', - ), - ), - 'nonce' => array(), - 'src' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value' => array( - 'https://cdn.ampproject.org/v0.js', - ), - ), - 'type' => array( - 'value_casei' => array( - 'text/javascript', - ), - ), - ), - 'cdata' => array( - 'blacklisted_cdata_regex' => array( - 'error_message' => 'contents', - 'regex' => '.', - ), - ), - 'tag_spec' => array( - 'mandatory' => true, - 'mandatory_parent' => 'head', - 'spec_name' => 'amphtml engine v0.js script', - 'spec_url' => 'https://www.ampproject.org/docs/reference/spec#required-markup', - 'unique' => true, - ), - ), - array( - 'attr_spec_list' => array( - 'nonce' => array(), - 'type' => array( - 'dispatch_key' => 2, - 'mandatory' => true, - 'value_casei' => array( - 'application/ld+json', - ), - ), - ), - 'cdata' => array( - 'blacklisted_cdata_regex' => array( - 'error_message' => 'html comments', - 'regex' => '