jenkins-bot has submitted this change and it was merged. Change subject: Move fancy image removal from HtmlFormatter to MobileFormatter ......................................................................
Move fancy image removal from HtmlFormatter to MobileFormatter Change-Id: I8dd2cd8ba3bff895447946294ce8a3291bc2ce1b --- M includes/formatters/ExtractFormatter.php M includes/formatters/HtmlFormatter.php M includes/formatters/MobileFormatter.php M tests/HtmlFormatterTest.php M tests/MobileFormatterTest.php 5 files changed, 86 insertions(+), 81 deletions(-) Approvals: Jdlrobson: Looks good to me, approved jenkins-bot: Verified diff --git a/includes/formatters/ExtractFormatter.php b/includes/formatters/ExtractFormatter.php index 89c62d3..e08fe12 100644 --- a/includes/formatters/ExtractFormatter.php +++ b/includes/formatters/ExtractFormatter.php @@ -21,7 +21,6 @@ $this->plainText = $plainText; $this->removeImages(); - $this->useImgAlt( false ); $this->remove( $wgMFRemovableClasses['base'] ); $this->remove( $wgMFRemovableClasses['extracts'] ); $this->remove( array( 'table', 'div', '.editsection', '.mw-editsection', 'sup.reference', 'span.coordinates', diff --git a/includes/formatters/HtmlFormatter.php b/includes/formatters/HtmlFormatter.php index bbc9749..7ae2432 100644 --- a/includes/formatters/HtmlFormatter.php +++ b/includes/formatters/HtmlFormatter.php @@ -12,8 +12,7 @@ private $html; private $itemsToRemove = array(); private $elementsToFlatten = array(); - private $removeImages = false; - private $imgAlt = true; + protected $removeImages = false; /** * Constructor @@ -94,13 +93,6 @@ } /** - * @param bool $value - */ - public function useImgAlt( $value ) { - $this->imgAlt = $value; - } - - /** * Removes content inappropriate for mobile devices */ public function filterContent() { @@ -122,31 +114,13 @@ // For example: $domElemsToRemove = array(); - $domElemsToReplace = array(); foreach ( $removals['TAG'] as $tagToRemove ) { $tagToRemoveNodes = $doc->getElementsByTagName( $tagToRemove ); foreach ( $tagToRemoveNodes as $tagToRemoveNode ) { if ( $tagToRemoveNode ) { - if ( $this->imgAlt && $tagToRemoveNode->nodeName == 'img' ) { - $domElemsToReplace[] = $tagToRemoveNode; - } else { - $domElemsToRemove[] = $tagToRemoveNode; - } + $domElemsToRemove[] = $tagToRemoveNode; } } - } - - /** @var $domElement DOMElement */ - foreach ( $domElemsToReplace as $domElement ) { - $alt = $domElement->getAttribute( 'alt' ); - if ( $alt === '' ) { - $alt = '[' . wfMessage( 'mobile-frontend-missing-image' )->inContentLanguage() . ']'; - } else { - $alt = '[' . $alt . ']'; - } - $replacement = $doc->createElement( 'span', htmlspecialchars( $alt ) ); - $replacement->setAttribute( 'class', 'mw-mf-image-replacement' ); - $domElement->parentNode->replaceChild( $replacement, $domElement ); } $this->removeElements( $domElemsToRemove ); diff --git a/includes/formatters/MobileFormatter.php b/includes/formatters/MobileFormatter.php index 3693ad5..db72b91 100644 --- a/includes/formatters/MobileFormatter.php +++ b/includes/formatters/MobileFormatter.php @@ -111,29 +111,63 @@ $this->remove( $wgMFRemovableClasses['base'] ); $this->remove( $wgMFRemovableClasses[$this->getFormat()] ); } + + if ( $this->removeImages ) { + $this->doRemoveImages(); + } parent::filterContent(); // Handle red links with action equal to edit if ( $this->flattenRedLinks ) { - $doc = $this->getDoc(); - $xpath = new DOMXpath( $doc ); - $redLinks = $xpath->query( '//a[@class="new"]' ); - /** @var $redLink DOMElement */ - foreach ( $redLinks as $redLink ) { - // PHP Bug #36795 — Inappropriate "unterminated entity reference" - $spanNode = $doc->createElement( "span", str_replace( "&", "&", $redLink->nodeValue ) ); + $this->doFlattenRedLinks(); + } + } - if ( $redLink->hasAttributes() ) { - $attributes = $redLink->attributes; - foreach ( $attributes as $attribute ) { - if ( $attribute->name != 'href' ) { - $spanNode->setAttribute( $attribute->name, $attribute->value ); - } + /** + * Replaces images with [annotations from alt] + */ + private function doRemoveImages() { + $doc = $this->getDoc(); + $domElemsToReplace = array(); + foreach( $doc->getElementsByTagName( 'img' ) as $element ) { + $domElemsToReplace[] = $element; + } + /** @var $element DOMElement */ + foreach ( $domElemsToReplace as $element ) { + $alt = $element->getAttribute( 'alt' ); + if ( $alt === '' ) { + $alt = '[' . wfMessage( 'mobile-frontend-missing-image' )->inContentLanguage() . ']'; + } else { + $alt = '[' . $alt . ']'; + } + $replacement = $doc->createElement( 'span', htmlspecialchars( $alt ) ); + $replacement->setAttribute( 'class', 'mw-mf-image-replacement' ); + $element->parentNode->replaceChild( $replacement, $element ); + } + } + + /** + * Replaces red links with plain text + */ + private function doFlattenRedLinks() { + $doc = $this->getDoc(); + $xpath = new DOMXpath( $doc ); + $redLinks = $xpath->query( '//a[@class="new"]' ); + /** @var $redLink DOMElement */ + foreach ( $redLinks as $redLink ) { + // PHP Bug #36795 — Inappropriate "unterminated entity reference" + $spanNode = $doc->createElement( "span", str_replace( "&", "&", $redLink->nodeValue ) ); + + if ( $redLink->hasAttributes() ) { + $attributes = $redLink->attributes; + foreach ( $attributes as $attribute ) { + if ( $attribute->name != 'href' ) { + $spanNode->setAttribute( $attribute->name, $attribute->value ); } } - - $redLink->parentNode->replaceChild( $spanNode, $redLink ); } + + $redLink->parentNode->replaceChild( $spanNode, $redLink ); } } diff --git a/tests/HtmlFormatterTest.php b/tests/HtmlFormatterTest.php index 93d2c54..246641b 100644 --- a/tests/HtmlFormatterTest.php +++ b/tests/HtmlFormatterTest.php @@ -28,10 +28,6 @@ $removeImages = function( HtmlFormatter $f ) { $f->removeImages(); }; - $fullyRemoveImages = function( HtmlFormatter $f ) { - $f->removeImages(); - $f->useImgAlt( false ); - }; $removeTags = function( HtmlFormatter $f ) { $f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) ); }; @@ -44,19 +40,9 @@ return array( // remove images if asked array( - '<img src="/foo/bar.jpg">Blah</img>', - '<span class="mw-mf-image-replacement">['. wfMessage( 'mobile-frontend-missing-image' ) .']</span>Blah', - $removeImages, - ), - array( - '<img src="/foo/bar.jpg" alt="Blah"/>', - '<span class="mw-mf-image-replacement">[Blah]</span>', - $removeImages, - ), - array( '<img src="/foo/bar.jpg" alt="Blah"/>', '', - $fullyRemoveImages, + $removeImages, ), // basic tag removal array( @@ -84,27 +70,6 @@ array( '<span title="" \' &"><Тест!></span> &<&&&&', '<span title="" \' &"><Тест!></span> &<&&&&', - ), - array( - '<img alt="picture of kitty" src="kitty.jpg">', - '<span class="mw-mf-image-replacement">[picture of kitty]</span>', - $removeImages, - ), - array( - '<img src="kitty.jpg">', - '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>', - $removeImages, - ), - array( - '<img alt src="kitty.jpg">', - '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>', - $removeImages, - ), - array( - '<img alt src="kitty.jpg">look at the cute kitty!<img alt="picture of angry dog" src="dog.jpg">', - '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>look at the cute kitty!'. - '<span class="mw-mf-image-replacement">[picture of angry dog]</span>', - $removeImages, ), // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086 array( diff --git a/tests/MobileFormatterTest.php b/tests/MobileFormatterTest.php index 3048846..571fd5b 100644 --- a/tests/MobileFormatterTest.php +++ b/tests/MobileFormatterTest.php @@ -26,9 +26,21 @@ $longLine = "\n" . str_repeat( 'A', 5000 ); $summarySection = '<div id="content_0" class="content_block openSection"></div>'; $anchor = '<a id="anchor_1" href="#section_1" class="section_anchors">↑Jump back a section</a>'; + $removeImages = function( MobileFormatter $f ) { + $f->removeImages(); + }; return array( - // remove magnifying glass + array( + '<img src="/foo/bar.jpg">Blah</img>', + '<span class="mw-mf-image-replacement">['. wfMessage( 'mobile-frontend-missing-image' ) .']</span>Blah', + $removeImages, + ), + array( + '<img src="/foo/bar.jpg" alt="Blah"/>', + '<span class="mw-mf-image-replacement">[Blah]</span>', + $removeImages, + ), // remove magnifying glass array( '<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="/wiki/File:Foo.jpg" class="image"> <img alt="" src="/foo.jpg" width="220" height="165" class="thumbimage"/></a><div class="thumbcaption"> @@ -65,6 +77,27 @@ . '</div>', $enableSections ), + array( + '<img alt="picture of kitty" src="kitty.jpg">', + '<span class="mw-mf-image-replacement">[picture of kitty]</span>', + $removeImages, + ), + array( + '<img src="kitty.jpg">', + '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>', + $removeImages, + ), + array( + '<img alt src="kitty.jpg">', + '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>', + $removeImages, + ), + array( + '<img alt src="kitty.jpg">look at the cute kitty!<img alt="picture of angry dog" src="dog.jpg">', + '<span class="mw-mf-image-replacement">[' . wfMessage( 'mobile-frontend-missing-image' ) . ']</span>look at the cute kitty!'. + '<span class="mw-mf-image-replacement">[picture of angry dog]</span>', + $removeImages, + ), ); } } -- To view, visit https://gerrit.wikimedia.org/r/83760 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I8dd2cd8ba3bff895447946294ce8a3291bc2ce1b Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/MobileFrontend Gerrit-Branch: master Gerrit-Owner: MaxSem <maxsem.w...@gmail.com> Gerrit-Reviewer: Jdlrobson <jrob...@wikimedia.org> Gerrit-Reviewer: MaxSem <maxsem.w...@gmail.com> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits