diff --git a/Magento2/Sniffs/Legacy/WidgetXMLSniff.php b/Magento2/Sniffs/Legacy/WidgetXMLSniff.php new file mode 100644 index 00000000..efd62aee --- /dev/null +++ b/Magento2/Sniffs/Legacy/WidgetXMLSniff.php @@ -0,0 +1,114 @@ + 0) { + return; + } + + $xml = simplexml_load_string($this->getFormattedXML($phpcsFile)); + + if ($xml === false) { + $this->invalidXML($phpcsFile, $stackPtr); + return; + } + + $foundElements = $xml->xpath('/widgets/*[@type]'); + + foreach ($foundElements as $element) { + if (!property_exists($element->attributes(), 'type')) { + continue; + } + $type = $element['type']; + if (preg_match('/\//', $type)) { + $phpcsFile->addError( + "Factory name detected: {$type}.", + dom_import_simplexml($element)->getLineNo() - 1, + self::ERROR_CODE_FACTORY + ); + } + } + + $foundElements = $xml->xpath('/widgets/*/supported_blocks'); + foreach ($foundElements as $element) { + $phpcsFile->addError( + "Obsolete node: . To be replaced with ", + dom_import_simplexml($element)->getLineNo() - 1, + self::ERROR_CODE_OBSOLETE + ); + } + + $foundElements = $xml->xpath('/widgets/*/*/*/block_name'); + foreach ($foundElements as $element) { + $phpcsFile->addError( + "Obsolete node: . To be replaced with ", + dom_import_simplexml($element)->getLineNo() - 1, + self::ERROR_CODE_OBSOLETE + ); + } + } + + /** + * Adds an invalid XML error + * + * @param File $phpcsFile + * @param int $stackPtr + */ + protected function invalidXML(File $phpcsFile, int $stackPtr): void + { + $phpcsFile->addError( + sprintf( + "Couldn't parse contents of '%s', check that they are in valid XML format", + $phpcsFile->getFilename(), + ), + $stackPtr, + self::ERROR_CODE_XML + ); + } + + /** + * Format the incoming XML to avoid tags split into several lines. + * + * @param File $phpcsFile + * @return false|string + */ + private function getFormattedXML(File $phpcsFile) + { + $doc = new DomDocument('1.0'); + $doc->formatOutput = true; + $doc->loadXML($phpcsFile->getTokensAsString(0, 999999)); + return $doc->saveXML(); + } +} diff --git a/Magento2/Tests/Legacy/WidgetXMLUnitTest.1.xml b/Magento2/Tests/Legacy/WidgetXMLUnitTest.1.xml new file mode 100644 index 00000000..9c70a9cf --- /dev/null +++ b/Magento2/Tests/Legacy/WidgetXMLUnitTest.1.xml @@ -0,0 +1,19 @@ + + + + + + List of Products that are set as New + Deprecated + + Deprecated + + + + + diff --git a/Magento2/Tests/Legacy/WidgetXMLUnitTest.2.xml b/Magento2/Tests/Legacy/WidgetXMLUnitTest.2.xml new file mode 100644 index 00000000..f99ae1ca --- /dev/null +++ b/Magento2/Tests/Legacy/WidgetXMLUnitTest.2.xml @@ -0,0 +1,33 @@ + + + + + + + + List of Products that are set as New + + + + + Deprecated + + + + Deprecated + + + + + diff --git a/Magento2/Tests/Legacy/WidgetXMLUnitTest.3.xml b/Magento2/Tests/Legacy/WidgetXMLUnitTest.3.xml new file mode 100644 index 00000000..ef90e28b --- /dev/null +++ b/Magento2/Tests/Legacy/WidgetXMLUnitTest.3.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/Magento2/Tests/Legacy/WidgetXMLUnitTest.php b/Magento2/Tests/Legacy/WidgetXMLUnitTest.php new file mode 100644 index 00000000..c52b920b --- /dev/null +++ b/Magento2/Tests/Legacy/WidgetXMLUnitTest.php @@ -0,0 +1,41 @@ + 1, + 12 => 1, + 14 => 1, + ]; + } + if ($testFile === 'WidgetXMLUnitTest.2.xml') { + return [ + 9 => 1, + 17 => 1, + 24 => 1, + ]; + } + return []; + } + + /** + * @inheritdoc + */ + public function getWarningList($testFile = '') + { + return []; + } +} diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 1e247a2f..158173f3 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -247,6 +247,11 @@ 8 warning + + *\/widget.xml$ + 8 + warning +