Module:rhymes: Difference between revisions

From Laenkea
Jump to navigation Jump to search
No edit summary
No edit summary
 
(8 intermediate revisions by the same user not shown)
Line 2: Line 2:
local getArgs = require("Module:Arguments").getArgs
local getArgs = require("Module:Arguments").getArgs


local m_links = require("Module:links")
local m_languages = require("Module:languages")
local m_languages = require("Module:languages")
local m_IPA = require("Module:IPA")


local V = "aeiouyɑæɐəɵɛɜɪɨɔœɒøʊʉʌɯʏɤ"
local V = "aeiouyɑæɐəɵɛɜɪɨɔœɒøʊʉʌɯʏɤ"


local from_secondary = {
local from_secondary = {
["lfv"] = true
["lfv"] = true,
["rad"] = true,
} -- list of language codes which get rhyme from secondary stress as well as primary
} -- list of language codes which get rhyme from secondary stress as well as primary


Line 17: Line 18:
function de_onset(ipa)
function de_onset(ipa)
ipa = mw.ustring.gsub(ipa, "[ˈˌ]", "")
ipa = mw.ustring.gsub(ipa, "[ˈˌ]", "")
ipa = mw.ustring.gsub(ipa, "^[^" .. V .. "]+", "")
-- mw.log(ipa)
ipa = mw.ustring.gsub(ipa, "^[" .. V .. "][̥̊]", "")
while true do
if mw.ustring.find(ipa, "^[" .. V .. "]̯") then
ipa = mw.ustring.sub(ipa, 3)
elseif mw.ustring.find(ipa, "^[" .. V .. "]") or mw.ustring.find(ipa, "^%S̩") then
break
elseif #ipa < 2 then error("No syllabic element detected")
else
ipa = mw.ustring.sub(ipa, 2)
end
-- mw.log(ipa)
end
return ipa
return ipa
end
end


function export.generate(lang, rhymes, nopre)
function export.generate(lang, rhymes, nopre, nocat)
     local language = m_languages.get_by_code(lang)
     local language = m_languages.get_by_code(lang)
     local rhymes_show = ""
     local rhymes_show = ""
if not nopre then
if nopre ~= true then
rhymes_show = "\n* Rhyme"
rhymes_show = "Rhyme"
if #rhymes > 1 then rhymes_show = rhymes_show .. "s" end  
if #rhymes > 1 then rhymes_show = rhymes_show .. "s" end  
rhymes_show = rhymes_show .. ": "
rhymes_show = rhymes_show .. ": "
Line 40: Line 51:
         if rhyme_count < 2 then
         if rhyme_count < 2 then
         rhymes_show = rhymes_show ..
         rhymes_show = rhymes_show ..
         "<span class=\"IPA\">-" .. rhyme .. "</span>[[Category:" .. rhyme_cat .. "]]"
         "<span class=\"IPA\">-" .. rhyme .. "</span>"
     else
     else
             rhymes_show = rhymes_show ..
             rhymes_show = rhymes_show ..
                 "<span class=\"IPA\">[[:Category:" .. rhyme_cat .. "|-" .. rhyme .. "]]</span>[[Category:" .. rhyme_cat .. "]]" ..
                 "<span class=\"IPA\">[[:Category:" .. rhyme_cat .. "|-" .. rhyme .. "]]</span>" ..
                 "<sup> (" .. rhyme_count .. ")</sup>"
                 "<sup> (" .. rhyme_count .. ")</sup>"
         end
         end
        if nocat ~= true then
        rhymes_show = rhymes_show .. "[[Category:" .. rhyme_cat .. "]]"
    end
     end
     end
      
      
Line 59: Line 73:
for i, rhyme in ipairs(args) do
for i, rhyme in ipairs(args) do
if i > 1 then
if i > 1 then
rhyme = m_IPA.get_SAMPAd(rhyme)
rhyme = mw.ustring.gsub(rhyme, "[%/%[%]]", "")
rhyme = mw.ustring.gsub(rhyme, "[%/%[%]]", "")
local rhyme2
local rhyme2
if from_secondary[language.code] and mw.ustring.find(rhyme, "ˌ") then
if from_secondary[language.code] and mw.ustring.find(rhyme, "ˌ") then
rhyme2 = mw.ustring.match(rhyme, "ˌ(.*)$")
rhyme2 = mw.ustring.match(rhyme, "ˌ([^ˈˌ]*)$")
end
end
rhyme = mw.ustring.match(rhyme, "ˈ(.*)$") or rhyme
rhyme = mw.ustring.match(rhyme, "ˈ(.*)$") or rhyme
Line 74: Line 89:
end
end
mw.logObject(rhymes)
-- mw.logObject(rhymes)


