Module talk:links
local export = {}
--TODO: move to Module:languages local override_translit = { ["ab"] = true, ["abq"] = true, ["ady"] = 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, ["gmy"] = true, ["grc"] = true, ["hy"] = true, ["inh"] = true, ["iu"] = true, ["ka"] = true, ["kk"] = true, --["ko"] = true, ["kbd"] = true, ["kca"] = true, ["kjh"] = true, ["kjj"] = 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, ["nog"] = true, ["oge"] = true, ["os"] = true, ["sah"] = true, ["si"] = true, ["sgh"] = true, ["sva"] = true, ["ta"] = true, ["tab"] = true, ["te"] = true, ["tg"] = true, ["tt"] = true, ["tyv"] = true, ["ug"] = true, ["udi"] = true, ["udm"] = true, ["xal"] = true, ["xcl"] = true, ["xmf"] = true, }
local ignore_cap = { ["ko"] = true, }
local phonetic_extraction = { ["th"] = "Module:th" }
local pos_tags = { ["a"] = "adjective", ["adv"] = "adverb", ["int"] = "interjection", ["n"] = "noun", ["pron"] = "pronoun", ["v"] = "verb", ["vi"] = "intransitive verb", ["vt"] = "transitive verb", ["vti"] = "transitive and intransitive verb", }
function export.getLinkPage(target, lang) -- 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 target = lang:makeEntryName(target)
-- Link to appendix for reconstructed terms and terms in appendix-only languages if target:find("^*.") then if lang:getCode() == "und" then return nil end
target = "Reconstruction:" .. 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
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 = export.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 "" .. link.display .. "" end
-- Add 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 not (link.target:find("^w:") or link.target:find("^wikipedia:")) then if link.fragment or mw.ustring.find(link.target, "#$") then require("Module:debug").track("links/fragment") require("Module:debug").track("links/fragment/" .. lang:getCode()) end
if not link.fragment and lang:getCode() ~= "und" then if id then link.fragment = lang:getCanonicalName() .. "-" .. id elseif not link.target:find("^Appendix:") and not link.target:find("^Reconstruction:") then link.fragment = lang:getCanonicalName() end end end
-- This allows linking to pages like [[១]] without it being treated weirdly. link.target = mw.ustring.gsub(link.target, ":", ":")
return "" .. 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 ignore_cap[terminfo.lang:getCode()] and text then text = mw.ustring.gsub(text, "%^", "") end
-- 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 if terminfo.id then require("Module:debug").track("links/bad id") end
-- Begins and ends with a wikilink tag if mw.ustring.find(text, "^%[%[(.+)%]%]$") then -- There are no [ ] in between. -- This makes the wikilink tag redundant. if mw.ustring.find(text, "^%[%[[^%[%]]+%]%]$") then require("Module:debug").track("links/redundant wikilink") else local temp = mw.ustring.gsub(text, "^%[%[(.+)%]%]$", "%1") temp = mw.ustring.gsub(temp, "%]%], %[%[", "|")
if not mw.ustring.find(temp, "[%[%]]") then require("Module:debug").track("links/list") end end end
text = mw.ustring.gsub(text, "%[%[([^%]]+)%]%]", function(linktext) local link = parseLink(linktext)
if allReconstructed then link.target = "*" .. link.target end
return makeLangLink(link, terminfo.lang, 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.lang, 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("Module:gender and number") ret = ret .. " " .. gen.format_list(terminfo.genders, terminfo.lang) end
local glosses = {}
-- Transliteration if terminfo.tr then if face == "term" then table.insert(glosses, "" .. terminfo.tr .. "") else table.insert(glosses, "" .. terminfo.tr .. "") end end
-- Gloss/translation if terminfo.gloss then table.insert(glosses, "“" .. terminfo.gloss .. "”") end
-- Part of speech if terminfo.pos then table.insert(glosses, pos_tags[terminfo.pos] or terminfo.pos) end
-- Literal/sum-of-parts meaning if terminfo.lit then table.insert(glosses, "literally “" .. terminfo.lit .. "”") end
if #glosses > 0 then ret = ret .. " (" .. table.concat(glosses, ", ") .. ")" end
return ret end
-- A version of Lua error in Module:links/templates at line 49: The parameters "1" are required.. or Lua error in Module:links/templates at line 49: The parameters "1" are required.. that can be called from other modules too
function export.full_link(term, alt, lang, sc, face, id, annotations, allowSelfLink, dontLinkRecons)
local terminfo = term
if type(terminfo) == "table" then face = alt allowSelfLink = lang dontLinkRecons = sc else terminfo = {term = term, alt = alt, lang = lang, sc = sc, id = id, genders = annotations and annotations.genders, tr = annotations and annotations.tr, gloss = annotations and annotations.gloss, pos = annotations and annotations.pos, lit = annotations and annotations.lit, interwiki = annotations and annotations.interwiki} require("Module:debug").track("links/term not table") end
-- 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 (terminfo.term or terminfo.alt) then -- Try to detect the script if it was not provided if not terminfo.sc then terminfo.sc = require("Module:scripts").findBestScript(terminfo.alt or terminfo.term, terminfo.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(terminfo.term and language_link2(terminfo, allowSelfLink, dontLinkRecons) or terminfo.alt, terminfo.lang, terminfo.sc, face) else -- No term to show. -- Is there at least a transliteration we can work from? link = m_scriptutils.request_script(terminfo.lang, terminfo.sc)
if link == "" or not terminfo.tr or terminfo.tr == "-" then -- No link to show, and no transliteration either. Show a term request. local category = ""
if mw.title.getCurrentTitle().nsText ~= "Template" then category = "" end
link = "[Term?]" .. category
if terminfo.lang:getCode() ~= "la" and terminfo.lang:getCode() ~= "grc" and terminfo.lang:getCode() ~= "fr" and terminfo.lang:getCode() ~= "en" and terminfo.lang:getCode() ~= "pro" and terminfo.lang:getCode() ~= "cu" and terminfo.lang:getCode() ~= "ar" and terminfo.lang:getCode() ~= "it" and terminfo.lang:getCode() ~= "ota" and terminfo.lang:getCode() ~= "de" and terminfo.lang:getCode() ~= "ira-pro" and terminfo.lang:getCode() ~= "enm" and terminfo.lang:getCode() ~= "ang" and terminfo.lang:getCode() ~= "ine-pro" and terminfo.lang:getCode() ~= "sh" and terminfo.lang:getCode() ~= "zlw-slv" and terminfo.lang:getCode() ~= "akk" and terminfo.lang:getCode() ~= "gmh" and terminfo.lang:getCode() ~= "fro" then link = link .. "" end end end
local mantrFix, redtrFix local manual_tr = ""
if terminfo.tr == "" or terminfo.tr == "-" then terminfo.tr = nil
elseif phonetic_extraction[terminfo.lang:getCode()] then local m_phonetic = require(phonetic_extraction[terminfo.lang:getCode()]) terminfo.tr = terminfo.tr or m_phonetic.getTranslit(export.remove_links(terminfo.term))
elseif (terminfo.term or terminfo.alt) and not ((terminfo.sc:getCode():find("Latn", nil, true)) or terminfo.sc:getCode() == "Latinx") and (not terminfo.tr or override_translit[terminfo.lang:getCode()]) then -- Try to generate a transliteration if necessary local automated_tr = terminfo.lang:transliterate(export.remove_links(terminfo.alt or terminfo.term), terminfo.sc)
if automated_tr then if terminfo.tr ~= automated_tr then if terminfo.tr then manual_tr = terminfo.tr mantrFix = true end
terminfo.tr = automated_tr else redtrFix = true end end end
-- Link to the transliteration entry for languages that require this if terminfo.tr and terminfo.lang:link_tr() then terminfo.tr = language_link2({lang = terminfo.lang, term = terminfo.tr}) end
return link .. export.format_link_annotations(terminfo, face) .. (mantrFix and "" or "") .. (redtrFix and "" or "") end
function export.language_link(text, alt, lang, id, allowSelfLink)
local terminfo = text
if type(terminfo) == "table" then allowSelfLink = alt else terminfo = {term = text, alt = alt, lang = lang, id = id} require("Module:debug").track("links/term not table") 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("%[%[Category:[^|%]]-|?[^|%]]-%]%]", "") text = text:gsub("%[%%-|", "") text = text:gsub("%[%[", "") text = text:gsub("%]%]", "")
return text end
function export.english_links(text) local lang = require("Module:languages").getByCode("en")
text = mw.ustring.gsub(text, "%[%[([^%]]+)%]%]", function(linktext) local link = parseLink(linktext) return makeLangLink(link, lang, nil, true, false) end )
return text end
return export
Start a discussion about Module:links
Talk pages are where people discuss how to make content on Wiktionary the best that it can be. You can use this page to start a discussion with others about how to improve Module:links.