Module:User:Isomorphyc/links-draft

local export = {}

--TODO: move to Module:languages local override_translit = { --moved to Module:languages/data: --ab, abq, ady, av, axm, ba, bo, bua, ce, chm, cv, dar, dv, dz, el, gmy, grc, hy, inh, iu, ka, kk, kbd, kca, kjh, kjj, kn, koi, kpv, ky, kv, lbe, lez, lzz, mdf, ml, mn, my, myv, nog, oge, os, sah, si, sgh, sva, ta, tab, te, tg, tt, tyv, ug, udi, udm, xal, xcl, xmf --commented out: --["ko"] = true, --["lo"] = true, }

local ignore_cap = { ["ko"] = true, }

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 sms:a without it being treated weirdly. link.target = mw.ustring.gsub(link.target, ":", "&#x3a;") 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/Phonetic Transcription if terminfo.tr then if face == "term" then table.insert(glosses, "" .. terminfo.tr .. " ") else table.insert(glosses, "" .. terminfo.tr .. " ") end end -- Transliteration/Not Phonetic Transcription if terminfo.pr and terminfo.pr ~= terminfo.tr then if face == "term" then table.insert(glosses, "" .. "{{sup|PHONETIC" .."}}".. terminfo.pr .. " ") else table.insert(glosses, "" .. "{{sup|PHONETIC" .."}}".. terminfo.pr .. " ") 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 .. " &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(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, pr = annotations and annotations.pr, gloss = annotations and annotations.gloss, pos = annotations and annotations.pos, lit = annotations and annotations.lit, interwiki = annotations and annotations.interwiki} --pr added by Isomorphyc for testing purposes 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 end end local mantrFix, redtrFix local manual_tr = "" if terminfo.tr == "" or terminfo.tr == "-" then terminfo.tr = nil elseif (terminfo.pr and not terminfo.tr) or not terminfo.tr and terminfo.lang:hasTranscribe then local term, pr, tr, canS = terminfo.term, terminfo.pr, terminfo.tr, terminfo.lang:hasTranscribe function trans(f,x) if f == "lit" then return terminfo.lang:transliterate(export.remove_links(x)) else return f == "scribe" and terminfo.lang:transcribe(export.remove_links(x)) or "error" end end terminfo.tr = (pr and not canS) and trans("lit", term) or (canS and trans("lit", trans("scribe", term)) or nil)

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 terminfo.lang:hasOverrideTranslit 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:User:Isomorphyc/languages-draft").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