MediaWiki:Gadget-wikificator.js: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 1: | Строка 1: | ||
− | + | var wmCantWork = 'Викификатор не может работать в вашем браузере', | |
− | + | wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?', | |
− | + | wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно'; | |
− | var | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
window.wfPlugins = window.wfPlugins || []; | window.wfPlugins = window.wfPlugins || []; | ||
− | |||
− | + | window.Wikify = function ( input ) { | |
− | |||
− | window.Wikify = function ( | ||
'use strict'; | 'use strict'; | ||
+ | var txt = '', | ||
+ | hidden = [], | ||
+ | winScroll = document.documentElement.scrollTop; | ||
+ | |||
+ | // Поверхностная проверка на то, что перед нами поле ввода | ||
+ | if ( !input || !input.tagName || input.value === undefined ) { | ||
+ | input = document.editform.wpTextbox1; | ||
+ | } | ||
+ | |||
// FUNCTIONS | // FUNCTIONS | ||
Строка 23: | Строка 20: | ||
function r( r1, r2 ) { | function r( r1, r2 ) { | ||
txt = txt.replace( r1, r2 ); | txt = txt.replace( r1, r2 ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function processText() { | function processText() { | ||
− | var u = '\u00A0'; // non-breaking space | + | var i, |
− | if ( | + | u = '\u00A0'; // non-breaking space |
− | + | if ( mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber') === 4 ) { // is talk page | |
− | |||
− | |||
− | |||
var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g ); | var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g ); | ||
if ( sigs && sigs.length > 1 ) { | if ( sigs && sigs.length > 1 ) { | ||
− | alert( | + | alert( wmTalkPage ); |
return; | return; | ||
} | } | ||
} | } | ||
− | + | // Hyphens to em-dashes | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> — | r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> — | ||
+ | r( /(\d)-(\d)/g, '$1—$2' ); // -> — | ||
r( /(\d)--(\d)/g, '$1—$2' ); // -> — | r( /(\d)--(\d)/g, '$1—$2' ); // -> — | ||
− | r( /(\ | + | r( /(\d)---(\d)/g, '$1—$2' ); // -> — |
− | r( | + | r( /«|»|“|”|„/g, '"' ); // temp |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// "" → «» | // "" → «» | ||
Строка 351: | Строка 49: | ||
} | } | ||
− | + | r( 'ёё' , '</div>\n<hr class=newtheme>\n<div class=newtheme>' ); | |
− | + | r( 'ёёё' , '<hr class=newtheme>\n' ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
function processAllText() { | function processAllText() { | ||
− | txt = | + | txt = input.value; |
processText(); | processText(); | ||
− | + | r( /^[\n\r]+/, '' ); | |
− | + | input.value = txt; | |
− | + | txt = ''; | |
− | + | } | |
− | + | ||
− | + | ||
− | + | // Check regexp support | |
− | + | try { | |
− | + | txt = 'ая'.replace( /а/g, 'б' ).replace( /б(?=я)/, 'в' ); | |
+ | } catch ( e ) {} | ||
+ | if ( txt !== 'вя' ) { | ||
+ | alert( wmCantWork ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | input.focus(); | ||
+ | |||
+ | // Modern browsers | ||
+ | if ( typeof input.selectionStart !== 'undefined' ) { | ||
+ | var textScroll = input.scrollTop, | ||
+ | startPos = input.selectionStart, | ||
+ | endPos = input.selectionEnd; | ||
+ | txt = input.value.substring( startPos, endPos ); | ||
+ | if ( txt === '' ) { | ||
+ | processAllText(); | ||
} else { | } else { | ||
− | + | processText(); | |
+ | input.value = input.value.substring( 0, startPos ) + | ||
+ | txt + input.value.substring( endPos ); | ||
} | } | ||
− | if ( | + | input.selectionStart = startPos; |
− | + | input.selectionEnd = startPos + txt.length; | |
− | + | input.scrollTop = textScroll; | |
− | + | ||
− | ) { | + | // IE |
− | + | } else if ( document.selection && document.selection.createRange ) { | |
+ | var range = document.selection.createRange(); | ||
+ | txt = range.text; | ||
+ | if ( txt === '' ) { | ||
+ | processAllText(); | ||
+ | } else { | ||
+ | processText(); | ||
+ | range.text = txt; | ||
+ | if ( range.moveStart ) { | ||
+ | range.moveStart( 'character', -txt.length ); | ||
+ | } | ||
+ | range.select(); | ||
} | } | ||
+ | |||
+ | // Other browsers | ||
+ | } else if ( confirm( wmFullText ) ) { | ||
+ | processAllText(); | ||
} | } | ||
− | // | + | document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera |
− | + | }; | |
− | // | + | |
− | var | + | window.AddLinesToNames = function ( input ) { |
− | var | + | // получим строки в массив |
− | var | + | input = document.getElementById("wpTextbox1"); |
− | if ( | + | var lines = input.value.split('\n'); |
− | + | var TimePosition = []; | |
− | + | // | |
− | + | // найдём позиции | |
− | + | // | |
− | + | var ThemesCount = 0; | |
− | + | var LineFrom = 0; | |
− | + | for(var i = 0; i<lines.length; i++){ | |
− | + | if (lines[i] === "==Темы==") { LineFrom = i+1; } | |
− | + | if (lines[i] === "==Места==") { LineTo = i-1; } | |
− | + | if (lines[i] === "==Лица==") { LineFromA = i+1; } | |
+ | if (lines[i].substring(1, 6) === "{{что|") { ThemesCount = ThemesCount + 1; } | ||
+ | if (lines[i] === "{{КонецПередачи}}") { LineToA = i-1; } | ||
} | } | ||
− | + | LineToA = LineToA - ThemesCount; | |
− | + | // | |
− | + | // заполняем массив времён | |
− | + | // | |
− | + | for (I=LineFrom; I<LineTo-1; I++){ | |
− | + | if ( lines[I] === "<div class=newtheme>" ){ | |
− | + | // проверим, есть ли время в следующей строке | |
− | + | if (lines[I+1].substring(4, 5) === ":") { | |
− | + | TimeStr = lines[I+1].substring(2, 7); | |
− | + | TimePosition.push(TimeStr); | |
− | |||
− | |||
− | |||
− | |||
− | |||
} else { | } else { | ||
− | + | TimeStr = lines[I+2].substring(2, 7); | |
− | + | TimePosition.push(TimeStr); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
} | } | ||
− | + | // | |
− | // | + | // дополняем раздел имён |
− | + | // | |
+ | var N = 0; | ||
+ | for (I=LineFromA; I<LineToA; I++){ | ||
+ | TimeStr = lines[I].substring(2, 7); | ||
+ | if (TimeStr >= TimePosition[N]) { | ||
+ | lines[I] = "<hr class=newtheme>\n" + lines[I]; | ||
+ | N = N + 1; | ||
+ | } | ||
+ | } | ||
+ | // | ||
+ | // возвращаем результат в форму | ||
+ | // | ||
+ | input.value = lines.join("\n"); | ||
+ | input.focus(); | ||
}; | }; | ||
− | + | // | |
+ | // регистрация | ||
+ | // | ||
function registerWikificatorTool() { | function registerWikificatorTool() { | ||
registerTool( { | registerTool( { | ||
Строка 465: | Строка 184: | ||
} ); | } ); | ||
} | } | ||
− | + | $.when( | |
− | + | mw.loader.using( [ 'mediawiki.util', 'user.options' ] ), | |
− | + | $.getScript( 'https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-registerTool.js&action=raw&ctype=text/javascript' ) | |
− | + | ).done( registerWikificatorTool ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версия 21:15, 6 января 2023
var wmCantWork = 'Викификатор не может работать в вашем браузере', wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?', wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно'; window.wfPlugins = window.wfPlugins || []; window.Wikify = function ( input ) { 'use strict'; var txt = '', hidden = [], winScroll = document.documentElement.scrollTop; // Поверхностная проверка на то, что перед нами поле ввода if ( !input || !input.tagName || input.value === undefined ) { input = document.editform.wpTextbox1; } // FUNCTIONS function r( r1, r2 ) { txt = txt.replace( r1, r2 ); } function processText() { var i, u = '\u00A0'; // non-breaking space if ( mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber') === 4 ) { // is talk page var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g ); if ( sigs && sigs.length > 1 ) { alert( wmTalkPage ); return; } } // Hyphens to em-dashes r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> — r( /(\d)-(\d)/g, '$1—$2' ); // -> — r( /(\d)--(\d)/g, '$1—$2' ); // -> — r( /(\d)---(\d)/g, '$1—$2' ); // -> — r( /«|»|“|”|„/g, '"' ); // temp // "" → «» for ( i = 1; i <= 2; i++ ) { r( /([\s\x02!|#'"\/([{;+\-])"([^"]*)([^\s"([{|])"([^a-zа-яё])/ig, '$1«$2$3»$4' ); // " } while ( /«[^»]*«/.test( txt ) ) { r( /«([^»]*)«([^»]*)»/g, '«$1„$2“' ); } r( 'ёё' , '</div>\n<hr class=newtheme>\n<div class=newtheme>' ); r( 'ёёё' , '<hr class=newtheme>\n' ); } function processAllText() { txt = input.value; processText(); r( /^[\n\r]+/, '' ); input.value = txt; txt = ''; } // Check regexp support try { txt = 'ая'.replace( /а/g, 'б' ).replace( /б(?=я)/, 'в' ); } catch ( e ) {} if ( txt !== 'вя' ) { alert( wmCantWork ); return; } input.focus(); // Modern browsers if ( typeof input.selectionStart !== 'undefined' ) { var textScroll = input.scrollTop, startPos = input.selectionStart, endPos = input.selectionEnd; txt = input.value.substring( startPos, endPos ); if ( txt === '' ) { processAllText(); } else { processText(); input.value = input.value.substring( 0, startPos ) + txt + input.value.substring( endPos ); } input.selectionStart = startPos; input.selectionEnd = startPos + txt.length; input.scrollTop = textScroll; // IE } else if ( document.selection && document.selection.createRange ) { var range = document.selection.createRange(); txt = range.text; if ( txt === '' ) { processAllText(); } else { processText(); range.text = txt; if ( range.moveStart ) { range.moveStart( 'character', -txt.length ); } range.select(); } // Other browsers } else if ( confirm( wmFullText ) ) { processAllText(); } document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera }; window.AddLinesToNames = function ( input ) { // получим строки в массив input = document.getElementById("wpTextbox1"); var lines = input.value.split('\n'); var TimePosition = []; // // найдём позиции // var ThemesCount = 0; var LineFrom = 0; for(var i = 0; i<lines.length; i++){ if (lines[i] === "==Темы==") { LineFrom = i+1; } if (lines[i] === "==Места==") { LineTo = i-1; } if (lines[i] === "==Лица==") { LineFromA = i+1; } if (lines[i].substring(1, 6) === "{{что|") { ThemesCount = ThemesCount + 1; } if (lines[i] === "{{КонецПередачи}}") { LineToA = i-1; } } LineToA = LineToA - ThemesCount; // // заполняем массив времён // for (I=LineFrom; I<LineTo-1; I++){ if ( lines[I] === "<div class=newtheme>" ){ // проверим, есть ли время в следующей строке if (lines[I+1].substring(4, 5) === ":") { TimeStr = lines[I+1].substring(2, 7); TimePosition.push(TimeStr); } else { TimeStr = lines[I+2].substring(2, 7); TimePosition.push(TimeStr); } } } // // дополняем раздел имён // var N = 0; for (I=LineFromA; I<LineToA; I++){ TimeStr = lines[I].substring(2, 7); if (TimeStr >= TimePosition[N]) { lines[I] = "<hr class=newtheme>\n" + lines[I]; N = N + 1; } } // // возвращаем результат в форму // input.value = lines.join("\n"); input.focus(); }; // // регистрация // function registerWikificatorTool() { registerTool( { name: 'wikificator', position: 100, title: strings.name, label: strings.tooltip, callback: Wikify, classic: { icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', }, visual: { icon: '//upload.wikimedia.org/wikipedia/commons/thumb/4/41/Wikificator_VE_icon.svg/20px-Wikificator_VE_icon.svg.png', modes: [ 'source' ], addRightAway: true, }, } ); } $.when( mw.loader.using( [ 'mediawiki.util', 'user.options' ] ), $.getScript( 'https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-registerTool.js&action=raw&ctype=text/javascript' ) ).done( registerWikificatorTool );