Module:Interlinear/sandbox2/gcl
Appearance
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