MediaWiki:Common.js: Difference between revisions

From semantic-hub.io
No edit summary
Replaced content with "mw.loader.load('/w/index.php?title=MediaWiki:CustomExtensions&action=raw&ctype=text/javascript');"
Tag: Replaced
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
mw.loader.load('/w/index.php?title=MediaWiki:CustomExtensions&action=raw&ctype=text/javascript');
 
/**
* EntitySchema Enhancement Scripts
* Loaded for all users automatically
*/
 
// Load EntitySchemaHighlighter
// ----------------------------
// Source: https://www.wikidata.org/wiki/User:Zvpunry/EntitySchemaHighlighter.js
 
$(function() {
  const entityRegEx = /\b[PQ]\d+(?=\b|_)/g;
  const scriptName = 'SchemaItemPropertyHighlighter';
 
  function markupEntities(html, entitiesData) {
    return html.replace(entityRegEx, function(match) {
      if (
        !entitiesData[match] ||
        typeof entitiesData[match].missing !== 'undefined'
      ) {
        return match;
      }
      return $('<a>')
        .attr({
          href: 'https://semantic-hub.io/wiki/' + entitiesData[match].title,
          title: entitiesData[match].labels.en.value,
        })
        .text(match)[0].outerHTML;
    });
  }
 
  async function requestEntitiesData(listOfEntities) {
    const entityBatches = splitIntoBatches(listOfEntities);
 
    const data = {};
    for (const batch of entityBatches) {
      let dataBatch = await requestBatchEntitiesData(batch);
      Object.assign(data, dataBatch);
    }
 
    return data;
  }
 
  async function requestBatchEntitiesData(listOfEntities) {
    const urlBase = 'https://semantic-hub.io/w/api.php';
    const urlParams = {
      action: 'wbgetentities',
      ids: listOfEntities.join('|'),
      props: 'labels|info',
      languages: 'en',
      format: 'json',
      origin: '*',
    };
 
    return fetch(urlBase + '?' + jQuery.param(urlParams))
      .then(function(response) {
        return response.json();
      })
      .then(function(responseData) {
        if (responseData.error) {
          console.warn('Error in userscript: ' + scriptName);
          console.warn({
            code: responseData.error.code,
            info: responseData.error.info,
            servedby: responseData.servedby,
          });
          return;
        }
        return responseData.entities;
      });
  }
 
  function splitIntoBatches(listOfEntities) {
    const maxBatchSize = 50.0;
    return listOfEntities.reduce((acc, cur, i) => {
      const index = Math.floor(i / maxBatchSize);
      if (!acc[index]) {
        acc[index] = [];
      }
      acc[index].push(cur);
      return acc;
    }, []);
  }
 
  function getListOfEntitiesFromSchemaText(schemaText) {
    return [...new Set(schemaText.match(entityRegEx))];
  }
 
  const $schemaText = $('#entityschema-schema-text');
  if (!$schemaText.length || !$schemaText.text().length) {
    return;
  }
 
  const listOfEntities = getListOfEntitiesFromSchemaText($schemaText.html());
  if (!listOfEntities.length) {
    return;
  }
 
  requestEntitiesData(listOfEntities)
    .then(function(responseData) {
      $schemaText.html(markupEntities($schemaText.html(), responseData));
    })
    .catch(function(error) {
      console.warn('Error in userscript: ' + scriptName);
      console.warn(error);
    });
});
 
// Load EntityShape validator
// --------------------------
// Source: https://www.wikidata.org/wiki/User:Teester/EntityShape.js
/**
* EntityShape.js adds an input box to a wikidata page wherein you can enter an entityschema
* (such as E10).  When you click "Check", checks whether each statement and property conforms
* to the schema.  It then displays a summary at the top of the item for each property indicating
* whether they conform or not.  It also adds a badge to each statement and each property on the
* page indicating whether they conform or not.
**/
 
