m |
m |
||
| Line 1: | Line 1: | ||
| + | "use strict"; | ||
| + | |||
| + | /* ----------------------------- */ | ||
| + | /* General Browser Cache Bypass Instructions */ | ||
| + | /* Instructions for refreshing the page cache for different browsers */ | ||
| + | /* ----------------------------- */ | ||
| + | |||
| + | //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) | ||
| + | //Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5 | ||
| + | //Opera: Clear the cache in Tools → Preferences | ||
| + | |||
| + | /* ----------------------------- */ | ||
| + | /* Collapsible Tables Feature */ | ||
| + | /* Enables collapsible tables for better organization and allows users to show or hide table contents */ | ||
| + | /* ----------------------------- */ | ||
| + | |||
| + | var autoCollapse = 2; | ||
| + | var collapseCaption = 'hide'; | ||
| + | var expandCaption = 'show'; | ||
| + | |||
| + | /** | ||
| + | * Function to collapse the table rows | ||
| + | * @param {number} tableIndex | ||
| + | */ | ||
| + | function collapseTable(tableIndex) { | ||
| + | var Button = document.getElementById('collapseButton' + tableIndex); | ||
| + | var Table = document.getElementById('collapsibleTable' + tableIndex); | ||
| + | |||
| + | if (!Table || !Button) { | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | var Rows = Table.rows; | ||
| + | |||
| + | if (Button.firstChild.data == collapseCaption) { | ||
| + | for (var i = 1; i < Rows.length; i++) { | ||
| + | Rows[i].style.display = 'none'; | ||
| + | } | ||
| + | Button.firstChild.data = expandCaption; | ||
| + | } else { | ||
| + | for (var i = 1; i < Rows.length; i++) { | ||
| + | Rows[i].style.display = Rows[0].style.display; | ||
| + | } | ||
| + | Button.firstChild.data = collapseCaption; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Creates a click handler for table collapse/expand | ||
| + | * @param {number} tableIndex | ||
| + | */ | ||
| + | function createClickHandler(tableIndex) { | ||
| + | return function (e) { | ||
| + | e.preventDefault(); | ||
| + | collapseTable(tableIndex); | ||
| + | }; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Adds collapse buttons to all tables with the 'collapsible' class | ||
| + | */ | ||
| + | function createCollapseButtons() { | ||
| + | var tableIndex = 0; | ||
| + | var NavigationBoxes = {}; | ||
| + | var Tables = document.getElementsByTagName('table'); | ||
| + | |||
| + | for (var i = 0; i < Tables.length; i++) { | ||
| + | if ($(Tables[i]).hasClass('collapsible')) { | ||
| + | var HeaderRow = Tables[i].getElementsByTagName('tr')[0]; | ||
| + | if (!HeaderRow) { | ||
| + | continue; | ||
| + | } | ||
| + | var Header = HeaderRow.getElementsByTagName('th')[0]; | ||
| + | if (!Header) { | ||
| + | continue; | ||
| + | } | ||
| + | |||
| + | NavigationBoxes[tableIndex] = Tables[i]; | ||
| + | Tables[i].setAttribute('id', 'collapsibleTable' + tableIndex); | ||
| + | |||
| + | var Button = document.createElement('span'); | ||
| + | var ButtonLink = document.createElement('a'); | ||
| + | var ButtonText = document.createTextNode(collapseCaption); | ||
| + | |||
| + | Button.style.styleFloat = 'right'; | ||
| + | Button.style.cssFloat = 'right'; | ||
| + | Button.style.fontWeight = 'normal'; | ||
| + | Button.style.textAlign = 'right'; | ||
| + | Button.style.width = '6em'; | ||
| + | |||
| + | ButtonLink.style.color = Header.style.color; | ||
| + | ButtonLink.setAttribute('id', 'collapseButton' + tableIndex); | ||
| + | $(ButtonLink).on('click', createClickHandler(tableIndex)); | ||
| + | ButtonLink.appendChild(ButtonText); | ||
| + | |||
| + | Button.appendChild(document.createTextNode('[')); | ||
| + | Button.appendChild(ButtonLink); | ||
| + | Button.appendChild(document.createTextNode(']')); | ||
| + | |||
| + | Header.insertBefore(Button, Header.childNodes[0]); | ||
| + | tableIndex++; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Collapse all tables if the conditions are met (autocollapse or collapsed class) | ||
| + | for (var i = 0; i < tableIndex; i++) { | ||
| + | if ($(NavigationBoxes[i]).hasClass('collapsed') || | ||
| + | (tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass('autocollapse')) | ||
| + | ) { | ||
| + | collapseTable(i); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Run the collapse button creation function on page load | ||
| + | $(createCollapseButtons); | ||
| + | |||
| + | /* ----------------------------- */ | ||
| + | /* Custom Script for Highlighting Backticks */ | ||
| + | /* Applies custom visual styles to text wrapped in backticks without altering the content */ | ||
| + | /* ----------------------------- */ | ||
| + | |||
| + | // This script waits for the document to fully load, and applies a visual style | ||
| + | // to any text that is surrounded by backticks (` `), without altering the content. | ||
| + | |||
| + | document.addEventListener('DOMContentLoaded', function () { | ||
| + | // Check if we are in edit mode (to avoid changing the editor content) | ||
| + | if (document.querySelector('#wpTextbox1') !== null) { | ||
| + | return; // Do nothing in edit mode | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Function to highlight text between backticks by wrapping it in a span element | ||
| + | * @param {string} text | ||
| + | * @returns {string} | ||
| + | */ | ||
| + | function highlightBackticks(text) { | ||
| + | const backtickRegex = /`([^`]+)`/g; // Matches text between backticks | ||
| + | const styledText = text.replace(backtickRegex, function (match, p1) { | ||
| + | return '<span class="backtick-style">' + p1 + '</span>'; | ||
| + | }); | ||
| + | return styledText; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Traverse all text nodes and apply the backtick highlighting | ||
| + | * @param {Node} node | ||
| + | */ | ||
| + | function traverseTextNodes(node) { | ||
| + | if (node.nodeType === 3 && node.nodeValue.includes('`')) { // Only process text nodes | ||
| + | const span = document.createElement('span'); | ||
| + | span.innerHTML = highlightBackticks(node.nodeValue); | ||
| + | node.parentNode.replaceChild(span, node); | ||
| + | } else if (node.nodeType === 1 && node.childNodes) { // Traverse element children | ||
| + | node.childNodes.forEach(traverseTextNodes); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Apply the changes to the entire body | ||
| + | traverseTextNodes(document.body); | ||
| + | }); | ||
| + | |||
| + | console.log('Backtick script loaded'); | ||
| + | |||
| + | /* ----------------------------- */ | ||
| + | /* Force CSS Rules Dynamically */ | ||
| + | /* Injects CSS with higher priority for overriding styles, especially the list indentations */ | ||
| + | /* ----------------------------- */ | ||
| + | |||
| + | // Using MediaWiki's loader to inject custom CSS with high priority | ||
| + | mw.loader.using('mediawiki.util', function () { | ||
| + | var css = '.mw-parser-output ul ul, .mw-parser-output ul ol, .mw-parser-output ol ul, .mw-parser-output ol ol {' + | ||
| + | 'padding-left: 0 !important;' + | ||
| + | 'margin-left: 0 !important;' + | ||
| + | '}'; | ||
| + | mw.util.addCSS(css); | ||
| + | }); | ||
| + | |||
/* ----------------------------- */ | /* ----------------------------- */ | ||
/* Collapsible Content Sections */ | /* Collapsible Content Sections */ | ||
"use strict"; /* ----------------------------- */ /* General Browser Cache Bypass Instructions */ /* Instructions for refreshing the page cache for different browsers */ /* ----------------------------- */ //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) //Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5 //Opera: Clear the cache in Tools → Preferences /* ----------------------------- */ /* Collapsible Tables Feature */ /* Enables collapsible tables for better organization and allows users to show or hide table contents */ /* ----------------------------- */ var autoCollapse = 2; var collapseCaption = 'hide'; var expandCaption = 'show'; /** * Function to collapse the table rows * @param {number} tableIndex */ function collapseTable(tableIndex) { var Button = document.getElementById('collapseButton' + tableIndex); var Table = document.getElementById('collapsibleTable' + tableIndex); if (!Table || !Button) { return false; } var Rows = Table.rows; if (Button.firstChild.data == collapseCaption) { for (var i = 1; i < Rows.length; i++) { Rows[i].style.display = 'none'; } Button.firstChild.data = expandCaption; } else { for (var i = 1; i < Rows.length; i++) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } /** * Creates a click handler for table collapse/expand * @param {number} tableIndex */ function createClickHandler(tableIndex) { return function (e) { e.preventDefault(); collapseTable(tableIndex); }; } /** * Adds collapse buttons to all tables with the 'collapsible' class */ function createCollapseButtons() { var tableIndex = 0; var NavigationBoxes = {}; var Tables = document.getElementsByTagName('table'); for (var i = 0; i < Tables.length; i++) { if ($(Tables[i]).hasClass('collapsible')) { var HeaderRow = Tables[i].getElementsByTagName('tr')[0]; if (!HeaderRow) { continue; } var Header = HeaderRow.getElementsByTagName('th')[0]; if (!Header) { continue; } NavigationBoxes[tableIndex] = Tables[i]; Tables[i].setAttribute('id', 'collapsibleTable' + tableIndex); var Button = document.createElement('span'); var ButtonLink = document.createElement('a'); var ButtonText = document.createTextNode(collapseCaption); Button.style.styleFloat = 'right'; Button.style.cssFloat = 'right'; Button.style.fontWeight = 'normal'; Button.style.textAlign = 'right'; Button.style.width = '6em'; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute('id', 'collapseButton' + tableIndex); $(ButtonLink).on('click', createClickHandler(tableIndex)); ButtonLink.appendChild(ButtonText); Button.appendChild(document.createTextNode('[')); Button.appendChild(ButtonLink); Button.appendChild(document.createTextNode(']')); Header.insertBefore(Button, Header.childNodes[0]); tableIndex++; } } // Collapse all tables if the conditions are met (autocollapse or collapsed class) for (var i = 0; i < tableIndex; i++) { if ($(NavigationBoxes[i]).hasClass('collapsed') || (tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass('autocollapse')) ) { collapseTable(i); } } } // Run the collapse button creation function on page load $(createCollapseButtons); /* ----------------------------- */ /* Custom Script for Highlighting Backticks */ /* Applies custom visual styles to text wrapped in backticks without altering the content */ /* ----------------------------- */ // This script waits for the document to fully load, and applies a visual style // to any text that is surrounded by backticks (` `), without altering the content. document.addEventListener('DOMContentLoaded', function () { // Check if we are in edit mode (to avoid changing the editor content) if (document.querySelector('#wpTextbox1') !== null) { return; // Do nothing in edit mode } /** * Function to highlight text between backticks by wrapping it in a span element * @param {string} text * @returns {string} */ function highlightBackticks(text) { const backtickRegex = /`([^`]+)`/g; // Matches text between backticks const styledText = text.replace(backtickRegex, function (match, p1) { return '<span class="backtick-style">' + p1 + '</span>'; }); return styledText; } /** * Traverse all text nodes and apply the backtick highlighting * @param {Node} node */ function traverseTextNodes(node) { if (node.nodeType === 3 && node.nodeValue.includes('`')) { // Only process text nodes const span = document.createElement('span'); span.innerHTML = highlightBackticks(node.nodeValue); node.parentNode.replaceChild(span, node); } else if (node.nodeType === 1 && node.childNodes) { // Traverse element children node.childNodes.forEach(traverseTextNodes); } } // Apply the changes to the entire body traverseTextNodes(document.body); }); console.log('Backtick script loaded'); /* ----------------------------- */ /* Force CSS Rules Dynamically */ /* Injects CSS with higher priority for overriding styles, especially the list indentations */ /* ----------------------------- */ // Using MediaWiki's loader to inject custom CSS with high priority mw.loader.using('mediawiki.util', function () { var css = '.mw-parser-output ul ul, .mw-parser-output ul ol, .mw-parser-output ol ul, .mw-parser-output ol ol {' + 'padding-left: 0 !important;' + 'margin-left: 0 !important;' + '}'; mw.util.addCSS(css); }); /* ----------------------------- */ /* Collapsible Content Sections */ /* Enables hide/collapse functionality for content sections */ /* ----------------------------- */ // Fonction pour ajouter des boutons de pliage aux sections de contenu $(document).ready(function() { $('.collapsible-section').each(function(index) { var section = $(this); // Créer le bouton de pliage var toggleButton = $('<button type="button" class="toggle-button">hide</button>'); // Insérer le bouton au début de la section section.prepend(toggleButton); // Cacher le contenu initialement si nécessaire if (section.hasClass('collapsed')) { section.find('.section-content').hide(); toggleButton.text('show'); } // Ajouter l'événement de clic pour le bouton toggleButton.on('click', function() { var content = section.find('.section-content'); content.toggle(); // Mettre à jour le texte du bouton if (content.is(':visible')) { toggleButton.text('hide'); } else { toggleButton.text('show'); } }); }); });