local p = local data = mw.loadData("Module:Interlinear/data")local gloss_override = -- for custom gloss abbreviationslocal getArgs = require("Module:Arguments").getArgslocal yesno = require("Module:Yesno")
---------------------------- Almost-global variables--------------------------local frame, glossing_type, displaying_messages, msg
--------------------- General settings-------------------local conf =
----------------------- CSS styles and classes---------------------conf.class =
----------------------- Sundry small functions---------------------local function tidyCss(str) -- trims quotation marks str = mw.ustring.gsub(str, '^["\']*(.-)["\']*$', "%1") -- appends ";" if missing if mw.ustring.sub(str, -1) ~= ";" then str = str .. ";" end return strend
local function highlight(text) if text then return '
' .. text .. "" else return "" endendlocal function help_link(anchor) if anchor then return " (help)" else return "" endend
---------------------- The following two functions update the glossing settings based on the received-- template arguments. set_global_glossing_settings updates the global settings-- that are valid for all gloss abbreviations. set_glossing_type-- returns the glossing type, which can vary between the different lines.--------------------function set_global_glossing_settings(a) local style = "" if a.style then style = tidyCss(a.style) end if a.underline
"no" then style = style .. "font-variant:normal; text-transform: none;" a.class = a.class .. " no_smallcaps" end if style ~= "" then conf.style.GlossAbbr = conf.style.GlossAbbr .. style endend
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)
----------------------- The UserMessages object contains and processes error messages and warnings---------------------local UserMessages = function UserMessages:add(msgtype, text, gloss) if msgtype
"warning" then table.insert(self.warnings, text) elseif msgtype
"ambiguous gloss" then self.if_ambiguous_glosses = true elseif msgtype
0 and namespace ~= 2 then err_span:wikitext(conf.ErrorCategory) end out = tostring(err_span) mw.addWarning(conf.MessageGlossingError) end if self.if_ambiguous_glosses then if namespace
To change any of the following default expansions, see the template's documentation:
") end for _, v in pairs(self.gloss_messages) do div:wikitext("" .. v .. "
") end out = out .. "\n\n" .. tostring(div) end return outend----------------------- gloss_lookup receives a gloss abbreviation and tries to uncover its meaning.---------------------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
"" then _label = nil end if _wikilink
----------------------- Section transclusion---------------------local page_content = nil -- lazy initilizationlocal function get_section(section_name) if page_content
local function set_custom_glosses(list) local abbs = mw.text.split(list, '[;\n\t]') for _,v in pairs(abbs) do local gloss = mw.text.split(v, ':') local a = mw.text.trim(gloss[1]) if a and a ~= "" then gloss_override[a] = gloss_override[a].expansion = gloss[2] gloss_override[a].wikipage = gloss[3] end endend
--this looks for a list of glossing abbreviations on the page-- that transcludes the template:function view_abbreviations_list local _ablist_section = get_section('list-of-glossing-abbreviations') if _ablist_section and _ablist_section ~= "" then local _a = mw.ustring.gsub(_ablist_section, '?div [^\n]*>', ) -- strips off the div tags set_custom_glosses(_a) endend
----------------------- format_gloss calls gloss_lookup to find the meaning of a gloss-- abbreviation, which it then proceeds to format---------------------function format_gloss(gloss, label, wikilink) if string.sub(gloss, 1, 3)
"label") or (not wikilink and glossing_type
"no abbr" then gloss_node = mw.html.create("span") else gloss_node = mw.html.create("abbr") end gloss_node:addClass(conf.class.GlossAbbr) if label or wikilink then if mw.ustring.match(gloss, conf.GlossSmallCapsExclude) then gloss_node:addClass("gloss-not-smallcaps") end -- if not mw.ustring.match(gloss, "%l") -- and not mw.ustring.match(gloss, conf.GlossSmallCapsExclude) -- excluding glosses that contain lower-case characters -- then -- and also excluding A, O etc. from rendering in small caps --gloss_node:attr("style", conf.style.GlossAbbr) -- end local abbr_label = label or wikilink-- 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 message = message .. " linking to " .. wikilink .. ";" end msg:add("gloss_message", message, gloss) end elseif glossing_type
---------------------- The following function is called by Template:gcl and is used for formatting an individual glossing abbreviation--------------------function gcl(gloss, label, wikilink) if not gloss then UserMessages:add("error", "No gloss supplied") return UserMessages:print end -- if a wikilink is supplied and glossing isn't set to 'label'... if wikilink and not args.glossing then glossing_type = "wikilink" end -- .. then the wikilink will be formatted as such if label
"" then wikilink = nil end return format_gloss(gloss, label, wikilink)end
function p.gcl(f) frame = f local args = getArgs(frame,) msg = UserMessages set_global_glossing_settings view_abbreviations_list 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] return gcl(gloss, label, wikilink)-- if not gloss then-- UserMessages:add("error", "No gloss supplied")-- return UserMessages:print-- end-- -- if a wikilink is supplied and glossing isn't set to 'label'...-- if wikilink and not args.glossing then-- glossing_type = "wikilink"-- end -- .. then the wikilink will be formatted as such-- if label
"" then wikilink = nil end-- local result = format_gloss(gloss, label, wikilink)-- return resultend
return p