Tpt has uploaded a new change for review.
https://gerrit.wikimedia.org/r/90690
Change subject: Support for custom image width
......................................................................
Support for custom image width
Adds also beginning of support for custom CSS
Improves the unit tests for ProofreadPagePage and ProofreadIndexPage
Change-Id: I9a6e48c57d97f0bd6683666d680e86c17e93a2ab
---
M includes/index/ProofreadIndexPage.php
M includes/page/ProofreadPagePage.php
M tests/includes/index/ProofreadIndexPageTest.php
M tests/includes/page/ProofreadPagePageTest.php
4 files changed, 200 insertions(+), 81 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ProofreadPage
refs/changes/90/90690/1
diff --git a/includes/index/ProofreadIndexPage.php
b/includes/index/ProofreadIndexPage.php
index d1131ca..096774c 100644
--- a/includes/index/ProofreadIndexPage.php
+++ b/includes/index/ProofreadIndexPage.php
@@ -35,6 +35,11 @@
protected $text;
/**
+ * @var ProofreadIndexEntry[] entries of the page
+ */
+ protected $entries;
+
+ /**
* @var array configuration array
*/
protected $config = array();
@@ -197,15 +202,18 @@
* @return array of ProofreadIndexEntry
*/
public function getIndexEntries() {
- $text = $this->getText();
- $values = array();
- foreach( $this->config as $varName => $property ) {
- $tagPattern = "/\n\|" . $varName .
"=(.*?)\n(\||\}\})/is";
- if ( preg_match( $tagPattern, $text, $matches ) ) {
- $values[$varName] = $matches[1];
+ if ( $this->entries === null ) {
+ $text = $this->getText();
+ $values = array();
+ foreach( $this->config as $varName => $property ) {
+ $tagPattern = "/\n\|" . $varName .
"=(.*?)\n(\||\}\})/is";
+ if ( preg_match( $tagPattern, $text, $matches )
) {
+ $values[$varName] = $matches[1];
+ }
}
+ $this->entries =
$this->getIndexEntriesFromIndexContent( $values );
}
- return $this->getIndexEntriesFromIndexContent( $values );
+ return $this->entries;
}
/**
@@ -228,12 +236,28 @@
public function getIndexEntriesForHeader() {
$entries = $this->getIndexEntries();
$headerEntries = array();
- foreach( $entries as $key => $entry ) {
+ foreach( $entries as $entry ) {
if ( $entry->isHeader() ) {
- $headerEntries[$key] = $entry;
+ $headerEntries[$entry->getKey()] = $entry;
}
}
return $headerEntries;
+ }
+
+ /*
+ * Return the index entry with the same name or null if it's not found
+ * Note: the comparison is case insensitive
+ * @return ProofreadIndexEntry|null
+ */
+ public function getIndexEntry( $name ) {
+ $name = strtolower( $name );
+ $entries = $this->getIndexEntries();
+ foreach( $entries as $entry ) {
+ if ( strtolower( $entry->getKey() ) === $name ) {
+ return $entry;
+ }
+ }
+ return null;
}
/**
@@ -259,7 +283,6 @@
* @return array
*/
public function getPages() {
- list( $pageNamespace, $indexNamespace ) =
ProofreadPage::getPageAndIndexNamespace();
$text = $this->getText();
//check if it is using pagelist
@@ -374,38 +397,35 @@
}
/**
- * Return metadata from the index pages that will be used by a page
page.
- * @param $page Title the page (TODO: move to ProofreadPagePage and add
support of css and editWidth)
- * @return array( header, footer, css, editWidth ) as string
+ * Return the value of an entry as wikitext with variable replaced with
index entries and $otherParams
+ * Example: if 'header' entry is 'Page of {{title}} number {{pagenum}}'
with $otherParams = array( 'pagenum' => 23 )
+ * the function called for 'header' will returns 'Page page my book
number 23'
+ * @param $name string entry name
+ * @param $otherParams array associative array other possible values to
replace
+ * @return string the value with variables replaced
*/
- public function getIndexDataForPage( Title $page ) {
- $entries = $this->getIndexEntriesForHeader();
- $attributes = array();
- foreach( $entries as $key => $attribute ) { //We use here only
values as text
- $attributes[strtolower( $key )] =
$attribute->getStringValue();
- }
- $attributes['pagenum'] = $this->getDisplayedPageNumber( $page );
+ public function replaceVariablesWithIndexEntries( $name, $otherParams )
{
+ global $wgParser;
- if( isset( $attributes['header'] ) ) {
- $header = $attributes['header'];
- } else {
- $header = wfMessage( 'proofreadpage_default_header'
)->inContentLanguage()->plain();
+ $entry = $this->getIndexEntry( $name );
+ if ( $entry === null ) {
+ return null;
}
- if ( isset( $attributes['footer'] ) ) {
- $footer = $attributes['footer'];
- } else {
- $footer = wfMessage( 'proofreadpage_default_footer'
)->inContentLanguage()->plain();
+ $params = $this->getIndexEntriesForHeaderAsTemplateParams() +
$otherParams;
+ return $wgParser->replaceVariables( $entry->getStringValue(),
$params, true );
+ }
+
+ /**
+ * Returns the index entries formatted in order to be transcluded in
templates
+ * @return string[]
+ */
+ protected function getIndexEntriesForHeaderAsTemplateParams() {
+ $indexEntries = $this->getIndexEntriesForHeader();
+ $params = array();
+ foreach( $indexEntries as $entry ) {
+ $params[strtolower( $entry->getKey() )] =
$entry->getStringValue();
}
-
- foreach( $attributes as $key => $val ) {
- $header = str_replace( '{{{' . $key . '}}}', $val,
$header );
- $footer = str_replace( '{{{' . $key . '}}}', $val,
$footer );
- }
-
- $css = isset( $attributes['css'] ) ? $attributes['css'] : '';
- $editWidth = isset( $attributes['width'] ) ?
$attributes['width'] : '';
-
- return array( $header, $footer, $css, $editWidth );
+ return $params;
}
}
diff --git a/includes/page/ProofreadPagePage.php
b/includes/page/ProofreadPagePage.php
index 2f3c14e..0de0e46 100644
--- a/includes/page/ProofreadPagePage.php
+++ b/includes/page/ProofreadPagePage.php
@@ -25,6 +25,11 @@
class ProofreadPagePage {
/**
+ * @var integer default width for scan image
+ */
+ const DEFAULT_IMAGE_WIDTH = 1024;
+
+ /**
* @var Title
*/
protected $title;
@@ -179,8 +184,12 @@
if ( $content->isEmpty() && !$this->title->exists() ) {
$index = $this->getIndex();
if ( $index ) {
- list( $header, $footer, $css, $editWidth ) =
$index->getIndexDataForPage( $this->title );
+ $params = array(
+ 'pagenum' =>
$index->getDisplayedPageNumber( $this->getTitle() )
+ );
+ $header =
$index->replaceVariablesWithIndexEntries( 'header', $params );
$body = '';
+ $footer =
$index->replaceVariablesWithIndexEntries( 'footer', $params );
//Extract text layer
$image = $index->getImage();
@@ -201,6 +210,43 @@
}
}
return $content;
+ }
+
+
+ /**
+ * Return the scan image width for display
+ * @return integer
+ */
+ public function getImageWidth() {
+ $index = $this->getIndex();
+ if ( $index ) {
+ $width = $index->getIndexEntry( 'width' );
+ if ( $width !== null ) {
+ $width = $width->getStringValue();
+ if ( is_numeric( $width ) ) {
+ return $width;
+ }
+ }
+ }
+
+ return self::DEFAULT_IMAGE_WIDTH;
+ }
+
+ /**
+ * Return custom CSS for the page
+ * @return string
+ * @todo use it with ParserOutput::addInlineStyle but fix possible XSS
issue
+ */
+ public function getCustomCss() {
+ $index = $this->getIndex();
+ if ( $index ) {
+ $css = $index->getIndexEntry( 'css' );
+ if ( $css !== null ) {
+ return trim( $css->getStringValue() );
+ }
+ }
+
+ return '';
}
/**
@@ -247,7 +293,7 @@
$content .
Html::closeElement( 'div' ) .
Html::openElement( 'div', array( 'class' =>
'prp-page-image' ) ) .
- $this->getImageHtml( array( 'max-width' => 800 ) ) .
+ $this->getImageHtml( array( 'max-width' =>
$this->getImageWidth() ) ) .
Html::closeElement( 'div' ) .
Html::closeElement( 'div' );
}
diff --git a/tests/includes/index/ProofreadIndexPageTest.php
b/tests/includes/index/ProofreadIndexPageTest.php
index 70d263e..47c8408 100644
--- a/tests/includes/index/ProofreadIndexPageTest.php
+++ b/tests/includes/index/ProofreadIndexPageTest.php
@@ -61,20 +61,39 @@
'header' => true,
'hidden' => true
),
+ 'width' => array(
+ 'type' => 'number',
+ 'label' => 'Image width',
+ 'header' => false
+ ),
+ 'CSS' => array(
+ 'type' => 'string',
+ 'label' => 'CSS',
+ 'header' => false
+ ),
);
- public function testNewFromTitle() {
- $this->assertInstanceOf( 'ProofreadIndexPage',
ProofreadIndexPage::newFromTitle( Title::makeTitle( 252, 'Test.djvu' ) ) );
+ /**
+ * Constructor of a new ProofreadIndexPage
+ * @param $title Title|string
+ * @param $content string|null
+ * @return ProofreadIndexPage
+ */
+ public static function newIndexPage( $title = 'test.djvu', $content =
null ) {
+ if ( is_string( $title ) ) {
+ $title = Title::makeTitle( 252, $title );
+ }
+ return new ProofreadIndexPage( $title, self::$config, $content
);
}
public function testGetTitle() {
$title = Title::makeTitle( 252, 'Test.djvu' );
- $page = new ProofreadIndexPage( $title, array(), '' );
+ $page = ProofreadIndexPage::newFromTitle( $title );
$this->assertEquals( $title, $page->getTitle() );
}
public function testGetIndexEntries() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), self::$config, "{{\n|Title=Test
book\n|Author=[[Author:Me]]\n|Year=2012 or 2013\n|Pages=<pagelist />\n|TOC=*
[[Test/Chapter 1|Chapter 1]]\n* [[Test/Chapter 2|Chapter 2]]\n}}" );
+ $page = self::newIndexPage( 'Test.djvu', "{{\n|Title=Test
book\n|Author=[[Author:Me]]\n|Year=2012 or 2013\n|Pages=<pagelist />\n|TOC=*
[[Test/Chapter 1|Chapter 1]]\n* [[Test/Chapter 2|Chapter 2]]\n}}" );
$entries = array(
'Title' => new ProofreadIndexEntry( 'Title', 'Test
book', self::$config['Title'] ),
'Author' => new ProofreadIndexEntry( 'Author',
'[[Author:Me]]', self::$config['Author'] ),
@@ -82,35 +101,52 @@
'Pages' => new ProofreadIndexEntry( 'Pages', '<pagelist
/>', self::$config['Pages'] ),
'Header' => new ProofreadIndexEntry( 'Header', '',
self::$config['Header'] ),
'TOC' => new ProofreadIndexEntry( 'TOC', "*
[[Test/Chapter 1|Chapter 1]]\n* [[Test/Chapter 2|Chapter 2]]",
self::$config['TOC'] ),
- 'Comment' => new ProofreadIndexEntry( 'Comment', '',
self::$config['Comment'] )
+ 'Comment' => new ProofreadIndexEntry( 'Comment', '',
self::$config['Comment'] ),
+ 'width' => new ProofreadIndexEntry( 'width', '',
self::$config['width'] ),
+ 'CSS' => new ProofreadIndexEntry( 'CSS', '',
self::$config['CSS'] )
);
$this->assertEquals( $entries, $page->getIndexEntries() );
}
- public function testGetMimeType() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), array(), null );
- $this->assertEquals( 'image/vnd.djvu', $page->getMimeType() );
+ public function mimeTypesProvider( ) {
+ return array(
+ array( 'image/vnd.djvu', 'Test.djvu' ),
+ array( 'application/pdf', 'Test.pdf' ),
+ array( null, 'Test' )
+ );
+ }
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.pdf' ), array(), null );
- $this->assertEquals( 'application/pdf', $page->getMimeType() );
-
- $page = new ProofreadIndexPage( Title::makeTitle( 252, 'Test'
), array(), null );
- $this->assertNull( $page->getMimeType() );
+ /**
+ * @dataProvider mimeTypesProvider
+ */
+ public function testGetMimeType( $mime, $name ) {
+ $this->assertEquals( $mime, self::newIndexPage( $name
)->getMimeType() );
}
public function testGetIndexEntriesForHeader() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), self::$config, "{{\n|Title=Test
book\n|Author=[[Author:Me]]\n|Year=2012 or 2013\n|Pages=<pagelist />\n|TOC=*
[[Test/Chapter 1|Chapter 1]]\n* [[Test/Chapter 2|Chapter 2]]\n}}" );
+ $page = self::newIndexPage( 'Test.djvu', "{{\n|Title=Test
book\n|Author=[[Author:Me]]\n|Year=2012 or 2013\n|Pages=<pagelist />\n|TOC=*
[[Test/Chapter 1|Chapter 1]]\n* [[Test/Chapter 2|Chapter 2]]\n}}" );
$entries = array(
'Title' => new ProofreadIndexEntry( 'Title', 'Test
book', self::$config['Title'] ),
'Author' => new ProofreadIndexEntry( 'Author',
'[[Author:Me]]', self::$config['Author'] ),
'Comment' => new ProofreadIndexEntry( 'Comment', '',
self::$config['Comment'] ),
- 'Header' => new ProofreadIndexEntry( 'Header', '',
self::$config['Header'] )
+ 'Header' => new ProofreadIndexEntry( 'Header', '',
self::$config['Header'] ),
+ 'width' => new ProofreadIndexEntry( 'width', '',
self::$config['width'] ),
+ 'CSS' => new ProofreadIndexEntry( 'CSS', '',
self::$config['CSS'] )
);
$this->assertEquals( $entries,
$page->getIndexEntriesForHeader() );
}
+ public function testGetIndexEntry() {
+ $page = self::newIndexPage( 'Test.djvu', "{{\n|Year=2012 or
2013\n}}" );
+
+ $entry = new ProofreadIndexEntry( 'Year', '2012 or 2013',
self::$config['Year'] );
+ $this->assertEquals( $entry, $page->getIndexEntry( 'year' ) );
+
+ $this->assertNull( $page->getIndexEntry( 'years' ) );
+ }
+
public function testGetLinksToMainNamespace() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), self::$config, "{{\n|Pages=[[Page:Test.jpg]]\n|TOC=*
[[Test/Chapter 1]]\n* [[Azerty:Test/Chapter_2|Chapter 2]]\n}}" );
+ $page = self::newIndexPage( 'Test.djvu',
"{{\n|Pages=[[Page:Test.jpg]]\n|TOC=* [[Test/Chapter 1]]\n*
[[Azerty:Test/Chapter_2|Chapter 2]]\n}}" );
$links = array(
array( Title::newFromText( 'Test/Chapter 1' ), 'Chapter
1' ),
array( Title::newFromText( 'Azerty:Test/Chapter_2' ),
'Chapter 2' )
@@ -119,13 +155,13 @@
}
public function testGetPagesWithPagelist() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), self::$config, "{{\n|Pages=<pagelist 1to4=- 5=1 5to24=roman 25=1
1021to1024=- />\n|Author=[[Author:Me]]\n}}" );
+ $page = self::newIndexPage( 'Test.djvu', "{{\n|Pages=<pagelist
1to4=- 5=1 5to24=roman 25=1 1021to1024=- />\n|Author=[[Author:Me]]\n}}" );
$links = array( null, array( '1to4' => '-', '5' => '1', '5to24'
=> 'roman', '25' => '1', '1021to1024' => '-' ) );
$this->assertEquals( $links, $page->getPages() );
}
public function testGetPagesWithoutPagelist() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252, 'Test'
), self::$config, "{{\n|Pages=[[Page:Test 1.jpg|TOC]] [[Page:Test 2.tiff|1]]
[[Page:Test:3.png|2]]\n|Author=[[Author:Me]]\n}}" );
+ $page = self::newIndexPage( 'Test', "{{\n|Pages=[[Page:Test
1.jpg|TOC]] [[Page:Test 2.tiff|1]]
[[Page:Test:3.png|2]]\n|Author=[[Author:Me]]\n}}" );
$links = array( array(
array( Title::newFromText( 'Page:Test 1.jpg' ), 'TOC' ),
array( Title::newFromText( 'Page:Test 2.tiff' ), '1' ),
@@ -135,7 +171,7 @@
}
public function testGetPreviousAndNextPagesWithoutPagelist() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252, 'Test'
), self::$config, "{{\n|Pages=[[Page:Test 1.jpg|TOC]] [[Page:Test 2.tiff|1]]
[[Page:Test 3.png|2]]\n|Author=[[Author:Me]]\n}}" );
+ $page = self::newIndexPage( 'Test', "{{\n|Pages=[[Page:Test
1.jpg|TOC]] [[Page:Test 2.tiff|1]] [[Page:Test
3.png|2]]\n|Author=[[Author:Me]]\n}}" );
$links = array(
Title::newFromText( 'Page:Test 1.jpg' ),
Title::newFromText( 'Page:Test 3.png' )
@@ -143,9 +179,13 @@
$this->assertEquals( $links, $page->getPreviousAndNextPages(
Title::newFromText( 'Page:Test 2.tiff' ) ) );
}
- public function testGetIndexDataForPage() {
- $page = new ProofreadIndexPage( Title::makeTitle( 252,
'Test.djvu' ), self::$config, "{{\n|Title=Test book\n|Pages=[[Page:Test
1.jpg|TOC]] [[Page:Test 2.tiff|1]] [[Page:Test 3.png|2]]\n|Header=Head
{{{pagenum}}}\n}}" );
- $result = array( 'Head TOC', '<references/>', '', '' );
- $this->assertEquals( $result, $page->getIndexDataForPage(
Title::newFromText( 'Page:Test 1.jpg' ) ) );
+ public function testReplaceVariablesWithIndexEntries() {
+ $this->markTestIncomplete( 'TODO Parser fails' ); //TODO
+ return;
+
+ $page = self::newIndexPage( 'Test.djvu', "{{\n|Title=Test
book\n|Header='Page of {{{title}}} by {{{author|}}} number {{{pagenum}}}'\n}}"
);
+ $this->assertEquals( 'Page of Test book by number 22',
$page->replaceVariablesWithIndexEntries( 'header', array( 'pagenum' => 22 ) ) );
+
+ $this->assertNull( $page->replaceVariablesWithIndexEntries(
'headers', array() ) );
}
-}
+}
\ No newline at end of file
diff --git a/tests/includes/page/ProofreadPagePageTest.php
b/tests/includes/page/ProofreadPagePageTest.php
index 5c4200d..eed372f 100644
--- a/tests/includes/page/ProofreadPagePageTest.php
+++ b/tests/includes/page/ProofreadPagePageTest.php
@@ -5,8 +5,18 @@
*/
class ProofreadPagePageTest extends ProofreadPageTestCase {
- public function testNewFromTitle() {
- $this->assertInstanceOf( 'ProofreadPagePage',
ProofreadPagePage::newFromTitle( Title::makeTitle( 250, 'Test.djvu' ) ) );
+ /**
+ * Constructor of a new ProofreadPagePage
+ * @param $title Title|string
+ * @param $content ProofreadPageContent|null
+ * @param $index ProofreadIndexPage|null
+ * @return ProofreadPagePage
+ */
+ public static function newPagePage( $title = 'test.jpg',
ProofreadPageContent $content = null, ProofreadIndexPage $index = null ) {
+ if ( is_string( $title ) ) {
+ $title = Title::makeTitle( 250, $title );
+ }
+ return new ProofreadPagePage( $title, $content, $index );
}
public function testGetTitle() {
@@ -16,28 +26,31 @@
}
public function testGetPageNumber() {
- $title = Title::makeTitle( 250, 'Test.djvu' );
- $page = ProofreadPagePage::newFromTitle( Title::makeTitle( 250,
'Test.djvu/1' ) );
- $this->assertEquals( 1, $page->getPageNumber() );
+ $this->assertEquals( 1, self::newPagePage( 'Test.djvu/1'
)->getPageNumber() );
- $page = new ProofreadPagePage( $title, null, null );
- $this->assertEquals( null, $page->getPageNumber() );
+ $this->assertNull( self::newPagePage( 'Test.djvu'
)->getPageNumber() );
}
public function testGetIndex() {
- $title = Title::makeTitle( 252, 'Test.djvu' );
- $index = ProofreadIndexPage::newFromTitle( $title );
- $page = new ProofreadPagePage( $title, null, $index );
- $this->assertEquals( $index, $page->getIndex() );
+ $index = ProofreadIndexPageTest::newIndexPage();
+ $this->assertEquals( $index, self::newPagePage( 'Test.jpg',
null, $index )->getIndex() );
}
public function testGetContent() {
- $title = Title::makeTitle( 250, 'Test.djvu' );
- $index = ProofreadIndexPage::newFromTitle( $title );
-
$pageContent = ProofreadPageContentTest::newContent( '', 'aaa'
);
- $page = new ProofreadPagePage( $title, $pageContent, $index );
- $this->assertEquals( $pageContent, $page->getContent() );
+ $this->assertEquals( $pageContent, self::newPagePage(
'Test.jpg', $pageContent )->getContent() );
}
-}
+ public function testGetImageWidth() {
+ $index = ProofreadIndexPageTest::newIndexPage( 'Test',
"{{\n|width= 500 \n}}" );
+ $this->assertEquals( 500, self::newPagePage( 'Test.jpg', null,
$index )->getImageWidth() );
+
+ $index = ProofreadIndexPageTest::newIndexPage( 'Test',
"{{\n|title=500\n}}" );
+ $this->assertEquals( ProofreadPagePage::DEFAULT_IMAGE_WIDTH,
self::newPagePage( 'Test.jpg', null, $index )->getImageWidth() );
+ }
+
+ public function testGetCustomCss() {
+ $index = ProofreadIndexPageTest::newIndexPage( 'Test',
"{{\n|CSS= width:300px; \n}}" );
+ $this->assertEquals( 'width:300px;', self::newPagePage(
'Test.jpg', null, $index )->getCustomCss() );
+ }
+}
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/90690
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9a6e48c57d97f0bd6683666d680e86c17e93a2ab
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ProofreadPage
Gerrit-Branch: pagePagesRefactoring
Gerrit-Owner: Tpt <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits