Modul:category tree/poscatboiler/data/characters
Pendokumenan untuk modul ini boleh diciptakan di Modul:category tree/poscatboiler/data/characters/doc
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local ulen = mw.ustring.len
local uupper = mw.ustring.upper
local ulower = mw.ustring.lower
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local function track(page)
require("Module:debug/track")("poscatboiler-characters/" .. page)
return true
end
-----------------------------------------------------------------------------
-- --
-- KATEGORI MENTAH --
-- --
-----------------------------------------------------------------------------
raw_categories["Kata mengikut subkategori aksara individunya mengikut bahasa"] = {
description = "Kategori payung meliputi kata yang dikategorikan oleh aksara yang tidak biasa terkandung di dalamnya.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Metakategori payung",
{name = "kata mengikut aksara individu", is_label = true, sort = " "},
},
}
-- FIXME! This should probably be deleted.
raw_categories["Huruf"] = {
description = "Kategori yang menspesifik setiap huruf, mengandungi bahasa-bahasa yang menggunakan huruf-huruf tersebut.",
additional = "{{{umbrella_meta}}}",
parents = {
"Asas",
},
}
-----------------------------------------------------------------------------
-- --
-- PENGELOLA --
-- --
-----------------------------------------------------------------------------
-- If char is a combining character, returns a version with a dotted circle before it.
function add_dotted_circle(char, combining)
return combining and "◌" .. char or char
end
table.insert(handlers, function(data)
-- NOTE: The "character" in the title may actually be a description such as
-- "gershayim". In that case, char= is specified as a parameter indicating the
-- actual character.
local titlechar = data.label:match("^kata dieja dengan (.+)$")
if not titlechar then
return nil
end
local ja_ryu = data.lang and (data.lang:getFamilyCode() == "jpx" or data.lang:getFamilyCode() == "jpx-ryu")
-- If Japanese or Ryukyuan, only fire on a single kanji character.
if ja_ryu and (titlechar:find("[A-Za-z]") or ulen(titlechar) > 1) then
return nil
end
local params = {
["char"] = {},
["sort"] = {},
-- Not sure what used to be done with the following parameters.
["context"] = {},
["context2"] = {},
}
local args = require("Module:parameters").process(data.args, params)
if args.context or args.context2 then
track("terms-spelled-with-context")
end
if titlechar == "numbers" then
local sortkey = args.sort or "#"
return {
description = "Istilah {{{langname}}} dieja dengan satu atau lebih angka nombor.",
parents = {{name = "istilah berdasarkan huruf individu", sort = sortkey }},
breadcrumb = "nombor",
umbrella = {
breadcrumb = "nombor",
parents = {{name = "Istilah berdasarkan subkategori huruf individu dari bahasa", sort = " " .. sortkey }}
},
}, true
end
local char = args.char or titlechar
local titlechar_is_desc = args.char and args.char ~= titlechar
if titlechar_is_desc then
track("titlechar_is_desc")
end
local lang = data.lang or require("Module:languages").getByCode("mul")
local combining = ulen(char) == 1 and require("Module:Unicode_data").is_combining(mw.ustring.codepoint(char))
local specials = {["ß"] = "ẞ", ["ͅ"] = "ͅ"}
local upper = mw.ustring.toNFD(char)
:gsub("[%z\1-\127\194-\244][\128-\191]*", function(m)
return specials[m] or mw.ustring.upper(m)
end)
upper = mw.ustring.toNFC(upper)
if char ~= upper and ulen(char) == 1 then
-- We want uppercase characters; but unless we're careful, we run into an issue with
-- [[Category:English terms spelled with ı]] due to the weird behavior of this character,
-- which has standard I as its uppercase equivalent.
local standard_chars = lang:getStandardCharacters()
if data.lang and standard_chars then
local function err()
error("Tajuk kategori patut menggunakan aksara huruf besar: '" .. data.label .. "'", 2)
end
if data.lang:getCode() ~= "hi" and data.lang:getCode() ~= "lo" then
if not rfind(standard_chars, upper) then
err()
end
elseif not rfind(upper, "[" .. standard_chars .. "]") then
err()
end
end
end
-- Compute description.
-- If the letter has a lowercase form, show it.
local character = require("Module:links").full_link(
{
term = char,
alt = combining and add_dotted_circle(char, true) or nil,
lang = lang,
tr = combining and "-" or nil,
},
"term"
)
if ulower(char) ~= char then
character = "huruf besar " .. character .. " atau huruf kecil " ..
require("Module:links").full_link(
{
term = ulower(char),
lang = lang
},
"term"
)
end
if titlechar_is_desc then
character = character .. " (" .. titlechar .. ")"
end
local description = "Kata bahasa {{{langname}}} yang dieja dengan " .. character .. "."
-- Set tagged character for displaytitle and breadcrumb.
local tagged_titlechar = not titlechar_is_desc and
require("Module:script utilities").tag_text(titlechar, lang, nil, "term") or nil
local tagged_char = titlechar_is_desc and titlechar or
require("Module:script utilities").tag_text(add_dotted_circle(char, combining), lang, nil, "term")
-- Compute sort key.
local sortkey =
args.sort or
(lang:makeSortKey(char))
if sortkey == "" then
sortkey = char
end
return {
description = description,
additional = "Sila ambil maklum bahawa kategori kepada bentuk istilah '''''LANG dieja dengan CHAR''''' adalah huruf disengajakan bukannya "
.. "sebahagian dari repertoir standard sesuatu bahasa (contohnya huruf Sirilik dalam bahasa Inggeris atau huruf Latin dalam bahasa Rusia).",
displaytitle = not titlechar_is_desc and "Kata bahasa {{{langname}}} yang dieja dengan " .. tagged_titlechar or nil,
parents = {{name = "kata mengikut aksara individunya", sort = sortkey }},
breadcrumb = tagged_char,
umbrella = not ja_ryu and {
displaytitle = not titlechar_is_desc and "Kata dieja dengan " .. tagged_titlechar .. " mengikut bahasa" or nil,
breadcrumb = tagged_char,
parents = {{name = "Kata mengikut subkategori aksara individunya mengikut bahasa", sort = " " .. sortkey }}
} or false,
}, true
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Special-cased categories that we allow, for Turkish letters.
local letter_cat_allow_list = require("Module:table/listToSet") {
"İi",
}
table.insert(raw_handlers, function(data)
-- Only recognize cases consisting of an uppercase letter followed by the
-- corresponding lowercase letter, either as the entire category name or
-- followed by a colon (for cases like [[Category:Gg: ⠛]]). Cases that
-- don't fit this profile (e.g. for Turkish [[Category:İi]] and
-- [[Category:Iı]]) need to call {{letter cat}} directly. Formerly this
-- handler was much less restrictive and would fire on categories named
-- [[Category:zh:]], [[Category:RFQ]], etc.
local upper, lower = rmatch(data.category, "^(%u)(%l)%f[:%z]")
if not upper or not letter_cat_allow_list[data.category] and lower:uupper() ~= upper then
return nil
end
return {
description = ('Bahasa yang menggunakan huruf besar "%s" (padanan huruf kecil "%s").'):format(upper, lower),
parents = {"Huruf"},
}
end)
return {RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}