abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 00:11 | Komunita

    V červnu bylo oznámeno, že se z K-9 Mailu stane Thunderbird pro Android. Dle plánu by se tak mělo stát v létě 2023. Na svém blogu vývojáři informují o novinkách z vývoje: přizpůsobitelná gesta v K-9 Mailu ve verzi 6.400 a redesign zobrazení zpráv.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | Nová verze

    Rakudo (Wikipedie), tj. překladač programovacího jazyka Raku (Wikipedie), byl vydán ve verzi 2022.12. Programovací jazyk Raku byl dříve znám pod názvem Perl 6.

    Ladislav Hagara | Komentářů: 0
    včera 09:00 | Komunita

    V oznámení o vydání Xfce 4.18 Pre2 jsou výsledky soutěže o výchozí pozadí pro Xfce 4.18. Vydání Xfce 4.18 je plánováno na 15. prosince.

    Ladislav Hagara | Komentářů: 0
    včera 08:00 | Nová verze

    Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu pro jednodeskové počítače na platformě ARM, byl vydán ve verzi 22.11. Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 0
    včera 07:00 | Nová verze

    Byla vydána OpenIndiana Hipster 2022.10. Unixový operační systém OpenIndiana (Wikipedie) vychází z OpenSolarisu (Wikipedie).

    Ladislav Hagara | Komentářů: 1
    3.12. 10:00 | Komunita

    O víkendu (15:00 až 23:00) probíhá EmacsConf 2022, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat lze na stránkách konference nebo také na YouTube.

    Ladislav Hagara | Komentářů: 5
    3.12. 09:00 | Bezpečnostní upozornění

    Byly zveřejněny informace o zranitelnosti CVE-2022-4139 v ovladači i915. Problém se týká Intel GPU Gen12. Zranitelnost je opravena v upstream Linuxu 6.0.11, 5.15.81 a 5.10.157.

    Ladislav Hagara | Komentářů: 0
    2.12. 16:22 | IT novinky

    Mozilla tento týden vedle společnosti Pulse převzala také společnost Active Replica. Active Replica pomůže Mozille rozvíjet metaverse, online 3D platformu, Mozilla Hubs.

    Ladislav Hagara | Komentářů: 16
    2.12. 09:00 | Nová verze

    Po dvou letech a deseti měsících od vydání verze 5.8 byla vydána nová verze 5.9 svobodného multiplatformního softwaru pro konverzi a zpracování digitálních fotografií primárně ve formátů RAW RawTherapee (Wikipedie). Představení novinek v oznámení o vydání verze 5.9 (WIP). Nejnovější RawTherapee je k dispozici také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.

    Ladislav Hagara | Komentářů: 1
    1.12. 18:33 | IT novinky

    Mozilla převzala společnost Pulse. Z oznámení: "Společně budeme vytvářet modely strojového učení, které budou fungovat transparentně, budou respektovat soukromí a budou od začátku vytvářeny se zaměřením na spravedlnost a inkluzi". Společnost Pulse vyvíjí software pro automatické nastavování stavů ve Slacku.

    Ladislav Hagara | Komentářů: 25
    Už jste se osobně setkali s podvodem typu falešná technická podpora?
     (56%)
     (4%)
     (40%)
    Celkem 78 hlasů
     Komentářů: 2, poslední 2.12. 14:48
    Rozcestník

    Mediawiki: (2) Základní práce, rozšíření a šablony

    21.11. 23:10 | Přečteno: 645× | linux | Výběrový blog | poslední úprava: 21.11. 23:10

    Tentokrát se podíváme, jaká je filozofie Mediawiki ohledně tvorby obsahu, jak si ho ladit pomocí šablon a jak nám k tomu mohou pomoci rozšíření.

    Základní tvorba obsahu

    Mediawiki má filozofii, co neexistuje, to vytvoř. Novou stránku v Mediawiki tedy nevytvoříme tak, že někde budeme hledat tlačítko "přidat", ale tak, že zadáme zmíněný termín do vyhledávače, a pokud tento termín / název nebude existovat, tak nám vyhledávač nabídne jen červený text, na který když ťukneme, tak začneme vytvářet zmíněnou stránku.

    Mediawiki - tvorba

    Vpravo můžeme vidět dvě možnosti editace."Editovat", což je VisualEditor a pak "Editovat zdroj", což je editace stránky přímým zadáváním wiki syntaxe.

    Mediawiki - tvorba

    Dokud stránku neuložíme, tak se obsah ani stránka taktéž neuloží. Tj. nedělá se nějaké průběžné ukládání na pozadí během editace.


    Pravidla tvorby obsahu

    Stránku naplníme daty. Formátování si nevymýšlíme (neplácáme nikde vlastní mezery, odsazení, neděláme milion apostrofů všude možně apod.). Veškeré formátování je dáno rozhraním a měli bychom se jej držet. Je to důležité z několika věcí :

    Výsledný příklad (vlevo můžete vidět automaticky generovaný "Obsah" na základě nadpisů):

    Mediawiki  - tvorba obsahu


    Rozšíření

    Instalace rozšíření je jednoduchá. Jen upozorním na obezřetnost, tj. neinstaluji hlouposti, které nepotřebuji a mají vysokou pravděpodobnost, že nebudou udržovány. Rozšíření se instalují tak, že obsah rozšíření rozbalím do "/var/www/mediawiki/extensions", povolím rozšíření v konfiguraci wikiny a zavoláme update. Každé rozšíření má na svém webu popis, jak jej aktivovat + případně, jak jej nastavit (pokud vyžaduje / umožňuje dodatečná nastavení). Příklad instalace rozšíření, které později použijeme pro tvorbu šablon. Konkrétně tedy Extension:TemplateStyles. Vždy stahujeme verzi určenou pro naší verzi wikiny. V opačném případě může nastat nějaký problém.

    # vstoupíme do adresáře s rozšířeními
    cd /var/www/mediawiki/extensions
    
    # stáhneme
    wget -c https://extdist.wmflabs.org/dist/extensions/TemplateStyles-REL1_39-f09fb72.tar.gz
    
    # rozbalíme
    tar xvf TemplateStyles-REL1_39-f09fb72.tar.gz
    
    # fix práv
    chown -R root:root TemplateStyles
    
    # aktivujeme rozšíření
    nano /var/www/mediawiki/LocalSettings.php
    ...
    wfLoadExtension( 'TemplateStyles' );
    
    # provedeme update
    cd /var/www/mediawiki/maintenance/
    php update.php
    

    Další rozšíření, která se nám v budoucnu hodí, jsou již součástí Mediawikii. Konkrétně to jsou tyto:

    cd /var/www/mediawiki/extensions
    ...
    wfLoadExtension( 'SyntaxHighlight_GeSHi' );
    wfLoadExtension( 'TemplateData' );
    wfLoadExtension( 'Scribunto' );
    wfLoadExtension( 'ParserFunctions' );
    
    # provedeme update
    cd /var/www/mediawiki/maintenance/
    php update.php
    

    Přehled a verze Mediawiki a rozšíření a dalších věcí můžete vidět v sekci "Speciální:Verze", viz:

    Mediawiki - seznam rozšíření


    Tvorba šablon

    Šablony jsou jen další stránky v Mediawiki, nic víc. Všechny šablony jsou ukryty pod odkazem "....index.php/Šablona:NázevŠablony". Jak vidíte, pokud máme Mediawiki v češtině, tak jsou i odkazy v češtině. Pokud bychom měli anglickou lokalizaci jako výchozí, bude url "....index.php/Template:NázevŠablony". Oficiální dokumentace viz: Help:Templates


    1) Šablona:Barva

    Začneme malými příklady. Chceme mít např. šablonu "Barva", která nám bude obarvovat text. Vytvoříme jí tedy zadáním url: "https://wiki.devaine.cz/index.php/Šablona:Barva" a následně dáme "Založit zdroj" a vložíme kód naší šablony:

    <span style="color:{{{1|red}}}">{{{2}}}</span><noinclude>
    {{Dokumentace}}
    <templatedata>
    {
    	"params": {
    		"1": {
    			"aliases": [
    				"barva"
    			],
    			"example": "#DCDCDC",
    			"required": true
    		},
    		"2": {
    			"aliases": [
    				"Text"
    			],
    			"example": "Text",
    			"required": true
    		}
    	}
    }
    </templatedata>
    </noinclude>
    

    Mediawiki - Šablona Barva

    Poté stránku uložíme:

    Mediawiki - Šablona Barva

    A šablonu si pak můžeme vyzkoušet

    Takto pomocí wikieditoru:

    {{Barva|red|Obarvený textíček}}
    

    Nebo takto pomocí VisualEditoru (Vložit -> Šablona -> Barva):

    Media wiki - Šablona Barva

    Výsledek pak bude vypadat takto:

    Mediawiki - Šablona Barva


    2) Šablona:Zvýrazňovač

    Podobně jako barva si můžeme vytvořit šablonu na zvýraznění pozadí textu "https://wiki.devaine.cz/index.php/Šablona:Zvýrazňovač":

    <span style="background-color:{{{1|red}}}">{{{2}}}</span><noinclude>
    {{Dokumentace}}
    <templatedata>
    {
    	"params": {
    		"1": {
    			"aliases": [
    				"Zvýrazňovač"
    			],
    			"example": "#DCDCDC",
    			"required": true
    		},
    		"2": {
    			"aliases": [
    				"Text"
    			],
    			"example": "Text",
    			"required": true
    		}
    	}
    }
    </templatedata>
    </noinclude>
    

    Syntaxe je pak podobná jako u barvy, tj. dva parametry, prvním je barva pozadí, druhým je text:

    {{Zvýrazňovač|Green|Příklad texty}}
    

    3) Šablona:Key press

    Jdeme na něco složitějšího. Chceme rozšíření, které nám bude zobrazovat klávesové zkratky jako obrázky kláves. Toto je oficiální šablona. Pokud nějakou šablonu najdeme na webu Mediawiki, můžeme si jí jednoduše zkopírovat. Oficiální dokumentace šablony včetně kódu je na: Template:Key_press. Vpravo nahoře můžete vidět, že stránka vyžaduje rozšíření "TemplateStyles" (již jsme si ho nainstalovali a aktivovali výše), protože se využívá externí css soubor. Šablonu zkopírujeme následovně:

    Nejdříve si přeneseme hlavní šablonu, tj. ťukneme si na zdroj oficiálního template
    Template:Key_press&action=edit
    a obsah přeneseme do naší wiki do stejné url
    "https://wiki.devaine.cz/index.php/Šablona:Key_press"

    <templatestyles src="Key press/styles.css"/>{{key press/core|{{{1|}}}}}<!--
    -->{{#if:{{{2|}}}|{{{chain first|{{{chain|+}}}}}}{{key press/core|{{{2}}}}}}}<!--
    -->{{#if:{{{3|}}}|{{{chain second|{{{chain|+}}}}}}{{key press/core|{{{3}}}}}}}<!--
    -->{{#if:{{{4|}}}|{{{chain third|{{{chain|+}}}}}}{{key press/core|{{{4}}}}}}}<!--
    -->{{#if:{{{5|}}}|{{{chain fourth|{{{chain|+}}}}}}{{key press/core|{{{5}}}}}}}<!--
    -->{{#if:{{{6|}}}|{{{chain fifth|{{{chain|+}}}}}}{{key press/core|{{{6}}}}}}}<!--
    -->{{#if:{{{7|}}}|{{{chain sixth|{{{chain|+}}}}}}{{key press/core|{{{7}}}}}}}<!--
    -->{{#if:{{{8|}}}|{{{chain seventh|{{{chain|+}}}}}}{{key press/core|{{{8}}}}}}}<!--
    -->{{#if:{{{9|}}}|{{{chain eighth|{{{chain|+}}}}}}{{key press/core|{{{9}}}}}}}<!--
    -->{{#if:{{{10|}}}|{{{chain ninth|{{{chain|+}}}}}}{{key press/core|{{{10}}}}}}}<!--
    -->{{#if:{{{11|}}}|[[Category:Wikipedia keypress template parameter needs fixing]]}}<noinclude>
    {{documentation}}
    <!-- add category and language links to the /doc sub-page, not here -->
    </noinclude>
    

    Následně přeneseme stejným způsobem chybějící css styl, tj. ťukneme na odkaz Template:Key_press/styles.css, stejnou url si vytvoříme v naší wikině, tj. "https://wiki.devaine.cz/index.php/Šablona:Key_press/styles.css" a copy-paste překopírujeme obsah css stylu:

    .keyboard-key {
    	border: 1px solid #aaa;
    	border-radius: 0.2em;
    	box-shadow: 0.1em 0.2em 0.2em #ddd;
    	background-image: linear-gradient(to bottom, #eee, #f9f9f9, #eee);
    	padding: 0.1em 0.3em;
    	font-family: inherit;
    	font-size: 0.85em;
    }
    

    Můžeme si všimnout, že pro toto rozšíření je potřeba ještě "Šablona:Key press/core", takže tu také zkopírujeme z url: Template:Key_press/core k nám do wiki do "https://wiki.devaine.cz/index.php/Šablona:Key_press/core"

    <kbd class="keyboard-key nowrap">{{#switch:{{lc:{{{1}}}}}
    | caps lock           = ⇪ Caps Lock
    | [[caps lock]]       = ⇪ [[Caps Lock]]
    | shift               = ⇧ Shift
    | [[shift key|shift]] = ⇧ [[Shift key|Shift]]
    | enter               = ↵ Enter
    | [[enter key|enter]] = ↵ [[Enter key|Enter]]
    | cmd                 = ⌘ Cmd
    | [[cmd key|cmd]]
    | [[command key|cmd]] = ⌘ [[Command key|Cmd]]
    | command             = ⌘ Command
    | [[cmd key|command]]
    | [[command key|command]] = |⌘ [[Command key|Command]]
    | opt                 = ⌥ Opt
    | [[opt key|opt]]
    | [[option key|opt]]  = ⌥ [[Option key|Opt]]
    | option              = ⌥ Option
    | [[option key]]
    | [[opt key|option]]
    | [[option key|option]] = ⌥ [[Option key|Option]]
    | tab                 = Tab ↹
    | [[tab key|tab]]     = [[Tab key|Tab]] ↹
    | backspace           = ← Backspace
    | [[backspace]]       = ← [[Backspace]]
    | win                 = ⊞ Win
    | [[win key|win]]
    | [[windows key|win]] = ⊞ [[Windows key|Win]]
    | menu                = ≣ Menu
    | [[menu key|menu]]   = ≣ [[Menu key|Menu]]
    | up                  = ↑
    | [[arrow keys|up]]   = [[Arrow keys|↑]]
    | down                = ↓
    | [[arrow keys|down]] = [[Arrow keys|↓]]
    | left                = ←
    | [[arrow keys|left]] = [[Arrow keys|←]]
    | right               = →
    | [[arrow keys|right]] = [[Arrow keys|→]]
    | *
    | asterisk            = <nowiki>*</nowiki>
    | #
    | hash                = <nowiki>#</nowiki>
    | [[#]]               = [[Number sign|#]]
    | :
    | colon               = <nowiki>:</nowiki>
    | [[:]]               = [[Colon (punctuation)|:]]
    | pipe                = <nowiki>|</nowiki>
    | [[|]]               = [[Pipe symbol|<nowiki>|</nowiki>]]
    | ;
    | semicolon           = <nowiki>;</nowiki>
    | [[;]]               = [[Semi-colon|<nowiki>;</nowiki>]]
    | equals              = <nowiki>=</nowiki>
    
    <!-- Left & right analog sticks -->
    | l-up
    | l up     = L↑
    | l-down
    | l down   = L↓
    | l-left
    | l left   = L←
    | l-right
    | l right  = L→
    | l-ne
    | l ne     = L↗
    | l-se
    | l se     = L↘
    | l-nw
    | l nw     = L↖
    | l-sw
    | l sw     = L↙
    
    | r-up
    | r up     = R↑
    | r-down
    | r down   = R↓
    | r-left
    | r left   = R←
    | r-right
    | r right  = R→
    | r-ne
    | r ne     = R↗
    | r-se
    | r se     = R↘
    | r-nw
    | r nw     = R↖
    | r-sw
    | r sw     = R↙
    
    <!-- PlayStation -->
    | ps x
    | ex       = ×
    | ps c
    | circle   = ○
    | ps s
    | square   = □
    | ps t
    | triangle = △
    
    <!-- Nintendo 64 & GameCube -->
    | c-up
    | c up     = C↑
    | c-down
    | c down   = C↓
    | c-left
    | c left   = C←
    | c-right
    | c right  = C→
    | c-ne
    | c ne     = C↗
    | c-se
    | c se     = C↘
    | c-nw
    | c nw     = C↖
    | c-sw
    | c sw     = C↙
    
    <!-- default -->
    | #default            = {{{1}}}
    }}</kbd><noinclude>
    {{documentation|content=
    
    See {{ll|Template:Key press}}
    
    }}
    </noinclude>
    

    Nyní už by měla šablona fungovat. Zkusíme tedy oblíbený ctrl + alt + del. Syntaxe tedy:

    {{key press|Ctrl|Alt|Del}}
    

    Přes VisualEditor pak takto

    MediaWiki - Šablona Key press

    Výsledek je pak:

    Mediawiki - key press


    4) Šablona:Button

    Další zajímavou šablonou může být Button. Oficiální stránka: Template:Button tj. my si vytvoříme: "https://wiki.devaine.cz/index.php/Šablona:Button"

    <!--
    --><span class="nowrap" title="This is not a clickable button; it illustrates the button one should find." style="padding:{{{padTB|.2em}}} {{{padLR|.6em}}}; border:1px solid; border-color:#AAA #555 #555 #AAA; border-radius: 3px; background-color: {{{bgcolor|#F2F2F2}}}; background-image: linear-gradient(to bottom, #FCFCFC, #E0E0E0); {{#ifeq:{{{format|}}}|bold|font-weight: bold;}} {{{style|}}}">{{{text|{{{1|Hello, World!}}}}}}</span><!--
    --><noinclude>
    {{documentation}}
    </noinclude>
    

    Syntaxe je pak:

    {{Button|Text tlačítka}}
    

    Ve VisualEditoru pak takto:

    Mediawiki - rozšíření Button


    5) Šablona:Clickable_button_2

    Opět trochu přiostříme. V Mediawiki lze psát moduly v Lua a ty pak volat. K tomu slouží rozšíření Scribunto, které je součástí wikiny, a které jsme si výše už povolili. Oficiální stránky této šablony jsou: Template:Clickable_button_2.

    Abychom tuto šablonu rozfungovali, musíme si vytvořit moduly Yesno, Arguments a Clickable_button_2, který pak budeme volat v šabloně Clickable button 2. Moduly jsou, podobně jako šablony a jiné věci, prosté stránky. Tj. moduly opět vytvoříme přes url. Jdeme na to.

    Module:Yesno
    https://wiki.devaine.cz/index.php/Modul:Yesno

    -- Function allowing for consistent treatment of boolean-like wikitext input.
    -- It works similarly to the template {{yesno}}.
    
    return function (val, default)
    	-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
    	-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
    	-- following line.
    	val = type(val) == 'string' and val:lower() or val
    	if val == nil then
    		return nil
    	elseif val == true 
    		or val == 'yes'
    		or val == 'y'
    		or val == 'true'
    		or val == 't'
    		or val == 'on'
    		or tonumber(val) == 1
    	then
    		return true
    	elseif val == false
    		or val == 'no'
    		or val == 'n'
    		or val == 'false'
    		or val == 'f'
    		or val == 'off'
    		or tonumber(val) == 0
    	then
    		return false
    	else
    		return default
    	end
    end
    

    Module:Arguments
    https://wiki.devaine.cz/index.php/Modul:Arguments

    -- This module provides easy processing of arguments passed to Scribunto from
    -- #invoke. It is intended for use by other Lua modules, and should not be
    -- called from #invoke directly.
    
    local libraryUtil = require('libraryUtil')
    local checkType = libraryUtil.checkType
    
    local arguments = {}
    
    -- Generate four different tidyVal functions, so that we don't have to check the
    -- options every time we call it.
    
    local function tidyValDefault(key, val)
    	if type(val) == 'string' then
    		val = val:match('^%s*(.-)%s*$')
    		if val == '' then
    			return nil
    		else
    			return val
    		end
    	else
    		return val
    	end
    end
    
    local function tidyValTrimOnly(key, val)
    	if type(val) == 'string' then
    		return val:match('^%s*(.-)%s*$')
    	else
    		return val
    	end
    end
    
    local function tidyValRemoveBlanksOnly(key, val)
    	if type(val) == 'string' then
    		if val:find('%S') then
    			return val
    		else
    			return nil
    		end
    	else
    		return val
    	end
    end
    
    local function tidyValNoChange(key, val)
    	return val
    end
    
    local function matchesTitle(given, title)
    	local tp = type( given )
    	return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
    end
    
    local translate_mt = { __index = function(t, k) return k end }
    
    function arguments.getArgs(frame, options)
    	checkType('getArgs', 1, frame, 'table', true)
    	checkType('getArgs', 2, options, 'table', true)
    	frame = frame or {}
    	options = options or {}
    
    	--[[
    	-- Set up argument translation.
    	--]]
    	options.translate = options.translate or {}
    	if getmetatable(options.translate) == nil then
    		setmetatable(options.translate, translate_mt)
    	end
    	if options.backtranslate == nil then
    		options.backtranslate = {}
    		for k,v in pairs(options.translate) do
    			options.backtranslate[v] = k
    		end
    	end
    	if options.backtranslate and getmetatable(options.backtranslate) == nil then
    		setmetatable(options.backtranslate, {
    			__index = function(t, k)
    				if options.translate[k] ~= k then
    					return nil
    				else
    					return k
    				end
    			end
    		})
    	end
    
    	--[[
    	-- Get the argument tables. If we were passed a valid frame object, get the
    	-- frame arguments (fargs) and the parent frame arguments (pargs), depending
    	-- on the options set and on the parent frame's availability. If we weren't
    	-- passed a valid frame object, we are being called from another Lua module
    	-- or from the debug console, so assume that we were passed a table of args
    	-- directly, and assign it to a new variable (luaArgs).
    	--]]
    	local fargs, pargs, luaArgs
    	if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
    		if options.wrappers then
    			--[[
    			-- The wrappers option makes Module:Arguments look up arguments in
    			-- either the frame argument table or the parent argument table, but
    			-- not both. This means that users can use either the #invoke syntax
    			-- or a wrapper template without the loss of performance associated
    			-- with looking arguments up in both the frame and the parent frame.
    			-- Module:Arguments will look up arguments in the parent frame
    			-- if it finds the parent frame's title in options.wrapper;
    			-- otherwise it will look up arguments in the frame object passed
    			-- to getArgs.
    			--]]
    			local parent = frame:getParent()
    			if not parent then
    				fargs = frame.args
    			else
    				local title = parent:getTitle():gsub('/sandbox$', '')
    				local found = false
    				if matchesTitle(options.wrappers, title) then
    					found = true
    				elseif type(options.wrappers) == 'table' then
    					for _,v in pairs(options.wrappers) do
    						if matchesTitle(v, title) then
    							found = true
    							break
    						end
    					end
    				end
    
    				-- We test for false specifically here so that nil (the default) acts like true.
    				if found or options.frameOnly == false then
    					pargs = parent.args
    				end
    				if not found or options.parentOnly == false then
    					fargs = frame.args
    				end
    			end
    		else
    			-- options.wrapper isn't set, so check the other options.
    			if not options.parentOnly then
    				fargs = frame.args
    			end
    			if not options.frameOnly then
    				local parent = frame:getParent()
    				pargs = parent and parent.args or nil
    			end
    		end
    		if options.parentFirst then
    			fargs, pargs = pargs, fargs
    		end
    	else
    		luaArgs = frame
    	end
    
    	-- Set the order of precedence of the argument tables. If the variables are
    	-- nil, nothing will be added to the table, which is how we avoid clashes
    	-- between the frame/parent args and the Lua args.
    	local argTables = {fargs}
    	argTables[#argTables + 1] = pargs
    	argTables[#argTables + 1] = luaArgs
    
    	--[[
    	-- Generate the tidyVal function. If it has been specified by the user, we
    	-- use that; if not, we choose one of four functions depending on the
    	-- options chosen. This is so that we don't have to call the options table
    	-- every time the function is called.
    	--]]
    	local tidyVal = options.valueFunc
    	if tidyVal then
    		if type(tidyVal) ~= 'function' then
    			error(
    				"bad value assigned to option 'valueFunc'"
    					.. '(function expected, got '
    					.. type(tidyVal)
    					.. ')',
    				2
    			)
    		end
    	elseif options.trim ~= false then
    		if options.removeBlanks ~= false then
    			tidyVal = tidyValDefault
    		else
    			tidyVal = tidyValTrimOnly
    		end
    	else
    		if options.removeBlanks ~= false then
    			tidyVal = tidyValRemoveBlanksOnly
    		else
    			tidyVal = tidyValNoChange
    		end
    	end
    
    	--[[
    	-- Set up the args, metaArgs and nilArgs tables. args will be the one
    	-- accessed from functions, and metaArgs will hold the actual arguments. Nil
    	-- arguments are memoized in nilArgs, and the metatable connects all of them
    	-- together.
    	--]]
    	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
    	setmetatable(args, metatable)
    
    	local function mergeArgs(tables)
    		--[[
    		-- Accepts multiple tables as input and merges their keys and values
    		-- into one table. If a value is already present it is not overwritten;
    		-- tables listed earlier have precedence. We are also memoizing nil
    		-- values, which can be overwritten if they are 's' (soft).
    		--]]
    		for _, t in ipairs(tables) do
    			for key, val in pairs(t) do
    				if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
    					local tidiedVal = tidyVal(key, val)
    					if tidiedVal == nil then
    						nilArgs[key] = 's'
    					else
    						metaArgs[key] = tidiedVal
    					end
    				end
    			end
    		end
    	end
    
    	--[[
    	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
    	-- and are only fetched from the argument tables once. Fetching arguments
    	-- from the argument tables is the most resource-intensive step in this
    	-- module, so we try and avoid it where possible. For this reason, nil
    	-- arguments are also memoized, in the nilArgs table. Also, we keep a record
    	-- in the metatable of when pairs and ipairs have been called, so we do not
    	-- run pairs and ipairs on the argument tables more than once. We also do
    	-- not run ipairs on fargs and pargs if pairs has already been run, as all
    	-- the arguments will already have been copied over.
    	--]]
    
    	metatable.__index = function (t, key)
    		--[[
    		-- Fetches an argument when the args table is indexed. First we check
    		-- to see if the value is memoized, and if not we try and fetch it from
    		-- the argument tables. When we check memoization, we need to check
    		-- metaArgs before nilArgs, as both can be non-nil at the same time.
    		-- If the argument is not present in metaArgs, we also check whether
    		-- pairs has been run yet. If pairs has already been run, we return nil.
    		-- This is because all the arguments will have already been copied into
    		-- metaArgs by the mergeArgs function, meaning that any other arguments
    		-- must be nil.
    		--]]
    		if type(key) == 'string' then
    			key = options.translate[key]
    		end
    		local val = metaArgs[key]
    		if val ~= nil then
    			return val
    		elseif metatable.donePairs or nilArgs[key] then
    			return nil
    		end
    		for _, argTable in ipairs(argTables) do
    			local argTableVal = tidyVal(key, argTable[key])
    			if argTableVal ~= nil then
    				metaArgs[key] = argTableVal
    				return argTableVal
    			end
    		end
    		nilArgs[key] = 'h'
    		return nil
    	end
    
    	metatable.__newindex = function (t, key, val)
    		-- This function is called when a module tries to add a new value to the
    		-- args table, or tries to change an existing value.
    		if type(key) == 'string' then
    			key = options.translate[key]
    		end
    		if options.readOnly then
    			error(
    				'could not write to argument table key "'
    					.. tostring(key)
    					.. '"; the table is read-only',
    				2
    			)
    		elseif options.noOverwrite and args[key] ~= nil then
    			error(
    				'could not write to argument table key "'
    					.. tostring(key)
    					.. '"; overwriting existing arguments is not permitted',
    				2
    			)
    		elseif val == nil then
    			--[[
    			-- If the argument is to be overwritten with nil, we need to erase
    			-- the value in metaArgs, so that __index, __pairs and __ipairs do
    			-- not use a previous existing value, if present; and we also need
    			-- to memoize the nil in nilArgs, so that the value isn't looked
    			-- up in the argument tables if it is accessed again.
    			--]]
    			metaArgs[key] = nil
    			nilArgs[key] = 'h'
    		else
    			metaArgs[key] = val
    		end
    	end
    
    	local function translatenext(invariant)
    		local k, v = next(invariant.t, invariant.k)
    		invariant.k = k
    		if k == nil then
    			return nil
    		elseif type(k) ~= 'string' or not options.backtranslate then
    			return k, v
    		else
    			local backtranslate = options.backtranslate[k]
    			if backtranslate == nil then
    				-- Skip this one. This is a tail call, so this won't cause stack overflow
    				return translatenext(invariant)
    			else
    				return backtranslate, v
    			end
    		end
    	end
    
    	metatable.__pairs = function ()
    		-- Called when pairs is run on the args table.
    		if not metatable.donePairs then
    			mergeArgs(argTables)
    			metatable.donePairs = true
    		end
    		return translatenext, { t = metaArgs }
    	end
    
    	local function inext(t, i)
    		-- This uses our __index metamethod
    		local v = t[i + 1]
    		if v ~= nil then
    			return i + 1, v
    		end
    	end
    
    	metatable.__ipairs = function (t)
    		-- Called when ipairs is run on the args table.
    		return inext, t, 0
    	end
    
    	return args
    end
    
    return arguments
    

    Module:Clickable_button_2
    https://wiki.devaine.cz/index.php/Modul:Clickable_button_2

    -- This module implements {{clickable button 2}}.
    
    local yesno = require('Module:Yesno')
    
    local p = {}
    
    function p.main(frame)
    	local args = require('Module:Arguments').getArgs(frame, {
    		wrappers = 'Template:Clickable button 2'
    	})
    	return p.luaMain(args)
    end
    
    function p.luaMain(args)
    	if not args[1] and not args.url then
    		return ''
    	end
    	local data = p.makeLinkData(args)
    	local link = p.renderLink(data)
    	local trackingCategories = p.renderTrackingCategories(args)
    	return link .. trackingCategories
    end
    
    function p.makeLinkData(args)
    	local data = {}
    
    	-- Get the link and display values, and find whether we are outputting a
    	-- wikilink or a URL.
    	if args.url then
    		data.isUrl = true
    		data.link = args.url
    		if args[1] then
    			data.display = args[1]
    		else
    			data.display = args.url
    		end
    	else
    		data.isUrl = false
    		data.link = args[1]
    		if args[2] then
    			data.display = args[2]
    		else
    			data.display = args[1]
    		end
    	end
    
    	-- Classes
    	local class = args.class and args.class:lower()
    	data.classes = {}
    	if class == 'ui-button-green'
    		or class == 'ui-button-blue'
    		or class == 'ui-button-red'
    	then
    		table.insert(
    			data.classes,
    			'submit ui-button ui-widget ui-state-default ui-corner-all'
    				.. ' ui-button-text-only ui-button-text'
    		)
    	else
    		table.insert(data.classes, 'mw-ui-button')
    	end
    	if class then
    		table.insert(data.classes, class)
    	end
    
    	-- Styles
    	do
    		--[[
    		-- Check whether we are on the same page as we have specified in
    		-- args[1], but not if we are using a URL link, as then args[1] is only
    		-- a display value. If we are currently on the page specified in
    		-- args[1] make the button colour darker so that it stands out from
    		-- other buttons on the page.
    		--]]
    		local success, linkTitle, currentTitle
    		if not data.isUrl then
    			currentTitle = mw.title.getCurrentTitle()
    			success, linkTitle = pcall(mw.title.new, args[1])
    		end
    		if success
    			and linkTitle
    			and mw.title.equals(currentTitle, linkTitle)
    		then
    			if class == 'ui-button-blue'
    				or class == 'mw-ui-progressive'
    				or class == 'mw-ui-constructive'
    			then
    				data.backgroundColor = '#2962CB'
    			elseif class == 'ui-button-green' then
    				data.backgroundColor = '#008B6D'
    			elseif class == 'ui-button-red' or class == 'mw-ui-destructive' then
    				data.backgroundColor = '#A6170F'
    			else
    				data.backgroundColor = '#CCC'
    				data.color = '#666'
    			end
    		end
    		-- Add user-specified styles.
    		data.style = args.style
    	end
    
    	return data
    end
    
    function p.renderLink(data)
    	-- Render the display span tag.
    	local display
    	do
    		local displaySpan = mw.html.create('span')
    		for i, class in ipairs(data.classes or {}) do
    			displaySpan:addClass(class)
    		end
    		displaySpan
    			:attr('role', 'button')
    			:attr('aria-disabled', 'false')
    			:css{
    				['background-color'] = data.backgroundColor,
    				color = data.color
    			}
    		if data.style then
    			displaySpan:cssText(data.style)
    		end
    		displaySpan:wikitext(data.display)
    		display = tostring(displaySpan)
    	end
    
    	-- Render the link
    	local link 
    	if data.isUrl then
    		link = string.format('[%s %s]', data.link, display)
    	else
    		link = string.format('[[%s|%s]]', data.link, display)
    	end
    
    	return string.format('<span class="plainlinks">%s</span>', link)
    end
    
    function p.renderTrackingCategories(args)
    	if yesno(args.category) == false then
    		return ''
    	end
    	local class = args.class and args.class:lower()
    	if class == 'ui-button-green'
    		or class == 'ui-button-blue'
    		or class == 'ui-button-red'
    	then
    		return '[[Category:Pages using old style ui-button-color]]'
    	else
    		return ''
    	end
    end
    
    return p
    

    Template:Clickable_button_2
    https://wiki.devaine.cz/index.php/Šablona:Clickable button 2

    {{#invoke:Clickable button 2|main}}<noinclude>
    {{documentation}}
    <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
    </noinclude>
    

    Otestovat pak můžeme takto. Syntaxe:

    # interní url
    {{Clickable button 2|Main Page}}
    
    # externí někam ven
    {{Clickable button 2|Main Page|url=http://en.wikipedia.org}}
    

    Visual editor

    Mediawiki clicabble button


    Ukázka šablon

    Zde můžete vidět, jak všech pět šablon vypadá:

    Mediawiki - Šablony


    Závěr

    Dnes jsme si tedy ukázali základní pravidla pro práci ve wikině. Dále jsme si ukázali, jak jednoduše vytvářet šablony, jak je kopírovat z jiných wikin, že lze mít jako další stránku i vlastní css styl, nebo jak fungují moduly psané v Lua. Vše je opis z mé interní dokumentace a postupy jsem otestoval v testovací VM, tak snad není nikde technická chyba.

    Zdar Max


    Předchozí článek: Mediawiki: (1) Instalace a start        

    Hodnocení: 100 %

            špatnédobré        

    Anketa

    Přijde vám Mediawiki složitá na plnění obsahu? Tj. z uživatelského hlediska?
     (50 %)
     (36 %)
     (14 %)
    Celkem 14 hlasů

    Anketa

    Přijde vám Mediawiki složitá / těžká na správu?
     (75 %)
     (13 %)
     (13 %)
    Celkem 8 hlasů

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    22.11. 07:30 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Dokud tady odbornou recenzi tohto blogu neudela Kapica tak vam doporucuji s timhle navodem pockat, protoze velmistr vesmiru tam jiste najde 256 chyb.
    22.11. 07:54 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Velmistr vesmíru nepoužívá Scribunto, TemplateData ani Visual Editor. A teď jenom zvědavě čeká až zdejší krysy vylezou z děr.
    22.11. 11:21 ʇuɐʍ
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    a jejda alfa hlodavec vylezl, tak co, manie v plnem proudu a jdes spilat anonymum ?
    22.11. 14:54 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Proč bych to dělal? Na ztrapňování si vystačíte sami.
    22.11. 10:29 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    {Template:Pleš|Furstrát lvl:256|Testosterone level:0}
    22.11. 18:49 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    A jeho oblíbená fráze je miliony musí zemřít
    22.11. 19:17 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Trotlů jako ty? Miliardy musí zemřít..
    22.11. 19:26 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Triliardy.
    AraxoN avatar 22.11. 07:36 AraxoN | skóre: 46 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Otázka... keď chcem v parametri šablóny použiť znak rúry "|", ako ho escapovať? Vo svojej Mediawiki mám šablónu na odlíšenie konzolových príkazov a práve tam by sa pajpa hodila. Napríklad tento príkaz som tam nedokázal vložiť:
    gcc -march=native -E -v - </dev/null 2>&1 | grep cc1 | grep -o -P "(?<=march=)[^ ]+"
    Keď použijem šablónu, tak zobrazí len "grep cc1", zbytok pred tým aj za tým šablóna zahodí:
    {{Command|1 = gcc -march=native -E -v - </dev/null 2>&1 | grep cc1 | grep -o -P "(?<=march=)[^ ]+"}}
    Ako tam dostať tú rúru?
    22.11. 07:56 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Obejít se to dá přes šablonu. Obvykle se používá šablona vykřičník.
    AraxoN avatar 22.11. 13:14 AraxoN | skóre: 46 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Ha! Máš pravdu! Toto funguje:
    {{Command|1 = gcc -march=native -E -v - </dev/null 2>&1 {{!}} grep cc1 {{!}} grep -o -P "(?<=march=)[^ ]+"}}
    22.11. 07:58 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Ovšem pokud je tvým cílem vložení ukázkového kódu na stránku, jdeš na to špatně. Podívej se na stránkách MediaWiki.org jak se to dělá.
    22.11. 12:18 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Nejlépe se na to vyser, je to pro tebe moc složitý.
    Max avatar 22.11. 12:20 Max | skóre: 71 | blog: Max_Devaine
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Docela ubohý, vydávat se za jiný lidi ;-).
    Zdar Max
    Měl jsem sen ... :(
    22.11. 14:40 ~
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Mozna jen paroduje sam sebe, u takovych individui je to bezne.
    22.11. 14:50 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Nejsou všichni psychopati jako ty.
    22.11. 18:48 MediaFiki
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Ano to je dalsi priznak tve poruchy - mit posledni slovo.
    22.11. 18:58 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Poslední slovo musíš mít ty.
    22.11. 19:18 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Jaké slovo?
    23.11. 13:32
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    skrytý komentář Náš administrátor shledal tento komentář závadným.

    Prosím konstruktivněji

    Zobrazit komentář
    23.11. 16:21
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    skrytý komentář Náš administrátor shledal tento komentář závadným.

    Prosím konstruktivněji

    Zobrazit komentář
    22.11. 13:07 debian+ | skóre: 32 | blog: analyzy
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Použi rozšírenie Extension:SyntaxHighlight.
    debian.plus@protonmail.com
    22.11. 15:20 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Posrávám se.
    22.11. 17:38 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Pořiď si pleny.
    22.11. 17:41 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Neumím je zapnout, asi jsem si tu VŠ měl udělat a nebýt za posranou IT lopatu :-(
    23.11. 17:35 _
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    lidi jako Max, Jenda a Want stojí za úpadkem ábíčka
    vencour avatar 23.11. 19:46 vencour | skóre: 56 | blog: Tady je Vencourovo | Praha+západní Čechy
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    lidi jako Max, Jenda a Want stojí za úpadkem ábíčka

    Ostatní odešli, neměli co psát a toto je následek? Zapomněli vše, co uměli a věděli, i své jméno?
    Ty nejhlubší objevy nečekají nutně za příští hvězdou. Jsou uvnitř nás utkány do vláken, která nás spojují, nás všechny.
    23.11. 21:55 hm
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    A nemuze za to tak cirou nahodou upadek linuxu?
    23.11. 23:38 _
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Za úpadkem tohoto portálu stojí v prvé řadě nezájem jeho vlastníků ty kokote.
    24.11. 13:52 _
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Myslim, ze pokud by zminene toxicke osoby dostaly permaban, zase to tu rozkvete.
    24.11. 14:06 ~
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Blbost, nejspis nekdo ani nevi ze to vlastni a Hagara se radeji nepripomina aby ho nezrusili :-) Kdyby to nekdo vlastnil tak je tady bambilion reklam, prevazne nijak nesouvisejicich s IT, idealne sracky od google-ad. Takto to vsem vyhovuje:
    • Jede to tak nejak zadarmo nacerno nekde v zapomenutem racku na RaspberyPI.
    • Hagara si masti ego, ze prospiva komunite a pastuje tu zpravicky na 90% primo nesouvisejicich s linuxem.
    • Ruzovy ponik to ma jako terapii, ze ho nevzali za policajta tak tady uklizi projevy svobody.
    • Maniodepresvni jedinci s cetnymi poruchama osobnosti tady z casu na cas oslavi svoji manio fazi nicneprinasejicim grafomanskym pocinem.
    • Mezi tema podivinama sem tam zableskne neco pouzitelneho od idealistu typu Max, jenze ten se dozivotne nezbavi boomerskych zlozvyku typu reverz proxy.
    • No a pak jsme tu my trolove co se sem chodime jen bavit, protoze neni lepsi substrat na flamewary nez cesky freetard.
    24.11. 14:09 _
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Max neni zadny idealista ale normalni proruskej srac a bolsevik. A navic neschopna lopata.
    24.11. 14:13 Termix
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    IT je uz hodnou dobu poctivy remeslo, nemusis vse chpat a vymyslet, staci ze ti to jde s lopatou, takze to bych neresil.
    Max avatar 24.11. 14:22 Max | skóre: 71 | blog: Max_Devaine
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Mohu se zeptat, čím jsem se provinil, že jsem se stal terčem tvých urážek a snahou mně dehonestovat?
    Zdar Max
    Měl jsem sen ... :(
    24.11. 14:32 ~
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Neres. My trolove se delime na umelce a kokoty. Narazil si na toho druheho, nekrm ho a mavni rukou.
    24.11. 16:59 freshmouse
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Podporou Putina a systemd, blbe
    Max avatar 24.11. 18:45 Max | skóre: 71 | blog: Max_Devaine
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Absolutně nechápu, kde jsi to s tím Putinem vzal. Přestaň si prosím tě vymýšlet.
    Zdar Max
    PS: Ano, se systemd umím pracovat, to je pravda. Zajímavější ovšem je, že jsem zároveň boomer pro lidi, kteří zamrzli u starého initu a ext4 :D. Pokrytectví se tomu myslím říká... :)
    Měl jsem sen ... :(
    25.11. 07:40 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    A cos čekal? Jsi poslední, kdo tenhle portál drží při životě. Kokoti, co to vědí se raději drží zpátky. Jenže za nimi přitáhly hejna dalších, co si myslí - a právem, že tento web vlastní nějaký masochistický psychopat, který jim tiše drží palce.
    25.11. 10:28 Norma
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Kazdy normalni ajtak ma na stole windows, mac i linux a v plasytationu bsd. Vendor locknout se jenom na linux je psychopatie a proto se tady zdruzuji.
    vencour avatar 25.11. 11:18 vencour | skóre: 56 | blog: Tady je Vencourovo | Praha+západní Čechy
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Chybné tvrzení taky napovídá o kvalitě autora komentáře. Že?
    Takže jo, linux je pořád ještě svoboda
    Ty nejhlubší objevy nečekají nutně za příští hvězdou. Jsou uvnitř nás utkány do vláken, která nás spojují, nás všechny.
    25.11. 12:33 _
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Jo, vy dva jsme tak na stejné úrovni. Asociální psychopati z proruské úderky.
    25.11. 13:00 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Vy/My? Jsme/Jste? Ukliď si bordel v hlavě a třeba ti začne fungovat.
    28.11. 13:35 WantMax
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Jsme
    29.11. 22:05 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Marný pokus. Kde nic není, ani smrt nebere.
    23.11. 20:25 Miriam | blog: RychlovarnaKonvice
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Aleši, tenhle zápisek je zatím nejlepší, díky za něj!
    23.11. 21:53 …§…
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    To ale nepsal Ales :)
    24.11. 09:03 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Pochopitelně, protože to by zdejší frustráti neunesli stávající hodnocení.
    24.11. 14:10 Want
    Rozbalit Rozbalit vše Re: Mediawiki: (2) Základní práce, rozšíření a šablony
    Jake hodnoceni? Chodim tady trolit jiz od zcenzurovani Rootu a nevsim sem si zadneho hodnoceni a ani toho, ze by to nekdo bral vazne. To je asi jen pro registrovane nebo co?

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.