User:Base/custumedittoolbar.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
//<nowiki>
var customizeToolbar = function() {
/* Your code goes here */
//вкладка Переклад
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'sections': {
'translations': {
'type': 'toolbar', // Can also be 'booklet'
'label': 'Переклад'
// or 'labelMsg': 'section-emoticons-label' for a localized label
}
}
} );
//група Теґи
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'groups': {
'doitings': {
'label': 'Теґи' // or use labelMsg for a localized label, see above
}
}
} );
//Translate
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'doitings',
'tools': {
'translatetag': {
label: 'Translate', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/2/2f/Toolbaricon_bold_T.png',
action: {
type: 'encapsulate',
options: {
pre: "<trans"+"late>", // text to be inserted
post: "</tran"+"slate>"
}
}
}
}
} );
//Tvar
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'doitings',
'tools': {
'tvartag': {
label: 'Tvar', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/6/69/Toolbaricon_bold_V.png',
action: {
type: 'encapsulate',
options: {
pre: "<tv"+"ar name=\"\">", // text to be inserted
post: "</tvar>"
}
}
}
}
} );
//languages tag
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'doitings',
'tools': {
'languagestag': {
label: 'Languages', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/0/00/Toolbaricon_bold_L.png',
action: {
type: 'encapsulate',
options: {
pre: "<lang"+"uages />"
}
}
}
}
} );
//mixed
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'doitings',
'tools': {
'translatetagreverced': {
label: 'Translate', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/3/35/Toolbaricon_bold_t.png',
action: {
type: 'encapsulate',
options: {
pre: "</trans"+"late>", // text to be inserted
post: "<tran"+"slate>"
}
}
}
}
} );
//група Шаблони
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'groups': {
'templates': {
'label': 'Шаблони' // or use labelMsg for a localized label, see above
}
}
} );
//mixed
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'templates',
'tools': {
'tnttl': {
label: 'TNT', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/2/2f/Toolbaricon_bold_T.png',
action: {
type: 'encapsulate',
options: {
pre: "{"+"{TNT|", // text to be inserted
post: "}}"
}
}
}
}
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'templates',
'tools': {
'lltl': {
label: 'Special:MyLanguage/', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/0/00/Toolbaricon_bold_L.png',
action: {
type: 'encapsulate',
options: {
pre: "Special:MyLanguage/"
}
}
}
}
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'templates',
'tools': {
'langcattl': {
label: '#translation:', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/c/c8/Toolbaricon_bold_C.png',
action: {
type: 'encapsulate',
options: {
pre: "{"+"{#translation:}}"
}
}
}
}
} );
//група Заміни
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'groups': {
'changers': {
'label': 'Заміни' // or use labelMsg for a localized label, see above
}
}
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'changers',
'tools': {
'fixheaderswithtag': {
label: 'Виправити криво теґовану назву розділу (додає кінцевий теґ)',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/8/8f/Toolbaricon_bold_H.png',
action: {
type: 'callback',
execute: function(context){
improperlyTaggedHeaderFixer(true);
}
}
}
}
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'changers',
'tools': {
'fixheaderswithouttag': {
label: 'Виправити криво теґовану назву розділу (НЕ додає кінцевий теґ)',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/f/f8/Toolbaricon_bold_h.png',
action: {
type: 'callback',
execute: function(context){
improperlyTaggedHeaderFixer(false);
}
}
}
}
} );
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'translations',
'group': 'changers',
'tools': {
'fixlistitem': {
label: 'Виправити криво теґовваний елемент списку',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/0/00/Toolbaricon_bold_L.png',
action: {
type: 'callback',
execute: function(context){
improperlyTaggedListItemFixer();
}
}
}
}
} );
//інше
//перекреслення
$('#wpTextbox1').wikiEditor('addToToolbar', {
section: 'advanced',
group: 'format',
tools: {
"strikethrough": {
label: 'Перекреслити',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/1/1a/Toolbaricon_strike.png',
action: {
type: 'encapsulate',
options: {
pre: "<s>",
post: "</s>"
}
}
}
}
});
//горизонтальна лінія
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
section: 'advanced',
group: 'format',
tools: {
"hline": {
label: 'Горизонтальна лінія',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/b/b4/Toolbaricon_rule.png',
action: {
type: 'encapsulate',
options: {
pre: "----",
ownline: true
}
}
}
}
} );
//формула
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
section: 'advanced',
group: 'format',
tools: {
"math": {
label: 'Формула',
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/1/1c/Toolbaricon_math.png',
action: {
type: 'encapsulate',
options: {
pre: "<math>",
post: "</math>"
}
}
}
}
} );
};
/**
* Виправляє теґований не за документацією заголовок розділу
* @param addClosingTag -- чи додавати закриваючий теґ
* Якщо істина, запитує підтвердження якщо після заголовку розділу виділено ще
* текст, і цей текст містить інший або інші теґи перекладу
*/
function improperlyTaggedHeaderFixer(addClosingTag){
var selectedTextArea = document.activeElement;
var selectedTextAreaValue = selectedTextArea.value;
if(selectedTextAreaValue){
var selectionStart = selectedTextArea.selectionStart;
var selectionEnd = selectedTextArea.selectionEnd;
var preSelection = selectedTextAreaValue.substring(
0,
selectionStart
);
var selection = selectedTextAreaValue.substring(
selectionStart,
selectionEnd
);
var postSelection = selectedTextAreaValue.substring(
selectionEnd,
selectedTextAreaValue.length
);
var improperlyTaggedHeaderPattern = /(\s*)(=+)\s*<t{1}ranslate>\s*(<!--T:\d+-->)\n\s*([^=]+)\s*<\/t{1}ranslate>\s*\2((?:.|\n)*)/;
var matchedSelection = selection.match(improperlyTaggedHeaderPattern);
if(matchedSelection){
if(
addClosingTag
&& matchedSelection[5].contains("translate>")
&& !(confirm("У виділеному тексті, після заголовку розлілу, є теґ(и) "
+"перекладу. Навмисно?"))
){
return;
}
}
else{
return;
}
selection = selection.replace(
improperlyTaggedHeaderPattern,
"$1<trans"+"late>\n$2 $4 $2 $3$5" + (addClosingTag ? "\n</trans"+"late>" : "")
);
selectedTextArea.value = preSelection + selection + postSelection;
}
}
/**
* Виправляє неправильно теґований елемент списку на правильний
* TODO: Позбутись дублювання коду щодо обробки виділення
* TODO: Додати можливість обробки понад одного елементу списку за раз
* (треба дослідити чи для цього достатньо лише зміни режиму в паттерні)
*/
function improperlyTaggedListItemFixer(){
var selectedTextArea = document.activeElement;
var selectedTextAreaValue = selectedTextArea.value;
if(selectedTextAreaValue){
var selectionStart = selectedTextArea.selectionStart;
var selectionEnd = selectedTextArea.selectionEnd;
var preSelection = selectedTextAreaValue.substring(
0,
selectionStart
);
var selection = selectedTextAreaValue.substring(
selectionStart,
selectionEnd
);
var postSelection = selectedTextAreaValue.substring(
selectionEnd,
selectedTextAreaValue.length
);
var improperlyTaggedHeaderPattern = /(\n*)\*\s*<trans{1}late>\s*(<!--T:\d+-->)\n(.*?)<\/trans{1}late>/;
selection = selection.replace(
improperlyTaggedHeaderPattern,
"$1<trans"+"late>\n$2\n* $3\n</trans"+"late>"
);
selectedTextArea.value = preSelection + selection + postSelection;
}
}
/**
* Функція виявлення критичних (=які призведуть до помилки парсингу коду або
* критичної проблеми з відображенням) помилок теґування.
* TODO: НЕ ДОПИСАНА (треба доробити правильне захоплення блоків перекладу щоб
* валідація використання тварів відбувалась в межах лише них, а не всіх блоків
* одного теґу перекладу.)
*/
function taggingValidator(){
var textarea = document.getElementById("wpTextbox1");
var textareaValue = textarea.value;
var splitUnits = textareaValue.split("<trans"+"late>");
for(i = 0; i < splitUnits.length; i++){
var splitUnit = splitUnits[i];
if(i == 0){
if(splitUnit.contains("</tra"+"nslate>")){
alert("До першого теґу <trans"+"late> є теґ </trans"+"late>:\n\n"+splitUnit);
return false;
}
if(splitUnit.contains("<tv"+"ar|")){
alert("До першого теґу <trans"+"late> є теґ <tv"+"ar|:\n\n"+splitUnit);
return false;
}
}
else{
var closingTranslateIndex = splitUnit.indexOf("</trans"+"late>");
if(closingTranslateIndex == -1){
alert("Після теґу <trans"+"late> №"+i +" немає теґу </trans"+"late>:\n\n"+splitUnit);
// До наступного відкривного теґу або кінця документу, залежно від того що раніше.
// Не додаю це уточнення через його очевидність в алерт, але про всяк випадок пишу тут.
return false;
}else{
var secondClosingTranslateIndex = splitUnit.indexOf("</trans"+"late>", closingTranslateIndex+1);
if(secondClosingTranslateIndex != -1){
alert("Після теґу <trans"+"late> №"+i +" два або більше теґи </trans"+"late>:\n\n"+splitUnit);
// До наступного відкривного теґу або кінця документу, залежно від того що раніше.
// Не додаю це уточнення через його очевидність в алерт, але про всяк випадок пишу тут.
return false;
}
}
if(splitUnit.contains("<tvar|>")){
alert("Після теґу <trans"+"late> №"+i + "є теґ <tvar|> (з порожнім ключем)");
return false;
}
var translationUnitPattern = /(<!--T:\d+-->\n[^\s\n].*\n\n|.*<!--T:\d+-->)/;
alert(splitUnit.match(translationUnitPattern));
var twiceUsedTvarKeyPattern = /.*(<tvar\|(.*?)>.*<tvar\|\2>.*)/;
var twiceUsedTvarKey = splitUnit.match(twiceUsedTvarKeyPattern);
if(twiceUsedTvarKey){
alert("Після теґу <trans"+"late> №"+i + "є кілька теґів <tvar| з однаковим ключем \""
+twiceUsedTvarKey[2]+"\":\n\n"+splitUnit);
return false;
}
// Можливо буде логічно пересунути цю перевірку до попередньої
var tvarPattern = /<tvar\|.*?>/;
var tvarUnits = splitUnit.split(tvarPattern);
for(j = 1; j < tvarUnits.length; j++){
var tvarUnit = tvarUnits[j];
if(!tvarUnit.contains("</>")){
alert("Після теґу <trans"+"late> №"+i + "є не закритий теґ <tvar| \n\n"+tvarUnits);
return false;
}
}
}
}
alert("У теґуванні сторінки не знайдено критичних помилок.");
return true;
}
// TODO: Написати функцію по виявленню некритичних помилок
// 1) відхилень від документації
// 2) відхилень від сталих практик теґування
/* Check if we are in edit mode and the required modules are available and then customize the toolbar */
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
mw.loader.using( 'user.options', function () {
if ( mw.user.options.get('usebetatoolbar') ) {
mw.loader.using( 'ext.wikiEditor', function () {
$(document).ready( customizeToolbar );
} );
}
} );
}
//</nowiki>