User:Nikki/KeyShortcuts.js: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
make it possible to tab to the rank selector when adding a new statement |
use em sizes for the help dialog, make the help dialog always visible but set a max height relative to the window height so that it will scroll when necessary |
||
Line 233: | Line 233: | ||
+ "background-color: #f9f9f9; background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee);" |
+ "background-color: #f9f9f9; background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee);" |
||
+ "padding: 0.1em 0.3em; font-size: 0.85em"; |
+ "padding: 0.1em 0.3em; font-size: 0.85em"; |
||
var n_help_html = "<div id='n_keyshortcuts_help' style='display: none; width: |
var n_help_html = "<div id='n_keyshortcuts_help' style='display: none; width: ; z-index: 100;" |
||
+ "background-color: white; border: 2px solid black; padding: |
+ "background-color: white; border: 2px solid black; padding: ; margin: ;" |
||
+ "position: |
+ "position: ; top: 0px; right: 0px;'>"; |
||
for (var i in n_keymap) { |
for (var i in n_keymap) { |
||
n_help_html = n_help_html + i + "<ul style='list-style: none; padding-left: 0; margin-left: 0.5em;'>"; |
n_help_html = n_help_html + i + "<ul style='list-style: none; padding-left: 0; margin-left: 0.5em;'>"; |
Revision as of 23:05, 6 October 2022
/* This script is based on [[MediaWiki:Gadget-KeyShortcuts.js]]
and adds key shortcuts for a variety of common actions, including:
* Editing labels and lemmas.
* Adding new statements, forms and senses.
* Adding another statement for the same property.
* Editing or adding a reference to the last saved statement.
* Adding a statement to the last saved form or sense.
* Opening the merge dialog.
* Copying the entity ID.
* Toggling the display of labels for all languages.
The shortcut `?` will show a popup dialog with a list of supported shortcuts.
If you'd like to use it, add the following to your common.js:
mw.loader.load("//www.wikidata.org/w/index.php?title=User:Nikki/KeyShortcuts.js&action=raw&ctype=text/javascript");
*/
$(function () {
'use strict';
if (!mw.config.exists("wbEntityId") && mw.config.get("wgNamespaceNumber") !== 640)
return;
var n_laststatement = "";
var mergeDialog = function () {
$(window.mergeTool.launchDialog).on("keydown", function (event) {
if (event.keyCode == 13 && !event.isDefaultPrevented()) {
$(".oo-ui-processDialog-actions-primary a").each(function () { this.click() });
}
});
},
addStatement = function () {
$(".wikibase-statementgrouplistview > .wikibase-addtoolbar").first().find("a").first().click();
},
editTerms = function () {
if (mw.config.get("wgCanonicalNamespace") == "Lexeme") {
$(".lemma-widget_edit").click();
} else {
$(".wikibase-entitytermsview .wikibase-toolbar-button-edit a").last().click();
}
},
addForm = function () {
$(".wikibase-lexeme-forms-section > .wikibase-addtoolbar").last().find("a").first().click();
},
addSense = function () {
$(".wikibase-lexeme-senses-section > .wikibase-addtoolbar").last().find("a").first().click();
},
addConstraint = function () { // currently only works when there is already at least one
$("#P2302 .wikibase-toolbar-wrapper > .wikibase-addtoolbar a").click();
},
addWikipedia = function () {
$(".wikibase-sitelinkgrouplistview .wikibase-toolbar-button-edit a").eq(0).click();
setTimeout(function () {
$(".wikibase-sitelinkview-siteid-container").find("input").eq(0).trigger("focus");
}, 500);
},
viewHistory = function () {
$("a[accesskey='h']")[0].click();
},
viewItem = function () {
$("a[accesskey='c']")[0].click();
},
newItem = function () {
// For some reason click() doesn't work for this link
document.location.href = document.querySelector("#n-special-newitem a").href;
},
newLexeme = function () {
// For some reason click() doesn't work for this link
document.location.href = document.querySelector("#n-special-newlexeme a").href;
},
toggleAllLanguages = function () {
$(".wikibase-entitytermsforlanguagelistview-more a").click();
},
toggleTermbox = function () {
$(".wikibase-entitytermsview-entitytermsforlanguagelistview-toggler").click();
},
addSenseStatement = function () {
$(".wikibase-lexeme-senses-section .wikibase-lexeme-sense")
.last()
.find(".wikibase-statementgrouplistview > .wikibase-addtoolbar .wikibase-toolbar-button-add a")
.click();
},
addFormStatement = function () {
$(".wikibase-lexeme-forms-section .wikibase-lexeme-form")
.last()
.find(".wikibase-statementgrouplistview > .wikibase-addtoolbar .wikibase-toolbar-button-add a")
.click();
},
editLastStatement = function () {
let $st;
if (typeof n_laststatement !== undefined && n_laststatement !== "")
$st = $(document.getElementsByClassName("wikibase-statement-" + n_laststatement)[0]);
else
$st = $(".wikibase-entityview-main > .wikibase-statementgrouplistview .wikibase-statementview").last();
if (!$st)
return;
$st.find(".wikibase-edittoolbar-container .wikibase-toolbar-button-edit a")
.click();
},
addReference = function () {
$(document.getElementsByClassName("wikibase-statement-" + n_laststatement)[0])
.find(".wikibase-statementview-references .wikibase-toolbar-button-add a:first")
.click();
},
addAnotherStatement = function () {
$(document.getElementsByClassName("wikibase-statement-" + n_laststatement)[0])
.parents(".wikibase-statementgroupview")
.find(".wikibase-statementlistview > .wikibase-toolbar-wrapper .wikibase-toolbar-button-add a")
.click();
},
expandReferences = function () {
// if available from [[User:Nikki/ExpandReferences.js]]
$("#claims small span a").click();
},
selectQid = function () {
var cname = "wikibase-title-id";
if (document.body.classList.contains("wb-lexemepage"))
cname = "wb-lexeme-header_id";
else if (mw.config.get("wgNamespaceNumber") === 640) // EntitySchema
cname = "entityschema-title-id";
var qe = document.getElementsByClassName(cname)[0];
// Move brackets from HTML content to CSS pseudo-selectors
// This prevents them from being included in the selection
qe.innerHTML = qe.innerHTML.replace(/[()]/g, "");
var se = document.head.appendChild(document.createElement("style"));
se.innerHTML = "." + cname + ":before { content: '(' !important }"
+ " ." + cname + ":after { content: ')' }";
var selection = window.getSelection();
var rangex = document.createRange();
rangex.selectNodeContents(qe);
selection.removeAllRanges();
selection.addRange(rangex);
document.execCommand("copy");
},
submitStatement = function () {
$(".ui-inputextender-extended").closest(".wb-edit.wikibase-statementview").find(".wikibase-toolbar-button-save a").click();
},
editFirstSense = function () {
$(".wikibase-lexeme-sense > .wikibase-edittoolbar-container .wikibase-toolbar-button-edit a").eq(0).click();
},
addIPA = function () {
// if available from [[User:Nikki/LexemeAddIPA.js]]
$("#addipa").click();
},
nameGuzzler = function () {
// if available from [[User:Jitrixis/nameGuzzler.js]]
$("#t-nameGuzzler a").click();
},
toggleHelp = function () {
$("#n_keyshortcuts_help").toggle();
};
$(this).keydown(function (event) {
if (
!event.ctrlKey &&
!event.altKey &&
!event.metaKey &&
($(":focus").length === 0 || $("a:focus").length)
) {
switch (event.key) {
case "a": addStatement(); return false;
case "C": addConstraint(); return false;
case "e": editLastStatement(); return false;
case "f": addForm(); return false;
case "h": viewHistory(); return false;
case "i": viewItem(); return false;
case "l": editTerms(); return false;
case "m": mergeDialog(); return false;
case "q": selectQid(); return false;
case "r": addReference(); return false;
case "s": addSense(); return false;
case "v": nameGuzzler(); return false;
case "w": addWikipedia(); return false;
case "x": toggleAllLanguages(); return false;
case "X": toggleTermbox(); return false;
case "z": editFirstSense(); return false;
case "A": addAnotherStatement(); return false;
case "F": addFormStatement(); return false;
case "I": newItem(); return false;
case "L": newLexeme(); return false;
case "S": addSenseStatement(); return false;
case "+": expandReferences(); return false;
case "@": addIPA(); return false;
case "?": toggleHelp(); return false;
}
} else if (
$(":focus").length === 1
&& document.activeElement.classList.contains("ui-suggester-input")
&& event.key == "Enter"
) {
submitStatement();
}
});
mw.hook("wikibase.statement.saved").add(function (qid, s) { n_laststatement = s; });
var n_keymap = {
"General": {
"a": "Add statement",
"A": "Add another statement",
"e": "Edit last statement",
"h": "View history",
"i": "View item",
"I": "New item",
"l": "Edit terms/lemma",
"m": "Open merge dialog",
"q": "Select and copy ID",
"r": "Add reference",
"v": "Open VIP's labels",
"w": "Add Wikipedia link",
"x": "Toggle all/fewer languages",
"X": "Toggle termbox",
"+": "Show/hide references",
"?": "Toggle this help"
},
"Lexemes": {
"f": "Add form",
"F": "Add form statement",
"L": "New lexeme",
"s": "Add sense",
"S": "Add sense statement",
"@": "Add IPA"
}
};
var module_key_css = // see Module:key
"border: 1px solid #aaa; border-radius: 0.2em; box-shadow: 0.1em 0.1em 0.2em rgba(0, 0, 0, 0.1);"
+ "background-color: #f9f9f9; background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee);"
+ "padding: 0.1em 0.3em; font-size: 0.85em";
var n_help_html = "<div id='n_keyshortcuts_help' style='display: none; width: 14em; z-index: 100;"
+ "background-color: white; border: 2px solid black; padding: 0.7em; margin: 15vh 3em;"
+ "position: fixed; top: 0px; right: 0px; max-height: 75vh; overflow: auto'>";
for (var i in n_keymap) {
n_help_html = n_help_html + i + "<ul style='list-style: none; padding-left: 0; margin-left: 0.5em;'>";
for (var j in n_keymap[i]) {
// hacky way of only showing + if the user is also using the script for expanding/collapsing references
if (j === "+" && !$("#claims small span a").length)
continue;
if (j === "@" && !$("#addipa").length)
continue;
if (j === "v" && !$("#t-nameGuzzler").length)
continue;
n_help_html = n_help_html + "<li style='margin-bottom: 0.4em'><kbd style='" + module_key_css + "'>" + j + "</kbd> " + n_keymap[i][j] + "</li>";
}
n_help_html = n_help_html + "</ul>";
}
n_help_html = n_help_html + "</div>";
$(document.body).append(n_help_html);
mw.hook("wikibase.statement.stopEditing").add(function(guid) {
document.getElementById(guid).querySelector(".wikibase-statementview-rankselector").tabIndex = -1;
});
mw.hook("wikibase.statement.startEditing").add(function(guid) {
document.getElementById(guid).querySelector(".wikibase-statementview-rankselector").tabIndex = 0;
});
function rankselector(e) {
if (e.key !== "ArrowUp" && e.key !== "ArrowDown" && e.key !== "Enter")
return; // Not a supported key for this element
e.preventDefault();
// The rank selector menu isn't fully initialised until clicked
// so click once to activate it and again to hide it
let selector = e.target.querySelector(".wikibase-rankselector");
selector.click();
selector.click();
let menu = document.querySelector(".wikibase-rankselector-menu .ui-state-active");
if (e.key === "ArrowUp" && menu.previousElementSibling) {
menu.previousElementSibling.click();
} else if (e.key === "ArrowDown" && menu.nextElementSibling) {
menu.nextElementSibling.click();
} else if (e.key === "Enter") {
e.target.parentNode.parentNode.querySelector(".wikibase-toolbar-button-save a").click();
}
}
mw.hook("wikibase.entityPage.entityView.rendered").add(function () {
for (let el of document.querySelectorAll(".wikibase-statementview-rankselector")) {
el.onkeydown = rankselector;
}
});
$("body").on("valueviewafterstartediting", function (x) {
let p = x.target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
if (p.id !== "new")
return;
let el = p.querySelector(".wikibase-statementview-rankselector");
el.onkeydown = rankselector;
el.tabIndex = 0;
});
});