Module:User:ZxxZxxZ/links

Hello, you have come here looking for the meaning of the word Module:User:ZxxZxxZ/links. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:User:ZxxZxxZ/links, but we will also tell you about its etymology, its characteristics and you will know how to say Module:User:ZxxZxxZ/links in singular and plural. Everything you need to know about the word Module:User:ZxxZxxZ/links you have here. The definition of the word Module:User:ZxxZxxZ/links will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:User:ZxxZxxZ/links, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local m_languages = mw.loadData("Module:languages/data/all")

local export = {}
local i =1

--TODO: move to ]
local override_translit = {
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
     = true,
}

-- Used in ] and ]
function export.template_l_term(frame)
    local m_utilities = require("Module:utilities")

    local face = frame.args; if face ~= "term" then face = nil end
    -- Compatibility mode.
    -- If given a nonempty value, the function uses lang= to specify the
    -- language, and all the positional parameters shift one number lower.
    local compat = (frame.args or "") ~= ""
    local args = frame:getParent().args

    local lang = args
    if lang == nil or lang == "" then
        -- Temporary. Unfortunately, many pages are missing the language parameter.
        -- These all need to be fixed, but until then this is needed to avoid
        -- thousands of script errors. See ]!
        if compat then
            lang = "und"
        else
            error("The first parameter (language code) has not been given")
        end
    end

    local sc = args; if sc == "" then sc = nil end

    local term = args; if term == "" then term = nil end
    local alt = args; if alt == "" then alt = nil end
    local id = args; if id == "" then id = nil end
    
    local tr = args; if tr == "" then tr = nil end
    local gloss = args or args; if gloss == "" then gloss = nil end
    local pos = args; if pos == "" then pos = nil end
    local lit = args; if lit == "" then lit = nil end

    -- Gather gender and number specifications
    -- Iterate over all gn parameters (g2, g3 and so on) until one is empty
    local genders = {}
    local g = args or ""
    local i = 2
    
    while g ~= "" do
        table.insert(genders, g)
        g = args or ""
        i = i + 1
    end
    
    -- Forward the information to full_link
    return export.full_link(term, alt, lang, sc, face, id, {tr = tr, genders = genders, gloss = gloss, pos = pos, lit = lit})
end

