Difference between revisions of "User:Tobias Alcaraz/common.js"

From Mine Blocks Wiki
Jump to navigation Jump to search
If you find a typo, inconsistency, or error, please sign up and help out the wiki! We can't do it without your help! :D Thank you!

 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
// Imports
+
/* Since there's no personal JS in this wiki, this code is run through an browser extension. */
// NOTE: Jquery *should* be enabled by default on the wiki as of MediaWiki 1.17
 
// (source: //www.mediawiki.org/wiki/JQuery), so make sure it is
 
// enabled in the wiki configurations so we don't have to import it through JS.
 
mw.loader.load('//code.jquery.com/jquery-3.6.0.min.js');
 
mw.loader.load('//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-DotsSyntaxHighlighter.js&action=raw&ctype=text/javascript');
 
  
// Mineblocks-styled tooltips. Original code from Minecraft Wiki
+
/* Syntax highlight script. */
// (available under the CC-BY-NC-SA 3.0 license:
+
if (document.body.classList.contains('action-edit')) {
// creativecommons.org/licenses/by-nc-sa/3.0/):
 
// //minecraft.fandom.com/wiki/MediaWiki:Common.js by User:Majr.
 
  
// Replaces normal tooltips. Supports a description with line breaks (/).
+
    mw.loader.load('//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-DotsSyntaxHighlighter.js&action=raw&ctype=text/javascript');
(function () {
 
var escapeChars = { '\\&': '&#38;', '<': '&#60;', '>': '&#62;' };
 
var escape = function (text) {
 
// "\" must be escaped first
 
return text.replace(/\\\\/g, '&#92;')
 
.replace(/\\&|[<>]/g, function (char) { return escapeChars[char]; });
 
};
 
var $tooltip = $();
 
var $win = $(window), winWidth, winHeight, width, height;
 
  
$('#mw-content-text').on({
+
    syntaxHighlighterConfig = {
'mouseenter.minetip': function (e) {
+
        timeout: 500,
$tooltip.remove();
+
        boldOrItalicColor: '#44466d',
 
+
        wikilinkColor: '#245477',
var $elem = $(this), title = $elem.attr('data-minetip-title');
+
        externalLinkColor: '#244d491',
if (title === undefined) {
+
        headingColor: '#44466d',
title = $elem.attr('title');
+
        listOrIndentColor: '#4d1a19',
if (title !== undefined) {
+
        signatureColor: '#66331e',
title = $.trim(title.replace(/&/g, '\\&'));
+
        tableColor: '#5e5129',
$elem.attr('data-minetip-title', title);
+
        templateColor: '#5e5129',
}
+
        parameterColor: '#66331e',
}
+
        hrColor: '#44466d',
 
+
        tagColor: '#662946',
if (title === 'Empty') {
+
        commentColor: '#4d1a19',
return;
+
        entityColor: '#474d23',
}
+
        backgroundColor: '#212121',
 
+
        foregroundColor: '#eee'
// No title or title only contains formatting codes
+
    }
if (title === undefined || title !== '' && title.replace(/&([0-9a-fl-or])/g, '') === '') {
+
}
// Find deepest child title
 
var childElem = $elem[0], childTitle;
 
do {
 
if (childElem.hasAttribute('title')) {
 
childTitle = childElem.title;
 
}
 
childElem = childElem.firstChild;
 
} while (childElem && childElem.nodeType === 1);
 
if (childTitle === undefined) {
 
return;
 
}
 
 
 
// Append child title as title may contain formatting codes
 
if (!title) {
 
title = '';
 
}
 
title += $.trim(childTitle.replace(/&/g, '\\&'));
 
 
 
// Set the retrieved title as data for future use
 
$elem.attr('data-minetip-title', title);
 
}
 
  
if (!$elem.data('minetip-ready')) {
+
/* Add true amount of displayed elements in a list page. */
// Remove title attributes so the native tooltip doesn't get in the way
+
(function() {
$elem.find('[title]').addBack().removeAttr('title');
+
    const isSpecialPage = mw.config.get('wgNamespaceNumber') === -1,
$elem.data('minetip-ready', true);
+
        isInWhatLinksHere = mw.config.get('wgCanonicalSpecialPageName') === 'Whatlinkshere';
}
 
  
if (title === '' || title === 'Invisible-sprite') {
+
    if (!isSpecialPage && !isInWhatLinksHere) return;
return;
 
}
 
  
var content = '<span class="minetip-title">' + escape(title) + '&r</span>';
+
    const list = document.getElementById('mw-whatlinkshere-list'),
 +
        listElements = list.children,
 +
        limit = Number(document.querySelector('input[name="limit"]').value),
 +
        listLength = listElements.length === limit ? `>=${listElements.length}` : listElements.length,
 +
        totalElem = document.createElement('div'),
 +
        totalCounterElem = document.createElement('b');
  
var description = $.trim($elem.attr('data-minetip-text'));
+
    totalElem.classList.add('list-total-elements');
if (description) {
+
    totalElem.style.margin = '7px 0';
// Apply normal escaping plus "/"
 
description = escape(description).replace(/\\\//g, '&#47;');
 
content += '<span class="minetip-description">' + description.replace(/\//g, '<br>') + '&r</span>';
 
}
 
  
// Remove reset formatting
+
    totalElem.innerText = 'Total amount of pages: ';
content = content.replace(/&r/g, '');
+
    totalCounterElem.innerText = listLength;
  
$tooltip = $('<div id="minetip-tooltip">');
+
    list.insertAdjacentElement('beforebegin', totalElem);
$tooltip.html(content).appendTo('body');
+
    totalElem.insertAdjacentElement('beforeend', totalCounterElem);
 
 
// Cache current window and tooltip size
 
winWidth = $win.width();
 
winHeight = $win.height();
 
width = $tooltip.outerWidth(true);
 
height = $tooltip.outerHeight(true);
 
 
 
// Trigger a mouse movement to position the tooltip
 
$elem.trigger('mousemove', e);
 
},
 
'mousemove.minetip': function (e, trigger) {
 
if (!$tooltip.length) {
 
$(this).trigger('mouseenter');
 
return;
 
}
 
 
 
// Get event data from remote trigger
 
e = trigger || e;
 
 
 
// Get mouse position and add default offsets
 
var top = e.clientY - 34;
 
var left = e.clientX + 14;
 
 
 
// If going off the right of the screen, go to the left of the cursor
 
if (left + width > winWidth) {
 
left -= width + 36;
 
}
 
 
 
// If now going off to the left of the screen, resort to going above the cursor
 
if (left < 0) {
 
left = 0;
 
top -= height - 22;
 
 
 
// Go below the cursor if too high
 
if (top < 0) {
 
top += height + 47;
 
}
 
// Don't go off the top of the screen
 
} else if (top < 0) {
 
top = 0;
 
// Don't go off the bottom of the screen
 
} else if (top + height > winHeight) {
 
top = winHeight - height;
 
}
 
 
 
// Apply the positions
 
$tooltip.css({ top: top, left: left });
 
},
 
'mouseleave.minetip': function () {
 
if (!$tooltip.length) {
 
return;
 
}
 
 
 
$tooltip.remove();
 
$tooltip = $();
 
}
 
}, '.minetip, .invslot-item');
 
 
}());
 
}());
 
/**
 
* TimedSlider
 
* //dev.wikia.com/wiki/TimedSlider
 
*
 
* Creates a basic slider that automatically shifts between slides
 
* based on a user-specified timer (default once every 1.5 seconds)
 
*/
 
/*jshint forin:true, noempty:true, eqeqeq:true, bitwise:true, strict:false, undef:true, unused:true, curly:true, browser:true, jquery:true */
 
jQuery(function ($) {
 
// tsanimate event
 
function tsanimate() {
 
var $container = $(this),
 
$slides = $container.children(),
 
$curr = $slides.filter('.ts-active'),
 
$next = $curr.next();
 
 
if ($next.length === 0) {
 
$next = $slides.first();
 
}
 
 
$curr.removeClass('ts-active');
 
$next.addClass('ts-active');
 
}
 
 
// initialize all timed sliders
 
$('.ts-container').each(function () {
 
var $container = $(this),
 
$slides = $container.children(),
 
delayms;
 
 
// if there is more than 1 slide, finish initializing data and
 
// turn on the tsanimate event for this slider
 
if ($slides.length > 1) {
 
delayms = $container.attr('data-delay-ms');
 
if (typeof delayms === "string" || typeof delayms === "number") {
 
delayms = delayms || 0;
 
if (delayms < 100) {
 
delayms = 100;
 
}
 
} else {
 
delayms = 1500;
 
}
 
$container.data('delayms', delayms);
 
$container.on('tsanimate', tsanimate);
 
$container.trigger('tsanimate');
 
var init = window.setInterval(function () {
 
$container.trigger('tsanimate');
 
}, delayms);
 
// Pause animations on mouseover of a designated container (.ts-container)
 
// This is so people have a chance to look at the image and click on pages they want to view.
 
$container.mouseenter(function () {
 
if (!$container.parents('.ts-sync').length) {
 
clearInterval(init);
 
}
 
}).mouseleave(function () {
 
if (!$container.parents('.ts-sync').length) {
 
init = window.setInterval(function () {
 
$container.trigger('tsanimate');
 
}, delayms);
 
}
 
})
 
// If the parent container has .ts-sync, all animations stop on mouseover
 
// of said container.
 
$('.ts-sync').each(function () {
 
var $syncContainer = $(this);
 
$syncContainer.mouseenter(function () {
 
clearInterval(init);
 
}).mouseleave(function () {
 
init = window.setInterval(function () {
 
$container.trigger('tsanimate');
 
}, delayms);
 
})
 
});
 
}
 
});
 
});
 
 
// Syntax highlighter by User:Remember_the_dot
 
// //www.mediawiki.org/wiki/User:Remember_the_dot/Syntax_highlighter
 
 
// Change highlight colors depending on the user's theme.
 
// @note: This won't update dynamically if the users updates it while editing a
 
// page. I'm not sure if it is a bug or the expected behavior from the
 
// original script. This also doesn't support IE and old versions of Edge.
 
function setColorScheme(scheme) {
 
  switch(scheme) {
 
    case 'dark':
 
      syntaxHighlighterConfig = {
 
backgroundColor: 'transparent',
 
foregroundColor: 'unset',
 
boldOrItalicColor: '#44466d',
 
commentColor: '#4d1a19',
 
entityColor: '#474d23',
 
externalLinkColor: '',
 
headingColor: '#44466d',
 
hrColor: '#44466d',
 
listOrIndentColor: '#4d1a19',
 
parameterColor: '#66331e',
 
signatureColor: '#66331e',
 
tagColor: '#662946',
 
tableColor: '#5e5129',
 
templateColor: '#5e5129',
 
wikilinkColor: '#245477',
 
}
 
      break;
 
    case 'light':
 
      syntaxHighlighterConfig = {
 
boldOrItalicColor: '#e4e5f3',
 
commentColor: '#f8dbda',
 
entityColor: '#e8ebda',
 
externalLinkColor: '#dbeceb',
 
headingColor: '#e4e5f3',
 
hrColor: '#e4e5f3',
 
listOrIndentColor: '#f8dbda',
 
parameterColor: '#f5e0d8',
 
signatureColor: '#f5e0d8',
 
tagColor: '#f6dde9',
 
tableColor: '#f0ebdb',
 
templateColor: '#f0ebdb',
 
wikilinkColor: '#d9eaf6',
 
}
 
      break;
 
    default:
 
      syntaxHighlighterConfig = {
 
boldOrItalicColor: '#e4e5f3',
 
commentColor: '#f8dbda',
 
entityColor: '#e8ebda',
 
externalLinkColor: '#dbeceb',
 
headingColor: '#e4e5f3',
 
hrColor: '#e4e5f3',
 
listOrIndentColor: '#f8dbda',
 
parameterColor: '#f5e0d8',
 
signatureColor: '#f5e0d8',
 
tagColor: '#f6dde9',
 
tableColor: '#f0ebdb',
 
templateColor: '#f0ebdb',
 
wikilinkColor: '#d9eaf6',
 
}
 
      break;
 
  }
 
}
 
 
function getPreferredColorScheme() {
 
  if (window.matchMedia) {
 
    if(window.matchMedia('(prefers-color-scheme: dark)').matches) {
 
      return 'dark';
 
    } else {
 
      return 'light';
 
    }
 
  }
 
  return 'light';
 
}
 
 
if(window.matchMedia) {
 
  var colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');
 
  colorSchemeQuery.addEventListener('change', setColorScheme(getPreferredColorScheme()));
 
}
 

Latest revision as of 21:33, 7 July 2023

/* Since there's no personal JS in this wiki, this code is run through an browser extension. */

/* Syntax highlight script. */
if (document.body.classList.contains('action-edit')) {

    mw.loader.load('//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-DotsSyntaxHighlighter.js&action=raw&ctype=text/javascript');

    syntaxHighlighterConfig = {
        timeout: 500,
        boldOrItalicColor: '#44466d',
        wikilinkColor: '#245477',
        externalLinkColor: '#244d491',
        headingColor: '#44466d',
        listOrIndentColor: '#4d1a19',
        signatureColor: '#66331e',
        tableColor: '#5e5129',
        templateColor: '#5e5129',
        parameterColor: '#66331e',
        hrColor: '#44466d',
        tagColor: '#662946',
        commentColor: '#4d1a19',
        entityColor: '#474d23',
        backgroundColor: '#212121',
        foregroundColor: '#eee'
    }
}

/* Add true amount of displayed elements in a list page. */
(function() {
    const isSpecialPage = mw.config.get('wgNamespaceNumber') === -1,
        isInWhatLinksHere = mw.config.get('wgCanonicalSpecialPageName') === 'Whatlinkshere';

    if (!isSpecialPage && !isInWhatLinksHere) return;

    const list = document.getElementById('mw-whatlinkshere-list'),
        listElements = list.children,
        limit = Number(document.querySelector('input[name="limit"]').value),
        listLength = listElements.length === limit ? `>=${listElements.length}` : listElements.length,
        totalElem = document.createElement('div'),
        totalCounterElem = document.createElement('b');

    totalElem.classList.add('list-total-elements');
    totalElem.style.margin = '7px 0';

    totalElem.innerText = 'Total amount of pages: ';
    totalCounterElem.innerText = listLength;

    list.insertAdjacentElement('beforebegin', totalElem);
    totalElem.insertAdjacentElement('beforeend', totalCounterElem);
}());