MediaWiki:Common.js — различия между версиями
Ivgon (обсуждение | вклад) |
Ivgon (обсуждение | вклад) |
||
| (не показано 5 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
| + | // Автономный Викификатор для Sonic SCANF (Логика + Кнопка в одном файле) | ||
| + | function runWikificatorLogic() { | ||
| + | var wpTextbox1 = document.getElementById('wpTextbox1'); | ||
| + | if (!wpTextbox1) return; | ||
| + | |||
| + | var winScroll = document.documentElement.scrollTop || document.body.scrollTop; | ||
| + | var txt = '', hidden = []; | ||
| + | |||
| + | // Вспомогательные функции автозамены | ||
| + | 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('Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?')) return; | ||
| + | txt = wpTextbox1.value; | ||
| + | } | ||
| + | |||
| + | try { | ||
| + | // БЛОК СКРЫТИЯ (защита кода от поломки) | ||
| + | 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); | ||
| + | |||
| + | // --- БЛОК ТИПОГРАФИКИ (Исправленный синтаксис JS) --- | ||
| + | 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(/ {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; | ||
| + | } | ||
| + | |||
| + | } catch (typographyError) { | ||
| + | alert('Ошибка при обработке текста: ' + typographyError.message); | ||
| + | } | ||
| + | |||
| + | if (document.documentElement && document.documentElement.scrollTop) { | ||
| + | document.documentElement.scrollTop = winScroll; | ||
| + | } else if (document.body) { | ||
| + | document.body.scrollTop = winScroll; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Функция отрисовки самой кнопки на странице | ||
function injectWikificatorLink() { | function injectWikificatorLink() { | ||
| − | |||
if ( $( '#wikif-custom-btn-final' ).length ) return; | if ( $( '#wikif-custom-btn-final' ).length ) return; | ||
var $target = $( '.editButtons' ); | var $target = $( '.editButtons' ); | ||
if ( $target.length ) { | if ( $target.length ) { | ||
| − | |||
var $button = $( '<button>' ) | var $button = $( '<button>' ) | ||
.attr( { | .attr( { | ||
'id': 'wikif-custom-btn-final', | 'id': 'wikif-custom-btn-final', | ||
| − | 'type': 'button', | + | 'type': 'button', |
'style': 'font-weight: bold; color: #252525; background: #f8f9fa; border: 1px solid #a2a9b1; padding: 3px 8px; margin-right: 8px; border-radius: 2px; cursor: pointer; display: inline-block; margin-top: 5px; vertical-align: middle;' | 'style': 'font-weight: bold; color: #252525; background: #f8f9fa; border: 1px solid #a2a9b1; padding: 3px 8px; margin-right: 8px; border-radius: 2px; cursor: pointer; display: inline-block; margin-top: 5px; vertical-align: middle;' | ||
} ) | } ) | ||
.text( 'Викификатор' ); | .text( 'Викификатор' ); | ||
| − | |||
$button.on( 'click', function ( e ) { | $button.on( 'click', function ( e ) { | ||
| − | e.preventDefault(); | + | e.preventDefault(); |
| − | e.stopPropagation(); | + | e.stopPropagation(); |
| − | + | runWikificatorLogic(); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} ); | } ); | ||
| − | |||
$target.append( $button ); | $target.append( $button ); | ||
} | } | ||
} | } | ||
| + | // Инициализация при загрузке страницы редактирования | ||
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { | if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { | ||
$( document ).ready( injectWikificatorLink ); | $( document ).ready( injectWikificatorLink ); | ||
} | } | ||
Текущая версия на 13:31, 1 ноября 2026
// Автономный Викификатор для Sonic SCANF (Логика + Кнопка в одном файле)
function runWikificatorLogic() {
var wpTextbox1 = document.getElementById('wpTextbox1');
if (!wpTextbox1) return;
var winScroll = document.documentElement.scrollTop || document.body.scrollTop;
var txt = '', hidden = [];
// Вспомогательные функции автозамены
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('Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?')) return;
txt = wpTextbox1.value;
}
try {
// БЛОК СКРЫТИЯ (защита кода от поломки)
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);
// --- БЛОК ТИПОГРАФИКИ (Исправленный синтаксис JS) ---
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(/ {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;
}
} catch (typographyError) {
alert('Ошибка при обработке текста: ' + typographyError.message);
}
if (document.documentElement && document.documentElement.scrollTop) {
document.documentElement.scrollTop = winScroll;
} else if (document.body) {
document.body.scrollTop = winScroll;
}
}
// Функция отрисовки самой кнопки на странице
function injectWikificatorLink() {
if ( $( '#wikif-custom-btn-final' ).length ) return;
var $target = $( '.editButtons' );
if ( $target.length ) {
var $button = $( '<button>' )
.attr( {
'id': 'wikif-custom-btn-final',
'type': 'button',
'style': 'font-weight: bold; color: #252525; background: #f8f9fa; border: 1px solid #a2a9b1; padding: 3px 8px; margin-right: 8px; border-radius: 2px; cursor: pointer; display: inline-block; margin-top: 5px; vertical-align: middle;'
} )
.text( 'Викификатор' );
$button.on( 'click', function ( e ) {
e.preventDefault();
e.stopPropagation();
runWikificatorLogic();
} );
$target.append( $button );
}
}
// Инициализация при загрузке страницы редактирования
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
$( document ).ready( injectWikificatorLink );
}