MediaWiki:Common.js: различия между версиями
Перейти к навигации
Перейти к поиску
Fritz (обсуждение | вклад) Нет описания правки |
Fritz (обсуждение | вклад) Нет описания правки |
||
(не показана 181 промежуточная версия 6 участников) | |||
Строка 1: | Строка 1: | ||
/* | /****************************/ | ||
/* Вкладка «Новая страница» */ | |||
/****************************/ | |||
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц | |||
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz | |||
$(document).ready(function() { | |||
// Чтобы не было путаницы, во время редактирования вкладку не показываем | |||
if (window.location.search.includes('action=edit')) { | |||
return; // Выходим из скрипта, если находим параметр action=edit | |||
} | |||
// Ищем элемент вкладки "Обсуждение" | |||
var discussionTab = $('#ca-talk'); | |||
// Добавляем вкладку "Новая страница" | |||
var newTab = $('<li>', { | |||
id: 'ca-new-page', | |||
class: 'mw-list-item' | |||
}).append($('<a>', { | |||
href: '#', // Заглушка для ссылки | |||
text: 'Новая страница', | |||
click: function(event) { | |||
event.preventDefault(); // Предотвращаем стандартный переход по ссылке | |||
// Вопрос пользователю | |||
var pageName = prompt('Введите название новой страницы:'); | |||
if (pageName !== null && pageName.trim() !== '') { | |||
// Формируем URL для новой страницы | |||
var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL | |||
// Открываем форму создания новой страницы | |||
window.location.href = '/index.php?title=' + encodedPageName + '&action=edit'; | |||
} | |||
} | |||
})); | |||
// Вставляем новую вкладку после вкладки "Обсуждение" | |||
discussionTab.after(newTab); | |||
}); | |||
/* */ | |||
/* Ссылкоправ */ | |||
/* */ | |||
// Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст | |||
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz | |||
// Раскодирует единичную ссылку типа #.D0.92.D0.BE | |||
function decodeSingleURL(link) { | |||
var originalLink = link; | |||
var parts = link.split('|'); // Разбиваем на части по символу "|" | |||
var urlPart = parts[0]; // Часть ссылки до "|" | |||
var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#" | |||
if (hashParts.length > 1) { | |||
// Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа | |||
var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%'); | |||
// Попытка декодирования части URL после "#" | |||
try { | |||
hashParts[1] = decodeURIComponent(encodedHash); | |||
} catch (e) { | |||
// В случае ошибки декодирования, флаг успешного раскодирования остается false, | |||
// это нужно для правильного подсчёта числа раскодированных ссылок. | |||
// Правильное кодирование: ".20", ".D0.80" | |||
// Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа) | |||
console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash); | |||
} | |||
} | |||
/ | // Собираем обратно часть ссылки | ||
var decodedUrlPart = hashParts.join('#'); | |||
parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией | |||
// Собираем обратно все части ссылки, разделенные "|" | |||
var decodedLink = parts.join('|'); | |||
// Возвращаем измененную ссылку только если она изменилась | |||
return (decodedLink !== originalLink) ? decodedLink : null; | |||
} | } | ||
// Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL | |||
function decode_links() { | |||
var textarea = document.getElementById('wpTextbox1'); | |||
var editText = textarea.value; | |||
// Сохранение текущей позиции курсора | |||
var cursorPosition = textarea.selectionStart; | |||
var decodedCount = 0; | |||
// Регулярное выражение для поиска всех ссылок | |||
var regex = /\[\[([^\]]+)\]\]/g; | |||
// Применение функции декодирования к каждой ссылке | |||
var decodedText = editText.replace(regex, function(match, linkContent) { | |||
var decodedLink = decodeSingleURL(linkContent); | |||
if (decodedLink !== null) { | |||
decodedCount++; | |||
return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки | |||
} | |||
return match; | |||
}); | |||
// Обновление текста в textarea | |||
textarea.value = decodedText; | |||
// Восстановление позиции курсора | |||
textarea.selectionStart = textarea.selectionEnd = cursorPosition; | |||
var finalMessage = decodedCount === 0 | |||
? "Закодированных ссылок не найдено." | |||
: "Раскодировано ссылок: " + decodedCount; | |||
alert(finalMessage); | |||
} | } | ||
/ | // Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше) | ||
mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () { | |||
setTimeout(function() { | |||
var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format'); | |||
if (!formatGroup) { | |||
// Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования | |||
//console.error('Format group not found'); | |||
return; | |||
} | |||
// Создание новой кнопки | |||
var button = document.createElement('span'); | |||
button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget'; | |||
button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' + | |||
'<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' + | |||
'<span class="oo-ui-labelElement-label"></span>' + | |||
'</a>'; | |||
// Добавление обработчика клика для вызова функции decode_links | |||
button.onclick = function() { | |||
decode_links(); | |||
}; | |||
// Добавление кнопки в группу форматирования | |||
formatGroup.appendChild(button); | |||
}, 1000); | |||
}); | |||
// | /* */ | ||
// | /* WikiEditor/Викификатор */ | ||
// | /* */ | ||
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { | |||
mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' ); | |||
} | } | ||
var customizeToolbar = function() { | |||
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', { | |||
'section': 'advanced', | |||
'group': 'format', | |||
'tools': { | |||
'wikify': { | |||
function | label: 'Викификатор', | ||
type: 'button', | |||
icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', | |||
action: { | |||
type: 'callback', | |||
execute: function(context){ | |||
Wikify(); | |||
} | |||
} | |||
} | |||
} | |||
} ); | |||
}; | |||
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { | |||
mw.loader.using( 'user.options', function () { | |||
if ( mw.user.options.get('usebetatoolbar') ) { | |||
mw.loader.using( 'ext.wikiEditor.toolbar', function () { | |||
$(document).ready( customizeToolbar ); | |||
} ); | |||
} | |||
} ); | |||
}; | |||
/*************************/ | |||
/* Реклама Яндекс Директ */ | |||
/*************************/ | |||
/* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */ | |||
var path = decodeURIComponent(window.location.pathname); | |||
if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 && | |||
path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 && | |||
path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) { | |||
/* Блок 1 */ | |||
(function() { | |||
$('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>'); | |||
})(); | |||
(function(w, d, n, s, t) { | |||
w[n] = w[n] || []; | |||
w[n].push(function() { | |||
Ya.Context.AdvManager.render({ | |||
blockId: "R-A-446933-1", | |||
renderTo: "yandex_rtb_R-A-446933-1", | |||
// | async: true | ||
}); | |||
}); | |||
t = d.getElementsByTagName("script")[0]; | |||
s = d.createElement("script"); | |||
s.type = "text/javascript"; | |||
s.src = "//an.yandex.ru/system/context.js"; | |||
s.async = true; | |||
t.parentNode.insertBefore(s, t); | |||
})(this, this.document, "yandexContextAsyncCallbacks"); | |||
/* Блок 2 */ | |||
(function() { | |||
$('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>'); | |||
})(); | |||
(function(w, d, n, s, t) { | |||
w[n] = w[n] || []; | |||
w[n].push(function() { | |||
Ya.Context.AdvManager.render({ | |||
blockId: "R-A-446933-2", | |||
renderTo: "yandex_rtb_R-A-446933-2", | |||
async: true | |||
}); | |||
}); | |||
t = d.getElementsByTagName("script")[0]; | |||
s = d.createElement("script"); | |||
s.type = "text/javascript"; | |||
s.src = "//an.yandex.ru/system/context.js"; | |||
s.async = true; | |||
t.parentNode.insertBefore(s, t); | |||
})(this, this.document, "yandexContextAsyncCallbacks"); | |||
} | } |
Текущая версия от 21:57, 2 октября 2024
/****************************/ /* Вкладка «Новая страница» */ /****************************/ // Добавляет вкладку «Новая страница» для упрощения создания новых страниц // Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz $(document).ready(function() { // Чтобы не было путаницы, во время редактирования вкладку не показываем if (window.location.search.includes('action=edit')) { return; // Выходим из скрипта, если находим параметр action=edit } // Ищем элемент вкладки "Обсуждение" var discussionTab = $('#ca-talk'); // Добавляем вкладку "Новая страница" var newTab = $('<li>', { id: 'ca-new-page', class: 'mw-list-item' }).append($('<a>', { href: '#', // Заглушка для ссылки text: 'Новая страница', click: function(event) { event.preventDefault(); // Предотвращаем стандартный переход по ссылке // Вопрос пользователю var pageName = prompt('Введите название новой страницы:'); if (pageName !== null && pageName.trim() !== '') { // Формируем URL для новой страницы var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL // Открываем форму создания новой страницы window.location.href = '/index.php?title=' + encodedPageName + '&action=edit'; } } })); // Вставляем новую вкладку после вкладки "Обсуждение" discussionTab.after(newTab); }); /* */ /* Ссылкоправ */ /* */ // Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст // Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz // Раскодирует единичную ссылку типа #.D0.92.D0.BE function decodeSingleURL(link) { var originalLink = link; var parts = link.split('|'); // Разбиваем на части по символу "|" var urlPart = parts[0]; // Часть ссылки до "|" var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#" if (hashParts.length > 1) { // Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%'); // Попытка декодирования части URL после "#" try { hashParts[1] = decodeURIComponent(encodedHash); } catch (e) { // В случае ошибки декодирования, флаг успешного раскодирования остается false, // это нужно для правильного подсчёта числа раскодированных ссылок. // Правильное кодирование: ".20", ".D0.80" // Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа) console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash); } } // Собираем обратно часть ссылки var decodedUrlPart = hashParts.join('#'); parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией // Собираем обратно все части ссылки, разделенные "|" var decodedLink = parts.join('|'); // Возвращаем измененную ссылку только если она изменилась return (decodedLink !== originalLink) ? decodedLink : null; } // Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL function decode_links() { var textarea = document.getElementById('wpTextbox1'); var editText = textarea.value; // Сохранение текущей позиции курсора var cursorPosition = textarea.selectionStart; var decodedCount = 0; // Регулярное выражение для поиска всех ссылок var regex = /\[\[([^\]]+)\]\]/g; // Применение функции декодирования к каждой ссылке var decodedText = editText.replace(regex, function(match, linkContent) { var decodedLink = decodeSingleURL(linkContent); if (decodedLink !== null) { decodedCount++; return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки } return match; }); // Обновление текста в textarea textarea.value = decodedText; // Восстановление позиции курсора textarea.selectionStart = textarea.selectionEnd = cursorPosition; var finalMessage = decodedCount === 0 ? "Закодированных ссылок не найдено." : "Раскодировано ссылок: " + decodedCount; alert(finalMessage); } // Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше) mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () { setTimeout(function() { var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format'); if (!formatGroup) { // Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования //console.error('Format group not found'); return; } // Создание новой кнопки var button = document.createElement('span'); button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget'; button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' + '<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' + '<span class="oo-ui-labelElement-label"></span>' + '</a>'; // Добавление обработчика клика для вызова функции decode_links button.onclick = function() { decode_links(); }; // Добавление кнопки в группу форматирования formatGroup.appendChild(button); }, 1000); }); /* */ /* WikiEditor/Викификатор */ /* */ if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' ); } var customizeToolbar = function() { $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', { 'section': 'advanced', 'group': 'format', 'tools': { 'wikify': { label: 'Викификатор', type: 'button', icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', action: { type: 'callback', execute: function(context){ Wikify(); } } } } } ); }; if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) { mw.loader.using( 'user.options', function () { if ( mw.user.options.get('usebetatoolbar') ) { mw.loader.using( 'ext.wikiEditor.toolbar', function () { $(document).ready( customizeToolbar ); } ); } } ); }; /*************************/ /* Реклама Яндекс Директ */ /*************************/ /* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */ var path = decodeURIComponent(window.location.pathname); if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 && path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 && path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) { /* Блок 1 */ (function() { $('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>'); })(); (function(w, d, n, s, t) { w[n] = w[n] || []; w[n].push(function() { Ya.Context.AdvManager.render({ blockId: "R-A-446933-1", renderTo: "yandex_rtb_R-A-446933-1", async: true }); }); t = d.getElementsByTagName("script")[0]; s = d.createElement("script"); s.type = "text/javascript"; s.src = "//an.yandex.ru/system/context.js"; s.async = true; t.parentNode.insertBefore(s, t); })(this, this.document, "yandexContextAsyncCallbacks"); /* Блок 2 */ (function() { $('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>'); })(); (function(w, d, n, s, t) { w[n] = w[n] || []; w[n].push(function() { Ya.Context.AdvManager.render({ blockId: "R-A-446933-2", renderTo: "yandex_rtb_R-A-446933-2", async: true }); }); t = d.getElementsByTagName("script")[0]; s = d.createElement("script"); s.type = "text/javascript"; s.src = "//an.yandex.ru/system/context.js"; s.async = true; t.parentNode.insertBefore(s, t); })(this, this.document, "yandexContextAsyncCallbacks"); }