MediaWiki:Wikificator.js
Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.
- Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
- Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
- Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
- Opera: натисніть Ctrl-F5
//Ґрунтується на http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js var wmCantWork = 'Вікіфікатор не працює з цією версією оглядача\n\nWikificator can not work in your browser'; var wmFullText = 'Вікіфікатор опрацює ВЕСЬ текст. Виконати?'; var wmTalkPage = 'Будь ласка, не обробляйте Вікіфікатором репліки інших користувачів. Виділіть текст, який треба опрацювати.'; wfPlugins = window.wfPlugins || []; function Wikify(){ var txt='', hidden = [], $input = $( '#wpTextbox1' ), $CodeMirrorVscrollbar = $( '.CodeMirror-vscrollbar' ); var winScroll = document.documentElement.scrollTop; try {txt='ая'.replace(/а/g,'б').replace(/б(?=я)/,'в')} catch(e){}//check regexp support if (txt != 'вя' || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5)) { alert(wmCantWork); return } $input.focus(); // Modern browsers caretPosition = $input.textSelection( 'getCaretPosition', { startAndEnd: true } ); if (caretPosition) { var textScroll = ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input ) .scrollTop(); txt = $input.textSelection( 'getSelection' ); if (txt === '') { processAllText(); } else { processText(); $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 ); } // 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 //functions function processAllText(){ txt = $input.textSelection( 'getContents' ); processText(); r(/^[\n\r]+/, ''); $input.textSelection( 'setContents', txt ); txt = ''; if (window.auto_comment && window.insertSummary && !document.editform.wpSection.value) if (wpS.value != '' && wpS.value.charAt(wpS.value.length-2) != '/') { wpS.value += ', Вікіфікатор'; } else { wpS.value += 'Вікіфікатор'; } } function processText(){ var u = ' '; //unbreakable space if (mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber')==4) { //is talk page u = ' '; 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; } } 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 + ']]'; } } hideTag('nowiki'); hideTag('pre'); hideTag('source'); hideTag('syntaxhighlight'); hideTag('code'); hideTag('tt'); hideTag('math'); hideTag('timeline'); hideTag('score'); hideTag('poem'); hideTag('mapframe'); hideTag('chem'); r(/( |\n|\r)+{\{(·|•|\*)}}/g, '{\{$2}}'); //before {\{·/•/*}}, usually in templates r(/{\{\s*[Шш]аблон:\s*([^(Вікіпедія)].+?)}}/g, '{\{$1}}'); hide(/{\{[\s\S]+?}}/g);//templates hide(/^ .*/mg); hide(/(https?|ftp|news|nntp|telnet|irc|gopher):\/\/[^\s\[\]<>"]+ ?/gi); hide(/^#(redirect|перенапр(авлення)?)/i); hideTag('gallery'); r(/ +(\n|\r)/g,'$1');//spaces at EOL txt = '\n'+txt+'\n'; r(/(\[\[:?)(category|категор[иі]я)( *):( *)/ig, '$1Категорія:'), r(/(\[\[:?)(image|зображення|file)( *):( *)/ig, '$1Файл:'); r(/\[\[ *(?!Файл:|Категорія:)([a-zA-Zа-яієїґІЄЇҐёА-ЯЁ\u00A0-\u00FF %!\"$&'()*,\-—.\/0-9:;=?\\@\^_`’~]+) *\| *([^|[\]]+) *\]\]([a-zа-яёієїґ]+)/g, '[[$1|$2$3]]'); // " hide(/(:)?Файл *: *[^\]|]+/g); hide(/\[\[(:)?[a-zA-Z-]+ *:[^\]]+/g); hide(/\|\s*(зображення|image|фото|flag_[sp]\d+)\s*=.+/gi); // TODO: додати сюди інші параметри шаблона з зображеннями // Апостроф r(/([\wа-яА-ЯґҐєЄіІїЇ'])[’\u0060\u0300\u02BC]([\wа-яА-ЯґҐєЄіІїЇ])/g, "$1'$2"); //LINKS //Linked years, centuries and ranges r(/(\(|\s)(\[\[[12]?\d{3}\]\])[\u00A0 ](-{1,3}|–|—)[\u00A0 ](\[\[[12]?\d{3}\]\])(\W)/g, '$1$2–$4$5'); r(/(\|\s*|\[\[)([12]?\d{3}) ?(-{1,3}|–|—) ?([12]?\d{3}) ?(\]\]\W)/g, '$1$2–$4$5'); r(/(\[\[[12]?\d{3}\]\]) ?(рр?\.)/g, '$1'+u+'$2'); r(/(\(|\s)(\[\[[IVX]{1,5}\]\])[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[IVX]{1,5}\]\])(\W)/g, '$1$2–$4$5'); r(/(\[\[[IVX]{1,5}\]\]) ?((вв?|ст)\.)/g, '$1'+u+'$2'); r(/\[\[([XVI]+)\]\]\s(століття|сторіччя)/g, '[[$1 століття|$1 $2]]'); r(/\[\[([XVI]+)\sстоліття\|\1\sстоліття([а-яієїґ]{0,3})\]\]/g, '[[$1 століття]]$2'); r(/\[\[(([XVI]+) століття\|\2)\]\][\u00A0 ]століття/g, '[[$2 століття]]'); // Nice links r(/(\[\[[^|\[\]]*)[\u00AD\u200E\u200F]+([^\[\]]*\]\])/g, '$1$2'); // Soft Hyphen & DirMark r(/\[\[([^|[\]\n]+)\|([^|[\]\n]+)\]\]/g, processLink); // link shortening hide(/\[\[[^\]|]+/g);//only link part //TAGS r(/<<(\S.+\S)>>/g, '"$1"'); //<< >> r(/(su[pb]>)-(\d)/g, '$1−$2'); // ->minus r(/²/gi, '²'); r(/³/gi, '³'); r(/<(b|strong)>(.*?)<\/(b|strong)>/gi,"'''$2'''"); r(/<(i|em)>(.*?)<\/(i|em)>/gi,"''$2''"); r(/^<hr ?\/?>/gim, '----'); r(/<[\/\\]?(hr|br)( [^\/\\>]+?)? ?[\/\\]?>/gi, '<$1$2/>'); r(/[ \t]*<ref(?:\s+name="")?(\s|>)/gi, '<ref$1'); r(/(\n== *[a-zа-яієїґ\s\.:]+ *==\n+)<references *\/>/ig,'$1{\{примітки}}'); hide(/<[a-z][^>]*?>/gi); hide(/^({\||\|-).*/mg);//table/row def hide(/(^\||^!|!!|\|\|) *[a-z]+=[^|]+\|(?!\|) +/mgi);//cell style hide(/\| +/g);//formatted cell r(/[ \t]+([^= ])/g,' $1');//double spaces // Headings r(/^(=+)[ \t\f\v]*(.*?)[ \t\f\v]*=+$/gm, '$1 $2 $1'); //add spaces inside r(/([^\r\n])(\r?\n==.*==\r?\n)/g, '$1\n$2'); //add empty line before r(/^== див(\.?|ись|іться) ?також ==$/gmi, '== Див. також =='); r(/^== зовнішні\sпосилання ==$/gmi, '== Посилання =='); r(/^== (.+)[.:] ==$/gm, '== $1 =='); r(/^(={2,}) '''(?!.*'''.*''')(.+)''' =+$/gm, '$1 $2 $1'); r(/«|»|“|”|„/g, '"');//temp r('\u00A0', u); // Entities etc. → Unicode chars r(/&#x([0-9a-f]{1,4});/gi, function(n,a){return String.fromCharCode(eval('0x'+a.substr(-4)))}); //́ r(/©/gi,'©'); r(/®/gi,'®'); r(/§/gi,'§'); r(/€/gi,'€'); r(/¥/gi,'¥'); r(/£/gi,'£'); r(/°/g,'°'); 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, '$1$2²$3'); r(/(\s)куб\.\s*(дм|см|мм|мкм|нм|км|м)(\s)/g, '$1$2³$3'); r(/((?:^|[\s"])\d+(?:[\.,]\d+)?)\s*[xх]\s*(\d+(?:[\.,]\d+)?)\s*([мm]{1,2}(?:[\s"\.,;?!]|$))/g, '$1×$2'+u+'$3'); r(/&((la|ra|bd|ld)quo|quot);/g,'"'); r(/№№/g,'№'); // Year and century ranges r(/(\(|\s)([12]?\d{3})[\u00A0 ]?(-{1,3}|—|–) ?([12]?\d{3})(?![\w-])/g, '$1$2—$4'); r(/([12]?\d{3}) ?(рр?\.)/g, '$1'+u+'$2'); r(/(\(|\s)([IVX]{1,5})[\u00A0 ]?(-{1,3}|—|–) ?([IVX]{1,5})(?![\w-])/g, '$1$2—$4'); r(/([IVX]{1,5}) ?((вв?|ст)\.)/g, '$1'+u+'$2'); // Reductions r(/н\.\s?е\./g, 'н\.'+u+'е\.'); r(/(Д|д)(о|\.)\sн\.\s?е\./g, '$1о'+u+'н\.'+u+'е\.'); r(/(\d)[\u00A0 ]?(млн|млрд|трлн|(?:м|с|д|к)?м|[км]г)\.?(?=[,;.]| "?[а-яёієїґ-])/g, '$1'+u+'$2'); r(/(\d)[\u00A0 ](тис)([^\.А-Яа-яЁёієїґІЄЇҐ])/g, '$1'+u+'$2.$3'); r(/ISBN:\s?(?=[\d\-]{8,17})/,'ISBN '); r(/(Т|т)\. ?я\./g, "$1ак як"); r(/(В|в|У|у) т\. ?ч\./g, "$1 тому числі"); r(/і т\. ?д\./g, 'і'+u+'т\.'+u+'д\.'); r(/і т\. ?п\./g, 'і'+u+'т\.'+u+'ін\.'); r(/(Т|т)\. ?зв\./g, '$1\.'+u+'зв\.'); r(/н\. ?е\./g, 'н\.'+u+'е\.'); // Insert/delete spaces r(/([A-Za-zА-ЯЄЁЇҐа-яёієїґ])\s?=\s("\w+)/g, '$1=$2'); // width = "" r(/^([#*:]+)[ \t\f\v]*(?!\{\|)([^ \t\f\v*#:;])/gm, '$1 $2'); //space after #*: unless before table r(/(\S)\s(-{1,3}|—|–)\s(\S)/g, '$1'+u+'— $3'); r(/([А-ЯЁІЄЇҐ]\.)\s?([А-ЯЁІЄЇҐ]\.)\s?([А-ЯЁІЄЇҐ][а-яёієїґ])/g, '$1'+u+'$2'+u+'$3'); r(/([А-ЯЁІЄЇҐ]\.)([ІЄЇҐА-ЯЁ]\.)/g, '$1 $2'); r(/([а-яёієїґ]"?\)?[\.\?!:])((?:\x01\d+\x02\|)?[А-ЯЁІЄЇҐ])/g, '$1 $2'); // word. word r(/([)"a-zа-яёієїґ\]])\s*([,:])\s*([\[("a-zа-яёієїґ])/gi, '$1$2 $3'); // word, word r(/([^%=\/\"\:\wА-Яа-яЁёієїґІЄЇҐ]\d+?(?:[\.,]\d+?)?)\s?([%‰])(?!-[А-Яа-яЁёієїґІЄЇҐ])/g, '$1 $2'); //5% r(/(\d) ([%‰])(?=-[А-Яа-яЁёієїґІЄЇҐ])/g, '$1$2'); //5%-й r(/([№§])(\s*)(\d)/g, '$1'+u+'$3'); r(/\( +/g, '('); r(/ +\)/g, ')'); //inside (); //Temperature r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])C)(?=[\s"').,;!?|])/gm, '$1$2'+u+'°C') //' r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])F)(?=[\s"').,;|!?])/gm, '$1$2'+u+'°F') //' //Dot → comma in numbers r(/(\s\d+)\.(\d+[\u00A0 ]*[%‰°×])/gi, '$1,$2'); //Plugins for (var p in wfPlugins) { wfPlugins[p](txt,r); } //"" → «» for (var i=1; i<=2; i++) r(/([\s\x02!|#'"\/(;+-])"([^"]*)([^\s="(|])"([^a-zа-яёієїґ])/ig, '$1«$2$3»$4'); //" while (/«[^»]*«/.test(txt)) r(/«([^»]*)«([^»]*)»/g, '«$1„$2“'); if ('0'.replace('0','$$') == '$') ////$ in replacing string is special, except in IE for (var j=0; j<hidden.length; j++) hidden[j] = hidden[j].replace(/\$/g, '$$$$'); while (hidden.length>0) r('\x01'+hidden.length+'\x02', hidden.pop()); txt=txt.substr(1, txt.length-2); } 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(RegExp('<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>','gi')) } }