Module:ItemBox: Difference between revisionsGive feedback
Rewrite getFontSize: measured Retail Demo advance-width table + fit logic, output em so name scales with the card (with help from vergir-bot LLM) |
Emit the name size in cqw against the name area, dropping the em conversion and grid snapping (with help from vergir-bot LLM) |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local ustring = mw.ustring | local ustring = mw.ustring | ||
local textfit = require "Module:TextFit" | |||
-- ============================================================================ | -- ============================================================================ | ||
-- | -- Name box geometry, in em of .itembox's font-size (1em = 10px at size=1). | ||
-- | -- Mirrors Template:ItemBox/styles.css: | ||
-- | -- .itembox width: 8em | ||
-- the | -- .itembox-name-area height: 4.5em; padding: 0.5em 0.4em (border-box) | ||
-- | -- .itembox-name line-height: 1.2; font-size: 1.5em (overridden inline) | ||
-- | -- so the name's content box is 8 - 2*0.4 = 7.2em wide and 4.5 - 2*0.5 = 3.5em | ||
-- | -- tall. Only the ratio and the size limits are read from those figures: the | ||
-- | -- size is emitted in cqw against .itembox-name-area, so the browser supplies | ||
-- the actual width. Glyph widths live in [[Module:TextFit]]. | |||
-- ============================================================================ | -- ============================================================================ | ||
local | local NAME_W = 7.2 | ||
local NAME_H = 3.5 | |||
local LINE_H = 1.2 | |||
local MAX_EM = 1.5 | |||
local MIN_EM = 0.8 | |||
-- | -- Returns the name font size as a cqw string, measured against | ||
-- | -- .itembox-name-area, which [[Template:ItemBox]] makes a query container. | ||
function p.getFontSize(frame) | |||
local name = ustring.gsub(frame.args[1] or "", "^%s*(.-)%s*$", "%1") | |||
local max = MAX_EM / NAME_W * 100 -- 20.83cqw | |||
if name == "" then return string.format("%.2fcqw", max) end | |||
return string.format("%.2fcqw", textfit.fit(name, { | |||
aspect = NAME_H / NAME_W, | |||
lineHeight = LINE_H, | |||
max = max, | |||
min = MIN_EM / NAME_W * 100, -- 11.11cqw | |||
})) | |||
end | end | ||
local function | -- User for stable per-item texture variety | ||
local | local function hash(s) | ||
for | local h = 5381 | ||
for i = 1, #s do | |||
h = (h * 33 + s:byte(i)) % 2147483647 | |||
end | end | ||
return | return h | ||
end | end | ||
function p.variants(frame) | |||
local h = hash(frame.args[1] or "") | |||
local icon = (h % 3) + 1 | |||
local wear = (math.floor(h / 3) % 4) + 1 | |||
local tex = (math.floor(h / 12) % 3) + 1 | |||
return string.format("itembox-icon-v%d itembox-wear-v%d itembox-texture-v%d", | |||
icon, wear, tex) | |||
function p. | |||
local | |||
local | |||
local | |||
return string.format("% | |||
end | end | ||
return p | return p | ||