Partially fix unicode name truncation.
This fix ensures that name truncation always happens on codepoint boundaries and that a name has exactly 5 visible codepoints. This should cover all possible cases unless names can have grapheme clusters, afaik this is not the case.
This commit is contained in:
@@ -35,24 +35,39 @@ types.UnitFrame = UnitFrame
|
||||
|
||||
|
||||
local colors = {
|
||||
hostile = {0.5, 0.0, 0.0},
|
||||
neutral = {0.7, 0.7, 0.0},
|
||||
healthy = {0, 0.1, 0},
|
||||
high = {0, 1.0, 0},
|
||||
mid = {1.0, 1.0, 0},
|
||||
low = {1.0, 0.0, 0},
|
||||
offline = {0.7, 0.7, 0.7},
|
||||
dead = {0.7, 0.7, 0.7},
|
||||
magic = {0.4, 0.4, 1.0},
|
||||
disease = {0.4, 0.2, 0.0},
|
||||
poison = {0.0, 0.7, 0.7},
|
||||
curse = {0.7, 0.0, 0.7},
|
||||
immune = {0.0, 0.2, 0.4},
|
||||
bomb = {1.0, 0.7, 0.7},
|
||||
cyan = {0.0, 0.8, 0.8},
|
||||
white = {1.0, 1.0, 1.0}
|
||||
hostile = { 0.5, 0.0, 0.0 },
|
||||
neutral = { 0.7, 0.7, 0.0 },
|
||||
healthy = { 0, 0.1, 0 },
|
||||
high = { 0, 1.0, 0 },
|
||||
mid = { 1.0, 1.0, 0 },
|
||||
low = { 1.0, 0.0, 0 },
|
||||
offline = { 0.7, 0.7, 0.7 },
|
||||
dead = { 0.7, 0.7, 0.7 },
|
||||
magic = { 0.4, 0.4, 1.0 },
|
||||
disease = { 0.4, 0.2, 0.0 },
|
||||
poison = { 0.0, 0.7, 0.7 },
|
||||
curse = { 0.7, 0.0, 0.7 },
|
||||
immune = { 0.0, 0.2, 0.4 },
|
||||
bomb = { 1.0, 0.7, 0.7 },
|
||||
cyan = { 0.0, 0.8, 0.8 },
|
||||
white = { 1.0, 1.0, 1.0 }
|
||||
}
|
||||
|
||||
-- This trucates _codepoints_ not graphemes. If combination codepoints are
|
||||
-- contained in the string, it will not properly truncate and may return
|
||||
-- incorrect graphemes
|
||||
local function utf8_truncate(s, n)
|
||||
local init = 0
|
||||
for _ = 1, n do
|
||||
local _, last = string.find(s, ".[\128-\191]*", init + 1)
|
||||
if not last then
|
||||
return s
|
||||
end
|
||||
init = last
|
||||
end
|
||||
return string.sub(s, 1, init)
|
||||
end
|
||||
|
||||
---@param unit string
|
||||
---@param config table
|
||||
function UnitFrame:Init(unit, config)
|
||||
@@ -127,7 +142,7 @@ function UnitFrame:StartRangeTicker()
|
||||
if self.rangeTicker then
|
||||
return
|
||||
end
|
||||
local delta = 0.45 + (fastrandom(0, 100)/1000)
|
||||
local delta = 0.45 + (fastrandom(0, 100) / 1000)
|
||||
self.rangeTicker = C_Timer.NewTicker(delta, function()
|
||||
self:UpdateRange()
|
||||
end)
|
||||
@@ -563,7 +578,7 @@ function UnitFrame:UpdateHealthColor()
|
||||
elseif isFriend and pct >= 0.90 then
|
||||
self.hp:SetColor(unpack(colors.healthy))
|
||||
elseif isFriend and pct >= 0.75 then
|
||||
local progress = (pct - 0.75) / (0.90-0.75)
|
||||
local progress = (pct - 0.75) / (0.90 - 0.75)
|
||||
self.hp:SetInterpolatedColor(colors.mid, colors.high, progress)
|
||||
else
|
||||
local progress = pct / 0.75
|
||||
@@ -580,25 +595,10 @@ function UnitFrame:UpdateName()
|
||||
-- TODO: UnitClass can return Unknown and the color can be nil. Having
|
||||
-- the unit exist but not fully loaded is possibly a state we want to
|
||||
-- handle more generally
|
||||
local color = RAID_CLASS_COLORS[class] or {r=1, g=1, b=1}
|
||||
local color = RAID_CLASS_COLORS[class] or { r = 1, g = 1, b = 1 }
|
||||
self.name:SetTextColor(color.r, color.g, color.b)
|
||||
else
|
||||
self.name:SetTextColor(1, 1, 1)
|
||||
end
|
||||
self.name:SetText(UnitName(self.unit):sub(1, 5))
|
||||
self.name:SetText(utf8_truncate((UnitName(self.unit)), 5))
|
||||
end
|
||||
|
||||
--[[
|
||||
-- UNIT_AURA
|
||||
-- UNIT_CLASSIFICATION_CHANGED
|
||||
-- UNIT_COMBAT
|
||||
-- UNIT_CONNECTION
|
||||
-- UNIT_DISPLAYPOWER
|
||||
-- UNIT_FACTION
|
||||
-- UNIT_FLAGS
|
||||
-- UNIT_LEVEL
|
||||
-- UNIT_MANA
|
||||
-- UNIT_HEALTH_PREDICTION
|
||||
-- UNIT_PHASE
|
||||
]]--
|
||||
|
||||
|
Reference in New Issue
Block a user