MediaWiki:Gadget-wikificator.js: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 128: | Строка 128: | ||
hideTag( 'maplink' ); | hideTag( 'maplink' ); | ||
− | |||
− | |||
− | |||
r( /( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}' ); // before {{·/•/*}}, usually in templates | r( /( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}' ); // before {{·/•/*}}, usually in templates | ||
− | |||
− | |||
− | |||
− | |||
− | |||
r( /<[\/\\]?(hr|br)( [^\/\\>]+?)?? *[\/\\]?>/gi, '<$1$2>' ); | r( /<[\/\\]?(hr|br)( [^\/\\>]+?)?? *[\/\\]?>/gi, '<$1$2>' ); | ||
r( | r( | ||
Строка 149: | Строка 141: | ||
} | } | ||
); | ); | ||
− | |||
− | |||
− | |||
r( /(\[\[[^\{\]|\n]+){{!}}([^\{\]|\n]+\]\])/g, '$1|$2' ); | r( /(\[\[[^\{\]|\n]+){{!}}([^\{\]|\n]+\]\])/g, '$1|$2' ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
var i; | var i; | ||
Строка 169: | Строка 153: | ||
hideTemplates(); | hideTemplates(); | ||
hide( /^[ \t].*/mg ); | hide( /^[ \t].*/mg ); | ||
− | |||
− | |||
− | |||
Строка 179: | Строка 160: | ||
// LINKS | // LINKS | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// Nice links | // Nice links | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
r( /\[\[ *([^|[\]]+)([^|\[\]()]+?) *\| *\1 *\]\]\2/g, '[[$1$2]]' ); // text repetition after link | r( /\[\[ *([^|[\]]+)([^|\[\]()]+?) *\| *\1 *\]\]\2/g, '[[$1$2]]' ); // text repetition after link | ||
r( /\[\[ *(?!Файл:|Категория:)([a-zA-Zа-яёА-ЯЁ\u00A0-\u00FF %!\"$&'()*,\-—.\/0-9:;=?\\@\^_`’~]+) *\| *([^\|\[\]]+) *\]\]([a-zа-яё]+)/g, '[[$1|$2$3]]' ); // " | r( /\[\[ *(?!Файл:|Категория:)([a-zA-Zа-яёА-ЯЁ\u00A0-\u00FF %!\"$&'()*,\-—.\/0-9:;=?\\@\^_`’~]+) *\| *([^\|\[\]]+) *\]\]([a-zа-яё]+)/g, '[[$1|$2$3]]' ); // " | ||
Строка 250: | Строка 208: | ||
// Headings | // Headings | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
r( /^== (?:(.+[^.])\.|(.+):) ==$/gm, '== $1$2 ==' ); | r( /^== (?:(.+[^.])\.|(.+):) ==$/gm, '== $1$2 ==' ); | ||
r( /^== '''(?!.*'''.*''')(.+)''' ==$/gm, '== $1 ==' ); | r( /^== '''(?!.*'''.*''')(.+)''' ==$/gm, '== $1 ==' ); | ||
Строка 265: | Строка 217: | ||
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( | r( | ||
/(Boeing|Боинг(?:а|у|ом|е|и|ов|ам|ах))?(\(|\s)([12]?\d{3})[\u00A0 ]?(?:-{1,3}|—) ?([12]?\d{3})(?![\wА-ЯЁа-яё]|-[^ех]|-[ех][\wА-ЯЁа-яё])/g, | /(Boeing|Боинг(?:а|у|ом|е|и|ов|ам|ах))?(\(|\s)([12]?\d{3})[\u00A0 ]?(?:-{1,3}|—) ?([12]?\d{3})(?![\wА-ЯЁа-яё]|-[^ех]|-[ех][\wА-ЯЁа-яё])/g, | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
); | ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// Plugins | // Plugins | ||
Строка 470: | Строка 357: | ||
} else { | } else { | ||
$.when( | $.when( | ||
+ | alert("TEST-1"); | ||
mw.loader.using( [ 'mediawiki.util', 'user.options' ] ), | 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' ) | $.getScript( 'https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-registerTool.js&action=raw&ctype=text/javascript' ) | ||
).done( registerWikificatorTool ); | ).done( registerWikificatorTool ); | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}() ); | }() ); | ||
// </nowiki> | // </nowiki> |
Версия 21:37, 6 января 2023
// <nowiki> mw.loader.using( 'jquery.client', function () { var clientProfile = $.client.profile(); var hotkey = clientProfile.platform === 'mac' ? 'Ctrl+Shift+W' : 'Ctrl+Alt+W'; var strings = { name: 'Викификатор', tooltip: 'Викификатор — автоматический обработчик текста (' + hotkey + ')', summary: 'викификатор', fullText: 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?', talkPage: 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно.' }; window.wfPlugins = window.wfPlugins || []; window.wfPluginsT = window.wfPluginsT || []; // Function takes an input or text as an argument. If it is absent, it uses $( '#wpTextbox1' ) // as an input. window.Wikify = function ( inputOrText ) { 'use strict'; // FUNCTIONS 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' ) ); } function hideTemplates() { hide( /\{\{([^{]\{?)+?\}\}/g ); var pos = 0, stack = [], tpl, left, right; while ( true ) { left = txt.indexOf( '{{', pos ); right = txt.indexOf( '}}', pos ); if ( left === -1 && right === -1 && !stack.length ) { break; } if ( left !== -1 && ( left < right || right === -1 ) ) { stack.push( left ); pos = left + 2; } else { left = stack.pop(); if ( typeof left === 'undefined' ) { if ( right === -1 ) { pos += 2; continue; } else { left = 0; } } if ( right === -1 ) { right = txt.length; } right += 2; tpl = txt.substring( left, right ); txt = txt.substring( 0, left ) + '\x01' + hidden.push( tpl ) + '\x02' + txt.substr( right ); pos = right - tpl.length; } } } function processLink( link, left, right ) { left = left.replace( /[ _\u00A0]+/g, ' ' ).trim(); if ( left.match( /^(?:Категория|Файл) ?:/ ) ) { return '[[' + left + '|' + right + ']]'; } right = right.replace( / {2,}/g, ' ' ).trim(); var inLink = right.substr( 0, left.length ); var afterLink = right.substr( left.length ); var uniLeft = left.substr( 0, 1 ).toUpperCase() + left.substr( 1 ); var uniRight = ( right.substr( 0, 1 ).toUpperCase() + right.substr( 1 ) ) .replace( /[_\u00A0]/g, ' ' ); if ( uniRight.indexOf( uniLeft ) === 0 && afterLink.match( /^[a-zа-яё]*$/ ) ) { return '[[' + inLink + ']]' + afterLink; } else { return '[[' + left + '|' + right + ']]'; } } function processText() { var u = '\u00A0'; // non-breaking space if ( // is talk page mw.config.get( 'wgNamespaceNumber' ) % 2 || mw.config.get( 'wgNamespaceNumber' ) === 4 ) { var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g ); if ( sigs && sigs.length > 1 ) { alert( strings.talkPage ); return; } } hideTag( 'nowiki' ); hideTag( 'pre' ); hideTag( 'source' ); hideTag( 'syntaxhighlight' ); hideTag( 'templatedata' ); hideTag( 'code' ); hideTag( 'kbd' ); hideTag( 'tt' ); hideTag( 'graph' ); hideTag( 'hiero' ); hideTag( 'math' ); hideTag( 'timeline' ); hideTag( 'chem' ); hideTag( 'score' ); hideTag( 'categorytree' ); hideTag( 'imagemap' ); hideTag( 'inputbox' ); hideTag( 'mapframe' ); hideTag( 'maplink' ); r( /( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}' ); // before {{·/•/*}}, usually in templates r( /<[\/\\]?(hr|br)( [^\/\\>]+?)?? *[\/\\]?>/gi, '<$1$2>' ); r( /(\| *Координаты[ _А-ЯЁа-яё]*= *)(\d+(?:[.,]\d+)?)[,/] ?(\d+(?:[.,]\d+)?(?=\s))/g, function ( s, m1, m2, m3 ) { return ( m1 + ( +parseFloat( m2.replace( ',', '.' ) ).toFixed( 4 )) + '/' + ( +parseFloat( m3.replace( ',', '.' ) ).toFixed( 4 ) ) ); } ); r( /(\[\[[^\{\]|\n]+){{!}}([^\{\]|\n]+\]\])/g, '$1|$2' ); var i; for ( i in window.wfPluginsT ) { if ( window.wfPluginsT.hasOwnProperty( i ) ) { window.wfPluginsT[i]( txt, r ); } } hideTemplates(); hide( /^[ \t].*/mg ); r( / +(\n|\r)/g, '$1' ); // spaces at EOL txt = '\n' + txt + '\n'; // LINKS // Nice links r( /\[\[ *([^|[\]]+)([^|\[\]()]+?) *\| *\1 *\]\]\2/g, '[[$1$2]]' ); // text repetition after link r( /\[\[ *(?!Файл:|Категория:)([a-zA-Zа-яёА-ЯЁ\u00A0-\u00FF %!\"$&'()*,\-—.\/0-9:;=?\\@\^_`’~]+) *\| *([^\|\[\]]+) *\]\]([a-zа-яё]+)/g, '[[$1|$2$3]]' ); // " hide( /\[\[[^\]|]+/g); // only link part // TAGS r( /<<(\S.+\S)>>/g, '"$1"' ); // << >> r( /(su[pb]>)-(\d)/g, '$1−$2' ); // ->minus r( /<(b|strong)>(.*?)<\/(b|strong)>/gi, "'''$2'''" ); r( /<(i|em)>(.*?)<\/(i|em)>/gi, "''$2''" ); r( /^<hr ?\/?>/gim, '----' ); r( /[\u00A0 \t]*<ref(?:\s+name="")?(\s|>)/gi, '<ref$1' ); r( /(\n== *[a-zа-я\s\.:]+ *==\n+)<references(?: +responsive *= *"")? *\/>/ig, '$1{' + '{примечания}}' ); hide( /<[a-z][^>]*?>/gi); hide( /^(\{\||\|\-).*/mg); // table/row def hide( /(^\||^!|!!|\|\|) *[a-z]+=[^|]+\|(?!\|)/mgi); // cell style hide( /\| +/g); // formatted cell r( /[ \t\u00A0]{2,}/g, ' ' ); // double spaces // Entities etc. → Unicode chars if ( mw.config.get( 'wgNamespaceNumber' ) !== 10 ) { r( /&(#x[0-9a-f]{2,4}|#[0-9]{3,4}|[0-9a-z]{2,8});/gi, function ( s ) { var t = document.createElement( 'textarea' ); t.innerHTML = s; var c = t.value; if ( c.length === 1 && c.charCodeAt( 0 ) > 127 || s === ' ' ) { return c; } return s; }); } r( /\(tm\)/gi, '™' ); r( /\.\.\./g, '…' ); r( /(^|[^+])\+-(?!\+|-)/g, '$1±' ); r( /~=/g, '≈' ); r( /\^2(\D)/g, '²$1' ); r( /\^3(\D)/g, '³$1' ); r( /\sкв\.\s*([дсмнк]?м|мкм)([\s\.,;:)])/g, u + '$1²$2' ); r( /\sкуб\.\s*([дсмнк]?м|мкм)([\s\.,;:)])/g, u + '$1³$2' ); r( /((?:^|[\s"])\d+(?:[\.,]\d+)?\s*)[xх](\s*\d+(?:[\.,]\d+)?)\s*([мm]{1,2}(?:[\s"\.,;?!]|$))/g, '$1×$2' + u + '$3' ); r( /\s+×\s+/g, u + '×' + u ); r( /([\wа-яА-ЯёЁ])'(?=[\wа-яА-ЯёЁ])/g, '$1’' ); // ' r( /№№/g, '№' ); // Headings r( /^== (?:(.+[^.])\.|(.+):) ==$/gm, '== $1$2 ==' ); r( /^== '''(?!.*'''.*''')(.+)''' ==$/gm, '== $1 ==' ); r( /«|»|“|”|„/g, '"' ); // temp // Hyphens and en dashes to pretty dashes r( /–/g, '-' ); // – -> hyphen r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> — r( /(\d)--(\d)/g, '$1—$2' ); // -> — r( /(Boeing|Боинг(?:а|у|ом|е|и|ов|ам|ах))?(\(|\s)([12]?\d{3})[\u00A0 ]?(?:-{1,3}|—) ?([12]?\d{3})(?![\wА-ЯЁа-яё]|-[^ех]|-[ех][\wА-ЯЁа-яё])/g, ); // Plugins for ( i in window.wfPlugins ) { if ( window.wfPlugins.hasOwnProperty( i ) ) { window.wfPlugins[i]( txt, r ); } } // "" → «» for ( i = 1; i <= 2; i++ ) { r( /([\s\x02!|#'"\/([{;+\-])"([^"]*)([^\s"([{|])"([^a-zа-яё])/ig, '$1«$2$3»$4' ); // " } while ( /«[^»]*«/.test( txt ) ) { r( /«([^»]*)«([^»]*)»/g, '«$1„$2“' ); } function unhide( s, num ) { return hidden[ num - 1 ]; } while ( txt.match( /\x01\d+\x02/ ) ) { r( /\x01(\d+)\x02/g, unhide ); } txt = txt.substr( 1, txt.length - 2 ); // compensation for "txt = '\n' + txt + '\n';" } function processAllText() { txt = $input ? $input.textSelection( 'getContents' ) : text; processText(); if ( $input ) { r( /^[\n\r]+/, '' ); $input.textSelection( 'setContents', txt ); if ( caretPosition ) { $input.textSelection( 'setSelection', { start: caretPosition[0] > txt.length ? txt.length : caretPosition[0] } ); } } else { text = txt; } if ( window.auto_comment && window.insertSummary && !document.editform.wpSection.value ) { window.insertSummary( strings.summary ); } } // MAIN CODE // Check what's in the first parameter var text; var isInput; var $input; if ( typeof inputOrText === 'string' ) { text = inputOrText; } else { isInput = ( inputOrText && ( ( inputOrText.nodeType && inputOrText.value !== undefined ) || // node ( inputOrText.prop && inputOrText.prop( 'nodeType' ) ) // jQuery object ) ); $input = $( isInput ? inputOrText : '#wpTextbox1' ); } var txt = ''; var hidden = []; var winScroll = document.documentElement.scrollTop; var caretPosition; if ( $input ) { $input.focus(); caretPosition = $input.textSelection( 'getCaretPosition', { startAndEnd: true } ); if ( caretPosition ) { var $CodeMirrorVscrollbar = $( '.CodeMirror-vscrollbar' ); var textScroll = ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input ) .scrollTop(); if ( caretPosition[0] === caretPosition[1] ) { processAllText(); } else { txt = $input.textSelection( 'getSelection' ); processText(); // replaceSelection doesn't work with MediaWiki 1.30 in case this gadget is loaded // from other wiki $input.textSelection( 'encapsulateSelection', { replace: true, peri: txt } ); // In CodeMirror, the selection isn't preserved, so we do it explicitly $input.textSelection( 'setSelection', { start: caretPosition[0], end: caretPosition[0] + txt.length } ); } ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input ) .scrollTop( textScroll ); // If something went wrong } else if ( confirm( strings.fullText ) ) { processAllText(); } } else { processAllText(); return text; } // scroll back, for 2017 wikitext editor, IE, Opera document.documentElement.scrollTop = winScroll; }; 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, }, } ); } if ( mw.config.get( 'wgServerName' ) === 'ru.wikipedia.org' ) { registerWikificatorTool(); } else { $.when( alert("TEST-1"); 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 ); } }() ); // </nowiki>