return export.generate(language.code, rhymes, args["nopre"] ~= nil)
return export.generate(language.code, rhymes, args["nopre"] ~= nil, args["nocat"] ~= nil)
end
end



Latest revision as of 15:27, 1 August 2024

Underlies {{rhymes}}.


local export = {}
local getArgs = require("Module:Arguments").getArgs

local m_languages = require("Module:languages")
local m_IPA = require("Module:IPA")

local V = "aeiouyɑæɐəɵɛɜɪɨɔœɒøʊʉʌɯʏɤ"

local from_secondary = {
	["lfv"] = true,
	["rad"] = true,
} -- list of language codes which get rhyme from secondary stress as well as primary

local no_primary_if_secondary = {
	["lfv"] = true
} -- list of language codes which ignore primary stress if secondary stress is present

function de_onset(ipa)
	ipa = mw.ustring.gsub(ipa, "[ˈˌ]", "")
	-- mw.log(ipa)
	while true do
		if mw.ustring.find(ipa, "^[" .. V .. "]̯") then
			ipa = mw.ustring.sub(ipa, 3)
		elseif mw.ustring.find(ipa, "^[" .. V .. "]") or mw.ustring.find(ipa, "^%S̩") then
			break
		elseif #ipa < 2 then error("No syllabic element detected")
		else
			ipa = mw.ustring.sub(ipa, 2)
		end
		-- mw.log(ipa)
	end
	return ipa
end

function export.generate(lang, rhymes, nopre, nocat)
    local language = m_languages.get_by_code(lang)
    local rhymes_show = ""
	
	if nopre ~= true then
		rhymes_show = "Rhyme"
		if #rhymes > 1 then rhymes_show = rhymes_show .. "s" end 
		rhymes_show = rhymes_show .. ": "
	end

    for num, rhyme in ipairs(rhymes) do
    	local rhyme_cat = "Rhymes:" .. language.name .. "/" .. rhyme
        local rhyme_count = mw.site.stats.pagesInCategory(rhyme_cat, "pages")
        if num > 1 then
            rhymes_show = rhymes_show .. ", "
        end
        if rhyme_count < 2 then
        	rhymes_show = rhymes_show ..
        		"<span class=\"IPA\">-" .. rhyme .. "</span>"
    	else
            rhymes_show = rhymes_show ..
                "<span class=\"IPA\">[[:Category:" .. rhyme_cat .. "|-" .. rhyme .. "]]</span>" ..
                "<sup> (" .. rhyme_count .. ")</sup>"
        end
        if nocat ~= true then
        	rhymes_show = rhymes_show .. "[[Category:" .. rhyme_cat .. "]]"
    	end
    end
    
    return rhymes_show
end

function export.show(frame)
	local args = getArgs(frame)
	local language = m_languages.get_by_code(args[1])
	local rhymes = {}
	if args[2] == nil then error("At least one rhyme is required") end
	
	for i, rhyme in ipairs(args) do
		if i > 1 then
			rhyme = m_IPA.get_SAMPAd(rhyme)
			rhyme = mw.ustring.gsub(rhyme, "[%/%[%]]", "")
			local rhyme2
			if from_secondary[language.code] and mw.ustring.find(rhyme, "ˌ") then
				rhyme2 = mw.ustring.match(rhyme, "ˌ([^ˈˌ]*)$")
			end
			rhyme = mw.ustring.match(rhyme, "ˈ(.*)$") or rhyme
			if rhyme2 == nil or no_primary_if_secondary[language.code] ~= true then
				table.insert(rhymes, de_onset(rhyme))
			end
			if rhyme2 then
				table.insert(rhymes, de_onset(rhyme2))
			end
		end
	end
	
	-- mw.logObject(rhymes)

	return export.generate(language.code, rhymes, args["nopre"] ~= nil, args["nocat"] ~= nil)
end

return export
--[[
=p.show(mw.getCurrentFrame():newChild{title="parent", args={"lfv", "/ˈvydɛ/"}}:newChild{title="child"})
]]--