Mòdul:ca-general
A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]
Aquest mòdul proporciona funcions generals per a la llengua catalana. Les funcions es poden invocar des d'una pàgina wiki via #invoke o des d'un altre mòdul via require.
Funcions:
ordena
Construeix una clau d'ordenació per les categories en català. Sintaxi:
{{#invoke:ca-general|ordena|<pàgina>}}
Paràmetres:
- Normalment el títol de la pàgina {{PAGENAME}}
Vegeu Viccionari:Ordenació alfabètica per l'explicació de l'ordenació en català i {{ordre}} pels detalls tècnics per aconseguir aquesta ordenació.
sil
Separa les síl·labes amb un punt volat. Sintaxi:
{{#invoke:ca-general|sil|<mot>}}
Funciona per les regles comunes de sil·labificació i per la majoria de prefixos que formen síl·laba. Comproveu que el resultat sigui correcte, especialment amb cultismes o neologismes formats amb prefixos. En la pàgina de discussió hi ha alguns casos detectats de difícil solució.
-- Funcions generals per català.
local p = {}
-- Clau d'ordenació per a categories en català
local sense_diacritics = {
["À"] = "A", ["à"] = "a",
["È"] = "E", ["è"] = "e", ["É"] = "E", ["é"] = "e",
["Í"] = "I", ["í"] = "i", ["Ï"] = "I", ["ï"] = "i",
["Ò"] = "O", ["ò"] = "o", ["Ó"] = "O", ["ó"] = "o",
["Ú"] = "U", ["ú"] = "u", ["Ü"] = "U", ["ü"] = "u",
["Ç"] = "C", ["ç"] = "c",
["·"] = ""}
local sense_signes = {
["/"] = "",
["-"] = "",
["."] = "",
-- l'espai en blanc és anterior a "!"
-- el guió baix és posterior a A-Z i al final el Mediawiki ho converteix a majúscules
[" "] = "&",
["'"] = "&"}
local ordre_accents = { -- ordre eéè simulat amb ordre Unicode eèéê
["è"] = "ê",
["ò"] = "ô"}
function p.ordena(mot)
if type(mot) == "table" then mot = mot.args[1] end -- des de plantilles via invoke o des de mòduls via require
if mot == "" or mot == nil then
mot = mw.title.getCurrentTitle().text
end
local clau -- format complet: "clau1!clau2!clau3!mot"
local clau1 -- clau primària: en minúscules i sense diacrítics ni signes
local clau2 -- clau secundària: prioritat dels diacrítics eéè
local clau3 -- clau terciària: prioritat minúscules > majúscules
-- clau quaternària: prioritat sense signes > amb signes
local mot_sense_signes = mw.ustring.gsub(mot, ".", sense_signes)
local mot_lower = mw.ustring.lower(mw.text.trim(mot_sense_signes))
clau1 = mw.ustring.gsub(mot_lower, ".", sense_diacritics)
if clau1 == mot then
return clau1
end
clau2 = mw.ustring.gsub(mot_lower, ".", ordre_accents)
clau3 = mw.ustring.gsub(mot_sense_signes, ".", sense_diacritics)
if clau1 == mot_lower then
clau = clau1 .. "!"
else
clau = clau1 .. "!" .. clau2
end
if clau3 ~= clau1 then
clau = clau .. "!" .. clau3
elseif mot_sense_signes ~= mot then
clau = clau .. "!"
end
if mot_sense_signes ~= mot then
clau = clau .."!" .. mot
end
return clau
end
function p.cat_ortografia(frame)
-- categorització per característiques ortogràfiques: invers, palíndroms, eles geminades
local pagename = mw.title.getCurrentTitle().text
local namespace = mw.title.getCurrentTitle().nsText
local ret = ""
if namespace == "" then
if not (pagename:find("^-") or pagename:find("-$")) then -- sense afixos
local mot_net = mw.ustring.lower(mw.ustring.gsub(pagename, ".", sense_signes))
mot_net = string.gsub(mot_net, " ", "")
mot_net = mw.ustring.gsub(mot_net, ".", sense_diacritics)
local mot_invers = mot_net:reverse()
if not pagename:find("[ '.]") then -- sense locucions ni abreviatures
ret = "[[Categoria:Diccionari invers en català|" .. mot_invers .. "]]"
if mw.ustring.find(pagename, "l·l") then
ret = ret .. "[[Categoria:Mots en català amb eles geminades|" .. mot_net .. "]]"
end
end
end
end
return ret
end
--[[
Sil·labificació
marcatge intern: vocals 0, obertures 1, codes 2
síl·laba: ·(1*)0(2*)·
]]
function p.sil(mot)
if type(mot) == "table" then mot = mot.args[1] end -- des de plantilles via invoke o des de mòduls via require
if mot == "" or mot == nil then
mot = mw.title.getCurrentTitle().text
end
local sil = mw.ustring.lower(mot)
-- Prefixos que trenquen regles
local initial = string.sub(sil, 1, 1)
if initial == "a" then
sil = string.gsub(sil, "^anae", "0200") -- an-
sil = string.gsub(sil, "^anafro", "020110")
sil = mw.ustring.gsub(sil, "^an[aà]l[fg]", "02021")
sil = mw.ustring.gsub(sil, "^an[aà]r([cq])", "0202%1")
sil = string.gsub(sil, "^ane([npr])", "020%1")
sil = mw.ustring.gsub(sil, "^an[uú]r", "020r")
sil = string.gsub(sil, "^autoi([mn])", "02100%1") -- auto-
elseif initial == "b" then
sil = mw.ustring.gsub(sil, "^bena(%l+è)", "1010%1")
sil = string.gsub(sil, "^bena(%l)", "1020%1") -- ben-
sil = string.gsub(sil, "^bene([ns]%l)", "1020%1")
sil = string.gsub(sil, "^bisan", "10202") -- bis-
elseif initial == "c" then
sil = string.gsub(sil, "^coin", "1002") -- co-
elseif initial == "d" then
sil = mw.ustring.gsub(sil, "^des([aeoú])", "102%1") -- des- amb excepcions des+e/i
elseif initial == "e" then
sil = string.gsub(sil, "^enanti", "010210") -- enantio-
sil = mw.ustring.gsub(sil, "^en[oò]([flt])", "010%1") -- eno-
sil = string.gsub(sil, "^enorm", "01021") --
sil = mw.ustring.gsub(sil, "^en[aoò]", "020") -- en-, excepte anteriors
sil = string.gsub(sil, "^exa([bclnrs])", "020%1") -- ex-
sil = string.gsub(sil, "^exo([rs][^cdrpqt])", "020%1")
elseif initial == "h" then
sil = string.gsub(sil, "^hiper[ae]", "101020") -- hiper-
elseif initial == "i" then
sil = string.gsub(sil, "^inaug", "01021")
sil = string.gsub(sil, "^ini([^gmn])", "010%1")
sil = string.gsub(sil, "^inocul", "01010l")
sil = mw.ustring.gsub(sil, "^in[uú]([^rst])", "010%1")
sil = mw.ustring.gsub(sil, "^in[aeèioòuú]", "020") -- in-, excepte anteriors
sil = string.gsub(sil, "^infra[iu]", "021100") -- infra-
sil = string.gsub(sil, "^inter[ao]([^p])", "021020%1") -- inter
sil = string.gsub(sil, "^interest", "02102021")
sil = string.gsub(sil, "^intra[iu]", "021100") -- intra-
elseif initial == "m" then
sil = string.gsub(sil, "^m[ai]cro[iu]", "101100") -- macro-, micro-
elseif initial == "n" then
sil = string.gsub(sil, "^nosal", "10202")
elseif initial == "p" then
sil = string.gsub(sil, "^pana([frt][rate][^a])", "1020%1") -- pan-
sil = string.gsub(sil, "^panamer", "1020101")
sil = string.gsub(sil, "^panisl", "102021")
sil = mw.ustring.gsub(sil, "^panòpt", "102021")
sil = string.gsub(sil, "^posta[bcl]([^$])", "102202%1") -- post-
sil = string.gsub(sil, "^postes([^$])", "102202%1")
sil = string.gsub(sil, "^post[io][mp]", "102202")
sil = mw.ustring.gsub(sil, "^post[^aàeèéioòóu]", "10221")
sil = string.gsub(sil, "^pr[eo]i([^x])", "1100%1") -- pre-, pro-
elseif initial == "r" then
sil = string.gsub(sil, "^rein[ae]", "10210")
sil = string.gsub(sil, "^rei([^aegx])([^$])", "100%1%2") -- re-
sil = string.gsub(sil, "^reun", "1001")
elseif initial == "s" then
sil = string.gsub(sil, "^sots[ai]", "10220") -- sots-
sil = mw.ustring.gsub(sil, "^sub([aàíour])", "102%1") -- sub-
sil = mw.ustring.gsub(sil, "^sub[eè]([^r])", "1020%1")
sil = string.gsub(sil, "^subl[iu][nt]", "102101")
elseif initial == "t" then
sil = string.gsub(sil, "^trans[aeou]", "110220") -- trans-
elseif initial == "u" then
sil = string.gsub(sil, "^ultra[iu]", "021100") -- ultra-
elseif initial == "v" then
sil = string.gsub(sil, "^vosal", "10202")
end
-- Diftongs creixents
sil = mw.ustring.gsub(sil, "[qg][uü][aàeèéiíïoòóuúü]", "110")
sil = mw.ustring.gsub(sil, "[aàeèéiíïoòóuúü][iu][aàeèéiíïoòóuúü]", "010")
sil = mw.ustring.gsub(sil, "^i[oò]ni(.)", "0010%1") -- excepció pels derivant de ió
sil = mw.ustring.gsub(sil, "^(h?)[iu][aàeèéioòóu]", "%110")
-- Sufixos i desinències amb estalvi de dièresi
sil = string.gsub(sil, "[aeou]ir$", "002") -- infinitius -ir
sil = string.gsub(sil, "[aeou]int$", "0022") -- gerundis
sil = mw.ustring.gsub(sil, "[aeou]ir[éà]$", "0010") -- futur
sil = mw.ustring.gsub(sil, "[aeou]iràs$", "00102") -- futur
sil = string.gsub(sil, "[aeou]ire[mu]$", "00102") -- futur
sil = string.gsub(sil, "[aeou]iran$", "00102") -- futur
sil = string.gsub(sil, "[aeou]iria$", "00100") -- condicional
sil = string.gsub(sil, "[aeou]irie[sn]$", "001002") -- condicional
sil = string.gsub(sil, "[0iu]um(s?)$", "002%1") -- llatinismes
sil = string.gsub(sil, "[0aeiou]isme(s?)$", "00210%1") -- -isme
sil = string.gsub(sil, "[0aeiou]ist([ae]s?)$", "0021%1") -- -ista
-- Diftongs decreixents
sil = mw.ustring.gsub(sil, "[0aàeèéioòóu][u]", "02") -- inclou triftongs: creixent 10 + decreixent 2
sil = mw.ustring.gsub(sil, "[0aàeèéoòóuúü][i]", "02")
sil = string.gsub(sil, "ii$", "02") -- només final de mot, no amb prefix
-- Nuclis vocàlics
sil = mw.ustring.gsub(sil, "[aàeèéiíïoòóuúü]", "0")
-- Codes finals
sil = mw.ustring.gsub(sil, "%l$", "2")
sil = mw.ustring.gsub(sil, "%l2$", "22")
sil = mw.ustring.gsub(sil, "%l22$", "222")
-- Obertures
sil = mw.ustring.gsub(sil, "^%l", "1")
sil = mw.ustring.gsub(sil, "^1%l", "11")
sil = mw.ustring.gsub(sil, "^11%l", "111")
sil = string.gsub(sil, "ll0", "110")
sil = string.gsub(sil, "ny0", "110")
sil = string.gsub(sil, "kh0", "110")
sil = string.gsub(sil, "[ptcfbdg]r", "11")
sil = string.gsub(sil, "[pcfbg]l", "11")
sil = mw.ustring.gsub(sil, "%l0", "10")
sil = mw.ustring.gsub(sil, "[çñ]0", "10") -- %l (all ASCII lowercase letters) no inclou ç, ñ
-- Codes interiors
sil = mw.ustring.gsub(sil, "[ps][%l1]", "21")
sil = mw.ustring.gsub(sil, "%l([12])", "2%1")
-- Separació de síl·labes
local anterior, actual = "", ""
local mot_sep = {}
for i = 1, mw.ustring.len(mot) do
actual = mw.ustring.sub(sil, i, i)
if (actual == "0" or actual == "1") and (anterior == "0" or anterior == "2") then
table.insert(mot_sep, "·")
end
if actual == "-" then
table.insert(mot_sep, "·")
else
table.insert(mot_sep, mw.ustring.sub(mot, i, i))
end
anterior = actual
end
return table.concat(mot_sep)
end
function p.silTemplate(frame)
local word = frame:getParent().args[1]
local sil
if word then
word = mw.text.trim(word)
local no_ll_gem = mw.ustring.gsub(word, "l·l", "ll")
if mw.ustring.find(no_ll_gem, "·") then
sil = word
end
else
word = mw.title.getCurrentTitle().text
end
if word:find("[ '.]") or word:sub(1, 1) == "-" or word:sub(-1) == "-" then
return -- sense locucions, abreviatures ni afixos
end
if sil == nil then
sil = p.sil(word)
end
local lang = {code = "ca", name = "català", sc = "Latn"}
return require('Module:síl·labes').format_hyphenations{['hyphs'] = {{sil}}, ['lang'] = lang}
end
--[=[
Determina si cal apostrofar (true/false) l’article masculí o contraccions de preposicions (del, al)
Limitacions, en general no necessàries per noms de llengua:
els casos previstos de h consonant són limitats
no analitza el cas l’s+consonant
no preveu si hi ha caràcters de puntuació inicial (l’«apòstrof», l’[[enllaç]])
no apostrofa davant números (l’1, l’11) ni sigles (l’FMI)
--]=]
function p.calApostrofar(text)
local apostrophize = {
["hakk"]=false, ["haus"]=false, ["hawa"]=false, -- h consonant (hakka, haussa, hawaià)
["hia"]=false, ["hie"]=false, ["hio"]=false, ["hui"]=false, -- vocal consonant
["uig"]=true, ["uix"]=true, -- excepció per u vocal
["ha"]=true, ["he"]=true, ["hi"]=true, ["hí"]=true, ["ho"]=true, ["hu"]=true, ["hy"]=true, -- excepte anteriors
["ia"]=false, ["ià"]=false, ["ie"]=false, ["io"]=false, ["iu"]=false, -- i consonant
["ua"]=false, ["ue"]=false, ["ui"]=false, ["uí"]=false, ["uï"]=false, ["uo"]=false, -- u consonant
["ya"]=false, ["ye"]=false, ["yi"]=false, ["yo"]=false, ["yu"]=false, -- y consonant
["a"]=true, ["à"]=true,
["e"]=true, ["è"]=true, ["é"]=true,
["i"]=true, ["í"]=true, ["ï"]=true, ["y"]=true,
["o"]=true, ["ò"]=true, ["ó"]=true,
["u"]=true, ["ú"]=true, ["ü"]=true -- excepte anteriors
}
for i = 4, 1, -1 do
local apostrophized = apostrophize[mw.ustring.sub(text, 1, i)]
if apostrophized ~= nil then
return true
end
end
return false
end
-- Adds a particle, usually el/al/del, with apostrophe when necessary
function p.addParticle(part, name)
if string.sub(part, -1) == "l" and p.calApostrofar(name) then
if part == "el" then
return "l'" .. name
end
return string.sub(part, 1, -2) .. " l'" .. name
end
return part .. " " .. name
end
return p