Difference between revisions of "Module:IPAc-en"
m (1 revision) |
en>Kaldari (Adding support for attribution parameter per Template talk:IPAc-en#Adding support for attribution parameter, copied from Module:IPAc-en/sandbox) |
||
Line 5: | Line 5: | ||
-- Global container for tracking categories | -- Global container for tracking categories | ||
+ | local categoryHandler = require('Module:Category handler').main | ||
local categories = {} | local categories = {} | ||
Line 15: | Line 16: | ||
local function makeNowrapSpan(s) | local function makeNowrapSpan(s) | ||
local span = mw.html.create('span') | local span = mw.html.create('span') | ||
+ | :addClass('rt-commentedText') -- Works with [[MediaWiki:Gadget-ReferenceTooltips.js]] | ||
:addClass('nowrap') | :addClass('nowrap') | ||
:wikitext(s) | :wikitext(s) | ||
Line 25: | Line 27: | ||
return data.pronunciation[id].text | return data.pronunciation[id].text | ||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
Line 70: | Line 49: | ||
local function renderCategories() | local function renderCategories() | ||
− | local ret = {} | + | local ret = '' |
− | + | ||
− | + | if categoryHandler{ true } then | |
+ | ret = {} | ||
+ | for cat in pairs(categories) do | ||
+ | table.insert(ret, string.format('[[Category:%s]]', cat)) | ||
+ | end | ||
+ | table.sort(ret) | ||
+ | ret = table.concat(ret) | ||
+ | else | ||
+ | ret = '' | ||
end | end | ||
− | + | return ret | |
− | return | ||
end | end | ||
Line 100: | Line 86: | ||
table.concat(pron) | table.concat(pron) | ||
) | ) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
end | end | ||
Line 138: | Line 116: | ||
words[#words + 1] = formatPhonemeGroup(phonemes) | words[#words + 1] = formatPhonemeGroup(phonemes) | ||
words[#words + 1] = makeTooltip( | words[#words + 1] = makeTooltip( | ||
− | " | + | string.format( |
+ | "<strong class=\"error\">[invalid input: '%s']</strong>", | ||
+ | id | ||
+ | ), | ||
'Unrecognized symbol' | 'Unrecognized symbol' | ||
) | ) | ||
Line 166: | Line 147: | ||
-- Wrap the words in a link to IPA help. | -- Wrap the words in a link to IPA help. | ||
local span = mw.html.create('span') | local span = mw.html.create('span') | ||
− | :addClass('IPA nopopups') | + | -- Suppress Navigation popups and Page Previews (aka Hovercards) |
+ | :addClass('IPA nopopups noexcerpt') | ||
:wikitext(string.format( | :wikitext(string.format( | ||
− | '[[Help:IPA | + | '[[Help:IPA/English|%s]]', |
table.concat(words) | table.concat(words) | ||
)) | )) | ||
− | + | ||
ret[#ret + 1] = tostring(span) | ret[#ret + 1] = tostring(span) | ||
end | end | ||
− | + | ||
+ | -- Audio link | ||
+ | do | ||
+ | local file = args.audio and trim(args.audio) | ||
+ | if file and file ~= '' then | ||
+ | categories["Pages including recorded pronunciations"] = true | ||
+ | ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{ | ||
+ | title = 'Template:IPA audio link', args = { file, attribution = args.attribution } } | ||
+ | end | ||
+ | end | ||
+ | |||
-- Nowrap and categories | -- Nowrap and categories | ||
ret = makeNowrapSpan(table.concat(ret)) .. renderCategories() | ret = makeNowrapSpan(table.concat(ret)) .. renderCategories() |
Revision as of 03:38, 23 November 2020
Documentation for this module may be created at Module:IPAc-en/doc
-- This module implements [[Template:IPAc-en]]. local data = mw.loadData('Module:IPAc-en/data') local p = {} -- Global container for tracking categories local categoryHandler = require('Module:Category handler').main local categories = {} -- Trims whitespace from a string local function trim(s) return s:match('^%s*(.-)%s*$') end -- This implements [[Template:Nowrap]]. local function makeNowrapSpan(s) local span = mw.html.create('span') :addClass('rt-commentedText') -- Works with [[MediaWiki:Gadget-ReferenceTooltips.js]] :addClass('nowrap') :wikitext(s) return tostring(span) end local function makePronunciationText(id) id = id and string.lower(trim(id)) if id and id ~= '' and data.pronunciation[id] then return data.pronunciation[id].text end end -- This adds a tooltip icon to a label. It implements [[Template:H:title]]. local function makeTooltip(label, tooltip) local span = mw.html.create('span') :attr('title', tooltip) :wikitext(label) return tostring(span) end local function formatPhonemeGroup(phonemes) if #phonemes > 0 then local span = mw.html.create('span') :css('border-bottom', '1px dotted') :wikitext(table.concat(phonemes)) return tostring(span) else return '' end end local function renderCategories() local ret = '' if categoryHandler{ true } then ret = {} for cat in pairs(categories) do table.insert(ret, string.format('[[Category:%s]]', cat)) end table.sort(ret) ret = table.concat(ret) else ret = '' end return ret end function p._main(args) local ret = {} local i = 0 -- Keeps track of numbered args -- Pronunciation do local pron = {} while true do i = i + 1 local pronItem = makePronunciationText(args[i]) if pronItem then pron[#pron + 1] = pronItem pron[#pron + 1] = ' ' else break end end if #pron > 0 then ret[#ret + 1] = string.format( '<small>%s</small>', table.concat(pron) ) end end -- Phonemes do -- Loop through the numbered args, separating them into phoneme groups -- and separator strings (both called "words" for convenience). We only -- underline the phoneme groups, not the separators. local words = {} words[#words + 1] = '/' -- Opening slash i = i - 1 -- Set up i again as it was changed in the pronunciation loop local id repeat local phonemes = {} local isWordEnd = false while not isWordEnd do i = i + 1 id = args[i] id = id and trim(id) if not id then isWordEnd = true words[#words + 1] = formatPhonemeGroup(phonemes) elseif id ~= '' then local t = data.phonemes[id] if not t then -- We were passed an invalid id. isWordEnd = true categories["Ill-formatted IPAc-en transclusions"] = true words[#words + 1] = formatPhonemeGroup(phonemes) words[#words + 1] = makeTooltip( string.format( "<strong class=\"error\">[invalid input: '%s']</strong>", id ), 'Unrecognized symbol' ) elseif not t.label then -- The data module contains bad data, so throw an error. error(string.format( "no label was found for id '%s'", tostring(id) )) elseif t.tooltip then -- We are dealing with a regular phoneme. phonemes[#phonemes + 1] = makeTooltip( t.label, t.tooltip ) else -- We are dealing with a separator. isWordEnd = true words[#words + 1] = formatPhonemeGroup(phonemes) words[#words + 1] = t.label end end end until not id words[#words + 1] = '/' -- Closing slash -- Wrap the words in a link to IPA help. local span = mw.html.create('span') -- Suppress Navigation popups and Page Previews (aka Hovercards) :addClass('IPA nopopups noexcerpt') :wikitext(string.format( '[[Help:IPA/English|%s]]', table.concat(words) )) ret[#ret + 1] = tostring(span) end -- Audio link do local file = args.audio and trim(args.audio) if file and file ~= '' then categories["Pages including recorded pronunciations"] = true ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{ title = 'Template:IPA audio link', args = { file, attribution = args.attribution } } end end -- Nowrap and categories ret = makeNowrapSpan(table.concat(ret)) .. renderCategories() -- Reset the categories table in case we are run again. categories = {} return ret end function p.main(frame) return p._main(frame:getParent().args) end return p