Difference between revisions 34804 and 35203 on mkwiktionary-- Модул:links -- Imported from mk.wikipedia -- 2016-06-227-03 -- V2 -- last modified by DenisWasRight -- Extended version for mk.wiktionary 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"] = "Модул: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 = "Викиречник:" .. 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 = "Помош:" .. 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 "<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. -- 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("Модул:debug").track("links/fragment") require("Модул: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("^Помош:") and not link.target:find("^Викиречник:") 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, ":", ":") 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 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("Модул: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("Модул: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("Модул: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("Модул: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, "<span lang=\"\" class=\"tr mention-tr\">" .. terminfo.tr .. "</span>") else table.insert(glosses, "<span lang=\"\" class=\"tr\">" .. terminfo.tr .. "</span>") end 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, pos_tags[terminfo.pos] or terminfo.pos) end -- Literal/sum-of-parts meaning if terminfo.lit then table.insert(glosses, "literally <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 .. " ‎(" .. 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, gloss = annotations and annotations.gloss, pos = annotations and annotations.pos, lit = annotations and annotations.lit, interwiki = annotations and annotations.interwiki} require("Модул:debug").track("links/term not table") end -- Create the link local link = "" local m_utilities = require("Модул:utilities") local m_scriptutils = require("Модул: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("Модул: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 = "[[Категорија:" .. terminfo.lang:getCanonicalName() .. " term requests]]" end link = "<small>[Термин?]</small>" .. category 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 if terminfo.lang:link_tr() then automated_tr = makeLangLink({target = automated_tr}, terminfo.lang) end terminfo.tr = automated_tr else redtrFix = true end end end return link .. export.format_link_annotations(terminfo, face) .. (mantrFix and "[[Категорија:Terms with manual transliterations different from the automated ones]][[Category:Terms with manual transliterations different from the automated ones/" .. terminfo.lang:getCode() .. "]]" or "") .. (redtrFix and "[[Категорија:Terms with redundant transliterations]][[Category:Terms with redundant transliterations/" .. terminfo.lang:getCode() .. "]]" 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("Модул: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("%[%[Категорија:[^|%]]-|?[^|%]]-%]%]", "") text = text:gsub("%[%[[^|%]]-|", "") text = text:gsub("%[%[", "") text = text:gsub("%]%]", "") return text end return export All content in the above text box is licensed under the Creative Commons Attribution-ShareAlike license Version 4 and was originally sourced from https://mk.wiktionary.org/w/index.php?diff=prev&oldid=35203.
![]() ![]() This site is not affiliated with or endorsed in any way by the Wikimedia Foundation or any of its affiliates. In fact, we fucking despise them.
|