Module:mg-noun: Difference between revisions

No edit summary
No edit summary
 
(34 intermediate revisions by the same user not shown)
Line 1: Line 1:
local export = {}
local m_u = require('Module:utilities')
local m_data = require('Module:mg-noun/data')
local sub = mw.ustring.sub
local sub = mw.ustring.sub
local gsub = mw.ustring.gsub
local find = mw.ustring.find
local find = mw.ustring.find
local match = mw.ustring.match
local gmatch = mw.ustring.gmatch
local gmatch = mw.ustring.gmatch
local gsub = mw.ustring.gsub
local u = mw.ustring.char
local split = mw.text.split
local gsplit = mw.text.gsplit


local m_utils = require("Module:utilities")
local m_data = require('Module:mg-noun/data')
local PAGENAME = gsub(mw.title.getCurrentTitle().text, "%s", " ")
local PAGENAME = gsub(mw.title.getCurrentTitle().text, "%s", " ")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local NAMESPACE = mw.title.getCurrentTitle().nsText


local lang = require("Module:languages").getByCode("cel-gal")
local genders = {["m"] = "masculine", ["f"] = "feminine", ["?"] = ""}


local export = {}
local function detect_decl(word)
 
if word:match("[aeoá]$") then
local function detect_decl(word, class)
return sub(word, -1, -1) -- last letter
local last = sub(word, 1, -2)
if class then
return class, {last}
elseif word:match("[aeor]$") then
return mw.ustring.upper(last), {last}
elseif word:match("n$") then
elseif word:match("n$") then
return "participle", {last}
return "nt"
else
return "cons"
end
end
return "consonant", {last}
end
end


Line 31: Line 32:
local parent_args = frame:getParent().args
local parent_args = frame:getParent().args
local numbers = nil
local numbers = {}
local decl = {}
local decl = {}
local word = NAMESPACE == "Template" and "mazer" or parent_args.word or PAGENAME
local g = NAMESPACE == "Template" and "f" or parent_args[1] or parent_args["g"]
local word = NAMESPACE == "Template" and "mazer" or parent_args["word"] or PAGENAME
local args = {}
local args = {}
local decl_type = ""
local decl_type = NAMESPACE == "Template" and "r" or parent_args[2] or parent_args["decl"] or detect_decl(word)
 
if g ~= "m" and g ~= "f" and g ~= "?" then error("Unknown gender: it must be either ‘m’ or ‘f’") end
if not m_data[word] then
if not m_data[word] then
if frame.args.decl then
decl_type = frame.args.decl
else
if parent_args.c and parent_args[1] then
decl_type = parent_args.c
numbers = {parent_args[1]}
else
decl_type, numbers = detect_decl(word, parent_args.c)
end
end
if NAMESPACE == "Template" then decl_type = "R" end
if not decl_type then
if not decl_type then
Line 66: Line 58:
local data = {forms = {}, categories = {}}
local data = {forms = {}, categories = {}}
data.head = parent_args["head"] or nil
data.head = parent_args["head"] or word
data.proper = parent_args["proper"] and true or false
data.proper = parent_args["proper"] and true or false
data.nocat = parent_args["nocat"] and true or false
data.nocat = parent_args["nocat"] and true or false
data.g = genders[g]
data.nopl = parent_args["nopl"] and true or false
data.nopl = parent_args["nopl"] and true or false
if data.proper then data.nopl = true end
data.decl_type = decl_type
-- Generate the forms
-- Generate the forms
if m_data[word] then
if m_data[word] then
m_data[word](parent_args, data)
m_data[word](parent_args, data)
else
else
m_data[decl_type](args, data)
m_data[decl_type](args, data)
end
end
 
-- Make the table
-- make the table
return make_table(data)
return make_table(data, parent_args)
end
end


function make_table(data)
function make_table(data, args)


