Mòdul:enllaç

De Viccionari
Salta a la navegació Salta a la cerca
Icona de documentació de mòdul Documentació del mòdul[mostra] [modifica] [refresca]

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[modifica]

full_link(term, alt, langcode, sc, face, id, annotations, curtitle)

Crea un enllaç complet, a l'estil de {{e}} o {{terme}}. Els paràmetres són: terme (nom de la pàgina), nom alternatiu a mostrar, codi de llengua, sistema d'escriptura, tipus de lletra, identificador de sentit, taula d'anotacions (vegeu format_link_annotations). Tots els paràmetres poden ser nil excepte per les anotacions, però es mostrarà un error si no hi ha cap terme, alt o transliteració (en les anotacions).

  • 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[modifica]

format_link_annotations(langcode, info)

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 primer paràmetre és el codi de llengua i el segon é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[modifica]

language_link(text, alt, langcode, id, curtitle)

Crea un enllaç bàsic a la secció de llengua, sense les etiquetes que afegeix tag_text.

Accepta els següents paràmetres:

text
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ç.
alt
Text alternatiu a mostrar en l'enllaç, si és diferent a la pàgina enllaçada. Si és igual a nil, llavors s'utilitza el paràmetre text. Si text conté enllaços wiki, aquest paràmetre és ignorat i no té cap efecte.
langcode
El codi de llengua a afegir en l'enllaç.
id
Identificador de context, no implementat actualment.
curtitle
Títol actual per evitar enllaçar a la pròpia pàgina. S'utilitza per exemple en taules de flexió.

sense_diacritics[modifica]

sense_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[modifica]

remove_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 export = {}

function export.getLinkPage(target, langcode)
	-- If the link contains unexpanded template parameters, then don't create a link.
	if target:find("{{{", nil, true) then
		return nil
	end
	
	if target:find("^:") or target:find("^w:") or target:find("^wikipedia:") then
		return target
	end
	
	-- Remove diacritics from the page name
	-- was: target = lang:makeEntryName(target)
	target = export.sense_diacritics(langcode, target)
	
	-- Sense enllaç amb termes reconstruïts o llengua indeterminada
	if target:find("^*.") or langcode == "und" then
		return nil
	end
	
	return target
end
	
-- Make a language-specific link from given link's parts
local function makeLangLink(link, langcode, 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 = export.getLinkPage(link.target, langcode)
	
	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 langcode ~= "xx" then
			if id then
				link.fragment = langcode .. "-" .. id
			else
				link.fragment = langcode
			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

-- Creates a basic wikilink to the given term. If the text already contains
-- links, these are replaced with links to the correct section.
local function language_link2(terminfo, allowSelfLink, dontLinkRecons)
	local text = terminfo.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, terminfo.langcode, terminfo.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 = terminfo.alt}, terminfo.langcode, terminfo.id, allowSelfLink, dontLinkRecons)
	end
	
	return text
end

-- Format the annotations (things following the linked term)
function export.format_link_annotations(terminfo, face)
	local ret = ""
	
	-- Interwiki link
	if terminfo.interwiki then
		ret = ret .. terminfo.interwiki
	end
	
	-- Genders
	if terminfo.genders and #terminfo.genders > 0 then
		local gen = require("Mòdul:categoria gramatical")
		ret = ret .. "&nbsp;" .. gen.format_list(terminfo.genders, terminfo.langcode)
	end
	
	local glosses = {}
	
	-- Transliteration
	if terminfo.tr then
		table.insert(glosses, "<span lang=\"\" style=\"font-style: italic\">" .. terminfo.tr .. "</span>")
	end
	
	-- Gloss/translation
	if terminfo.gloss then
		table.insert(glosses, "<span class=\"mention-gloss-double-quote\">«</span><span class=\"mention-gloss\">" .. terminfo.gloss .. "</span><span class=\"mention-gloss-double-quote\">»</span>")
	end
	
	-- Part of speech
	if terminfo.pos then
		table.insert(glosses, terminfo.pos)
	end
	
	-- Literal/sum-of-parts meaning
	if terminfo.lit then
		table.insert(glosses, "literalment <span class=\"mention-gloss-double-quote\">«</span><span class=\"mention-gloss\">" .. terminfo.lit .. "</span><span class=\"mention-gloss-double-quote\">»</span>")
	end
	
	if #glosses > 0 then
		ret = ret .. " &lrm;(" .. table.concat(glosses, ", ") .. ")"
	end
	
	return ret
end

-- A version of {{l}} or {{m}} that can be called from other modules too
function export.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.sc then
			data.sc = require("Module:llengua").script(data.langcode)
		end
		
		-- Only make a link if the term has been given, otherwise just show the alt text without a link
		link = export.tag_text(data.term and language_link2(data, allowSelfLink, dontLinkRecons) or data.alt, data.langcode, data.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.sc:find("Latn", nil, true) then
		-- Try to generate a transliteration if necessary
		data.tr = require("Mòdul:llengua").trans(data.langcode, export.remove_links(data.term or data.alt))
	end
	
	return link .. export.format_link_annotations(data, face)
end

function export.language_link(text, alt, langcode, id, allowSelfLink)
	local terminfo = text
	
	if type(terminfo) == "table" then
		allowSelfLink = alt
	else
		terminfo = {term = text, alt = alt, langcode = langcode, id = id}
		require('Mòdul:utilitats').track("enllaç/sense taula")
	end
	
	return language_link2(terminfo, allowSelfLink)
end

-- Strips all square brackets out or replaces them.
function export.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 export.tag_text(text, lang, sc, face, genders)
	-- Add a script wrapper
	if face == "terme" or face == "cursiva" then
		return '<i class="' .. sc .. ' mention" lang="' .. lang .. '">' .. text .. '</i>'
	elseif face == "lema" then
		return '<strong class="' .. sc .. ' headword" lang="' .. lang .. '">' .. text .. '</strong>'
	elseif face == "negreta" then
		return '<b class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</b>'
	elseif face == "trad" then
		ret = '<span class="form-of trad-form-of lang-' .. lang
		if genders and genders[1] then
			ret = ret .. ' gender-' .. genders[1]:gsub("%-", "")
		end
		return ret .. ' ' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
	elseif face == nil then
		return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. 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: substituir per Module:languages#Language:makeEntryName
function export.sense_diacritics(lang, 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[lang] then
		text = mw.ustring.toNFD(text)
		text = mw.ustring.gsub(text, strip[lang], "")
		text = mw.ustring.toNFC(text)
	elseif lang == "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 export