Moduuli:Julkisen taiteen luettelo

Wikipediasta
Siirry navigaatioon Siirry hakuun

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:Julkisen taiteen luettelo/ohje

local p = {}

local function parse_title_row(str)
	local ret={}
	str=string.gsub(str, "!!", "\n!")
    str=string.gsub(str, "<ref[^>]+>.+</ref>", "")
    str=string.gsub(str, "<ref.+</ref>", "")    
    str=string.gsub(str, "<ref[^>]+/>", "")
    str=string.gsub(str, "<ref.+/>", "")      
    str=string.gsub(str, "</?b>", "")    
	local iterator = mw.text.gsplit(str, "\n!", false)
	local n=0
	for c in iterator do
		local trimmed=mw.text.trim( c )
		if ((n>0) or (not (trimmed == ""))) then 
			table.insert(ret, trimmed )
		end
		n=n+1
	end
	return ret
end

local function parse_row(str)
	local ret={}
	str=string.gsub(str, "||", "\n|")
    str=string.gsub(str, "<ref[^>]+>.+</ref>", "")
    str=string.gsub(str, "<ref.+</ref>", "")    
    str=string.gsub(str, "<ref[^>]+/>", "")
    str=string.gsub(str, "<ref.+/>", "")      
    
	local iterator = mw.text.gsplit(str, "\n|", true)
	local n=0
	for c in iterator do
		local trimmed=mw.text.trim( c )
		if ((n>0) or (not (trimmed == ""))) then 
			table.insert(ret, trimmed )
		end
		n=n+1
	end
	return ret
end


local function parse_title_row(str)
	local ret={}
	str=string.gsub(str, "!!", "\n!")
	local iterator = mw.text.gsplit(str, "\n!", false)
	local n=0
	for c in iterator do
		local trimmed=mw.text.trim( c )
		if (c and (not (trimmed == ""))) then 
			table.insert(ret, trimmed )
		end
		n=n+1
	end
	return ret
end


local function parse_rows(str)
	local iterator = mw.text.gsplit(str, "|-", true)
	local title={}
	local data={}
	for l in iterator do
		if (string.find(l, "\n!")) then
			title=parse_title_row(l)
		else
			table.insert(data, parse_row(l))
		end
	end
	ret = {title = title, data = data }
	return ret
end

local function parse_list(str)
	local iterator = mw.text.gsplit(str, "|}", true)
	for l in iterator do
		local rows = parse_rows(l)
		return rows
	end
end

local function parse_lajiteltavaNimi(str)
	for lajiteltavanimi in string.gmatch( str, '({{LajiteltavaNimi[^}]+}})' ) do
		for etunimi, sukunimi in string.gmatch( lajiteltavanimi, 'LajiteltavaNimi|([^%}%|]+)|([^%}%|]+)' ) do
			str=string.gsub(str, lajiteltavanimi, etunimi .." " .. sukunimi)
		end
	end

	return str
end

local function render_tallenna_kuva_button(title, data, sivu, nimiavaruus, kunta, talks)
-- {{Sitaattikuvan latauslinkki  
-- |item={{{item|}}}
-- |itemlabel={{{itemlabel|}}} -- Teoksen nimi
-- |wd={{{wd|}}} -- wikidata kohde
-- |p170={{{p170|}}} -- Tekijä
-- |p170blabel={{{p170blabel|}}} -- Tekijän nimi 
-- |p571={{{p571|}}}
-- |p2795_fi={{{p2795_fi|}}}
-- |p969={{{p969|}}}
-- |p131={{{p131|}}}
-- |lat={{{lat|}}}
-- |long={{{long|}}}
-- |pvm=4.8.2018
-- |sivun nimi = Luettelo_Porin_julkisista_taideteoksista_ja_muistomerkeistä <noinclude>{{FULLPAGENAMEE}}</noinclude>
-- }}
	
	local frame = mw.getCurrentFrame()
	local ret=""
	local data2={}
	for k, v in pairs(title) do
		data2[string.lower(v)] = data[k] or ""
	end
	
	local sivun_nimi = string.gsub(sivu, '_', ' ') 
	if (tonumber(nimiavaruus) > 0) then
		sivun_nimi =  nimiavaruus ..":" .. string.gsub(sivu, '_', ' ') 
	end
		
	
	local params={}
	params["item"] = data2["julkinen teos"]
	params["p170"] = parse_lajiteltavaNimi(data2["tekijä"])
	params["p969"] = ""
	params["pvm"] = ""
	params["sivun nimi"] = sivun_nimi
	
	params["p170blabel"]=parse_lajiteltavaNimi(data2["tekijä"])
	params["itemlabel"]=data2["julkinen teos"] 
	params["p571"] = data2["julkaistu"]
	params["wd"] = data2["wd"]
	params["p131"] = data2["alue"]
	params["p2795_fi"] = data2["paikka"]
	params["p571"] = data2["paljastusvuosi"]
	params["paikkalinkki"] = data2["kartalla"]
	params["lat"] = ""
	params["lon"] = ""
	params["kunta"] = kunta

	local kuvattubutton= frame:expandTemplate{ title = 'Sitaattikuvan kuvattulinkki', args = params }
	for k,talk in pairs(talks) do 
		if (talk==data2["julkinen teos"]) then
			kuvattubutton=frame:expandTemplate{ title = 'Sitaattikuva on jo kuvattu', args = params }
			break
		end
	end

	ret = kuvattubutton 
	ret = ret .. "||" .. frame:expandTemplate{ title = 'Sitaattikuvan latauslinkki', args = params }
	return ret