-- A version of {{l}} or {{term}} that can be called from other modules too
function export.full_link(term, alt, lang, sc, face, id, annotations)
    local langinfo = m_languages or error("The language code \"" .. lang .. "\" is not valid.")

    -- Some entries use this as a filler when the native script is missing.
    if term == "..." then error("Term is \"...\", should probably be empty") end
    if alt == "..." then error("Alt is \"...\", should probably be empty") end
    
    -- Create the link
    local link = ""

    local m_utilities = require("Module:utilities")
    local m_scriptutils = require("Module:script utilities")
    
    local scFix = false
    
    -- Is there any text to show?
    if (term or alt) then
        -- Try to detect the script if it was not provided
        if not sc then
            sc, scFix = m_utilities.detect_script(alt or term, 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(term and export.language_link(term, alt, lang, id) or alt, lang, sc, face)
    else
        -- No term to show.
        -- Is there at least a transliteration we can work from?
        link = m_scriptutils.request_script(lang, sc)
        
        if link == "" or not annotations then
            -- No link to show, and no transliteration either. Just show an error because can't really do anything now.
            error("At least one of the following should be provided: the term, alternative display, transliteration")
        end
    end
    
    local trFix = false
    
    if annotations == "" or annotations == "-" then
        trFix = true
    end
    
    -- Try to generate a transliteration if necessary
    -- Generate it if the script is not Latn or similar, and if no transliteration was provided
    if (term or alt) and not ((sc:find("Latn", nil, true)) or sc == "Latinx" or sc == "unicode") and (not annotations or override_translit) then
        annotations = m_scriptutils.transliterate(export.remove_links(alt or term), lang, sc)
    end
    
    return link .. export.format_link_annotations(lang, annotations, face)
                .. (scFix and "]]" or "")
                .. (trFix and "]" or "")
end

-- TODO: remove
function export.template_l_xform(frame)
    local args = frame.args
    local lang = (args ~= '') and args or nil
    local langinfo = lang and (m_languages or error("The language code \"" .. lang .. "\" is not valid.")) or nil

    local text = args or ''
    local autolink = args

    if not mw.ustring.match(text, "%%]") then
        error("No links provided in the SOP translation")
        if autolink == 'words' then
            text = mw.ustring.gsub(text, "(%(%)%s,]+)", function (word)
                return ']'
            end)
        elseif autolink == 'all' then
            if mw.ustring.match(text, "^%(%)%s,]+$") then
                text = ']'
            end
        end
    end
    
    if not lang then
        return text
    end

    local id = langinfo.names

    text = mw.ustring.gsub(text, "%-)|(.-)%]%]", function(pagetitle, linktitle)
        return "]"
    end)
    text = mw.ustring.gsub(text, "%-)%]%]", function(pagetitle)
        return "]"
    end)

    return text
end

-- Format the annotations (things following the linked term)
function export.format_link_annotations(lang, annotations, face)
    local ret = ""
    
    -- Interwiki link
    if annotations then
        ret = ret .. annotations
    end
    
    -- Genders
    if annotations and #annotations > 0 then
        local gen = require("Module:gender and number")
        ret = ret .. " " .. gen.format_list(annotations)
    end
    
    local glosses = {}
    
    -- Transliteration
    if annotations then
        if face == "term" then
            table.insert(glosses, "<span lang=\"\" class=\"mention-tr\">" .. annotations .. "</span>")
        else
            table.insert(glosses, "<span lang=\"\">" .. annotations .. "</span>")
        end
    end

    -- Gloss/translation
    if annotations then
        table.insert(glosses, "<span class=\"mention-gloss-double-quote\">“</span><span class='mention-gloss'>" .. annotations .. "</span><span class=\"mention-gloss-double-quote\">”</span>")
    end
    
    -- Part of speech
    -- TODO: remove
    if annotations then
        local pos_template = mw.title.makeTitle("Template", "pos " .. annotations)

        if pos_template and pos_template.exists then
            table.insert(glosses, mw.getCurrentFrame():expandTemplate{title = "pos " .. annotations})
        else
            table.insert(glosses, annotations)
        end
    end

    -- Literal/sum-of-parts meaning
    if annotations then
        table.insert(glosses, "literally <span class=\"mention-gloss-double-quote\">“</span><span class='mention-gloss'>" .. annotations .. "</span><span class=\"mention-gloss-double-quote\">”</span>")
    end

    if #glosses > 0 then
        ret = ret .. " (" .. table.concat(glosses, ", ") .. ")"
    end

    return ret
end

-- Creates a basic wikilink to the given term. If the text already contains
-- links, these are replaced with links to the correct section.
function export.language_link(text, alt, lang, id, curtitle)
    local langinfo = m_languages or error("The language code \"" .. lang .. "\" is not valid.")
    
    -- Do not add a section link to "Undetermined".
    -- TabbedLanguages handles links without a section by linking to the "last visited"
    -- section, but adding "Undetermined" would mess that up when {{term}} lacks a language.
    if lang ~= "und" then
        id = "#" .. langinfo.names .. (id and "-" .. id or "")
    else
        id = ""
    end
    
    local sectFix = false
    
    if text and text:find("#", nil, true) then
        sectFix = true
    end
    
    -- takes target page's title and linktitle and return a standard wikilink if necessary
    local core = function(target, linktitle)
        if i == 3 then error('target:' .. (target or "") .. '  linktitle:' .. (linktitle or "")) end
        if linktitle == "" then linktitle = nil end
        -- Don't link to appendix if the language is undetermined
        if lang == "und" and target:sub(0, 1) == "*" then
            return linktitle or target
        end
        
        local target2 = export.make_pagename(target, lang)
        
        -- Don't link to the current page; return bold form of the linktitle
        if target2 == curtitle then
            return "]"
        end
        
        local tracking = ""
        
        if linktitle then
            local new = linktitle
            if m_languages.type == "reconstructed" and new:sub(0, 1) ~= "*" then
                new = export.make_pagename("*" .. new, lang)
            else
                new = export.make_pagename(new, lang)
            end

            if target2 == new then
                tracking = "]]"
            elseif lang ~= "en" then
                tracking = "]"
            end
        end
        i = i + 1
        return "]" .. tracking
    end
    
    -- Do we have embedded wikilinks?
    if text:find("[[", nil, true) then
        -- fix for linking to unattested terms that are consisted of more than one word
        if text:sub(0, 1) == "*" then
            text = mw.ustring.gsub(text, "%]-)|", "[[*%1|")
            text = mw.ustring.gsub(text, "%-)%]", "")
        end
        
        -- find embedded wikilinks and improve them
        text = mw.ustring.gsub(text, "%]-)|(.-)%]%]", core)
        text = mw.ustring.gsub(text, "%]-)%]%]", core)

        -- remove the extra "*" at the beginning
        text = mw.ustring.gsub(text, "^%*%[%[(.-)|%*", "[[%1|*")
        
        return text .. (sectFix and "]" or "")
    else
        -- there is no embedded wikilink
        return core(text, alt) .. (sectFix and "]" or "")
    end
end

-- Creates the appropriate page name from the given term.
-- This removes diacritics and adds Appendix: when necessary.
function export.make_pagename(text, lang)
    langinfo = m_languages or error("The language code \"" .. lang .. "\" is not valid.")
    
    -- Remove diacritics from the page name
    text = export.remove_diacritics(text, lang)
    
    -- Link to appendix for reconstructed terms and terms in appendix-only languages
    if mw.ustring.sub(text, 0, 1) == "*" then
        text = "Appendix:" .. langinfo.names .. "/" .. mw.ustring.sub(text, 2)
    elseif langinfo.type == "reconstructed" then
        error("The specified language " .. langinfo.names .. " is unattested,"
              .. " while the given word is not marked with '*' to indicate that it is reconstructed")
    elseif langinfo.type == "appendix-constructed" then
        text = "Appendix:" .. langinfo.names .. "/" .. text
    end

    return text
end

-- Removes characters from a term that do not belong in the page name.
-- This includes any diacritics displayed in the headword line or alternative
-- display, but left out of the entry names.
function export.remove_diacritics(text, lang)
    local langinfo = m_languages or error("The language code \"" .. lang .. "\" is not valid.")
    
    -- Remove general punctuation
    text = mw.ustring.gsub(text, "$", "")

    -- Replace diacritics and other characters according to the specifications of the language; see entry_name in ]
    if langinfo.entry_name then
        for i, from in ipairs(langinfo.entry_name.from) do
            local to = langinfo.entry_name.to or ""
            text = mw.ustring.gsub(text, from, to)
        end
    end

    return text
end

-- Strips all square brackets out or replaces them.
function export.remove_links(text)
    if type(text) == "table" then text = text.args end; if not text then text = "" end

    text = text:gsub("%]-|", "")
    text = text:gsub("%[%[", "")
    text = text:gsub("%]%]", "")

    return text
end

return export