<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://youjo.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AColumns</id>
	<title>Module:Columns - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://youjo.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AColumns"/>
	<link rel="alternate" type="text/html" href="https://youjo.wiki/index.php?title=Module:Columns&amp;action=history"/>
	<updated>2026-10-17T17:04:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://youjo.wiki/index.php?title=Module:Columns&amp;diff=1522&amp;oldid=prev</id>
		<title>Chizu: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://youjo.wiki/index.php?title=Module:Columns&amp;diff=1522&amp;oldid=prev"/>
		<updated>2022-09-23T19:42:19Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:42, 23 September 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Chizu</name></author>
	</entry>
	<entry>
		<id>https://youjo.wiki/index.php?title=Module:Columns&amp;diff=1521&amp;oldid=prev</id>
		<title>Wiktionary&gt;Surjection: better Lua interface</title>
		<link rel="alternate" type="text/html" href="https://youjo.wiki/index.php?title=Module:Columns&amp;diff=1521&amp;oldid=prev"/>
		<updated>2022-09-03T17:20:27Z</updated>

		<summary type="html">&lt;p&gt;better Lua interface&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_table = require(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format_list_items(items, lang, sc)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	&lt;br /&gt;
	for _, item in ipairs(items) do&lt;br /&gt;
		if type(item) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			local link = m_links.full_link(item.term)&lt;br /&gt;
			if item.q then&lt;br /&gt;
				link = require(&amp;quot;Module:qualifier&amp;quot;).format_qualifier(item.q) .. &amp;quot; &amp;quot; .. link&lt;br /&gt;
			end&lt;br /&gt;
			item = link&lt;br /&gt;
		-- XXX: &amp;quot;&amp;lt;span&amp;quot; is an ugly hack: [[Thread:User talk:CodeCat/MewBot adding lang to column templates]]&lt;br /&gt;
		elseif lang and not string.find(item, &amp;quot;&amp;lt;span&amp;quot;) then&lt;br /&gt;
			item = m_links.full_link {lang = lang, term = item, sc = sc} &lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(result, &amp;#039;\n* &amp;#039; .. item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local collapse_header =&lt;br /&gt;
	[[&amp;lt;div class=&amp;quot;list-switcher&amp;quot; data-toggle-category=&amp;quot;{{{toggle_category}}}&amp;quot;&amp;gt;]]&lt;br /&gt;
local column_header = [[&amp;lt;div class=&amp;quot;{{{class}}} term-list ul-column-count&amp;quot; ]]&lt;br /&gt;
	.. [[data-column-count=&amp;quot;{{{column_count}}}&amp;quot; ]]&lt;br /&gt;
	.. [[style=&amp;quot;background-color: {{{background_color}}};&amp;quot;&amp;gt;]]&lt;br /&gt;
local button = [[&amp;lt;div class=&amp;quot;list-switcher-element&amp;quot; ]]&lt;br /&gt;
	.. [[data-showtext=&amp;quot;&amp;amp;nbsp;show more ▼&amp;amp;nbsp;&amp;quot; ]]&lt;br /&gt;
	.. [[data-hidetext=&amp;quot;&amp;amp;nbsp;show less ▲&amp;amp;nbsp;&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
function export.create_list(args)&lt;br /&gt;
	-- Fields in args that are used:&lt;br /&gt;
	-- args.column_count, args.content, args.alphabetize, args.background_color,&lt;br /&gt;
	-- args.collapse, args.toggle_category, args.class, args.lang&lt;br /&gt;
	-- Check for required fields?&lt;br /&gt;
	if type(args) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&amp;quot;expected table, got &amp;quot; .. type(args))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	args.class = args.class or &amp;quot;derivedterms&amp;quot;&lt;br /&gt;
	args.column_count = args.column_count or 1&lt;br /&gt;
	args.toggle_category = args.toggle_category or &amp;quot;derived terms&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local output = {}&lt;br /&gt;
	&lt;br /&gt;
	if args.header then&lt;br /&gt;
		if args.format_header then&lt;br /&gt;
			args.header = &amp;#039;&amp;lt;div class=&amp;quot;term-list-header&amp;quot;&amp;gt;&amp;#039; .. args.header .. &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(output, args.header)&lt;br /&gt;
	end&lt;br /&gt;
	if args.collapse then&lt;br /&gt;
		table.insert(output, (collapse_header:gsub(&amp;#039;{{{(.-)}}}&amp;#039;, args)))&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(output, (column_header:gsub(&amp;#039;{{{(.-)}}}&amp;#039;, args)))&lt;br /&gt;
	&lt;br /&gt;
    if args.alphabetize then&lt;br /&gt;
    	local function keyfunc(item)&lt;br /&gt;
    		if type(item) == &amp;quot;table&amp;quot; then&lt;br /&gt;
    			item = item.term.term&lt;br /&gt;
    		end&lt;br /&gt;
    		-- Remove all HTML so mixtures of raw terms and {{l|...}} sort&lt;br /&gt;
    		-- correctly.&lt;br /&gt;
    		item = item:gsub(&amp;quot;&amp;lt;.-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    		return item&lt;br /&gt;
    	end&lt;br /&gt;
		require(&amp;quot;Module:collation&amp;quot;).sort(args.content, args.lang, keyfunc)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(output, format_list_items(args.content, args.lang, args.sc))&lt;br /&gt;
	&lt;br /&gt;
	table.insert(output, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
	if args.collapse then&lt;br /&gt;
		table.insert(output, button .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- This function is for compatibility with earlier version of [[Module:columns]]&lt;br /&gt;
-- (now found in [[Module:columns/old]]).&lt;br /&gt;
function export.create_table(...)&lt;br /&gt;
	-- Earlier arguments to create_table:&lt;br /&gt;
	-- n_columns, content, alphabetize, bg, collapse, class, title, column_width, line_start, lang&lt;br /&gt;
	local args = {}&lt;br /&gt;
	args.column_count, args.content, args.alphabetize, args.background_color,&lt;br /&gt;
		args.collapse, args.class, args.header, args.column_width,&lt;br /&gt;
		args.line_start, args.lang = ...&lt;br /&gt;
	&lt;br /&gt;
	args.format_header = true&lt;br /&gt;
	&lt;br /&gt;
	return export.create_list(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local param_mods = {&amp;quot;t&amp;quot;, &amp;quot;alt&amp;quot;, &amp;quot;tr&amp;quot;, &amp;quot;ts&amp;quot;, &amp;quot;pos&amp;quot;, &amp;quot;lit&amp;quot;, &amp;quot;id&amp;quot;, &amp;quot;sc&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;q&amp;quot;}&lt;br /&gt;
local param_mod_set = m_table.listToSet(param_mods)&lt;br /&gt;
&lt;br /&gt;
function export.display_from(column_args, list_args)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		[&amp;quot;class&amp;quot;] = {},&lt;br /&gt;
		-- Default for auto-collapse. Overridable by template |collapse= param.&lt;br /&gt;
		[&amp;quot;collapse&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		-- If specified, this specifies the number of columns, and no columns&lt;br /&gt;
		-- parameter is available on the template. Otherwise, the columns&lt;br /&gt;
		-- parameter is the first available numbered param after the language-code&lt;br /&gt;
		-- parameter.&lt;br /&gt;
		[&amp;quot;columns&amp;quot;] = {type = &amp;quot;number&amp;quot;},&lt;br /&gt;
		-- If specified, this specifies the language code, and no language-code&lt;br /&gt;
		-- parameter is available on the template. Otherwise, the language-code&lt;br /&gt;
		-- parameter can be specified as either |lang= or |1=.&lt;br /&gt;
		[&amp;quot;lang&amp;quot;] = {},&lt;br /&gt;
		-- Default for auto-sort. Overridable by template |sort= param.&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		-- The following is accepted but currently ignored, per an extended discussion in&lt;br /&gt;
		-- [[Wiktionary:Beer parlour/2018/November#Titles of morphological relations templates]].&lt;br /&gt;
		[&amp;quot;title&amp;quot;] = {default = &amp;quot;&amp;quot;},&lt;br /&gt;
		[&amp;quot;toggle_category&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local frame_args = require(&amp;quot;Module:parameters&amp;quot;).process(column_args, iparams)&lt;br /&gt;
	&lt;br /&gt;
	local compat = frame_args[&amp;quot;lang&amp;quot;] or list_args[&amp;quot;lang&amp;quot;]&lt;br /&gt;
	local lang_param = compat and &amp;quot;lang&amp;quot; or 1&lt;br /&gt;
	local columns_param = compat and 1 or 2&lt;br /&gt;
	local first_content_param = columns_param + (frame_args[&amp;quot;columns&amp;quot;] and 0 or 1)&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[lang_param] = not frame_args[&amp;quot;lang&amp;quot;] and {required = true, default = &amp;quot;und&amp;quot;} or nil,&lt;br /&gt;
		[columns_param] = not frame_args[&amp;quot;columns&amp;quot;] and {required = true, default = 2} or nil,&lt;br /&gt;
		[first_content_param] = {list = true},&lt;br /&gt;
		&lt;br /&gt;
		[&amp;quot;title&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;collapse&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;sc&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(list_args, params)&lt;br /&gt;
	&lt;br /&gt;
	local lang = frame_args[&amp;quot;lang&amp;quot;] or args[lang_param]&lt;br /&gt;
	lang = m_languages.getByCode(lang, lang_param)&lt;br /&gt;
	&lt;br /&gt;
	local sc = args[&amp;quot;sc&amp;quot;]&lt;br /&gt;
	if sc then&lt;br /&gt;
		sc = require &amp;quot;Module:scripts&amp;quot;.getByCode(sc)&lt;br /&gt;
			or error(&amp;quot;|sc= does not contain a valid script code&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sort = frame_args[&amp;quot;sort&amp;quot;]&lt;br /&gt;
	if args[&amp;quot;sort&amp;quot;] ~= nil then&lt;br /&gt;
		sort = args[&amp;quot;sort&amp;quot;]&lt;br /&gt;
	end&lt;br /&gt;
	local collapse = frame_args[&amp;quot;collapse&amp;quot;]&lt;br /&gt;
	if args[&amp;quot;collapse&amp;quot;] ~= nil then&lt;br /&gt;
		collapse = args[&amp;quot;collapse&amp;quot;]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local iut&lt;br /&gt;
	for i, item in ipairs(args[first_content_param]) do&lt;br /&gt;
		-- Check for new-style argument, e.g. מרים&amp;lt;tr:Miryem&amp;gt;. But exclude HTML entry with &amp;lt;span ...&amp;gt;,&lt;br /&gt;
		-- &amp;lt;i ...&amp;gt;, &amp;lt;br/&amp;gt; or similar in it, caused by wrapping an argument in {{l|...}}, {{af|...}} or similar.&lt;br /&gt;
		-- Basically, all tags of the sort we parse here should consist of a less-than sign, plus letters,&lt;br /&gt;
		-- plus a colon, e.g. &amp;lt;tr:...&amp;gt;, so if we see a tag on the outer level that isn&amp;#039;t in this format,&lt;br /&gt;
		-- we don&amp;#039;t try to parse it. The restriction to the outer level is to allow generated HTML inside&lt;br /&gt;
		-- of e.g. qualifier tags, such as foo&amp;lt;q:similar to {{m|fr|bar}}&amp;gt;.&lt;br /&gt;
		if item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			if not iut then&lt;br /&gt;
				iut = require(&amp;quot;Module:inflection utilities&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			local run = iut.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = first_content_param + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local termobj = {term = {}}&lt;br /&gt;
			termobj.term.lang = lang&lt;br /&gt;
			termobj.term.term = run[1]&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				if run[j + 1] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					parse_err(&amp;quot;Extraneous text &amp;#039;&amp;quot; .. run[j + 1] .. &amp;quot;&amp;#039; after modifier&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				if not modtext then&lt;br /&gt;
					parse_err(&amp;quot;Internal error: Modifier &amp;#039;&amp;quot; .. modtext .. &amp;quot;&amp;#039; isn&amp;#039;t surrounded by angle brackets&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				if not prefix then&lt;br /&gt;
					parse_err(&amp;quot;Modifier &amp;quot; .. run[j] .. &amp;quot; lacks a prefix, should begin with one of &amp;#039;&amp;quot; ..&lt;br /&gt;
						table.concat(param_mods, &amp;quot;:&amp;#039;, &amp;#039;&amp;quot;) .. &amp;quot;:&amp;#039;&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				if param_mod_set[prefix] then&lt;br /&gt;
					local obj_to_set&lt;br /&gt;
					if prefix == &amp;quot;q&amp;quot; then&lt;br /&gt;
						obj_to_set = termobj&lt;br /&gt;
					else&lt;br /&gt;
						obj_to_set = termobj.term&lt;br /&gt;
					end&lt;br /&gt;
					if prefix == &amp;quot;t&amp;quot; then&lt;br /&gt;
						prefix = &amp;quot;gloss&amp;quot;&lt;br /&gt;
					elseif prefix == &amp;quot;g&amp;quot; then&lt;br /&gt;
						prefix = &amp;quot;genders&amp;quot;&lt;br /&gt;
						arg = mw.text.split(arg, &amp;quot;,&amp;quot;)&lt;br /&gt;
					elseif prefix == &amp;quot;sc&amp;quot; then&lt;br /&gt;
						arg = require(&amp;quot;Module:scripts&amp;quot;).getByCode(arg, orig_param .. &amp;quot;:sc&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
					if obj_to_set[prefix] then&lt;br /&gt;
						parse_err(&amp;quot;Modifier &amp;#039;&amp;quot; .. prefix .. &amp;quot;&amp;#039; occurs twice, second occurrence &amp;quot; .. run[j])&lt;br /&gt;
					end&lt;br /&gt;
					obj_to_set[prefix] = arg&lt;br /&gt;
				else&lt;br /&gt;
					parse_err(&amp;quot;Unrecognized prefix &amp;#039;&amp;quot; .. prefix .. &amp;quot;&amp;#039; in modifier &amp;quot; .. run[j])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			args[first_content_param][i] = termobj&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return export.create_list { column_count = frame_args[&amp;quot;columns&amp;quot;] or args[columns_param],&lt;br /&gt;
		content = args[first_content_param],&lt;br /&gt;
		alphabetize = sort,&lt;br /&gt;
		header = args[&amp;quot;title&amp;quot;], background_color = &amp;quot;#F8F8FF&amp;quot;,&lt;br /&gt;
		collapse = collapse,&lt;br /&gt;
		toggle_category = frame_args[&amp;quot;toggle_category&amp;quot;],&lt;br /&gt;
		class = frame_args[&amp;quot;class&amp;quot;], lang = lang, sc = sc, format_header = true }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.display(frame)&lt;br /&gt;
	return export.display_from(frame.args, frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Wiktionary&gt;Surjection</name></author>
	</entry>
</feed>