Участник:Vavilexxx/dewikify.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
/* Скрипт для девикификации выделенного текста (убирает внутренние ссылки в выделенном тексте).
Добавляет в панель редактирования кнопку, при нажатии на которую в выделенном тексте все внутренние ссылки заменяются на текст.
Вот так: 
	[[link|text]] -> text
	[[link]] -> link
Частично основано на скрипте уч. DonRumata [[Участник:DonRumata/lowercase.js]] */


function getFixedWikiLink(text) {
	const reBracketSpace = /\[\[\s*([^\]\[]+?)\s*\]\]/g;
	const rePipeSpace = /\[\[\s*([^\[\]\|]+?)\s*\|\s*([^\[\]\|]+?)\s*\]\]/g;
	const result = text.replace(reBracketSpace, "[[$1]]").replace(rePipeSpace, "[[$1|$2]]");
	return result;
}


function wikiLinkFix() {
    var focus = $(document.activeElement);
    if (focus) {
        if (focus.hasClass('CodeMirror-code')) {
            focus = $('#wpTextbox1');
        }
        if (focus.is('textarea, input')) {
            var oldText = focus.textSelection('getSelection');
            if (oldText) {
            	// insert your code here
            	const newText = getFixedWikiLink(oldText);
                // replace text
                focus.textSelection('encapsulateSelection', {
                    replace: true,
                    peri: newText
                });
            }
        }
    }
}


function dewikify() {
    var focus = $(document.activeElement);
    if (focus) {
        if (focus.hasClass('CodeMirror-code')) {
            focus = $('#wpTextbox1');
        }
        if (focus.is('textarea, input')) {
            var oldText = focus.textSelection('getSelection');
            if (oldText) {
            	// insert your code here
            	const reLinkText = /\[\[[^\[\]\|]+\|([^\[\]\|]+)\]\]/g;
				const reLink = /\[\[([^\[\]\|]+)\]\]/g;
				oldText = getFixedWikiLink(oldText);
				const newText = oldText.replace(reLinkText, "$1").replace(reLink, "$1");
                // replace text
                focus.textSelection('encapsulateSelection', {
                    replace: true,
                    peri: newText
                });
            }
        }
    }
}


var customizeToolbarWikiLinks = function() {
    $('#wpTextbox1').wikiEditor('addToToolbar', {
        'section': 'main',
        'group': 'gadgets',  // 'group': 'gadgets', 'format', 'insert', 'codemirror'
        'tools': {
            'wikilinkfix': {
                label: 'Исправление викиссылок', // or use labelMsg for a localized label
                type: 'button',
                icon: '/upwiki/wikipedia/commons/8/8f/OOjs_UI_icon_wikiText-progressive.svg',
                action: {
                    'type': 'callback',
                    'execute': wikiLinkFix
                }
            },
            'dewikify': {
                label: 'Дефикифицировать выделенное', // or use labelMsg for a localized label
                type: 'button',
                icon: '/upwiki/wikipedia/commons/e/eb/OOjs_UI_icon_noWikiText-rtl-progressive.svg',
                action: {
                    'type': 'callback',
                    'execute': dewikify
                }
            }
        }
    });
};

if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
    mw.loader.using(['user.options', 'jquery.textSelection'], function() {
        if (mw.user.options.get('usebetatoolbar') === 1) {
            $.when(
                mw.loader.using('ext.wikiEditor'),
                $.ready
            ).then(customizeToolbarWikiLinks);
        }
    });
}