MediaWiki:Gadget-admin-update-data.js

Definition från Wiktionary, den fria ordlistan.
Hoppa till navigering Hoppa till sök

OBS: Efter du har publicerat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.

  • Firefox / Safari: Håll ned Skift och klicka på Uppdatera sidan eller tryck Ctrl-F5 eller Ctrl-R (⌘-R på Mac)
  • Google Chrome: Tryck Ctrl-Skift-R (⌘-Skift-R på Mac)
  • Internet Explorer / Edge: Håll ned Ctrl och klicka på Uppdatera eller tryck Ctrl-F5
  • Opera: Tryck Ctrl-F5.
// Uppdatera data genom att gå till [[Wiktionary:Finesser/Uppdatera data]]

// @ts-check

var mw = window.mw;
var $ = window.$;
var OO = window.OO;

if (
  mw.config.get("wgAction") === "view" &&
  mw.config.get("wgPageName") === "Wiktionary:Finesser/Uppdatera_data"
) {
  mw.loader.using(["oojs-ui-core"]).then(function () {
    $("#gadget-data-update-ui").text("");

    var p = getPages();
    for (var pageName in p) {
      showButton(pageName, p[pageName]);
    }
  });
}

function getPages() {
  return {
    "[[MediaWiki:Gadget-data-lang.json]]": function () {
      var langData = JSON.parse($("#lang-data pre").text())[0];
      var språknamn = Object.fromEntries(
        $arr("#lang-språknamn [data-template=språk]").map(function (x) {
          x = $(x).data();
          return [
            x.langCode,
            {
              name: x.langName,
              onlyEtym: x.onlyEtym,
            },
          ];
        })
      );

      var langCodes = Array.from(
        new Set(Object.keys(langData).concat(Object.keys(språknamn)))
      );
      var errors = langCodes
        .map(function (x) {
          if (!langData[x]) {
            return x + " saknas i [[Modul:lang/data]]";
          }
          if (!språknamn[x]) {
            return x + " saknas på [[Wiktionary:Stilguide/Språknamn]]";
          }

          if (langData[x].name !== språknamn[x].name) {
            return (
              x +
              " har namn " +
              langData[x].name +
              " i [[Modul:lang/data]] men namn " +
              språknamn[x].name +
              " på [[Wiktionary:Stilguide/Språknamn]]"
            );
          }

          if (Boolean(langData[x].nolemma) !== språknamn[x].onlyEtym) {
            return (
              x +
              " har nolemma=" +
              langData[x].nolemma +
              " i [[Modul:lang/data]] men onlyEtym=" +
              språknamn[x].onlyEtym +
              " på [[Wiktionary:Stilguide/Språknamn]]"
            );
          }
        })
        .filter(Boolean)
        .join("\n");

      if (errors) {
        throw new Error(errors);
      }

      var entries = langCodes
        .map(function (x) {
          return [x, ucFirst(langData[x].name), langData[x]];
        })
        .sort(function (a, b) {
          return a[1].localeCompare(b[1], "sv");
        });

      return {
        main: Object.fromEntries(
          entries.filter(function (x) {
            return !x[2].nolemma;
          })
        ),
        onlyEtym: Object.fromEntries(
          entries.filter(function (x) {
            return x[2].nolemma;
          })
        ),
      };
    },

    "[[MediaWiki:Gadget-data-lang-code-templates.json]]": function () {
      return Object.fromEntries(
        $arr("#lang-code-templates [data-template]").map(function (x) {
          x = $(x).data();
          return [x.template, x.språk ? "språk" : [x.min, x.max || 99]];
        })
      );
    },

    "[[MediaWiki:Gadget-data-lang-replacements.json]]": function () {
      return Object.fromEntries(
        $arr("#lang-språknamn [data-template=ersättningsspråk]").map(function (
          x
        ) {
          x = $(x).data();
          return [x.langName, x.replacement];
        })
      );
    },

    "[[MediaWiki:Gadget-data-h3.json]]": function () {
      var h3 = JSON.parse($("#h3-data pre").text());
      // There are duplicate values in the JSON, but fromEntries() will only return one value per key.
      return Object.fromEntries(
        Object.values(h3)
          .map(function (x) {
            return [x.short, ucFirst(x.long_sing)];
          })
          .sort()
      );
    },

    // Information about all headings other than language headings and other
    "[[MediaWiki:Gadget-data-headings.json]]": function () {
      return {
        // For languages, see [[MediaWiki:Gadget-data-lang.json]].
        h2: $textToArr("#h2-headings"),
        // For H3 headings with H3 templates, see [[MediaWiki:Gadget-data-h3.json]].
        h4: $textToArr("#h4-headings"),
        // Exceptions to be grandfathered in.
        h2Exceptions: $textToArr("#h2-exceptions"),
        h3Exceptions: $textToArr("#h3-exceptions"),
        h4Exceptions: $textToArr("#h4-exceptions"),
      };
    },
  };
}

function $arr(selector) {
  return Array.from($(selector));
}

function $textToArr(selector) {
  return String($(selector).text())
    .split(/,|\n/)
    .map(function (x) {
      return x.trim();
    })
    .filter(Boolean);
}

/** @param {string} str */
function ucFirst(str) {
  return str && str[0].toUpperCase() + str.slice(1).toLowerCase();
}

function hidden(name, val) {
  return $("<input>", { type: "hidden", name: name }).val(val);
}

/**
 * @param {string} page
 * @param {() => unknown} getCurrent
 */
function showButton(page, getCurrent) {
  page = page.replace(/[\[\]]/g, "");
  var button = new OO.ui.ButtonInputWidget({
    label: "Laddar...",
    disabled: true,
    name: "wpDiff",
    type: "submit",
    flags: ["primary", "progressive"],
  });

  var textbox = hidden("wpTextbox1", "");

  var link = $("<a>", { text: page, href: "/wiki/" + page });

  var form = $("<form>", {
    method: "post",
    target: "_blank",
    action: "/wiki/" + page + "?action=submit",
    css: { margin: "1.5em 0" },
  })
    .append(
      hidden(
        "wpSummary",
        "Uppdatera utifrån [[Wiktionary:Finesser/Uppdatera data]]"
      ),
      textbox,
      button.$element,
      " ",
      link,
      hidden("wpUltimateParam", "1")
    )
    .appendTo("#gadget-data-update-ui");

  function error(e) {
    $("<div>", { css: { whiteSpace: "pre-wrap" } })
      .append($("<strong>", { class: "error", text: e.message || e }))
      .appendTo(form);
    return null;
  }

  fetch("/w/rest.php/v1/page/" + page)
    .then(function (x) {
      if (x.status === 404) {
        link.addClass("new");
        return null;
      }

      return x.json().then(function (x) {
        return JSON.parse(x.source);
      });
    })
    .catch(error)
    .then(function (saved) {
      return { page: page, saved: saved, current: getCurrent() };
    })
    .then(function (x) {
      console.log(x);
      if (JSON.stringify(x.current) === JSON.stringify(x.saved)) {
        button.setLabel("Redan uppdaterad");
      } else {
        textbox.val(
          JSON.stringify(x.current, null, "\t")
            // Slightly nicer formatting.
            .replace(/\[\s+(\d+),\s+(\d+)\s+\]/g, "[$1, $2]")
        );
        button.setDisabled(false);
        button.setLabel("Visa ändringar");
      }
    })
    .catch(error);
}