मॉड्यूल:User:Isomorphyc/links-draft
दिखावट
"इस मॉड्यूल हेतु प्रलेख मॉड्यूल:User:Isomorphyc/links-draft/doc पर बनाया जा सकता है"
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 "<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("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, ":", ":")
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("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, "<span lang=\"\" class=\"tr mention-tr\">" .. terminfo.tr .. "</span>")
else
table.insert(glosses, "<span lang=\"\" class=\"tr\">" .. terminfo.tr .. "</span>")
end
end
-- Transliteration/Not Phonetic Transcription
if terminfo.pr and terminfo.pr ~= terminfo.tr then
if face == "term" then
table.insert(glosses, "<span lang=\"\" class=\"tr mention-tr\">" .. "<sup>PHONETIC" .."</sup>".. terminfo.pr .. "</span>")
else
table.insert(glosses, "<span lang=\"\" class=\"tr\">" .. "<sup>PHONETIC" .."</sup>".. terminfo.pr .. "</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 .. " ‎<span class='mention-gloss-paren'>(</span>" .. table.concat(glosses, ", ") .. "<span class='mention-gloss-paren'>)</span>"
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 = "[[Category:" .. terminfo.lang:getCanonicalName() .. " term requests]]"
end
link = "<small>[Term?]</small>" .. 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 "[[Category: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 "[[Category: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("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