Module:User:Theknightwho/columns

Hello, you have come here looking for the meaning of the word Module:User:Theknightwho/columns. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:User:Theknightwho/columns, but we will also tell you about its etymology, its characteristics and you will know how to say Module:User:Theknightwho/columns in singular and plural. Everything you need to know about the word Module:User:Theknightwho/columns you have here. The definition of the word Module:User:Theknightwho/columns will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:User:Theknightwho/columns, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local export = {}

local m_links = require("Module:links")
local m_languages = require("Module:languages")
local m_table = require("Module:table")


local function format_list_items(list, args)
	local function term_already_linked(term)
		-- FIXME: "<span" is an ugly hack to prevent double-linking of terms already run through {{l|...}}:
		-- ]
		return term:find("<span")
	end
	for _, item in ipairs(args.content) do
		if type(item) == "table" then
			local link = term_already_linked(item.term.term) and item.term.term or m_links.full_link(item.term)
			if item.q then
				link = require("Module:qualifier").format_qualifier(item.q) .. " " .. link
			end
			if item.qq then
				link = link .. " " .. require("Module:qualifier").format_qualifier(item.qq)
			end
			item = link
		elseif args.lang and not term_already_linked(item) then
			item = m_links.full_link {lang = args.lang, term = item, sc = args.sc} 
		end
		
		list = list:node(mw.html.create("li")
			:wikitext(item)
		)
	end

	return list
end

function export.create_list(args)
	-- Fields in args that are used:
	-- args.column_count, args.content, args.alphabetize, args.background_color,
	-- args.collapse, args.toggle_category, args.class, args.lang
	-- Check for required fields?
	if type(args) ~= "table" then
		error("expected table, got " .. type(args))
	end

	local class = args.class or "derivedterms"
	local column_count = args.column_count or 1
	local toggle_category = args.toggle_category or "derived terms"
	local header = args.header
	
	if header and args.format_header then
		header = mw.html.create("div")
			:addClass("term-list-header")
			:wikitext(header)
	end
	
	if args.alphabetize then
		local function keyfunc(item)
			if type(item) == "table" then
				item = item.term.term
			end
			return item
		end
		require("Module:collation").sort(args.content, args.lang, keyfunc)
	end
	
	local list = mw.html.create("ul")
	list = format_list_items(list, args)
	
	local output = mw.html.create("div")
		:addClass(class)
		:addClass("term-list")
	if args.background_color then
		output = output:css("background-color", args.background_color)
	end
	if column_count == 0 then
		list = list
			:css("-webkit-column-width", "15em")
			:css("-moz-column-width", "15em")
			:css("-ms-column-width", "15em")
			:css("column-width", "15em")
			:css("column-gap", "15px")
	else
		output = output:attr("data-column-count", column_count)
	end
	output = output:node(list)

	if args.collapse then
		local nbsp = mw.ustring.char(0xA0)
		output = mw.html.create("div")
			:node(output)
			:addClass("list-switcher")
			:attr("data-toggle-category", toggle_category)
			:node(mw.html.create("div")
				:addClass("list-switcher-element")
				:attr("data-showtext", nbsp .. "show more ▼" .. nbsp)
				:attr("data-hidetext", nbsp .. "show less ▲" .. nbsp)
				:css("display", "none")
				:wikitext(nbsp)
			)
	end

	return mw.getCurrentFrame():extensionTag("templatestyles", "", {src = "User:Theknightwho/columns/style.css" }) .. tostring(header or "") .. tostring(output)
end


-- This function is for compatibility with earlier version of ]
-- (now found in ]).
function export.create_table(...)
	-- Earlier arguments to create_table:
	-- n_columns, content, alphabetize, bg, collapse, class, title, column_width, line_start, lang
	local args = {}
	args.column_count, args.content, args.alphabetize, args.background_color,
		args.collapse, args.class, args.header, args.column_width,
		args.line_start, args.lang = ...

	args.format_header = true

	return export.create_list(args)
end


local param_mods = {"t", "alt", "tr", "ts", "pos", "lit", "id", "sc", "g", "q", "qq"}
local param_mod_set = m_table.listToSet(param_mods)

