Module:term etymology/templates

This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local export = {}

local m_languages = require("Module:languages")

local gsub = mw.ustring.gsub

local template_mappings = {
	derived = "der",
	inherited = "inh",
	borrowing = "bor",
	loan = "bor",
	calque = "cal",
	calq = "cal",
	affix = "af",
	confix = "con",
	prefix = "pre",
	compound = "com",
	["blend of"] = "blend",
	suffix = "suf",
}

local function process_etymology(lang, sc, source, term, args)
	local etymology = require("Module:term etymology").getEtymology(lang, sc, term)
	
	-- rename templates to shorter versions
	etymology = gsub(
		etymology,
		"{{([^|]*)|",
		function(template_name)
			return "{{" .. (template_mappings[template_name] or template_name) .. "|"
		end
	)
	
	etymology = gsub(etymology, "{{bor([^}]*)|notext=[^|}]*([^}]*)}}", "{{bor%1%2}}")
	etymology = gsub(etymology, "{{bor([^}]*)|nocap=[^|}]*([^}]*)}}", "{{bor%1%2}}")
	etymology = gsub(etymology, "{{bor|", "from {{der|")
	
	local deriv_tls = {'der', 'inh'}
	-- If not inherited, replace {{inh}} with {{der}}
	if args["noinh"] then
		etymology = gsub(etymology, "{{inh|", "{{der|")
		deriv_tls = {'der'} --remove 'inh'
	elseif mw.ustring.find(etymology, "{{der|") then --find all {{inh}} after the first {{der}} and replace them
		local pre, post = mw.ustring.match(etymology, "(.-)({{der|.*)")
		etymology = pre .. gsub(post, "{{inh|", "{{der|")
	end
	
	-- Replace source language in nested parent etymologies with source language of child entry
	for _, template in ipairs(deriv_tls) do
	  etymology = gsub(etymology, "{{(" .. template .. ")|[%a%-]*|", "{{%1|" .. source .. "|")
	end
	
	-- etyl works backwards, annoyingly
	-- This should omit {{etyl|foo|-}}
	etymology = gsub(etymology, "{{etyl|([%a%-]*)|[%a]+%-?[%a]*}}", "{{etyl|%1|" .. source .. "}}")
	
	-- Add nocat=1 to all morphology templates
	local morph_tls = {'af', 'blend', 'circumfix', 'con', 'com', 'infix', 'pre', 'suf', 'transfix'}
	for _, template in ipairs(morph_tls) do
	  etymology = gsub(etymology, "{{(" .. template .. ")|([^}]*)}}", "{{%1|%2|nocat=1}}")
	end

	return etymology
end

function export.show(frame)
	local params = {
		[1] = {required = true, default = "und"},
		[2] = {required = true, default = "und"},
		[3] = {required = true},
		["noinh"] = {type = "boolean"},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local source, lang, term = args[1], args[2], args[3]
	
	lang = m_languages.getByCode(lang)
		or require("Module:etymology languages").getByCode(lang)
		or m_languages.err(lang, 1)
		
	local sc = lang:findBestScript(term)
	
	if lang:getCode() ~= lang:getFullCode() then
		-- [[Special:WhatLinksHere/Wiktionary:Tracking/descendant/etymological]]
		require("Module:debug").track("descendant/etymological")
		require("Module:debug").track("descendant/etymological/" .. lang:getCode())
	end
	
	return frame:preprocess(process_etymology(lang, sc, source, term, args))
end

return export