mirror of
https://github.com/Universal-Omega/PortableInfobox.git
synced 2024-11-15 03:35:53 +00:00
Merge pull request #7103 from Wikia/DAT-2760
DAT-2760 Backwards compatibility in <image> tag for portable infoboxes
This commit is contained in:
commit
958e073d8a
|
@ -18,7 +18,9 @@ $wgExtensionCredits[ 'parserhook' ][] = [
|
|||
$wgAutoloadClasses[ 'PortableInfoboxRenderService' ] = $dir . 'services/PortableInfoboxRenderService.class.php';
|
||||
|
||||
// parser
|
||||
$wgAutoloadClasses[ 'Wikia\\PortableInfobox\\Parser\\ExternalParser'] = $dir . 'services/Parser/ExternalParser.php';
|
||||
$wgAutoloadClasses[ 'Wikia\\PortableInfobox\\Parser\\XmlParser'] = $dir . 'services/Parser/XmlParser.php';
|
||||
$wgAutoloadClasses[ 'Wikia\\PortableInfobox\\Parser\\DummyParser'] = $dir . 'services/Parser/DummyParser.php';
|
||||
$wgAutoloadClasses[ 'Wikia\\PortableInfobox\\Parser\\MediaWikiParserService'] = $dir . 'services/Parser/MediaWikiParserService.php';
|
||||
$wgInfoboxParserNodes = [
|
||||
'Node',
|
||||
|
@ -36,6 +38,9 @@ foreach ( $wgInfoboxParserNodes as $parserNode ) {
|
|||
$wgAutoloadClasses[ 'Wikia\\PortableInfobox\\Parser\\Nodes\\'.$parserNode ] = $dir . 'services/Parser/Nodes/'.$parserNode.'.php';
|
||||
}
|
||||
|
||||
// helpers
|
||||
$wgAutoloadClasses[ 'Wikia\PortableInfobox\Helpers\ImageFilenameSanitizer' ] = $dir . 'services/Helpers/ImageFilenameSanitizer.php';
|
||||
|
||||
// controller classes
|
||||
$wgAutoloadClasses[ 'PortableInfoboxParserTagController' ] = $dir . 'controllers/PortableInfoboxParserTagController.class.php';
|
||||
$wgAutoloadClasses[ 'PortableInfoboxHooks' ] = $dir . 'PortableInfoboxHooks.class.php';
|
||||
|
|
60
services/Helpers/ImageFilenameSanitizer.php
Normal file
60
services/Helpers/ImageFilenameSanitizer.php
Normal file
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace Wikia\PortableInfobox\Helpers;
|
||||
|
||||
class ImageFilenameSanitizer {
|
||||
private static $instance = null;
|
||||
private $filePrefixRegex = [ ];
|
||||
|
||||
private function __construct() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return null|ImageFilenameSanitizer
|
||||
*/
|
||||
public static function getInstance() {
|
||||
if ( is_null( self::$instance ) ) {
|
||||
self::$instance = new self;
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $contLang \Language
|
||||
* Used as local cache for getting string to remove
|
||||
*/
|
||||
private function getFilePrefixRegex( $contLang ) {
|
||||
$langCode = $contLang->getCode();
|
||||
if ( empty( $this->filePrefixRegex[$langCode] ) ) {
|
||||
$fileNamespaces = [ \MWNamespace::getCanonicalName( NS_FILE ), $contLang->getNamespaces()[NS_FILE] ];
|
||||
|
||||
$aliases = $contLang->getNamespaceAliases();
|
||||
foreach ( $aliases as $alias => $namespaceId ) {
|
||||
if ( $namespaceId == NS_FILE )
|
||||
$fileNamespaces [] = $alias;
|
||||
}
|
||||
$this->filePrefixRegex[$langCode] = '^(' . implode( '|', $fileNamespaces ) . '):';
|
||||
}
|
||||
return $this->filePrefixRegex[$langCode];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $filename string
|
||||
* @param $contLang \Language
|
||||
* @return mixed
|
||||
*/
|
||||
public function sanitizeImageFileName( $filename, $contLang ) {
|
||||
// replace the MW square brackets and surrounding whitespace
|
||||
$trimmedFilename = trim( $filename, "\t\n\r[]" );
|
||||
|
||||
$filePrefixRegex = $this->getFilePrefixRegex( $contLang );
|
||||
$unprefixedFilename = mbereg_replace( $filePrefixRegex, "", $trimmedFilename );
|
||||
|
||||
// strip
|
||||
$filenameParts = explode( '|', $unprefixedFilename );
|
||||
if ( !empty( $filenameParts[0] ) ) {
|
||||
$filename = $filenameParts[0];
|
||||
}
|
||||
return $filename;
|
||||
}
|
||||
}
|
13
services/Parser/DummyParser.php
Normal file
13
services/Parser/DummyParser.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace Wikia\PortableInfobox\Parser;
|
||||
|
||||
class DummyParser implements ExternalParser {
|
||||
public function parse( $text ) {
|
||||
return "parse($text)";
|
||||
}
|
||||
|
||||
public function parseRecursive( $text ) {
|
||||
return "parseRecursive($text)";
|
||||
}
|
||||
}
|
8
services/Parser/ExternalParser.php
Normal file
8
services/Parser/ExternalParser.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
namespace Wikia\PortableInfobox\Parser;
|
||||
|
||||
interface ExternalParser {
|
||||
public function parse( $text );
|
||||
|
||||
public function parseRecursive( $text );
|
||||
}
|
|
@ -6,17 +6,22 @@ class NodeImage extends Node {
|
|||
|
||||
public function getData() {
|
||||
$node = [];
|
||||
$imageName = $this->getInfoboxData( $this->getXmlAttribute($this->xmlNode, self::DATA_SRC_ATTR_NAME ) );
|
||||
|
||||
$imageName = $this->getValueWithDefault( $this->xmlNode );
|
||||
$node['value'] = $this->resolveImageUrl( $imageName );
|
||||
$node['alt'] = $this->getValueWithDefault( $this->xmlNode->{self::ALT_TAG_NAME} );
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
protected function resolveImageUrl( $filename ) {
|
||||
$title = \Title::newFromText( $filename, NS_FILE );
|
||||
public function resolveImageUrl( $filename ) {
|
||||
global $wgContLang;
|
||||
$title = \Title::newFromText( \Wikia\PortableInfobox\Helpers\ImageFilenameSanitizer::getInstance()
|
||||
->sanitizeImageFileName($filename, $wgContLang), NS_FILE );
|
||||
if ( $title && $title->exists() ) {
|
||||
return \WikiaFileHelper::getFileFromTitle($title)->getUrlGenerator()->url();
|
||||
return \WikiaFileHelper::getFileFromTitle( $title )->getUrlGenerator()->url();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
|
85
tests/ImageFilenameSanitizerTest.php
Normal file
85
tests/ImageFilenameSanitizerTest.php
Normal file
|
@ -0,0 +1,85 @@
|
|||
<?php
|
||||
|
||||
class ImageFilenameSanitizerTest extends WikiaBaseTest {
|
||||
private $imageFilenameSanitizer;
|
||||
|
||||
protected function setUp() {
|
||||
$this->setupFile = dirname( __FILE__ ) . '/../PortableInfobox.setup.php';
|
||||
parent::setUp();
|
||||
|
||||
$this->imageFilenameSanitizer = \Wikia\PortableInfobox\Helpers\ImageFilenameSanitizer::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $inputFileName
|
||||
* @param $expectedOutput
|
||||
* @param $description
|
||||
* @dataProvider testSanitizeFilenameDataProvider
|
||||
*/
|
||||
public function testSanitizeFilename( $inputFileName, $contentLanguageCode, $expectedOutput, $description ) {
|
||||
$language = new \Language();
|
||||
$language->setCode( $contentLanguageCode );
|
||||
$actualOutput = $this->imageFilenameSanitizer->sanitizeImageFileName( $inputFileName, $language );
|
||||
|
||||
$this->assertEquals( $expectedOutput, $actualOutput, $description );
|
||||
}
|
||||
|
||||
public function testSanitizeFilenameDataProvider() {
|
||||
return [
|
||||
[
|
||||
'filename.jpg',
|
||||
'en',
|
||||
'filename.jpg',
|
||||
'Plain filename'
|
||||
],
|
||||
[
|
||||
'File:filename.jpg',
|
||||
'en',
|
||||
'filename.jpg',
|
||||
'Filename with namespace'
|
||||
],
|
||||
[
|
||||
'Plik:filename.jpg',
|
||||
'pl',
|
||||
'filename.jpg',
|
||||
'Filename with localized namespace'
|
||||
],
|
||||
[
|
||||
'Grafika:filename.jpg',
|
||||
'pl',
|
||||
'filename.jpg',
|
||||
'Filename with localized namespace alias'
|
||||
],
|
||||
[
|
||||
'File:filename.jpg|300px',
|
||||
'en',
|
||||
'filename.jpg',
|
||||
'Filename with namespace and width'
|
||||
],
|
||||
[
|
||||
'[[File:filename.jpg|300px|lorem ipsum]]',
|
||||
'en',
|
||||
'filename.jpg',
|
||||
'Link to filename with namespace, width and caption'
|
||||
],
|
||||
[
|
||||
'[[File:filename.jpg|lorem ipsum]]',
|
||||
'en',
|
||||
'filename.jpg',
|
||||
'Link to filename with namespace and caption'
|
||||
],
|
||||
[
|
||||
'{{File:filename.jpg|lorem ipsum}}',
|
||||
'en',
|
||||
'{{File:filename.jpg',
|
||||
'Non-file string; sanitized, though useless'
|
||||
],
|
||||
[
|
||||
'',
|
||||
'en',
|
||||
'',
|
||||
'Empty file name'
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,12 +1,10 @@
|
|||
<?php
|
||||
|
||||
class PortableInfoboxParserNodesTest extends WikiaBaseTest {
|
||||
|
||||
protected function setUp() {
|
||||
$this->setupFile = dirname( __FILE__ ) . '/../PortableInfobox.setup.php';
|
||||
parent::setUp();
|
||||
require_once( dirname( __FILE__ ) . '/../PortableInfobox.setup.php' );
|
||||
foreach ( $wgAutoloadClasses as $class => $file) {
|
||||
require_once($file);
|
||||
}
|
||||
}
|
||||
|
||||
public function testNodeTitle() {
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
class PortableInfoboxParserTagControllerTest extends WikiaBaseTest {
|
||||
|
||||
protected function setUp() {
|
||||
$this->setupFile = dirname( __FILE__ ) . '/../PortableInfobox.setup.php';
|
||||
parent::setUp();
|
||||
require_once( dirname( __FILE__ ) . '/../PortableInfobox.setup.php' );
|
||||
}
|
||||
|
||||
public function testEmptyInfobox() {
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
class PortableInfoboxRenderServiceTest extends PHPUnit_Framework_TestCase {
|
||||
private $infoboxRenderService;
|
||||
|
||||
public function setUp() {
|
||||
protected function setUp() {
|
||||
$this->setupFile = dirname( __FILE__ ) . '/../PortableInfobox.setup.php';
|
||||
parent::setUp();
|
||||
require_once( dirname( __FILE__ ) . '/../PortableInfobox.setup.php' );
|
||||
|
||||
$this->infoboxRenderService = new PortableInfoboxRenderService();
|
||||
}
|
||||
|
|
|
@ -1,21 +1,10 @@
|
|||
<?php
|
||||
require_once( dirname( __FILE__ ) . '/../services/Parser/XmlParser.php' );
|
||||
|
||||
class TestParser implements \Wikia\PortableInfobox\Parser\ExternalParser {
|
||||
public function parse( $text ) {
|
||||
return "parse($text)";
|
||||
}
|
||||
|
||||
public function parseRecursive( $text ) {
|
||||
return "parseRecursive($text)";
|
||||
}
|
||||
}
|
||||
|
||||
class XmlParserTest extends WikiaBaseTest {
|
||||
|
||||
protected function setUp() {
|
||||
$this->setupFile = dirname( __FILE__ ) . '/../PortableInfobox.setup.php';
|
||||
parent::setUp();
|
||||
require_once( dirname( __FILE__ ) . '/../PortableInfobox.setup.php' );
|
||||
}
|
||||
|
||||
public function testIsEmpty() {
|
||||
|
@ -52,7 +41,7 @@ class XmlParserTest extends WikiaBaseTest {
|
|||
'elem2' => 'ELEM2',
|
||||
'lado2' => 'LALALA'
|
||||
]);
|
||||
$externalParser = new TestParser();
|
||||
$externalParser = new \Wikia\PortableInfobox\Parser\DummyParser();
|
||||
$parser->setExternalParser( $externalParser );
|
||||
$markup = '
|
||||
<infobox>
|
||||
|
|
Loading…
Reference in a new issue