|
|
| (96 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| local export = {} | | local export = {} |
| | local pos_functions = {} |
|
| |
|
| local spacingPunctuation = "[%s%p]+" | | local sub = mw.ustring.sub |
| --[[ List of punctuation or spacing characters that are found inside of words.
| | local find = mw.ustring.find |
| Used to exclude characters from the regex above. ]]
| | local match = mw.ustring.match |
| local wordPunc = "-־׳״'.·*’་" | | local gmatch = mw.ustring.gmatch |
| local notWordPunc = "[^" .. wordPunc .. "]+" | | local gsub = mw.ustring.gsub |
| local pos_for_gender_number_cat = { | | local u = mw.ustring.char |
| ["nouns"] = "nouns",
| | local split = mw.text.split |
| ["proper nouns"] = "nouns", | | local gsplit = mw.text.gsplit |
| -- We include verbs because impf and pf are valid "genders".
| | |
| ["verbs"] = "verbs", | | local PAGENAME = mw.title.getCurrentTitle().text |
| | local NAMESPACE = mw.title.getCurrentTitle().nsText |
| | local SUBPAGENAME = mw.title.getCurrentTitle().subpageText |
| | |
| | local gender_key = { |
| | ["i"] = "in", |
| | ["a"] = "an", |
| } | | } |
|
| |
|
| local function format_inflection_parts(data, parts) | | local verb_key = { |
| local m_links = require("Module:links") | | ["aditr"] = "agentive ditransitive", |
| | | ["adit"] = "agentive ditransitive", |
| for key, part in ipairs(parts) do | | ["ai"] = "agentive intransitive", |
| if type(part) ~= "table" then
| | ["asubj"] = "agentive subjective", |
| part = {term = part}
| | ["at"] = "agentive transitive", |
| end
| | ["imp"] = "impersonal", |
|
| | ["pass"] = "passive", |
| -- Convert the term into a full link
| | ["udit"] = "unagentive ditransitive", |
| -- Don't show a transliteration here, the consensus seems to be not to
| | ["ui"] = "unagentive intransitive", |
| -- show them in headword lines to avoid clutter.
| | ["usubj"] = "unagentive subjective", |
| part = m_links.full_link(
| | ["ut"] = "unagentive transitive", |
| {
| | ["utrans"] = "translative", |
| term = not nolink and part.term or nil,
| | ["?"] = "?", |
| alt = part.alt or (nolink and part.term or nil),
| | } |
| lang = part.lang or data.lang,
| |
| genders = part.genders,
| |
| },
| |
| face,
| |
| false
| |
| )
| |
|
| |
| part = qualifiers .. part
| |
|
| |
| parts[key] = part
| |
| end | |
|
| |
| local parts_output = ""
| |
| | |
| if #parts > 0 then
| |
| parts_output = " " .. table.concat(parts, " <i>or</i> ")
| |
| end | |
|
| |
| return "<i>" .. parts.label .. "</i>" .. parts_output
| |
| end
| |
|
| |
|
| -- Format the inflections following the headword
| | local lang = require("Module:languages").getByCode("siwa") |
| local function format_inflections(data) | |
| if data.inflections and #data.inflections > 0 then
| |
| -- Format each inflection individually
| |
| for key, infl in ipairs(data.inflections) do
| |
| data.inflections[key] = format_inflection_parts(data, infl)
| |
| end
| |
|
| |
| return " (" .. table.concat(data.inflections, ", ") .. ")"
| |
| else
| |
| return ""
| |
| end
| |
| end
| |
|
| |
|
| local function format_genders(data) | | local function glossary_link(entry, text) |
| if data.genders and #data.genders > 0 then | | return "[[wikt:Appendix:Glossary#" .. entry .. "|" .. (text or entry) .. "]]" |
| local pos_for_cat
| |
| if not data.nogendercat then
| |
| local pos_category = pos_category:gsub("^reconstructed ", "")
| |
| pos_for_cat = pos_for_gender_number_cat[pos_category]
| |
| end
| |
| local gen = require("Module:getn")
| |
| local text, cats = gen.format_genders(data.genders, data.lang, pos_for_cat)
| |
| for _, cat in ipairs(cats) do
| |
| table.insert(data.categories, cat)
| |
| end
| |
| return " " .. text
| |
| else
| |
| return ""
| |
| end
| |
| end | | end |
|
| |
|
| Line 84: |
Line 45: |
| -- This is the only function that can be invoked from a template. | | -- This is the only function that can be invoked from a template. |
| function export.show(frame) | | function export.show(frame) |
| local args = frame:getParent().args | | if NAMESPACE == "Template" and SUBPAGENAME ~= "doc" then return end |
| PAGENAME = mw.title.getCurrentTitle().subpageText
| | local parent_args = frame:getParent().args |
| | | |
| local head = args["head"]; if head == "" then head = nil end
| |
|
| |
| -- The part of speech. This is also the name of the category that
| |
| -- entries go in. However, the two are separate (the "cat" parameter)
| |
| -- because you sometimes want something to behave as an adjective without
| |
| -- putting it in the adjectives category.
| |
| local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.") | | local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.") |
| | local class = frame.args[2]; if class == "" then class = nil end |
| | | |
| local data = {pos_category = poscat, categories = {}, heads = {head}, genders = {}, inflections = {}} | | local data = { |
| | lang = lang, |
| | heads = {}, |
| | inflections = {}, |
| | genders = {}, |
| | pos_category = poscat, |
| | categories = {"Siwa " .. poscat} |
| | } |
| | | |
| if poscat == "adjectives" then | | if pos_functions[poscat] then |
| if PAGENAME:find("^-") then | | pos_functions[poscat](class, parent_args, data) |
| data.pos_category = "suffixes"
| |
| data.categories = {"Siwa adjective-forming suffixes"}
| |
| end
| |
|
| |
| adjective(args, data)
| |
| elseif poscat == "adverbs" then
| |
| if PAGENAME:find("^-") then
| |
| data.pos_category = "suffixes"
| |
| data.categories = {"Siwa adverb-forming suffixes"}
| |
| end
| |
|
| |
| adverb(args, data)
| |
| elseif poscat == "determiners" then
| |
| adjective(args, data)
| |
| elseif poscat == "nouns" then
| |
| if PAGENAME:find("^-") then
| |
| data.pos_category = "suffixes"
| |
| data.categories = {"Siwa noun-forming suffixes"}
| |
| end
| |
|
| |
| noun_gender(args, data)
| |
| elseif poscat == "proper nouns" then
| |
| noun_gender(args, data)
| |
| elseif poscat == "verbs" then
| |
| if PAGENAME:find("^-") then
| |
| data.pos_category = "suffixes"
| |
| data.categories = {"Siwa verb-forming suffixes"}
| |
| end
| |
| end | | end |
| | | |
| return full_headword(data) | | return require("Module:headword").full_headword(data) |
| end | | end |
|
| |
|
| -- Display information for a noun's gender
| | pos_functions.nouns = function(class, args, data) |
| -- This is separate so that it can also be used for proper nouns
| | local params = { |
| function noun_gender(args, data) | | [1] = {required = true}, |
| local valid_genders = { | | [2] = {}, |
| ["in"] = true, | | ["m"] = {list = true}, |
| ["an"] = true, | | ["head"] = {default = PAGENAME}, |
| ["in-p"] = true, | | ["decl"] = {}, |
| ["an-p"] = true, | | ["cat2"] = {}, |
| | ["cat3"] = {}, |
| | ["sort"] = {}, |
| | ["affix"] = {list = true}, |
| } | | } |
| | | |
| -- Iterate over all gn parameters (g2, g3 and so on) until one is empty | | local args = require("Module:parameters").process(args, params) |
| local g = args[1] or ""; if g == "" then g = "?" end | | data.heads = {args["head"]} |
| local i = 2
| | data.affix = args["affix"] |
| | | |
| while g ~= "" do | | table.insert(data.genders, gender_key[args[1]] or args[1]) |
| if not valid_genders[g] then
| | if args[2] then table.insert(data.genders, gender_key[args[2]] or args[2]) end |
| g = "?"
| |
| end
| |
|
| |
| table.insert(data.genders, g)
| |
| g = args["g" .. i] or ""
| |
| i = i + 1
| |
| end
| |
| end
| |
| | |
| function adjective(args, data)
| |
| local adverb = args["adv"]; if adverb == "" then adverb = nil end | |
| local comparative = args[1]; if comparative == "" then comparative = nil end
| |
| local superlative = args[2]; if superlative == "" then superlative = nil end
| |
| | | |
| if adverb then | | data.inflections[1] = args.m |
| table.insert(data.inflections, {label = "adverb", adverb})
| | data.inflections[1].label = "marked" |
| end
| |
| | | |
| if comparative then | | if args.decl then table.insert(data.categories, "Siwa " .. args.decl .. "-declension " .. data.pos_category) end |
| table.insert(data.inflections, {label = "comparative", comparative})
| | if args.cat2 then table.insert(data.categories, "Siwa " .. args["cat2"]) end |
| end | | if args.cat3 then table.insert(data.categories, "Siwa " .. args["cat3"]) end |
| | | |
| if superlative then | | data.sort_key = args["sort"] or nil |
| table.insert(data.inflections, {label = "superlative", superlative})
| |
| end
| |
| end | | end |
|
| |
|
| function adverb(args, data)
| | pos_functions["proper nouns"] = pos_functions.nouns |
| local adjective = args["adj"]; if adjective == "" then adjective = nil end
| |
| local comparative = args[1]; if comparative == "" then comparative = nil end
| |
| local superlative = args[2]; if superlative == "" then superlative = nil end
| |
|
| |
| if adjective then
| |
| table.insert(data.inflections, {label = "adjective", adjective})
| |
| end
| |
|
| |
| if comparative then
| |
| table.insert(data.inflections, {label = "comparative", comparative})
| |
| end
| |
|
| |
| if superlative then
| |
| table.insert(data.inflections, {label = "superlative", superlative})
| |
| end
| |
| end
| |
|
| |
|
| | pos_functions["proper nouns"] = pos_functions.nouns |
|
| |
|
| | | pos_functions.verbs = function(class, args, data) |
| | | local params = { |
| -- Format a headword with transliterations
| | [1] = {required = true}, |
| local function format_headword(data)
| | [2] = {list = "inf", required = true}, |
| for i, head in ipairs(data.heads) do | | [3] = {list = "p", required = true}, |
| | | [4] = {type = "boolean"}, |
| -- Apply processing to the headword, for formatting links and such
| | ["head"] = {}, |
| if head:find("[[", nil, true) then | | ["cat2"] = {}, |
| head = {term = head, lang = data.lang}
| | ["sort"] = {}, |
| end | | ["affix"] = {list = true}, |
|
| | } |
| data.heads[i] = head
| |
| end
| |
|
| |
| return table.concat(data.heads, " <i>or</i> ")
| |
| end
| |
| | |
| -- Add links to a multiword head.
| |
| function export.add_multiword_links(head)
| |
| local function workaround_to_exclude_chars(s)
| |
| return mw.ustring.gsub(s, notWordPunc, "]]%1[[Contionary:") | |
| end
| |
|
| |
| head = "[[Contionary:"
| |
| .. mw.ustring.gsub(
| |
| head,
| |
| spacingPunctuation,
| |
| workaround_to_exclude_chars
| |
| )
| |
| .. "]]" | |
| head = mw.ustring.gsub(head, "%[%[%]%]", "")
| |
| return head
| |
| end
| |
| | |
| -- Return true if the given head is multiword according to the algorithm used
| |
| -- in full_headword().
| |
| function export.head_is_multiword(head)
| |
|
| |
| for possibleWordBreak in mw.ustring.gmatch(head, spacingPunctuation) do
| |
| if mw.ustring.find(possibleWordBreak, notWordPunc) then | |
| return true
| |
| end
| |
| end
| |
| | |
| return false
| |
| end
| |
| | |
| local function preprocess(data, postype)
| |
| if type(data.heads) ~= "table" then
| |
| data.heads = { data.heads }
| |
| end | |
| | | |
| if not data.heads or #data.heads == 0 then | | local args = require("Module:parameters").process(args, params) |
| data.heads = {""}
| | data.heads = {args["head"]} |
| end
| |
| | | |
| local default_head = mw.title.getCurrentTitle().text | | for n, kind in ipairs(mw.text.split(args[1], "/")) do |
| local unmodified_default_head = default_head
| | if kind ~= "?" then |
| | | data.inflections[n] = {nil} |
| -- Add links to multi-word page names when appropriate
| | data.inflections[n].label = verb_key[kind] |
| if export.head_is_multiword(default_head) then
| | table.insert(data.categories, "Siwa " .. verb_key[kind] .. " verbs") |
| default_head = export.add_multiword_links(default_head) | |
| end
| |
|
| |
| -- If a head is the empty string "", then replace it with the default
| |
| for i, head in ipairs(data.heads) do
| |
| if head == "" then
| |
| head = default_head
| |
| end | | end |
| data.heads[i] = head
| |
| end
| |
| end
| |
|
| |
| local function show_headword_line(data)
| |
| local namespace = mw.title.getCurrentTitle().nsText
| |
|
| |
| if not data.noposcat then
| |
| local pos_category = "[sS]iwa " .. data.pos_category
| |
| end | | end |
| | | |
| -- Preprocess | | args[2].label = "infinitive" |
| preprocess(data, postype) | | table.insert(data.inflections, args[2]) |
| | | |
| -- Format and return all the gathered information | | args[3].label = "past" |
| return
| | table.insert(data.inflections, args[3]) |
| format_headword(data) ..
| |
| format_genders(data) ..
| |
| format_inflections(data) ..
| |
| require("Module:utilities").format_categories(
| |
| tracking_categories, data.lang, data.sort_key, nil,
| |
| data.force_cat_output or test_force_categories, data.sc
| |
| )
| |
| end
| |
| | |
| function full_headword(data)
| |
| local tracking_categories = {}
| |
| | | |
| -- Were any categories specified?
| | if args[4] then table.insert(data.categories, "Siwa irregular verbs") end |
| if data.categories and #data.categories > 0 then | | if args.cat2 then table.insert(data.categories, "Siwa " .. args["cat2"]) end |
|
| |
| if not data.pos_category
| |
| and mw.ustring.find(data.categories[1], "^[sS]iwa")
| |
| then
| |
| data.pos_category = mw.ustring.gsub(data.categories[1], "^[sS]iwa ", "")
| |
| table.remove(data.categories, 1)
| |
| end
| |
| end
| |
| | | |
| if not data.pos_category then | | if args[1] == "?" or args[2] == "?" or args[3] == "?" then table.insert(data.categories, "Contionary stubs") end |
| error(
| |
| 'No valid part-of-speech categories were found in the list '
| |
| .. 'of categories passed to the function "full_headword". '
| |
| .. 'The part-of-speech category should consist of a language\'s '
| |
| .. 'canonical name plus a part of speech.'
| |
| )
| |
| end
| |
| | | |
| -- This may add more categories (e.g. gender categories), so make sure it gets | | data.sort_key = args["sort"] or nil |
| -- evaluated first.
| | data.affix = args["affix"] |
| local text = show_headword_line(data)
| |
| return
| |
| text ..
| |
| require("Module:utilities").format_categories(
| |
| data.categories, nil,
| |
| data.force_cat_output
| |
| ) ..
| |
| require("Module:utilities").format_categories(
| |
| tracking_categories, nil,
| |
| data.force_cat_output
| |
| )
| |
| end | | end |
|
| |
|
| return export | | return export |