<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3ATutorials</id>
	<title>Modul:Tutorials - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3ATutorials"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Tutorials&amp;action=history"/>
	<updated>2026-05-22T21:07:19Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Tutorials&amp;diff=2929996&amp;oldid=prev</id>
		<title>imported&gt;Martin Kraft am 10. Juni 2018 um 12:25 Uhr</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Tutorials&amp;diff=2929996&amp;oldid=prev"/>
		<updated>2018-06-10T12:25:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- ## Modul:Tutorials is a Lua Libary to manage Wikipedia-Tutorials ##&lt;br /&gt;
-- Please use this module via Vorlage:Tutorials only!&lt;br /&gt;
-- Modul:Tutorials requires a customisable config.json, passed via the parameter config to each function call&lt;br /&gt;
-- The Default is Wikipedia:Tutorial/config.json&lt;br /&gt;
&lt;br /&gt;
-- Helper Functions&lt;br /&gt;
&lt;br /&gt;
-- Local functions and vars&lt;br /&gt;
&lt;br /&gt;
local configData, templateData, rootNode&lt;br /&gt;
local currentTitle, currentNode, refNode, lastNode, nextNode &lt;br /&gt;
local isAllPage&lt;br /&gt;
local currentPageNo = 0&lt;br /&gt;
local totalPageNo = 0&lt;br /&gt;
local isLastNode = false&lt;br /&gt;
local showHidden = false&lt;br /&gt;
local inited = false&lt;br /&gt;
&lt;br /&gt;
function init(configPage)&lt;br /&gt;
    if inited then return end&lt;br /&gt;
    inited = true&lt;br /&gt;
