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

Reply via email to