Module:CoorCheck

Uit Wiki Raamsdonks Erfgoed

Doel

Deze module leest de parameters van een coördinatensjabloon en ofwel geeft de gewenste output ofwel checkt of er geen onherkenbare zaken in de input staan.

Specifiek herkent de module scale: region: en type: en bij het type:city(...) kan de module ook de waarde teruggeven die daar tussen de haakjes staat.

Specificaties

Op de puntjes wordt de input ingevoegd die bekeken wordt door de module:

  • Geeft de region: {{#invoke:CoorCheck|extract|...|region}}
  • Geeft de scale: {{#invoke:CoorCheck|extract|...|scale}}
  • Geeft het type: {{#invoke:CoorCheck|extract|...|type}}
  • Geeft het getal van type:city(): {{#invoke:CoorCheck|extract|...|type|yes}}

Indien de gevraagde waarde niet opgegeven wordt er niks teruggegeven.

  • Geeft Error indien de input een fout bevat, als de inhoud klopt wordt er niks teruggegeven: {{#invoke:CoorCheck|check|...}}

Voorbeelden

Resultaat met type:forest_scale:25000_region:NL:

  • NL
  • 25000
  • forest

Resultaat met type:city(20000)_region:NL:

  • city
  • 20000

Controle op fouten:

  • Goed:
  • Fout: Error
  • Fout: Error
  • Fout: Error
  • Fout: Error
  • Fout: Error
  • Fout: Error
  • Fout: Error

Toepassing


local p = {}
function p.extract(frame)
	stringy = frame.args[1]
	elem = frame.args[2]
	dosubelem = frame.args[3]
	tab =  p.rec(stringy, { subvalues = {} }, 1)
	if dosubelem then return tab.subvalues[elem] else return tab[elem] end
end

function p.check(frame)
	stringy = frame.args[1]
	return p.innercheck(stringy)
end

function p.innercheck(haystack)
	if not haystack then return "Error" end
	somecolon = string.find(haystack, ":")
	if not somecolon then return "Error" end
	allowed = { globe = 1, region = 1, scale = 1, subvalues = 1}
	allowed["type"] = 1
	tab = p.rec(haystack, { subvalues = {} }, 1)
	for key,value in pairs(tab) do
		found = allowed[key]
		if not found or
		   not value or
		   value == "" or
		   (type(value) == "string" and string.find(value, ":"))
		then return "Error" end
	end
	return
end

function p.rec(haystack, accum, pos)
	poscol = string.find(haystack, ":", pos)
	if not poscol then
		return accum
	end
	key = string.sub(haystack, pos, poscol - 1)
	posunder = string.find(haystack, "_", pos)
	if posunder then
		posbracket = string.find(haystack, "%(", pos)
		if posbracket and posbracket < posunder then
			value = string.sub(haystack, poscol + 1, posbracket - 1)
			subvalue = string.sub(haystack, posbracket + 1, posunder - 2)
			accum[key] = value
			accum.subvalues[key] = subvalue
		else 
			value = string.sub(haystack, poscol + 1, posunder - 1)
			accum[key] = value
		end
		return p.rec(haystack, accum, posunder + 1)
	else
		value = string.sub(haystack, poscol + 1)
		accum[key] = value
		return accum
	end
end

return p