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

Start a discussion
ត្រឡប់ទៅទំព័រ "links"។