Module:rue-common
Jump to navigation
Jump to search
- This module lacks a documentation subpage. Please create it.
- Useful links: subpage list • links • transclusions • testcases • sandbox
--Adapted from [[Module:uk-common]]
local export = {}
local lang = require("Module:languages").getByCode("rue")
local m_links = require("Module:links")
local m_table = require("Module:table")
local m_string_utilities = require("Module:string utilities")
local m_uk_translit = require("Module:rue-translit")
local u = mw.ustring.char
local rsplit = mw.text.split
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local rsubn = mw.ustring.gsub
local ulen = mw.ustring.len
local ulower = mw.ustring.lower
-- version of rsubn() that discards all but the first return value
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
local AC = u(0x0301) -- acute = ́
local GR = u(0x0300) -- acute = `
export.VAR1 = u(0xFFF0)
export.VAR2 = u(0xFFF1)
export.VAR3 = u(0xFFF2)
export.var_code_c = "[" .. export.VAR1 .. export.VAR2 .. export.VAR3 .. "]"
export.vowel = "аеёиоуіїыяєюАЕЁИОУІЇЫЯЄЮ"
export.vowel_c = "[" .. export.vowel .. "]"
export.non_vowel_c = "[^" .. export.vowel .. "]"
function export.translit_no_links(text)
return m_uk_translit.tr(m_links.remove_links(text))
end
function export.needs_accents(text)
for _, word_with_hyphens in ipairs(rsplit(text, "%s+")) do
-- A word needs accents if it contains no accent and has more than one vowel
-- and doesn't begin or end with a hyphen (marking a prefix or suffix)
if not rfind(word_with_hyphens, "^%-") and not rfind(word_with_hyphens, "%-$") then
for _, word in ipairs(rsplit(word_with_hyphens, "%-")) do
if not rfind(word, export.accents_c) and not export.is_monosyllabic(word) then
return true
end
end
end
end
return false
end
function export.is_stressed(word)
return rfind(word, AC)
end
function export.is_multi_stressed(text)
for _, word in ipairs(rsplit(text, "[%s%-]+")) do
if ulen(rsub(word, "[^́]", "")) > 1 then
return true
end
end
return false
end
function export.remove_stress(word)
return rsub(word, AC, "")
end
function export.remove_variant_codes(word)
return rsub(word, export.var_code_c, "")
end
-- Check if word is monosyllabic (also includes words without vowels).
function export.is_monosyllabic(word)
local num_syl = ulen(rsub(word, export.non_vowel_c, ""))
return num_syl <= 1
end
-- If word is monosyllabic, add stress to the vowel.
function export.add_monosyllabic_stress(word)
if export.is_monosyllabic(word) and not rfind(word, "^%-") and
not rfind(word, "%-$") and not rfind(word, AC) then
word = rsub(word, "(" .. export.vowel_c .. ")", "%1" .. AC)
end
return word
end
-- If word is monosyllabic, remove stress from the vowel.
function export.remove_monosyllabic_stress(word)
if export.is_monosyllabic(word) and not rfind(word, "^%-") and
not rfind(word, "%-$") then
return export.remove_stress(word)
end
return word
end
-- Check if word is nonsyllabic.
function export.is_nonsyllabic(word)
local num_syl = ulen(rsub(word, export.non_vowel_c, ""))
return num_syl == 0
end
-- Check if word ends in a vowel.
function export.ends_in_vowel(stem)
return rfind(stem, export.vowel_c .. AC .. "?$")
end
-- If word is unstressed, add stress onto initial syllable.
function export.maybe_stress_initial_syllable(word)
if not rfind(word, AC) then
-- stress first syllable
word = rsub(word, "^(.-" .. export.vowel_c .. ")", "%1" .. AC)
end
return word
end
-- If word is unstressed, add stress onto final syllable.
function export.maybe_stress_final_syllable(word)
if not rfind(word, AC) then
-- stress last syllable
word = rsub(word, "(.*" .. export.vowel_c .. ")", "%1" .. AC)
end
return word
end
-- Given a list of forms (each of which is a table of the form {form=FORM, footnotes=FOOTNOTES}),
-- concatenate into a SLOT=FORM,FORM,... string, replacing embedded | signs with <!>. (unused for now)
function export.concat_forms_in_slot(forms)
if forms then
local new_vals = {}
for _, v in ipairs(forms) do
table.insert(new_vals, rsub(v.form, "|", "<!>"))
end
return table.concat(new_vals, ",")
else
return nil
end
end
function export.combine_stem_ending(stem, ending)
if stem == "?" then
return "?"
elseif export.is_stressed(ending) then
return export.remove_stress(stem) .. ending
else
return stem .. ending
end
end
function export.generate_form(form, footnotes)
if type(footnotes) == "string" then
footnotes = {footnotes}
end
if footnotes then
return {form = form, footnotes = footnotes}
else
return form
end
end
return export