Module:User:Vitalik/inflection-tools

local export = {}

local u = require('Module:utils')

local function trim_stress(str) -- remove space after stress (we put it in the code just to make visually readable sources) local result, count = mw.ustring.gsub(str, '́ ', '́') return result end

export.stash = {}

function export.clear_stash export.stash = {} end

function export.add_stash(name, value) export.stash[name] = value end

function export.apply_stash(str) for name, value in pairs(export.stash) do		str = mw.ustring.gsub(str, u.escape(name), value) end return str end

function export.replace(str, pattern, replace_to) pattern = export.apply_stash(pattern) return mw.ustring.gsub(str, trim_stress(pattern), trim_stress(replace_to)) end

function export.extract(str, pattern) pattern = export.apply_stash(pattern) return mw.ustring.match(str, trim_stress(pattern)) end

function export.check(str, values, checker) if type(values) == 'string' then values = {values} end for i, value in pairs(values) do		value = trim_stress(export.apply_stash(value)) local ok = checker == 'equals'          and value == str or checker == 'endswith'        and mw.ustring.match(str, value .. "$") ~= nil or checker == 'penultimate'     and mw.ustring.match(str, value .. ".$") ~= nil or checker == 'contains'        and mw.ustring.match(str, value) ~= nil or checker == 'contains_once'   and table.getn(mw.text.split(str, value)) == 2 or checker == 'contains_several' and table.getn(mw.text.split(str, value)) > 2 if ok then return true end end return false end

function export.equals(str, values) return export.check(str, values, 'equals') end

function export.endswith(str, values) return export.check(str, values, 'endswith') end

function export.penultimate(str, values) return export.check(str, values, 'penultimate') end

function export.contains(str, values) return export.check(str, values, 'contains') end

function export.contains_once(str, values) return export.check(str, values, 'contains_once') end

function export.contains_several(str, values) return export.check(str, values, 'contains_several') end

return export