Модуль:Sanitiser
Перейти к навигации
Перейти к поиску
Этот модуль оценён как бета-версия. Он готов для широкого применения, но должен применяться с осторожностью. |
Модуль для санитизации строчных стилей (style="CSS-свойства"
) до разрешённых свойств CSS. Полезен для стандартизации оформления и оставления отдельных допустимых возможностей оформления при отключении потенциально вредоносных для читателей.
Функция
[править код]local sanitiser = require('Module:Sanitiser')._main
sanitiser( 'background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap', { 'background' } )
-- background:#eaecf0
Образец
[править код]{{#invoke:Sanitiser|main|background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap|white-space}}
white-space:nowrap
{{#invoke:Sanitiser|main|background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap|white-space|background}}
white-space:nowrap; background:#eaecf0;
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- Escape function for patterns
-- Source: https://stackoverflow.com/a/20778724
local function escape( str )
local quotepattern = '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])'
return str:gsub( quotepattern, '%%%1' )
end
-- CSS sanitiser function for usage in modules
function p._main( style, exceptions )
local str = ''
if style == nil or style == '' then
return ''
end
-- Match safe CSS properties in provided styles
for k, v in pairs( exceptions ) do
local property = mw.ustring.match( style, escape( v ) .. '[^;]*;?' )
if style ~= property and property then
-- Don’t break CSS by random order of properties
if str ~= '' then
local lastChar = mw.ustring.sub( str, -1 )
if lastChar ~= ';' then
str = str .. ';'
end
str = str .. ' '
end
str = str .. property
end
end
return str
end
-- Function for usage in templates
function p.main( frame )
local args = getArgs( frame )
local style = args[ '1' ]
return p._main( style, args )
end
return p