Article snapshot taken from Wikipedia with creative commons attribution-sharealike license.
Give it a read and then ask your questions in the chat.
We can research this topic together.
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected.
This module is used by {{Wikt-lang}}. It is inspired by the templates {{m}} and {{l}} and their associated modules on Wiktionary. It has a Wiktionary link function that links to the correct section of the Wiktionary entry, and applies correct language formatting and italics. The language-tagging function does most of what {{Lang}} does, except that italics can't be customized and categories aren't added.
The module uses Module:Wikt-lang/data to retrieve the language name for a language code, and to perform the necessary entry-name replacements (for instance, removing macrons from Latin entry names). These are unfortunately not automatically retrieved from Wiktionary's Wikt-lang data modules. For language codes that do not have a name value in this module, the language name is fetched with mw.language.fetchLanguage. When mw.language.fetchLanguage does not fetch the correct language name (or any language name at all), please add it to Module:Wikt-lang/data, and similarly when the correct entry name is not generated, please add the entry name replacements to the module.
require('strict')
local m_data = mw.loadData("Module:Wikt-lang/data")
local langData = m_data.languages or m_data
local p = {}
local error_mesages = {
= "The function make_entry_name requires a string argument",
= "Name for the language code $1 could not be retrieved with mw.language.fetchLanguageName, so it should be added to ]", --TODO: need to add
= "linkToWiktionary needs a Wiktionary entry or link text, or both",
}
local cfg = {
template = "Wikt-lang",
wiki_language = "en",
error = "Error",
category = "]",
appendix = "Appendix:$1/$2", --TODO: need to add
reconstruction = "Reconstruction:$1/$2", --TODO: need to add
types = {
appendix = "appendix",
reconstructed = "reconstructed",
},
}
--[[--------------------------< M A K E _ E R R O R >--------------------------------------------------
]]
local function make_error(msg)
return table.concat ({'<span style="color: #d33;">', cfg.error, ': ', cfg.template, msg, '</span>', cfg.category})
end
--[[--------------------------< M A K E _ E N T R Y _ N A M E >--------------------------------------------------
]]
local function make_entry_name(word, language_code)
local data = langData
local ugsub = mw.ustring.gsub
word = tostring(word)
if word == nil then
return nil, make_error(error_mesages.make_entry_name)
elseif word == "" then
return ""
else
-- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping.
word = word:gsub("\'\'\'", "")
word = word:gsub("\'\'", "")
if data == nil then
return word
else
local replacements = data and data
if replacements == nil then
return word
else
-- Decompose so that the diacritics of characters such
-- as á can be removed in one go.
-- No need to compose at the end, because the MediaWiki software
-- will handle that.
if replacements.decompose then
word = mw.ustring.toNFD(word)
for i, from in ipairs(replacements.from) do
word = ugsub(
word,
from,
replacements.to and replacements.to or "")
end
else
for regex, replacement in pairs(replacements) do
word = ugsub(word, regex, replacement)
end
end
return word
end
end
end
end
--[[--------------------------< L I N K _ T O _ W I K T I O N A R Y >--------------------------------------------------
]]
local function link_to_Wiktionary(entry, link_text, language_code)
local data = langData
local name
if language_code then
if data and data.name then
name = data.name
else
-- On other languages' wikis, use mw.getContentLanguage():getCode(),
-- or replace 'en' with that wiki's language code.
name = mw.language.fetchLanguageName(language_code, cfg.wiki_language)
if name == "" then
return nil, make_error("Name for the language code " .. ("%q"):format(language_code or nil)
.. " could not be retrieved with mw.language.fetchLanguageName, "
.. "so it should be added to ]")
end
end
if entry:sub(1, 1) == "*" then
entry = "Reconstruction:" .. name .. "/" .. entry:sub(2)
elseif data and data.type == cfg.types.reconstructed then
mw.log("Reconstructed language without asterisk:", language_code, name, entry)
local frame = mw.getCurrentFrame()
-- TODO: replace with category
-- Track reconstructed entries with no asterisk by transcluding
-- a nonexistent template. This technique is used in Wiktionary:
-- see ].
-- ]
pcall(frame.expandTemplate, frame, {title = 'tracking/wikt-lang/reconstructed with no asterisk'})
entry = "Reconstruction:" .. name .. "/" .. entry
elseif data and data.type == cfg.types.appendix then
entry = "Appendix:" .. name .. "/" .. entry
end
if entry and link_text then
return "]"
else
return nil, make_error(error_mesages.no_text)
end
else
return "]"
end
end
--[[--------------------------< W I K T L A N G >--------------------------------------------------------------------
Entry point for {{Wikt-lang}}.
Parameters are received from the template's frame (parent frame).
* 1 – language code
* 2 – link text
* 3 – display text
* italic – "no" to disable
]]
function p.wiktlang(frame)
local getArgs = require ('Module:Arguments').getArgs
local args = getArgs(frame)
-- Handle the display text.
local lang = require("Module:Lang")
-- The display text should be the text wrapped in the language tag.
args = args or args
-- To allow the errors to be associated with this template.
args.template = cfg.template
local result = lang._lang(args)
mw.log(result)
-- An error returned, stop here.
if string.find(result, "Error") then
return result
end
--TODO: we need the result to return as follows:
--TODO: 1. without a <span title=""> tag which probably should be removed.
--TODO: 2. the result should be a table of 4 values: language span, category, language code, error. - this will allow easier handling later on.
-- language_code = m_data.redirects or language_code
-- local link_text = args
-- local entry, error = make_entry_name(link_text, language_code)
--TODO: what happens if no entry?
-- if error then
-- return error
-- end
-- local out
-- if language_code then
-- out, error = link_to_Wiktionary(entry, link_text, language_code)
-- else
-- out, error = link_to_Wiktionary(entry, link_text)
-- end
-- if error then
-- return error
-- end
-- return out
return result
end
return p