User:Base/custumedittoolbar.js

From Outreach Wiki
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>