Jump to content

Module:Interlinear/sandbox2/gcl

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eievie (talk | contribs) at 02:00, 31 January 2024 (Created page with 'local p = {} local data = mw.loadData( 'Module:Interlinear/data' ) local gloss_override = {} -- for custom gloss abbreviations local getArgs = require('Module:Arguments').getArgs local yesno = require('Module:Yesno') -------------------- -- The following function is called by Template:gcl and is used for formatting an individual glossing abbreviation -------------------- function p.gcl(frame) local args = getArgs(frame,{ trim = true, removeBlanks = fa...'). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
local p = {}
local data = mw.loadData( 'Module:Interlinear/data' )
local gloss_override = {} -- for custom gloss abbreviations
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')

--------------------
-- The following function is called by Template:gcl and is used for formatting an individual glossing abbreviation
--------------------
function p.gcl(frame)
	local args = getArgs(frame,{
		trim = true,
		removeBlanks = false,
		parentOnly = true,
		wrappers = {'Template:Gcl'},
	})
	msg = UserMessages
	set_global_glossing_settings{
		style = args.style,
		underline = args.underline,
		small_caps = args['small-caps']
	}
	if not args.glossing then
		glossing_type = conf.GlossingType -- a global variable
	else
		glossing_type = set_glossing_type(args.glossing)
	end
	local gloss, label, wikilink = args[1], args[2], args[3]
	if not gloss then
		UserMessages:add("error", "No gloss supplied")
		return UserMessages:print()
	end
	if wikilink and not args.glossing then -- if a wikilink is supplied and glossing isn't set to 'label'...
		glossing_type = 'wikilink' end --     .. then the wikilink will be formatted as such
	if label == "" then label = nil end
	if wikilink == "" then wikilink = nil end
	local result = format_gloss(gloss, label, wikilink)
	return result
end

---------------------
-- format_gloss() calls gloss_lookup() to find the meaning of a gloss
-- abbreviation, which it then proceeds to format
---------------------
local function format_gloss(gloss, label, wikilink)
	if string.sub(gloss,1,3) == "000" then -- checks for a common component of exposed strip markers (see [[:mw:Strip marker]])
		return gloss
	end
	local gloss2 = mw.ustring.gsub(gloss,"<.->","") -- remove any html fluff
	gloss2 = mw.ustring.gsub(gloss2, "%'%'+", "") -- remove wiki bold/italic formatting
	gloss2 = mw.text.trim(mw.ustring.upper(gloss2))
	if not (label or wikilink)
		or (not label and glossing_type == "label")
		or (not wikilink  and glossing_type == "wikilink")
		then
			if glossing_type ~= "no abbr" then
				label, wikilink, source = gloss_lookup(gloss2, label, wikilink)
			end
	end
	local gloss_node
	if glossing_type == "no abbr" then
		gloss_node = mw.html.create("span")
	else
		gloss_node = mw.html.create("abbr")
	end
	gloss_node:addClass("gloss_abbr")
	if label or wikilink then
		if not mw.ustring.match(gloss, "%l") -- excluding glosses that contain lower-case characters
			and not mw.ustring.match(gloss,conf.GlossSmallCapsExclude) -- and also excluding A, O etc. from rendering in small caps
			then
				gloss_node:addClass("gloss_node")--gloss_node:attr("style", conf.style.GlossAbbr)
		end
		local abbr_label
		if label then
			abbr_label = label
		else
			abbr_label = wikilink
		end
		gloss_node:attr("title", abbr_label)
		if source ~= "local" and data.abbreviations[gloss2] then
			if data.abbreviations[gloss2].ambiguous then
				gloss_node:addClass(conf.class.GlossAbbrAmb)
					msg:add("ambiguous gloss")
				end
		end
		if glossing_type == "wikilink" and wikilink then
			gloss_node:wikitext("[[", wikilink, "|" , gloss, "]]")
		else
			gloss_node:wikitext(gloss)
		end
		if source ~= "local" and displaying_messages then -- logging gloss lookups:
			local message = ""
			if label then
				message = "assuming " .. gloss2 .. " means \"" .. abbr_label .. "\";"
			end
			if glossing_type == "wikilink" and wikilink then
				message = message .. " linking to [[" .. wikilink .. "]];"
			end
			msg:add("gloss_message", message, gloss)
		end
	elseif glossing_type == "no abbr" then
		gloss_node
			:addClass("gloss_abbr")--:attr("style", conf.style.GlossAbbr)
			:wikitext(gloss)
	else
		if displaying_messages then
			msg:add("warning", "Gloss abbreviation " .. highlight(gloss2) .. "  not recognised" .. help_link("gloss abbr"))
		end
		msg:add("non-repeating error", "Unknown glossing abbreviation(s)" .. help_link("gloss abbr"))
		gloss_node
			:addClass(conf.class.GlossAbbrError)
			:addClass("error")
			:attr("title", gloss2 .. ": glossing abbreviation not found")
			:wikitext(gloss)
	end
	return tostring(gloss_node)
