MediaWiki:Onlyifediting.js — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Neo (обсуждение | вклад) м (ввёл подтверждение) |
Neo (обсуждение | вклад) м (убрано подтверждение) |
||
Строка 207: | Строка 207: | ||
//Необходимо ввести генерацию переменных, пока в процессе. | //Необходимо ввести генерацию переменных, пока в процессе. | ||
//if (wgNamespaceNumber % 2 || wgNamespaceNumber==4) { | //if (wgNamespaceNumber % 2 || wgNamespaceNumber==4) { | ||
− | + | // var sigs = txt.match(/\d\d:\d\d, \d\d? \S{3,9} 20\d\d \(UTC\)/g); | |
− | + | // if (sigs && sigs.length > 1) | |
− | + | // if (!confirm('Пожалуйста, не обрабатывайте Викификатором реплики других участников. Вы уверены, что хотите продолжить?')) | |
− | + | // return; | |
− | } | + | //} |
//var nowiki = ReplaceElements( '\<math\>(.|\r|\n)+?\<\/math\>, "\x03", "\x04" ); | //var nowiki = ReplaceElements( '\<math\>(.|\r|\n)+?\<\/math\>, "\x03", "\x04" ); | ||
//That variant will make ReplaceTags() function unnecessary, but it's so ugly... | //That variant will make ReplaceTags() function unnecessary, but it's so ugly... |
Текущая версия на 13:59, 3 июня 2007
//Скрипт выполняется при открытии страницы редактирования /* <code javascript> */ /* ==== Вставка стандартных описаний изменений ==== Из польской Википедии. * Autor (Author): [[:pl:User:Adziura|Adam Dziura]] * Poprawki (Fixes): [[:pl:User:Nux|Maciej Jaros]] * Localized by: [[:ru:User:.:Ajvol:.]] * Proofed by: [[:ru:User:ACrush]] * Spoiled by: [[:ru:User:CodeMonk]] <pre> */ function przyciskiOpis() { // stop before starting if (window.przyciskiOpisDone) return; // // sprawdzenie, czy to jest pole edycji z opisem zmian (nie jest takie jako nagłówek) var el = document.getElementById('wpSummaryLabel'); if (el) { if (el.innerHTML.indexOf('ие изменений')==-1) return // stop ; } else { return; // stop } // // dodanie elementu okalającego przyciski bezpośrednio za opisem zmian // создание контейнера с кнопками стандартных описаний изменений var el = document.getElementById('wpSummary').nextSibling; var opisBtns = document.createElement('span'); opisBtns.id = 'userSummaryButtonsA' el.parentNode.insertBefore(document.createElement('br'), el) el.parentNode.insertBefore(opisBtns, el) // // dodawanie przycisków // добавление //var kl = 'userButtonsStyle'; var kl = ''; // klasa jest niepotrzebna (wszystkie <a> w #userSummaryButtonsA ustawione poprzez CSS) if (opisBtns) { // drobne różne // przyciskiDodaj(opisBtns, 'викиф.', 'dodajOpis("викификация")', kl, // 'Произведена викификация'); przyciskiDodaj(opisBtns, 'оформл.', 'dodajOpis("оформление")', kl, 'Улучшено оформление'); przyciskiDodaj(opisBtns, 'стиль', 'dodajOpis("стилевые правки")', kl, 'Поправлен стиль изложения'); przyciskiDodaj(opisBtns, 'орфогр.', 'dodajOpis("орфография")', kl, 'Поправлена орфография и пунктуация'); przyciskiDodaj(opisBtns, 'кат.', 'dodajOpis("категория")', kl, 'Исправлена категоризация'); przyciskiDodaj(opisBtns, 'шаб.', 'dodajOpis("шаблон")', kl, 'Добавлен / изменён шаблон'); przyciskiDodaj(opisBtns, 'к удал.', 'dodajOpis("к удалению")', kl, 'Страница предложена к удалению'); przyciskiDodaj(opisBtns, 'доп.', 'dodajOpis("дополнение")', kl, 'Добавлены новые сведения'); przyciskiDodaj(opisBtns, 'иллюстрация', 'dodajOpis("иллюстрация")', kl, 'Размещена иллюстрация'); przyciskiDodaj(opisBtns, 'обнов.', 'dodajOpis("обновление данных")', kl, 'Обновлены устаревшие данные'); przyciskiDodaj(opisBtns, 'откат', 'dodajOpis("откат")', kl, 'Предыдущее изменение отменено (откат)'); } } /* Parametry: * elUserBtns - element okalający, do którego dodać przycisk * pTekst - tekst w środku przycisku * pAkcja - akcja (w formie tekstowej) jaką wykonać przy naciśnięciu; może być ciągiem poleceń * pKlasa - klasa jeśli konieczna * pOpis - opis widoczny w dymku przy przycisku */ function przyciskiDodaj(elUserBtns, pTekst, pAkcja, pKlasa, pOpis) { var nowyBtn = document.createElement('a'); // atrybuty nowyBtn.appendChild(document.createTextNode(pTekst)); nowyBtn.title = pOpis; if (pKlasa != '') nowyBtn.className = pKlasa ; nowyBtn.onclick = new Function(pAkcja); // dodanie przycisku elUserBtns.appendChild(nowyBtn); } function dodajOpis(opis) { var wpS = document.editform.wpSummary; if (wpS.value != '' && wpS.value.charAt(wpS.value.length-2) != '/') { wpS.value += ', ' + opis } else { wpS.value += opis } } addOnloadHook(przyciskiOpis); /**************************************** Викификатор ************************************************************** */ var txt; var wmFullText = 'Wikificator will process ALL text on this page. Continue?'; var wmCantWork = 'Wikificator cannot work in your browser'; var wmWontWork = 'Wikificator will not work in Netscape 4.x and less'; var wmCategoryNS = 'Категория'; var wmTemplateNS = 'Шаблон'; var wmUserNS = 'Участник'; var wmImageNS = 'Изображение'; var wmMediaNS = 'Медиа'; var wmLocaleNS = new Array ( wmCategoryNS, wmTemplateNS, wmUserNS, wmImageNS, wmMediaNS ); var wmEnNS = new Array ( 'category', 'template', 'user', 'image', 'media'); if (window.event){ document.onkeypress = pressed; } function pressed() //On Ctrl+Enter (MSIE) {key = window.event.keyCode;if (key==10){Wikify();}} //====================================== function Wikify() { check_regexp(); // Check whether regular expressions are supported // Только если пользователь указал в персональном скрипте auto_comment = 1; // Раскоментировал, теперь не должно ругаться (добавил определение переменной в общий монобук) // - если все равно ругается откатите и забаньте меня if (auto_comment == 1) { var wpS = document.editform.wpSummary; if (wpS.value != '' && wpS.value.charAt(wpS.value.length-2) != '/') { wpS.value += ', Викификатор' } else { wpS.value += 'Викификатор' } } document.editform.wpTextbox1.focus(); var txtarea = document.editform.wpTextbox1; if(document.selection && !is_gecko)/* IE */ { txt = " "+document.selection.createRange().text; if (txt == " ") {all_text();} // If nothing was selected; else{ Process(); txt = txt.substr (1, txt.length-1); document.selection.createRange().text = txt; } } else if((txtarea.selectionStart || txtarea.selectionStart == '0')&&(navigator.productSub>20031000)) /*Gecko-browsers older then 10.2003*/ { var startPos = txtarea.selectionStart; var endPos = txtarea.selectionEnd; var scrollTop=txtarea.scrollTop; txt = " "+(txtarea.value).substring(startPos, endPos); if (txt == " ") {all_text();} // If nothing was selected; else{ Process(); txt = txt.substr (1, txt.length-1); txtarea.value = txtarea.value.substring(0, startPos) + txt + txtarea.value.substring(endPos, txtarea.value.length); txtarea.focus(); } } else{if (confirm(wmFullText)) {all_text();}} // Other browsers } //====================================== function all_text()// Process all text { txt = " "+document.editform.wpTextbox1.value; Process(); txt = txt.substr (1, txt.length-1); document.editform.wpTextbox1.value=txt; } //====================================== function check_regexp()// Check whether regular expressions are supported { var reg1 = "code"; reg1 = reg1.replace(/d/g, "r"); if (reg1 != "core"){alert(wmCantWork);exit;} b_ver = navigator.appVersion.substr (0, 1); if (navigator.appName=="Netscape"&&b_ver<5){alert(wmWontWork);exit;} return ; } function Process() // We have 2 more pairs of safe chars in \x1E — \x1F ! { //Необходимо ввести генерацию переменных, пока в процессе. //if (wgNamespaceNumber % 2 || wgNamespaceNumber==4) { // var sigs = txt.match(/\d\d:\d\d, \d\d? \S{3,9} 20\d\d \(UTC\)/g); // if (sigs && sigs.length > 1) // if (!confirm('Пожалуйста, не обрабатывайте Викификатором реплики других участников. Вы уверены, что хотите продолжить?')) // return; //} //var nowiki = ReplaceElements( '\<math\>(.|\r|\n)+?\<\/math\>, "\x03", "\x04" ); //That variant will make ReplaceTags() function unnecessary, but it's so ugly... var nowiki = ReplaceTags( 'nowiki', "\x03", "\x04" ); var pre = ReplaceTags( 'pre', "\x12", "\x13" ); var code = ReplaceTags( 'code', "\x1c", "\x1d" ); var math = ReplaceTags( 'math', "\x05", "\x06" ); var gallery = ReplaceTags( 'gallery', "\x14", "\x15" ); // Exclude lines starting with space f_space = txt.substr (0, 1) txt = txt.substr (1, txt.length-1) var sp_lines = ReplaceElements( "^( )(.+)$", "\x16", "\x17" ); txt = f_space + txt ProcessNS( wmEnNS , wmLocaleNS ); CorrectRanges(); // Exclude templates and internal links var templates = ReplaceElements( "\\{\\{(.|\\r|\\n)+?\\}\\}", "\x18", "\x19" ); var links = ReplaceElements( "(\\[\\[)(.*?)(\\||\\]\\])", "\x10", "\x11" ); var ext_links = ReplaceElements( "\\[(http|https|ftp|tftp|news|nntp|telnet|irc|gopher)://(.*?)\\]", "\x1A", "\x1B"); HTML2Wiki(); // Exclude tags and tag attributes (all text in quotes after "=" sign) var attrs = ReplaceElements( '(=)(\\s?)(\\' + '")(.*?)(\\")', "\x0E", "\x0F"); var tags = ReplaceElements( "<([^>]*?)>", "\x01", "\x02"); ProcessTypography(); ProcessTypography(); // Second call //alert(txt); RestoreElements( tags, "\x01", "\x02"); RestoreElements( attrs, "\x0E", "\x0F"); RestoreElements( ext_links, "\x1A", "\x1B" ); RestoreElements( links, "\x10", "\x11" ); RestoreElements( templates, "\x18", "\x19" ); RestoreElements( sp_lines, "\x16", "\x17" ); RestoreElements( gallery, "\x14", "\x15" ); RestoreElements( math, "\x05", "\x06" ); RestoreElements( code, "\x1c", "\x1d" ); RestoreElements( pre, "\x12", "\x13" ); RestoreElements( nowiki, "\x03", "\x04" ); } function HTML2Wiki() { // Replace <b>, <strong> tags with ''' and <i>, <em> with '' txt = txt.replace(/\<\/?(b|strong)\>/gim, "\'\'\'") txt = txt.replace(/\<\/?(i|em)\>/gim, "\'\'") // Replace <hr> tag with ----, improve <hr> and <br> tags txt = txt.replace(/\<hr ?\/?\>/gi, "----") txt = txt.replace(/\<hr ([^\>\/]+?) ?\/?\>/gi, "<hr $1 />") txt = txt.replace(/\<br\/?\>/gi, "<br />") txt = txt.replace(/\<br ([^\>\/]+?) ?\/?\>/gi, "<br $1 />") // Replace small and big tags with inline styling /// txt = txt.replace(/(\<small\>)/g, "<span style=\"font-size\:smaller\;\">"); /// txt = txt.replace(/(\<\/small\>)/g, "<\/span>"); /// txt = txt.replace(/(\<big\>)/g, "<span style=\"font-size\:1.25em\;\">"); /// txt = txt.replace(/(\<\/big\>)/g, "<\/span>"); } // Process default namespaces function ProcessNS( En_NS_List , Loc_NS_List ) { for (i=0; i < En_NS_List.length; i++) { //alert("(\\[\\[)(:?)(" + En_NS_List[i] + "|" + //Loc_NS_List[i] + ")(:)( *)"); txt = txt.replace( new RegExp( "(\\[\\[:?)(" + En_NS_List[i] + "|" + Loc_NS_List[i] + "):( *)" , "gi" ), "$1" + Loc_NS_List[i] + ":"); } } //====================================== // Replace '<replaced_tag> ... </replaced_tag>' (<nowiki> <br/> </nowiki>) // with 'opepening_char + tag's counter + closing_char' ('\x03'+1'+'\x04') //====================================== function ReplaceTags(replaced_tag, op_char, cl_char ) // @replaced_tag - tag to be replaced // @op_char, @cl_char (opening & closing chars) - "Safe" pair of // unicode unprintable characters, that will be used in replacement { var counter = 0; //tags counter // RegExp pattern var pattern = "\\<" + replaced_tag + "\\>(.|\r|\n)+?\<\\/" + replaced_tag + "\\>"; // RegExp template to be replaced (multiline text between // <replaced_tag> and </replaced_tag> case sensitive tags) var replaced_regexp = new RegExp(pattern , "im") // Buffer for replaced matches storage. It's array of matching substrings - // multiline text between <replaced_tag> and </replaced_tag> case sensitive tags () matches_buffer = txt.match( new RegExp(pattern , "gim") ); // while some substring of txt matches replaced_regexp... while (replaced_regexp.test(txt)) { txt = txt.replace(replaced_regexp, op_char + ++counter + cl_char ); } return matches_buffer; } //====================================== // Replace '<replaced_tag> ... </replaced_tag>' (<nowiki> <br/> </nowiki>) // with 'opepening_char + tag's counter + closing_char' ('\x03'+1'+'\x04') //====================================== function ReplaceElements( req_exp, op_char, cl_char ) // @req_exp - reqular expression to be replaced // @op_char, @cl_char (opening & closing chars) - "Safe" pair of // unicode unprintable characters, that will be used in replacement { var counter = 0; //tags counter // RegExp template to be replaced (multiline, case sensitive) var replaced_regexp = new RegExp( req_exp , "m" ) // Buffer for replaced matches storage. It's array of matching substrings. // (multiline, case sensitive, global) matches_buffer = txt.match( new RegExp( req_exp , "gm" ) ); // while some substring of txt matches replaced_regexp... while (replaced_regexp.test(txt)) { //alert(txt.match(replaced_regexp)); txt = txt.replace(replaced_regexp, op_char + ++counter + cl_char ); } return matches_buffer; } //====================================== // Restore text, that was damaged by replacing 3 chars with substring from array //====================================== function RestoreElements( replaced_buffer, op_char, cl_char ) // @replaced_buffer - array of replaced substrings. // @op_char, @cl_char (opening & closing chars) - "Safe" pair // to be replaced with <replaced_tag> and </replaced_tag> accordingly { var counter = 0; //tags counter // RegExp template to be replaced (3 chars: tag's counter // surrunded by "Safe" pair) var replaced_regexp = new RegExp("\\" +op_char+ "([0-9]*)\\" +cl_char ); //replaced_regexp = /\x03([0-9]*)\x04/ // while some substring of txt matches replaced_regexp... while (replaced_regexp.test(txt)) { txt = txt.replace(replaced_regexp, replaced_buffer[counter++]); } return txt; } // Corrects year and century ranges (as links) in text function CorrectRanges() { // Correct year ranges txt = txt.replace(/(?!ISBN)(\(|\s)(\[\[[12]?\d{3}\]\])[\u00A0 ]?(-|--|–|—) ?(\[\[[12]?\d{3}\]\])(\W)/g, "$1$2—$4$5") txt = txt.replace(/(\[\[[12]?\d{3}\]\]) ?(г\.|гг\.)/g, "$1\u00A0$2") // Correct century ranges txt = txt.replace(/(\(|\s)(\[\[[IVX]{1,5}\]\])[\u00A0 ]?(-|--|–|—) ?(\[\[[IVX]{1,5}\]\])(\W)/g, "$1$2—$4$5") txt = txt.replace(/(\[\[[IVX]{1,5}\]\]) ?(в\.|вв\.)/g, "$1\u00A0$2") } /*************************************************** Typographical considerations ***************************************************/ function ProcessTypography() { // Insert spaces in titles txt = txt.replace(/^(=+)([ \t\f\v]*)(.*?)([ \t\f\v]*)(=+)$/gm, "$1 $3 $1") //====================================== // Use 1 character to display squaring and cubing txt = txt.replace(/(<sup>2<\/sup>|²)/g, "²"); txt = txt.replace(/(<sup>3<\/sup>|³)/g, "³"); txt = txt.replace(/(\^2)(\D)/g, "²$2"); txt = txt.replace(/(\^3)(\D)/g, "³$2"); //====================================== // Replace right HTML symbols with wrong ones in order to process everything txt = txt.replace(/–/g, "-") txt = txt.replace(/(«|»|“|”|„|\&((la|ra|bd|ld)quo|#132|#147|#148|quot);)/g, "\"") //====================================== // Replace double hyphen with a dash txt = txt.replace(/(--)(\[\[Участник|\~\~\~)/g, "—$2") //====================================== // Replace set of 'less then' or 'greater then' symbols (<< or >>) with usual double quotes txt = txt.replace(/(<<)(\S.+\S)(>>)/g, "\"$2\"") //====================================== // Process degree sign "°", "+-" and "~=" txt = txt.replace(/(\+[--])|(±)/g, "±") txt = txt.replace(/(~=)/g, "≈") txt = txt.replace(/\°/g, "°") txt = txt.replace(/([ =≈≠≤≥<>("'|]|^)([+±−\-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])[CС])(?=[ "').,;!?|]|$)/gm, "$1$2\u00A0°C") txt = txt.replace(/([ =≈≠≤≥<>("'|]|^)([+±−\-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])F)(?=[ "').,;|!?]|$)/gm, "$1$2\u00A0°F") //====================================== // Replace "...", "…" and "…" with ellipsis txt = txt.replace(/(\.{3}|\&(hellip|#133);)/g, '…') // Apostrophe handler txt = txt.replace(/([\wа-яА-ЯёЁ])'([\wа-яА-ЯёЁ])/g, "$1’$2") // Minus handler txt = txt.replace(/(sup\>|sub\>|\s)-(\d)/g, "$1−$2") //====================================== // Replace hyphens and en dashes with normal dashes txt = txt.replace(/\&(#151|[nm]dash);/g, "—") txt = txt.replace(/( |[\f\n\r\t\v\u00A0\u2028\u2029])(-|--|–) /g, "$1— ") txt = txt.replace(/(\d)--(\d)/g, "$1—$2") // Insert non-breaking space before dashes txt = txt.replace(/(\S) (-|--|–|—) (\S)/g, "$1\u00A0— $3") //====================================== // Special characters: ©, ®, ™, §, €, ¥ и £. txt = txt.replace(/\©/gi, "©") txt = txt.replace(/\®/gi, "®") txt = txt.replace(/(\((tm|тм)\)|\™)/gi, "™") txt = txt.replace(/\§/gi, "§") txt = txt.replace (/\€/gi, "€") txt = txt.replace (/\¥/gi, "¥") txt = txt.replace (/\£/gi, "£") //====================================== // Correct year ranges txt = txt.replace(/(\(|\s)([12]?\d{3})[\u00A0 ]?(-|--|–|—) ?([12]?\d{3})(\W)/g, "$1$2—$4$5") txt = txt.replace(/([12]?\d{3}) ?(г\.|гг\.)/g, "$1\u00A0$2") // Correct century ranges txt = txt.replace(/(\(|\s)([IVX]{1,5})[\u00A0 ]?(-|--|–|—) ?([IVX]{1,5})(\W)/g, "$1$2—$4$5") txt = txt.replace(/([IVX]{1,5}) ?(в\.|вв\.)/g, "$1\u00A0$2") // Correct the reductions txt = txt.replace(/(Т|т)\. ?е\./g, "$1о есть") txt = txt.replace(/(Т|т)\. ?к\./g, "$1ак как") txt = txt.replace(/(В|в) т\. ?ч\./g, "$1 том числе") txt = txt.replace(/и т\. ?д\./g, "и\u00A0т\.\u00A0д\.") txt = txt.replace(/и т\. ?п\./g, "и\u00A0т\.\u00A0п\.") txt = txt.replace(/(Т|т)\. ?н\./g, "$1\.\u00A0н\.") txt = txt.replace(/н\. ?э\./g, "н\.\u00A0э\.") txt = txt.replace(/(Д|д)(о|\.) н\. ?э\./g, "$1о\u00A0н\.\u00A0э\.") txt = txt.replace(/(\d) ?(млн|млрд|трлн|(?:м|с|д|к)?м|[км]?г|с)\.?( ([^\.А-ЯЁ])|[,;.])(?!\[.*?\|[А-Я].*?\])/g, "$1\u00A0$2$3") txt = txt.replace(/(\d) (тыс)([^\.А-Яа-яЁё])/g, "$1\u00A0$2.$3") //txt = txt.replace(/(\d) (млн|млрд|трлн)([^А-Яа-яЁё])/g, "$1\u00A0$2$3") // Insert missing and delete unnecessary spaces txt = txt.replace(/([А-Я]\.) ?([А-Я]\.) ?([А-Я][а-я])/g, "$1\u00A0$2\u00A0$3") txt = txt.replace(/([А-Я]\.)([А-Я]\.)/g, "$1 $2") txt = txt.replace(/^([#\*:]+)([ \t\f\v]*)([^ \t\f\v\*#:])/gm, "$1 $3") txt = txt.replace(/([а-я])(\.)([А-ЯA-Z])/g, "$1$2 $3") txt = txt.replace(/([а-яa-z\)\»\“\"\]])(\s*)(\,)([а-яa-z\(\«\„\"\[])/g, "$1$3 $4") txt = txt.replace(/([а-яa-z\)\»\“\"\]])(\s)([\,\;])(\s)([а-яa-z\(\«\„\"\[])/g, "$1$3 $5") txt = txt.replace(/([^%\/\w]\d+?(?:[.,]\d+?)?) ?([%‰])(?!-[А-Яа-яЁё])/g, "$1\u00A0$2") txt = txt.replace(/(\d) ([%‰])(?=-[А-Яа-яЁё])/g, "$1$2") txt = txt.replace(/([№§])(\s*)(\d)/g, "$1\u00A0$3") txt = txt.replace(/(^|[^ \t])([ \t]+)($|\n)/gm, "$1$3") txt = txt.replace(/(\()( +)/g, "$1"); txt = txt.replace(/( +)(\))/g, "$2"); //====================================== // Avoid double spaces txt = txt.substr (1, txt.length-1); txt = txt.replace(/(\S)([ \t]{2,})([\S\r])/g, "$1 $3") txt = " " + txt //====================================== // Replace double quotes ("") with double angle quotes («») txt = txt.replace(/([\x01-(\s\|\"]|\/|\+)(\")([^\"]{0,})([^\s\"(\|])(\")/g, "$1«\$3\$4»") // Quotations in quotes if (/"/.test(txt)) { txt = txt.replace(/([\x01(\s\"])(\")([^\"]{0,})([^\s\"(\|])(\")/g, "\$1«\$3\$4»") while (/(«)([^»]*)(«)/.test(txt)) txt = txt.replace(/(«)([^»]*)(«)([^»]*)(»)/g, "\$1\$2„\$4“") } } /*********** Добавляем кнопку **************** */ function marque_tab() { var toolbar = document.getElementById('toolbar'); if (!toolbar) return false; var textbox = document.getElementById('wpTextbox1'); if (!textbox) return false; if (!document.selection && textbox.selectionStart == null) return false; var image2 = document.createElement('img'); image2.width = 69; image2.height = 22; image2.src = 'http://upload.wikimedia.org/wikisource/ru/d/d1/Button-wikifikator.png'; image2.border = 0; image2.alt = 'Викификатор'; image2.title = 'Викификатор'; image2.style.cursor = 'pointer'; image2.onclick = function() { Wikify(); return false; } toolbar.appendChild(image2); } addOnloadHook(marque_tab); /* </pre> /* </code> */