end

local function render_list(l, sivu, nimiavaruus, kunta, talks)
	local frame=	mw.getCurrentFrame()
	local n=0
	
	-- Taulukon aloitus
	local ret="{| class='wikitable sortable'\n"
	
	-- Header-otsikot
	ret = ret .. "|-\n"
	for kk, vv in pairs(l.title) do
		if (vv =='Kuva') then
			ret = ret .. "! colspan=2 |" .. vv .. "\n"
		else
			ret = ret .. "! " .. vv .. "\n"
		end
	end
	
	-- Data
	for k,v in pairs(l.data) do
		if (n>0) then
			row_ret = "|-\n"
			add_photo_row=0
			for kk, vv in pairs(l.title) do
				local title = l.title[kk] or "__%title%__"
				local value = v[kk] or ""
				if (value == "" and string.lower(l.title[kk]) == "kuva") then
					value=render_tallenna_kuva_button(l.title, v, sivu, nimiavaruus, kunta, talks)
					add_photo_row=1
				end
				value = frame:preprocess( value ) 
				row_ret = row_ret .. "|" .. value .."\n"
			end
			-- show only rows where photo is missing
			if add_photo_row==1 then
				ret = ret .. row_ret
			end
		end
		n=n+1
	end
	
	
	-- Footer-otsikot
	ret = ret .. "|-\n"
	for kk, vv in pairs(l.title) do
		if (vv =='Kuva') then
			ret = ret .. "! colspan=2 |" .. vv .. "\n"
		else
			ret = ret .. "! " .. vv .. "\n"
		end
	end
	
	-- Taulukon lopetus
	ret = ret .. "|}\n"
	
	return ret
end

local function parse_talk_page()
    local title = mw.title.new(mw.title.getCurrentTitle().text, mw.title.getCurrentTitle().namespace+1)
    local aineisto = title:getContent() or ""
    local otsikot = {}
    local ret = {}

	-- Haetaan sivun otsikot tauluun. 
    for w in string.gfind(aineisto, '=+([^=\n]+)=+') do
      table.insert(otsikot, mw.text.trim(w))
    end

    for k,otsikko in pairs(otsikot) do
    	local uusi_otsikko = string.gsub(otsikko, "^Kuvattu teos ", "")
    	if (trimmed ~= uusi_otsikko) then
    		table.insert(ret, uusi_otsikko)
    	end
    end
    
    return ret
end 

local function parse(sivu, nimiavaruus, kunta)
	-- Haetaan sivun sisältö. 
    local title = mw.title.new(sivu, nimiavaruus)
	local aineisto = title:getContent()
	local rendered="";
	assert(title, 'Valitettavasti sivun sisällön hakeminen ei onnistunut (virhe 1)')
	assert(aineisto, 'Valitettavasti sivun sisällön hakeminen ei onnistunut (virhe 2)')
	
	local talks=parse_talk_page()
	
--	for k,talk in pairs(talks) do
--		rendered = rendered .. talk
--	end
	
	local iterator = mw.text.gsplit(aineisto, "{|", true)
	for l in iterator do
		local rows=parse_list(l)
		rendered = rendered .. render_list(rows, sivu, nimiavaruus, kunta, talks)
	end
	return rendered

end
-- sivun hakemiston automaattisesti generoiva funktio
function p.tallennus(frame)
	assert(frame.args['nimiavaruus'], 'Nimiavaruus tarvitaan hakemiston tuottamiseksi')
	assert(frame.args['sivu'], 'Sivun nimi tarvitaan hakemiston tuottamiseksi')
	
	local kunta = frame.args['kunta'] or ""
	local nimiavaruus = frame.args['nimiavaruus']
	nimiavaruus = string.gsub(nimiavaruus, '%s', '_')
	
	local sivu = frame.args['sivu']
	local sisalto=parse(sivu, nimiavaruus, kunta)
	return sisalto
--	return 	mw.text.jsonEncode(sisalto)
	
end

return p