Home
Random
Recent changes
Special pages
Community portal
Preferences
About Stockhub
Disclaimers
Search
User menu
Talk
Contributions
Create account
Log in
Editing
Module:Sandbox/Evad37/Mapframe multi
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
local mapframe = require('Module:Mapframe') local getArgs = require('Module:Arguments').getArgs local DEFAULT_WIDTH = "300" local p = {} -- Get the number of key-value pairs in a table, which might not be a sequence. function tableCount(t) local count = 0 for k, v in pairs(t) do count = count + 1 end return count end -- For a table where the values are all tables, returns either the tableCount of -- the subtables if they are all the same, or nil if they are not all the same. function subTablesCount(t) local count = nil for k, v in pairs(t) do if count == nil then count = tableCount(v) elseif count ~= tableCount(v) then return nil end end return count end function tableFromList(listString) if type(listString) ~= "string" or listString == "" then return nil, true end local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or (mw.ustring.find(listString, ";", 0, true ) and ";") or "," local pattern = "%s*"..separator.."%s*" local t = mw.text.split(listString, pattern) -- if #t == 1 then -- debugging -- error(string.format("Found 1 value in '%s' using separator '%s'", listString or "{nil}", separator)) -- end return t end --[[ Makes the HTML required for the swicther to work, including the templatestyles tag @param {table} params table sequence of {map, label} tables @param {string} params{}.map Wikitext for mapframe map @param {string} params{}.label Label text for swicther option @param {table} options @param {string} options.alignment "left" or "center" or "right" @param {boolean} options.isThumbnail Display in a thumbnail @param {string} options.width Width of frame, e.g. "200" @param {string} [options.caption] Caption wikitext for thumnail @retruns {string} swicther HTML ]]-- function makeSwitcherHtml(params, options) if not options then option = {} end local frame = mw.getCurrentFrame() local styles = frame:extensionTag{ name = "templatestyles", args = {src = "TemplateStyles sandbox/Evad37/Template:Mapframe multi/styles.css"} } local container = mw.html.create("div") :addClass("switcher-container") :addClass("mapframe-multi-container") if options.alignment == "left" or options.alignment == "right" then container:addClass("float"..options.alignment) else -- alignment is "center" container:addClass("center") end for i = 1, #params do container :tag("div") :wikitext(params[i].map) :tag("span") :addClass("switcher-label") :css("display", "none") :wikitext(mw.text.trim(params[i].label)) end if not options.isThumbnail then return styles .. tostring(container) end local classlist = container:getAttr("class") classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "") container:attr("class", classlist) local outerCountainer = mw.html.create("div") :addClass("mapframe-multi-outer-container") :addClass("mw-kartographer-container") :addClass("thumb") if options.alignment == "left" or options.alignment == "right" then outerCountainer:addClass("t"..options.alignment) else -- alignment is "center" outerCountainer :addClass("tnone") :addClass("center") end outerCountainer :tag("div") :addClass("thumbinner") :css("width", options.width.."px") :node(container) :node(options.caption and mw.html.create("div") :addClass("thumbcaption") :wikitext(options.caption) ) return styles .. tostring(outerCountainer) end -- Entry points for templates p.main = function(frame) local args = getArgs(frame, {parentFirst = true}) local output = p._main(args) return frame:preprocess(output) end p._main = function(args) if not args.switch then error("Mapframe multi: Paramater switch= is required", 0) end local switchLabels = tableFromList(args.switch) if #switchLabels == 1 then error("Mapframe multi: Found only one label in paramater switch=", 0) end local mapframeArgs = {} local switchParams = {} for name, val in pairs(args) do -- Copy to mapframeArgs, if not one of the switch labels or values args if name ~= "switch" and not string.match(name, "^SWITCH:") then mapframeArgs[name] = val end -- Check if this is params to switch. If so, store the name and switch -- values in switchParams table. local switchList = string.match(val, "^SWITCH:(.+)") if switchList ~= nil then local values = tableFromList(switchList) if #values == 1 then error(string.format("Mapframe multi: Found only one switch value in paramater %s=", name), 0) end switchParams[name] = values end end if tableCount(switchParams) == 0 then error("Mapframe multi: At least one parameter must have a SWITCH: list", 0) end local switchCount = subTablesCount(switchParams) if not switchCount then error("Mapframe multi: All SWITCH parameters must have the same number of switch values", 0) elseif switchCount > #switchLabels then error(string.format( "Mapframe multi: Found %d switch value%s but only %d label%s in parameter switch=", switchCount, switchCount == 1 and "" or "s", #switchLabels, #switchLabels == 1 and "" or "s" ), 0) end -- Ensure a plain frame will be used (thumbnail will be built by the -- makeSwitcherHtml function if required, so that switcher options are -- inside the thumnail) mapframeArgs.plain = "yes" local switcher = {} for i = 1, switchCount do local label = switchLabels[i] for name, values in pairs(switchParams) do mapframeArgs[name] = values[i] end table.insert(switcher, { map = mapframe._main(mapframeArgs), label = "Show "..label }) end return makeSwitcherHtml(switcher, { alignment = args["frame-align"] or "right", isThumbnail = (args.frame and not args.plain) and true or false, width = args["frame-width"] or DEFAULT_WIDTH, caption = args.text }) end return p
Summary:
Please note that all contributions to Stockhub may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Stockhub:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Template used on this page:
Module:Sandbox/Evad37/Mapframe multi/doc
(
edit
)