Signs: add text transliteration and centering
This commit is contained in:
parent
f811b7dcad
commit
27cf2c26a3
@ -15,8 +15,9 @@ local wall_sign_positions = {
|
||||
[3] = {{x = 0, y = -0.005, z = -0.43}, 0}
|
||||
}
|
||||
|
||||
local function generate_sign_line_texture(str, texture, row)
|
||||
local function generate_sign_line_texture(str, row)
|
||||
local leftover = floor((20 - #str) * 16 / 2) or 0
|
||||
local texture = ""
|
||||
for i = 1, 20 do
|
||||
local char = str:byte(i)
|
||||
if char and (char >= 32 and char <= 126) then
|
||||
@ -24,16 +25,14 @@ local function generate_sign_line_texture(str, texture, row)
|
||||
.. row * 20 .. "=signs_" .. char .. ".png"
|
||||
end
|
||||
end
|
||||
|
||||
return texture
|
||||
end
|
||||
|
||||
local function find_any(haystack, needles, start)
|
||||
local start = start or 0
|
||||
local function find_any(str, pair, start)
|
||||
local ret = 0 -- 0 if not found (indices start at 1)
|
||||
for _, needle in pairs(needles) do
|
||||
local first
|
||||
local last
|
||||
first, last = haystack:find(needle, start)
|
||||
for _, needle in pairs(pair) do
|
||||
local first = str:find(needle, start)
|
||||
if first then
|
||||
if ret == 0 or first < ret then
|
||||
ret = first
|
||||
@ -45,12 +44,19 @@ end
|
||||
|
||||
local disposable_chars = {["\n"] = true, ["\r"] = true, ["\t"] = true, [" "] = true}
|
||||
local wrap_chars = {"\n", "\r", "\t", " ", "-", "/", ";", ":", ","}
|
||||
local slugify = dofile(minetest.get_modpath("signs") .. "/slugify.lua")
|
||||
|
||||
local function generate_sign_texture(str)
|
||||
if not str then
|
||||
return "blank.png"
|
||||
end
|
||||
local row = 0
|
||||
local texture = "[combine:" .. 16 * 20 .. "x100"
|
||||
local result = {}
|
||||
|
||||
-- Transliterate text
|
||||
str = slugify(str)
|
||||
|
||||
while #str > 0 do
|
||||
if row > 4 then
|
||||
break
|
||||
@ -98,10 +104,22 @@ local function generate_sign_texture(str)
|
||||
local line_string = str:sub(1 + start_remove, wrap_i - end_remove)
|
||||
str = str:sub(wrap_i + 1)
|
||||
if line_string ~= "" then
|
||||
texture = generate_sign_line_texture(line_string, texture, row)
|
||||
result[row] = line_string
|
||||
end
|
||||
row = row + 1
|
||||
end
|
||||
|
||||
local empty = 0
|
||||
if row == 1 then
|
||||
empty = 2
|
||||
elseif row < 4 then
|
||||
empty = 1
|
||||
end
|
||||
|
||||
for r, s in pairs(result) do
|
||||
texture = texture .. generate_sign_line_texture(s, r + empty)
|
||||
end
|
||||
|
||||
return texture
|
||||
end
|
||||
|
||||
@ -252,6 +270,7 @@ minetest.register_node("signs:sign", {
|
||||
{pos = pointed_thing.above})
|
||||
end
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end,
|
||||
|
||||
|
79
files/signs/slugify.lua
Normal file
79
files/signs/slugify.lua
Normal file
@ -0,0 +1,79 @@
|
||||
--[[
|
||||
Lua Slugify
|
||||
Creating URL slugs properly in Lua (including transliteration for UTF-8)
|
||||
<https://github.com/hs0ucy/lua-slugify>
|
||||
|
||||
Original version in JavaScript
|
||||
<https://ourcodeworld.com/articles/read/255/creating-url-slugs-properly-in-javascript-including-transliteration-for-utf-8>
|
||||
|
||||
License: CC0
|
||||
]]
|
||||
|
||||
local charmap = {
|
||||
-- Latin
|
||||
["À"] = "A", ["Á"] = "A", ["Â"] = "A", ["Ã"] = "A", ["Ä"] = "A", ["Å"] = "A", ["Æ"] = "AE", ["Ç"] = "C",
|
||||
["È"] = "E", ["É"] = "E", ["Ê"] = "E", ["Ë"] = "E", ["Ì"] = "I", ["Í"] = "I", ["Î"] = "I", ["Ï"] = "I",
|
||||
["Ð"] = "D", ["Ñ"] = "N", ["Ò"] = "O", ["Ó"] = "O", ["Ô"] = "O", ["Õ"] = "O", ["Ö"] = "O", ["Ő"] = "O",
|
||||
["Ø"] = "O", ["Ù"] = "U", ["Ú"] = "U", ["Û"] = "U", ["Ü"] = "U", ["Ű"] = "U", ["Ý"] = "Y", ["Þ"] = "TH",
|
||||
["ß"] = "ss",
|
||||
["à"] = "a", ["á"] = "a", ["â"] = "a", ["ã"] = "a", ["ä"] = "a", ["å"] = "a", ["æ"] = "ae", ["ç"] = "c",
|
||||
["è"] = "e", ["é"] = "e", ["ê"] = "e", ["ë"] = "e", ["ì"] = "i", ["í"] = "i", ["î"] = "i", ["ï"] = "i",
|
||||
["ð"] = "d", ["ñ"] = "n", ["ò"] = "o", ["ó"] = "o", ["ô"] = "o", ["õ"] = "o", ["ö"] = "o", ["ő"] = "o",
|
||||
["ø"] = "o", ["ù"] = "u", ["ú"] = "u", ["û"] = "u", ["ü"] = "u", ["ű"] = "u", ["ý"] = "y", ["þ"] = "th",
|
||||
["ÿ"] = "y",
|
||||
-- Latin symbols
|
||||
["©"] = "(c)",
|
||||
-- Greek
|
||||
["Α"] = "A", ["Β"] = "B", ["Γ"] = "G", ["Δ"] = "D", ["Ε"] = "E", ["Ζ"] = "Z", ["Η"] = "H", ["Θ"] = "8",
|
||||
["Ι"] = "I", ["Κ"] = "K", ["Λ"] = "L", ["Μ"] = "M", ["Ν"] = "N", ["Ξ"] = "3", ["Ο"] = "O", ["Π"] = "P",
|
||||
["Ρ"] = "R", ["Σ"] = "S", ["Τ"] = "T", ["Υ"] = "Y", ["Φ"] = "F", ["Χ"] = "X", ["Ψ"] = "PS", ["Ω"] = "W",
|
||||
["Ά"] = "A", ["Έ"] = "E", ["Ί"] = "I", ["Ό"] = "O", ["Ύ"] = "Y", ["Ή"] = "H", ["Ώ"] = "W", ["Ϊ"] = "I",
|
||||
["Ϋ"] = "Y",
|
||||
["α"] = "a", ["β"] = "b", ["γ"] = "g", ["δ"] = "d", ["ε"] = "e", ["ζ"] = "z", ["η"] = "h", ["θ"] = "8",
|
||||
["ι"] = "i", ["κ"] = "k", ["λ"] = "l", ["μ"] = "m", ["ν"] = "n", ["ξ"] = "3", ["ο"] = "o", ["π"] = "p",
|
||||
["ρ"] = "r", ["σ"] = "s", ["τ"] = "t", ["υ"] = "y", ["φ"] = "f", ["χ"] = "x", ["ψ"] = "ps", ["ω"] = "w",
|
||||
["ά"] = "a", ["έ"] = "e", ["ί"] = "i", ["ό"] = "o", ["ύ"] = "y", ["ή"] = "h", ["ώ"] = "w", ["ς"] = "s",
|
||||
["ϊ"] = "i", ["ΰ"] = "y", ["ϋ"] = "y", ["ΐ"] = "i",
|
||||
-- Turkish
|
||||
["Ş"] = "S", ["İ"] = "I", ["Ç"] = "C", ["Ü"] = "U", ["Ö"] = "O", ["Ğ"] = "G",
|
||||
["ş"] = "s", ["ı"] = "i", ["ç"] = "c", ["ü"] = "u", ["ö"] = "o", ["ğ"] = "g",
|
||||
-- Russian
|
||||
["А"] = "A", ["Б"] = "B", ["В"] = "V", ["Г"] = "G", ["Д"] = "D", ["Е"] = "E", ["Ё"] = "Yo", ["Ж"] = "Zh",
|
||||
["З"] = "Z", ["И"] = "I", ["Й"] = "J", ["К"] = "K", ["Л"] = "L", ["М"] = "M", ["Н"] = "N", ["О"] = "O",
|
||||
["П"] = "P", ["Р"] = "R", ["С"] = "S", ["Т"] = "T", ["У"] = "U", ["Ф"] = "F", ["Х"] = "H", ["Ц"] = "C",
|
||||
["Ч"] = "Ch", ["Ш"] = "Sh", ["Щ"] = "Sh", ["Ъ"] = "", ["Ы"] = "Y", ["Ь"] = "", ["Э"] = "E", ["Ю"] = "Yu",
|
||||
["Я"] = "Ya",
|
||||
["а"] = "a", ["б"] = "b", ["в"] = "v", ["г"] = "g", ["д"] = "d", ["е"] = "e", ["ё"] = "yo", ["ж"] = "zh",
|
||||
["з"] = "z", ["и"] = "i", ["й"] = "j", ["к"] = "k", ["л"] = "l", ["м"] = "m", ["н"] = "n", ["о"] = "o",
|
||||
["п"] = "p", ["р"] = "r", ["с"] = "s", ["т"] = "t", ["у"] = "u", ["ф"] = "f", ["х"] = "h", ["ц"] = "c",
|
||||
["ч"] = "ch", ["ш"] = "sh", ["щ"] = "sh", ["ъ"] = "", ["ы"] = "y", ["ь"] = "", ["э"] = "e", ["ю"] = "yu",
|
||||
["я"] = "ya",
|
||||
-- Ukrainian
|
||||
["Є"] = "Ye", ["І"] = "I", ["Ї"] = "Yi", ["Ґ"] = "G",
|
||||
["є"] = "ye", ["і"] = "i", ["ї"] = "yi", ["ґ"] = "g",
|
||||
-- Czech
|
||||
["Č"] = "C", ["Ď"] = "D", ["Ě"] = "E", ["Ň"] = "N", ["Ř"] = "R", ["Š"] = "S", ["Ť"] = "T", ["Ů"] = "U",
|
||||
["Ž"] = "Z",
|
||||
["č"] = "c", ["ď"] = "d", ["ě"] = "e", ["ň"] = "n", ["ř"] = "r", ["š"] = "s", ["ť"] = "t", ["ů"] = "u",
|
||||
["ž"] = "z",
|
||||
-- Polish
|
||||
["Ą"] = "A", ["Ć"] = "C", ["Ę"] = "e", ["Ł"] = "L", ["Ń"] = "N", ["Ó"] = "o", ["Ś"] = "S", ["Ź"] = "Z",
|
||||
["Ż"] = "Z",
|
||||
["ą"] = "a", ["ć"] = "c", ["ę"] = "e", ["ł"] = "l", ["ń"] = "n", ["ó"] = "o", ["ś"] = "s", ["ź"] = "z",
|
||||
["ż"] = "z",
|
||||
-- Latvian
|
||||
["Ā"] = "A", ["Č"] = "C", ["Ē"] = "E", ["Ģ"] = "G", ["Ī"] = "i", ["Ķ"] = "k", ["Ļ"] = "L", ["Ņ"] = "N",
|
||||
["Š"] = "S", ["Ū"] = "u", ["Ž"] = "Z",
|
||||
["ā"] = "a", ["č"] = "c", ["ē"] = "e", ["ģ"] = "g", ["ī"] = "i", ["ķ"] = "k", ["ļ"] = "l", ["ņ"] = "n",
|
||||
["š"] = "s", ["ū"] = "u", ["ž"] = "z",
|
||||
}
|
||||
|
||||
local slugify = function(str, opt)
|
||||
for k, _ in pairs(charmap) do
|
||||
str = str:gsub(tostring(k), charmap[k])
|
||||
end
|
||||
|
||||
return str
|
||||
end
|
||||
|
||||
return slugify
|
Loading…
x
Reference in New Issue
Block a user