User:Envlh/FrenchLexemes.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**

Adds buttons to quickly improve French lexemes:
* missing gender (P5185) on nouns and nominal locutions
* missing group (P5186) on verbs
* missing auxiliary (P5401) on verbs
* more precise lexical categories on nouns with spaces and locutions

To use it, add the following line to [[Special:MyPage/common.js]]:
importScript('User:Envlh/FrenchLexemes.js');

**/

mw.loader.using('mediawiki.api').then(function() {
  ( function ( mw ) {

    var lid = mw.config.get('wbEntityId');
    var api = new mw.Api();

    function isFrench() {
      var a = document.querySelector('.language-lexical-category-widget_language a');
      return (a != null) && (a.title == 'Q150');
    }

    function isNoun() {
      var a = document.querySelector('.language-lexical-category-widget_lexical-category a');
      return (a != null) && (a.title == 'Q1084');
    }

    function isVerb() {
      var a = document.querySelector('.language-lexical-category-widget_lexical-category a');
      return (a != null) && (a.title == 'Q24905');
    }

    function isLocution() {
      var a = document.querySelector('.language-lexical-category-widget_lexical-category a');
      return (a != null) && (a.title == 'Q3257782');
    }
    
    function isLocutionNominale() {
      var a = document.querySelector('.language-lexical-category-widget_lexical-category a');
      return (a != null) && (a.title == 'Q29888377');
    }
    
    function lemmaContainsSpace() {
      var lemmas = document.querySelectorAll('.lemma-widget_lemma-value');
      var found = false;
      var i = 0;
      while ((!found) && (i < lemmas.length)) {
        found = lemmas[i].innerHTML.includes(' ');
        i++;
      }
      return found;
    }

    function hasProperty(pid) {
      return document.getElementById(pid) != null;
    }

    function addFormLocution() {
      var div = document.createElement('div');
      div.setAttribute('id', 'form-locution');
      div.innerHTML = '<p>Catégorie lexicale : <button id="button-locution-Q29888377">Locution nominale</button> <button id="button-locution-Q10976085">Locution verbale</button> <button id="button-locution-Q12734432">Locution adjectivale</button></p>';
      document.getElementById('claims').before(div);
      document.getElementById('button-locution-Q29888377').addEventListener('click', function() { setLexicalCategory('Q29888377'); }, false);
      document.getElementById('button-locution-Q10976085').addEventListener('click', function() { setLexicalCategory('Q10976085'); }, false);
      document.getElementById('button-locution-Q12734432').addEventListener('click', function() { setLexicalCategory('Q12734432'); }, false);
    }

    function addFormGender() {
      var div = document.createElement('div');
      div.setAttribute('id', 'form-P5185');
      div.innerHTML = '<p>Genre : <button id="button-P5185-Q1775415">Féminin</button> <button id="button-P5185-Q499327">Masculin</button></p>';
      document.getElementById('claims').before(div);
      document.getElementById('button-P5185-Q1775415').addEventListener('click', function() { addStatement('P5185', 'Q1775415'); }, false);
      document.getElementById('button-P5185-Q499327').addEventListener('click', function() { addStatement('P5185', 'Q499327'); }, false);
    }

    function addFormGroup() {
      var div = document.createElement('div');
      div.setAttribute('id', 'form-P5186');
      div.innerHTML = '<p>Groupe : <button id="button-P5186-Q2993354">Premier</button> <button id="button-P5186-Q2993353">Deuxième</button> <button id="button-P5186-Q2993358">Troisième</button></p>';
      document.getElementById('claims').before(div);
      document.getElementById('button-P5186-Q2993354').addEventListener('click', function() { addStatement('P5186', 'Q2993354'); }, false);
      document.getElementById('button-P5186-Q2993353').addEventListener('click', function() { addStatement('P5186', 'Q2993353'); }, false);
      document.getElementById('button-P5186-Q2993358').addEventListener('click', function() { addStatement('P5186', 'Q2993358'); }, false);
    }

    function addFormAuxiliary() {
      var div = document.createElement('div');
      div.setAttribute('id', 'form-P5401');
      div.innerHTML = '<p>Auxiliaire : <button id="button-P5401-L1886">Avoir</button> <button id="button-P5401-L1882">Être</button></p>';
      document.getElementById('claims').before(div);
      document.getElementById('button-P5401-L1886').addEventListener('click', function() { addStatement('P5401', 'L1886'); }, false);
      document.getElementById('button-P5401-L1882').addEventListener('click', function() { addStatement('P5401', 'L1882'); }, false);
    }

    function addStatement(property, value) {
      tag = document.getElementById('form-' + property);
      tag.style.color = 'red';
      tag.style.fontWeight = 'bold';
      tag.innerHTML = '<p>Ajout de ' + property + ' = ' + value + '...</p>';
      var entity_type = null;
      var first_letter = value.substring(0, 1);
      if (first_letter == 'Q') {
        entity_type = 'item';
      } else if (first_letter == 'L') {
        entity_type = 'lexeme';
      } else {
        console.error('Unsupported value.');
        return;
      }
      api.postWithEditToken( {
        action : 'wbcreateclaim',
        entity : lid,
        snaktype : 'value',
        property : property,
        value : '{"entity-type":"' + entity_type + '","id":\"' + value + '\"}',
        summary: '[[User:Envlh/FrenchLexemes.js]]',
      } )
      .done(function( data ) {
        tag.innerHTML = '<p>' + property + ' = ' + value + ' ajouté ! Rechargez la page.</p>';
      } )
      .fail(function( data ) {
        tag.innerHTML = '<p>Erreur lors de l\'appel à l\'API :(</p>';
      } )
    }

    function setLexicalCategory(id) {
      tag = document.getElementById('form-locution');
      tag.style.color = 'red';
      tag.style.fontWeight = 'bold';
      tag.innerHTML = '<p>Modification de la catégorie lexicale...</p>';
      api.get( {
        'action': 'wbgetentities',
        'ids': lid,
        'props': 'info'
      } )
      .done( function ( data ) {
        var d = {};
        d['lemmas'] = data['entities'][lid]['lemmas'];
        d['language'] = data['entities'][lid]['language'];
        d['lexicalCategory'] = id;
        api.postWithEditToken( {
          action : 'wbeditentity',
          format: 'json',
          id: lid,
          data: JSON.stringify(d),
          summary: 'lexical category changed to [[' + id + ']] [[User:Envlh/FrenchLexemes.js]]',
        } )
        .done(function( data ) {
          tag.innerHTML = '<p>Catégorie lexicale modifiée ! Rechargez la page.</p>';
        } )
        .fail(function( data ) {
          tag.innerHTML = '<p>Erreur lors du second appel à l\'API :(</p>';
        } )
      } )
      .fail(function( data ) {
        tag.innerHTML = '<p>Erreur lors du premier appel à l\'API :(</p>';
      } )
   }

    function init() {
      if (isFrench()) {
        if (isLocution() || (isNoun() && lemmaContainsSpace())) {
          addFormLocution();
        }
        if ((isNoun() || isLocutionNominale()) && !hasProperty('P5185')) {
          addFormGender();
        }
        if (isVerb()) {
          if (!hasProperty('P5186')) {
            addFormGroup();
          }
          if (!hasProperty('P5401')) {
            addFormAuxiliary();
          }
        }
      }
    }

    init();

  } ( mediaWiki ) );
});