jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/365246 )
Change subject: SenseId property type with demo data ...................................................................... SenseId property type with demo data Didn't want to introduce extra complexity, so just put test data in both Sense.js and SenseIdFormatter.php If you will need to add something don't forget that you need to add in both. Bug: T168373 Change-Id: I1d91aae24c4aa9577d08690ddc32ac2be7ebb6e3 --- M WikibaseLexeme.datatypes.php M extension.json M i18n/en.json M i18n/qqq.json A resources/experts/Sense.js A src/PropertyType/SenseIdFormatter.php 6 files changed, 241 insertions(+), 2 deletions(-) Approvals: WMDE-leszek: Looks good to me, approved Jonas Kress (WMDE): Looks good to me, approved jenkins-bot: Verified diff --git a/WikibaseLexeme.datatypes.php b/WikibaseLexeme.datatypes.php index 55bb50c..77fb280 100644 --- a/WikibaseLexeme.datatypes.php +++ b/WikibaseLexeme.datatypes.php @@ -21,6 +21,7 @@ use Wikibase\Lexeme\DataModel\Lexeme; use Wikibase\Lexeme\PropertyType\FormIdFormatter; use Wikibase\Lexeme\PropertyType\FormIdParser; +use Wikibase\Lexeme\PropertyType\SenseIdFormatter; use Wikibase\Repo\WikibaseRepo; return [ @@ -42,4 +43,14 @@ }, 'value-type' => 'string', ], + 'PT:wikibase-lexeme-sense' => [ + 'expert-module' => 'wikibase.experts.Sense', + 'validator-factory-callback' => function() { + return []; + }, + 'formatter-factory-callback' => function( $format, FormatterOptions $options ) { + return new SenseIdFormatter(); + }, + 'value-type' => 'string', + ], ]; diff --git a/extension.json b/extension.json index 62912b6..5199467 100644 --- a/extension.json +++ b/extension.json @@ -346,6 +346,15 @@ "wikibase.experts.Entity" ] }, + "wikibase.experts.Sense": { + "scripts": [ + "experts/Sense.js" + ], + "dependencies": [ + "jquery.valueview.Expert", + "wikibase.experts.Entity" + ] + }, "wikibase.lexeme.styles": { "position": "top", "styles": [ diff --git a/i18n/en.json b/i18n/en.json index 423d1de..42a7abb 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -20,5 +20,6 @@ "wikibase-lexeme-gloss-empty": "No gloss defined", "wikibase-lexeme-summary-wbeditentity-update": "Changed a lexeme", "datatypes-type-wikibase-lexeme": "Lexeme", - "datatypes-type-wikibase-lexeme-form": "Lexeme Form" + "datatypes-type-wikibase-lexeme-form": "Lexeme Form", + "datatypes-type-wikibase-lexeme-sense": "Lexeme Sense" } diff --git a/i18n/qqq.json b/i18n/qqq.json index ba2e92e..0f2a3cc 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -25,5 +25,6 @@ "wikibase-lexeme-gloss-empty": "Placeholder message displayed instead of the gloss of the sense in case the gloss in the display language has not been specified yet.", "wikibase-lexeme-summary-wbeditentity-update": "Auto-generated edit summary when editing a lexeme", "datatypes-type-wikibase-lexeme": "The name of a data type for lexemes in Wikibase.\n{{Identical|Lexeme}}", - "datatypes-type-wikibase-lexeme-form": "The name of a data type for lexeme forms in Wikibase." + "datatypes-type-wikibase-lexeme-form": "The name of a data type for lexeme forms in Wikibase.", + "datatypes-type-wikibase-lexeme-sense": "The name of a data type for lexeme senses in Wikibase." } diff --git a/resources/experts/Sense.js b/resources/experts/Sense.js new file mode 100644 index 0000000..9f54e87 --- /dev/null +++ b/resources/experts/Sense.js @@ -0,0 +1,123 @@ +module.exports = ( function ( wb, vv ) { + 'use strict'; + + var PARENT = wb.experts.Entity; + + //Basically, copy-paste of src/PropertyType/SenseIdFormatter.php:18-48 + //If you change something here, change also there + var existingSenses = [ + new Sense( 'L13', 'hard', 'English adjective', 'S1', 'presenting difficulty' ), + new Sense( 'L13', 'hard', 'English adjective', 'S2', 'resisting deformation' ), + new Sense( 'L3627', 'difficult', 'English adjective', 'S4', 'not easy, requiring skill' ), + new Sense( 'L283', 'schwierig', 'German adjective', 'S2', 'complicated' ), + new Sense( 'L465', 'dur', 'French adjective', 'S1', 'hard' ), + new Sense( 'L801', 'easy', 'English adjective', 'S1', 'not difficult' ), + new Sense( 'L802', 'simple', 'English adjective', 'S1', 'not difficult' ), + new Sense( 'L803', 'soft', 'English adjective', 'S1', 'easy to deform' ), + new Sense( 'L15', 'Leiter', 'German noun', 'S1', 'leader' ), + new Sense( 'L15', 'Leiter', 'German noun', 'S1', 'electrical conductor' ), + new Sense( + 'L17', + 'ask', + 'English verb', + 'S5', + '\'To ask somebody out\': To request a romantic date' + ), + new Sense( 'L18', 'ask', 'English verb', 'S5', 'To request a romantic date' ), + new Sense( 'L19', 'ask out', 'English verbal phrase', 'S1', 'To request a romantic date' ) + ]; + + /** + * `valueview` `Expert` for specifying a reference to a Wikibase Lexeme Sense. + * @see jQuery.valueview.expert + * @see jQuery.valueview.Expert + * @class wikibase.experts.Sense + * @extends wikibase.experts.Entity + * @license GPL-2.0+ + */ + var SELF = vv.expert( 'wikibaselexemesense', PARENT, { + /** + * @inheritdoc + */ + _init: function () { + var viewState = this.viewState(); + var expert = this; + + //This hack is needed because value is string, but not an EntityId + viewState.value = function fakeSenseValueGetter() { + + //Another hack to display text in input field instead of HTML + var inputValue = expert.$input.val(); + expert.$input.val( $( inputValue ).text() ); + + if ( !this._value ) { + return null; + } + + var value = this._value; + return { + getSerialization: function () { + return value; + } + }; + }; + + PARENT.prototype._initEntityExpert.call( this ); + }, + + _initEntityselector: function ( repoApiUrl ) { + this.$input.entityselector( { + url: repoApiUrl, + type: this.constructor.TYPE, + selectOnAutocomplete: true, + source: function ( query ) { + var found = existingSenses.filter( function ( suggestion ) { + return suggestion.match( query ); + } ); + + return $.Deferred().resolve( found ).promise(); + } + } ); + } + } ); + + /** + * @inheritdoc + */ + SELF.TYPE = 'lexeme-sense'; + + function Sense( + lexemeId, + lemma, + lexemeDescription, + senseId, + gloss + ) { + this.repository = ''; + this.id = lexemeId + '-' + senseId; + this.pageid = 999; + this.datatype = 'string'; + this.lemma = lemma; + + this.label = lemma + ' (' + this.id + '): ' + gloss; + this.description = lexemeDescription; + this.title = '(' + this.id + ') ' + lexemeDescription + ' - ' + gloss; + + this.url = './Lexeme:' + lexemeId + '#' + senseId; + this.concepturi = '/entity/' + lexemeId + '#' + senseId; + + this.match = { type: 'label', language: 'en', text: this.label }; + + this.match = function ( query ) { + var terms = [ + this.id, + this.lemma + ]; + + return terms.join( ' ' ).toLowerCase().indexOf( query.toLowerCase() ) >= 0; + }; + } + + return SELF; + +}( wikibase, jQuery.valueview ) ); diff --git a/src/PropertyType/SenseIdFormatter.php b/src/PropertyType/SenseIdFormatter.php new file mode 100644 index 0000000..4de3561 --- /dev/null +++ b/src/PropertyType/SenseIdFormatter.php @@ -0,0 +1,94 @@ +<?php + +namespace Wikibase\Lexeme\PropertyType; + +use DataValues\StringValue; +use ValueFormatters\ValueFormatter; + +class SenseIdFormatter implements ValueFormatter { + + /** + * @var array[] + */ + private $senses; + + public function __construct() { + //Basically, copy-paste of resources/experts/Sense.js:8-28 + //If you change something here, change also there + $this->addSense( 'L13', 'hard', 'English adjective', 'S1', 'presenting difficulty' ); + $this->addSense( 'L13', 'hard', 'English adjective', 'S2', 'resisting deformation' ); + $this->addSense( + 'L3627', + 'difficult', + 'English adjective', + 'S4', + 'not easy, requiring skill' + ); + $this->addSense( 'L283', 'schwierig', 'German adjective', 'S2', 'complicated' ); + $this->addSense( 'L465', 'dur', 'French adjective', 'S1', 'hard' ); + $this->addSense( 'L801', 'easy', 'English adjective', 'S1', 'not difficult' ); + $this->addSense( 'L802', 'simple', 'English adjective', 'S1', 'not difficult' ); + $this->addSense( 'L803', 'soft', 'English adjective', 'S1', 'easy to deform' ); + $this->addSense( 'L15', 'Leiter', 'German noun', 'S1', 'leader' ); + $this->addSense( 'L15', 'Leiter', 'German noun', 'S1', 'electrical conductor' ); + $this->addSense( + 'L17', + 'ask', + 'English verb', + 'S5', + "'To ask somebody out': To request a romantic date" + ); + $this->addSense( 'L18', 'ask', 'English verb', 'S5', 'To request a romantic date' ); + $this->addSense( + 'L19', + 'ask out', + 'English verbal phrase', + 'S1', + 'To request a romantic date' + ); + } + + /** + * @param \DataValues\StringValue $value + * @return string + */ + public function format( $value ) { + $s = $this->findSenseInfo( $value ); + + if ( !$s ) { + return $value->serialize(); + } + + $title = "({$s['lexemeId']}-{$s['senseId']})"; + $url = "./Lexeme:{$s['lexemeId']}#{$s['senseId']}"; + $label = "{$s['lemma']} ({$s['lexemeId']}-{$s['senseId']}) " . + "{$s['lexemeDescription']}: {$s['gloss']}"; + + return <<<HTML +<a href="$url" title="$title">$label</a> +HTML; + } + + private function addSense( $lexemeId, $lemma, $lexemeDescription, $senseId, $gloss ) { + $this->senses[] = [ + 'lexemeId' => $lexemeId, + 'lemma' => $lemma, + 'lexemeDescription' => $lexemeDescription, + 'senseId' => $senseId, + 'gloss' => $gloss, + ]; + } + + private function findSenseInfo( StringValue $value ) { + list( $lexemeId, $senseId ) = explode( '-', $value->serialize() ); + + foreach ( $this->senses as $sense ) { + if ( $lexemeId === $sense['lexemeId'] && $senseId === $sense['senseId'] ) { + return $sense; + } + } + + return null; + } + +} -- To view, visit https://gerrit.wikimedia.org/r/365246 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I1d91aae24c4aa9577d08690ddc32ac2be7ebb6e3 Gerrit-PatchSet: 7 Gerrit-Project: mediawiki/extensions/WikibaseLexeme Gerrit-Branch: master Gerrit-Owner: Aleksey Bekh-Ivanov (WMDE) <aleksey.bekh-iva...@wikimedia.de> Gerrit-Reviewer: Jonas Kress (WMDE) <jonas.kr...@wikimedia.de> Gerrit-Reviewer: Siebrand <siebr...@kitano.nl> Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de> Gerrit-Reviewer: WMDE-leszek <leszek.mani...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits