MediaWiki:Wikificator.js — различия между версиями
NeKit (обсуждение | вклад) (Новая страница: «var wmCantWork = 'Викификатор не может работать в вашем браузере', wmFullText = 'Викификатор обработае...») |
Ivgon (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | var wmCantWork = 'Викификатор не может работать в вашем браузере' | + | /* Автономный Викификатор для MediaWiki 1.27 */ |
| − | + | var wmCantWork = 'Викификатор не может работать в вашем браузере'; | |
| − | + | var wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?'; | |
| − | + | ||
| − | |||
function Wikify() { | function Wikify() { | ||
| − | + | 'use strict'; | |
| − | + | var txt = '', hidden = [], wpTextbox1 = document.getElementById('wpTextbox1'); | |
| − | + | if (!wpTextbox1) return; | |
| − | + | ||
| − | winScroll = document.documentElement.scrollTop; | + | var winScroll = document.documentElement.scrollTop || document.body.scrollTop; |
| − | + | ||
| − | + | // Вспомогательные функции автозамены | |
| − | + | function r(r1, r2) { txt = txt.replace(r1, r2); } | |
| − | + | function hide(re) { r(re, function (s) { return '\x01' + hidden.push(s) + '\x02'; }); } | |
| − | + | function hideTag(tag) { hide(new RegExp('<' + tag + '( [^>]+)?>[\\s\\S]*?</' + tag + '>', 'gi')); } | |
| − | + | ||
| − | + | // Проверка выделения текста | |
| − | + | var startPos = wpTextbox1.selectionStart; | |
| − | + | var endPos = wpTextbox1.selectionEnd; | |
| − | + | var isSelection = (startPos !== undefined && endPos !== undefined && startPos !== endPos); | |
| − | + | ||
| − | + | if (isSelection) { | |
| − | + | txt = wpTextbox1.value.substring(startPos, endPos); | |
| − | + | } else { | |
| − | + | if (!confirm(wmFullText)) return; | |
| − | + | txt = wpTextbox1.value; | |
| − | |||
| − | |||
| − | |||
| − | var | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | if ( | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | txt = | ||
| − | |||
| − | |||
} | } | ||
| − | + | ||
| − | + | // ТЕХНИЧЕСКИЙ БЛОК: Скрытие элементов, которые нельзя форматировать | |
| − | + | hide(/<!--[\s\\S]*?-->/g); | |
| − | + | hideTag('code'); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | hideTag(' | ||
hideTag('pre'); | hideTag('pre'); | ||
hideTag('source'); | hideTag('source'); | ||
hideTag('syntaxhighlight'); | hideTag('syntaxhighlight'); | ||
| − | |||
| − | |||
hideTag('math'); | hideTag('math'); | ||
| − | hideTag(' | + | hideTag('nowiki'); |
| − | + | ||
| − | + | // Скрытие внутренних и внешних ссылок, файлов, шаблонов | |
| − | + | hide(/https?:\/\/[^\s\]<\"]+/gi); | |
| − | + | hide(/^\{|^\||^\}|[\n\s]\{|[\n\s]\||[\n\s]\}/g); | |
| − | + | hide(/\[\[[^\]|]+\|/g); | |
| − | + | ||
| − | + | // --- БЛОК ТИПОГРАФИКИ (ОСНОВНЫЕ ПРАВИЛА) --- | |
| − | + | ||
| − | + | // Убираем пробелы на концах строк | |
| − | + | r(/ +$/gm, ''); | |
| − | + | ||
| − | + | // Замена дефисов на тире | |
| − | r(/ | + | r(/(\s)-(?=\s)/g, '$1—'); |
| − | + | r(/(^|\s)-(\s)/g, '$1—$2'); | |
| − | + | r(/[—–-]+/g, '—'); | |
| − | + | ||
| − | // | + | // Привязка тире к предыдущему слову неразрывным пробелом |
| − | r(/( | + | r(/ (\u2014)/g, ' $1'); |
| − | r(/( | + | |
| − | // | + | // Кавычки: замена базовых кавычек на русские «ёлочки» |
| − | r(/ | + | r(/\"([^"<>]+)\"/g, '«$1»'); |
| − | r(/ | + | r(/«([^"<>]+)»/g, '«$1»'); |
| − | r(/(\ | + | // Вложенные кавычки (замена внутренних на „лапки“) |
| − | r(/ | + | r(/«([^«»]*+)«([^«»]*+)»([^«»]*+)»/g, '«$1„$2“$3»'); |
| − | r(/ | + | |
| − | + | // Исправление сокращений (т.д., т.п., и др.) | |
| − | + | r(/т\. ?д\./g, 'т. д.'); | |
| − | + | r(/т\. ?п\./g, 'т. п.'); | |
| − | + | r(/и ?др\./g, 'и др.'); | |
| − | + | r(/в ?т\. ?ч\./g, 'в т. ч.'); | |
| − | + | ||
| − | + | // Градусы, плюс-минус, проценты | |
| − | + | r(/(\d)\s*°\s*C/g, '$1 °C'); | |
| − | + | r(/(\d)\s*%/g, '$1%'); | |
| − | + | r(/\+-\s*/g, '±'); | |
| − | + | ||
| − | + | // Множественные пробелы схлопываем в один | |
| − | + | r(/ {2,}/g, ' '); | |
| − | + | ||
| − | + | // --- КОНЕЦ БЛОКА ТИПОГРАФИКИ --- | |
| − | + | ||
| − | + | // ВОЗВРАТ СКРЫТОГО ТЕКСТА НА МЕСТО | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
while (hidden.length > 0) { | while (hidden.length > 0) { | ||
| − | + | r(new RegExp('\\x01' + hidden.length + '\\x02', 'g'), hidden.pop()); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | wpTextbox1.selectionStart = startPos; | + | |
| − | + | // Запись отформатированного текста обратно в форму | |
| − | + | if (isSelection) { | |
| − | + | wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos); | |
| − | + | wpTextbox1.selectionStart = startPos; | |
| − | + | wpTextbox1.selectionEnd = startPos + txt.length; | |
| − | + | } else { | |
| − | + | wpTextbox1.value = txt; | |
| − | |||
| − | |||
} | } | ||
| − | + | ||
| − | + | // Возвращаем позицию скролла экрана | |
| − | + | if (document.documentElement && document.documentElement.scrollTop) { | |
| − | + | document.documentElement.scrollTop = winScroll; | |
| − | + | } else if (document.body) { | |
| − | + | document.body.scrollTop = winScroll; | |
| − | |||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | |||
| + | // Экспортируем функцию в глобальную видимость window, чтобы кнопка из Common.js её видела | ||
| + | window.Wikify = Wikify; | ||
Версия 12:47, 1 ноября 2026
/* Автономный Викификатор для MediaWiki 1.27 */
var wmCantWork = 'Викификатор не может работать в вашем браузере';
var wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?';
function Wikify() {
'use strict';
var txt = '', hidden = [], wpTextbox1 = document.getElementById('wpTextbox1');
if (!wpTextbox1) return;
var winScroll = document.documentElement.scrollTop || document.body.scrollTop;
// Вспомогательные функции автозамены
function r(r1, r2) { txt = txt.replace(r1, r2); }
function hide(re) { r(re, function (s) { return '\x01' + hidden.push(s) + '\x02'; }); }
function hideTag(tag) { hide(new RegExp('<' + tag + '( [^>]+)?>[\\s\\S]*?</' + tag + '>', 'gi')); }
// Проверка выделения текста
var startPos = wpTextbox1.selectionStart;
var endPos = wpTextbox1.selectionEnd;
var isSelection = (startPos !== undefined && endPos !== undefined && startPos !== endPos);
if (isSelection) {
txt = wpTextbox1.value.substring(startPos, endPos);
} else {
if (!confirm(wmFullText)) return;
txt = wpTextbox1.value;
}
// ТЕХНИЧЕСКИЙ БЛОК: Скрытие элементов, которые нельзя форматировать
hide(/<!--[\s\\S]*?-->/g);
hideTag('code');
hideTag('pre');
hideTag('source');
hideTag('syntaxhighlight');
hideTag('math');
hideTag('nowiki');
// Скрытие внутренних и внешних ссылок, файлов, шаблонов
hide(/https?:\/\/[^\s\]<\"]+/gi);
hide(/^\{|^\||^\}|[\n\s]\{|[\n\s]\||[\n\s]\}/g);
hide(/\[\[[^\]|]+\|/g);
// --- БЛОК ТИПОГРАФИКИ (ОСНОВНЫЕ ПРАВИЛА) ---
// Убираем пробелы на концах строк
r(/ +$/gm, '');
// Замена дефисов на тире
r(/(\s)-(?=\s)/g, '$1—');
r(/(^|\s)-(\s)/g, '$1—$2');
r(/[—–-]+/g, '—');
// Привязка тире к предыдущему слову неразрывным пробелом
r(/ (\u2014)/g, ' $1');
// Кавычки: замена базовых кавычек на русские «ёлочки»
r(/\"([^"<>]+)\"/g, '«$1»');
r(/«([^"<>]+)»/g, '«$1»');
// Вложенные кавычки (замена внутренних на „лапки“)
r(/«([^«»]*+)«([^«»]*+)»([^«»]*+)»/g, '«$1„$2“$3»');
// Исправление сокращений (т.д., т.п., и др.)
r(/т\. ?д\./g, 'т. д.');
r(/т\. ?п\./g, 'т. п.');
r(/и ?др\./g, 'и др.');
r(/в ?т\. ?ч\./g, 'в т. ч.');
// Градусы, плюс-минус, проценты
r(/(\d)\s*°\s*C/g, '$1 °C');
r(/(\d)\s*%/g, '$1%');
r(/\+-\s*/g, '±');
// Множественные пробелы схлопываем в один
r(/ {2,}/g, ' ');
// --- КОНЕЦ БЛОКА ТИПОГРАФИКИ ---
// ВОЗВРАТ СКРЫТОГО ТЕКСТА НА МЕСТО
while (hidden.length > 0) {
r(new RegExp('\\x01' + hidden.length + '\\x02', 'g'), hidden.pop());
}
// Запись отформатированного текста обратно в форму
if (isSelection) {
wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos);
wpTextbox1.selectionStart = startPos;
wpTextbox1.selectionEnd = startPos + txt.length;
} else {
wpTextbox1.value = txt;
}
// Возвращаем позицию скролла экрана
if (document.documentElement && document.documentElement.scrollTop) {
document.documentElement.scrollTop = winScroll;
} else if (document.body) {
document.body.scrollTop = winScroll;
}
}
// Экспортируем функцию в глобальную видимость window, чтобы кнопка из Common.js её видела
window.Wikify = Wikify;