mirror of
https://github.com/mehah/otclient
synced 2026-08-15 16:29:06 -04:00
- cleanup and organization - add support tag link to import external css ex: <link href="module/any.css" /> - fix display block alignment - add textarea css
98 lines
3 KiB
Lua
98 lines
3 KiB
Lua
local function FixSelection(selector)
|
|
selector = selector:trim()
|
|
|
|
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)
|
|
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),
|
|
attrs = o.declarations,
|
|
checkExist = checkExist
|
|
})
|
|
end
|
|
end
|
|
|
|
local function parseAndSetDisplayAttr(el)
|
|
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)
|
|
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)
|
|
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
|