Difference between revisions of "Module:IPAc-en"

From Eat Every Plant
Jump to navigation Jump to search
m (1 revision: Actinidia)
 
m (1 revision: Angiosperm families - L part 2)
(One intermediate revision by the same user not shown)
Line 2: Line 2:
  
 
local data = mw.loadData('Module:IPAc-en/data')
 
local data = mw.loadData('Module:IPAc-en/data')
 +
local currentFrame = mw.getCurrentFrame()
 
local p = {}
 
local p = {}
  
 
-- Global container for tracking categories
 
-- Global container for tracking categories
 +
local categoryHandler = require('Module:Category handler').main
 
local categories = {}
 
local categories = {}
  
Line 35: Line 37:
 
local span = mw.html.create('span')
 
local span = mw.html.create('span')
 
span
 
span
:addClass('noexcerpt')
+
:addClass('noexcerpt') -- Suppresses Page Previews (aka Hovercards)
 
:wikitext(string.format(
 
:wikitext(string.format(
 
'[[File:Speakerlink-new.svg|11px|link=%s|Listen]]',
 
'[[File:Speakerlink-new.svg|11px|link=%s|Listen]]',
Line 70: Line 72:
  
 
local function renderCategories()
 
local function renderCategories()
local ret = {}
+
local ret = ''
for cat in pairs(categories) do
+
ret = categoryHandler{
table.insert(ret, string.format('[[Category:%s]]', cat))
+
[1] = 'yes', -- Add categories in these namespaces
 +
main = 1,
 +
wikipedia = 1,
 +
file = 1,
 +
template = 1,
 +
help = 1,
 +
category = 1,
 +
portal = 1,
 +
book = 1,
 +
draft = 1,
 +
module = 1,
 +
}
 +
 +
if ret == 'yes' 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
table.sort(ret)
+
return ret
return table.concat(ret)
 
 
end
 
end
  
Line 137: Line 159:
 
categories["Ill-formatted IPAc-en transclusions"] = true
 
categories["Ill-formatted IPAc-en transclusions"] = true
 
words[#words + 1] = formatPhonemeGroup(phonemes)
 
words[#words + 1] = formatPhonemeGroup(phonemes)
 +
-- Call [[Template:Error]]
 +
local errorText = currentFrame:expandTemplate{
 +
title = 'Template:Error',
 +
args = {
 +
string.format("[invalid input: '%s']", id)
 +
}
 +
}
 
words[#words + 1] = makeTooltip(
 
words[#words + 1] = makeTooltip(
"'''[unsupported input]'''",
+
errorText,
 
'Unrecognized symbol'
 
'Unrecognized symbol'
 
)
 
)
Line 166: Line 195:
 
-- 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 for English|%s]]',
 
'[[Help:IPA for English|%s]]',

Revision as of 22:10, 25 June 2017

-- This module implements Template:IPAc-en.

local data = mw.loadData('Module:IPAc-en/data') local currentFrame = mw.getCurrentFrame() 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('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

local function getFilepath(file) return mw.getCurrentFrame():callParserFunction('filepath', file) end

local function makeAudioLink(file) categories["Articles including recorded pronunciations"] = true local span = mw.html.create('span') span :addClass('noexcerpt') -- Suppresses Page Previews (aka Hovercards) :wikitext(string.format( 'Listen', getFilepath(file) )) :tag('sup') :tag('span') :css('color', '#00e') :css('font', 'bold 80% sans-serif') :css('padding', '0 .1em') :addClass('IPA') :wikitext(string.format('i', file)) return tostring(span) 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 = ret = categoryHandler{ [1] = 'yes', -- Add categories in these namespaces main = 1, wikipedia = 1, file = 1, template = 1, help = 1, category = 1, portal = 1, book = 1, draft = 1, module = 1, }

if ret == 'yes' then ret = {} for cat in pairs(categories) do table.insert(ret, string.format(, 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( '%s', table.concat(pron) ) end end

-- Audio link do local file = args.audio and trim(args.audio) if file and file ~= then ret[#ret + 1] = makeAudioLink(file) 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) -- Call Template:Error local errorText = currentFrame:expandTemplate{ title = 'Template:Error', args = { string.format("[invalid input: '%s']", id) } } words[#words + 1] = makeTooltip( errorText, '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( '%s', table.concat(words) ))

ret[#ret + 1] = tostring(span) 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