Misplaced Pages

Module:Wikt-lang/sandbox

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.
< Module:Wikt-lang

This is an old revision of this page, as edited by Gonnym (talk | contribs) at 12:21, 1 December 2024. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Revision as of 12:21, 1 December 2024 by Gonnym (talk | contribs)(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
This is the module sandbox page for Module:Wikt-lang (diff).
See also the companion subpage for test cases (run).
Module documentation[view] [edit] [history] [purge]
BetaThis 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.
Language templates
Language names (ISO 639)
Interwiki links
Foreign-language text
Other
This module depends on the following other modules:

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.

Examples

Invalid codes

Errors

Comparison of codes

Language code Wikitionary name English Misplaced Pages name
aaq Penobscot Eastern Abnaki
abe Abenaki Western Abnaki
ajp South Levantine Arabic South Levantine Arabic
apc North Levantine Arabic Levantine Arabic
arb Modern Standard Arabic Standard Arabic
cel-x-bryproto Proto-Brythonic Error: unrecognized private tag: bryproto
cu Old Church Slavonic Church Slavonic
egy Egyptian Ancient Egyptian
frp Franco-Provençal Arpitan
gmw-x-proto Proto-West Germanic Error: unrecognized private tag: proto
grk-x-proto Proto-Hellenic Proto-Greek
ine-x-bsproto Proto-Balto-Slavic Error: unrecognized private tag: bsproto
moe Cree Innu
mul Translingual multiple
nds-de German Low German Low German
non-x-proto Proto-Norse Error: unrecognized private tag: proto
poz-x-polproto Proto-Nuclear Polynesian Error: unrecognized private tag: polproto
rw Rwanda-Rundi Kinyarwanda
tts Isan Northeastern Thai
xlu Luwian Cuneiform Luwian
zle-x-ort Old Ruthenian Error: unrecognized private tag: ort

Tracking categories

The above documentation is transcluded from Module:Wikt-lang/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (edit | run) pages.
Add categories to the /doc subpage. Subpages of this module.
require('strict')
local m_data = mw.loadData("Module:Wikt-lang/data")
local langData = m_data.languages or m_data

local p = {}

local error_msgs = {
	internal = {
		 = "The function make_entry_name requires a link string.",
	},
	 = "Name for the language code %q could not be retrieved with mw.language.fetchLanguageName, so it should be added to ]",
	 = "linkToWiktionary needs a Wiktionary entry or link text, or both",
}

local cfg = {
	template = "Wikt-lang",
	wiki_language = "en",
	error = "Error",
	category = "]",
	appendix = "Appendix:%s/%s",
	reconstruction = "Reconstruction:%s/%s",
	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(link_text, language_code)
	link_text = tostring(link_text)
	if link_text == nil or link_text == "" then
		return nil, make_error(error_msgs.internal.make_entry_name)
	end

	local data = langData

	--TODO: is this an error?
	if data == nil then
		return link_text
	end

	--TODO: is this an error?
	local replacements = data and data
	if replacements == nil then
		return link_text
	end

	-- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping.
	link_text = link_text:gsub("\'\'\'", "")
	link_text = link_text:gsub("\'\'", "")

	-- 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
		link_text = mw.ustring.toNFD(link_text)
		for i, from in ipairs(replacements.from) do
			link_text = mw.ustring.gsub(
				link_text,
				from,
				replacements.to and replacements.to or "")
		end
	else
		for regex, replacement in pairs(replacements) do
			link_text = mw.ustring.gsub(link_text, regex, replacement)
		end
	end
	return link_text
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(string.format(error_msgs.language_code_missing, language_code or nil))
			end
		end
		if entry:sub(1, 1) == "*" then
			entry = string.format(cfg.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 = string.format(cfg.reconstruction, name, entry)
		elseif data and data.type == cfg.types.appendix then
			entry = string.format(cfg.appendix, name, entry)
		end
		if entry and link_text then
			return "]"
		else
			return nil, make_error(error_msgs.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/sandbox2")
	
	-- 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 type(result) == "string" and string.find(result, "Error") then
		return result
	end
	
	mw.logObject(result)
	--TODO: we need the result to return as follows:
	--TODO: 1. without a <span title=""> tag which probably should be removed.

	local language_code = m_data.redirects or result.code
	
	local entry, error_msg = make_entry_name(args, language_code)
	--TODO: what happens if no entry?
	if error_msg then
		return error_msg
	end
	
	local link
	if language_code then
		link, error_msg = link_to_Wiktionary(entry, result.html, language_code)
	else
		link, error_msg = link_to_Wiktionary(entry, result.html)
	end

	if error_msg then
		return error_msg
	end

	return link .. result.language_categories .. result.maintenance  
end

return p
Category: