Revision as of 10:50, 1 December 2024 editGonnym (talk | contribs)Autopatrolled, Extended confirmed users, Template editors222,872 editsNo edit summary← Previous edit | Revision as of 11:02, 1 December 2024 edit undoGonnym (talk | contribs)Autopatrolled, Extended confirmed users, Template editors222,872 editsNo edit summaryNext edit → | ||
Line 6: | Line 6: | ||
local error_mesages = { | local error_mesages = { | ||
internal = { | |||
= "The function make_entry_name requires a link string.", | |||
}, | |||
= "Name for the language code $1 could not be retrieved with mw.language.fetchLanguageName, so it should be added to ]", --TODO: need to add | = "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", | = "linkToWiktionary needs a Wiktionary entry or link text, or both", | ||
Line 38: | Line 40: | ||
]] | ]] | ||
local function make_entry_name( |
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_mesages.internal.make_entry_name) | ||
⚫ | end | ||
local data = langData | local data = langData | ||
--TODO: is this an error? | |||
⚫ | |||
⚫ | if data == nil then | ||
⚫ | |
||
⚫ | return link_text | ||
if word == nil then | |||
⚫ | end | ||
⚫ | return nil, make_error(error_mesages.make_entry_name) | ||
elseif word == "" then | |||
--TODO: is this an error? | |||
⚫ | return |
||
⚫ | 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 | else | ||
⚫ | for regex, replacement in pairs(replacements) do | ||
⚫ | |||
|
link_text = mw.ustring.gsub(link_text, regex, replacement) | ||
⚫ | |||
⚫ | |||
⚫ | |||
else | |||
⚫ | |||
⚫ | |||
return word | |||
else | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |
||
⚫ | |||
word = ugsub( | |||
word, | |||
⚫ | |||
⚫ | |||
⚫ | |||
else | |||
⚫ | |||
word = ugsub(word, regex, replacement) | |||
end | |||
⚫ | |||
return word | |||
⚫ | |||
end | end | ||
end | end | ||
return link_text | |||
end | end | ||
Line 140: | Line 142: | ||
]] | ]] | ||
function p.wiktlang(frame) | function p.wiktlang(frame) | ||
local getArgs = require |
local getArgs = require('Module:Arguments').getArgs | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
Revision as of 11:02, 1 December 2024
This is the module sandbox page for Module:Wikt-lang (diff). See also the companion subpage for test cases (run). |
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. |
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
{{#invoke:Wikt-lang|wiktlang|en|language}}
-> language{{#invoke:Wikt-lang|wiktlang|en|language|languages}}
-> languages{{#invoke:Wikt-lang|wiktlang|fr|bourguignon}}
-> bourguignon{{#invoke:Wikt-lang|wiktlang|la|homō}}
-> homō{{#invoke:Wikt-lang|wiktlang|grc|δημοκρατίᾱ}}
-> δημοκρατίᾱ{{#invoke:Wikt-lang|wiktlang|ru|язы́к}}
-> язы́к{{#invoke:Wikt-lang|wiktlang|ar|العَرَبِيَّة}}
-> العَرَبِيَّة{{#invoke:Wikt-lang|wiktlang|fa|فارسی}}
-> فارسی{{#invoke:Wikt-lang|wiktlang|ine-x-proto|*h₂enǵʰ-}}
-> *h₂enǵʰ-
Invalid codes
{{#invoke:Wikt-lang|wiktlang|EN|language}}
-> language{{#invoke:Wikt-lang|wiktlang|En|language|languages}}
-> languages{{#invoke:Wikt-lang|wiktlang|La|homō}}
-> homō{{#invoke:Wikt-lang|wiktlang|Grc|δημοκρατίᾱ}}
-> δημοκρατίᾱ{{#invoke:Wikt-lang|wiktlang|Ru|язы́к}}
-> язы́к{{#invoke:Wikt-lang|wiktlang|Ar|العَرَبِيَّة}}
-> العَرَبِيَّة{{#invoke:Wikt-lang|wiktlang|Fa|فارسی}}
-> فارسی
Errors
{{#invoke:Wikt-lang|wiktlang|en-Latin|language}}
-> language
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_mesages = { internal = { = "The function make_entry_name requires a link string.", }, = "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(link_text, language_code) link_text = tostring(link_text) if link_text == nil or link_text == "" then return nil, make_error(error_mesages.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("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 pCategory: