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("Module:No globals")
local m_data = mw.loadData("Module:Language/data/sandbox")
local langModule = require("Module:Lang/sandbox")
local langData = m_data.languages or m_data
local strings = {
= "Reconstruction:%s/%s",
= "Appendix:%s/%s",
= "]",
= "]",
}
local errorMessages = {
= "No language code.",
= "No Wiktionary entry.",
= "The language name for the language code <code>%s</code> was not found.",
}
local trackingCategories = {
= "]",
= "]",
= "]",
}
local activeTrackingCategories = {}
local p = {}
--[[ -------------------------- < G E T _ E R R O R _ M E S S A G E > --------------------------
Assembles an error message from message text and error category.
]]
local function getErrorMessage(message)
return string.format('<span style="font-size: 100%%; font-style: normal;" class="error">Error: %s</span>', message) .. trackingCategories
end
--[[ -------------------------- < G E T _ C O D E > --------------------------
This function checks if a code used is a redirect code.
If it is, the code is convered to non-redirect version.
]]
local function getCode(code)
local redirectCode = m_data.redirects
if redirectCode then
code = redirectCode
table.insert(activeTrackingCategories, trackingCategories)
end
return code
end
--[[ -------------------------- < C L E A N _ T E X T > --------------------------
This function cleans the text by removing bold and italics.
If the language used also has special replacements in in the /data sub-module,
it uses the data there to continue the process.
]]
local function cleanText(text, languageCode)
local data = langData
text = tostring(text)
-- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping.
text = text:gsub("\'\'\'", "")
text = text:gsub("\'\'", "")
-- If the language is not found, return text.
if data == nil then
return text
end
-- If the language does not have diacritics, return text.
local replacements = data and data
if replacements == nil then
return text
end
-- 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.
local ugsub = mw.ustring.gsub
if replacements.decompose then
text = mw.ustring.toNFD(text)
for i, from in ipairs(replacements.from) do
text = ugsub(text, from, replacements.to and replacements.to or "")
end
else
for regex, replacement in pairs(replacements) do
text = ugsub(text, regex, replacement)
end
end
return text
end
--[[ -------------------------- < C R E A T E _ W I K T I O N A R Y _ L I N K > --------------------------
This function creates a link to a Wiktionary entry.
]]
local function createWiktionaryLink(wiktionaryText, displayText, languageCode)
if languageCode then
local data = langData
local nameFromTag = langModule._name_from_tag({languageCode})
-- The name used is determined by the following logic:
-- Uses the name in /data sub-module, if set.
-- If not, uses the name from the Module:Lang database, if set.
-- Finally, uses the MediaWiki name from mw.language.fetchLanguageName().
local name
if data and data.name then
name = data.name
elseif nameFromTag and not nameFromTag:find("error") then
name = nameFromTag
else
-- On other languages' wikis, use mw.getContentLanguage():getCode(),
-- or replace 'en' with that wiki's language code.
-- name = mw.language.fetchLanguageName(languageCode, mw.getContentLanguage():getCode())
name = mw.language.fetchLanguageName(languageCode, 'en')
end
if name == "" then
return getErrorMessage(string.format(errorMessages, languageCode))
end
if wiktionaryText:sub(1, 1) == "*" then
wiktionaryText = string.format(strings, name, wiktionaryText:sub(2))
elseif data and data.type == "reconstructed" then
-- Track reconstructed entries with no asterisk by transcluding
table.insert(activeTrackingCategories, trackingCategories)
wiktionaryText = string.format(strings, name, wiktionaryText)
elseif data and data.type == "appendix" then
wiktionaryText = string.format(strings, name, wiktionaryText)
end
return string.format(strings, wiktionaryText, name, displayText)
else
return string.format(strings, wiktionaryText, displayText)
end
end
--[[ -------------------------- < W I K T > --------------------------
Entry point for {{wt}}.
]]
function p.wikt(frame)
frame = true
return p.wiktlang(frame)
end
--[[ -------------------------- < W I K T L A N G > --------------------------
Entry point for {{wikt-lang}}.
]]
function p.wiktlang(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame)
local code = args and mw.text.trim(args)
if not code then
return getErrorMessage(errorMessages)
end
local wiktionaryText = args
if not wiktionaryText then
return getErrorMessage(errorMessages)
end
local displayText = args
local languageCode = getCode(code)
local _, _, _, _, _, errorText = langModule.get_ietf_parts(languageCode)
if errorText then
return getErrorMessage(errorText)
end
local italics = args.italic or args.italics or args.i
local wiktionaryTextCleaned = cleanText(wiktionaryText, languageCode)
if not displayText then
displayText = wiktionaryText
end
local wiktionaryLink = createWiktionaryLink(wiktionaryTextCleaned, displayText, languageCode)
if not args then
local langArgs = {code = languageCode, text = wiktionaryLink, italic = italics}
wiktionaryLink = langModule._lang(langArgs)
end
-- Used for testing
if args then
return wiktionaryLink
else
return wiktionaryLink .. table.concat(activeTrackingCategories)
end
end
return p