src/Facebook/InstantArticles/Transformer/Rules/InteractiveRule.php (104 lines of code) (raw):

<?php /** * Copyright (c) 2016-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the license found in the * LICENSE file in the root directory of this source tree. */ namespace Facebook\InstantArticles\Transformer\Rules; use Facebook\InstantArticles\Elements\Interactive; use Facebook\InstantArticles\Elements\Paragraph; use Facebook\InstantArticles\Elements\InstantArticle; use Facebook\InstantArticles\Transformer\Transformer; use Facebook\InstantArticles\Transformer\Warnings\InvalidSelector; use Facebook\InstantArticles\Validators\Type; class InteractiveRule extends ConfigurationSelectorRule { const PROPERTY_IFRAME = 'interactive.iframe'; const PROPERTY_URL = 'interactive.url'; const PROPERTY_WIDTH_NO_MARGIN = Interactive::NO_MARGIN; const PROPERTY_WIDTH_COLUMN_WIDTH = Interactive::COLUMN_WIDTH; const PROPERTY_HEIGHT = 'interactive.height'; const PROPERTY_WIDTH = 'interactive.width'; public function getContextClass() { return [ InstantArticle::getClassName(), Paragraph::getClassName() ]; } public static function create() { return new static(); } public static function createFrom($configuration) { $interactive_rule = static::create(); $interactive_rule->withSelector($configuration['selector']); $interactive_rule->withProperties( [ self::PROPERTY_IFRAME, self::PROPERTY_URL, self::PROPERTY_WIDTH_NO_MARGIN, self::PROPERTY_WIDTH_COLUMN_WIDTH, self::PROPERTY_WIDTH, self::PROPERTY_HEIGHT ], $configuration ); return $interactive_rule; } public function apply($transformer, $context, $node) { $interactive = Interactive::create(); if (Type::is($context, InstantArticle::getClassName())) { $instant_article = $context; } elseif ($transformer->getInstantArticle()) { $instant_article = $transformer->getInstantArticle(); $context->disableEmptyValidation(); $context = Paragraph::create(); $context->disableEmptyValidation(); } else { $transformer->addWarning( // This new error message should be something like: // Could not transform Image, as no root InstantArticle was provided. new NoRootInstantArticleFoundWarning(null, $node) ); return $context; } // Builds the interactive $iframe = $this->getProperty(self::PROPERTY_IFRAME, $node); $url = $this->getProperty(self::PROPERTY_URL, $node); if ($iframe) { $interactive->withHTML(Transformer::cloneNode($iframe)); } if ($url) { $interactive->withSource($url); } if ($iframe || $url) { $instant_article->addChild($interactive); if ($instant_article !== $context) { $instant_article->addChild($context); } } else { $transformer->addWarning( new InvalidSelector( self::PROPERTY_IFRAME, $instant_article, $node, $this ) ); } if ($this->getProperty(self::PROPERTY_WIDTH_COLUMN_WIDTH, $node)) { $interactive->withMargin(Interactive::COLUMN_WIDTH); } else { $interactive->withMargin(Interactive::NO_MARGIN); } $width = $this->getProperty(self::PROPERTY_WIDTH, $node); if ($width) { $interactive->withWidth($width); } $height = $this->getProperty(self::PROPERTY_HEIGHT, $node); if ($height) { $interactive->withHeight($height); } $suppress_warnings = $transformer->suppress_warnings; $transformer->suppress_warnings = true; $transformer->transform($interactive, $node); $transformer->suppress_warnings = $suppress_warnings; return $context; } }