Mòdul:enllaç
A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]
Aquest mòdul proporciona diferents funcions d'utilitat per crear i processar enllaços de wikitext en el Viccionari.
full_link
modificafull_link(data, face, allowSelfLink, dontLinkRecons)
Crea un enllaç complet, a l'estil de {{e}} o {{m}}. El primer paràmetre és una taula amb les dades del terme: term (nom de la pàgina), alt (nom alternatiu a mostrar), langcode (codi de llengua), sc (sistema d'escriptura), tr (transcripció), gloss (glossa o traducció). Els següents paràmetres són: tipus de lletra, permetre un enllaç a la mateixa pàgina, permetre un enllaç a reconstruccions. Tots els paràmetres poden ser nil
, però es mostrarà un error si no hi ha cap terme, alt o transliteració.
- Si no es proporciona el sistema d'escriptura, en posa un per defecte per la llengua.
- Crida
language_link
amb el terme per treure diacrítics en el nom de pàgina, per les llengües que ho requereixin, i per processar els enllaços inclosos convertint-los en enllaços a la secció de llengua. - Crida
tag_text
per afegir les etiquetes apropiades de llengua i sistema d'escriptura. - Afegeix les anotacions (transliteració, gènere, etc.) després de l'enllaç.
format_link_annotations
modificaformat_link_annotations(terminfo)
Formata anotacions que es mostren amb l'enllaç. Les anotacions són informació addicional que inclou coses com el gènere, transliteració, traducció, etc. El paràmetre és una taula amb alguna de les següents claus:
genders
- Taula amb una llista d'especificacions de gènere amb el format indicat a Mòdul:categoria gramatical.
tr
- Transliteració.
gloss
- Traducció o informació descriptiva.
pos
- Categoria lèxica (part of speech).
lit
- Significat literal, si no es correspon amb l'accepció.
Tots els valors anteriors es poden ometre en el paràmetre info
. Si es proporciona una taula buida (sense cap anotació), llavors retorna una cadena buida.
language_link
modificalanguage_link(terminfo, allowSelfLink)
Crea un enllaç bàsic a la secció de llengua (com ara == Català ==), sense altres anotacions que afegeix tag_text
.
Accepta els següents paràmetres:
terminfo
- Taula amb la informació indicada a continuació (term, alt, langcode).
terminfo.term
- El text a enllaçar. Generalment és el nom d'una pàgina. La cadena pot incloure enllaços wiki. S'afegirà la secció de llengua a cada enllaç.
terminfo.alt
- Text alternatiu a mostrar en l'enllaç, si és diferent de la pàgina enllaçada. Si és igual a
nil
, llavors s'utilitza el paràmetreterminfo.term
. Siterminfo.term
conté enllaços wiki, aquest paràmetre és ignorat i no té cap efecte. terminfo.langcode
- El codi de llengua a afegir en l'enllaç.
allowSelfLink
- Amb valor
true
enllaça a una secció de la mateixa pàgina. Per defecte ésfalse
.
sense_diacritics
modificasense_diacritics(lang, text)
Treu determinats diacrítics que no són apropiats pel títol de pàgina seguint les convencions d'una determinada llengua. Per exemple, en llatí s'inclouen per marcar la pronúncia però no en la forma gràfica del mot.
remove_links
modificaremove_links(text)
Substitueix tots els [[enllaços]] pel títol enllaçat com a text simple. Aquesta funció es pot cridar tant des d'una plantilla com des d'un altre mòdul.
local p = {}
local m_languages = require("Module:llengua")
function p.getLinkPage(target, lang)
-- If the link contains unexpanded template parameters, then don't create a link.
if not target or target:find("{{{") then
return nil
end
if target:sub(1, 1) == ":" or target:sub(1, 2) == "w:" or target:sub(1, 10) == "wikipedia:" then
return target
end
if lang.code == "und" then
return nil
end
-- Remove diacritics from the page name
target = p.sense_diacritics(lang.code, target)
-- Link to appendix for terms in appendix-only languages
if lang.type == "annex" or mw.ustring.sub(target, 1, 1) == "√" then
local langname = mw.language.new('ca'):ucfirst(lang.name)
if lang.type == "annex" then
target = "Viccionari:" .. langname .. "/" .. target
else
target = "Viccionari:" .. langname .. "/arrel/" .. mw.ustring.sub(target, 2)
end
elseif (target:sub(1, 1) == "*" and #target > 1) then
return nil
end
return target
end
-- Make a language-specific link from given link's parts
local function makeLangLink(link, lang, id, allowSelfLink)
-- If there is no display form, then create a default one
if not link.display then
link.display = link.target
-- Strip the prefix from the displayed form
-- TODO: other interwiki links?
if link.display:find("^:") then
link.display = link.display:gsub("^:", "")
elseif link.display:find("^w:") then
link.display = link.display:gsub("^w:", "")
elseif link.display:find("^wikipedia:") then
link.display = link.display:gsub("^wikipedia:", "")
end
end
-- Process the target
link.target = p.getLinkPage(link.target, lang)
if not link.target then
return link.display
end
-- If the target is the same as the current page, then return a "self-link" like the software does
if not allowSelfLink and not id and (link.target == mw.title.getCurrentTitle().prefixedText or link.target == ":" .. mw.title.getCurrentTitle().prefixedText) then
return "<strong class=\"selflink\">" .. link.display .. "</strong>"
end
-- Add fragment
-- Do not add a section link to "Undetermined", as such sections do not exist and are invalid.
if not (link.target:find("^w:") or link.target:find("^wikipedia:")) then
if not link.fragment and lang.code ~= "xx" then
if id then
link.fragment = lang.code .. "-" .. id
else
link.fragment = mw.language.getContentLanguage():ucfirst(lang.name)
end
end
end
return "[[" .. link.target .. (link.fragment and "#" .. link.fragment or "") .. "|" .. link.display .. "]]"
end
-- Split a link into its parts
local function parseLink(linktext)
local link = {target = linktext}
local found, _, first, second
found, _, first, second = mw.ustring.find(link.target, "^([^|]+)|(.+)$")
if found then
link.target = first
link.display = second
else
link.display = link.target
end
found, _, first, second = mw.ustring.find(link.target, "^(.+)#(.+)$")
if found then
link.target = first
link.fragment = second
end
return link
end
-- Format the annotations (things following the linked term)
function p.format_link_annotations(data, face)
local ret = {}
-- Interwiki link
if data.interwiki then
table.insert(ret, data.interwiki)
end
-- Genders
if data.genders and #data.genders > 0 then
local m_gen = require("Module:categoria gramatical")
table.insert(ret, " " .. m_gen.format_list(data.genders, data.lang.code))
end
local annotations = {}
-- Transliteration
if data.tr then
table.insert(annotations, "<span lang=\"\" style=\"font-style: italic\">" .. data.tr .. "</span>")
end
-- Gloss/translation
if data.gloss then
table.insert(annotations, "<span class=\"mention-gloss-double-quote\">«</span><span class=\"mention-gloss\">" .. data.gloss .. "</span><span class=\"mention-gloss-double-quote\">»</span>")
end
-- Part of speech
if data.pos then
table.insert(annotations, data.pos)
end
-- Literal/sum-of-parts meaning
if data.lit then
table.insert(annotations, "literalment <span class=\"mention-gloss-double-quote\">«</span><span class=\"mention-gloss\">" .. data.lit .. "</span><span class=\"mention-gloss-double-quote\">»</span>")
end
if #annotations > 0 then
table.insert(ret, " ‎(" .. table.concat(annotations, ", ") .. ")")
end
return table.concat(ret)
end
-- A version of {{l}} or {{m}} that can be called from other modules too
function p.full_link(data, face, allowSelfLink, dontLinkRecons)
-- Create the link
local link = ""
-- Is there any text to show?
if (data.term or data.alt) then
-- Try to detect the script if it was not provided
if not data.lang.sc then
data.lang.sc = m_languages.script(data.lang.code)
end
-- Only make a link if the term has been given, otherwise just show the alt text without a link
link = p.tag_text(data.term and p.language_link(data, allowSelfLink, dontLinkRecons) or data.alt, data.lang.code, data.lang.sc, face, data.genders)
else
-- No term to show.
if not data.tr or data.tr == "-" then
-- No link to show, and no transliteration either. Show a term request.
link = "<small>[Terme?]</small>"
end
end
local mantrFix, redtrFix
local manual_tr = ""
if data.tr == "" or data.tr == "-" then
data.tr = nil
elseif data.tr == nil and (data.term or data.alt) and not data.lang.sc:find("Latn", nil, true) then
-- Try to generate a transliteration if necessary
data.tr = m_languages.trans(data.lang.code, p.remove_links(data.term or data.alt))
end
return link .. p.format_link_annotations(data, face)
end
-- Creates a basic wikilink to the given term. If the text already contains
-- links, these are replaced with links to the correct section.
function p.language_link(data, allowSelfLink, dontLinkRecons)
local text = data.term
-- If the text begins with * and another character,
-- then act as if each link begins with *
local allReconstructed = false
if text:find("^*.") then
allReconstructed = true
end
-- Do we have embedded wikilinks?
if text:find("[[", nil, true) then
text = mw.ustring.gsub(text, "%[%[([^%]]+)%]%]",
function(linktext)
local link = parseLink(linktext)
if allReconstructed then
link.target = "*" .. link.target
end
return makeLangLink(link, data.lang, data.id, allowSelfLink, dontLinkRecons)
end
)
-- Remove the extra * at the beginning if it's immediately followed
-- by a link whose display begins with * too
if allReconstructed then
text = mw.ustring.gsub(text, "^%*%[%[(.-)|%*", "[[%1|*")
end
else
-- There is no embedded wikilink, make a link using the parameters.
text = makeLangLink({target = text, display = data.alt}, data.lang, data.id, allowSelfLink, dontLinkRecons)
end
return text
end
-- Strips all square brackets out or replaces them.
function p.remove_links(text)
if type(text) == "table" then text = text.args[1] end; if not text then text = "" end
text = text:gsub("%[%[Categoria:[^|%]]-|?[^|%]]-%]%]", "")
text = text:gsub("%[%[[^|%]]-|", "")
text = text:gsub("%[%[", "")
text = text:gsub("%]%]", "")
return text
end
-- original de Module:script utilities
-- Wrap text in the appropriate HTML tags with language and script class.
function p.tag_text(text, langcode, sc, face, genders)
if sc == nil then
sc = ""
end
-- Add a script wrapper
if face == "terme" or face == "cursiva" then
return '<i class="' .. sc .. ' mention" lang="' .. langcode .. '">' .. text .. '</i>'
elseif face == "lema" then
return '<strong class="' .. sc .. ' headword" lang="' .. langcode .. '">' .. text .. '</strong>'
elseif face == "negreta" then
return '<b class="' .. sc .. '" lang="' .. langcode .. '">' .. text .. '</b>'
elseif face == "trad" then
local ret = '<span class="form-of trad-form-of lang-' .. langcode
if genders and genders[1] then
ret = ret .. ' gender-' .. genders[1]:gsub("%-", "")
end
return ret .. ' ' .. sc .. '" lang="' .. langcode .. '">' .. text .. '</span>'
elseif face == nil then
return '<span class="' .. sc .. '" lang="' .. langcode .. '">' .. text .. '</span>'
else
error("El tipus no és vàlid: \"" .. face .. "\".")
end
end
-- Traiem màcrons i altres diacrítics opcionals en algunes llengues.
-- TODO: afegir entry_name a taula lang (Module:languages#Language:makeEntryName)
-- TODO: move to languages
function p.sense_diacritics(langcode, text)
-- Remove punctuation
text = mw.ustring.gsub(text, "[؟?!]$", "")
-- Caràcters descomposats http://www.gymel.com/charsets/ANSEL.html
local strip = {
ang = "[\204\132\204\135]", -- macron and above dot
ar = "[\217\139\217\140\217\141\217\142\217\143\217\144\217\145\217\146]",
fa = "[\217\142\217\143\217\144\217\145\217\146]",
ur = "[\217\139\217\140\217\141\217\142\217\143\217\144\217\145\217\146]",
chl = "[\204\132]", -- acute accent
he = "[\214\176\214\177\214\178\214\179\214\180\214\181\214\182\214\183\214\184\214\185\214\186\214\187\214\188\214\189\214\191\215\129\215\130]",
hr = "[\204\143\204\128\204\145\204\129\204\132]",
la = "[\204\132\204\134]", -- màcron i breu
lt = "[\204\128\204\129\204\131]",
nci = "[\204\132]", -- macron
ru = "[\204\128\204\129]",
uk = "[\204\128\204\129]",
be = "[\204\128\204\129]",
bg = "[\204\128\204\129]",
mk = "[\204\128\204\129]",
sh = "[\204\143\204\128\204\145\204\129\204\132]",
sr = "[\204\143\204\128\204\145\204\129\204\132]",
sl = "[\204\163\204\129\204\128\204\130\204\145\204\143]",
tr = "[\204\130]",
zu = "^-" -- initial hyphen
}
if strip[langcode] then
text = mw.ustring.toNFD(text)
text = mw.ustring.gsub(text, strip[langcode], "")
text = mw.ustring.toNFC(text)
elseif langcode == "grc" then
local RSQUO = mw.ustring.char(0x2019)
local PSILI = mw.ustring.char(0x1FBD)
local CORONIS = mw.ustring.char(0x1FBF)
local MACRON = mw.ustring.char(0x0304)
local BREVE = mw.ustring.char(0x0306)
local UNDERTIE = mw.ustring.char(0x035C) -- actually "combining double breve below"
local from = {"[ᾸᾹ]", "[ᾰᾱ]", "[ῘῙ]", "[ῐῑ]", "[ῨῩ]", "[ῠῡ]", "µ", "["..RSQUO..PSILI..CORONIS.."]", "["..MACRON..BREVE..UNDERTIE.."]" }
local to = {"Α", "α", "Ι", "ι", "Υ", "υ", "μ", "'", ""}
for i, fr_i in ipairs(from) do
local to_i = to[i] or ""
text = mw.ustring.gsub(text, fr_i, to_i)
end
end
return text
end
return p