Module:Media

From OSL Demo

Documentation for this module may be created at Module:Media/doc

local lustache = require("Module:Lustache")
--local yaml = require("Module:Yaml")
local p = {} --p stands for package

p.template = {}
p.template["mediawiki_gallery"] = [[{{#elements}}{{{file}}}|{{{description}}}
{{/elements}}]]

-- see also https://stackoverflow.com/questions/66382691/how-to-escape-brackets-in-a-multi-line-string-in-lua
p.template["bootstrap_gallery"] = [=[
<!-- Gallery -->
<div class="row">
  {{#elements}}
  <div class="col-lg-4 col-md-12 mb-4 mb-lg-0">
    [[{{{file}}}]]
  </div>
  {{/elements}}
</div>
<!-- Gallery -->
]=]

function p.gallery(frame)
	local jsondata = {}
	local frame = frame:getParent() -- disable for debug console, use the params passed to the template, see https://www.mediawiki.org/wiki/Lua/Scripting#frame:getParent_(frame:getParent())
	mw.logObject(frame.args)
	for k,v in pairs(frame.args) do jsondata[k] = v end
	local wikitext = ""
--	local text = mw.text.killMarkers(frame.args['jsondata'])
--	--jsondata =  mw.text.jsonDecode(frame.args['jsondata']:gsub("UNIQ.*QINU", ""), mw.text.JSON_TRY_FIXING)--:gsub("<*>", ""):gsub("</nowiki>", "")) 
--	jsondata =  mw.text.jsonDecode(text, mw.text.JSON_TRY_FIXING)--:gsub("<*>", ""):gsub("</nowiki>", "")) 
--	return "" .. frame.args['jsondata']
--end

--function p.test(frame)
--	local jsondata = mw.text.jsonDecode(frame.args['jsondata']:gsub("UNIQ.*QINU", ""), mw.text.JSON_TRY_FIXING)--:gsub("<*>", ""):gsub("</nowiki>", "")) 

	--if (frame.args['yamldata'] ~= nil) then jsondata = yaml.eval(frame.args['yamldata']) end
	if (frame.args['textdata'] ~= nil) then
		-- "File:OSW5f36a59d4bb94ea0bf93f08f7470f609.png|test1;File:OSWd1c24f1c4b014ebe99c2a83672e3dfc7.png|test2;"
		jsondata["elements"] = {}
		local lines = p.splitString(frame.args['textdata'], ";")
		for k,v in ipairs(lines) do
			local parts = p.splitString(v, "|")
			local element = {file=parts[1]:gsub('%s+', ''), description=parts[2]}
			table.insert(jsondata["elements"], element)
		end
	end
	if (jsondata["render_template"] == nil or jsondata["render_template"] == "") then jsondata["render_template"] = "mediawiki_gallery" end
	if (jsondata["image_size"] == nil or jsondata["image_size"] == "") then jsondata["image_size"] = "300" end
	mw.logObject(jsondata)
	
	
	local template = p.template["mediawiki_gallery"]
	if (jsondata["render_template"] == "bootstrap_gallery") then template = p.template["bootstrap_gallery"] end

	wikitext = lustache:render(template, jsondata)

	if (jsondata["render_template"] == "mediawiki_gallery") then 
		local params = {
			widths= jsondata["image_size"], 
			heights= jsondata["image_size"],
			mode= jsondata["mode"],
		}
		mw.logObject(params)
		wikitext = frame:extensionTag{ name = "gallery" , content = wikitext, args = params } 
	end
	
	mw.logObject(wikitext)
	return wikitext
end

function p.splitString(inputstr, sep)
    if sep == nil then
        sep = ";"
    end
    local t={}
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
    	table.insert(t, str)
    end
    return t
end

return p

--DEBUG (direct invoke)
--[[
frame = mw.getCurrentFrame() -- Get a frame object
jsondata = '{"image_size": "300", "elements": [{"file": "File:OSW5f36a59d4bb94ea0bf93f08f7470f609.png", "description": "test"}]}'
newFrame = frame:newChild{ args = {jsondata=jsondata}}
mw.log(p.gallery( newFrame ) ) 
--]]
--[[
frame = mw.getCurrentFrame() -- Get a frame object
yamldata = [ [ --remove space for testing
image_size: 300
elements: 
 - file: "File:OSW5f36a59d4bb94ea0bf93f08f7470f609.png"
   description: "test
] ] --remove space for testing
newFrame = frame:newChild{ args = {yamldata=yamldata}}
mw.log(p.gallery( newFrame ) ) 
--]]
--[=[
frame = mw.getCurrentFrame() -- Get a frame object
textdata = [[ File:OSW5f36a59d4bb94ea0bf93f08f7470f609.png|a. Click on "Create Instance" on the Article tile;
File:OSWd1c24f1c4b014ebe99c2a83672e3dfc7.png|b. Add at least a label;
File:OSWd8adafab997746e69864f23e7bfba734.png|c. Additional properties can be added on demand. Click "Save" when you are done.;
]]
frame.args = {textdata=textdata}
newFrame = frame:newChild{ args = {textdata=textdata, render_template="bootstrap_gallery"}}
mw.log(p.gallery( newFrame ) ) 
--]=]