&lt;br /&gt;
    --mw.log(&amp;#039;Lua Init&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    currentTitle = mw.title.getCurrentTitle()       &lt;br /&gt;
    if not configPage then configPage = &amp;#039;Wikipedia:Tutorial/config.json&amp;#039; end&lt;br /&gt;
    configData = mw.text.jsonDecode( mw.title.new(configPage):getContent() )&lt;br /&gt;
&lt;br /&gt;
    rootNode = configData.structure&lt;br /&gt;
    refNode = rootNode&lt;br /&gt;
    templateData = configData.templates&lt;br /&gt;
&lt;br /&gt;
    local previousNode&lt;br /&gt;
    function initNode(node, i, parentNode)&lt;br /&gt;
        node.index = i&lt;br /&gt;
        node.childCount = 0&lt;br /&gt;
        node.title = mw.title.new(node.page)&lt;br /&gt;
        node.isCurrentPage = mw.title.equals( currentTitle, node.title )&lt;br /&gt;
        node.containsCurrentPage = node.isCurrentPage&lt;br /&gt;
        --node.isAllPage = false&lt;br /&gt;
        node.isLastNode = false&lt;br /&gt;
&lt;br /&gt;
        if not node.isCurrentPage and node.all then&lt;br /&gt;
            node.allTitle = mw.title.new(node.all)&lt;br /&gt;
            if mw.title.equals( currentTitle,  node.allTitle ) then &lt;br /&gt;
                node.isCurrentPage = true&lt;br /&gt;
                node.isAllPage = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if previousNode then&lt;br /&gt;
            previousNode.nextNode = node&lt;br /&gt;
            node.lastNode = previousNode&lt;br /&gt;
            --[[ -- Funktioniert noch nicht&lt;br /&gt;
            if previousNode.parent == node.parent or previousNode ~= node.parent  then&lt;br /&gt;
            else&lt;br /&gt;
                previousNode.isLastNode = true&lt;br /&gt;
            end&lt;br /&gt;
            ]]--&lt;br /&gt;
        end&lt;br /&gt;
        previousNode = node&lt;br /&gt;
&lt;br /&gt;
        if node.children then &lt;br /&gt;
            local newChildrenArray = {}&lt;br /&gt;
&lt;br /&gt;
            for childIndex, childNode in pairs( node.children ) do&lt;br /&gt;
&lt;br /&gt;
                initNode(childNode, childIndex, node)&lt;br /&gt;
&lt;br /&gt;
                if childNode.containsCurrentPage then&lt;br /&gt;
                    node.containsCurrentPage = true&lt;br /&gt;
                end&lt;br /&gt;
                if not (childNode.hidden and childNode.containsCurrentPage == false) or showHidden then&lt;br /&gt;
                    node.childCount = node.childCount + 1&lt;br /&gt;
                    newChildrenArray[node.childCount] = childNode&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            node.children = newChildrenArray&lt;br /&gt;
        end        &lt;br /&gt;
&lt;br /&gt;
        node.refNode = node;&lt;br /&gt;
        if parentNode then&lt;br /&gt;
            node.parent = parentNode&lt;br /&gt;
&lt;br /&gt;
            if node.childCount == 0 then&lt;br /&gt;
                node.refNode = node.parent;&lt;br /&gt;
            end&lt;br /&gt;
        end   &lt;br /&gt;
        &lt;br /&gt;
        if node.isCurrentPage then&lt;br /&gt;
            currentNode = node&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if node.refNode == node then&lt;br /&gt;
            node.isRefNode = true&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        return node;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    function prepareNodeHtml(node, i, parentNode)&lt;br /&gt;
        if node.isCurrentPage then&lt;br /&gt;
            node.innerHtml = templateData.threadNaviItemActive&lt;br /&gt;
        else&lt;br /&gt;
            node.innerHtml = templateData.threadNaviItem&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if isAllPage then&lt;br /&gt;
            node.innerHtml = node.innerHtml:gsub(&amp;quot;§§page§§&amp;quot;, &amp;#039;#&amp;#039; .. node.name)&lt;br /&gt;
        else&lt;br /&gt;
            node.innerHtml = node.innerHtml:gsub(&amp;quot;§§page§§&amp;quot;, node.page)&lt;br /&gt;
        end&lt;br /&gt;
        node.innerHtml = node.innerHtml:gsub(&amp;quot;§§name§§&amp;quot;, node.name)&lt;br /&gt;
&lt;br /&gt;
        node.childHtml = &amp;#039;&amp;#039;        &lt;br /&gt;
        if node.children then &lt;br /&gt;
            for childIndex, childNode in pairs( node.children ) do&lt;br /&gt;
                prepareNodeHtml(childNode, childIndex, node)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if node.childHtml == &amp;#039;&amp;#039; then&lt;br /&gt;
            node.outerHtml = &amp;#039;&amp;lt;li&amp;gt;&amp;#039; .. node.innerHtml .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            node.childHtml = &amp;#039;&amp;lt;ol style=&amp;quot;margin-left:2.2ex;&amp;quot;&amp;gt;&amp;#039; .. node.childHtml .. &amp;#039;&amp;lt;/ol&amp;gt;&amp;#039;&lt;br /&gt;
            node.outerHtml = &amp;#039;&amp;lt;li&amp;gt;&amp;#039; .. node.innerHtml .. node.childHtml .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if parentNode then&lt;br /&gt;
            parentNode.childHtml = parentNode.childHtml .. node.outerHtml&lt;br /&gt;
        end        &lt;br /&gt;
&lt;br /&gt;
        return node;&lt;br /&gt;
    end;&lt;br /&gt;
        &lt;br /&gt;
    initNode(rootNode, 0, false)&lt;br /&gt;
&lt;br /&gt;
    if not currentNode then&lt;br /&gt;
        currentNode = rootNode;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    refNode = currentNode.refNode&lt;br /&gt;
    totalPageNo = refNode.childCount&lt;br /&gt;
    currentPageNo = currentNode.index&lt;br /&gt;
    isLastNode = currentNode.isLastNode&lt;br /&gt;
    isAllPage = currentNode.isAllPage&lt;br /&gt;
    nextNode = currentNode.nextNode&lt;br /&gt;
    lastNode = currentNode.lastNode&lt;br /&gt;
    &lt;br /&gt;
    prepareNodeHtml(rootNode, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getPageContent( node, frame )&lt;br /&gt;
    if not node then &lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end     &lt;br /&gt;
    local source, html&lt;br /&gt;
    source = node.title:getContent()&lt;br /&gt;
    html = frame:preprocess( tostring( mw.html.create( &amp;quot;div&amp;quot; ):wikitext( source ) ) )&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;&amp;lt;h2&amp;gt;&amp;#039; .. node.name .. &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039; .. html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getNodeByTitle(title, node)&lt;br /&gt;
    local childNode, childIndex, foundNode, isBase&lt;br /&gt;
&lt;br /&gt;
    if not title then &lt;br /&gt;
        return currentNode&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not node then &lt;br /&gt;
        node = rootNode &lt;br /&gt;
        isBase = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.title.equals( title, node.title ) then&lt;br /&gt;
        return node&lt;br /&gt;
    else&lt;br /&gt;
        if node.children then                 &lt;br /&gt;
            for childIndex, childNode in pairs( node.children ) do&lt;br /&gt;
                foundNode = getNodeByTitle(title, childNode)&lt;br /&gt;
                if foundNode then &lt;br /&gt;
                    return foundNode&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if isBase then &lt;br /&gt;
            return currentNode&lt;br /&gt;
        else &lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Public Interface&lt;br /&gt;
&lt;br /&gt;
local p = {} &lt;br /&gt;
&lt;br /&gt;
function p.navIndex(frame)&lt;br /&gt;
    mw.log(&amp;#039;Lua navIndex &amp;#039;, frame)&lt;br /&gt;
&lt;br /&gt;
    init( frame.args[config] );&lt;br /&gt;
    local node = getNodeByTitle(frame.args[title])&lt;br /&gt;
    return node.refNode.childHtml&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navWidget(frame)    &lt;br /&gt;
    mw.log(&amp;#039;Lua navWidget &amp;#039;, frame)&lt;br /&gt;
    init( frame.args[config] );&lt;br /&gt;
&lt;br /&gt;
    local node = currentNode&lt;br /&gt;
    local pagina, btnHtml &lt;br /&gt;
&lt;br /&gt;
    if node.isAllPage == true then&lt;br /&gt;
        pagina = templateData.paginaAll:gsub(&amp;quot;§§page§§&amp;quot;, refNode.page);&lt;br /&gt;
    else&lt;br /&gt;
        pagina = templateData.pagina&lt;br /&gt;
&lt;br /&gt;
        if node.isRefNode == true then&lt;br /&gt;
            pagina = templateData.paginaStart&lt;br /&gt;
        else&lt;br /&gt;
            pagina = templateData.pagina&lt;br /&gt;
        end  &lt;br /&gt;
        pagina = pagina:gsub(&amp;quot;§§totalPageNo§§&amp;quot;, node.refNode.childCount ):gsub(&amp;quot;§§currentPageNo§§&amp;quot;, node.index ) &lt;br /&gt;
        btnHtml = &amp;#039;&amp;#039;&lt;br /&gt;
        mw.log(&amp;#039;node.lastNode:&amp;#039;,node,&amp;#039;.&amp;#039;,node.lastNode,&amp;#039;|&amp;#039;,previousNode)&lt;br /&gt;
        if node.lastNode then&lt;br /&gt;
            btnHtml = templateData.btnLast:gsub(&amp;quot;§§page§§&amp;quot;, node.lastNode.page ):gsub(&amp;quot;§§name§§&amp;quot;, node.lastNode.name )&lt;br /&gt;
        end &lt;br /&gt;
        pagina = pagina:gsub(&amp;quot;§§btnLast§§&amp;quot;, btnHtml )&lt;br /&gt;
    &lt;br /&gt;
        btnHtml = &amp;#039;&amp;#039;&lt;br /&gt;
        mw.log(&amp;#039;node.nextNode:&amp;#039;,node,&amp;#039;.&amp;#039;,node.nextNode)&lt;br /&gt;
        if not node.isLastNode and node.nextNode then&lt;br /&gt;
            btnHtml = templateData.btnNext:gsub(&amp;quot;§§page§§&amp;quot;, node.nextNode.page ):gsub(&amp;quot;§§name§§&amp;quot;, node.nextNode.name )&lt;br /&gt;
        end&lt;br /&gt;
        pagina = pagina:gsub(&amp;quot;§§btnNext§§&amp;quot;, btnHtml )   &lt;br /&gt;
    &lt;br /&gt;
        btnHtml = &amp;#039;&amp;#039;&lt;br /&gt;
        if node.refNode.all then&lt;br /&gt;
            btnHtml = templateData.btnAll:gsub(&amp;quot;§§page§§&amp;quot;, node.refNode.all )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pagina = pagina:gsub(&amp;quot;§§btnAll§§&amp;quot;, btnHtml )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local widgetHtml = templateData.widget:gsub(&amp;quot;§§rootPage§§&amp;quot;,rootNode.page):gsub(&amp;quot;§§threadNavi§§&amp;quot;, node.refNode.innerHtml .. node.refNode.childHtml ):gsub(&amp;quot;§§pagina§§&amp;quot;, pagina )&lt;br /&gt;
&lt;br /&gt;
    return widgetHtml&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.all(frame)&lt;br /&gt;
    mw.log(&amp;#039;Lua all &amp;#039;, frame)&lt;br /&gt;
    init( frame.args[config] );&lt;br /&gt;
    -- body&lt;br /&gt;
    local html&lt;br /&gt;
    if currentNode then&lt;br /&gt;
&lt;br /&gt;
        html = &amp;#039;&amp;lt;div class=&amp;quot;tutorial-article&amp;quot; style=&amp;quot;margin-bottom:6em;&amp;quot;&amp;gt;&amp;#039; .. getPageContent(refNode, frame) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
         &lt;br /&gt;
        for childIndex, childNode in pairs( refNode.children ) do&lt;br /&gt;
            html = html .. &amp;#039;&amp;lt;div class=&amp;quot;tutorial-article&amp;quot; style=&amp;quot;margin-bottom:6em;&amp;quot;&amp;gt;&amp;#039; .. getPageContent(childNode, frame) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        return html&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;not found&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.isAll(frame)&lt;br /&gt;
    mw.log(&amp;#039;Lua isAll &amp;#039;, frame)&lt;br /&gt;
    init( frame.args[config] );&lt;br /&gt;
    mw.log(&amp;#039;Lua isAll -&amp;gt; &amp;#039;, isAllPage)&lt;br /&gt;
    return isAllPage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Martin Kraft</name></author>
	</entry>
</feed>