local function show_form(form)
local function show_form(form)
Line 116: Line 111:
elseif param == "pagename" then
elseif param == "pagename" then
return PAGENAME
return PAGENAME
elseif param == "gender" then
return data.g
else
else
return show_form(data.forms[param])
return show_form(data.forms[param])
Line 127: Line 124:
for _, case in ipairs(cases) do
for _, case in ipairs(cases) do
local case_short = sub(case, 1, 2)
local case_short = sub(case, 1, 2)
table.insert(ret, "|- \n! style=\"background-color: #dcffed;\ |" .. case .. "\n")
local form_s = args[case_short .. '_s'] and {args[case_short .. '_s']} or data.forms[case_short .. '_s'] or nil
table.insert(ret, "| style=\"background-color: #edfff6;\" | " .. link(show_form(data.forms[case_short .. "_s"])) .. "\n")
local form_p = args[case_short .. '_p'] and {args[case_short .. '_p']} or data.forms[case_short .. '_p'] or nil
table.insert(ret, "| style=\"background-color: #edfff6;\" | " .. link(show_form(data.forms[case_short .. "_p"])) .. "\n")
table.insert(ret, '|- \n! ' .. case .. '\n')
table.insert(ret, '| ' .. link(show_form(form_s)) .. '\n')
if not data.nopl then
table.insert(ret, '| ' .. link(show_form(form_p)) .. '\n')
end
end
end
return table.concat(ret)
return table.concat(ret)
end
end
local no_plural = data.nopl or data.forms.nom_pl == nil


local navframe = [=[
local navframe = [=[
<div class="mw-collapsible" style="border-collapse: collapse; margin: 0px 0px -1px 0px; padding: 2px; border: 1px solid #aaaaaa; text-align: center; font-size: 95%; overflow: auto; width: 70%;">
<div class="mw-collapsible" style="border-collapse: collapse; margin: 0px 0px -1px 0px; padding: 2px; border: 1px solid #aaaaaa; text-align: center; font-size: 95%; overflow: auto; width: 55%;">
<div style="min-height: 1.6em; font-weight:bold; font-size: 100%; text-align: left; background-color:#efefef; padding-left: 10px; background-image: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#DFDFDF), color-stop(0.6, #E3E3E3)); background-image: -moz-linear-gradient(top, #EFEFEF, #E3E3E3 60%, #DFDFDF);  background-image: -o-linear-gradient(top, #EFEFEF, #E3E3E3 60%, #DFDFDF);">''{{{title}}}'' — {{{gender}}} noun, {{{decl_type}}}-declension</div>
<div style="min-height: 1.6em; font-weight:bold; font-size: 100%; text-align: left; background-color:#efefef; padding-left: 10px; background-image: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#DFDFDF), color-stop(0.6, #E3E3E3)); background-image: -moz-linear-gradient(top, #EFEFEF, #E3E3E3 60%, #DFDFDF);  background-image: -o-linear-gradient(top, #EFEFEF, #E3E3E3 60%, #DFDFDF);">''{{{title}}}'' — {{{gender}}} noun, {{{decl_type}}}-declension</div>
<div class="mw-collapsible-content" style="font-size: 100%;">
<div class="mw-collapsible-content" style="font-size: 100%;">
]=]
]=]
 
local wikicode = [=[
local wikicode = [=[
{| class="bluetable" border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%"
{| border="1px solid #000000" style="border-collapse:collapse; background:#fafafa; text-align:center; width:100%"
|-
|- style="background-color: #009AD2"
! &nbsp;
! &nbsp;
! Singular
! Singular
]=] .. (data.nopl and "\n" or [=[
! Plural
! Plural
]=] .. make_cases(data) .. [=[
]=]) .. make_cases(data) .. [=[
|}</div></div>]=]
|}</div></div>]=]
 
 
return gsub(navframe .. wikicode, "{{{([a-z0-9_]+)}}}", repl)
return gsub(navframe .. wikicode, "{{{([a-z0-9_]+)}}}", repl) .. (not data.nocat and m_utils.format_categories(data.categories, lang) or "")
  .. (not data.nocat and m_u.format_categories(data.categories, lang) or "")
end
end


return export
return export