Difference between revisions of "Module:IPA"

From blackwiki
Jump to navigation Jump to search
blackwiki>Erutuon
(track non-IPA g instead of replacing it)
blackwiki>Erutuon
(escaping is unnecessary, because the original text doesn't have to be restored)
Line 62: Line 62:
 
 
 
if match(text, "%[%[") or  match(text, "<[^>]+>") then
 
if match(text, "%[%[") or  match(text, "<[^>]+>") then
--[[ First, escape targets of wikilinks,
+
-- First, remove targets of wikilinks.
replacing them with sequences $1, $2, ... . ]]
+
workingString = text
local escaped = {}
 
 
 
escapedText = text
+
workingString = gsub(workingString, "%[%[([^|]+|)", "")
 +
workingString = gsub(workingString, "<[^>]+>", "")
 
 
local i = 1
+
track(workingString)
for linkTarget in mw.ustring.gmatch(escapedText, "%[%[([^|]+|)") do
 
escaped[i] = linkTarget
 
escapedText = mw.ustring.gsub(escapedText, linkTarget, "$" .. i)
 
i = i + 1
 
end
 
 
-- Escape HTML tags.
 
for HtmlTag in mw.ustring.gmatch(escapedText, "<[^>]+>") do
 
escaped[i] = HtmlTag
 
escapedText = mw.ustring.gsub(escapedText, HtmlTag, "$" .. i)
 
i = i + 1
 
end
 
 
track(escapedText)
 
 
end
 
end
 
 

Revision as of 18:18, 23 June 2017

Usage

{{#invoke:IPA|tag|en|ðɪs|link=1}}
{{#invoke:IPA|tag|ðɪs}}
{{#invoke:IPA|tag|gɛt}}
{{#invoke:IPA|tag||gɛt|link=1}}
{{#invoke:IPA|tag|||link=1}}
{{#invoke:IPA|tag|en||link=1}}

local p = {}

local match = mw.ustring.match
local gsub = mw.ustring.gsub
local U = mw.ustring.char

local function IPAspan(text)
	return
		'<span title="Representation in the International Phonetic Alphabet (IPA)" class="IPA">' ..
		text ..
		'</span>'
end

local function ine(text)
	if text == "" then
		return nil
	else
		return text
	end
end

function p.tag(frame)
	local linkHelpPage = require('Module:Yesno')(frame.args.link, false)
	
	local args = frame:getParent().args[1] and frame:getParent().args
		or frame.args
	local namespace = mw.title.getCurrentTitle().nsText
	
	local text, lang
	
	local err = {}
	local trackingCategories = {}
	local IPApage
	
	if linkHelpPage then
		text = ine(args[2])
		lang = ine(args[1])
	
		if lang then
			IPApage = mw.loadData("Module:IPA/data")[lang]
			
			if not IPApage then 
				table.insert(err, "[No IPA key for the language code " .. lang.."]")
			end
		else
			table.insert(err, "[language code?]")
		end
	else
		text = ine(args[1])
	end
	
	local output = ""
	
	if text then
		-- Tracks incorrect characters.
		local function track(text)
			-- non-IPA g
			if mw.ustring.find(text, U(0x67)) then
				table.insert(trackingCategories, "[[Category:IPA templates with incorrect characters]]")
			end
		end
		
		if match(text, "%[%[") or  match(text, "<[^>]+>") then
			--	First, remove targets of wikilinks.
			workingString = text
			
			workingString = gsub(workingString, "%[%[([^|]+|)", "")
			workingString = gsub(workingString, "<[^>]+>", "")
			
			track(workingString)
		end
		
		text = IPAspan(text)
	
		if IPApage then
			output = "[[" .. IPApage .. "|" .. text .. "]]"
		elseif text then
			output = text
		end
	else
		table.insert(err, "[IPA symbols?]")
	end
	
	if #err > 0 then
		err = "<sup>" .. table.concat(err) .. "</sup>"
	else
		err = ""
	end
	
	-- Makes the error message show only in preview mode.
	if frame:preprocess("{{REVISIONID}}") == "" then
		output = output .. err
	end
	
	return output .. table.concat(trackingCategories)
end

return p