Module:Mapframe: Difference between revisions

From Random Island Wiki
Jump to navigation Jump to search
>Evad37
(default when display not present)
>Evad37
(Args)
Line 106: Line 106:


if displayInTitle and displayInline then
if displayInTitle and displayInline then
return makeTitleOutput(args, tagContent) .. makeInlineOutput(args, tagContent)
return makeTitleOutput(Args, tagContent) .. makeInlineOutput(Args, tagContent)
elseif displayInTitle then
elseif displayInTitle then
return makeTitleOutput(args, tagContent)
return makeTitleOutput(Args, tagContent)
elseif displayInline then
elseif displayInline then
return makeInlineOutput(args, tagContent)
return makeInlineOutput(Args, tagContent)
else
else
error( 'Invalid display parameter')
error( 'Invalid display parameter')

Revision as of 01:13, 2 May 2018

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

--Parameter for cleaned-up parent.args (whitespace trimmed, blanks removed)
local Args = {}

local defaults = {
	display = 'inline'
}

function setCleanArgs(argsTable)
	local cleanArgs = {}
	for key, val in pairs(argsTable) do
		if type(val) == 'string' then
			val = val:match('^%s*(.-)%s*$')
			if val ~= '' then
				cleanArgs[key] = val
			end
		else
			cleanArgs[key] = val
		end
	end
	return cleanArgs
end

function makeContent(args)
	if args.raw then
		return args.raw
	end

	local content = {};
	local contentIndex = '';
	while Args['type'..contentIndex] do
		local contentArgs = {}
		contentArgs['type'] = Args['type'..contentIndex]
		--todo: Add other relevant args

		content[contentIndex or 1] = makeContentJson(contentArgs)

		if contentIndex == '' then
			contentIndex = 1
		else
			contentIndex = contentIndex + 1
		end
	end
	
	--Single item, no array needed
	if #content==1 then
		return content[1]
	end

	--Multiple items get placed in an array
	local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
	return contentArray
end

function makeContentJson(contentArgs)
	local data = {}
	if contentArgs.type == 'point' then
		data.type = "Feature"
	else
		data.type = "ExternalData"
	end

	--todo: fill out rest of data

	return mw.text.jsonEncode(data)
end

function makeTagAttribs(args, isTitle)
	local attribs = {}
	if args.zoom then
		attribs.zoom = args.zoom
	end
	-- todo: all the others

	return attribs
end

function makeTitleOutput(args, tagContent)
 	local titleTag = mw.text.tag('maplink', makeTagAttribs(args, true), tagContent)
	local spanAttribs = {
		style = "font-size: small;",
		id = "coordinates"
	}
	return mw.text.tag('span', spanAttribs, titleTag)
end

function makeInlineOutput(args, tagContent)
	local tagName = 'maplink'
	if args.frame then
		tagName = 'mapframe'
	end

	return mw.text.tag(tagName, makeTagAttribs(args), tagContent)
end

local p = {}

function p.main(frame)
	local parent = frame.getParent(frame)
	Args = setCleanArgs(parent.args)
 
	local tagContent = makeContent(Args)

	local display = mw.text.split(Args.display or defaults.display, '%s*,%s*')
	local displayInTitle = display[1] == 'title' or display[2] == 'title'
	local displayInline = display[1] == 'inline' or display[2] == 'inline'

	if displayInTitle and displayInline then
		return makeTitleOutput(Args, tagContent) .. makeInlineOutput(Args, tagContent)
	elseif displayInTitle then
		return makeTitleOutput(Args, tagContent)
	elseif displayInline then
		return makeInlineOutput(Args, tagContent)
	else
		error( 'Invalid display parameter')
	end

end

return p