otclient-redemption/modules/modulelib/ext/style.lua

99 lines
3 KiB
Lua
Raw Permalink Normal View History

2024-07-16 21:36:58 -03:00
local function FixSelection(selector)
selector = selector:trim()
2024-07-16 21:36:58 -03:00
local lastPos = nil
while true do
local pos = selector:find('%[', lastPos)
if not pos then
break
end
lastPos = selector:find(']', lastPos)
local res = nil
local cmd = selector:sub(pos + 1, lastPos - 1)
local values = cmd:split('=')
if #values > 1 then
res = '[' .. values[1] .. '="' .. values[2] .. '"]'
end
if res then
selector = table.concat { selector:sub(1, pos - 1), res, selector:sub(lastPos + 2) }
end
end
return selector
end
local function parseCss(content, cssList, checkExist)
2024-07-16 21:36:58 -03:00
local css = CssParse.new()
css:parse(content)
local data = css:get_objects()
for _, o in ipairs(data) do
table.insert(cssList, {
selector = FixSelection(o.selector),
2024-07-16 21:36:58 -03:00
attrs = o.declarations,
checkExist = checkExist
})
end
end
local function parseAndSetDisplayAttr(el)
2024-07-16 21:36:58 -03:00
if el.widget:hasAnchoredLayout() then
if el.widget:getChildIndex() == 1 or el.attributes and el.attributes.anchor == 'parent' then
el.widget:addAnchor(AnchorLeft, 'parent', AnchorLeft)
el.widget:addAnchor(AnchorTop, 'parent', AnchorTop)
elseif el.prev and el.prev.style and el.prev.style.display == 'block' then
el.widget:addAnchor(AnchorLeft, 'parent', AnchorLeft)
2024-07-16 21:36:58 -03:00
el.widget:addAnchor(AnchorTop, 'prev', AnchorBottom)
else -- if el.prev.style.display == 'inline' then
el.widget:addAnchor(AnchorLeft, 'prev', AnchorRight)
el.widget:addAnchor(AnchorTop, 'prev', AnchorTop)
end
end
if not el.style then
return
end
if el.style.display == 'none' then
el.widget:setVisible(false)
end
end
local function parseAndSetFloatStyle(el)
2024-07-16 21:36:58 -03:00
if not el.style or not el.style.float or not el.widget:hasAnchoredLayout() then
return
end
if el.style.float == 'right' then
local anchor = 'parent'
local anchorType = AnchorRight
for _, child in pairs(el.parent.nodes) do
if child ~= el and child.style and child.style.float == 'right' then
anchor = child.widget:getId()
anchorType = AnchorLeft
break
end
end
el.widget:removeAnchor(AnchorLeft)
el.widget:addAnchor(AnchorRight, anchor, anchorType)
elseif el.style.float == 'left' then
local anchor = 'parent'
local anchorType = AnchorLeft
for _, child in pairs(el.parent.nodes) do
if child ~= el and child.style and child.style.float == 'right' then
anchor = child.widget:getId()
anchorType = AnchorRight
break
end
end
el.widget:removeAnchor(AnchorRight)
el.widget:addAnchor(AnchorLeft, anchor, anchorType)
end
end
return parseCss, parseAndSetDisplayAttr, parseAndSetFloatStyle