end

local function set_glossing_type(glossing)
	if glossing then
		local GlossingType
		glossing = mw.ustring.lower(mw.text.trim(glossing))
		if mw.ustring.find(glossing, 'link') then
			GlossingType = "wikilink"
		elseif mw.ustring.find(glossing, 'label')
			or  mw.ustring.find(glossing, 'no link') then
			GlossingType = 'label'
		elseif mw.ustring.find(glossing, 'no abbr') then
			GlossingType = "no abbr"
		elseif yesno(glossing) == false then
			GlossingType = nil
		elseif yesno(glossing) then
			GlossingType = conf.GlossingType
		else
			msg:add('error', 'Glossing type "' .. glossing .. '" not recognised')
		end
		return GlossingType
	else error("set_glossing_type: 'glossing' is nil or false", 2)
	end
end

---------------------
-- gloss_lookup() receives a gloss abbreviation and tries to uncover its meaning.
---------------------
local function gloss_lookup(a, label, wikilink)
	local _label, _wikilink, _lookup, source = nil, nil, nil, nil
	if gloss_override[a] then
		_lookup = gloss_override[a]
		source = "local"
	elseif data.abbreviations[a] then
		_lookup = data.abbreviations[a]
	end
	if _lookup and _lookup.expansion ~= "" then
		_label, _wikilink = _lookup.expansion, _lookup.wikipage
	else
		local prefix = mw.ustring.sub(a,1,1)
		local suffix = mw.ustring.sub(a,2)
		if conf.combining_person[prefix] then -- is it of the form 1PL or 3FS?
			_label = conf.combining_person[prefix]
		local _suffix = conf.combining_number[suffix] or conf.combining_gender[suffix]
			if _suffix then
				_label = _label .. ", " .. _suffix
			else
				local suffix1 = mw.ustring.sub(suffix,1,1)
				local suffix2 = mw.ustring.sub(suffix,2)
					if conf.combining_gender[suffix1]
					and  conf.combining_number[suffix2] then
						_label = _label .. ", " .. conf.combining_gender[suffix1] .. ", " .. conf.combining_number[suffix2]
					else _label = nil end
			end
	elseif mw.ustring.match(suffix,conf.combining_gender_numbers) then -- cases like G4 = gender 4
		local _i,_j = mw.ustring.find(a, conf.combining_gender_numbers)
		local _pre = mw.ustring.sub(a, 1, _i - 1)
		local _suff = mw.ustring.sub(a, _i)
		if conf.combining_gender_prefixes[_pre] then
			_label = conf.combining_gender_prefixes[_pre] .. " " .. _suff
		end
	elseif prefix == "N" then -- dealing with cases like NPST = non-past
		local s = gloss_override[suffix] or data.abbreviations[suffix]
			if s ~= nil and not s.ExcludeNegation then
				_label = "non-" .. s.expansion
				_wikilink = s.wikipage
			end
			s = nil
		end
	end
	if _label == "" then _label = nil end
	if _wikilink == "" then _wikilink = nil end
	if not label then label = _label end
	if not wikilink then wikilink = _wikilink end
	return label, wikilink, source
end

local function set_global_glossing_settings(a)
	local style = ""
	if a.style then style = tidyCss(a.style) end
	if a.underline == "no" then
		style = style .. "text-decoration: none;" end
	if a.small_caps == "no" then
		style = style .. "font-variant:normal; text-transform: none;" end
	--if style ~= "" then conf.style.GlossAbbr = conf.style.GlossAbbr .. style end
end