(function() {
    "use strict";
 
    mw.util.addCSS(entityschema_getStylesheet());
    let entityschema_list = [];
    let value = mw.storage.get("entityschema-auto");
    let schema = mw.storage.get("entityschema");
    let lang = mw.config.get( 'wgUserLanguage' );
    let property_list = [];
 
    mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( data ) {
        let valid_values = ['item', 'lexeme', 'property'];
        if (!valid_values.includes(data["type"])) { return; }
 
        mw.util.addSubtitle(entityschema_getHTML());
        $("#entityschema-checkbox").prop('checked', value);
        $("#entityschema-schemaSearchButton").click(function(){ entityschema_update(); });
        $("#entityschema-checkbox").click(function() { entityschema_checkbox(); });
 
        let claims = data["claims"];
        for (let claim in claims) {
            property_list.push(claim);
            let statements = claims[claim];
            for (let statement in statements) {
                let mainsnak = statements[statement]["mainsnak"];
                if (mainsnak["datavalue"] && mainsnak["datatype"] == "wikibase-item") {
                    if (!property_list.includes(mainsnak["datavalue"]["value"]["id"])) {
                        property_list.push(mainsnak["datavalue"]["value"]["id"]);
                    }
                }
            }
        }
        check_entity_for_schemas(property_list);
    });
 
    mw.hook( 'wikibase.statement.saved' ).add( function ( data ) {
        if (value == "true") {
            entityschema_update();
        }
    });
 
    mw.hook( 'wikibase.statement.removed' ).add( function ( data ) {
        if (value == "true") {
            entityschema_update();
        }
    });
 
    function check_entity_for_schemas(entity_list) {
        const api = new mw.Api({'User-Agent': 'Userscript Entityshape by User:Teester'});
        for (let item in entity_list) {
            api.get({
                action: 'wbgetclaims',
                property: 'P12861',
                entity: entity_list[item],
                format: 'json'})
                .fail(function() { console.log("failed to get schemas") })
                .done(function(data) {
                    if (data["claims"].hasOwnProperty("P12861")) {
                        let claims = data["claims"]["P12861"];
                        for (let claim in claims) {
                            entityschema_list.push(claims[claim]["mainsnak"]["datavalue"]["value"]["id"]);
                        }
                    }
                });
        }
    }
 
    $(document).ajaxStop(function () {
        if (entityschema_list.length != 0) {
            $('#entityschema-entityToCheck').attr("placeholder", entityschema_translate("Check against", entityschema_list.join(', ') ) );
        }
        if (value == "true" && mw.config.get( 'wbEntityId' )) {
            entityschema_update();
        }
        $("#entityschema-entityToCheck:text").val(schema);
        $(this).unbind('ajaxStop');
    });
 
    $("#entityschema-entityToCheck").on("keyup", function(event){
        if (event.key === "Enter") {
            event.preventDefault();
            $("#entityschema-schemaSearchButton").click();
            return false;
        }
    });
 
    function entityschema_update() {
        let entityschema_entitySchema = $("#entityschema-entityToCheck")[0].value.toUpperCase();
        if (entityschema_entitySchema.length == 0) {
            entityschema_entitySchema = entityschema_list.join(", ");
            mw.storage.remove("entityschema");
        } else {
            mw.storage.set("entityschema", entityschema_entitySchema);
        }
        if (entityschema_entitySchema.length == 0) {
            let message = new OO.ui.MessageWidget( {type: 'error', inline: true,
                label: entityschema_translate('No schemas entered and could not automatically determine schemas to check') } );
            $("#entityschema-response").empty().prepend( message.$element );
        } else {
            let entityschema_entityName = document.location.pathname.substring(6);
            entityschema_checkEntity(entityschema_entityName, entityschema_entitySchema, lang);
        }
    }
 
    function entityschema_checkbox() {
        if ($('#entityschema-checkbox').is(":checked")) {
            mw.storage.set("entityschema-auto", true);
        } else {
            mw.storage.set("entityschema-auto", false);
        }
    }
 
    function entityschema_checkEntity(entity, entitySchema, language) {
        $("#entityschema-response").contents().remove();
        $(".entityschema-property").remove();
        $(".entityschema-span").remove();
 
        let url = "https://entityshape.toolforge.org/api/v2?entityschema=" + entitySchema + "&entity=" + entity + "&language=" + language;
        // let url = "http://127.0.0.1:5000/api/v2 ?entityschema=" + entitySchema + "&entity=" + entity + "&language=" + language;
        $.ajax({
            type: "GET",
            dataType: "json",
            url: url,
            beforeSend: function() {
                $(".entityshape-spinner").show();
            },
            success: function(data){
                for (let i = 0; i < data.schema.length; i++ ) {
                    if (data.properties[i]) {
                        entityschema_add_to_properties(data.properties[i], data.schema[i], data.name[i]);
                    }
                    if (data.statements[i]) {
                        entityschema_add_to_statements(data.statements[i], data.schema[i], data.name[i]);
                    }
                    if (data.general[i]) {
                        entityschema_add_general(data.general[i]);
                    }
                }
 
                const combined_properties = entityschema_combine_properties(data.properties, data.schema);
 
                let message_data = [];
                for (let schema in data.schema) {
                    message_data.push(`<a href='https://semantic-hub.io/wiki/EntitySchema:${data.schema[schema]}'>
                                      ${data.name[schema]} <small>(${data.schema[schema]})</small></a>`);
                }
                let message = `${entityschema_translate('Checking against', message_data.join(', '))}:`;
 
                let message_widget = new OO.ui.MessageWidget( {type: 'notice', inline: true,
                                                        label: new OO.ui.HtmlSnippet( message )} );
                $("#entityschema-response" ).append( message_widget.$element );
 
                let html = `<div style="overflow-y: scroll; max-height:200px;">
                            <table style="width:100%;">
                            <th class="entityschema_table" title="${entityschema_translate('Properties in this item which must be present')}">${entityschema_translate("Required properties")}</th>
                            <th class="entityschema_table" title="${entityschema_translate('Properties in this item which can be present but do not have to be')}">${entityschema_translate("Optional properties")}</th>
                            <th class="entityschema_table" title="${entityschema_translate('Properties in this item which are not allowed to be present or not mentioned in the entityschema')}">${entityschema_translate("Other properties")}</th>
                            <tr>`;
 
                html += entityschema_process_combined_properties(combined_properties);
 
                $("#entityschema-response" ).append( html );
                $(".entityshape-spinner").hide();
            },
            error: function(data) {
                let message = new OO.ui.MessageWidget( {type: 'error', inline: true,
                                label: 'Unable to validate schema'} );
                $("#entityschema-response" ).append( message.$element );
                $(".entityshape-spinner").hide();
            }
        });
    }
 
    function entityschema_process_combined_properties(properties) {
        let required_html = '<td class="entityschema_table required"><ul style="list-style-type:none";>';
        let optional_html = '<td class="entityschema_table optional"><ul style="list-style-type:none";>';
        let absent_html = '<td class="entityschema_table absent"><ul style="list-style-type:none";>';
        let other_array = [];
        let other_array_names = [];
        for (let key in properties) {
            let shape_html = "";
            let response1 = properties[key].response.combined;
            let response_class  = "";
            let response_string = properties[key].response.combined;
            switch (response1) {
                case "present":
                    response_class = "present";
                    response_string = entityschema_translate("present");
                    break;
                case "allowed":
                    response_class = "present";
                    response_string = entityschema_translate("present");
                    break;
                case "correct":
                    response_class = "correct";
                    response_string = entityschema_translate("correct");
                    break;
                case "missing":
                    response_class = "missing";
                    response_string = entityschema_translate("missing");
                    break;
                default:
                    response_class = "wrong";
                    response_string = entityschema_translate("wrong");
                    break;
            }
            if (properties[key].necessity.combined == "absent") {
                if (response1 == "too many statements") {
                    response1 = "not allowed";
                    response_string = entityschema_translate("not allowed");
                }
            }
            if (!response1) {
                response1 = "Not in schema";
                response_string = entityschema_translate("Not in schema");
                response_class = "notinschema";
            }
            let schema_link = `<span class="wb-itemlink"><span class="wb-itemlink-label" lang="en" dir="ltr">${properties[key].name}</span> <span class="wb-itemlink-id">(${key})</span></span>`;
            if (response1 == null) {
                response1 = "";
                shape_html += `<a href="https://semantic-hub.io/wiki/Property:${key}">${schema_link}</a><br/>`;
            } else if (response1 == "Not in schema") {
                other_array.push(key);
                other_array_names.push(schema_link);
            } else {
                shape_html += `<li class="is_entityschema-${response_class}">
                              <span class="entityschema-span entityschema-${response_class}">${response_string}</span>
                              <a href="https://semantic-hub.io/wiki/Property:${key}"
                                  class="is_entityschema-${response_class}">
                              ${schema_link}</a></li>`;
            }
            switch (properties[key].necessity.combined) {
                case "required":
                    required_html += shape_html;
                    break;
                case "optional":
                    optional_html += shape_html;
                    break;
                default:
                    absent_html += shape_html;
                    break;
            }
        }
        let other_html = `<details><summary>${entityschema_translate("properties not in any schema checked", other_array.length)} </summary>
                          <ul style='list-style-type:none';>`;
        for (let item in other_array) {
            other_html += `<li><span class="entityschema-span entityschema-notinschema">${entityschema_translate("Not in schema")}</span>
                              <a href="https://semantic-hub.io/wiki/Property:${other_array[item]}"
                                  class="is_entityschema-notinschema">${other_array_names[item]}</a></li>`;
        }
        other_html += "</ul></details>";
        absent_html += "</ul>" + other_html;
        required_html += "</ul></td>";
        optional_html += "</ul></td>";
        absent_html += "</td>";
        let html = required_html + optional_html + absent_html + '</tr></table></div>';
        return html;
    }
 
    function entityschema_add_to_properties(properties, schema, name) {
        for (let key in properties) {
          let response = properties[key].response;
          let response_class = "";
            switch (response) {
                case "present":
                    response_class = "present";
                    break;
                case "correct":
                    response_class = "correct";
                    break;
                case "missing":
                    response_class = "missing";
                    break;
                default:
                    response_class = "wrong";
                    break;
            }
            if (properties[key].necessity == "absent") {
                if (response == "too many statements") {
                    response = "not allowed";
                }
            }
            if (!response) {
                response = "Not in schema";
                response_class = "notinschema";
            }
            if (response == null) {
                response = "Not in schema";
                response_class = "notinschema";
            }
            if (response != "Not in schema" && $("#" + key)[0]) {
                let html =`<br class='entityschema-property'/>
                          <div style='display:inline-block;'
                                class='entityschema-span entityschema-property entityschema-${response_class}'
                                title='${schema}: ${name}'>${schema}: ${response}
                          </div>`;
                $(`#${key} .wikibase-statementgroupview-property-label`).append(html);
            }
        }
    }
 
    function entityschema_add_to_statements(statements, schema, name) {
        for (let statement in statements) {
            let response = statements[statement].response;
            if (response != "not in schema") {
                let html = `<br class='entityschema-property'/>
                            <span class='entityschema-span entityschema-property entityschema-${response}'
                                  title='${schema}: ${name}'>${schema}: ${response}
                            </span>`;
                $(`div[id='${statement}'] .wikibase-toolbar-button-edit`).append(html);
            }
        }
    }
 
    function entityschema_add_general(general) {
        if (general.language) {
            entityschema_add_general_item("language", general.language);
        }
        if (general.lexicalCategory) {
            entityschema_add_general_item("lexical_category", general.lexicalCategory);
        }
    }
 
    function entityschema_add_general_item(general_type, response) {
        if (response != "not in schema") {
            html = `<span class='entityschema-property'/>
                    <span class='entityschema-span entityschema-property entityschema-${response}'>${response}
                    </span>`;
            $(`span[class='language-lexical-category-${general_type}']`).append(html);
        }
    }
 
    function entityschema_combine_properties(property, schema) {
        let combined_properties = {};
        for (let i = 0; i < schema.length; i++ ) {
            for (let key in property[i]) {
              if(!combined_properties.hasOwnProperty(key)){ combined_properties[key] = {}; }
              combined_properties[key]["name"] = property[i][key]["name"];
              if(!combined_properties[key].hasOwnProperty("response")) { combined_properties[key]["response"] = {}; }
              combined_properties[key]["response"][schema[i]] = property[i][key]["response"];
              if(!combined_properties[key].hasOwnProperty("necessity")) { combined_properties[key]["necessity"] = {}; }
              combined_properties[key]["necessity"][schema[i]] = property[i][key]["necessity"];
            }
        }
        for (let key in combined_properties) {
            let necessity = "absent";
            let response = "";
            let response_key = combined_properties[key]["response"];
            let necessity_key = combined_properties[key]["necessity"];
 
            if (Object.values(necessity_key).includes("required")) {
                necessity = "required";
            } else if (Object.values(necessity_key).includes("optional")) {
                necessity = "optional";
            }
 
            if (Object.values(response_key).includes("incorrect")) {
                response = "incorrect";
            } else if (Object.values(response_key).includes("missing")) {
                response = "missing";
            } else if (Object.values(response_key).includes("too many statements")) {
                response = "too many statements";
            } else if (Object.values(response_key).includes("not enough statements")) {
                response = "not enough statements";
            } else if (Object.values(response_key).includes("correct")) {
                response = "correct";
            } else if (Object.values(response_key).includes("present")) {
                response = "present";
            } else if (Object.values(response_key).includes("allowed")) {
                response = "present";
            }
            combined_properties[key]["response"]["combined"] = response;
            combined_properties[key]["necessity"]["combined"] = necessity;
        }
        return combined_properties;
    }
 
    function entityschema_translate(phrase, variable="") {
        const translations = {
            "en": {
                // Strings in the checking UI
                "Enter schema to check against": "Enter schema to check against e.g. E234",
                "Check against entityschema": "Check against entityschema",
                "Check against" : `Check against ${variable}`,
                "Checking against": `Checking against ${variable}`,
                "Check": "Check",
                "Automatically check schema": "Automatically check schema",
                "Unable to validate schema": "Unable to validate schema",
                "No schemas entered and could not automatically determine schemas to check": "No schemas entered and could not automatically determine schemas to check",
                // Strings in the results section UI
                "Properties in this item which must be present": "Properties in this item which must be present",
                "Required properties": "Required properties",
                "Properties in this item which can be present but do not have to be": "Properties in this item which can be present but do not have to be",
                "Optional properties": "Optional properties",
                "Properties in this item which are not allowed to be present or not mentioned in the entityschema": "Properties in this item which are not allowed to be present or not mentioned in the entityschema",
                "Other properties": "Other properties",
                "properties not in any schema checked": `${variable} properties not in any schema checked`,
                // Strings for results
                "present": "present",
                "correct": "correct",
                "missing": "missing",
                "wrong": "wrong",
                "absent": "absent",
                "too many statements": "too many statements",
                "not allowed": "not allowed",
                "Not in schema": "Not in schema"
            },
            "ga": {
                // Strings in the checking UI
                "Enter schema to check against": "Cuir scéima isteach chun seiceáil m.sh. E234",
                "Check against entityschema": "Seiceáil trí scéim eintitis",
                "Check against" : `Seiceáil trí ${variable}`,
                "Checking against": `Ag seiceáil trí ${variable}`,
                "Check": "Seiceáil",
                "Automatically check schema": "Seiceáil scéima go huathoibríoch",
                "Unable to validate schema": "Ní féidir scéima bailíochtú",
                "No schemas entered and could not automatically determine schemas to check": "Níor iontráladh aon scéimeanna agus níorbh fhéidir scéimeanna le seiceáil a chinneadh go huathoibríoch",
                // Strings in the results section UI
                "Properties in this item which must be present": "Airíonna sa mhír seo nach mór a bheith i láthair",
                "Required properties": "Airíonna riachtanacha",
                "Properties in this item which can be present but do not have to be": "Airíonna sa mhír seo a fhéadfaidh a bheith i láthair ach nach gá a bheith ann",
                "Optional properties": "Airíonna roghnacha",
                "Properties in this item which are not allowed to be present or not mentioned in the entityschema": "Airíonna sa mhír seo nach gceadaítear dóibh a bheith i láthair nó nach luaitear sa scéim eintitis",
                "Other properties": "Airíonna eile",
                "properties not in any schema checked": `Bhí ${variable} airíonna nach raibh in aon scéim seicáilte`,
                // Strings for results
                "present": "ann",
                "correct": "ceart",
                "missing": "ar iarraidh",
                "wrong": "míceart",
                "absent": "as lathair",
                "too many statements": "an iomarca ráiteas",
                "not allowed": "ní cheadaítear",
                "Not in schema": "ní sa scéim"
            }
        };
        let language = "en";
        if (translations.hasOwnProperty(lang)) {
            language = lang;
        }
        return translations[language][phrase];
    }
 
    function entityschema_getStylesheet() {
        const entityschema_stylesheet = `#entityschema-simpleSearch { width:500px; }
                                        #entityschema-response { padding:5px; display: block; }
                                        .entityschema-summary  { color: var(--color-progressive,#0645ad); }
                                        a.is_entityschema-present { color: #008800; }
                                        a.is_entityschema-allowed { color: #008800; }
                                        a.is_entityschema-correct { color: #00CC00; }
                                        a.is_entityschema-missing { color: #FF5500; }
                                        a.is_entityschema-notinschema { color: #FF5500; }
                                        a.is_entityschema-wrong { color: #CC0000; }
                                        a.is_entityschema-wrong_amount { color: #CC0000; }
                                        a.is_entityschema-incorrect { color: #CC0000; }
                                        .entityschema_table {vertical-align: top; width: 33%; }
                                        .entityschema-missing { background-color: #FF8C00; }
                                        .entityschema-notinschema { background-color: #FF8C00; }
                                        .entityschema-wrong { background-color: #CC0000; }
                                        .entityschema-incorrect { background-color: #CC0000; }
                                        .entityschema-wrong_amount { background-color: #CC0000; }
                                        .entityschema-excess { background-color: #CC0000; }
                                        .entityschema-deficit { background-color: #CC0000; }
                                        .entityschema-present { background-color: #008800; }
                                        .entityschema-allowed { background-color: #008800; }
                                        .entityschema-correct { background-color: #00CC00; }
                                        .required .entityschema-missing { background-color: #FF0000;}
                                        .required a.is_entityschema-missing { color: #FF0000;}
                                        .absent .entityschema-missing { display: none;}
                                        .absent a.is_entityschema-missing { display: none;}
                                        .entityschema-span { color: #ffffff; padding:2px; margin: 2px; font-size:75%; border-radius:2px; }
                                        .entityshape-spinner,.entityshape-spinner div,.entityshape-spinner div:after {box-sizing: border-box;}
                                        .entityshape-spinner { padding-top:5px; padding-bottom:5px; color: currentColor; display: inline-block; position: relative; width: 20px; height: 20px;}
                                        .entityshape-spinner div { transform-origin: 10px 10px; animation: entityshape-spinner 1.2s linear infinite;}
                                        .entityshape-spinner div:after { content: " "; display: block; position: absolute; top: 0.8px; left: 9.2px; width: 1.6px; height: 4.4px; border-radius: 20%; background: currentColor;}
                                        .entityshape-spinner div:nth-child(1) { transform: rotate(0deg); animation-delay: -1.1s;}
                                        .entityshape-spinner div:nth-child(2) { transform: rotate(30deg); animation-delay: -1s;}
                                        .entityshape-spinner div:nth-child(3) { transform: rotate(60deg); animation-delay: -0.9s;}
                                        .entityshape-spinner div:nth-child(4) { transform: rotate(90deg); animation-delay: -0.8s;}
                                        .entityshape-spinner div:nth-child(5) { transform: rotate(120deg); animation-delay: -0.7s;}
                                        .entityshape-spinner div:nth-child(6) { transform: rotate(150deg); animation-delay: -0.6s;}
                                        .entityshape-spinner div:nth-child(7) { transform: rotate(180deg); animation-delay: -0.5s;}
                                        .entityshape-spinner div:nth-child(8) { transform: rotate(210deg); animation-delay: -0.4s;}
                                        .entityshape-spinner div:nth-child(9) { transform: rotate(240deg); animation-delay: -0.3s;}
                                        .entityshape-spinner div:nth-child(10) { transform: rotate(270deg); animation-delay: -0.2s;}
                                        .entityshape-spinner div:nth-child(11) { transform: rotate(300deg); animation-delay: -0.1s;}
                                        .entityshape-spinner div:nth-child(12) { transform: rotate(330deg); animation-delay: 0s;}
                                        @keyframes entityshape-spinner { 0% { opacity: 1; } 100% { opacity: 0; }}`;
        return entityschema_stylesheet;
    }
 
    function entityschema_getHTML() {
        const entityschema_results_html = `<details open style='box-shadow: 0 1px var(--border-color-subtle,#c8ccd1);'>
                                          <summary class='entityschema-summary'>${entityschema_translate("Check against entityschema")}</summary>
                                          <div class="oo-ui-layout oo-ui-horizontalLayout">
                                              <div class="oo-ui-layout oo-ui-fieldLayout oo-ui-fieldLayout-align-top oo-ui-actionFieldLayout">
                                                  <div class="oo-ui-fieldLayout-body">
                                                      <div id="entityschema-simpleSearch" class="oo-ui-fieldLayout-field">
                                                          <div class="oo-ui-actionFieldLayout-input">
                                                              <div class="oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text">
                                                                  <input type="text" tabindex="0" class="oo-ui-inputWidget-input" value="" id="entityschema-entityToCheck" placeholder="${entityschema_translate("Enter schema to check against")}">
                                                              </div>
                                                          </div>
                                                          <span class="oo-ui-actionFieldLayout-button" id="entityschema-schemaSearchButton">
                                                              <span class="oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-buttonWidget">
                                                                  <a class="oo-ui-buttonElement-button" role="button" tabindex="0" rel="nofollow">
                                                                      <span class="oo-ui-labelElement-label">${entityschema_translate("Check")}</span>
                                                                  </a>
                                                              </span>
                                                          </span>
                                                      </div>
                                                  </div>
                                              </div>
                                              <div class="entityshape-spinner" style="display:none"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
                                              <div class="oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-inline">
                                                  <div class="oo-ui-fieldLayout-body">
                                                      <span class="oo-ui-fieldLayout-field">
                                                          <span class="oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-checkboxInputWidget">
                                                              <input type="checkbox" tabindex="0" class="oo-ui-inputWidget-input" value="" id="entityschema-checkbox">
                                                              <span class="oo-ui-checkboxInputWidget-checkIcon oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-check oo-ui-labelElement-invisible oo-ui-iconWidget oo-ui-image-invert">
                                                              </span>
                                                          </span>
                                                      </span>
                                                      <span class="oo-ui-fieldLayout-header">
                                                          <label class="oo-ui-labelElement-label">${entityschema_translate("Automatically check schema")}</label>
                                                      </span>
                                                  </div>
                                              </div>
                                          </div>
                                          <span id="entityschema-response"></span></details>`;
        return entityschema_results_html;
    }
}());

Revision as of 22:44, 12 January 2026

mw.loader.load('/w/index.php?title=MediaWiki:CustomExtensions&action=raw&ctype=text/javascript');