MediaWiki:Gadget-ToolbarTocNav.ts

Z Wikipedie, otevřené encyklopedie

//

// Toto je jen původní zdroják, samotná funkční verze je na [[MediaWiki:Gadget-ToolbarTocNav.js]]

/// <reference path="jquery.d.ts" />

interface JQuery {
    wikiEditor(action: string, params: Object): JQuery;
    wikiEditor(action: 'addToToolbar', params: Object): JQuery;
    wikiEditor(action: 'removeFromToolbar', params: Object): JQuery;
}

(function() {
    function setSelectionRange(input: HTMLTextAreaElement, selectionStart: number, selectionEnd: number) {
        if (input.createTextRange) {
            var range = input.createTextRange();
            range.collapse(true);
            range.moveEnd('character', selectionEnd);
            range.moveStart('character', selectionStart);
            range.select();
        } else if (input.setSelectionRange) {
            input.focus();
            input.setSelectionRange(selectionStart, selectionEnd);
        }
    }

    function handleClicks(textArea: HTMLTextAreaElement, $tocPopup: JQuery, $link: JQuery, resultIndex: number) {
        $link.click(() => {
            setSelectionRange(textArea, resultIndex, resultIndex);
            $tocPopup.remove();
            $(document.body).off('click.tocnav-popup');
            return false;
        });
    }

    function showToc(context) {
        var $editbox = $('#wpTextbox1');
        if (!$editbox.length) return;
        var textArea = <HTMLTextAreaElement>$editbox[0];

        $('.tocnav-popup').remove();

        var text = $editbox.val();

        var $tocPopup = $('<div class="toc tocnav-popup">');

        var levels: JQuery[] = [];
        var currLevel = 0;
        var $currTocEntry = $tocPopup;
        levels.push($currTocEntry);

        var result: RegExpExecArray;
        var captionRe = /^(=+)([^=]*)/mg;
        while ((result = captionRe.exec(text)) !== null) {
            var level = result[1].length;

            var $entry = $('<li>');
            $entry.addClass('toclevel-' + level);
            var $link = $('<a>');
            $link.attr('href', '#');
            handleClicks(textArea, $tocPopup, $link, result.index);
            $entry.append($link);
            $link.text(result[2].trim());

            if (level > currLevel) {
                var $newLevel = $('<ol>');
                levels.push($newLevel);
                $currTocEntry.append($newLevel);
                $currTocEntry = $newLevel;
                currLevel = level;
            } else if (level < currLevel) {
                levels.pop();
                $currTocEntry = levels[levels.length - 1];
                currLevel = level;
            }

            $currTocEntry.append($entry);
        }

        var $toolbarButton = context.modules.toolbar.$toolbar.find('.tool-button[rel="tocnav"]');
        if (!$toolbarButton) $toolbarButton = context.modules.toolbar.$toolbar;

        var buttonPos = $toolbarButton.position();
        $tocPopup.css('left', buttonPos.left);
        $tocPopup.css('top', buttonPos.top);
        $toolbarButton.after($tocPopup);

        $(document.body).on('click.tocnav-popup', () => {
            $tocPopup.remove();
            $(document.body).off('click.tocnav-popup');
        });
        $tocPopup.click(event => {
            event.stopPropagation();
        });

        return false;
    }

    function init() {
        var $editbox = $('#wpTextbox1');
        if (!$editbox.length) return;

        $editbox.wikiEditor('addToToolbar', {
            'section': 'advanced',
            'groups': {
                'nav': {
                    label: 'Navigace'
                }
            }
        });
        $editbox.wikiEditor('addToToolbar', {
            'section': 'advanced',
            'group': 'nav',
            'tools': {
                'tocnav': {
                    label: 'Obsah',
                    type: 'button',
                    icon: '//upload.wikimedia.org/wikipedia/commons/a/a8/Toolbaricon_definition_list.png',
                    action: {
                        type: 'callback',
                        execute: showToc
                    }
               }
            }
        });
    }

    $(init);
})();
//