Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:Zandbak/doc

-- Deze pagina is een zandbak om Lua scripten op te testen en oefenen.

local p = {}

local getArgs = require('Module:Arguments').getArgs

local function interpreteerMultilevelInhoud(inhoud_string)
	local rootTable = {}
	rootTable.root = true
	
	local currentLevel = 1
	local currentTable = rootTable
	
	for line in mw.text.gsplit(inhoud_string, "\n", true) do
		local asterisks, text = mw.ustring.match(line, "^%s*(%**)%s*([^*].-)%s*$")
		
		if asterisks then
			local asterisks = string.len(asterisks)

			if asterisks == currentLevel then
				-- nothing
			elseif asterisks == currentLevel+1 then
				-- descend into last element
				currentTable = currentTable[#currentTable]
				currentLevel = currentLevel + 1
			elseif asterisks < currentLevel then
				-- go up for each level back
				while asterisks < currentLevel do
					currentTable = currentTable.parent
					currentLevel = currentLevel - 1
				end
			else
				return '<span class=error>Kan niet meer dan één level dieper tegelijk gaan</span>'
			end
			
			local newTable = {}
			newTable.parent = currentTable
			newTable.name = text
			
			if #currentTable > 0 then
				newTable.prevElem = currentTable[#currentTable]
				currentTable[#currentTable].nextElem = newTable
			end

			table.insert(currentTable, newTable)
			currentTable[newTable.name] = newTable
		end
	end
	
	return rootTable
end

local function genereerLinkLijst(werk_titel, pagina_tabel)
	if not pagina_tabel or pagina_tabel.root then
		local tabel = {}
		tabel.link_root = werk_titel
		return tabel
	end
	
	local lijst = genereerLinkLijst(werk_titel, pagina_tabel.parent)

	local nieuwe_rij = {}
	if pagina_tabel.prevElem then
		nieuwe_rij.vorige = '[[' .. lijst.link_root .. '/' .. pagina_tabel.prevElem.name .. '|' .. pagina_tabel.prevElem.name .. ']]'
	end
	nieuwe_rij.sectie = pagina_tabel.name
	nieuwe_rij.sectie = '[[' .. lijst.link_root .. '/' .. pagina_tabel.name .. '|' .. pagina_tabel.name .. ']]'
	if pagina_tabel.nextElem then
		nieuwe_rij.volgende = '[[' .. lijst.link_root .. '/' .. pagina_tabel.nextElem.name .. '|' .. pagina_tabel.nextElem.name .. ']]'
	end
	
	lijst.link_root = lijst.link_root .. '/' .. pagina_tabel.name
	
	table.insert(lijst, nieuwe_rij)
	
	return lijst
end

--[[
	Deze functie tekent de tabel onder de koptekst die de links naar vorige en
	volgende hoofdstukken bevatten.
	
	lijst: een lijst van tabellen met mogelijke waardes voor vorige, volgende,
		sectie
	returnt: De gegenereerde mw.html tabel
]]
local function tekenKoptekstNavigatie(lijst)
	if not lijst or #lijst == 0 then
		-- geen waardes: return niks
		return nil
	end

	local nav_tabel = mw.html.create('table')
		:addClass('ws-onder-koptekst-navigatie')
	
	for i, v in ipairs(lijst) do
		local nav_rij = nav_tabel:tag('tr')
		
		local vorige_td = nav_rij:tag('td')
			:addClass('ws-onder-koptekst-vorige')
		if v.vorige then
			vorige_td:tag('span')
				:wikitext(v.vorige)
			
			-- TODO automatische footer weer doen werken
		end

		local sectie_td = nav_rij:tag('td')
			:addClass('ws-onder-koptekst-sectie')
		if v.sectie then
			sectie_td:wikitext(v.sectie)
		end
		
		local volgende_td = nav_rij:tag('td')
			:addClass('ws-onder-koptekst-volgende')
		if v.volgende then
			volgende_td:tag('span')
				:wikitext(v.volgende)
		end
	end
	
	return nav_tabel
end

function p.decodeerLijst(frame)
	local str = [[
* Inleiding
* Brieven van 1899
** Japara, 25 Mei 1899.
** 18 Augustus 1899. (I.)
** 6 November 1899 (I.)
** November 1899 (II.)
* Brieven van 1900
* Brieven van 1901
* Brieven van 1902
* Brieven van 1903
* Brieven van 1904
* Gedachten ontleend aan niet openbaar gemaakte brieven
* Aan onze vrienden (gedicht)
* Nota over het onderwijs
]]
	local pagina_titel = 'Door Duisternis Tot Licht/Brieven van 1899/Japara, 25 Mei 1899.'


	local inhoud_tabel = interpreteerMultilevelInhoud(str)

	local titel_delen = mw.text.split(pagina_titel, '/', true)
	local werk_titel = table.remove(titel_delen, 1)
	
	local pagina_tabel = inhoud_tabel
	while #titel_delen > 0 do
		pagina_tabel = pagina_tabel[titel_delen[1]]
		table.remove(titel_delen, 1)
	end
	
	--[[
		nu hebben we de juiste pagina gevonden, tijd om de tabel met links te
		genereren
	]]
	local link_lijst = genereerLinkLijst(werk_titel, pagina_tabel)
	local koptekst_navigatie = tekenKoptekstNavigatie(link_lijst)
	
	return frame:extensionTag{name = 'templatestyles', args = { src = 'Gebruiker:Raketsla/klad/styles.css'}} .. tostring(koptekst_navigatie)
end

return p