function export.display_from(column_args, list_args)
	local iparams = {
		 = {},
		-- Default for auto-collapse. Overridable by template |collapse= param.
		 = {type = "boolean"},
		-- If specified, this specifies the number of columns, and no columns
		-- parameter is available on the template. Otherwise, the columns
		-- parameter is the first available numbered param after the language-code
		-- parameter.
		 = {type = "number"},
		-- If specified, this specifies the language code, and no language-code
		-- parameter is available on the template. Otherwise, the language-code
		-- parameter can be specified as either |lang= or |1=.
		 = {},
		-- Default for auto-sort. Overridable by template |sort= param.
		 = {type = "boolean"},
		-- The following is accepted but currently ignored, per an extended discussion in
		-- ].
		 = {default = ""},
		 = {},
	}

	local frame_args = require("Module:parameters").process(column_args, iparams, nil, "columns", "display_from")

	local compat = frame_args or list_args
	local lang_param = compat and "lang" or 1
	local columns_param = compat and 1 or 2
	local first_content_param = columns_param + (frame_args and 0 or 1)

	local params = {
		 = not frame_args and {required = true, default = "und"} or nil,
		 = not frame_args and {required = true, default = 2} or nil,
		 = {list = true},

		 = {},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {},
	}

	local args = require("Module:parameters").process(list_args, params, nil, "columns", "display_from")

	local lang = frame_args or args
	lang = m_languages.getByCode(lang, lang_param)

	local sc = args and require("Module:scripts").getByCode(sc, "sc") or nil

	local sort = frame_args
	if args ~= nil then
		sort = args
	end
	local collapse = frame_args
	if args ~= nil then
		collapse = args
	end

	local put
	for i, item in ipairs(args) do
		-- Parse off an initial language code (e.g. 'la:minūtia' or 'grc:]'). Don't parse if there's a spac
		-- after the colon (happens e.g. if the user uses {{desc|...}} inside of {{col}}, grrr ...).
		local termlang, actual_term = item:match("^(+):(.*)$")
		-- Make sure that only real language codes are handled as language links, so as to not catch interwiki
		-- or namespaces links.
		if termlang and (
			mw.loadData("Module:languages/code to canonical name") or
			mw.loadData("Module:etymology languages/code to canonical name")
		) then
			-- -1 since i is one-based
			termlang = m_languages.getByCode(termlang, first_content_param + i - 1, "allow etym")
			item = actual_term
		else
			termlang = lang
		end
		local termobj = {term = {lang = termlang, sc = sc}}

		-- Check for inline modifier, e.g. מרים<tr:Miryem>. But exclude HTML entry with <span ...>, <i ...>, <br/> or
		-- similar in it, caused by wrapping an argument in {{l|...}}, {{af|...}} or similar. Basically, all tags of
		-- the sort we parse here should consist of a less-than sign, plus letters, plus a colon, e.g. <tr:...>, so if
		-- we see a tag on the outer level that isn't in this format, we don't try to parse it. The restriction to the
		-- outer level is to allow generated HTML inside of e.g. qualifier tags, such as foo<q:similar to {{m|fr|bar}}>.
		if item:find("<") and not item:find("^*<*") then
			if not put then
				put = require("Module:parse utilities")
			end
			local run = put.parse_balanced_segment_run(item, "<", ">")
			local orig_param = first_content_param + i - 1
			local function parse_err(msg)
				error(msg .. ": " .. orig_param .. "= " .. table.concat(run))
			end
			termobj.term.term = run

			for j = 2, #run - 1, 2 do
				if run ~= "" then
					parse_err("Extraneous text '" .. run .. "' after modifier")
				end
				local modtext = run:match("^<(.*)>$")
				if not modtext then
					parse_err("Internal error: Modifier '" .. modtext .. "' isn't surrounded by angle brackets")
				end
				local prefix, arg = modtext:match("^(+):(.*)$")
				if not prefix then
					parse_err("Modifier " .. run .. " lacks a prefix, should begin with one of '" ..
						table.concat(param_mods, ":', '") .. ":'")
				end
				if param_mod_set then
					local obj_to_set
					if prefix == "q" or prefix == "qq" then
						obj_to_set = termobj
					else
						obj_to_set = termobj.term
					end
					if prefix == "t" then
						prefix = "gloss"
					elseif prefix == "g" then
						prefix = "genders"
						arg = mw.text.split(arg, ",")
					elseif prefix == "sc" then
						arg = require("Module:scripts").getByCode(arg, orig_param .. ":sc")
					end
					if obj_to_set then
						parse_err("Modifier '" .. prefix .. "' occurs twice, second occurrence " .. run)
					end
					obj_to_set = arg
				else
					parse_err("Unrecognized prefix '" .. prefix .. "' in modifier " .. run)
				end
			end
		else
			termobj.term.term = item
		end
		args = termobj
	end

	return export.create_list { column_count = frame_args or args,
		content = args,
		alphabetize = sort,
		header = args, background_color = "#F8F8FF",
		collapse = collapse,
		toggle_category = frame_args,
		class = frame_args, lang = lang, sc = sc, format_header = true }
end

function export.display(frame)
	return export.display_from(frame.args, frame:getParent().args)
end

return export