MediaWiki:Gadget-CustomMenu.js

Z WikiSkript

Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.

  • Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
  • Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
  • Internet Explorer / Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5
  • Opera: Stiskněte Ctrl-F5.
/**
 * DOKUMENTACE
 * Přidává do hlavního menu sekci s uživatelsky definovanými položkami
 * Toto menu musí být definováno na stránce Uživatel:Username/usermenu (nebo Usermenu)
 * Každá položka na samostatném řádku. Pro přehlednost může začínat hvězdičkou.
 * Syntax: URL nebo název stránky na wiki|název odkazu
 * Nepovinné parametry: |blank ... odkaz se otevře v novém okně
 * 
 * INSTALACE
 * V Mediawiki:Common.css je potřeba nastavit "li[id^='n-hidden'] { display: none; }"
 * a "#p-custom-menu {display:none;}"
 * MediaWiki:Custom-menu = Osobní menu
 * MediaWiki:Sidebar ... na konec přidat "* custom-menu \n** hidden-custom|hidden-custom"
 * User:Josmart/CustomMenuIntro ... nápověda při zakládání menu
 * User:Josmart/DefaultUserMenu ... toto menu se nabídne při jeho zakládání
 * @author Josef Martiňák (https://www.wikiskripta.eu/w/User:Josmart)
 * @author Slepi (https://www.wikiskripta.eu/w/User:Slepi)
 * @license https://www.gnu.org/copyleft/gpl.html GNU GPL 3.0
 */

var customMenu = {

    /* styl tlačítka */
    buttonStyle : {
                    fontStyle: "italic",
                    padding: "0.3rem 1rem",
                },

    /**
     * Načíst obsah menu ze stránky Uživatel:Username/usermenu
     */
    getContent : function() {
		
		$.ajax({
      		dataType: "text",
      		url:  '/api.php',
      		data: 'action=query&titles=User:' + mw.config.get("wgUserName") + '/usermenu' + '&format=json'
    	})
    	.done(function( data ) {
      		if(data.indexOf('"missing":""') !== -1) {
      			// Seznam odkazů je prázdný. Nabídneme jeho vytvoření s předdefinovaným seznamem
      			mw.util.addPortletLink('p-custom-menu', '/index.php?title=User:' + mw.config.get("wgUserName") + '/usermenu&action=edit&editintro=User:Josmart/CustomMenuIntro&preload=User:Josmart/DefaultUserMenu&summary=moje%20nov%C3%A9%20osobn%C3%AD%20menu', 'Vytvořte si menu', 'pmMng');
      			/* zobrazit menu */
				$("#p-custom-menu").css("display", "block");
				$("#pmMng a").css(customMenu.buttonStyle);
      		}
      		else {
      			// načíst obsah menu
      			var menu = [];
        		$.ajax({
      				dataType: "text",
      				url:  '/index.php?title=User:' + mw.config.get("wgUserName") + '/usermenu',
      				data: 'action=raw'
    			})
    			.done(function( data ) {
      				$.each(data.split(/\n/), function(i, line){
      					line = line.trim();
        				if(line.length>0 && line.substr(0,2) != '//') {
            				menu.push(customMenu.prepareMenuItem(line));
        				}
    				});
    				if(data === '') customMenu.getContent('usermenu');
    				customMenu.append(menu);
    			});
      		}
    	});
    },


	/**
     * Převést řádek definice menu do pole o čtyřech položkách
     * @param {line} Řádek definice menu ze zdrojového článku
     * @return {array} položka menu (odkaz,název odkazu,is_blank,is_external)
     */
    prepareMenuItem : function(line) {

		/* odstranit * a prázdné znaky */
		if(line.indexOf("*")==0) {
			line = line.substring(1);
		}
		line = line.trim();
		
		/* rozdělit podle "|" */
		var arr = line.split("|");

        /* chybí-li název, použít jako název URL */
        if(arr.length==1) arr[1] = arr[0];
        
        /* je-li na 2.místě "blank", použít jako název URL a otevřít v nové okně */
        if(arr[1]=="blank") {
        	arr[1] = arr[0];
        	arr[2] = "blank";
        }
        
        /* ošetřit chybějící informaci, zda otevírat v novém okně */
        if(arr.length==2 || arr[2]!="blank") arr[2] = 0;
        else arr[2] = 1;
        
        if(arr[0].match(/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/) !== null) {
        	/* externí odkaz */
        	// přidat do odkazu https, pokud chybí.
        	if(arr[0].indexOf("http") == -1) {
        		arr[0] = "https://" + arr[0];
        	}
        	arr[3] = 1;
        }
        else {
        	/* odkaz na wiki článek */
        	arr[3] = 0;
        }
        
        /* vrátit položku menu */
        return arr;
    },


	/**
     * Připojit user menu
     */
    append : function(menu) {

        /* Přidat odkazy do menu */
        var i;
        for (i = 0; i < menu.length; i++) {
        	if(menu[i][3] == 1) {
        		// externí odkaz
        		mw.util.addPortletLink('p-custom-menu', menu[i][0], menu[i][1], 'pm' + i);
        	}
        	else {
        		// interní odkaz
				mw.util.addPortletLink('p-custom-menu', '/w/' + menu[i][0], menu[i][1], 'pm' + i);
        	}
        	// odkaz v novém okně?
        	if(menu[i][2] == 1) {
        		$("#pm" + i + ">a").prop("target","_blank");
        	}
		}
		
		// Přidej link na seznam odkazů
		mw.util.addPortletLink('p-custom-menu', '/w/User:' + mw.config.get("wgUserName") + '/usermenu', 'Upravit menu', 'pmMng');
		
		/* zobrazit menu */
		$("#p-custom-menu").css("display", "block");
		$("#pmMng a").css(customMenu.buttonStyle);
    },


    /**
     * Zahájit skript
     */
    start : function() {
        customMenu.getContent();
    }

}


/* Zahájit po načtení stránky */
if (document.readyState != "loading"){
    customMenu.start();
} else {
    document.addEventListener('DOMContentLoaded', customMenu.start);
}