jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/350392 )
Change subject: Grammatical features view
......................................................................
Grammatical features view
Bug: T162788
Change-Id: Ic5e7ca48f572850f370e0e964e06908dbc1feba8
---
M WikibaseLexeme.entitytypes.php
M resources/lexeme.css
M resources/templates.php
M src/DataModel/LexemeForm.php
M src/DataModel/Serialization/LexemeDeserializer.php
M src/View/LexemeFormsView.php
M src/View/LexemeView.php
M src/View/LexemeViewFactory.php
M tests/browser/features/forms.feature
M tests/browser/features/step_definitions/forms_steps.rb
M tests/browser/features/support/pages/lexeme_page.rb
M tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
M tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
M tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
M tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
15 files changed, 154 insertions(+), 29 deletions(-)
Approvals:
WMDE-leszek: Looks good to me, approved
jenkins-bot: Verified
diff --git a/WikibaseLexeme.entitytypes.php b/WikibaseLexeme.entitytypes.php
index 3492e4c..55db0e6 100644
--- a/WikibaseLexeme.entitytypes.php
+++ b/WikibaseLexeme.entitytypes.php
@@ -68,7 +68,8 @@
$labelDescriptionLookup,
$fallbackChain,
$editSectionGenerator,
- $entityTermsView
+ $entityTermsView,
+
WikibaseRepo::getDefaultInstance()->getEntityIdHtmlLinkFormatterFactory()
);
return $factory->newLexemeView();
diff --git a/resources/lexeme.css b/resources/lexeme.css
index 531efe9..9a50d86 100644
--- a/resources/lexeme.css
+++ b/resources/lexeme.css
@@ -17,3 +17,11 @@
clear: left;
margin-left: 10px; /* same as .wb-section-heading */
}
+
+.wikibase-lexeme-form-grammatical-features {
+ display: flex;
+}
+
+.wikibase-lexeme-form-grammatical-features-values {
+ margin: 0 10px;
+}
diff --git a/resources/templates.php b/resources/templates.php
index 324a6d1..a2e4138 100644
--- a/resources/templates.php
+++ b/resources/templates.php
@@ -15,7 +15,13 @@
$templates = [];
$templates['wikibase-lexeme-form'] = <<<'HTML'
-<h3 class="wikibase-lexeme-form-representation" lang="$1">$2<!--
wikibase-lexeme-form-id --> $3</h3>
+<div class="wikibase-lexeme-form">
+ <h3 class="wikibase-lexeme-form-representation" lang="$1">$2 $3</h3>
+ <div class="wikibase-lexeme-form-grammatical-features">
+ <div
class="wikibase-lexeme-form-grammatical-features-header">Grammatical
features</div>
+ <div
class="wikibase-lexeme-form-grammatical-features-values">$4</div>
+ </div>
+</div>
HTML;
$templates['wikibase-lexeme-form-id'] = <<<'HTML'
diff --git a/src/DataModel/LexemeForm.php b/src/DataModel/LexemeForm.php
index 3ae2bec..32386e7 100644
--- a/src/DataModel/LexemeForm.php
+++ b/src/DataModel/LexemeForm.php
@@ -2,6 +2,8 @@
namespace Wikibase\Lexeme\DataModel;
+use Wikibase\DataModel\Entity\ItemId;
+
/**
* @license GPL-2.0+
* @author Thiemo Mättig
@@ -19,12 +21,23 @@
private $representation;
/**
- * @param LexemeFormId $id|null
- * @param string $representation
+ * @var ItemId[]
*/
- public function __construct( LexemeFormId $id = null, $representation )
{
+ private $grammaticalFeatures;
+
+ /**
+ * @param LexemeFormId $id |null
+ * @param string $representation
+ * @param ItemId[] $grammaticalFeatures
+ */
+ public function __construct(
+ LexemeFormId $id = null,
+ $representation,
+ array $grammaticalFeatures
+ ) {
$this->id = $id;
$this->representation = $representation;
+ $this->grammaticalFeatures = $grammaticalFeatures;
}
/**
@@ -41,4 +54,8 @@
return $this->representation;
}
+ public function getGrammaticalFeatures() {
+ return $this->grammaticalFeatures;
+ }
+
}
diff --git a/src/DataModel/Serialization/LexemeDeserializer.php
b/src/DataModel/Serialization/LexemeDeserializer.php
index 0a53a68..66bd6b3 100644
--- a/src/DataModel/Serialization/LexemeDeserializer.php
+++ b/src/DataModel/Serialization/LexemeDeserializer.php
@@ -162,7 +162,7 @@
}
// TODO: Throw proper exception if array key does not exist
- return new LexemeForm( $id, $serialization['representation'] );
+ return new LexemeForm( $id, $serialization['representation'],
[] );
}
}
diff --git a/src/View/LexemeFormsView.php b/src/View/LexemeFormsView.php
index 36bd16b..da5a8d3 100644
--- a/src/View/LexemeFormsView.php
+++ b/src/View/LexemeFormsView.php
@@ -2,9 +2,11 @@
namespace Wikibase\Lexeme\View;
+use Wikibase\DataModel\Entity\ItemId;
use Wikibase\Lexeme\DataModel\LexemeForm;
use Wikibase\Lexeme\DataModel\LexemeFormId;
use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
use Wikibase\View\LocalizedTextProvider;
/**
@@ -23,12 +25,19 @@
*/
private $templateFactory;
+ /**
+ * @var EntityIdHtmlLinkFormatter
+ */
+ private $entityIdHtmlFormatter;
+
public function __construct(
LocalizedTextProvider $textProvider,
- LexemeTemplateFactory $templateFactory
+ LexemeTemplateFactory $templateFactory,
+ EntityIdHtmlLinkFormatter $entityIdHtmlFormatter
) {
$this->textProvider = $textProvider;
$this->templateFactory = $templateFactory;
+ $this->entityIdHtmlFormatter = $entityIdHtmlFormatter;
}
/**
@@ -63,11 +72,28 @@
return $this->templateFactory->render( 'wikibase-lexeme-form', [
'some language',
htmlspecialchars( $representation ),
- $this->getFormIdHtml( $form->getId() )
+ $this->getFormIdHtml( $form->getId() ),
+ implode(
+ $this->textProvider->get( 'comma-separator' ),
+ array_map(
+ function ( ItemId $id ) {
+ return
$this->getGrammaticalFeatureHtml( $id );
+ },
+ $form->getGrammaticalFeatures()
+ )
+ )
] );
}
/**
+ * @param ItemId $id
+ * @return string
+ */
+ private function getGrammaticalFeatureHtml( ItemId $id ) {
+ return $this->entityIdHtmlFormatter->formatEntityId( $id );
+ }
+
+ /**
* @param LexemeFormId|null $id
*
* @return string HTML
diff --git a/src/View/LexemeView.php b/src/View/LexemeView.php
index c7eadd7..c5205e6 100644
--- a/src/View/LexemeView.php
+++ b/src/View/LexemeView.php
@@ -105,9 +105,9 @@
// TODO: This obviously is a dummy that must be removed
$forms = [
- new LexemeForm( new LexemeFormId( 'F1' ), 'A' ),
- new LexemeForm( new LexemeFormId( 'F2' ), 'B' ),
- new LexemeForm( new LexemeFormId( 'F3' ), 'C' ),
+ new LexemeForm( new LexemeFormId( 'F1' ), 'A', [] ),
+ new LexemeForm( new LexemeFormId( 'F2' ), 'B', [ new
ItemId( 'Q2' ) ] ),
+ new LexemeForm( new LexemeFormId( 'F3' ), 'C', [ new
ItemId( 'Q2' ), new ItemId( 'Q3' ) ] ),
];
$html = $this->getHtmlForLexicalCategoryAndLanguage( $entity )
diff --git a/src/View/LexemeViewFactory.php b/src/View/LexemeViewFactory.php
index 37844e4..9baab36 100644
--- a/src/View/LexemeViewFactory.php
+++ b/src/View/LexemeViewFactory.php
@@ -7,6 +7,7 @@
use Wikibase\LanguageFallbackChain;
use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\Repo\EntityIdHtmlLinkFormatterFactory;
use Wikibase\Repo\MediaWikiLanguageDirectionalityLookup;
use Wikibase\Repo\MediaWikiLocalizedTextProvider;
use Wikibase\Repo\ParserOutput\FallbackHintHtmlTermRenderer;
@@ -47,6 +48,11 @@
private $entityTermsView;
/**
+ * @var EntityIdHtmlLinkFormatterFactory
+ */
+ private $entityIdHtmlLinkFormatterFactory;
+
+ /**
* @param string $languageCode
* @param LabelDescriptionLookup $labelDescriptionLookup
* @param LanguageFallbackChain $fallbackChain
@@ -58,13 +64,15 @@
LabelDescriptionLookup $labelDescriptionLookup,
LanguageFallbackChain $fallbackChain,
EditSectionGenerator $editSectionGenerator,
- EntityTermsView $entityTermsView
+ EntityTermsView $entityTermsView,
+ EntityIdHtmlLinkFormatterFactory
$entityIdHtmlLinkFormatterFactory
) {
$this->languageCode = $languageCode;
$this->labelDescriptionLookup = $labelDescriptionLookup;
$this->fallbackChain = $fallbackChain;
$this->editSectionGenerator = $editSectionGenerator;
$this->entityTermsView = $entityTermsView;
+ $this->entityIdHtmlLinkFormatterFactory =
$entityIdHtmlLinkFormatterFactory;
}
public function newLexemeView() {
@@ -72,10 +80,6 @@
$languageDirectionalityLookup = new
MediaWikiLanguageDirectionalityLookup();
$localizedTextProvider = new MediaWikiLocalizedTextProvider(
$this->languageCode );
- $formsView = new LexemeFormsView(
- $localizedTextProvider,
- new LexemeTemplateFactory( $templates )
- );
$sensesView = new SensesView( $localizedTextProvider );
$wikibaseRepo = WikibaseRepo::getDefaultInstance();
@@ -99,6 +103,13 @@
->getLanguageFallbackLabelDescriptionLookupFactory()
->newLabelDescriptionLookup( Language::factory(
$this->languageCode ) );
+ $formsView = new LexemeFormsView(
+ $localizedTextProvider,
+ new LexemeTemplateFactory( $templates ),
+ $this->entityIdHtmlLinkFormatterFactory
+ ->getEntityIdFormatter(
$retrievingLabelDescriptionLookup )
+ );
+
return new LexemeView(
TemplateFactory::getDefaultInstance(),
$this->entityTermsView,
diff --git a/tests/browser/features/forms.feature
b/tests/browser/features/forms.feature
index b5e864b..9cbb4b4 100644
--- a/tests/browser/features/forms.feature
+++ b/tests/browser/features/forms.feature
@@ -11,4 +11,8 @@
Then Forms header should be there
And Forms container should be there
And for each Form there is a representation and an ID
- And each representation is enclosed in tag having lang attribute with
"some language" as a value
\ No newline at end of file
+ And each representation is enclosed in tag having lang attribute with
"some language" as a value
+
+ @integration
+ Scenario: View Forms grammatical features
+ And for each Form there is a grammatical feature list
diff --git a/tests/browser/features/step_definitions/forms_steps.rb
b/tests/browser/features/step_definitions/forms_steps.rb
index fb3757d..87dfceb 100644
--- a/tests/browser/features/step_definitions/forms_steps.rb
+++ b/tests/browser/features/step_definitions/forms_steps.rb
@@ -15,4 +15,10 @@
Then(/^each representation is enclosed in tag having lang attribute with
"(.+)" as a value$/) do |value|
#todo: this only checks if there is at least one lang attribute
on(LexemePage).form_representation_element.attribute('lang').should == value
-end
\ No newline at end of file
+end
+
+Given(/^for each Form there is a grammatical feature list$/) do
+ on(LexemePage).forms.each do |form|
+ expect(form.grammatical_features?).to be true
+ end
+end
diff --git a/tests/browser/features/support/pages/lexeme_page.rb
b/tests/browser/features/support/pages/lexeme_page.rb
index 41d9439..63817ac 100644
--- a/tests/browser/features/support/pages/lexeme_page.rb
+++ b/tests/browser/features/support/pages/lexeme_page.rb
@@ -1,3 +1,10 @@
+class LexemeForm
+ include PageObject
+
+ div(:grammatical_features, class:
'wikibase-lexeme-form-grammatical-features')
+end
+
+
class LexemePage
include PageObject
include EntityPage
@@ -9,6 +16,8 @@
span(:senses_header, id: 'senses')
div(:senses_container, class: 'wikibase-lexeme-senses')
+ page_sections(:forms, LexemeForm, class: 'wikibase-lexeme-form')
+
def create_lexeme(lexeme_data)
wb_api = MediawikiApi::Wikidata::WikidataClient.new URL.repo_api
resp = wb_api.create_entity(lexeme_data, "lexeme")
diff --git
a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
index ffbad9b..6a0728a 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeDeserializerTest.php
@@ -164,7 +164,7 @@
$lexeme
];
- $forms = [ new LexemeForm( null, 'form' ) ];
+ $forms = [ new LexemeForm( null, 'form', [] ) ];
$lexeme = new Lexeme( null, null, null, null, null, $forms );
$serializations['with minimal forms'] = [
[
@@ -174,7 +174,8 @@
$lexeme
];
- $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form' ) ];
+ //TODO: Test grammatical features (de)serialization
+ $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form', []
) ];
$lexeme = new Lexeme( new LexemeId( 'L5' ), null, null, null,
null, $forms );
$serializations['with forms and all IDs set'] = [
[
diff --git
a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
index ac71e14..d88eb73 100644
--- a/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
+++ b/tests/phpunit/composer/DataModel/Serialization/LexemeSerializerTest.php
@@ -127,7 +127,7 @@
]
];
- $forms = [ new LexemeForm( null, 'form' ) ];
+ $forms = [ new LexemeForm( null, 'form', [] ) ];
$lexeme = new Lexeme( null, null, $lexicalCategory, $language,
null, $forms );
$serializations['with minimal forms'] = [
$lexeme,
@@ -140,7 +140,7 @@
]
];
- $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form' ) ];
+ $forms = [ new LexemeForm( new LexemeFormId( 'F5' ), 'form', []
) ];
$lexeme = new Lexeme( new LexemeId( 'L5' ), null,
$lexicalCategory, $language, null, $forms );
$serializations['with forms and all IDs set'] = [
$lexeme,
diff --git a/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
b/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
index 86e9ca8..709952e 100644
--- a/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
+++ b/tests/phpunit/mediawiki/View/LexemeFormsViewTest.php
@@ -3,10 +3,15 @@
namespace Wikibase\Lexeme\Tests\MediaWiki\View;
use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
use Wikibase\Lexeme\DataModel\LexemeForm;
use Wikibase\Lexeme\DataModel\LexemeFormId;
use Wikibase\Lexeme\View\LexemeFormsView;
use Wikibase\Lexeme\View\Template\LexemeTemplateFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
+use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\Lib\Store\EntityTitleLookup;
use Wikibase\View\DummyLocalizedTextProvider;
/**
@@ -50,14 +55,32 @@
public function testHtmlContainsFormRepresentationWithIdAndLanguage() {
$view = $this->newFormsView();
$html = $view->getHtml( [
- new LexemeForm( new LexemeFormId( 'FORM_ID' ),
'FORM_REPRESENTATION' )
+ new LexemeForm( new LexemeFormId( 'FORM_ID' ),
'FORM_REPRESENTATION', [] )
] );
assertThat(
$html,
- is( htmlPiece( havingChild( both( tagMatchingOutline(
- '<h3 lang="some language">'
- ) )->andAlso( havingTextContents( 'FORM_REPRESENTATION
(FORM_ID)' ) ) ) ) )
+ is( htmlPiece( havingChild(
+ both( tagMatchingOutline( '<h3 lang="some
language">' ) )
+ ->andAlso( havingTextContents(
containsString( 'FORM_REPRESENTATION (FORM_ID)' ) ) )
+ ) ) )
+ );
+ }
+
+ public function testHtmlContainsFormGrammaticalFeatures() {
+ $view = $this->newFormsView();
+ $grammaticalFeature = new ItemId( 'Q1' );
+ $lexemeForm = new LexemeForm(
+ new LexemeFormId( 'FORM_ID' ),
+ 'FORM_REPRESENTATION',
+ [ $grammaticalFeature ]
+ );
+
+ $html = $view->getHtml( [ $lexemeForm ] );
+
+ assertThat(
+ $html,
+ is( htmlPiece( havingChild( havingTextContents(
containsString( 'Q1' ) ) ) ) )
);
}
@@ -65,9 +88,14 @@
return new LexemeFormsView(
new DummyLocalizedTextProvider(),
new LexemeTemplateFactory( [
- 'wikibase-lexeme-form' => '<h3 lang="$1">$2
$3</h3>',
+ 'wikibase-lexeme-form' => '<h3 lang="$1">$2 $3
$4</h3>',
'wikibase-lexeme-form-id' => '$1',
- ] )
+ ] ),
+ new EntityIdHtmlLinkFormatter(
+ $this->getMock( LabelDescriptionLookup::class ),
+ $this->getMock( EntityTitleLookup::class ),
+ $this->getMock( LanguageNameLookup::class )
+ )
);
}
diff --git a/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
b/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
index 432be6a..72b2d8f 100644
--- a/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
+++ b/tests/phpunit/mediawiki/View/LexemeViewFactoryTest.php
@@ -3,10 +3,13 @@
namespace Wikibase\Lexeme\Tests\MediaWiki\View;
use PHPUnit_Framework_TestCase;
+use Prophecy\Argument;
use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
use Wikibase\LanguageFallbackChain;
use Wikibase\Lexeme\View\LexemeView;
use Wikibase\Lexeme\View\LexemeViewFactory;
+use Wikibase\Lib\EntityIdHtmlLinkFormatter;
+use Wikibase\Repo\EntityIdHtmlLinkFormatterFactory;
use Wikibase\View\EditSectionGenerator;
use Wikibase\View\EntityTermsView;
@@ -21,12 +24,17 @@
class LexemeViewFactoryTest extends PHPUnit_Framework_TestCase {
public function testNewLexemeView() {
+ $formatterFactory = $this->prophesize(
EntityIdHtmlLinkFormatterFactory::class );
+ $formatter = $this->prophesize(
EntityIdHtmlLinkFormatter::class );
+ $formatterFactory->getEntityIdFormatter( Argument::any()
)->willReturn( $formatter );
+
$factory = new LexemeViewFactory(
'en',
$this->getMock( LabelDescriptionLookup::class ),
new LanguageFallbackChain( [] ),
$this->getMock( EditSectionGenerator::class ),
- $this->getMock( EntityTermsView::class )
+ $this->getMock( EntityTermsView::class ),
+ $formatterFactory->reveal()
);
$view = $factory->newLexemeView();
$this->assertInstanceOf( LexemeView::class, $view );
--
To view, visit https://gerrit.wikimedia.org/r/350392
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic5e7ca48f572850f370e0e964e06908dbc1feba8
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Jakob <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: WMDE-leszek <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits