Modulis:links
Izskats
Šī moduļa dokumentāciju var izveidot Modulis:links/doc lapā
local export = {}
local gsub = mw.ustring.gsub
--TODO: move to [[Module:languages]]
local override_translit = {
["ab"] = true,
["abq"] = true,
["ady"] = true,
["am"] = true,
["av"] = true,
["axm"] = true,
["ba"] = true,
["bo"] = true,
["bua"] = true,
["ce"] = true,
["chm"] = true,
["cv"] = true,
["dar"] = true,
["dv"] = true,
["dz"] = true,
["el"] = true,
["got"] = true,
["grc"] = true,
["hy"] = true,
["inh"] = true,
["iu"] = true,
["ka"] = true,
["kk"] = true,
--["ko"] = true,
["kbd"] = true,
["kca"] = true,
["kjh"] = true,
["kn"] = true,
["koi"] = true,
["kpv"] = true,
["ky"] = true,
["kv"] = true,
["lo"] = true,
["lbe"] = true,
["lez"] = true,
["lzz"] = true,
["mdf"] = true,
["ml"] = true,
["mn"] = true,
["my"] = true,
["myv"] = true,
["oge"] = true,
["os"] = true,
["sa"] = true,
["sah"] = true,
["si"] = true,
["sva"] = true,
["ta"] = true,
["tab"] = true,
["te"] = true,
["ti"] = true,
["tg"] = true,
["tt"] = true,
["tyv"] = true,
["ug"] = true,
["udm"] = true,
["xal"] = true,
["xcl"] = true,
["xmf"] = true,
}
local ignore_cap = {
["ko"] = true,
}
-- A version of {{l}} or {{term}} that can be called from other modules too
function export.full_link(term, alt, lang, sc, face, id, annotations, curtitle)
annotations = annotations or {}
-- Create the link
local link = ""
local m_utilities = require("Module:utilities")
local m_scriptutils = require("Module:script utilities")
-- Is there any text to show?
if (term or alt) then
-- Try to detect the script if it was not provided
if not sc then
sc = require("Module:scripts").findBestScript(alt or term, lang)
end
-- Only make a link if the term has been given, otherwise just show the alt text without a link
link = m_scriptutils.tag_text(term and export.language_link(term, alt, lang, id, curtitle) or alt, lang, sc, face)
else
-- No term to show.
-- Is there at least a transliteration we can work from?
link = m_scriptutils.request_script(lang, sc)
if link == "" or not annotations["tr"] or annotations["tr"] == "-" then
-- No link to show, and no transliteration either. Just show an error because can't really do anything now.
error("At least one of the following should be provided: the term, alternative display, transliteration")
end
end
local mantrFix, redtrFix
local manual_tr = ""
if annotations["tr"] == "" or annotations["tr"] == "-" then
annotations["tr"] = nil
elseif (term or alt) and not ((sc:getCode():find("Latn", nil, true)) or sc:getCode() == "Latinx") and (not annotations["tr"] or override_translit[lang:getCode()]) then
-- Try to generate a transliteration if necessary
local automated_tr
automated_tr = lang:transliterate(export.remove_links(alt or term), sc)
if automated_tr then
if annotations["tr"] ~= automated_tr then
if annotations["tr"] then
manual_tr = annotations["tr"]
mantrFix = true
end
annotations["tr"] = automated_tr
else
redtrFix = true
end
end
end
return link .. format_link_annotations(lang, annotations, face)
.. (mantrFix and "[[Category:Terms with manual transliterations different from the automated ones]][[Category:Terms with manual transliterations different from the automated ones/" .. lang:getCode() .. "]]" or "")
.. (redtrFix and "[[Category:Terms with redundant transliterations]][[Category:Terms with redundant transliterations/" .. lang:getCode() .. "]]" or "")
end
-- Format the annotations (things following the linked term)
function format_link_annotations(lang, annotations, face)
local ret = ""
-- Interwiki link
if annotations["interwiki"] then
ret = ret .. annotations["interwiki"]
end
-- Genders
if annotations["genders"] and #annotations["genders"] > 0 then
local gen = require("Module:gender and number")
ret = ret .. " " .. gen.format_list(annotations["genders"], lang)
end
local glosses = {}
-- Transliteration
if annotations["tr"] then
if face == "term" then
table.insert(glosses, "<span lang=\"\" class=\"tr mention-tr\">" .. annotations["tr"] .. "</span>")
else
table.insert(glosses, "<span lang=\"\" class=\"tr\">" .. annotations["tr"] .. "</span>")
end
end
-- Gloss/translation
if annotations["gloss"] then
table.insert(glosses, "<span class=\"mention-gloss-double-quote\">“</span><span class=\"mention-gloss\">" .. annotations["gloss"] .. "</span><span class=\"mention-gloss-double-quote\">”</span>")
end
-- Part of speech
-- TODO: remove
if annotations["pos"] then
local pos_template = mw.title.makeTitle("Template", "pos " .. annotations["pos"])
if pos_template and pos_template.exists then
table.insert(glosses, mw.getCurrentFrame():expandTemplate{title = "pos " .. annotations["pos"]})
else
table.insert(glosses, annotations["pos"])
end
end
-- Literal/sum-of-parts meaning
if annotations["lit"] then
table.insert(glosses, "literally <span class=\"mention-gloss-double-quote\">“</span><span class=\"mention-gloss\">" .. annotations["lit"] .. "</span><span class=\"mention-gloss-double-quote\">”</span>")
end
if #glosses > 0 then
ret = ret .. " (" .. table.concat(glosses, ", ") .. ")"
end
return ret
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 export.language_link(text, alt, lang, id, curtitle)
local sectFix = false
local tracking = ""
if text and text:gsub("&#[Xx]?[0-9A-Fa-f]+;", ""):find("#", nil, true) then
sectFix = true
end
if ignore_cap[lang:getCode()] and text then
text = gsub(text, "%^", "")
end
-- takes target page and display form and return a standard wikilink if necessary
local core = function(target, display)
-- Create default link title
if not display then
display = target
-- Strip the prefix from the displayed form
-- TODO: other interwiki links?
if display:find("^:") then
display = display:gsub("^:", "")
elseif display:find("^w:") then
display = display:gsub("^w:", "")
end
end
-- Process the target
if not (target:find("^:") or target:find("^w:")) then
-- Remove diacritics from the page name
target = lang:makeEntryName(target)
-- Link to appendix for reconstructed terms and terms in appendix-only languages
if target:find("^*.") then
target = "Appendix:" .. lang:getCanonicalName() .. "/" .. mw.ustring.sub(target, 2)
elseif lang:getType() == "reconstructed" then
error("The specified language " .. lang:getCanonicalName() .. " is unattested, while the given word is not marked with '*' to indicate that it is reconstructed")
elseif lang:getType() == "appendix-constructed" then
target = "Appendix:" .. lang:getCanonicalName() .. "/" .. target
end
end
-- If the target is the same as the current page, then return a "self-link" like the software does
if curtitle and (target == curtitle or target == ":" .. curtitle) then
return "<strong class=\"selflink\">" .. display .. "</strong>"
end
-- Add fragment
local fragment = ""
-- Do not add a section link to "Undetermined", as such sections do not exist and are invalid.
-- TabbedLanguages handles links without a section by linking to the "last visited" section,
-- but adding "Undetermined" would break that feature.
if lang:getCode() ~= "und" and not target:find("^w:") then
if id then
fragment = "#" .. lang:getCanonicalName() .. "-" .. id
elseif not target:find("^Appendix:") then
fragment = "#" .. lang:getCanonicalName()
end
end
return "[[" .. target .. fragment .. "|" .. display .. "]]"
end
-- Do we have embedded wikilinks?
if text:find("[[", nil, true) then
-- fix for linking to unattested terms that are consisted of more than one word
if text:find("^*.") then
text = gsub(text, "%[%[([^%*][^#%]]-)|", "[[*%1|")
text = gsub(text, "%[%[([^%*][^#|]-)%]", "[[*%1|%1]")
end
-- find embedded wikilinks and improve them
text = gsub(text, "%[%[([^#|%]]-)|(.-)%]%]", core)
text = gsub(text, "%[%[([^#|%]]-)%]%]", core)
-- remove the extra "*" at the beginning
text = gsub(text, "^%*%[%[(.-)|%*", "[[%1|*")
else
-- there is no embedded wikilink
text = core(text, alt)
end
return text .. (sectFix and "[[Category:Link with section]]" or "") .. tracking
end
-- Creates the appropriate page name from the given term.
-- This removes diacritics and adds Appendix: when necessary.
function make_pagename(text, lang)
end
-- Removes characters from a term that do not belong in the page name.
-- This includes any diacritics displayed in the headword line or alternative
-- display, but left out of the entry names.
-- This function is used by the translation editor (User:Conrad.Irwin/editor.js)
function export.remove_diacritics(text, lang)
if type(text) == "table" then
text, lang = text.args[1], text.args[2]
end
if type(lang) == "string" then
lang = require("Module:languages").getByCode(lang)
end
return lang:makeEntryName(text)
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("%[%[[^|%]]-|", "")
text = text:gsub("%[%[", "")
text = text:gsub("%]%]", "")
return text
end
return export