Module:palindromes
Appearance
- The following documentation is located at Module:palindromes/documentation. [edit]
- Useful links: subpage list • links • transclusions • testcases • sandbox
local export = {}
local data = mw.loadData("Module:palindromes/data")
local function ignoreCharacters(term, lang, sc, langdata)
term = mw.ustring.lower(term)
term = mw.ustring.gsub(term, "[ ,%.%?!%%%-'\"]", "")
-- Language-specific substitutions
-- Ignore entire scripts (e.g. romaji in Japanese)
if langdata.ignore then
sc_name = sc and sc:getCode() or lang:findBestScript(term):getCode()
for _, script in ipairs(langdata.ignore) do
if script == sc_name then
return ""
end
end
end
for i, from in ipairs(langdata.from or {}) do
term = mw.ustring.gsub(term, from, langdata.to[i] or "")
end
return term
end
function export.is_palindrome(term, lang, sc)
local langdata = data[lang:getCode()] or data[lang:getFullCode()] or {}
-- Affixes aren't palindromes
if mw.ustring.find(term, "^%-") or mw.ustring.find(term, "%-$") then
return false
end
-- Remove punctuation and casing
term = ignoreCharacters(term, lang, sc, langdata)
local len = mw.ustring.len(term)
if langdata.allow_repeated_char then
-- Ignore single-character terms
if len < 2 then
return false
end
else
-- Ignore terms that consist of just one character repeated
-- This also excludes terms consisting of fewer than 3 characters
if term == mw.ustring.rep(mw.ustring.sub(term, 1, 1), len) then
return false
end
end
local charlist = {}
for c in mw.ustring.gmatch(term, ".") do
table.insert(charlist, c)
end
for i = 1, math.floor(len / 2) do
if charlist[i] ~= charlist[len - i + 1] then
return false
end
end
return true
end
return export